华为云用户手册

  • 问题3:训练过程报错:ImportError: XXX not found in your environment: flash_attn 根因:昇腾环境暂时不支持flash_attn接口 规避措施:修改dynamic_module_utils.py文件,将180-184行代码注释掉 vim /home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.9/site-packages/transformers/dynamic_module_utils.py
  • 问题4:Error waiting on exit barrier错误 错误截图: 报错原因:多线程退出各个节点间超时时间默认为300s,时间设置过短。 解决措施: 修改容器内torch/distributed/elastic/agent/server/api.py文件参数: vim /home/ma-user/anaconda3/envs/PyTorch-2.2.0/lib/python3.10/site-packages/torch/distributed/elastic/agent/server/api.py 修改def _exit_barrier(self)方法中的barrier_timeout参数,修改后如图1所示。 #修改前 barrier_timeout=self._exit_barrier_timeout #修改后 barrier_timeout=3000 图1 修改后的barrier_timeout参数
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.911中的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 # 推理工具
  • 获取模型软件包和权重文件 本方案支持的模型对应的软件和依赖包获取地址如表1所示,模型列表、对应的开源权重获取地址如表1所示。 表1 模型对应的软件包和依赖包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.3.911-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E,在此路径中查找下载ModelArts 6.3.911 版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 工作目录介绍 详细的工作目录参考如下,建议参考以下要求设置工作目录。训练脚本以分类的方式集中在 scripts 文件夹中。 ${workdir}(例如使用SFS Turbo的路径:/mnt/sfs_turbo/) |──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 #微调数据文件
  • 上传代码和权重文件到工作环境 使用root用户以SSH的方式登录服务器。 将AscendCloud代码包AscendCloud-xxx-xxx.zip上传到${workdir}目录下并解压缩,如SFS Turbo的路径:/mnt/sfs_turbo目录下,以下都以/mnt/sfs_turbo为例,请根据实际修改。 unzip AscendCloud-*.zip 上传tokenizers文件到工作目录中的/mnt/sfs_turbo/tokenizers/Llama2-{MODEL_TYPE}目录,如Llama2-70B。 具体步骤如下: 进入到${workdir}目录下,如:/mnt/sfs_turbo,创建tokenizers文件目录将权重和词表文件放置此处,以Llama2-70B为例。 cd /mnt/sfs_turbo mkdir -p tokenizers/Llama2-70B
  • 模型软件包结构说明 AscendCloud-6.3.909代码包中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 # 推理工具
  • 代码上传至SFS Turbo 将AscendSpeed代码包AscendCloud-LLM-xxx.zip直接上传至E CS 服务器中的SFS Turbo中,例如存放在/mnt/sfs_turbo/AscendCloud-LLM-xxx.zip目录下并解压缩。 unzip AscendCloud-*.zip 结合准备数据、准备权重、准备代码,将数据集、原始权重、代码文件都上传至SFS Turbo后,目录结构如下。 /mnt/sfs_turbo/ |──llm_train # 解压代码包后自动生成的代码目录,无需用户创建 |── AscendSpeed # 代码目录 |──ascendcloud_patch/ # 针对昇腾云平台适配的功能代码包 |──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 # 预训练输出权重 # 以下目录结构,用户自己创建 |── training_data #原始数据目录,需要用户手动创建并上传,后续操作步骤中会提示 ├── train-00000-of-00001-a09b74b3ef9c3b56.parquet #预训练时预处理后的数据存放地址 ├── alpaca_gpt4_data.json #微调数据文件 |── tokenizers #tokenizer目录,需要用户手动创建,后续操作步骤中会提示 |── llama2-13b-hf |── models #原始权重与tokenizer目录,需要用户手动创建,后续操作步骤中会提示 |── llama2-13b-hf
  • 获取模型软件包 本方案支持的模型对应的软件和依赖包获取地址如表1所示。 表1 模型对应的软件包和依赖包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.3.909-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • Step4 下载模型和数据集 数据集下载地址:https://huggingface.co/datasets/lambdalabs/pokemon-blip-captions。 启动脚本前的两个声明为本次训练的模型和数据集,第一次执行程序时若本地没有模型和数据集,会自动下载。但由于lambdalabs/pokemon-blip-captions数据集下载现在需要登录HuggingFace账号,请先下载数据集到本地,再挂载到对应目录。 export MODEL_NAME="runwayml/stable-diffusion-v1-5" export DATASET_NAME="lambdalabs/pokemon-blip-captions"
  • Step2 启动镜像 获取基础镜像。建议使用官方提供的镜像。镜像地址{image_url}参考表2。 docker pull {image_url} 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。 export work_dir="自定义挂载的工作目录" 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 /etc/ascend_install.info:/etc/ascend_install.info \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --shm-size 32g \ --net=bridge \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} bash 参数说明: work_dir:工作目录,目录下存放着训练所需代码、数据等文件。 container_work_dir:容器工作目录,一般同work_dir。 container_name:自定义容器名。 image_name:容器镜像的名称。 进入容器。需要将${container_name}替换为实际的容器名称。 docker exec -it ${container_name} bash
  • Step3 获取SD1.5插件代码包并安装依赖 将下载的SD1.5插件代码包ascendcloud-aigc-xxx-xxx.tar.gz文件,上传到容器的/home/ma-user/目录下,解压并安装相关依赖。插件代码包获取路径参见表2。 mkdir -p /home/ma-user/stable_diffusers_1.5 #创建stable_diffusers_1.5目录 cd /home/ma-user/stable_diffusers_1.5 #进入stable_diffusers_1.5目录 tar -zxvf ascendcloud-aigc-*.tar.gz tar -zxvf ascendcloud-aigc-poc-stable_diffusers_1.5.tar.gz rm -rf ascendcloud-aigc-xxx-xxx pip install -r requirements.txt #安装依赖 启动前配置。有两种方式修改配置文件: 方式一:可以参考解压出来的default_config.yaml或者deepspeed_default_config.yaml文件,再通过在启动脚本命令中增加--config_file=xxx.yaml参数来指定其为配置文件。 方式二:通过命令accelerate config进行配置,如下图所示。 图1 通过命令accelerate config进行配置 (可选)文件替换。 因增加nfa和使用npu_geglu算子(用于训练和推理加速),将diffusers源码包中的attention.py和attention_processor.py替换成代码包中对应的文件。 图2 文件替换 可以使用find命令来查找diffusers源码包位置。 find / -name attention.py find / -name attention_processor.py 图3 查找diffusers源码包位置 找到具体位置后可以cp替换,替换前可对diffusers原始文件做备份,如果没有备份则可以通过删除diffusers包重新安装的方式获取原始文件。 执行bash stable_diffusers_train.sh。 bash stable_diffusers_train.sh
  • Step5 启动训练服务 train_text_to_image_0304.py是训练的核心代码,通过stable_diffusers_train.sh来启动。 sh stable_diffusers_train.sh 如果启动前配置采用的是•可以参考解压出来的default_config...方式指定配置文件,就是在此stable_diffusers_train.sh脚本中增加--config_file=xxx.yaml参数。 刚开始会报一些Warning,可忽略。正常启动如下图所示,出现Steps: 1%字样。 图4 启动服务 如果启动过程中报SSL相关错误,如下图所示。 图5 启动过程中报SSL相关错误 请修改相应路径下的/home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.9/site-packages/requests/sessions.py文件,将self.verify的值由True改成False,如下图所示。 图6 修改self.verify参数值
  • Step1 检查环境 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 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
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 ascendcloud-aigc-6.3.904-xxx.tar.gz 文件名中的xxx表示具体的时间戳,以包的实际时间为准。 获取路径:Support-E网站。 说明: 如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc1-py_3.9-hce_2.0.2312-aarch64-snt9b-20240516142953-ca51f42 SWR上拉取
  • 使用SmoothQuant量化 SmoothQuant(W8A8)量化方案能降低模型显存以及需要部署的卡数。也能同时降低首token时延和增量推理时延。支持SmoothQuant(W8A8)量化的模型列表请参见支持的模型列表和权重文件。 本章节介绍如何使用SmoothQuant量化工具实现推理量化。 SmoothQuant量化工具使用到的脚本存放在代码包AscendCloud-LLM-x.x.x.zip的llm_tools目录下。 代码目录如下: AutoSmoothQuant #量化工具 ├── ascend_autosmoothquant_adapter # 昇腾量化使用的算子模块 ├── autosmoothquant # 量化代码 ├── build.sh # 安装量化模块的脚本 ... 具体操作如下: 参考Step1 环境准备创建pod准备量化环境。 执行如下命令进入容器,并进入AutoSmoothQuant目录下 kubectl exec -it {pod_name} bash cd /home/ma-user/AscendCloud/AscendCloud-LLM/llm_tools/AutoSmoothQuant/autosmoothquant/examples 配置需要使用的NPU卡,例如:实际使用的是第1张和第2张卡,此处填写为“0,1”,以此类推。 export ASCEND_RT_VISIBLE_DEVI CES =0,1 通过命令npu-smi info查询NPU卡为容器中的第几张卡。例如下图查询出两张卡,如果希望使用第一和第二张卡,则“export ASCEND_RT_VISIBLE_DEVICES=0,1”,注意编号不是填4、5。 图1 查询结果 执行权重转换。 cd autosmoothquant/examples/ python smoothquant_model.py --model-path /home/ma-user/llama-2-7b/ --quantize-model --generate-scale --dataset-path /data/nfs/user/val.jsonl --scale-output scales/llama2-7b.pt --model-output quantized_model/llama2-7b --per-token --per-channel 参数说明: --model-path:原始模型权重路径。 --quantize-model:体现此参数表示会生成量化模型权重。不需要生成量化模型权重时,不体现此参数 --generate-scale:体现此参数表示会生成量化系数,生成后的系数保存在--scale-output参数指定的路径下。如果有指定的量化系数,则不需此参数,直接读取--scale-input参数指定的量化系数输入路径即可。 --dataset-path:数据集路径,推荐使用:https://huggingface.co/datasets/mit-han-lab/pile-val-backup/resolve/main/val.jsonl.zst。 --scale-output:量化系数保存路径。 --scale-input:量化系数输入路径,如果之前已生成过量化系数,则可指定该参数,跳过生成scale的过程。 --model-output:量化模型权重保存路径。 --smooth-strength:平滑系数,推荐先指定为0.5,后续可以根据推理效果进行调整。 --per-token:激活值量化方法,如果指定则为per-token粒度量化,否则为per-tensor粒度量化。 --per-channel:权重量化方法,如果指定则为per-channel粒度量化,否则为per-tensor粒度量化。 启动smoothQuant量化服务。 参考部署推理服务,使用量化后权重部署AWQ量化服务。 注:Step3 创建服务启动脚本启动脚本中,服务启动命令需添加如下命令。 -q smoothquant 或者 --quantization smoothquant --dtype=float16 父主题: 推理模型量化
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.912中的AscendCloud-LLM-xxx.zip软件包和算子包AscendCloud-OPP,AscendCloud-LLM关键文件介绍如下。 |——AscendCloud-LLM |──llm_train # 模型训练代码包 |──AscendFactory |──examples/ # config配置文件目录 |──data.tgz # 样例数据压缩包 |──third-party/ # patch包 |──src/acs_train_solution/ # 训练运行包 |──intall.sh # 需要的依赖包 |──scripts_llamafactory/ # llamafactory兼容旧版本启动方式目录 |──scripts_modellink/ # modelLink兼容旧版本启动方式目录 |──Dockerfile
  • 工作目录介绍 详细的工作目录参考如下,根据实际要求设置。 ${workdir}(例如/home/ma-user/ws) |──llm_train # 模型训练代码包 |──AscendFactory |──examples/ # config配置文件目录 |──config/ # 配置文件 |──deepspeed/ # deepspeed配置json文件 |──performance_cfgs.yaml # 微调性能配置json文件 |──llama_factory_performance_cfgs_VL.yaml # qwen2vl微调json文件 |──accuracy_cfgs.yaml # 训练精度配置json文件 |──....... |──data.tgz # 样例数据压缩包 |──intall.sh # 需要的依赖包 |──scripts_llamafactory/ # 兼容旧版本启动方式目录 |──tools/ # 针对昇腾云平台适配的功能补丁包 |──demo.yaml # 样例yaml配置文件 |──demo.sh # 训练启动shell脚本 |──merge_lora_cli.sh # lora权重合并脚本 |──third-party/ # patch包 |──src/acs_train_solution/ # 训练运行包 |──ascendcloud_patch/ # patch补丁包 |──benchmark/ #工具包,存放数据集及基线数据 |──trainer.py # 训练启动脚本 |──performance.py # 训练性能比较启动脚本 |──accuracy.py # 训练精度启动脚本 |──model/Qwen2-7B/ # 权重词表文件目录,如Qwen2-7B |──saves/qwen2-7b/sft_lora/ # 训练完成生成目录Qwen2-7B,自动生成
  • 获取模型软件包和权重文件 本方案支持的模型对应的软件和依赖包获取地址如表1所示,模型列表、对应的开源权重获取地址如表1所示。 表1 模型对应的软件包和依赖包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.3.912-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见模型软件包结构说明。 AscendFactory是用于模型并行计算的框架,其中包含了许多模型的输入处理方法。 获取路径:Support-E,在此路径中查找下载ModelArts 6.3.912 版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 上传代码和权重文件到工作环境 使用root用户以SSH的方式登录Server。 将AscendCloud代码包AscendCloud-xxx-xxx.zip上传到${workdir}目录下并解压缩,如:/home/ma-user/ws目录下,以下都以/home/ma-user/ws为例,请根据实际修改。 unzip AscendCloud-*.zip unzip AscendCloud-LLM-*.zip 上传tokenizers文件到工作目录中的/home/ma-user/ws/model/{Model_Name}目录,用户根据自己实际规划路径修改;如Qwen2-72B。 具体步骤如下: 进入到${workdir}目录下,如:/home/ma-user/ws,创建tokenizers文件目录将权重和词表文件放置此处,以Qwen2-72B为例。 cd /home/ma-user/ws mkdir -p model/Qwen2-72B
  • 用户自定义执行数据处理脚本修改参数说明 如果用户要自定义数据处理脚本并且单独执行,同样以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。
  • 微调数据集预处理参数说明 微调包含SFT和LoRA微调。数据集预处理脚本参数说明如下: --input:原始数据集的存放路径。支持 .parquet \ .csv \ .json \ .jsonl \ .txt \ .arrow 格式。 --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:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。 输出数据预处理结果路径: 训练完成后,以llama2-13b为例,输出数据路径为:/home/ma-user/work/llm_train/processed_for_input/llama2-13b/data/finetune/
  • 预训练数据集预处理参数说明 预训练数据集预处理脚本 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:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。 输出数据预处理结果路径: 训练完成后,以 llama2-13b 为例,输出数据路径为:/home/ma-user/work/llm_train/processed_for_input/llama2-13b/data/pretrain/
  • 步骤六 编写Config.yaml文件 k8s有两种方式来管理对象: 命令式,即通过Kubectl指令直接操作对象。 声明式,通过定义资源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: # 容器内 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 双个节点训练的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。
  • 镜像地址 本教程中用到的训练和推理的基础镜像地址和配套版本关系如下表所示,请提前了解。 表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.2409-aarch64-snt9b-20241112192643-c45ac6b 表2 模型镜像版本 模型 版本 CANN cann_8.0.rc3 驱动 23.0.6 PyTorch 2.1.0
  • 步骤二 获取训练镜像 建议使用官方提供的镜像部署训练服务。镜像地址{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
  • Ascend-vLLM支持的特性介绍 表1 Ascend-vLLM支持的特性 特性名称 特性说明 调度 Page-attention 分块管理kvcache,提升吞吐。 Continuous batching 迭代级调度,动态调整batch,降低延迟,提升吞吐。 Multi-step 一次调度多次推理,降低调度上的cpu-overhead。 量化 W4A16-AWQ、GPTQ 权重Int4量化,降低显存消耗和时延。小并发时延提升80%,精度损失2%以内。 W8A8-smoothQuant 权重Int8量化,降低显存消耗,吞吐提升30%;精度损失1.5%以内。 W8A16-GPTQ Int8量化,降低显存消耗,提高吞吐20%。精度损失1%以内。 Kv8 Kv-cache量化,提高吞吐,支持更长序列。 高效解码 Auto-prefix-caching 前缀缓存,降低首token时延。在system prompt较长或多轮对话场景收益明显 Chunked-prefill 又名split-fuse。全量增量同时推理,提高资源利用率,提升吞吐。 Speculative Decoding 支持大小模型投机推理和eager模式投机,提升推理性能。 图模式 Cuda-graph/cann-graph 记录算子执行的依赖关系构图;消除python host耗时;且支持动态shape。 Torch.compile Torch.dynamo构图,转ascend-GE后端推理;使用静态分档。 实例复用 Multi-lora 多lora挂载,多个不同微调模型共用一份权重同时部署。 控制输出 Guided Decoding 通过特定模式控制模型输出。 Beam search 通过beamsearch输出多个候选结果。 分离部署 PD分离部署 全量、增量分离部署,提高资源利用率,提升体验。 剪枝 FASP (Fast and Accurate Structured Pruning) 剪枝 FASP剪枝是一种结构化稀疏剪枝方法,能有效降低模型显存以及需要部署的资源依赖,减小推理过程中的计算量,降低增量推理时延,提升吞吐。
  • Step3 安装Docker 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker 配置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
  • ppo_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/model/llama3-8b reward_model: /home/ma-user/ws/saves/rm/llama3-8b/lora ### method stage: ppo do_train: true # 全参 # finetuning_type: full # reward_model_type: full # lora finetuning_type: lora lora_target: all deepspeed: examples/deepspeed/ds_z0_config.json ### dataset dataset: identity,alpaca_en_demo template: llama3 cutoff_len: 4096 max_samples: 50000 overwrite_cache: true preprocessing_num_workers: 16 packing: true ### output output_dir: /home/ma-user/ws/saves/ppo/llama3-8b/lora logging_steps: 1 save_steps: 500 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-5 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true ddp_timeout: 180000000 flash_attn: sdpa include_tokens_per_second: true include_num_input_tokens_seen: true ### generate max_new_tokens: 512 top_k: 0 top_p: 0.9
  • ds_z1_config.json样例模板 { "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "gradient_accumulation_steps": "auto", "gradient_clipping": "auto", "zero_allow_untested_optimizer": true, "fp16": { "enabled": "auto", "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "bf16": { "enabled": "auto" }, "zero_optimization": { "stage": 1, "allgather_partitions": true, "allgather_bucket_size": 5e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": 5e8, "contiguous_gradients": true, "round_robin_gradients": true } }
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全