昇腾MindSpeed-LLM全流程实践及踩坑记录

989 阅读11分钟

[toc]

昇腾MindSpeed-LLM全流程实践及踩坑记录

我们都知道大模型训练是一个非常复杂的过程,大模型军备竞赛下如何控制训练成本成为各大模型训练方尤为关注的问题。大模型的训练通常面临内存、计算、通信等压力,如何在有限的资源下尽可能提升大模型训练效率成为关键。

介绍MindSpeed-LLM之前,首先介绍下MindSpeed,它是专门面向昇腾的大模型训练加速库。

1、 MindSpeed-LLM简介

1.1 MindSpeed简介

MindSpeed是专门面向昇腾(Ascend)平台的大模型训练加速库。昇腾是华为推出的高性能AI计算平台,广泛应用于大模型训练、推理和部署场景。

在大模型训练领域,硬件资源的高效利用至关重要。MindSpeed通过优化内存管理、计算调度以及通信效率,帮助用户在有限的硬件资源下实现更高的训练效率。无论是单机多卡训练,还是大规模分布式训练,MindSpeed都能提供灵活且高效的解决方案,其核心特性包括:megetron特性支持、并行策略特性、内存优化特性、亲和计算特性、通信优化特性以及关键场景特性 关于MindSpeed详解介绍及使用去关注MindSpeed官方gitee社区

1.2MindSpeed-LLM核心功能

MindSpeed-LLM是MindSpeed库中专门针对大语言模型(LLM)训练的模块套件,原名是ModelLink(私以为这个改名改得好啊,MindSpeed-LLM有助于基于生态延续学习理解,ModelLink就很突兀让人感受困难:))。旨在为昇腾芯片提供端到端的大预言模型训练解决方案, 包含预置业界主流模型,数据工程,分布式训练及加速,预训练、微调、在线推理任务等特性提供了以下核心功能:

  • 模型并行与数据并行:支持多种并行策略,包括张量并行、流水线并行和数据并行,以适应不同规模的模型和硬件配置。
  • 混合精度训练:通过自动混合精度(AMP)技术,在保证模型精度的同时,显著降低显存占用和计算开销。
  • 梯度累积与梯度检查点:在显存有限的情况下,通过梯度累积模拟更大的批量大小,并通过梯度检查点减少显存峰值占用。
  • 分布式通信优化:针对昇腾平台的通信特性,优化分布式训练中的梯度同步和参数更新,减少通信开销。
  • 动态内存管理:通过动态内存分配和释放策略,优化显存使用,避免显存不足导致的训练中断。

1.3 业界主流加速库对比

在大模型训练加速领域,业界有许多主流的加速库,如DeepSpeed、FasterTransformer、Megatron-LM等。这些库各有优劣,适用于不同的场景和硬件平台。以下是MindSpeed-LLM与业界主流加速库的对比:

特性MindSpeed-LLMDeepSpeedMegatron-LMFasterTransformer
硬件平台昇腾(Ascend)通用GPU通用GPU通用GPU
模型并行支持支持支持支持
混合精度训练支持支持支持支持
梯度检查点支持支持支持不支持
分布式通信优化针对昇腾优化通用优化通用优化通用优化
动态内存管理支持支持不支持不支持
易用性集成昇腾生态,易用功能丰富,配置复杂功能强大,配置复杂专注于推理,轻量化

从对比中可以看出,MindSpeed-LLM在昇腾平台上具有显著的优势,特别是在硬件优化和动态内存管理方面。对于使用昇腾平台的用户来说,MindSpeed-LLM是一个高效且易用的选择。

2、全流程实践

2.1 环境搭建

在开始训练之前,需要搭建好训练环境,包括硬件和软件的配置。

  • 硬件选择:选择适合大模型训练的硬件,如Atlas 800T A2。本文实践采用的是Atlas 800T A2硬件设备。
  • 操作系统:本文实践所用操作系统为eulerosv2r12.aarch64。
  • 软件配套:软件配套参照社区上的软件版本配套信息,严格基于指导环境软件环境部署下来成本并不高,但因需要纯手动安装依赖较多,稍不注意就会有坑,本文末尾会由相关坑的记录(昇腾应当持续重视可靠的环境配套及社区上的安装指导啊,每个安装指导步骤要持续验证,有些问题稍重视投入即可规避,那可是开发者了解昇腾的门面,不要劝退昇腾新人开发者
    • 固件及驱动安装:因本事件所用昇腾服务器相关NPU驱动和固件已经安装好了,如果你有需要可以参照昇腾社区上的安装指导NPU驱动固件安装指导(注意首次安装场景和覆盖安装场景固件和驱动安装顺序的不同要求)
    • CANN依赖安装: CANN依赖主要有以下三个,务必先安装toolkot后再安装后两个依赖包。
软件类型软件包说明软件包名称
ToolkitCANN开发套件包,在训练&推理&开发调试场景下安装,主要用于训练和推理业务、模型转换、算子/应用/模型的开发和编译Ascend-cann-toolkit__linux-.run
Kernels**CANN算子包,能够节省算子编译时间,在大模型推理、训练场景和运行包含动态shape网络或单算子API(例如aclnn类API)相关业务时安装。**安装时需已安装Toolkit或NNRT或NNAE软件包,请选择运行设备对应处理器类型的Kernels。Ascend-cann-kernels-<chip_type>__linux.run
NNAL**CANN加速库,包含面向大模型领域的ATB(Ascend Transformer Boost)加速库,可以提升大模型训练和推理性能。**安装时需已安装Toolkit或NNAE软件包。Ascend-cann-nnal__linux-.run

特别说明,Cann相关依赖安装即toolkit、kernels、nnal三个依赖,务必按照指导顺序安装。本文实践按照官方对物理机场景安装操作进行安装, 另,toolkit及nnal安装后务必记得source 环境。

后续使用改软件依赖环境可以选择基于容器配置大模型训练环境,也可以基于Conda创建虚拟环境配置大模型训练环境。对于容器可以选择将cann依赖装入镜像环境中进行隔离操作,而对于conda虚拟环境,安装cann依赖时需要需要单独每次session建立后source激活依赖环境(toolkit\nnal都需要source激活)。

  • Ascend Extension for PyTorch 配置与安装,该依赖主要为解决pytorch生态在昇腾硬件兼容适配问题,具体安装操作很简单,可以参考官方指导昇腾社区Ascend Extension Pytorch安装指导,这一块儿不太会出出错。需要注意的是,前置依赖最好先安装一下,社区已经给出完整说明,在这儿
  • MindSpeed-LLM安装:按照官方文档安装MindSpeed-LLM,可能需要从源码编译安装,确保所有依赖项都已安装。 严格按照gitee上的操作指导进行即可, 注意:apex源码出包可能会出现问题,最好直接找已经编译好的apex,whl包,我试图在apex社区通过源码编译whl包,但出错。(社区要规避此情况,apex的gitee社区上本身也未给出任务编译好的whl包,无谓的安装卡点)

流程正式开始前必看前置:

MindSpeed-LLM有两种模式下得大模型训练,分别是Mcore、Legacy。关于两种模式的差异,社区上并未给出任何功能定位解释,不过通过Readme特性解释可以看出,相较于legacy,Mcore模式下得大模型训练做了更多的并行加速特性支持,如长序列并行优化、MOE专家并行优化等高阶优化特性支持,即Mcore模式下的大模型训练性能会由于legacy,至于有了更高性能的mcore模式,为什么还要并行存在legacy,社区给的解释是:legacy为早期出版本模式,很多商用客户基于此模式在做版本维护,不能随意日落。

但是,通过查看特性差异以及“/example/legacy、example/mcore”路径下得支持不同执行任务启动脚本,相比mcore模式大模型训练在官方支持的模型任务上,legacy缺失很多可以直接运行的shell启动脚本,如指令微调数据转换脚本、微调启动脚本、指令微调后chat对话脚本等,如果你是一个MindSpeed纯新手,误入legacy模式按照官方指导操作,还会遇到各种错误或者文件缺失。

所以,一、直接在mcore下进行全流程操作;二、不要按照主页readme上的脚本执行任务指令,应当使用这个路径下合适的启动命令“/example/mcore/xx/xxx.sh”,脚本缺失就自己补对应模型的启动脚本即可。

2.2 权重下载及转换

  • 模型选定及权重下载
#!/bin/bash
mkdir ./model_from_hf/Qwen1.5-0.5B-hf/
cd ./model_from_hf/Qwen1.5-0.5B-hf/
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/config.json
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/generation_config.json
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/pytorch_model-00001-of-00002.bin
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/pytorch_model-00002-of-00002.bin
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/pytorch_model.bin.index.json
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/special_tokens_map.json
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/tokenizer.json
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/tokenizer.model
wget https://huggingface.co/daryl149/Qwen1.5-0.5B-hf/resolve/main/tokenizer_config.json
cd ../../

如果你没办法科学上网,也可以直接在modelscope上下载对应的模型权重下载,尽量不要使用git或网页直接下载,拉取的模型权重可能不全,导致后续模型权重转换出现问题,

modelscope 权重下载

from modelscope import snapshot_download
model_dir = snapshot_download("Qwen/Qwen1.5-0.5B", local_dir= "./")
  • 权重转换 Huggingface权重转换到Megatron-LM格式,注意官方给出的权重转化脚本示例为:
python convert_ckpt.py \
    --model-type GPT \
    --load-model-type hf \
    --save-model-type mg \
    --target-tensor-parallel-size 1 \
    --target-pipeline-parallel-size 2 \
    --num-layer-list 16,16 \
    --model-type-hf llama2 \
    --load-dir ./model_from_hf/llama-2-7b-hf/ \
    --save-dir ./model_weights/llama-2-7b-legacy/ \
    --tokenizer-model ./model_from_hf/llama-2-7b-hf/tokenizer.model

不要直接使用此脚本转换,执行

# 命名及启动:
# bash examples/mcore/model_name/ckpt_convert_xxx_hf2mcore.sh
# 需要配置并行参数以及权重词表加载保存等路径

bash examples/mcore/llama2/ckpt_convert_qwen15_hf2mcore.sh

进行模型权重转换


2.3 数据预处理

注意:特别的社区上已经说明“在example目录下每个模型都已经预置好数据预处理脚本,可以根据需要来进行修改

  • 预训练数据集转换 首先下载预训练数据集
mkdir dataset
cd dataset/
wget https://huggingface.co/datasets/lsb/enwiki20230101/resolve/main/data/train-00000-of-00042-d964455e17e96d5a.parquet
cd ..

从haggingface下载enwiki数据集,请学会可上网。 按照社区指导进入mcore执行对应数据集转换脚本

# Mcore
# 命名及启动:examples/mcore/model_name/data_convert_xxx_pretrain.sh
bash examples/mcore/llama2/data_convert_qwen15_pretrain.sh
  • 微调数据集转换 Alpaca数据集下载
cd dataset/
wget https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet
cd ..

执行微调数据集转换,不要直接使用gitee上的process_data脚本(会出现转换错误),转入example

# Mcore
# 命名及启动:examples/mcore/model_name/data_convert_xxx_instruction.sh
 bash examples/mcore/qwen15/data_convert_qwen15_instruction.sh

2.4 大模型预训练

按照官方指导,选择对应xxx_pretrain.sh脚本,配置对应权重保存、权重加载、词表、数据集路径,启动训练任务即可。 qwen1.5-0.5B 8卡分布式预训练效果如下示意:

2.5大模型微调

按照官方指导,选择对应tune_xxx.sh脚本,配置对应权重保存、权重加载、词表、数据集路径,启动训练任务即可。如果预置模型没有对应tune启动脚本,则参考其他模型tune启动脚本修改即可。

  • 全参微调

    qwen1.5-0.5B 8卡分布式微调效果如下示意:

  • lora微调

1734660868391_image.png

2.6 大模型分布式推理

  • 流式推理
  • 按照官方指导,选择对应generate_xx.sh脚本,配置对应权重保存、权重加载、词表、数据集路径,启动训练任务即可。如果预置模型没有对应generate_xx.sh启动脚本,则参考其他模型generate_xx.sh启动脚本修改即可。
  • chat对话推理 同样进入example文件路径下mcore对应的模型文件内,如果没有chat脚本,则同样参考已有chat问价修改即可,对比发现只基于对应模型的generate_xx.sh脚本增加图示参数即可实现chat流式推理

1734661392591_image.png

大模型评估

  • 基准评估 大模型评估支持 mmlu、ceval、agieval、bbh、boolq、human_eval等多种数据集格式,本实践采用mmlu数据集进行推理评估,执行此步骤时,我从hugginface下载的mmlu-test数据集在运行时报错,显然是数据集属性列不匹配导致,遂我自己从kaggle上找到mmlu数据集这里,成功执行,如下示意。

1734662299626_image.png 测试了100个case,评估如上图示意,acc为35%,与报告中39.2%有差距,但根本原因是因为测试用例太少导致的偏差。

  • 指令微调评估 指令微调评估结果示意如下,微调评估需要下载mmlu的dev数据依赖,放置在data_path下。

image.png