华为云用户手册

  • 查看性能 训练性能主要通过训练日志中的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文件上传至可视化工具页面即可。
  • 步骤四:开启训练故障自动重启功能 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图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方式】 此小节根据实际选择训练框架不同,设置输入、输出参数不同,根据实际选择,该小节仅为使用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 设置输入、输出值样例
  • 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模式下执行流程
  • 前提条件 已开通Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 (多机运行分布式训练)已购买可挂载的存储硬盘资源,以实现多机共同访问同一存储硬盘资源,存储方案请参考配置Lite Server存储;支持在裸金属服务器中挂载的有弹性文件服务SFS和云硬盘EVS。 安装过程需要连接互联网git clone,确保容器可以访问公网。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。
  • 步骤一:检查环境 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数,用来确认对应卡数已经挂载 npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本 如出现错误,可能是机器上的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
  • 步骤三:上传代码包和权重文件 上传安装依赖软件训练代码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_DEVI CES =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
  • 网卡名称错误 当训练开始时提示网卡名称错误。或者通信超时。可以使用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 父主题: 常见错误原因和解决方法
  • 模型最小卡数配置 不同模型推荐的训练参数和计算规格要求如表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 Snt9B Snt9B23 llama3.1-8b full 4096/8192 4*Ascend lora 4*Ascend llama3.1-70b full 4096 32*Ascend lora 16*Ascend full 8192 64*Ascend lora 16*Ascend llama3.2-1b full/lora 4096/8192 1*Ascend 2*Ascend llama3.2-3b full 4096/8192 2*Ascend lora 1*Ascend 2*Ascend qwen2-0.5b full/lora 4096/8192 1*Ascend 2*Ascend qwen2-1.5b full/lora 4096/8192 1*Ascend 2*Ascend qwen2-7b full 4096 4*Ascend lora 2*Ascend full 8192 8*Ascend lora 2*Ascend qwen2-72b full 4096 32*Ascend lora 16*Ascend full 8192 64*Ascend lora 16*Ascend qwen2.5-0.5b full/lora 4096/8192 1*Ascend 2*Ascend qwen2.5-7b full 4096 2*Ascend lora 2*Ascend full 8192 2*Ascend lora 2*Ascend qwen2.5-14b full 4096 8*Ascend lora 4*Ascend full 8192 8*Ascend lora 8*Ascend qwen2.5-32b full 4096 16*Ascend lora 16*Ascend full 8192 16*Ascend lora 16*Ascend qwen2.5-72b full 4096 32*Ascend lora 16*Ascend full 8192 64*Ascend lora 16*Ascend qwen3-0.6b full/lora 4096/8192 8*Ascend qwen3-1.7b full/lora 4096/8192 8*Ascend qwen3-4b full/lora 4096/8192 8*Ascend qwen3-8b full/lora 4096/8192 8*Ascend qwen3-14b full/lora 4096/8192 8*Ascend qwen3-32b full 4096/8192 32*Ascend lora 4096 8*Ascend 8192 16*Ascend qwen3_moe-30B_A3B full 4096 16*Ascend 8192 32*Ascend lora 4096/8192 16*Ascend qwen3_moe-235B_A22B full 4096 256*Ascend lora 4096 128*Ascend glm4-9b full 4096/8192 8*Ascend lora 4096/8192 2*Ascend mixtral-8x7b full 4096/8192 16*Ascend DeepSeek-V3/R1 full 4096 512*Ascend lora 64*Ascend 1. 当mindspeed-llm上开启分布式优化器并行时,优化器参数会在集群所有机器上切分共享,因此最优配置会和卡数相关; 2. 当前benchmark是综合考虑了最小可运行卡数和最优性能平衡情况下测试出的配置,实际情况中可以根据集群规模大小和性能取舍进行参数调整; 父主题: 训练脚本说明参考
  • 支持数据简介 MindSpeed-LLM框架常用数据集格式: alpaca格式 sharegpt格式 moss格式 本教程使用到的训练数据集样例是Alpaca数据集。您也可以自行准备数据集。 Alpaca数据集下载链接如下: 预训练(MindSpeed-LLM):train-00000-of-00001-a09b74b3ef9c3b56.parquet,数据大小:24M左右。 微调:alpaca_gpt4_data.json,数据大小:43.6 MB。
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量(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收敛情况,如图2所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在最后一个节点上。 图2 Loss收敛情况(示意图)
  • 步骤四:根据config.yaml启动作业 启动作业命令如下。首先会根据config.yaml创建pod,继而在pod容器内自动启动训练作业。 kubectl apply -f config.yaml 启动后,可通过以下命令获取所有已创建的pod信息。若pod已全部启动,则状态为:Running。 kubectl get pod -A -o wide 若查看启动作业日志信息,可通过以下命令打印正在启动的日志信息。其中${pod_name}为上述pod信息中的NAME,例如vcjob-main-0。 kubectl logs -f ${pod_name}
  • 步骤二:获取训练镜像 建议使用官方提供的镜像部署训练服务。镜像地址{image_url}参见镜像版本说明获取。 containerd 容器引擎有命名空间的概念。Kubernetes 下使用的 containerd 默认命名空间是 k8s.io。所以在导入镜像时需要指定命令空间为 k8s.io,否则使用 crictl images 无法查询到。以下命令可选其一进行镜像拉取: 使用 containerd 自带的工具 ctr 进行镜像拉取。 ctr -n k8s.io pull {image_url} 使用nerdctl工具拉取镜像。 nerdctl --namespace k8s.io pull {image_url} 集群有多个节点,要确保每个节点都拥有镜像。 镜像获取完成后可通过如下其中一个命令进行查看: # ctr 工具查看 ctr -n k8s.io image list # 或 crictl image # nerdctl 工具查看 nerdctl --namespace k8s.io image list
  • 步骤六:编写Config.yaml文件 首先给出单个节点训练的config.yaml文件模板,用于配置pod。而在训练中,需要按照参数说明修改${}中的参数值。该模板使用SFS Turbo挂载方案。 apiVersion: v1 kind: ConfigMap metadata: name: configmap1980-vcjob # 前缀使用“configmap1980-”不变,后接vcjob的名字 namespace: default # 命名空间自选,需要和下边的vcjob处在同一命名空间 labels: ring-controller.cce: ascend-1980 # 保持不动 data: # data内容保持不动,初始化完成,会被volcano插件自动修改 jobstart_hccl.json: | { "status":"initializing" } --- apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: vcjob # job名字,需要和configmap中名字保持联系 namespace: default # 和configmap保持一致 labels: ring-controller.cce: ascend-1980 # 保持不动 fault-scheduling: "force" spec: minAvailable: 1 schedulerName: volcano # 保持不动 policies: - event: PodEvicted action: RestartJob plugins: configmap1980: - --rank-table-version=v2 # 保持不动,生成v2版本ranktablefile env: [] svc: - --publish-not-ready-addresses=true maxRetry: 5 queue: default tasks: - name: main replicas: 1 template: metadata: name: training labels: app: ascendspeed ring-controller.cce: ascend-1980 # 保持不动 spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: volcano.sh/job-name operator: In values: - vcjob topologyKey: kubernetes.io/hostname hostNetwork: true # 采用宿主机网络模式 containers: - image: ${image_name} # 镜像地址 imagePullPolicy: IfNotPresent # IfNotPresent:默认值,镜像在宿主机上不存在时才拉取;Always:每次创建Pod都会重新拉取一次镜像;Never:Pod永远不会主动拉取这个镜像 name: ${container_name} # 容器名称 securityContext: allowPrivilegeEscalation: false runAsUser: 0 # 容器内权限设置,[0:root,1000:ma-user] env: - name: name valueFrom: fieldRef: fieldPath: metadata.name - name: ip valueFrom: fieldRef: fieldPath: status.hostIP - name: framework value: "PyTorch" command: ["/bin/sh", "-c"] args: - ${command} resources: requests: huawei.com/ascend-1980: "8" # 需求卡数,key保持不变. memory: ${requests_memory} # 容器请求的最小内存 cpu: ${requests_cpu} # 容器请求的最小 CPU limits: huawei.com/ascend-1980: "8" # 限制卡数,key保持不变 memory: ${limits_memory} # 容器可使用的最大内存 cpu: ${limits_cpu} # 容器可使用的最大 CPU volumeMounts: # 容器内部映射路径 - name: shared-memory-volume mountPath: /dev/shm - name: ascend-driver # 驱动挂载,保持不动 mountPath: /usr/local/Ascend/driver - name: ascend-add-ons # 驱动挂载,保持不动 mountPath: /usr/local/Ascend/add-ons - name: localtime mountPath: /etc/localtime - name: hccn # 驱动hccn配置,保持不动 mountPath: /etc/hccn.conf - name: npu-smi # npu-smi mountPath: /usr/local/sbin/npu-smi - name: ascend-install mountPath: /etc/ascend_install.info - name: log mountPath: /var/log/npu/ - name: sfs-volume mountPath: /mnt/sfs_turbo nodeSelector: accelerator/huawei-npu: ascend-1980 volumes: # 物理机外部路径 - name: shared-memory-volume # 共享内存 emptyDir: medium: Memory sizeLimit: "200Gi" - name: ascend-driver hostPath: path: /usr/local/Ascend/driver - name: ascend-add-ons hostPath: path: /usr/local/Ascend/add-ons - name: localtime hostPath: path: /etc/localtime - name: hccn hostPath: path: /etc/hccn.conf - name: npu-smi hostPath: path: /usr/local/sbin/npu-smi - name: ascend-install hostPath: path: /etc/ascend_install.info - name: log hostPath: path: /usr/slog - name: sfs-volume persistentVolumeClaim: claimName: ${pvc_name} #已创建的PVC名称 restartPolicy: OnFailure 双节点或多节点训练的config.yaml文件模板,用于实现双机分布式训练,与单节点yaml模板相比task区块中新加一个或多个name小区块内容,样例截图如下: 双节点config.yaml文件模板如下: apiVersion: v1 kind: ConfigMap metadata: name: configmap1980-vcjob # 前缀使用“configmap1980-”不变,后接vcjob的名字 namespace: default # 命名空间自选,需要和下边的vcjob处在同一命名空间 labels: ring-controller.cce: ascend-1980 # 保持不动 data: #data内容保持不动,初始化完成,会被volcano插件自动修改 jobstart_hccl.json: | { "status":"initializing" } --- apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: vcjob # job名字,需要和configmap中名字保持联系 namespace: default # 和configmap保持一致 labels: ring-controller.cce: ascend-1980 # 保持不动 fault-scheduling: "force" spec: minAvailable: 1 schedulerName: volcano # 保持不动 policies: - event: PodEvicted action: RestartJob plugins: configmap1980: - --rank-table-version=v2 # 保持不动,生成v2版本ranktablefile env: [] svc: - --publish-not-ready-addresses=true maxRetry: 5 queue: default tasks: - name: main replicas: 1 template: metadata: name: training labels: app: ascendspeed ring-controller.cce: ascend-1980 # 保持不动 spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: volcano.sh/job-name operator: In values: - vcjob topologyKey: kubernetes.io/hostname hostNetwork: true # 采用宿主机网络模式 containers: - image: ${image_name} # 镜像地址 imagePullPolicy: IfNotPresent # IfNotPresent:默认值,镜像在宿主机上不存在时才拉取;Always:每次创建Pod都会重新拉取一次镜像;Never:Pod永远不会主动拉取这个镜像 name: ${container_name} securityContext: # 容器内 root 权限 allowPrivilegeEscalation: false runAsUser: 0 env: - name: name valueFrom: fieldRef: fieldPath: metadata.name - name: ip valueFrom: fieldRef: fieldPath: status.hostIP - name: framework value: "PyTorch" command: ["/bin/sh", "-c"] args: - ${command} resources: requests: huawei.com/ascend-1980: "8" # 需求卡数,key保持不变. memory: ${requests_memory} # 容器请求的最小内存 cpu: ${requests_cpu} # 容器请求的最小 CPU limits: huawei.com/ascend-1980: "8" # 限制卡数,key保持不变。 memory: ${limits_memory} # 容器可使用的最大内存 cpu: ${limits_cpu} # 容器可使用的最大 CPU volumeMounts: # 容器内部映射路径 - name: shared-memory-volume mountPath: /dev/shm - name: ascend-driver # 驱动挂载,保持不动 mountPath: /usr/local/Ascend/driver - name: ascend-add-ons # 驱动挂载,保持不动 mountPath: /usr/local/Ascend/add-ons - name: localtime mountPath: /etc/localtime - name: hccn # 驱动hccn配置,保持不动 mountPath: /etc/hccn.conf - name: npu-smi # npu-smi mountPath: /usr/local/sbin/npu-smi - name: ascend-install mountPath: /etc/ascend_install.info - name: log mountPath: /var/log/npu/ - name: sfs-volume mountPath: /mnt/sfs_turbo nodeSelector: accelerator/huawei-npu: ascend-1980 volumes: # 物理机外部路径 - name: shared-memory-volume # 共享内存 emptyDir: medium: Memory sizeLimit: "200Gi" - name: ascend-driver hostPath: path: /usr/local/Ascend/driver - name: ascend-add-ons hostPath: path: /usr/local/Ascend/add-ons - name: localtime hostPath: path: /etc/localtime - name: hccn hostPath: path: /etc/hccn.conf - name: npu-smi hostPath: path: /usr/local/sbin/npu-smi - name: ascend-install hostPath: path: /etc/ascend_install.info - name: log hostPath: path: /usr/slog - name: sfs-volume persistentVolumeClaim: claimName: ${pvc_name} #已创建的PVC名称 restartPolicy: OnFailure - name: work replicas: 1 template: metadata: name: training labels: app: ascendspeed ring-controller.cce: ascend-1980 # 保持不动 spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: volcano.sh/job-name operator: In values: - vcjob topologyKey: kubernetes.io/hostname hostNetwork: true # 采用宿主机网络模式 containers: - image: ${image_name} # 镜像地址 imagePullPolicy: IfNotPresent # IfNotPresent:默认值,镜像在宿主机上不存在时才拉取;Always:每次创建Pod都会重新拉取一次镜像;Never:Pod永远不会主动拉取这个镜像 name: ${container_name} securityContext: # 容器内 root 权限 allowPrivilegeEscalation: false runAsUser: 0 env: - name: name valueFrom: fieldRef: fieldPath: metadata.name - name: ip valueFrom: fieldRef: fieldPath: status.hostIP - name: framework value: "PyTorch" command: ["/bin/sh", "-c"] args: - ${command} resources: requests: huawei.com/ascend-1980: "8" # 需求卡数,key保持不变. memory: ${requests_memory} # 容器请求的最小内存 cpu: ${requests_cpu} # 容器请求的最小 CPU limits: huawei.com/ascend-1980: "8" # 限制卡数,key保持不变。 memory: ${limits_memory} # 容器可使用的最大内存 cpu: ${limits_cpu} # 容器可使用的最大 CPU volumeMounts: # 容器内部映射路径 - name: shared-memory-volume mountPath: /dev/shm - name: ascend-driver # 驱动挂载,保持不动 mountPath: /usr/local/Ascend/driver - name: ascend-add-ons # 驱动挂载,保持不动 mountPath: /usr/local/Ascend/add-ons - name: localtime mountPath: /etc/localtime - name: hccn # 驱动hccn配置,保持不动 mountPath: /etc/hccn.conf - name: npu-smi # npu-smi mountPath: /usr/local/sbin/npu-smi - name: ascend-install mountPath: /etc/ascend_install.info - name: log mountPath: /var/log/npu/ - name: sfs-volume mountPath: /mnt/sfs_turbo nodeSelector: accelerator/huawei-npu: ascend-1980 volumes: # 物理机外部路径 - name: shared-memory-volume # 共享内存 emptyDir: medium: Memory sizeLimit: "200Gi" - name: ascend-driver hostPath: path: /usr/local/Ascend/driver - name: ascend-add-ons hostPath: path: /usr/local/Ascend/add-ons - name: localtime hostPath: path: /etc/localtime - name: hccn hostPath: path: /etc/hccn.conf - name: npu-smi hostPath: path: /usr/local/sbin/npu-smi - name: ascend-install hostPath: path: /etc/ascend_install.info - name: log hostPath: path: /usr/slog - name: sfs-volume persistentVolumeClaim: claimName: ${pvc_name} #已创建的PVC名称 restartPolicy: OnFailure 参数说明: ${container_name} 容器名称,此处可以自己定义一个容器名称,例如ascendspeed。 ${image_name} 为步骤五:修改并上传镜像中,上传至SWR上的镜像链接。 ${command} 使用config.yaml文件创建pod后,在容器内自动运行的命令。在进行训练任务中会给出替换命令。 /mnt/sfs_turbo 为宿主机中默认挂载SFS Turbo的工作目录,目录下存放着训练所需代码、数据等文件。 同样,/mnt/sfs_turbo 也可以映射至容器中,作为容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。为方便访问两个地址可以相同。 ${pvc_name} 为在CCE集群关联SFS Turbo步骤中创建的PVC名称。 在设置容器中需要的CPU与内存大小时,可通过运行以下命令查看申请的节点机器中具体的CPU与内存信息。 kubectl describe node ${requests_cpu} 指在容器中请求的最小CPU核心数量,可使用Requests中的值,例如2650m。 ${requests_memory} 指在容器中请求的最小内存空间大小,可使用Requests中的值,例如3200Mi。 ${limits_cpu} 指在容器中可使用的最大CPU核心数量,例如192。 ${limits_memory} 指在容器中可使用的最大内存空间大小,例如换算成1500Gi。
  • 上传数据到指定目录 教程使用到的训练数据集是Alpaca数据集,您也可以自行准备数据集;数据可参考数据说明,数据集准备具体步骤如下: 进入到/mnt/sfs_turbo/目录下。 创建目录“training_data”,并将原始数据放置在此处。 mkdir training_data 数据存放参考目录结构如下: ${workdir} |── training_data |── train-00000-of-00001-a09b74b3ef9c3b56.parquet # 训练原始数据集 |── alpaca_gpt4_data.json # 微调数据文件
  • 上传代码和权重文件到工作环境 使用root用户以SSH的方式登录Lite Server。 将AscendCloud代码包AscendCloud-xxx-xxx.zip上传到${workdir}目录下并解压缩,如SFS Turbo的路径:/mnt/sfs_turbo目录下,以下都以/mnt/sfs_turbo为例,请根据实际修改。 unzip AscendCloud-*.zip unzip AscendCloud-LLM-*.zip 上传tokenizers文件,如Qwen2-7B权重到工作目录中的/mnt/sfs_turbo/model/Qwen2-7B目录下。具体步骤如下: 进入到${workdir}目录下,如:/mnt/sfs_turbo,创建tokenizers文件目录将权重和词表文件放置此处,以Llama2-70B为例。 cd /mnt/sfs_turbo mkdir -p models/Qwen2-7B
  • CCE集群关联SFS Turbo 进入已购买创建的CCE集群,选择存储,随后单击“创建存储卷声明PVC”。 选择“极速文件存储”,随后输入PVC名称。 选择“新建存储卷PV”,并单击“选择极速文件存储”。 进入选择页面,选择已经创建好的SFS Turbo,最后输入PV名称。 接下来需要通过访问集群节点,挂载SFS Turbo。 可通过ssh登录CCE集群中的某个节点(ssh使用的是eip地址)。 创建/mnt/sfs_turbo目录作为挂载目录 ,命令为:mkdir /mnt/sfs_turbo SFS Turbo存储手动挂载到安装节点中,挂载命令如下截图: 挂载完成后,可通过以下步骤获取到代码和数据,并上传至/mnt/sfs_turbo路径下。
  • 创建SFS Turbo SFS Turbo HPC型文件系统为用户提供一个完全托管的共享文件存储。SFS Turbo文件系统支持无缝访问存储在OBS对象存储桶中的对象,用户可以指定SFS Turbo内的目录与OBS对象存储桶进行关联,然后通过创建导入导出任务实现数据同步。通过OBS与SFS Turbo存储联动,可以将最新的训练数据导入到SFS Turbo,然后在训练作业中挂载SFS Turbo到容器对应ckpt目录,实现分布式读取训练数据文件。 创建SFS Turbo文件系统前提条件: 创建SFS Turbo文件系统前,确认已有可用的VPC。 图4 创建SFS Turbo 需要由IAM用户设置SFS Turbo FullAccess权限,用于授权ModelArts云服务使用SFS Turbo。 详细操作指导请参考创建SFS Turbo文件系统。 其中,文件系统类型推荐选用500MB/s/TiB或1000MB/s/TiB,应用于AI大模型场景中。存储容量推荐使用 6.0~10.8TB ,以存储更多模型文件。 图5 SFS类型和容量选择
  • kubectl访问集群配置 本步骤需要在节点机器,对kubectl进行集群访问配置。 首先进入已创建的 CCE 集群控制版面中。根据图1的步骤进行操作,单击kubectl配置时,会弹出图2步骤页面。 图1 配置中心 根据图2,按步骤进行:判断是否安装 kubectl、下载kubectl配置文件、在机器中安装和配置kubectl。 图2 kubectl 访问集群配置 在节点机器中,输入命令,查看Kubernetes集群信息。若显示如图图3的内容,则配置成功。 kubectl cluster-info 图3 查看 Kubernetes 集群信息正确弹出内容
  • 镜像版本说明 本教程中用到的训练基础镜像地址和配套版本关系如下表所示,请提前了解。 表2 基础容器镜像地址 镜像用途 镜像地址 基础镜像 Snt9B swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.1.rc1-py_3.10-hce_2.0.2503-aarch64-snt9b-20250514161205-a9c5055 基础镜像 Snt9B23 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.1.rc1-py_3.10-hce_2.0.2503-aarch64-snt9b23-20250514161205-a9c5055 表3 模型镜像版本 机型 模型 版本 Snt9B CANN cann_8.1.rc1 驱动 24.1.0.6 PyTorch 2.5.1 Snt9B23 CANN 8.1.RC1 驱动 24.1.RC3.5 PyTorch 2.5.1
  • 软件包结构说明 本方案需要使用到的软件配套版本和依赖包获取地址如下表所示。 表1 模型对应的软件包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.5.905-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 本方案需要使用到的AscendCloud-6.5.905中的AscendCloud-LLM-xxx.zip软件包。 获取路径:Support-E,在此路径中查找下载ModelArts 6.5.905 版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 AscendCloud-LLM代码包关键训练文件介绍如下: |——AscendCloud-LLM |──llm_train # 模型训练代码包 |──AscendFactory |──examples/ # config配置文件目录 |──config/modellink_performance_cfgs.yaml #mindspeed-llm参数文件 |──data.tgz # 样例数据压缩包 |──third-party/ # patch包 |──src/acs_train_solution/ # 训练运行包 |──intall.sh # 需要的依赖包 |──scripts_llamafactory/ # llamafactory兼容旧版本启动方式目录 |──scripts_modellink/ # mindspeed-llm兼容旧版本启动方式目录 |──Dockerfile |──dependences.yaml # 开源社区代码版本yaml文件
  • 训练支持的模型列表 本方案支持以下模型的训练,如表1所示。 表1 支持的模型列表 序号 支持模型 支持模型参数量 权重文件获取地址 1 Qwen2 qwen2-0.5b https://huggingface.co/Qwen/Qwen2-0.5B-Instruct 2 qwen2-1.5b https://huggingface.co/Qwen/Qwen2-1.5B-Instruct 3 qwen2-7b https://huggingface.co/Qwen/Qwen2-7B-Instruct 4 qwen2-72b https://huggingface.co/Qwen/Qwen2-72B-Instruct 5 GLMv4 glm4-9b https://huggingface.co/THUDM/glm-4-9b-chat 6 mixtral mixtral-8x7b https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1 7 llama3.1 llama3.1-8b https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct 8 llama3.1-70b https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct 9 Qwen2.5 qwen2.5-0.5b https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct 10 qwen2.5-7b https://huggingface.co/Qwen/Qwen2.5-7B-Instruct 11 qwen2.5-14b https://huggingface.co/Qwen/Qwen2.5-14B-Instruct 12 qwen2.5-32b https://huggingface.co/Qwen/Qwen2.5-32B-Instruct 13 qwen2.5-72b https://huggingface.co/Qwen/Qwen2.5-72B-Instruct 14 Qwen3 qwen3-0.6b https://huggingface.co/Qwen/Qwen3-0.6B 15 qwen3-1.7b https://huggingface.co/Qwen/Qwen3-1.7B 16 qwen3-4b https://huggingface.co/Qwen/Qwen3-4B 17 qwen3-8b https://huggingface.co/Qwen/Qwen3-8B 18 qwen3-14b https://huggingface.co/Qwen/Qwen3-14B 19 qwen3-32b https://huggingface.co/Qwen/Qwen3-32B 20 Qwen3_MOE qwen3_moe-30B_A3B https://huggingface.co/Qwen/Qwen3-30B-A3B 21 qwen3_moe-235B_A22B https://huggingface.co/Qwen/Qwen3-235B-A22B 22 llama3.2 llama3.2-1b https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct 23 llama3.2-3b https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct 24 DeepSeek DeepSeek-V3 https://huggingface.co/deepseek-ai/DeepSeek-V3-Base/tree/main 25 DeepSeek-R1 https://huggingface.co/deepseek-ai/DeepSeek-R1/tree/main
  • 下线模型 以下模型已不再跟随版本演进维护,如训练以下模型可参考6.5.901版本训练文档: Llama2/3:llama2-7b/13b/70b、llama3-8b/70b Qwen/Qwen1.5:qwen-7b/14b/72b、qwen1.5-7b/14b/32b/72b Yi:yi-6b、yi-32b BaiChuan2:baichuan2-7b、baichuan2-13b mistral-7b、glm3-6b
  • 操作流程 流程图 图1 训练流程图 表1 操作任务流程说明 阶段 任务 说明 准备工作 准备环境 本教程案例是基于ModelArts Lite k8s Cluster运行的,需要购买并开通k8s Cluster资源。 准备代码、权重、数据 准备AscendFactory训练代码、分词器Tokenizer和推理代、训练数据,可以用本案使用的数据集,也可以使用自己准备的数据集。 准备镜像 准备训练模型适用的容器镜像。 执行训练任务(预训练/微调) 执行训练任务 介绍如何进行预训练,包括训练数据处理、超参配置、创建训练任务及性能查看。 查看训练结果 训练结果输出 查看训练后的日志,训练的性能结果。
  • 软件包结构说明 本方案需要使用到的软件配套版本和依赖包获取地址如下表所示。 表1 软件包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.5.905-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 本方案使用AscendCloud-6.5.905中的AscendCloud-LLM-xxx.zip软件包用于训练。 获取路径:Support-E,在此路径中查找下载ModelArts 6.5.905 版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 AscendCloud-LLM代码包关键训练文件介绍如下: |——AscendCloud-LLM |──llm_train # 模型训练代码包 |──AscendFactory |──examples/ # config配置文件目录 |──data.tgz # 样例数据压缩包 |──third-party/ # patch包 |──src/acs_train_solution/ # 训练运行包 |──intall.sh # 需要的依赖包 |──Dockerfile |──scripts_insatll # 各个框架的安装脚本包 |──dependences.yaml # 开源社区代码版本yaml文件
  • 镜像版本说明 本教程中用到的训练基础镜像地址和配套版本关系如下表所示,请提前了解。 表2 基础容器镜像地址 镜像用途 镜像地址 基础镜像Snt9B swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.1.rc1-py_3.10-hce_2.0.2503-aarch64-snt9b-20250514161205-a9c5055 基础镜像Snt9B23 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.1.rc1-py_3.10-hce_2.0.2503-aarch64-snt9b23-20250514161205-a9c5055 表3 模型镜像版本 机型 模型 版本 Snt9B CANN cann_8.1.rc1 驱动 24.1.0.6 PyTorch 2.5.1 Snt9B23 CANN 8.1.RC1 驱动 24.1.RC3.5 PyTorch 2.5.1
  • 下线模型 以下模型不再跟随版本演进,如训练以下模型可参考6.5.901版本训练文档。 Llama2/3:llama2-7b/13b/70b、llama3-8b/70b Qwen/Qwen1.5:qwen-7b/14b/72b、qwen1.5-7b/14b/32b/72b Yi:yi-6b、yi-32b BaiChuan2:baichuan2-7b、baichuan2-13b mistral-7b、falcon-11B、MiniCPM-2B、MiniCPM3-4B、glm3-6b
共100000条