华为云用户手册

  • Step2 修改训练超参配置 以llama2-70b和llama2-13b预训练为例,执行脚本为0_pl_pretrain_70b.sh 和0_pl_pretrain_13b.sh 。 修改模型训练脚本中的超参配置,必须修改的参数如表1所示。其他超参均有默认值,可以参考表1按照实际需求修改。 表1 训练超参配置说明 参数 示例值 参数说明 ORIGINAL_TRAIN_DATA_PATH /home/ma-user/ws/training_data/train-00000-of-00001-a09b74b3ef9c3b56.parquet 必须修改。训练时指定的输入数据路径。请根据实际规划修改。 ORIGINAL_HF_WEIGHT /home/ma-user/ws/models/llama2-13B 必须修改。加载Hugging Face权重(可与tokenizer相同文件夹)时,对应的存放地址。请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/llama2-13B 该参数为tokenizer文件的存放地址。默认与ORIGINAL_HF_WEIGHT路径相同。如果用户需要将Hugging Face权重与tokenizer文件分开存放时,则需要修改参数。 INPUT_PRO CES SED_DIR /home/ma-user/ws/llm_train/processed_for_input/llama2-13b 该路径下保存“数据转换”和“权重转换”的结果。示例中,默认生成在“processed_for_input”文件夹下。如果用户需要修改,可添加并自定义该变量。 OUTPUT_SAVE_DIR /home/ma-user/ws/llm_train/saved_dir_for_output/ 该路径下统一保存生成的CKPT、P LOG 、LOG文件。示例中,默认统一保存在“saved_dir_for_output”文件夹下。如果用户需要修改,可添加并自定义该变量。 CKPT_SAVE_PATH /home/ma-user/ws/llm_train/saved_dir_for_output/saved_models/llama2-13b 保存训练生成的模型CKPT文件。示例中,默认保存在“saved_dir_for_output/saved_models”文件夹下。如果用户需要修改,可添加并自定义该变量。 LOG_SAVE_PATH /home/ma-user/ws/llm_train/saved_dir_for_output/saved_models/llama2-13b/log 保存训练过程记录的日志LOG文件。示例中,默认保存在“saved_models/llama2-13b/log”文件夹下。如果用户需要修改,可添加并自定义该变量。 ASCEND_PROCESS_LOG_PATH /home/ma-user/ws/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文件说明。
  • Step3 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。启动容器命令如下。 export work_dir="自定义挂载的工作目录" #容器内挂载的目录,例如/home/ma-user/ws export 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} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如ascendspeed。 -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及以上。 通过容器名称进入容器中。启动容器时默认用户为ma-user用户。 docker exec -it ${container_name} bash 上传代码和数据到宿主机时使用的是root用户,此处需要执行如下命令统一文件属主为ma-user用户。 #统一文件属主为ma-user用户 sudo chown -R ma-user:ma-group ${container_work_dir} # ${container_work_dir}:/home/ma-user/ws 容器内挂载的目录 #例如:sudo chown -R ma-user:ma-group /home/ma-user/ws 使用ma-user用户安装依赖包。 #进入scripts目录换 cd /home/ma-user/ws/llm_train/AscendSpeed #执行安装命令 sh scripts/install.sh 为了避免因使用不同版本的 transformers 库进行训练和推理而导致冲突的问题,建议用户分别为训练和推理过程创建独立的容器环境。 通过运行install.sh脚本,还会git clone下载Megatron-LM、MindSpeed、ModelLink源码(install.sh中会自动下载配套版本,如果手动下载源码还需修改版本)至llm_train/AscendSpeed文件夹中。下载的源码文件结构如下: AscendSpeed/ |──ascendcloud_patch/ # 针对昇腾云平台适配的功能补丁包 |──scripts/ # 训练需要的启动脚本 |——src/ # 启动命令行封装脚本,在install.sh里面自动构建 |──Megatron-LM/ # 适配昇腾的Megatron-LM训练框架 |──MindSpeed/ # MindSpeed昇腾大模型加速库 |──ModelLink/ # ModelLink端到端的大语言模型方案 |——megatron/ # 注意:该文件夹从Megatron-LM中复制得到 |——... 如果git下载代码时报错,请参见Git下载代码时报错解决。
  • Step1 检查环境 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的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
  • 镜像地址 本教程中用到的训练和推理的基础镜像地址和配套版本关系如下表所示,请提前了解。 表1 基础容器镜像地址 镜像用途 镜像地址 基础镜像 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc3-py_3.9-hce_2.0.2312-aarch64-snt9b-20240824153350-cebb080 表2 模型镜像版本 模型 版本 CANN cann_8.0.rc3 驱动 23.0.6 PyTorch 2.1.0
  • Alpaca数据集 本教程使用Alpaca数据集,数据集的介绍及下载链接如下。 Alpaca数据集是由OpenAI的text-davinci-003引擎生成的包含52k条指令和演示的数据集。这些指令数据可以用来对语言模型进行指令调优,使语言模型更好地遵循指令。 预训练使用的Alpaca数据集下载:https://huggingface.co/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet,数据大小:24M左右。 SFT和LoRA微调使用的Alpaca数据集下载:https://huggingface.co/datasets/QingyiSi/Alpaca-CoT/blob/main/alpacaGPT4/alpaca_gpt4_data.json,数据大小:43.6 MB。
  • 上传数据到指定目录 将下载的原始数据存放在/home/ma-user/ws/training_data目录下。具体步骤如下: 进入到/home/ma-user/ws/目录下。 创建目录“training_data”,并将原始数据放置在此处。 mkdir training_data 数据存放参考目录结构如下: ${workdir}(例如/home/ma-user/ws ) |── training_data |── train-00000-of-00001-a09b74b3ef9c3b56.parquet # 训练原始数据集 |── alpaca_gpt4_data.json # 微调数据文件 多机情况下,只有在rank_0节点进行数据预处理,转换权重等工作,所以原始数据集和原始权重,包括保存结果路径,都应该在共享目录下。
  • 上传代码和权重文件到工作环境 使用root用户以SSH的方式登录Server。 将AscendCloud代码包AscendCloud-xxx-xxx.zip上传到${workdir}目录下并解压缩,如:/home/ma-user/ws目录下,以下都以/home/ma-user/ws为例,请根据实际修改。 unzip AscendCloud-*.zip 上传tokenizers文件到工作目录中的/home/ma-user/ws/tokenizers/Llama2-{MODEL_TYPE}目录,如Llama2-70B。 具体步骤如下: 进入到${workdir}目录下,如:/home/ma-user/ws,创建tokenizers文件目录将权重和词表文件放置此处,以Llama2-70B为例。 cd /home/ma-user/ws mkdir -p tokenizers/Llama2-70B 多机情况下,只有在rank_0节点进行数据预处理,转换权重等工作,所以原始数据集和原始权重,包括保存结果路径,都应该在共享目录下。
  • 获取模型软件包 本方案支持的模型对应的软件和依赖包获取地址如表1所示,模型列表、对应的开源权重获取地址如表2所示。 表1 模型对应的软件包和依赖包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.3.908-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.908中的AscendCloud-LLM-xxx.zip软件包和算子包AscendCloud-OPP,AscendCloud-LLM关键文件介绍如下。 |——AscendCloud-LLM |──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 # 推理工具
  • 工作目录介绍 详细的工作目录参考如下,建议参考以下要求设置工作目录。训练脚本以分类的方式集中在scripts文件夹中。 ${workdir}(例如/home/ma-user/ws ) |──llm_train #解压代码包后自动生成的代码目录,无需用户创建 |── AscendSpeed # 代码目录 |──ascendcloud_patch/ # 针对昇腾云平台适配的功能代码包 |──scripts/ # 各模型训练需要的启动脚本,训练脚本以分类的方式集中在scripts文件夹中。 # 自动生成数据目录结构 |── processed_for_input #目录结构会自动生成,无需用户创建 |── ${model_name} # 模型名称 |── data # 预处理后数据 |── pretrain # 预训练加载的数据 |── finetune # 微调加载的数据 |──converted_weights # HuggingFace格式转换megatron格式后权重文件 |── saved_dir_for_output # 训练输出保存权重,目录结构会自动生成,无需用户创建 |── ${model_name} # 模型名称 |── logs # 训练过程中日志(loss、吞吐性能) |—— saved_models |── lora # lora微调输出权重 |── sft # 增量训练输出权重 |── pretrain # 预训练输出权重 |── tokenizers #tokenizer目录,需要用户手动创建,后续操作步骤中会提示 |── Llama2-70B |── models #原始权重与tokenizer目录,需要用户手动创建,后续操作步骤中会提示 |── Llama2-70B |── training_data #原始数据目录,需要用户手动创建,后续操作步骤中会提示 |── train-00000-of-00001-a09b74b3ef9c3b56.parquet #原始数据文件 |── alpaca_gpt4_data.json #微调数据文件
  • 训练支持的模型列表 本方案支持以下模型的训练,如表1所示。 表1 支持的模型列表 序号 支持模型 支持模型参数量 权重文件获取地址 1 llama2 llama2-7b https://huggingface.co/meta-llama/Llama-2-7b-chat-hf 2 llama2-13b https://huggingface.co/meta-llama/Llama-2-13b-chat-hf 3 llama2-70b https://huggingface.co/meta-llama/Llama-2-70b-hf https://huggingface.co/meta-llama/Llama-2-70b-chat-hf (推荐) 4 llama3 llama3-8b https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct 5 llama3-70b https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct 6 Qwen qwen-7b https://huggingface.co/Qwen/Qwen-7B-Chat 7 qwen-14b https://huggingface.co/Qwen/Qwen-14B-Chat 8 qwen-72b https://huggingface.co/Qwen/Qwen-72B-Chat 9 Qwen1.5 qwen1.5-7b https://huggingface.co/Qwen/Qwen1.5-7B-Chat 10 qwen1.5-14b https://huggingface.co/Qwen/Qwen1.5-14B-Chat 11 qwen1.5-32b https://huggingface.co/Qwen/Qwen1.5-32B-Chat 12 qwen1.5-72b https://huggingface.co/Qwen/Qwen1.5-72B-Chat 13 Yi yi-6b https://huggingface.co/01-ai/Yi-6B-Chat 14 yi-34b https://huggingface.co/01-ai/Yi-34B-Chat 15 ChatGLMv3 glm3-6b https://huggingface.co/THUDM/chatglm3-6b 16 Baichuan2 baichuan2-13b https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 17 Qwen2 qwen2-0.5b https://huggingface.co/Qwen/Qwen2-0.5B-Instruct 18 qwen2-1.5b https://huggingface.co/Qwen/Qwen2-1.5B-Instruct 19 qwen2-7b https://huggingface.co/Qwen/Qwen2-7B-Instruct 20 qwen2-72b https://huggingface.co/Qwen/Qwen2-72B-Instruct 21 GLMv4 glm4-9b https://huggingface.co/THUDM/glm-4-9b-chat 说明: glm4-9b模型必须使用版本4b556ad4d70c38924cb8c120adbf21a0012de6ce 22 mistral mistral-7b https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2 23 mixtral mixtral-8x7b https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1
  • 操作流程 图1 操作流程图 表2 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 本教程案例是基于ModelArts Lite Server运行的,需要购买并开通Server资源。 准备代码 准备AscendSpeed训练代码、分词器Tokenizer和推理代码。 准备数据 准备训练数据,可以用本案使用的数据集,也可以使用自己准备的数据集。 准备镜像 准备训练模型适用的容器镜像。 预训练 预训练 介绍如何进行预训练,包括训练数据处理、超参配置、训练任务、性能查看。 微调训练 SFT全参微调 介绍如何进行SFT全参微调、超参配置、训练任务、性能查看。 LoRA微调训练 介绍如何进行LoRA微调、超参配置、训练任务、性能查看。
  • 问题七 Llama-Factory环境,运行DockerFile或install.sh中的setup.py失败 【问题现象】 执行Llama-Factory代码目录下setup.py失败,报错:“SetuptoolsDeprecationWarning: License classifiers are deprecated.” 图3 setup.py报错提示 【问题根因】 pip依赖包版本过低导致与其他依赖包冲突。 【解决措施】 修改添加pip install --upgrade pip命令至AscendFactory/install.sh文件,如图所示: 重新执行DockerFile或install.sh。
  • 问题六 Llama-Factory框架训练过程中训练至某一步卡死现象 【问题现象】 多节点训练任务,运行至某一个steps时训练任务卡死2H,导致任务超时 【问题根因】 ascend_trace线程抓取调用栈时对相关资源加锁,dataloader_worker进程在被fork拉起时继承了锁状态,导致dataloader_worker进程因无法获取到锁而卡死。 【解决措施】 训练作业前,先通过加载环境变量export ASCEND_COREDUMP_SIGNAL=none关闭ascend的堆栈跟踪。 export ASCEND_COREDUMP_SIGNAL=none
  • 问题八 MindSpeed-LLM蒸馏模型训练精度问题 【问题根因】 MindSpeed-LLM框架中某些参数值为固定值,与蒸馏后模型配置不一致,导致训练结果精度问题。 【解决措施】 训练前修改代码包目录下scripts_modellink/{model}/3_training.sh文件参数值与蒸馏模型权重目录下config.json参数值保持一致,参数表格如下: 表1 3_training.sh参数修改值 蒸馏模型 原模型 3_training.sh文件参数 DeepSeek-R1-Distill-Qwen-7B qwen2.5-7b --rotary-base 10000 DeepSeek-R1-Distill-Qwen-14B/32B qwen2.5-14b/32b --norm-epsilon 1e-5
  • 问题五 Llama-Factory框架数据预处理过大数据集超时 【问题根因】 Llama-Factory框架处理数据默认先处理0卡,再依次处理1~7卡,串行处理数据导致时间占用过大导致超时。 【解决措施】 方案A:修改LLamaFactory barrier策略,将0卡先处理,1~7卡再处理方案修改为0~7卡同步处理,训练前执行以下命令: export DISABLE_MAIN_PROCESS_FIRST = True 方案B:默认处理策略不变,将训练作业运行超时时间修改为2小时,训练前执行以下命令: export ACL_DEVICE_SYNC_TIMEOUT=7200 方案B操作简单,但数据集过大时,有可能2个小时也会超时,可以继续修改延长超时时间。
  • 问题二 网卡名称错误 当训练开始时提示网卡名称错误。或者通信超时。可以使用ifconfig命令检查网卡名称配置是否正确。 比如,ifconfig看到当前机器IP对应的网卡名称为enp67s0f5,则可以设置环境变量指定该值。 图1 网卡名称错误 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
  • 问题四 DockerFile或install.sh安装三方依赖包失败 【问题现象】 下载安装AscendFactory/dependences.yaml中三方依赖包:Llama-Factory、MindSpeed-LLM等失败。 【问题根因】 无法连接公网导致拉取git失败。 【解决措施】 配置代理或使用有公网权限的机器手动拉取AscendFactory/dependences.yaml中的三方依赖包,命名、版本与dependences.yaml中${save_name}、${version}值保持一致,并将其复制至AscendFactory/third-party目录下,重新DockerFile或执行install.sh命令。
  • 大语言模型gsm8k数据处理 import argparse import os import re import datasets from verl.utils.hdfs_io import copy, makedirs def extract_solution(solution_str): solution = re.search("#### (\\-?[0-9\\.\\,]+)", solution_str) assert solution is not None final_solution = solution.group(0) final_solution = final_solution.split("#### ")[1].replace(",", "") return final_solution if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--local_dir", default="~/data/gsm8k") parser.add_argument("--hdfs_dir", default=None) args = parser.parse_args() data_source = "openai/gsm8k" dataset = datasets.load_dataset(xxx/xxx/xxx) train_dataset = dataset["train"] test_dataset = dataset["test"] instruction_following = 'Let\'s think step by step and output the final answer after "####".' # add a row to each data item that represents a unique id def make_map_fn(split): def process_fn(example, idx): question_raw = example.pop("question") question = question_raw + " " + instruction_following answer_raw = example.pop("answer") solution = extract_solution(answer_raw) data = { "data_source": data_source, "prompt": [ { "role": "user", "content": question, } ], "ability": "math", "reward_model": {"style": "rule", "ground_truth": solution}, "extra_info": { "split": split, "index": idx, "answer": answer_raw, "question": question_raw, }, } return data return process_fn train_dataset = train_dataset.map(function=make_map_fn("train"), with_indices=True) test_dataset = test_dataset.map(function=make_map_fn("test"), with_indices=True) local_dir = args.local_dir hdfs_dir = args.hdfs_dir train_dataset.to_parquet(os.path.join(local_dir, "train.parquet")) test_dataset.to_parquet(os.path.join(local_dir, "test.parquet")) if hdfs_dir is not None: makedirs(hdfs_dir) copy(src=local_dir, dst=hdfs_dir)
  • 模型最小卡数配置 不同模型推荐的训练参数和计算规格要求如表1所示,目前仅提供微调(SFT)及训练(PT)阶段卡数配置。一般Snt9B规格为单节点8卡,Snt9B23规格为单机8卡=16*DIE,其中1*DIE等效于Snt9B中的1卡,Snt9B23规格实际训练过程中设置并行策略时2*DIE为最小单位;以下配置仅参考,一般小于8卡使用8卡训练,用户可基于卡数配置浮动调动。 * 表格中“-”代表不支持,规格与卡数中的 4*Ascend表示4卡在Snt9B中表示4卡,Snt9B23表示4*DIE,以此类推。 表1 模型最小卡数配置 支持模型参数量 训练策略类型 序列长度SEQ_LEN MindSpeed-LLM规格卡数/DIE Llama-Factory规格卡数/DIE Snt9B Snt9B23 Snt9B Snt9B23 llama3.1-8b full 4096/8192 4*Ascend 8*Ascend lora 4*Ascend 1*Ascend 2*Ascend llama3.1-70b full 4096 32*Ascend 64*Ascend lora 16*Ascend 32*Ascend full 8192 64*Ascend 64*Ascend lora 16*Ascend 32*Ascend llama3.2-1b full/lora 4096/8192 1*Ascend 2*Ascend 1*Ascend 1*Ascend llama3.2-3b full 4096/8192 2*Ascend 4*Ascend lora 1*Ascend 2*Ascend 1*Ascend 2*Ascend qwen2-0.5b full/lora 4096/8192 1*Ascend 2*Ascend 1*Ascend 2*Ascend qwen2-1.5b full/lora 4096/8192 1*Ascend 2*Ascend - qwen2-7b full 4096 4*Ascend 1*Ascend 2*Ascend lora 4*Ascend 8*Ascend full 8192 8*Ascend 1*Ascend 2*Ascend lora 8*Ascend 8*Ascend qwen2-72b full 4096 32*Ascend 64*Ascend lora 16*Ascend 32*Ascend full 8192 64*Ascend 64*Ascend lora 16*Ascend 32*Ascend qwen2.5-0.5b full/lora 4096/8192 1*Ascend 2*Ascend 1*Ascend 2*Ascend qwen2.5-7b full 4096 4*Ascend 8*Ascend lora 2*Ascend 1*Ascend 2*Ascend full 8192 8*Ascend 8*Ascend lora 2*Ascend 1*Ascend 2*Ascend qwen2.5-14b full 4096 8*Ascend 8*Ascend lora 4*Ascend 4*Ascend full 8192 8*Ascend 16*Ascend lora 8*Ascend 4*Ascend qwen2.5-32b full 4096 16*Ascend 32*Ascend lora 16*Ascend 8*Ascend full 8192 16*Ascend 32*Ascend lora 16*Ascend 16*Ascend qwen2.5-72b full 4096 32*Ascend 64*Ascend lora 16*Ascend 32*Ascend full 8192 64*Ascend 64*Ascend lora 16*Ascend 32*Ascend qwen2vl-2b full 4096/8192 - 2*Ascend lora 4096/8192 - 1*Ascend qwen2vl-7b full 4096/8192 - 8*Ascend lora 4096/8192 - 1*Ascend 2*Ascend qwen2vl-72b full 1024 - 32*Ascend lora 1024 - 16*Ascend qwen2.5_vl-7b full 4096/8192 - 8*Ascend lora 4096/8192 - 1*Ascend 2*Ascend qwen2.5_vl-72b full 4096/8192 - 64*Ascend lora 4096/8192 - 32*Ascend qwen3-0.6b full/lora 4096/8192 8*Ascend 8*Ascend qwen3-1.7b full/lora 4096/8192 8*Ascend 8*Ascend qwen3-4b full/lora 4096/8192 8*Ascend 8*Ascend qwen3-8b full/lora 4096/8192 8*Ascend 8*Ascend qwen3-14b full/lora 4096/8192 8*Ascend 8*Ascend qwen3-32b full 4096 16*Ascend 32*Ascend 8192 16*Ascend 32*Ascend lora 4096 8*Ascend 8*Ascend 8192 8*Ascend 16*Ascend qwen3_moe-30B_A3B full 4096 16*Ascend 32*Ascend 8192 32*Ascend 64*Ascend lora 4096/8192 16*Ascend 32*Ascend qwen3_moe-235B_A22B full 4096 256*Ascend 512*Ascend lora 4096 128*Ascend 256*Ascend glm4-9b full 4096/8192 8*Ascend 8*Ascend lora 4096/8192 2*Ascend 1*Ascend 2*Ascend mixtral-8x7b full 4096/8192 16*Ascend - DeepSeek-V3/R1 full 4096 512*Ascend - lora 64*Ascend - internvl2.5-8b full/lora 4096/8192 - 8*Ascend internvl2.5-38b full 4096/8192 - 32*Ascend lora 4096/8192 - 16*Ascend internvl2.5-78b full 4096 - 32*Ascend 8192 - 64*Ascend lora 4096 - 16*Ascend 8192 - 32*Ascend gemma3-27b full 4096 - 16*Ascend 8192 - 48*Ascend lora 4096/8192 - 16*Ascend 1. LLama-Factory使用的zero并行会将优化器、梯度、权重在多卡上切分,因此集群规模的大小会影响最佳配置与性能。 2. 当mindspeed-llm上开启分布式优化器并行时,优化器参数会在集群所有机器上切分共享,因此最优配置会和卡数相关。 3. 当前benchmark是综合考虑了最小可运行卡数和最优性能平衡情况下测试出的配置,实际情况中可以根据集群规模大小和性能取舍进行参数调整。
  • 支持数据简介 MindSpeed-LLM、Llama-Factory框架常用数据集格式: alpaca格式 sharegpt格式 moss格式(仅支持MindSpeed-LLM) 本教程样例数据集下载链接如下: 预训练(MindSpeed-LLM):train-00000-of-00001-a09b74b3ef9c3b56.parquet,数据大小:24M左右。 微调:alpaca_gpt4_data.json,数据大小:43.6 MB。 强化学习(VeRL),数据集分为train和test两种,示例截图如下: 大语言模型:https://huggingface.co/datasets/openai/gsm8k/tree/main 多模态模型:https://huggingface.co/datasets/hiyouga/geometry3k/tree/main
  • Llama-Factory glm4-9b模型 在训练开始前,需要修改glm4-9b模型中的tokenizer文件modeling_chatglm.py内容,具体步骤如下: 进入到tokenizer(权重)目录下,修改modeling_chatglm.py文件内容 vim modeling_chatglm.py # 注释掉以下两行内容 # if attention_mask is not None # attention_mask = ~attention_mask 样例图: InternVL2_5系列模型 InternVL2_5系列模型均未在Transformers仓注册,需提前手动打patch,详细步骤如下: InternVL2_5-8B: # git clone 方式下载模型文件,如果已下载忽略此git clone步骤 git clone https://huggingface.co/OpenGVLab/InternVL2_5-8B # 进入权重目录下打patch文件,${work_dir}为工作目录根据实际修改 cd InternVL2_5-8B && git apply ${work_dir}/llm_train/AscendFactory/third-party/internvl25-8b.patch InternVL2_5-38B: # git clone 方式下载模型文件,如果已下载忽略此git clone步骤 git clone https://huggingface.co/OpenGVLab/nternVL2_5-38B # 进入权重目录下打patch文件,${work_dir}为工作目录根据实际修改 cd InternVL2_5-38B && git apply ${work_dir}/llm_train/AscendFactory/third-party/internvl25-38b.patch InternVL2_5-78B: # git clone 方式下载模型文件,如果已下载忽略此git clone步骤 git clone https://huggingface.co/OpenGVLab/InternVL2_5-78B # 进入权重目录下打patch文件,${work_dir}为工作目录根据实际修改 cd InternVL2_5-78B && git apply ${work_dir}/llm_train/AscendFactory/third-party/internvl25-8b.patch
  • 查看性能 训练性能主要通过训练日志中的2个指标查看:吞吐量和loss收敛情况。 MindSpeed-LLM 吞吐量(tokens/s/p):global batch size*seq_length/(总卡数*elapsed time per iteration)*1000,其global batch size(GBS)、seq_len(SEQ_LEN)为训练时设置的参数,日志中有打印。 loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。也可以使用可视化工具TrainingLogParser查看loss收敛情况。 Llama-Factory 吞吐量(tokens/s/p):${output_dir}参数值路径下的trainer_log.jsonl计算性能。取中间过程多steps平均值吞吐计算,一般训练日志中已计算打印出吞吐值。公式为: delta_tokens = end_total_tokens-start_ total_tokens delta_time = end_elapsed_time - start_elapsed_time 吞吐值(tps) = delta_tokens / delta_time / 训练卡数 如图所示: loss收敛情况:loss收敛图存放路径${output_dir}参数值路径下的training_loss.png中也可以使用可视化工具TrainingLogParser查看loss收敛情况,将trainer_log.jsonl文件上传至可视化工具页面即可。
  • 步骤二:配置数据输入和输出【OBS方式】 此小节根据实际选择训练框架不同,设置输入、输出参数不同,根据实际选择,该小节仅为使用OBS桶存储所需,如使用SFS Turbo共享盘忽略此小节。 单击“增加训练输入”和“增加训练输出”,用于配置训练作业开始时需要输入数据的路径和训练结束后输出数据的路径。 图2 增加训练输入输出 在“输入”框内设置超参key值,选择训练框架不同填入不同参数,根据实际选择填入超参。 MindSpeed-LLM 输入数据集参数:是否使用已处理好数据集; 是,添加backend_config.training.data-path:已处理好数据路径目录 否,使用原始数据集,添加backend_config.preprocess_data.input:训练时指定的输入原始数据集路径。 输入权重词表超参(tokenizer):添加backend_config.training.tokenizer-name-or-path:加载tokenizer与Hugging Face权重对应存放目录地址。 是否使用已转换Megatron格式权重或训练输出结果权重目录; 是,添加backend_config.training,load:已转换Megatron格式权重目录或训练输出结果权重目录, 否,使用原始huggingface权重,忽略此步骤 Llama-Factory 输入数据集参数:backend_config.dataset_dir:训练时指定的输入数据集路径,一般只有使用自定义数据时需设置,地址为代码包AscendFactory/data目录下 输入权重词表参数:backend_config.model_name_or_path:加载tokenizer与Hugging Face权重时,对应的存放地址。 backend_config.adapter_name_or_path:基于lora训练完成后生成的lora产物未合并时的权重文件(基于lora微调后模型进行增量训练时传入) 在“输出”框内设置超参key,选择训练框架不同填入不同参数,根据实际选择填入超参。 设置af_output_dir参数:训练完成后指定的输出模型路径 分别单击“输入”和“输出”的数据存储位置,选择相应OBS路径地址。 “输出”中的预下载至本地目标选择:下载,此时输出路径中的数据则会下载至OBS中。 图3 设置输入、输出值样例
  • 步骤四:开启训练故障自动重启功能 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图5 开启故障重启 断点续训练是通过checkpoint机制实现。checkpoint机制是在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint继续训练。 当训练作业发生故障中断本次作业时,代码可自动从训练中断的位置接续训练,加载中断生成的checkpoint,中间不需要改动任何参数。MindSpeed-LLM可通过save-interval参数、Llama-Factory可通过save_steps参数,指定间隔多少step保存checkpoint。 如果要使用自动重启功能,资源规格必须选择八卡规格且超参配置有限制。 MindSpeed-LLM:train_auto_resume参数必须为true,默认为false。 Llama-Factory:overwrite_output_dir参数必须为false,默认为true。 训练作业中的训练故障自动恢复功能包括: 训练容错检查(自动重启),帮助用户隔离故障节点,优化用户训练体验。详细可了解:训练容错检查 无条件自动重启,不管什么原因系统都会自动重启训练作业,提高训练成功率和提升作业的稳定性。详细可了解:无条件自动重启。
  • 步骤五:配置资源 选择用户自己的专属资源池,以及规格与节点数。防止训练过程中出现内存溢出的情况,预训练及微调阶段用户可参考表1进行配置。 图6 Snt9B资源池规格 图7 Snt9B23资源池规格 Snt9B23相较于Snt9B,环境中新加“亲和组容量”特性,亲和组容量与实例数个数保持一致,确保作业调度同一个超节点。 作业日志选择OBS中的路径,训练作业的日志信息则保存该路径下。 最后,提交训练作业,训练完成后,请参考训练结果输出章节查看日志和性能。了解更多ModelArts训练功能,可查看模型开发简介。
  • OBS桶 本地完成代码包AscendCloud-LLM-xxx.zip的解压。 # Linux系统 unzip AscendCloud-*.zip && unzip AscendCloud-LLM-*.zip && unzip ./llm_train/AscendFactory/data.tgz 上传权重。 获取对应模型的权重文件,获取链接参考支持的模型列表,并检查权重文件、大小是否完整。 本地修改权重(tokenizer)文件,以下模型需修改,根据所选框架及模型修改相应文件,详情参考tokenizer文件说明 Llama-Factory:glm4-9B模型、InternVL2_5系列模型 在创建OBS桶创建的桶下创建文件夹用以存放权重和词表文件,例如在桶standard-llama2-13b中创建文件夹llama2-13B-chat-hf。 利用OBS-Browser+工具将下载好的权重文件上传至创建的文件夹目录下。得到OBS下数据集结构,此处以llama2-13B为例(权重文件可能变化,以下仅为举例)。 上传代码及数据。 准备数据集,例如下载样例数据集或者在本地按照固定格式处理好自己的数据集(可参考数据说明),并将数据集存放至本地llm_train/AscendFactory/data目录下。 【VeRL框架】数据预处理: 根据模型类型选择VeRL数据处理样例脚本内容拷贝至本地为dataset_demo.py,编辑脚本中dataset = datasets.load_dataset(xxx/xxx/xxx)的xxx/xxx/xxx值,填写原始数据集目录或文件的绝对或相对路径。 本地执行以下命令: python dataset_demo.py --local_dir=llm_train/AscendFactory/data/xxx --local_dir:数据处理输出后的数据集路径 是否使用Llama-Factory框架训练。 是,更新data/dataset_info.json文件。如使用以下示例数据集则命令如下。关于数据集文件格式及配置,更多样例格式信息请参考README_zh.md 的内容。 vim dataset_info.json 新加配置参数如下: "alpaca_gpt4_data": { "file_name": "alpaca_gpt4_data.json" }, 样例截图: 否,执行下一步。 利用OBS Browser+工具将llm_train文件夹上传至OBS中
  • 详细步骤 购买专属资源池:具体步骤请参考创建资源池。 创建OBS桶:请参考创建OBS桶,例如桶名:standard-llama2-13b。由于ModelArts创建训练作业时,需要将系统作业日志输出至OBS桶中,因此创建OBS桶为必选项。用户可通过OBS Browser+、obsutil等工具访问和管理OBS桶,将代码、模型文件、数据集等数据上传或下载进行备份 创建E CS 服务器:方便上传镜像 弹性云服务器(Elastic Cloud Server,ECS)是由CPU、内存、操作系统、云硬盘组成的一种可随时获取、弹性可扩展的云服务器。具体过程请参考ECS文档购买一个Linux弹性云服务器。创建完成后,单击“远程登录”,可直接访问ECS服务器。 CPU架构必须选择鲲鹏计算;镜像推荐选择EulerOS;ECS服务器确保可以访问公网,用于获取镜像和构建镜像。 图1 购买ECS (可选资源)选择SFS Turbo存储则还需执行以下步骤; 创建VPC: 虚拟私有云(Virtual Private Cloud)可以为您构建隔离的、用户自主配置和管理的虚拟网络环境,操作指导请参考创建虚拟私有云和子网。 创建SFS Turbo: SFS Turbo HPC型文件系统为用户提供一个完全托管的共享文件存储。SFS Turbo文件系统支持无缝访问存储在OBS对象存储桶中的对象,用户可以指定SFS Turbo内的目录与OBS对象存储桶进行关联,然后通过创建导入导出任务实现数据同步。通过OBS与SFS Turbo存储联动,可以将最新的训练数据导入到SFS Turbo,然后在训练作业中挂载SFS Turbo到容器对应ckpt目录,实现分布式读取训练数据文件。 创建SFS Turbo文件系统前提条件: 创建SFS Turbo文件系统前,确认已有可用的VPC。 需要由 IAM 用户设置SFS Turbo FullAccess权限,用于授权ModelArts云服务使用SFS Turbo。 详细操作指导请参考创建SFS Turbo文件系统。 图2 创建SFS Turbo 其中,文件系统类型推荐选用500MB/s/TiB或1000MB/s/TiB,应用于AI大模型场景中。存储容量推荐使用 6.0~10.8TB ,以存储更多模型文件。 图3 SFS类型和容量选择 ECS服务器挂载SFS Turbo: ECS服务器中手动挂载SFS Turbo步骤如下: 用户可通过CloudShell或SSH等方式登录并访问ECS服务器,进入ECS终端界面。创建/mnt/sfs_turbo目录作为挂载目录 ,命令为:mkdir /mnt/sfs_turbo。 单击用户创建的SFS Turbo,查看基本信息图4,找到并复制挂载命令。 在ECS的终端中粘贴SFS Turbo挂载命令,完成挂载。 挂载完成后,可通过后续的步骤获取到代码和数据,并上传至/mnt/sfs_turbo路径下。 图4 SFS Turbo基本信息 ModelArts网络关联SFS Turbo OBS-SFS Turbo联动方案涉及VPC、SFS Turbo HPC型文件系统、OBS 对象存储服务 和ModelArts资源池。如果要使用训练作业挂载SFS Turbo功能,则需要配置ModelArts和SFS Turbo间网络直通,以及配置ModelArts网络关联SFS Turbo。 如果ModelArts网络关联SFS Turbo失败,则需要授权ModelArts云服务使用SFS Turbo,具体操作请参见配置ModelArts和SFS Turbo间网络直通。 图5 ModelArts网络关联SFS Turbo SFS Turbo模式下执行流程
  • 步骤三:上传代码包和权重文件 上传安装依赖软件训练代码AscendCloud-LLM-6.5.905-xxx.zip到主机中并解压,包获取路径请参见表1,解压详解如下: unzip AscendCloud-*.zip && unzip ./AscendCloud/AscendCloud-LLM-*.zip 将权重文件上传到Lite Server机器中。权重文件的格式要求为Huggingface格式。开源权重文件获取地址请参见支持的模型列表。 权重要求放在磁盘的指定目录,保证模型文件、权重文件(如LFS文件)已完整下载。 修改权重(tokenizer)文件,以下模型需修改,根据所选框架及模型修改相应文件,详情参考tokenizer文件说明。 Llama-Factory:glm4-9b模型、InternVL2_5系列模型
  • 步骤六:启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数,可以根据实际需要增加修改参数,启动容器命令如下,Snt9B环境为例: export work_dir="自定义挂载的工作目录" #容器内挂载的目录,例如/home/ma-user/ws export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称" docker run -itd \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ --e ASCEND_VISIBLE_DEVICES=0-7 \ -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 1024g \ --net=host \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ $image_name \ /bin/bash 参数说明: --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如ascendspeed。 -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:表示共享内存,用于多进程间通信。由于需要转换较大内存的模型文件,因此大小要求1024g及以上。 --cpus:宿主机的 CPU 核心数,一般Snt9B机型设置为192,Snt9B23机型设置为320。 --e ASCEND_VISIBLE_DEVICES=0-7 :设置卡号ID,一般Snt9B机型设置0-7,Snt9B23机型设置为0-15。 --memory:一般Snt9B机型设置为1024g,Snt9B23机型设置为2048g 通过容器名称进入容器中。启动容器时默认用户为ma-user用户。 docker exec -it ${container_name} bash
共100000条