华为云用户手册

  • 上传数据集至OBS 准备数据集。 在创建OBS桶创建的桶下创建文件夹用以存放数据,例如在桶standard-qwenvl-7b中创建文件夹training_data。 利用OBS Browser+工具将步骤1下载的数据集上传至步骤2创建的文件夹目录下。得到OBS下数据集结构: obs://standard-qwenvl-7b └── training_data └── qwenvl_dataset #数据集目录 ├── chart_qa_train_ocr.json # json文件 └── new_single_bar # 图片目录 └── single_bar_1_1000.jpg └── single_bar_1_1001.jpg └── single_bar_1_1002.jpg └── single_bar_1_1003.jpg ...
  • 创建OBS桶 ModelArts使用 对象存储服务 (Object Storage Service,简称OBS)进行数据存储以及模型的备份和快照,实现安全、高可靠和低成本的存储需求。因此,在使用ModelArts之前通常先创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。 本文档也以将运行代码以及输入输出数据存放OBS为例,请参考创建OBS桶,例如桶名: standard-qwenvl-7b。并在该桶下创建文件夹目录用于后续存储代码使用,例如:training_data。
  • 方案概览 本文档利用训练框架PyTorch_npu+华为自研Ascend Snt9B硬件,以基于DeepSpeed的Qwen-VL模型为例,为用户提供了多模态理解模型在ModelArts Standard上的全量微调和LoRA微调方案。 本方案目前仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。 本文档适用于仅使用OBS对象存储服务(Object Storage Service)作为存储的方案,OBS用于存储模型文件、训练数据、代码、日志等,提供了高可靠性的数据存储解决方案。
  • 操作流程 图1 操作流程图 表2 操作任务流程说明 阶段 任务 说明 准备工作 准备资源 本教程案例是基于ModelArts Standard运行的,需要购买并开通ModelArts专属资源池和OBS桶。 准备数据 准备训练数据,可以用本案使用的数据集,也可以使用自己准备的数据集。 准备权重 准备所需的权重文件。 准备代码 准备AscendSpeed训练代码。 准备镜像 准备训练模型适用的容器镜像。 微调训练 SFT全参微调 介绍如何进行SFT全参微调,包括训练数据处理、超参配置、创建训练任务及性能查看。 LoRA微调训练 介绍如何进行LoRA微调训练,包括训练数据处理、超参配置、创建训练任务及性能查看。
  • 在运行finetune_ds.sh 时遇到报错 在运行finetune_ds.sh 时遇到报错 pydantic_core._pydantic_core.ValidationError: 1 validation error for DeepSpeedZeroConfig stage3_prefetch_bucket_size Input should be a valid integer, got a number with a fractional part [type=int_from_float, input_value=15099494.4, input_type=float] 将deepspeed配置文件的 stage3_prefetch_bucket_size 参数值从 auto 改成 整数15099494 父主题: 常见错误原因和解决方法
  • 联网下载SimSun.ttf时可能会遇到网络问题 联网下载SimSun.ttf时肯会遇到网络问题 tokenization_qwen.py会在cache中读取SimSun.ttf 文件,如果没有,就会联网下载,可能会遇到: SSL:CERTIFICATE_VERIFY_FAILED ssl.1129错误 407 Proxy Authentication Required 解决方案: 1. 直接手动下载 SimSun.ttf 传到 模型权重目录下 /home/ma-user/work/model-dir/Qwen-VL-Chat/ https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/SimSun.ttf 2. 将 文件 /home/ma-user/work/model-dir/Qwen-VL-Chat/tokenization_qwen.py 中的 30-35 行注释 3. 然后增加一行直接读取本地的Simsun.ttf文件,写绝对路径 # FONT_PATH = try_to_load_from_cache("Qwen/Qwen-VL-Chat", "SimSun.ttf")# if FONT_PATH is None: # if not os.path.exists("SimSun.ttf"): # ttf = requests.get("https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/SimSun.ttf") # open("SimSun.ttf", "wb").write(ttf.content) # FONT_PATH = "SimSun.ttf" FONT_PATH = "/home/ma-user/work/model-dir/Qwen-VL-Chat/SimSun.ttf" 父主题: 常见错误原因和解决方法
  • 网卡名称错误 当训练开始时提示网卡名称错误。或者通信超时。可以使用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 父主题: 常见错误原因和解决方法
  • 不同模型推荐的参数与NPU卡数设置 表1 不同模型推荐的参数与NPU卡数设置 模型 Template 模型参数量 训练策略类型 序列长度cutoff_len 梯度累积值 优化工具 (Deepspeed) 规格与节点数 Qwen-VL Qwen-VL 7B full 2048 gradient_accumulation_steps: 16 ZeRO-3 1*节点 & 8*Ascend lora gradient_accumulation_steps: 8 ZeRO-2 1*节点 & 8*Ascend 父主题: 训练脚本说明
  • 查看日志和性能 单击作业详情页面,则可查看训练过程中的详细信息。 图1 查看训练作业 在作业详情页的日志页签,查看最后一个节点的日志,其包含“elapsed time per iteration (ms)”数据,可换算为tokens/s/p的性能数据。 吞吐量(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参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。 图2 查看日志和性能 父主题: Qwen-VL基于Standard+OBS+SFS适配PyTorch NPU训练指导(6.3.912)
  • Step2 配置环境变量 单击“增加环境变量”,在增加的环境变量填写框中,按照表1表格中的配置进行填写。 表1 需要填写的环境变量 环境变量 示例值 参数说明 GPUS_PER_NODE 8 必须填写。根据资源规格每个节点上NPU的数量填写。 DATA /home/ma-user/work/data/training_data/qwenvl_dataset 必须修改。训练时指定的输入数据路径。 MODEL /home/ma-user/work/data/models/Qwen-VL-Chat 必须修改。训练时指定的模型权重路径。 OUTPUT /home/ma-user/work/data/output 必须修改。训练完成后指定的输出模型的路径。 LOG /home/ma-user/work/data/log 保存训练过程记录的日志 LOG 文件。
  • Step1 创建训练任务 创建训练作业,并自定义名称、描述等信息。选择自定义算法,启动方式自定义,以及选择上传的镜像。 图1 创建训练作业 训练作业启动命令中输入: cd /home/ma-user/work/Qwen-VL; ln -s ${DATA}/ qwenvl_dataset; bash finetune/finetune_ds.sh; 选择用户自己的专属资源池,以及规格与节点数。 图2 选择资源池规格 新增SFS Turbo挂载配置,并选择用户创建的SFS Turbo文件系统。 云上挂载路径:输入镜像容器中的工作路径 /home/ma-user/work/data 存储位置:输入用户的“子目录挂载”路径。如果默认没有填写,则忽略。 图3 选择SFS Turbo SFS Turbo不能直接挂载到容器的工作路径 /home/ma-user/work/下,会覆盖镜像中的代码目录,导致训练失败。 作业日志选择OBS中的路径,ModelArts的训练作业的日志信息则保存该路径下。 最后,请参考查看日志和性能章节查看LoRA微调的日志和性能。了解更多ModelArts训练功能,可查看模型开发简介。
  • Step2 配置环境变量 单击“增加环境变量”,在增加的环境变量填写框中,按照表1表格中的配置进行填写。 表1 需要填写的环境变量 环境变量 示例值 参数说明 GPUS_PER_NODE 8 必须填写。根据资源规格每个节点上NPU的数量填写。 DATA /home/ma-user/work/data/training_data/qwenvl_dataset 必须修改。训练时指定的输入数据路径。 MODEL /home/ma-user/work/data/models/Qwen-VL-Chat 必须修改。训练时指定的模型权重路径。 OUTPUT /home/ma-user/work/data/output 必须修改。训练完成后指定的输出模型的路径。 LOG /home/ma-user/work/data/log 保存训练过程记录的日志LOG文件。
  • 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
  • 基础镜像的使用 用户通过E CS 获取基础镜像步骤拉取基础镜像并上传至SWR中。随后可通过ECS中构建新镜像的方式来部署训练环境。可以在ECS中,通过运行Dockerfile文件会在基础镜像上创建新的镜像。新镜像命名可自定义。在构建镜像的过程中会下载完整的模型代码、执行环境,然后自动进行NPU适配,并将以上源码和环境打包至镜像中。 ECS需要连通公网,否则会导致安装下载源码、安装环境依赖、上传镜像到SWR等操作失败。ECS打通公网配置请参见ECS绑定弹性公网IP。
  • 基础镜像地址 本教程中用到的训练的基础镜像地址和配套版本关系如下表所示,请提前了解。 表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-20241213131522-aafe527 CANN:cann_8.0.rc3 PyTorch:2.1.0
  • 上传数据集至OBS 准备数据集。 在创建OBS桶创建的桶下创建文件夹用以存放数据,例如在桶standard-qwenvl-7b中创建文件夹training_data。 利用OBS Browser+工具将步骤1下载的数据集上传至步骤2创建的文件夹目录下。得到OBS下数据集结构: obs://standard-qwenvl-7b └── training_data └── qwenvl_dataset #数据集目录 ├── chart_qa_train_ocr.json # json文件 └── new_single_bar # 图片目录 └── single_bar_1_1000.jpg └── single_bar_1_1001.jpg └── single_bar_1_1002.jpg └── single_bar_1_1003.jpg ...
  • 创建ECS服务器 弹性云服务器(Elastic Cloud Server,ECS)是由CPU、内存、操作系统、云硬盘组成的一种可随时获取、弹性可扩展的云服务器。具体过程请参考ECS文档购买一个Linux弹性云服务器。创建完成后,单击“远程登录”,可直接访问ECS服务器。 注意:CPU架构必须选择鲲鹏计算;镜像推荐选择EulerOS;ECS服务器确保可以访问公网,用于获取镜像和构建镜像。 图3 购买ECS
  • ECS服务器挂载SFS Turbo ECS服务器中手动挂载SFS Turbo步骤如下: 用户可通过CloudShell或SSH等方式登录并访问ECS服务器,进入ECS终端界面。创建/mnt/sfs_turbo目录作为挂载目录 ,命令为:mkdir /mnt/sfs_turbo。 单击用户创建的SFS Turbo,查看SFS Turbo基本信息,找到并复制挂载命令。 在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 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文件系统。 图1 创建SFS Turbo 其中,文件系统类型推荐选用500MB/s/TiB或1000MB/s/TiB,应用于AI大模型场景中。存储容量推荐使用 6.0~10.8TB ,以存储更多模型文件。 图2 SFS类型和容量选择
  • 创建OBS桶 ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行数据存储以及模型的备份和快照,实现安全、高可靠和低成本的存储需求。因此,在使用ModelArts之前通常先创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。 本文档也以将运行代码以及输入输出数据存放OBS为例,请参考创建OBS桶,例如桶名: standard-qwenvl-7b。并在该桶下创建文件夹目录用于后续存储代码使用,例如:training_data。
  • 方案概览 本文档利用训练框架PyTorch_npu+华为自研Ascend Snt9B硬件,以基于DeepSpeed的Qwen-VL模型为例,为用户提供了多模态理解模型在ModelArts Standard上的全量微调和LoRA微调方案。 本方案目前仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。 本文档适用于OBS+SFS Turbo的数据存储方案,不适用于仅OBS存储方案。通过OBS对象存储服务(Object Storage Service)与SFS Turbo文件系统联动,可以实现灵活数据管理、高性能读取等。
  • 操作流程 图1 操作流程图 表2 操作任务流程说明 阶段 任务 说明 准备工作 准备资源 本教程案例是基于ModelArts Standard运行的,需要购买并开通ModelArts专属资源池和OBS桶。 准备数据 准备训练数据,可以用本案使用的数据集,也可以使用自己准备的数据集。 准备权重 准备所需的权重文件。 准备代码 准备AscendSpeed训练代码。 准备镜像 准备训练模型适用的容器镜像。 微调训练 SFT全参微调 介绍如何进行SFT全参微调,包括训练数据处理、超参配置、创建训练任务及性能查看。 LoRA微调训练 介绍如何进行LoRA微调训练,包括训练数据处理、超参配置、创建训练任务及性能查看。
  • 网卡名称错误 当训练开始时提示网卡名称错误。或者通信超时。可以使用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 父主题: 常见错误原因和解决方法
  • 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/AscendFactory/yi/3_training.sh文件,并添加--tokenizer-not-use-fast参数。修改后如图1所示。 图1 修改Yi 模型3_training.sh文件
  • ChatGLMv3-6B 在训练开始前,针对ChatGLMv3-6B模型中的tokenizer文件,需要修改代码。修改文件chatglm3-6b/tokenization_chatglm.py 。 文件最后几处代码中需要修改,具体位置可根据上下文代码信息进行查找,修改后如图2所示。 图2 修改ChatGLMv3-6B tokenizer文件 图3 修改ChatGLMv3-6B tokenizer文件
  • Step2 配置数据输入和输出 单击“增加训练输入”和“增加训练输出”,用于配置训练作业开始时需要输入数据的路径和训练结束后输出数据的路径。 输入指定的目录在训练开始时,平台会自动将指定的OBS路径下的文件copy到容器内 输出指定的目录在训练过程中,平台会自动将容器内的文件copy到指定的OBS路径下 在“输入”的输入框内设置变量:ORIGINAL_TRAIN_DATA_PATH、ORIGINAL_HF_WEIGHT、USER_PRO CES SED_DATA_DIR、USER_CONVERTED_CKPT_PATH根据实际要求选择,示例如下。 输入数据集变量:是否使用已处理好数据集; 是,设置以下变量 USER_PROCESSED_DATA_DIR:已处理好数据路径目录 否,使用原始数据集,设置以下变量 ORIGINAL_TRAIN_DATA_PATH:训练时指定的输入原始数据集路径。 输入权重词表变量:是否使用已转换Megatron格式权重; 是,设置以下变量 USER_CONVERTED_CKPT_PATH:已转换Megatron格式权重目录变量。 ORIGINAL_HF_WEIGHT:加载tokenizer与Hugging Face权重对应的存放目录地址。 否,设置以下变量 ORIGINAL_HF_WEIGHT:加载tokenizer与Hugging Face权重对应的存放地址 在“输出”的输入框内设置变量:OUTPUT_SAVE_DIR、HF_SAVE_DIR,根据实际要求选择,示例如下; OUTPUT_SAVE_DIR:训练完成后指定的输出模型路径。 MG_TO_HF_PATH:训练完成的权重文件自动转换为Hugging Face格式权重输出的路径(确保添加CONVERT_MG2HF环境变量并设置为True)。 分别单击“输入”和“输出”的数据存储位置,如图所示,选择OBS桶中指定的目录。ORIGINAL_TRAIN_DATA_PATH中则直接选中数据集文件,USER_CONVERTED_CKPT_PATH则需选中存放已处理好数据集的目录文件夹。 “输入”和“输出”中的获取方式全部选择为:环境变量。 “输出”中的预下载至本地目标选择:下载,此时输出路径中的数据则会下载至OBS中。
  • Step4 开启训练故障自动重启功能 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图3 开启故障重启 断点续训练是通过checkpoint机制实现。checkpoint机制是在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint继续训练。 当训练作业发生故障中断本次作业时,代码可自动从训练中断的位置接续训练,加载中断生成的checkpoint,中间不需要改动任何参数。可以通过训练脚本中的SAVE_INTERVAL参数来指定间隔多少step保存checkpoint。 如果要使用自动重启功能,资源规格必须选择八卡规格,设置变量MA_TRAIN_AUTO_RESUME为True的前提下,默认为Fasle。 训练作业中的训练故障自动恢复功能包括: 训练容错检查(自动重启),帮助用户隔离故障节点,优化用户训练体验。详细可了解:训练容错检查 无条件自动重启,不管什么原因系统都会自动重启训练作业,提高训练成功率和提升作业的稳定性。详细可了解:无条件自动重启。
  • Step4 开启训练故障自动重启功能 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图3 开启故障重启 断点续训练是通过checkpoint机制实现。checkpoint机制是在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint继续训练。 当训练作业发生故障中断本次作业时,代码可自动从训练中断的位置接续训练,加载中断生成的checkpoint,中间不需要改动任何参数。可以通过训练脚本中的SAVE_INTERVAL参数来指定间隔多少step保存checkpoint。 如果要使用自动重启功能,资源规格必须选择八卡规格,设置超参train_auto_resume为True的前提下,默认为Fasle。 训练作业中的训练故障自动恢复功能包括: 训练容错检查(自动重启),帮助用户隔离故障节点,优化用户训练体验。详细可了解:训练容错检查 无条件自动重启,不管什么原因系统都会自动重启训练作业,提高训练成功率和提升作业的稳定性。详细可了解:无条件自动重启。
  • Step2 配置数据输入和输出 单击“增加训练输入”和“增加训练输出”,用于配置训练作业开始时需要输入数据的路径和训练结束后输出数据的路径。 输入指定的目录在训练开始时,平台会自动将指定的OBS路径下的文件copy到容器内 输出指定的目录在训练过程中,平台会自动将容器内的文件copy到指定的OBS路径下 在“输入”框内设置超参配置:dataset、processed_data_dir、user_converted_ckpt_path、model_name_or_path根据实际要求选择,示例如下。 输入数据集参数:是否使用已处理好数据集; 是,设置以下超参 processed_data_dir:已处理好数据路径目录 否,使用原始数据集,设置以下超参 dataset:训练时指定的输入原始数据集路径。 输入权重词表超参:是否使用已转换Megatron格式权重或训练输出结果权重目录; 是,设置以下超参 user_converted_ckpt_path:已转换Megatron格式权重目录或训练输出结果权重目录,一般搭配断点续训或增量训练。详见断点续训和故障快恢说明 model_name_or_path:加载tokenizer与Hugging Face权重对应存放目录地址。 否,设置以下超参 model_name_or_path:加载tokenizer与Hugging Face权重对应的存放地址 在“输出”的输入框内设置超参:output_dir、hf_save_dir,根据实际要求选择,示例如下; output_dir:训练完成后指定的输出模型路径。 hf_save_dir:训练完成的权重文件自动转换为Hugging Face格式权重输出的路径(确保convert_mg2hf_at_last设置为True,默认为True)。 分别单击“输入”和“输出”的数据存储位置,如图所示,选择OBS桶中指定的目录。超参:dataset中则直接选中数据集文件,超参:processed_data_dir则需选中存放已处理好数据集的目录文件夹。 “输入”和“输出”中的获取方式全部选择为:超参。 “输出”中的预下载至本地目标选择:下载,此时输出路径中的数据则会下载至OBS中。
共100000条