# 背景
---
随着AIGC领域的兴起,各大厂商都在训练和推出自研的大模型结构,并结合业务进行落地和推广。在大模型分布式训练场景中,主流的主要是基于英伟达GPU进行训练(如A100),如何有效地压榨GPU的计算能力,提升训练效率,降低训练成本,是一个非常重要的实践优化问题。
**直接目标**
最直接地目标就是提升GPU使用率,充分发挥GPU的计算潜力,以加快模型训练。包括调整 Batch 大小以提供更多并行任务给GPU,优化DataLoader以减少GPU的等待时间,以及选择或设计与GPU并行处理能力相匹配的模型架构。
**额外收益**
从正向思维来看,通过合理分配CPU、GPU、内存和存储资源,可以提高资源利用率,加速训练过程,以提高整体的成本效益;同时可减少因资源限制导致训练中断或者失败,保证训练流程的顺利进行,提高模型训练有效率;
从反向思维来看,通过高效的硬件利用,降低能源消耗(如电力),降低长期的训练费用,实现经济高效的模型训练,并减少训练成本。
# MFU
---
**MFU(Model FLOPS Utilization)**
**定义**: 即模型算力利用率,是指模型一次前反向计算消耗的矩阵算力与机器(如GPU)算力的比值。
**重要性**: 它直接反映了模型在训练过程中对计算资源的有效利用程度。在大模型训练中,提高MFU是优化训练效率的关键手段之一。
![image.png](https://blog.zs-fighting.cn/upload/2024/08/image-28be3208099a4c729849efa51025d1d5.png)
MFU的值受到多种因素的影响,包括但不限于:
- **模型架构**: 不同架构的模型在分布式训练中的算力利用率可能存在显著差异。例如,Transformer架构的模型由于其并行性和矩阵运算密集的特点,通常能够在分布式训练中实现较高的MFU。
- **分布式训练策略**: 包括数据并行、模型并行、流水线并行等不同的并行策略,以及这些策略的具体实现方式(如梯度累积、张量并行等),都会对MFU产生重要影响。
- **硬件环境**: GPU型号、数量、网络连接速度、显存大小等硬件因素都会限制分布式训练的性能和算力利用率。
- **软件优化**: 包括编译器优化、库函数优化、自动混合精度训练等软件层面的优化措施,也能在一定程度上提升MFU。
- **数据集和批次大小**: 数据集的大小和复杂性,以及训练时使用的批次大小,都会影响每次迭代中的计算量和算力利用率。
由于上述因素的多样性和复杂性,各大开源模型在分布式训练上的MFU指标很难一概而论。不过,一般来说,经过良好优化和适配的开源模型,在高端GPU集群上进行分布式训练时,MFU值通常能够达到较高的水平(例如,接近或超过50%)。但请注意,这只是一个大致的估计,具体数值可能因模型、硬件和训练策略的不同而有所差异。
# TensorCore 利用率
---
**定义**: TensorCore利用率是指Tensor Core在处理深度学习任务时,其计算资源的实际使用效率。
**重要性**: Tensor Core是NVIDIA GPU上用于加速矩阵乘法和卷积运算的特殊处理单元,对于提升深度学习模型的训练和推理速度至关重要。
![image.png](https://blog.zs-fighting.cn/upload/2024/08/image-c1d745e04a61466b86e86dd79de62c60.png)
使用如torch profiler等工具记录训练过程中各个函数的时间消耗,并在tensorboard等可视化工具上展示,从而可以直接查看到Tensor Core的利用率。
**优点**: 这种方法能够提供更详细和准确的信息,包括Tensor Core的具体使用情况和潜在的性能瓶颈。
# ETTR
---
ETTR(**E**ffective **T**raining **T**ime **R**atio),机器学习任务训练中有效训练时长的占比,用于衡量训练稳定性的核心指标。
ETTR = (训练任务总时长-无效训练时间)/训练任务总时长
**业界的ETTR Status Quo**
Llama 3.1: 16k张卡,90+%
![image.png](https://blog.zs-fighting.cn/upload/2024/08/image-070986863de44e93b31922ded80597ab.png)
Google gemini: 97%
![image.png](https://blog.zs-fighting.cn/upload/2024/08/image-af1e68734cb54024846784dc144c7c83.png)
# 瓶颈分析工具
---
## Nsight system 工具
NVIDIA Nsight Systems是一个用于监测代码执行效率及分析性能的工具,它是NVIDIA Nsight系列的一部分。Nsight Systems可以收集和分析应用程序在CPU和GPU上的执行数据,帮助开发者识别性能瓶颈,优化程序性能。
1. 安装Nsight Systems:
访问NVIDIA官方网站下载Nsight Systems的安装包。
按照安装向导完成安装过程。
2. 配置环境:
确保CUDA环境变量已正确配置,以便Nsight Systems能够识别CUDA应用程序。
3. 生成Profile文件:
使用Nsight Systems提供的命令行工具(如nsys)来生成Profile文件。例如,可以使用nsys profile -o profile_name.qdrep python test.py命令来生成Python脚本的Profile文件。
4. 分析Profile文件:
打开Nsight Systems GUI,加载生成的Profile文件(.qdrep格式)。
使用Nsight Systems的图形界面来查看和分析应用程序的执行数据,包括CPU和GPU的使用情况、函数调用时间、内存访问等。
## Torch profile 工具
如果你是使用的Pytorch框架,可以使用其profile工具和tensorboard可视化界面来分析模型的性能瓶颈点,具体可以参考:PyTorch Profiler With TensorBoard。
1. 计算图概况 :torch profile可以生成模型的计算图,并突出显示每个操作的时间消耗,这有助于识别潜在的瓶颈。
2. 内存使用统计 :实时监控模型训练过程中的GPU内存占用情况,便于调整参数以优化资源利用。
3. 快速定位性能问题 :通过可视化每个操作的执行时间,可以迅速找到导致模型训练速度慢的原因。
4. 优化硬件资源利用 :查看内存使用情况,以便确定合适的批量大小和其他内存管理策略。
5. 详细的层析剖析 :不仅仅提供总体性能分析,还可以对模型中的每一个单独层进行分析,展示每个层在CPU和CUDA上的执行时间。
6. 事件列表 :提供原始的PyTorch事件列表,以便开发者能够深入了解底层操作(如卷积、激活函数等)的执行时间。
7. 选择性剖析 :用户可以指定要分析的具体层,其余层将被忽略,这样可以更加聚焦于关键部分。
8. 硬件资源管理 :分析模型在不同硬件环境下的性能,比如CPU与GPU之间的切换。
## Tensorboard
[TODO]
# 系统的优化方法论
---
**明确GPU空闲产生的原因**
借助可视化工具分析profile文件中,GPU 空闲产生的原因,判断属于是哪几类问题?
- 数据读取瓶颈: 一般在timeline里每个Step的开始前面都会有固定的GPU空闲,数据读取无法与计算实现Overlap;
- 模型写法问题: 比如模型计算中间有Sync操作,可能是存在D2H的同步拷贝,比如存在Tensor.numpy()等类似操作;
- 通信存在瓶颈: 在分布式训练中,不同的并行策略可能会影响通信成本;一般张量并行放在同一个机器不同卡上,数据并行是不同机器之间;
![image.png](https://blog.zs-fighting.cn/upload/2024/08/image-6179050227484f65939ec2cad49b87ed.png)
最终目的是最大化GPU利用率,前面章节已经根据各种场景针对性地阐述了对应的解决方案;
类似torch.profile在基于TensorBorad可视化后,会针对性提供一些优化的思路,本质是一个对各种监控指标和原生profile数据的建模问题。可以根据沉淀的经验,结合不同的指标特征给业务同学更多的优化经验准则。
从GPU资源管理平台而言,前期应该是尽可能是给出可置信的核心指标数据,以及辅助的层次化指标(如CPU负载、IO等)。大模型训练优化实施方仍然需要模型负责人接入,由于大模型一般变动的频率比较低,因为联动框架同学一同定制化优化。
大模型的训练效率