pytorch多卡训练显卡利用率问题

多卡训练显卡利用率问题

最近我继承了前同事的深度学习代码,使用pytorch写的。在nvidia-smi查看显卡利用率的时候发现显卡是经常出现除了第一张显卡外,其他7张显卡的利用率为0的情况。

在这里插入图片描述

同时查看了CPU利用率,发现大多的核也是空闲的:

在这里插入图片描述

阅读代码后先后试了:调整dataloader的num_workers的数量(之前为默认值)、把数据先加载到内存的方法均无法得到明显改善。

然后我debug各个阶段的耗时,发现在inference时耗时0.1秒多,但是在计算loss和回传loss时总共用时接近6秒(图丢了)。所以我推测代码把所有卡的loss都对到第一张卡里去计算了,并且在代码中得到了验证,前同事代码中训练函数的三大件儿是这么写的:

net_output = model(inputs)
optimizer.zero_grad()
loss_all = compute_loss(net_output, targets_semantic[:, 0])
loss = loss_all['total_loss']
loss.backward()
optimizer.step()

可以看到,他是把模型的inference和计算loss是分开写了。这也是大多教程中的一种写法,单卡训练的时候是没有任何问题的,并且还会使得代码结构更加清晰。但是在多卡训练时这就导致程序在inference完成之后把八张卡的预测结果丢到了第一张卡里去计算loss并运行loss.backward 这就导致这两块的时间消耗巨大。

随后我将代码进行调整,把计算loss的功能放到的model类中的forward里,使得在八张卡中分别计算loss。这样可以使显卡利用率达到最大。修改后的训练函数三大件儿这么写的:

output = model(inputs, targets_semantic[:, 0])
net_output = output['typ_pred']
loss = output['loss'] # 返回的是一个List
loss = loss.mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()

即,八张卡分别计算loss,再将loss求均值,最后再在第一张卡中做回传。

这种做法之后显卡利用率得到大幅度提升,在我的代码上大改提升了3-4倍的训练速度(不贴图了懒得做实验)。

但是仍然存在问题是:Loss.backward是否也可以在8张卡上分别做回传?这样就不会出现第一张卡在运行loss.backward的时候其余七张卡在短暂空闲的问题了。但是在多卡上分别Loss.backward的话会使得各显卡上模型丧失通讯,对最终的模型影响有多大?这是后续需要优化的问题。

### 使用 LLaMA-Factory 进行 GPU 分布式训练 #### 1. 环境准备 为了实现 GPU 的分布式训练,首先需要确保环境已经正确配置。这包括安装与 CUDA 版本兼容的 PyTorch 和其他必要的依赖项。由于 PyTorch 支持 CUDA 并能高效利用 NVIDIA GPU 加速计算,因此选择合适的 PyTorch 版本至关重要[^1]。 以下是 Docker 配置的一个示例命令,用于增加 `/dev/shm` 内存大小以解决可能遇到的错误(如信号 7 错误),这对于 DeepSpeed 或其他框架下的 GPU 训练尤为重要[^4]: ```bash docker run --shm-size=8g ... ``` #### 2. 安装 LLaMA-Factory LLaMA-Factory 提供了 web-ui 和命令行两种操作模式,其核心功能在于支持种常见的模型以及不同的训练方法,例如增量预训练模态指令监督微调等[^2]。可以通过以下步骤完成基本安装: - **克隆仓库**: ```bash git clone https://github.com/your-repo-url/llama-factory.git cd llama-factory ``` - **构建 Docker 映像**: 如果项目基于 Docker,则需按照官方指南创建映像文件。 ```bash docker build -t llama_factory_image . ``` #### 3. 启动训练任务 LLaMA-Factory 利用了现代深度学习工具链中的分布式特性,特别是对于大规模数据集和复杂模型架构的支持。具体来说,在执行 GPU 分布式训练时,通常会采用 `torch.distributed.launch` 或者更高级别的封装库如 DeepSpeed 来简化流程[^3]。 假设我们正在使用 DeepSpeed 执行节点或设备上的训练作业,那么典型的启动脚本如下所示: ```bash deepspeed --num_gpus=N train.py \ --model_type="large_model" \ --data_path="/path/to/data" ``` 其中参数 N 表示参与运算的具体显卡数量;而 `train.py` 是实际定义神经网络结构及其优化策略的核心 Python 文件。 另外需要注意的是,当面对特定硬件条件或者软件冲突情况时,务必仔细调整相关超参设置,并监控资源利用率以便及时发现问题所在。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值