AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


用pytorch lightning简化模型训练流程!
发布日期:2024-04-12 21:45:11 浏览次数: 2689 来源:牛爷儿


引言

前面的几篇文章,只要涉及到模型训练,肯定少不了要写一段重复的代码,代码功能很简单,就是一段循环代码,在训练里加载数据,执行模型forward方法,计算梯度,更新参数。


每次都写一遍这个代码,效率挺低的,你可以自己封装train方法,或者,直接使用pytorch lighting,把这些繁杂的事情交给框架自己去完成,我们则专注于模型设计。

什么是PyTorch Lightning ?

PyTorch Lightning 是一个高级库,可以认为是对pytorch又做一次封装,封装了常用的、流程化的能力,旨在简化深度学习模型的训练过程。

在PyTorch中,训练循环、日志记录、检查点等代码往往分散在整个项目中,难以维护和重用。PyTorch Lightning将这些功能做了封装,提供了更清晰的代码结构和接口。

PyTorch Lightning提供了内置的分布式训练支持,可以轻松地在多个GPU或TPU上进行数据并行和模型并行训练,而无需手动处理数据划分、梯度聚合等复杂细节。

PyTorch Lightning集成了训练日志记录和可视化工具,如TensorBoard,使得在训练过程中监控模型指标和可视化结果变得更加容易。

不用pytoch lightning时,如何训练模型?

不使用 PyTorch Lightning 时,模型训练通常直接使用 PyTorch 的 API 来完成。这包括定义模型、损失函数、优化器,以及编写用于训练和验证模型的循环。


下面是一个基本的流程示例,展示了如何使用 PyTorch 来训练一个简单的模型,注意for循环那段代码,代码结构不够优雅:


import torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils.data import DataLoader
# 假设我们有一个自定义的数据集和模型dataset = ...# 你的数据集model = ...# 你的模型,继承自 nn.Moduleloss_function = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)
# 数据加载dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
# 训练循环for epoch in range(num_epochs):for inputs, targets in dataloader:optimizer.zero_grad() # 清零梯度outputs = model(inputs)# 前向传播loss = loss_function(outputs, targets)# 计算损失loss.backward() # 反向传播        optimizer.step()                    # 更新模型参数
print(f"Epoch {epoch}, Loss: {loss.item()}")

pytorch lightning如何简化&结构化训练代码?

PyTorch Lightning通过引入一些新的抽象概念和模块化设计,来简化PyTorch模型的开发和训练过程,主要包括:

  1. LightningModule: 用于定义模型的结构、训练、验证和测试逻辑。
  2. Trainer: 管理整个训练过程,包括数据加载、优化器、训练循环、检查点等。
  3. Callbacks: 在训练过程的不同阶段执行自定义操作,如日志记录、模型检查点等。
  4. LightningDataModule: 用于定义数据加载和预处理逻辑。

通过将模型、数据、训练和验证逻辑分离到不同的模块中,PyTorch Lightning提供了更清晰、更模块化的代码结构,并且简化了许多复杂的训练任务,如分布式训练、日志记录和可视化等。


下面将根据之前提到的 PyTorch 实现示例,展示如何使用 PyTorch Lightning 来实现相同的功能,整体代码结构优雅很多,结构清晰:


 pytorch_lightning  pl


如果你有多张GPU卡,或者是多节点分布式训练,只需在Trainer对象中指定GPU设备id或设置分布式环境变量即可,无需在模型代码中进行任何特殊处理:

# 单节点多GPU训练trainer = Trainer(gpus=4)
# 多节点分布式训练trainer = Trainer(accelerator="ddp")
# 执行训练前,需要配置训练节点,设置主节点,专用端口# 启动训练,需要指定主节点,如下:python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_PER_NODE --nnodes=NUM_NODES --node_rank=NODE_RANK --master_addr=MASTER_ADDR --master_port=MASTER_PORT train.py





53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询