最近大模型遍地开花,你在大模型实践过程中的经验有哪些?
经验谈不上,教训有很多,先想到这么几个:
用成熟的分布式训练框架:多用 DeepSpeed
,少用 Pytorch
原生的 torchrun
。在节点数量较少的情况下,使用哪种训练框架并不是特别重要;然而,一旦涉及到数百个节点,DeepSpeed
的优点就显得很明显,其简便的启动和便于性能分析的特点使其成为理想之选。
弹性容错和自动重启机制:大模型训练不是以往那种单机训个几小时就结束的任务,往往需要训练好几周甚至好几个月,这时候你就知道能稳定训练有多么重要。弹性容错能让你在机器故障的情况下依然继续重启训练;自动重启能让你在训练中断之后立刻重启训练。毕竟,大模型时代,节约时间就是节约钱。
定期保存模型:训练的时候每隔一段时间做个checkpointing,这样如果训练中断还能从上次的断点来恢复训练。
训练加速方法:最常用的有FlashAttention
(V1 和 V2),加速效果很不错,基本是开箱即用;其他的有算子融合,fused_kernels
等。
流水线并行和张量并行:大模型的参数规模都特别大,大到单机存不下。通常都会用流水线并行和张量并行的方法在有限的GPU机器下训练大模型。
使用高速网卡:用以太网卡来跑大模型训练是不现实的,大模型多机多卡训练一般都会用到RDMA技术,需要使用IB网卡和RoCE网卡(IB网卡的速度会比RoCE快一些,也贵一些)。
想清楚再开始训练:训练一次大模型的成本很高的。在训练之前先想清楚这次训练的目的,记录训练参数和中间过程结果,少做重复劳动。
关注GPU使用效率:有时候,即使增加了多块 A100 GPU,大型模型的训练速度未必会加快,这很可能是因为GPU使用效率不高,尤其在多机训练情况下更为明显。仅仅依赖nvidia-smi
显示的GPU 利用率并不足以准确反映实际情况,因为即使显示为100%,实际GPU利用率也可能不是真正的 100%。要更准确地评估GPU利用率,需要关注TFLOPS和吞吐率等指标,这些监控在DeepSpeed
框架中都有。