多GPU--简单运行,多卡模型加载保存

1、多GPU简单运行

 不用修改其他代码,添加几行

#指定你要用的gpu
device_ids = [0, 1,2,3,4,5]

model = torch.nn.DataParallel(model, device_ids=device_ids) # 指定要用到的设备
model = model.cuda(device=device_ids[0]) # 模型加载到设备0

2、多gpu训练模型,单gpu测试

直接加载模型报错

在load_state_dict后加入,strict=False成功运行,但是结果错的离谱,参考这个吧

关于Pytorch加载模型参数的避坑指南_墨晓白的博客-CSDN博客_pytorch load_state_dict的注意点

model_path='./626.pth'
model = model.to(device)
model.load_state_dict(torch.load(model_path),strict=False)
model.eval()

解决方法:

查询后发现是模型里多了字符model,我们需要将它删除,左图为多卡训练的模型,右图为单卡训练的模型,可以看到多卡训练的模型直接用torch.save(model.state_dict(),model_path),多了前边的model参数

方法一:

# save model
if num_gpu ==  1:
    torch.save(model.module.state_dict(), 'net.pth')
 else:
    torch.save(model.state_dict(),  'net.pth')

方法二:把训练好的模型里的model字符删除

pth = torch.load('./626.pth')
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in pth.items():
    name =  k[7:] # remove  'module'
    new_state_dict[name]=v
model.load_state_dict(new_state_dict)
model.eval()

3、多gpu模型,多GPU加载

我这是保存了所有参数方便断点训练,cfg为我的配置文件,more_gpu代表是否为多GPU训练,模型如果是state保存的就直接加载,如果是module保存的,加载时也得用module.load_state加载。

checkpoint = {
            'epoch':epoch,
            'model':model.state_dict() if not cfg.more_gpu else model.module.state_dict(),
            'optimizer':optimizer.state_dict(),
            'lr_schedule':scheduler.state_dict(),
            'best_acc':best_acc}

torch.save(checkpoint,cfg.checkpoint_path)

模型加载

if cfg.resume:
    path_checkpoint = cfg.checkpoint_path
    checkpoint = torch.load(path_checkpoint)
    start_epoch = checkpoint['epoch']
####在这加个判断是不是多gpu
    model.load_state_dict(checkpoint['model']) if not cfg.more_gpu else model.module.load_state_dict(checkpoint['model'])
    optimizer.load_state_dict(checkpoint['optimizer'])
    scheduler.load_state_dict(checkpoint['lr_schedule'])
    best_acc = checkpoint['best_acc']

| [![](https://img-blog.csdnimg.cn/img_convert/5ecf066b6c86db651c102453663c3121.jpeg =100x)](http://www.relxdingyilang.cn/) | [点击访问博客查看更多内容](http://www.relxdingyilang.cn/) |
|------------------------------------------|-- |

### LLaMA-Factory配置与分布式训练 对于LLaMA-Factory,在环境下实现高效稳定的模型训练,主要依赖于其内置的支持特性以及合理的参数设置。该工具不仅支持单机模式,还能够适应更为复杂的场景,并兼容DDP (Distributed Data Parallel),DeepSpeed 和 FSDP (Fully Sharded Data Parallel)这三种主流的分布式训练框架[^1]。 #### 使用DDP进行训练 当采用DDP作为分布式策略时,需确保每台机器上都安装有相同版本的PyTorch库,并通过网络连接形成集群。启动命令通常涉及`torch.distributed.launch`模块或者直接调用Python脚本并指定必要的环境变量来指明节点间的通信方式和地址等信息。具体来说: ```bash export NCCL_DEBUG=INFO export MASTER_ADDR="主节点IP" export MASTER_PORT="未被占用端口" python -m torch.distributed.launch \ --nproc_per_node=GPU数量 \ --nnodes=参与计算总节点数 \ --node_rank=当前节点编号 \ train.py ``` 此段代码展示了如何利用环境变量定义集群配置,并执行带有分布式的训练程序。 #### 利用DeepSpeed优化大规模模型训练 针对更大规模的数据集或更深层次的学习架构,可以考虑引入DeepSpeed来进行加速处理。它提供了零冗余优化器(Zero Redundancy Optimizer, ZeRO)等一系列先进技术手段以减少内存消耗、提升吞吐量。为了启用这些功能,只需修改原有的训练脚本来加载相应的DeepSpeed配置文件即可。 ```json { "zero_optimization": { "stage": 2, "allgather_partitions": true, "allgather_bucket_size": 2e8, "reduce_scatter": true, "reduce_bucket_size": 2e8, "overlap_comm": true, "load_from_fp32_weights": true, "cpu_offload": false }, ... } ``` 上述JSON片段是一个典型的DeepSpeed配置实例,其中包含了关于ZeRO的不同阶段以及其他性能调整选项的具体设定值。 #### 应用FSDP简化资源管理 最后一种选择是应用FSDP技术,这是一种全分片数据并行方法,特别适合那些希望进一步降低显存占用同时保持良好扩展性的项目。相较于传统的DDP+FSDP组合方案而言,单独使用FSDP可以在一定程度上简化整体系统的复杂度。不过需要注意的是,目前并非所有的深度学习任务都能无缝迁移至这种新型范式下运行;因此建议开发者们根据实际需求权衡利弊后再做决定。 综上所述,无论是哪种类型的分布式训练机制,都需要仔细规划硬件资源配置情况,并依据官方文档指导完成相应软件包的安装准备工作。此外,考虑到不同应用场景可能存在差异化的特殊要求,务必深入理解各组件的工作原理及其相互之间的协作关系,从而制定出最适合自己的实施方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值