华为云用户手册

  • 修改代码 将AscendSpeed代码包AscendCloud-LLM-xxx.zip在本地解压缩后。在上传代码前,需要对解压后的训练脚本代码进行修改。具体文件为:llm_train/AscendSpeed/scripts/obs_pipeline.sh,具体修改代码内容以及位置,如下所示。 训练作业中存在2个代码目录,一个是从OBS上传到ModelArts Standard训练容器中的代码目录OBS_CODE_DIR,一个是后续构建新镜像步骤E CS 中构建新镜像中镜像的代码目录CODE_DIR。修改代码如图1。 图1 修改区分训练作业中2个代码目录 使用环境变量SAVE_PATH重新覆盖权重文件保存路径,作为最终的权重保存路径。修改代码如图2。 图2 修改权重保存路径 多机训练场景下,需要将CODE_DIR修改为OBS_CODE_DIR目录,则可以使用scripts/tools/sync_with_obs.py工具将其它节点的权重文件同步上传到主节点。修改代码如图3。 图3 多机同步权重文件
  • 模型软件包结构说明 AscendCloud-6.3.908代码包中AscendCloud-LLM代码包结构介绍如下,训练脚本以分类的方式集中在scripts文件夹中: |──llm_train # 模型训练代码包 |──AscendSpeed # 基于AscendSpeed的训练代码 |──ascendcloud_patch/ # 针对昇腾云平台适配的功能补丁包 |──scripts/ # 训练需要的启动脚本 |──llama2 # llama2系列模型执行脚本的文件夹 |──llama3 # llama3系列模型执行脚本的文件夹 |──qwen # Qwen系列模型执行脚本的文件夹 |──qwen1.5 # Qwen1.5系列模型执行脚本的文件夹 |── ... |── dev_pipeline.sh # 系列模型共同调用的多功能的脚本 |── install.sh # 环境部署脚本 |——src/ # 启动命令行封装脚本,在install.sh里面自动构建|──llm_inference # 推理代码包|──llm_tools # 推理工具
  • 模型推荐的参数与NPU卡数设置 不同模型推荐的训练参数和计算规格要求如表1所示。规格与节点数中的1*节点 & 4*Ascend表示单机4卡,以此类推。 表1 不同模型推荐的参数与NPU卡数设置 序号 支持模型 支持模型参数量 文本序列长度 并行参数设置 规格与节点数 1 llama2 llama2-7b SEQ_LEN=4096 TP(tensor model parallel size)=1 PP(pipeline model parallel size)=4 1*节点 & 4*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=4 1*节点 & 8*Ascend 2 llama2-13b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend 3 llama2-70b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=4 4*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=8 8*节点 & 8*Ascend 4 llama3 llama3-8b SEQ_LEN=4096 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend 5 llama3-70b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=4 4*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=8 8*节点 & 8*Ascend 6 Qwen qwen-7b SEQ_LEN=4096 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend 7 qwen-14b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend 8 qwen-72b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=4 4*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=8 8*节点 & 8*Ascend 9 Qwen1.5 qwen1.5-7b SEQ_LEN=4096 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend 10 qwen1.5-14b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend 11 qwen1.5-32b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=2 2*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=4 4*节点 & 8*Ascend 12 qwen1.5-72b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=4 4*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=8 8*节点 & 8*Ascend 13 Yi yi-6b SEQ_LEN=4096 TP(tensor model parallel size)=1 PP(pipeline model parallel size)=4 1*节点 & 4*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=4 1*节点 & 8*Ascend 14 yi-34b SEQ_LEN=4096 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=4 2*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=4 4*节点 & 8*Ascend 15 ChatGLMv3 glm3-6b SEQ_LEN=4096 TP(tensor model parallel size)=1 PP(pipeline model parallel size)=4 1*节点 & 4*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=4 1*节点 & 8*Ascend 16 Baichuan2 baichuan2-13b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=1 1*节点 & 8*Ascend 17 Qwen2 qwen2-0.5b SEQ_LEN=4096 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=1 1*节点 & 2*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=1 1*节点 & 2*Ascend 18 qwen2-1.5b SEQ_LEN=4096 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=1 1*节点 & 2*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=1 1*节点 & 2*Ascend 19 qwen2-7b SEQ_LEN=4096 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=4 PP(pipeline model parallel size)=1 1*节点 & 4*Ascend 20 qwen2-72b SEQ_LEN=4096 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=4 4*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=8 PP(pipeline model parallel size)=8 8*节点 & 8*Ascend 21 GLMv4 glm4-9b SEQ_LEN=4096 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=4 1*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=4 1*节点 & 8*Ascend 22 mistral mistral-7b SEQ_LEN=4096 TP(tensor model parallel size)=1 PP(pipeline model parallel size)=4 1*节点 & 8*Ascend 23 mixtral mixtral-8x7b SEQ_LEN=4096 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=8 2*节点 & 8*Ascend SEQ_LEN=8192 TP(tensor model parallel size)=2 PP(pipeline model parallel size)=8 2*节点 & 8*Ascend
  • 上传自定义数据到指定目录 将下载的原始数据存放在{work_dir}/llm_train/LLaMAFactory/LLaMA-Factory/data目录下。具体步骤如下: 进入到/home/ma-user/ws/llm_train/LLaMAFactory/LLaMA-Factory/data目录下。 cd /home/ma-user/ws/llm_train/LLaMAFactory/LLaMA-Factory/data 将自定义原始数据(样例数据集:alpaca_gpt4_data.json.json)按照下面的数据存放目录要求放置。 样例数据集alpaca_gpt4_data.json.json的下载链接:https://huggingface.co/datasets/QingyiSi/Alpaca-CoT/blob/main/alpacaGPT4/alpaca_gpt4_data.json 数据存放参考目录结构如下: ${workdir}(例如/home/ma-user/ws/llm_train ) |── LLaMAFactory/data |── alpaca_en_demo.json # 代码原有数据集 |── identity.json # 代码原有数据集 ... |── alpaca_gpt4_data.json # 自定义数据集 更新代码目录下data/dataset_info.json文件。如使用以下示例数据集则命令如下。关于数据集文件格式及配置,更多信息请参考data/README_zh.md 的内容。 vim dataset_info.json 新加配置参数如下: "alpaca_gpt4_data": { "file_name": "alpaca_gpt4_data.json" }, 样例截图:
  • 网卡名称错误 当训练开始时提示网卡名称错误。或者通信超时。可以使用ifconfig命令检查网卡名称配置是否正确。 比如,ifconfig看到当前机器IP对应的网卡名称为enp67s0f5,则可以设置环境变量指定该值。 export GLOO_SOCKET_IFNAME=enp67s0f5 # 多机之间使用gloo通信时需要指定网口名称,export TP_SOCKET_IFNAME=enp67s0f5 # 多机之间使用TP通信时需要指定网口名称export HCCL_SOCKET_IFNAME=enp67s0f5 # 多机之间使用HCCL通信时需要指定网口名称 关于环境变量的解释可以参考:Distributed communication package - torch.distributed — PyTorch 2.3 documentation 父主题: 常见错误原因和解决方法
  • Step1 修改训练超参配置 以llama2-13b LORA微调为例,执行脚本0_pl_lora_13b.sh 。 修改模型训练脚本中的超参配置,必须修改的参数如表1所示。其他超参均有默认值,可以参考表1按照实际需求修改。 表1 训练超参配置说明 参数 示例值 参数说明 ORIGINAL_TRAIN_DATA_PATH /home/ma-user/work/training_data/alpaca_gpt4_data.json 必须修改。训练时指定的输入数据路径。请根据实际规划修改。 ORIGINAL_HF_WEIGHT /home/ma-user/work/models/llama-2-13b-chat-hf 必须修改。加载Hugging Face权重(可与tokenizer相同文件夹)时,对应的存放地址。请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/work/tokenizers/llama-2-13b-chat-hf 该参数为tokenizer文件的存放地址。默认与ORIGINAL_HF_WEIGHT路径相同。如果用户需要将Hugging Face权重与tokenizer文件分开存放时,则需要修改参数。 INPUT_PRO CES SED_DIR /home/ma-user/work/llm_train/processed_for_input/llama2-13b 该路径下保存“数据转换”和“权重转换”的结果。示例中,默认生成在“processed_for_input”文件夹下。如果用户需要修改,可添加并自定义该变量。 OUTPUT_SAVE_DIR /home/ma-user/work/llm_train/saved_dir_for_output/ 该路径下统一保存生成的 CKPT、P LOG 、LOG 文件。示例中,默认统一保存在“saved_dir_for_output”文件夹下。如果用户需要修改,可添加并自定义该变量。 CKPT_SAVE_PATH /home/ma-user/work/llm_train/saved_dir_for_output/saved_models/llama2-13b 保存训练生成的模型 CKPT 文件。示例中,默认保存在“saved_dir_for_output/saved_models”文件夹下。如果用户需要修改,可添加并自定义该变量。 LOG_SAVE_PATH /home/ma-user/work/llm_train/saved_dir_for_output/saved_models/llama2-13b/log 保存训练过程记录的日志 LOG 文件。示例中,默认保存在“saved_models/llama2-13b/log”文件夹下。如果用户需要修改,可添加并自定义该变量。 ASCEND_PROCESS_LOG_PATH /home/ma-user/work/llm_train/saved_dir_for_output/plog 保存训练过程中记录的程序堆栈信息日志 PLOG 文件。示例中,默认保存在“saved_dir_for_output/plog”文件夹下。如果用户需要修改,可添加并自定义该变量。 CONVERT_MG2HF TRUE 训练完成的权重文件默认不会自动转换为Hugging Face格式权重。如果需要自动转换,则在运行脚本添加变量CONVERT_MG2HF并赋值TRUE。如果用户后续不需要自动转换,则在运行脚本中必须删除CONVERT_MG2HF变量。 对于Yi系列模型、ChatGLMv3-6B和Qwen系列模型,还需要手动修改训练参数和tokenizer文件,具体请参见训练tokenizer文件说明。
  • Step2 创建LoRA微调训练任务 创建训练作业,并自定义名称、描述等信息。选择自定义算法,启动方式自定义,以及上传的镜像。训练脚本中会自动执行训练前的权重转换操作和数据处理操作。 图1 选择镜像 如果镜像使用使用基础镜像中的基础镜像时,训练作业启动命令中输入: cd /home/ma-user/work/llm_train/AscendSpeed;sh ./scripts/install.sh;sh ./scripts/llama2/0_pl_lora_13b.sh 如果镜像使用ECS中构建新镜像构建的新镜像时,训练作业启动命令中输入: cd /home/ma-user/work/llm_train/AscendSpeed;sh ./scripts/llama2/0_pl_lora_13b.sh 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图2 开启故障重启 断点续训练是通过checkpoint机制实现。checkpoint机制是在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint继续训练。 当训练作业发生故障中断本次作业时,代码可自动从训练中断的位置继续训练,加载中断生成的checkpoint,中间不需要改动任何参数。
  • Git下载代码时报错 在执行scripts/install.sh安装命令或使用Dockerfile构建镜像时,如遇到git下载代码出现以下类似的报错信息,关闭git验证即可。 报错信息: fatal: unable to access 'https://gitee.com/ascend/ModelLink.git/': error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none 关闭git验证命令如下: git config --global http.sslverify false 父主题: 常见错误原因和解决方法
  • Yi模型 在使用Yi模型的chat版本时,由于transformer 4.38版本的bug,导致在读取tokenizer文件时,加载的vocab_size出现类似如下尺寸不匹配的问题。 RuntimeError: Error(s) in loading state_dict for VocabParallelEmbedding: size mismatch for weight: copying a param with shape torch.Size([64000, 4096]) from checkpoint, the shape in current model is torch.Size([63992, 4096]). 需要在训练开始前,修改llm_train/AscendSpeed/yi/3_training.sh文件,并添加--tokenizer-not-use-fast参数。修改后如图1所示。 图1 修改Yi 模型3_training.sh文件
  • Step2 创建SFT全参微调训练任务 创建训练作业,并自定义名称、描述等信息。选择自定义算法,启动方式自定义,以及上传的镜像。训练脚本中会自动执行训练前的权重转换操作和数据处理操作。 图1 选择镜像 如果镜像使用使用基础镜像中的基础镜像时,训练作业启动命令中输入: cd /home/ma-user/work/llm_train/AscendSpeed;sh ./scripts/install.sh;sh ./scripts/llama2/0_pl_sft_13b.sh 如果镜像使用ECS中构建新镜像构建的新镜像时,训练作业启动命令中输入: cd /home/ma-user/work/llm_train/AscendSpeed;sh ./scripts/llama2/0_pl_sft_13b.sh 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图2 开启故障重启 断点续训练是通过checkpoint机制实现。checkpoint机制是在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint继续训练。 当训练作业发生故障中断本次作业时,代码可自动从训练中断的位置继续训练,加载中断生成的checkpoint,中间不需要改动任何参数。
  • ChatGLMv3-6B 在训练开始前,针对ChatGLMv3-6B模型中的tokenizer文件,需要修改代码。修改文件chatglm3-6b/tokenization_chatglm.py 。 文件最后几处代码中需要修改,具体位置可根据上下文代码信息进行查找,修改后如图所示。 图2 修改ChatGLMv3-6B tokenizer文件 图3 修改ChatGLMv3-6B tokenizer文件
  • Yi模型 在使用Yi模型的chat版本时,由于transformer 4.38版本的bug,导致在读取tokenizer文件时,加载的vocab_size出现类似如下尺寸不匹配的问题。 RuntimeError: Error(s) in loading state_dict for VocabParallelEmbedding: size mismatch for weight: copying a param with shape torch.Size([64000, 4096]) from checkpoint, the shape in current model is torch.Size([63992, 4096]). 需要在训练开始前,修改llm_train/AscendSpeed/yi/3_training.sh文件,并添加--tokenizer-not-use-fast参数。修改后如图1所示。 图1 修改Yi 模型3_training.sh文件
  • Step1 修改训练超参配置 以llama2-13b SFT微调为例,执行脚本 0_pl_sft_13b.sh 。 修改模型训练脚本中的超参配置,必须修改的参数如表1所示。其他超参均有默认值,可以参考表1按照实际需求修改。 表1 训练超参配置说明 参数 示例值 参数说明 ORIGINAL_TRAIN_DATA_PATH /home/ma-user/work/training_data/alpaca_gpt4_data.json 必须修改。训练时指定的输入数据路径。请根据实际规划修改。 ORIGINAL_HF_WEIGHT /home/ma-user/work/models/llama-2-13b-chat-hf 必须修改。加载Hugging Face权重(可与tokenizer相同文件夹)时,对应的存放地址。请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/work/tokenizers/llama-2-13b-chat-hf 该参数为tokenizer文件的存放地址。默认与ORIGINAL_HF_WEIGHT路径相同。如果用户需要将Hugging Face权重与tokenizer文件分开存放时,则需要修改参数。 INPUT_PROCESSED_DIR /home/ma-user/work/llm_train/processed_for_input/llama2-13b 该路径下保存“数据转换”和“权重转换”的结果。示例中,默认生成在“processed_for_input”文件夹下。如果用户需要修改,可添加并自定义该变量。 OUTPUT_SAVE_DIR /home/ma-user/work/llm_train/saved_dir_for_output/ 该路径下统一保存生成的 CKPT、PLOG、LOG 文件。示例中,默认统一保存在“saved_dir_for_output”文件夹下。如果用户需要修改,可添加并自定义该变量。 CKPT_SAVE_PATH /home/ma-user/work/llm_train/saved_dir_for_output/saved_models/llama2-13b 保存训练生成的模型 CKPT 文件。示例中,默认保存在“saved_dir_for_output/saved_models”文件夹下。如果用户需要修改,可添加并自定义该变量。 LOG_SAVE_PATH /home/ma-user/work/llm_train/saved_dir_for_output/saved_models/llama2-13b/log 保存训练过程记录的日志 LOG 文件。示例中,默认保存在“saved_models/llama2-13b/log”文件夹下。如果用户需要修改,可添加并自定义该变量。 ASCEND_PROCESS_LOG_PATH /home/ma-user/work/llm_train/saved_dir_for_output/plog 保存训练过程中记录的程序堆栈信息日志 PLOG 文件。示例中,默认保存在“saved_dir_for_output/plog”文件夹下。如果用户需要修改,可添加并自定义该变量。 CONVERT_MG2HF TRUE 训练完成的权重文件默认不会自动转换为Hugging Face格式权重。如果需要自动转换,则在运行脚本添加变量CONVERT_MG2HF并赋值TRUE。如果用户后续不需要自动转换,则在运行脚本中必须删除CONVERT_MG2HF变量。 对于Yi系列模型、ChatGLMv3-6B和Qwen系列模型,还需要手动修改训练参数和tokenizer文件,具体请参见训练tokenizer文件说明。
  • ChatGLMv3-6B 在训练开始前,针对ChatGLMv3-6B模型中的tokenizer文件,需要修改代码。修改文件chatglm3-6b/tokenization_chatglm.py 。 文件最后几处代码中需要修改,具体位置可根据上下文代码信息进行查找,修改后如图2所示。 图2 修改ChatGLMv3-6B tokenizer文件 图3 修改ChatGLMv3-6B tokenizer文件
  • Step3 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。启动容器命令如下。 export work_dir="自定义挂载的工作目录" #容器内挂载的目录,例如/home/ma-user/wsexport container_work_dir="自定义挂载到容器内的工作目录"export container_name="自定义容器名称"export image_name="镜像名称"docker run -itd \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --cpus 192 \ --memory 1000g \ --shm-size 200g \ --net=host \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ $image_name \ /bin/bash 参数说明: --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如llamafactory。 -v ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载/home/ma-user目录,此目录为ma-user用户家目录。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 ${image_name} 为docker镜像的ID,在宿主机上可通过docker images查询得到。 --shm-size:表示共享内存,用于多进程间通信。由于需要转换较大内存的模型文件,因此大小要求200g及以上。 修改目录权限,上传代码和数据到宿主机时使用的是root用户,如用ma-user用户训练,此处需要执行如下命令统一文件权限。 #统一文件权限chmod -R 777 ${work_dir}# ${work_dir}:/home/ma-user/ws 宿主机代码和数据目录#例如: chmod -R 777 /home/ma-user/ws 通过容器名称进入容器中。启动容器时默认用户为ma-user用户。 docker exec -it ${container_name} bash 使用ma-user用户安装依赖包。 #进入scripts目录换cd /home/ma-user/ws/llm_train/LLaMAFactory#执行安装命令,安装依赖包及/LLaMAFactory代码包sh install.sh
  • Step1 检查环境 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装NPU设备和驱动,或释放被挂载的NPU。 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • 创建Notebook 创建开发环境Notebook实例,具体操作步骤请参考创建Notebook实例。 镜像选择已注册的 自定义镜像 ,资源类型选择创建好的专属资源池,规格推荐选择“Ascend: 8*ascend-snt9b”。 图1 Notebook中选择自定义镜像与规格 云硬盘EVS是Notebook开发环境内存的存储硬盘,作为持久化存储挂载在/home/ma-user/work目录下,该目录下的内容在实例停止后会被保留。可以自定义磁盘空间,如果需要存储数据集、模型等大型文件,建议申请规格300GB+。存储支持在线按需扩容。 图2 自定义存储配置
  • 镜像地址 本教程中用到的训练和推理的基础镜像地址和配套版本关系如下表所示,请提前了解。 表1 基础容器镜像地址 镜像用途 镜像地址 基础镜像 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_2_ascend:pytorch_2.2.0-cann_8.0.rc3-py_3.10-hce_2.0.2312-aarch64-snt9b-20240829092203-4ccf328 表2 模型镜像版本 模型 版本 CANN cann_8.0.RC3 驱动 23.0.6 PyTorch 2.2.0
  • 用户自定义执行权重转换参数修改说明 同样以 llama2 为例,用户可直接编辑 scripts/llama2/2_convert_mg_hf.sh 脚本,自定义环境变量的值,并运行该脚本。其中环境变量详细介绍如下: 如果用户要自定义数据处理脚本并且单独执行,同样以 llama2 为例。注意脚本中的python命令分别有Hugging Face 转 Megatron格式,以及Megatron 转 Hugging Face格式,而脚本使用hf2hg、mg2hf参数传递来区分。 方法一:用户可打开scripts/llama2/2_convert_mg_hf.sh脚本,将执行的python命令复制下来,修改环境变量的值。进入到 /home/ma-user/ws/llm_train/AscendSpeed/ModelLink 路径中,再执行python命令。 方法二:用户直接编辑scripts/llama2/2_convert_mg_hf.sh脚本,自定义环境变量的值,并在脚本的首行中添加 cd /home/ma-user/ws/llm_train/AscendSpeed/ModelLink 命令,随后运行该脚本。 其中环境变量详细介绍如下: 表1 权重转换脚本中的环境变量 参数 示例 参数说明 $1 hf2hg、mg2hf 运行 2_convert_mg_hf.sh 时,需要附加的参数值。如下: hf2hg:用于Hugging Face 转 Megatron mg2hf:用于Megatron 转 Hugging Face TP 8 张量并行数,一般等于单机卡数 PP 1 流水线并行数,一般等于节点数量 ORIGINAL_HF_WEIGHT /home/ma-user/ws/model/Llama2-13B 原始Hugging Face模型路径 CONVERT_MODEL_PATH /home/ma-user/ws/llm_train/processed_for_ma_input/llama2-13b/converted_weights_TP8PP1 权重转换完成之后保存路径 TOKENIZER_PATH /home/ma-user/ws/tokenizers/Llama2-13B tokenizer路径,即:原始Hugging Face模型路径 MODEL_SAVE_PATH /home/ma-user/ws/llm_train/saved_dir_for_output/llama2-13b 训练完成后保存的权重路径。
  • Megatron转HuggingFace参数说明 训练完成的权重文件默认不会自动转换为Hugging Face格式权重。如果用户需要自动转换,则在运行脚本,例如0_pl_pretrain_13b.sh中,添加变量CONVERT_MG2HF并赋值TRUE。如果用户后续不需要自动转换,则在运行脚本中必须删除CONVERT_MG2HF变量。 Megatron转HuggingFace脚本具体参数如下: --model-type:模型类型。 --save-model-type:输出后权重格式。 --load-dir:训练完成后保存的权重路径。 --save-dir:需要填入原始HF模型路径,新权重会存于../Llama2-13B/mg2hg下。 --target-tensor-parallel-size:任务不同调整参数target-tensor-parallel-size,默认为1。 --target-pipeline-parallel-size :任务不同调整参数target-pipeline-parallel-size,默认为1。 输出转换后权重文件保存路径: 权重转换完成后,在 /home/ma-user/ws/llm_train/saved_dir_for_output/llama2-13b/saved_models/pretrain_hf/ 目录下查看转换后的权重文件。 注意:权重转换完成后,需要将例如saved_models/pretrain_hf中的文件与原始Hugging Face模型中的文件进行对比,查看是否缺少如tokenizers.json、tokenizer_config.json、special_tokens_map.json等tokenizer文件或者其他json文件。如果缺少则需要直接复制至权重转换后的文件夹中,否则不能直接用于推理。
  • NPU_Flash_Attn融合算子约束 query、key、value都需要梯度。默认开启重计算,则前向时qkv没有梯度,如果需要关闭重计算,可以在yaml配置 `disable_gradient_checkpointing: true` 关闭,但显存占用会直线上升。 attn_mask 只支持布尔(bool)数据类型,或者为None。 query的shape仅支持 [B, N1, S1, D],其中N1≤ 2048,D≤ 512并且dim== 4。 对于GQA,key的shape是 [B, N2, S2, D],其中 N2 ≤ 2048,并且N1是N2的正整数倍。 不满足以上场景,则不能实现NPU_Flash_Attn功能。 父主题: 训练脚本说明
  • HuggingFace转Megatron参数说明 --model-type:模型类型。 --loader:选择对应加载模型脚本的名称。 --saver:选择模型保存脚本的名称。 --tensor-model-parallel-size:${TP}张量并行数,需要与训练脚本中的TP值配置一样。 --pipeline-model-parallel-size:${PP}流水线并行数,需要与训练脚本中的PP值配置一样。 --load-dir:加载转换模型权重路径。 --save-dir : 权重转换完成之后保存路径。 --tokenizer-model : tokenizer路径。
  • 用户自定义执行数据处理脚本修改参数说明 如果用户要自定义数据处理脚本并且单独执行,同样以 llama2 为例。 方法一:用户可打开scripts/llama2/1_preprocess_data.sh脚本,将执行的python命令复制下来,修改环境变量的值。在Notebook进入到 /home/ma-user/work/llm_train/AscendSpeed/ModelLink 路径中,再执行python命令。 方法二:用户在Notebook中直接编辑scripts/llama2/1_preprocess_data.sh脚本,自定义环境变量的值,并在脚本的首行中添加 cd /home/ma-user/work/llm_train/AscendSpeed/ModelLink 命令,随后在Notebook中运行该脚本。 其中环境变量详细介绍如下: 表1 数据预处理中的环境变量 环境变量 示例 参数说明 RUN_TYPE pretrain、sft、lora 数据预处理区分: 预训练场景下数据预处理,默认参数:pretrain 微调场景下数据预处理,默认:sft / lora ORIGINAL_TRAIN_DATA_PATH /home/ma-user/work/training_data/finetune/moss_LossCompare.jsonl 原始数据集的存放路径。 TOKENIZER_PATH /home/ma-user/work/model/llama-2-13b-chat-hf tokenizer的存放路径,与HF权重存放在一个文件夹下。请根据实际规划修改。 PROCESSED_DATA_PREFIX /home/ma-user/work/llm_train/processed_for_input/llama2-13b/data/pretrain/alpaca 处理后的数据集保存路径+数据集前缀。 TOKENIZER_TYPE PretrainedFromHF 可选项有:['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为 PretrainedFromHF 。 SEQ_LEN 4096 要处理的最大seq length。脚本会检测超出SEQ_LEN长度的数据,并打印log。
  • 预训练数据集预处理参数说明 预训练数据集预处理脚本scripts/llama2/1_preprocess_data.sh中的具体参数如下: --input:原始数据集的存放路径。 --output-prefix:处理后的数据集保存路径+数据集名称(例如:alpaca_gpt4_data)。 --tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 --tokenizer-name-or-path:tokenizer的存放路径,与HF权重存放在一个文件夹下。 --handler-name:生成数据集的用途,这里是生成的文本数据集,用于预训练。 GeneralPretrainHandler:默认。用于预训练时的数据预处理过程中,将数据集根据key值进行简单的过滤。 --seq-length:要处理的最大seq length。 --workers:设置数据处理使用执行卡数量 / 启动的工作进程数。 --log-interval:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。
  • 微调数据集预处理参数说明 微调包含SFT和LoRA微调。数据集预处理脚本参数说明如下: --input:原始数据集的存放路径。 --output-prefix:处理后的数据集保存路径+数据集名称(例如:alpaca_gpt4_data) --tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 --tokenizer-name-or-path:tokenizer的存放路径,与HF权重存放在一个文件夹下。 --handler-name:生成数据集的用途,这里是生成的指令数据集,用于微调。 GeneralInstructionHandler:用于sft、lora微调时的数据预处理过程中,会对数据集full_prompt中的user_prompt进行mask操作。 --seq-length:要处理的最大seq length。 --workers:设置数据处理使用执行卡数量 / 启动的工作进程数。 --log-interval:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。
  • 问题8:使用benchmark-tools对GLM系列模型进行性能测试报错 使用benchmark-tools对GLM系列模型进行性能测试报错TypeError: _pad() got an unexpected keyword argument 'padding_side' 解决方法: 1、下载最新的tokenization_chatglm.py,替换原来权重里的tokenization_chatglm.py。 https://huggingface.co/THUDM/glm-4-9b-chat/blob/main/tokenization_chatglm.py https://huggingface.co/THUDM/chatglm3-6b/blob/main/tokenization_chatglm.py 或者2、修改tokenization_chatglm.py,在266行增加padding_side: str = "left",如图1所示。 图1 tokenization_chatglm.py
  • 问题9:使用benchmark-tools访问推理服务返回报错 使用benchmark-tools访问推理服务时,输入输出的token和大于max_model_len,服务端返回报错Response payload is not completed,见图2。 再次设置输入输出的token和小于max_model_len访问推理服务,服务端响应200,见图3。 客户端仍返回报错Response payload is not completed,见图4。 图2 服务端返回报错Response payload is not completed 图3 服务端响应200 图4 仍返回报错Response payload is not completed 解决方法: 安装brotlipy后返回正确报错 pip install brotlipy
  • 问题2:在推理预测过程中遇到ValueError:User-specified max_model_len is greater than the drived max_model_len 解决方法: 修改config.json文件中的"seq_length"的值,"seq_length"需要大于等于 --max-model-len的值。config.json存在模型对应的路径下,例如:/data/nfs/benchmark/tokenizer/chatglm3-6b/config.json
  • 问题4:使用SmoothQuant进行W8A8进行模型量化时报错 使用SmoothQuant进行W8A8进行模型量化时报错:AttributeError: type object 'LlamaAttention' has no attribute '_init_rope' 解决方法:降低transformers版本到4.42 pip install transformers==4.42 --upgrade
  • multi-step参数设置 启动推理服务时,使用multi-step调度需要配置的参数如下表所示。 表1 开启multi-step调度参数配置 服务启动方式 配置项 取值类型 配置说明 offline num_scheduler_steps int 连续运行模型的步数。 默认为1,推荐设置为8 offline multi_step_stream_outputs bool 设置false后,mult-step会关闭流式输出提升性能,一次将返回num_scheduler_steps个token。 默认true online --num-scheduler-steps int 连续运行模型的步数。 默认为1,推荐设置为8 online --multi-step-stream-outputs bool 设置false后,mult-step会关闭流式输出提升性能,一次将返回--num-scheduler-steps个token。 默认true
共99354条