总体思路
在进行大模型调优前,需保证模型当前的shape与micro batch size为亲和数据,并在此基础上优先保证模型的内存占用是否合理。在确保模型shape亲和,且内存占用合理后可继续进行端到端的耗时调优。
- 分析与选择合适的并行策略。
- 配置profiling:设置性能分析工具,以获取基本的性能数据,包括操作时间、通信时间、调度时间和空闲时间。为了精确度和效率,建议仅收集一个step的数据,并确保一个step执行时间不会过长,可以通过控制micro batch的数量来实现。
- 设备侧内存分析:通过内存profiling深入了解内存使用是否合理。利用节省的内存,可以尝试更高效的并行策略(例如去除重复计算等)或增加micro batch size,以获得更好的性能。
- 调度性能分析与优化:分析host与device之间的调度配合,是否存在host bound或者局部host bound问题。通过调度性能优化来减少计算流中不必要的空闲。
- 通信性能分析与优化:分析profiling中的通信算子的数据量、通信stream、通信时间和有效通信带宽,识别是否与host侧配合存在不适当的空闲,并进行相应的通信性能优化。
- 算子性能分析:分析算子的profiling文件,查找非业务计算算子(例如非连续转连续、数据格式转换等)的耗时,并在前端训练代码中尽量减少非业务计算类算子。可以在cube算子、vector算子、通信、bubble等方面进行对比,以明确优化目标。
- 算子深度优化:对于耗时占比高的算子,要确保它们充分利用了计算资源,并分析妨碍计算资源利用的原因。这可能需要与cube和vector算子工程师合作进行算子深度优化。
- 算法优化:在大型模型的算法层面也可以进行优化,包括减少bubble、matmul算子与TP通信细粒度切分和流水等。
通过以上步骤,可以全面解决大型模型训练的容量、显存、速度和性能方面的问题,以获得更高效、稳定的训练过程。
业界通用的大模型并行策略同样适用于NPU性能调优,包括模型并行、流水并行、数据并行、序列并行、完全重计算、选择性重计算、ZeRO-1/2/3、ZeRO offload等。这些并行策略和计算策略是业界成熟技术,本手册不再详述。
父主题: 性能调优