大模型训练之显存问题

1. 大模型大概有多大,模型文件有多大?

     大模型也分为不同的规格,一般模型的规格会体现在模型的名称上,例如 LLaMA2-13b,13b 就是其模型参数量的大小,意思是 130亿的参数量。大模型的文件大小与其参数量有关,通常大模型是以半精度存储的, Xb 的模型文件大概是 2X GB多一些,例如 13b 的模型文件大小大约是 27GB 左右。

2. 能否用4 * v100 32G训练vicuna 65b?

    一般来说推理模型需要的显存约等于模型文件大小,全参训练需要的显存约为推理所需显存的三倍到四倍,正常来说,在不量化的情况下4张 v100 显卡推理 65b 的模型都会有一些吃力,无法进行训练,需要通过 LoRA 或者****QLoRA 采用低秩分解的方式才可以训练。

3.如何评估你的显卡利用率?

  1. flops比值法:gpu利用率 = 实测的flops/显卡理论上的峰值flops。deepspeed实测flops 100t flops,而用的是A100卡理论峰值312t flops,可以得到GPU利用率只有 32.05%。
  2. throughout估计法:吞吐量 = example数量/秒/GPU * max_lengthgpu利用率 = 实际吞吐量 / 论文中的吞吐量(假设利用率100%),实测训练时处理样本速度为 3 example/s,一共有4卡,max length 2048,则吞吐量为 1536 token/s/gpu,根据llama论文可以得知,他们训练7B模型的吞吐量约为 3300 token/s/gpu,那么GPU利用率只有46.54%
  3. torch profiler分析法:利用torch profiler记录各个函数的时间,将结果在tensorboard上展示,在gpu kenel视图下,可以看到tensor core的利用率,比如30%。

4. 如何查看多机训练时的网速?

iftop -i eth2 -n  -P

iftop 是外置的命令,可以监控发送流量,接收流量,总流量,运行 iftop 到目前时间的总流量,流量峰值,过去 2s 10s 40s 的平均流量。

5. 如何查看服务器上的多卡之间的NVLINK topo?

nvidia-smi topo -m 

6.如何查看训练时的 flops?(也就是每秒的计算量)

如果基于deepspeed训练,可以通过配置文件很方便地测试。

{
  "flops_profiler": {
    "enabled": true,
    "profile_step": 1,
    "module_depth": -1,
    "top_modules": 1,
    "detailed": true,
    "output_file": null
    }
}

7.如何查看对 deepspeed 的环境配置是否正确?

ds_report

8.TF32 格式有多长?

TF32(TensorFloat32)是 NVIDIA 在 Ampere 架构推出的时候面世的,现已成为 Tensorflow 和 Pytorch 框架中默认的32位格式。用于近似 FP32 精度下任务的专有格式,实际上约等于 FP19 也就是19位。

### 大模型训练显存不足的解决方案 对于大模型训练过程中遇到的显存不足问题,可以采取多种策略来缓解这一瓶颈。一种方法是利用混合精度训练,在这种模式下,通过使用半精度浮点数(FP16)代替全精度浮点数(FP32),能够有效减少内存占用并加速计算过程[^1]。 另一种常见的优化手段是对模型参数进行梯度累积。具体来说,就是将一次完整的前向传播和反向传播分为多个小批次完成,从而降低每一步所需的临时存储空间需求。这种方法可以在不牺牲最终收敛效果的前提下显著提高可处理的数据量大小[^2]。 此外,分布式训练也是应对大规模神经网络的有效途径之一。借助多台设备或者同一台机器上的多个GPU协同工作,不仅可以分摊庞大的运算任务,还能共享资源以克服单卡显存量有限的问题。在此基础上,还可以考虑采用数据并行、模型并行以及管道并行等方式进一步提升效率[^3]。 最后值得注意的是,一些高级框架和技术也提供了专门针对此场景的功能支持,比如PyTorch中的`torch.utils.checkpoint`模块允许只保存必要的中间状态用于后续回溯,以此节省大量不必要的缓存开销;而TensorFlow则有XLA编译器可以帮助自动调整图结构达到更好的性能表现[^4]。 ```python import torch def train_with_gradient_accumulation(model, optimizer, data_loader, accumulation_steps=4): model.train() for i, (inputs, labels) in enumerate(data_loader): outputs = model(inputs) loss = criterion(outputs, labels) / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SQingL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值