华为云用户手册

  • 权重和词表文件介绍 下载完毕后的HuggingFace原始权重文件包含以下内容,此处以GLM3-6B为例。 GLM3-6B ├── config.json ├── configuration_chatglm.py ├── model-00001-of-00007.safetensors ├── model-00002-of-00007.safetensors ├── model-00003-of-00007.safetensors ├── model-00004-of-00007.safetensors ├── model-00005-of-00007.safetensors ├── model-00006-of-00007.safetensors ├── model-00007-of-00007.safetensors ├── modeling_chatglm.py ├── MODEL_LICENSE ├── pytorch_model-00001-of-00007.bin ├── pytorch_model-00002-of-00007.bin ├── pytorch_model-00003-of-00007.bin ├── pytorch_model-00004-of-00007.bin ├── pytorch_model-00005-of-00007.bin ├── pytorch_model-00006-of-00007.bin ├── pytorch_model-00007-of-00007.bin ├── pytorch_model.bin.index.json ├── quantization.py ├── README.md ├── special_tokens_map.json ├── tokenization_chatglm.py ├── tokenizer_config.json ├── tokenizer.model 工作目录结构如下 ${workdir}(例如/home/ma-user/ws ) ├──llm_train ├── AscendSpeed #代码目录 ├── AscendSpeed #训练依赖的三方模型库 ├── ModelLink #AscendSpeed代码目录 ├── scripts/ #训练启动脚本 ├── processed_for_ma_input ├── GLM3-6B ├── data #预处理后数据 ├── pretrain #预训练加载的数据 ├── finetune #微调加载的数据 ├──converted_weights #HuggingFace格式转换magatron格式后权重文件 ├── saved_dir_for_ma_output #训练输出保存权重,根据实际训练需求设置 ├── GLM3-6B ├── logs #训练过程中日志(loss、吞吐性能) ├── lora #lora微调输出权重 ├── sft #增量训练输出权重 ├── pretrain #预训练输出权重 ├── tokenizers #原始权重及tokenizer目录 ├── GLM3-6B ├── training_data #原始数据目录 ├── pretrain #预训练加载的数据 ├── train-00000-of-00001-a09b74b3ef9c3b56.parquet #预训练原始数据文件 ├── finetune #微调训练加载的数据 ├── Alpaca_data_gpt4_zh.jsonl #微调训练原始数据文件
  • 获取数据及代码 表1 准备代码 代码包名称 代码说明 下载地址 AscendCloud-3rdLLM-6.3.904-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见代码目录介绍。 AscendSpeed是用于模型并行计算的框架,其中包含了许多模型的输入处理方法。 获取路径:Support-E网站。 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 权重和词表文件 包含了本教程使用到的HuggingFace原始权重文件和Tokenizer。 标记器(Tokenizer)是NLP管道的核心组件之一。它们有一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此标记器(Tokenizer)需要将文本输入转换为数字数据。 chatglm3-6b-hf 这个路径下既有权重,也有Tokenizer,全部下载。具体内容参见权重和词表文件介绍。 本文档前向兼容AscendCloud-3rdLLM-6.3.T041版本,获取路径:Support网站。
  • 代码目录介绍 AscendCloud-3rdLLM代码包结构介绍如下: xxx-Ascend #xxx表示版本号,例如6.3.T041 ├──llm_evaluation #推理评测代码包 ├──benchmark_eval #精度评测 ├──benchmark_tools #性能评测 ├──llm_train #模型训练代码包 ├──AscendSpeed #基于AscendSpeed的训练代码 ├──AscendSpeed #加速库 ├──ModelLink #基于ModelLink的训练代码 ├──scripts/ #训练需要的启动脚本 本教程需要使用到的训练相关代码存放在llm_train/AscendSpeed目录下,具体文件介绍如下: ├──llm_train #模型训练代码包 ├──AscendSpeed #基于AscendSpeed的训练代码 ├──AscendSpeed #加速库 ├──ModelLink #基于ModelLink的训练代码,数据预处理脚本 ├──scripts/ #训练需要的启动脚本,调用ModelLink ├──glm3 #glm3的训练代码 ├──glm3_base.sh #glm3训练脚本
  • 重新启动镜像激活SFS盘中的虚拟环境 方法一,直接使用完整conda env路径。 # shell conda activate /home/ma-user/work/envs/user_conda/sfs-new-env 方法二,先添加虚拟环境到conda env,然后使用名称激活。 # shell conda config --append envs_dirs /home/ma-user/work/envs/user_conda/ conda activate sfs-new-env 方法三,直接使用完成虚拟环境中的python或者pip。 # shell /home/ma-user/work/envs/user_conda/sfs-new-env/bin/pip list /home/ma-user/work/envs/user_conda/sfs-new-env/bin/python -V
  • 保存并共享虚拟环境 将要迁移的虚拟环境打包。 # shell pip install conda-pack conda pack -n sfs-clone-env -o sfs-clone-env.tar.gz --ignore-editable-packages Collecting packages... Packing environment at '/home/ma-user/work/envs/user_conda/sfs-clone-env' to 'sfs-clone-env.tar.gz' [########################################] | 100% Completed | 3min 33.9s 解压到SFS目录。 # shell mkdir /home/ma-user/work/envs/user_conda/sfs-tar-env tar -zxvf sfs-clone-env.tar.gz -C /home/ma-user/work/envs/user_conda/sfs-tar-env 查看现有的conda虚拟环境。 # shell conda env list # conda environments: # base /home/ma-user/anaconda3 PyTorch-1.8 * /home/ma-user/anaconda3/envs/PyTorch-1.8 python-3.7.10 /home/ma-user/anaconda3/envs/python-3.7.10 sfs-clone-env /home/ma-user/work/envs/user_conda/sfs-clone-env sfs-new-env /home/ma-user/work/envs/user_conda/sfs-new-env sfs-tar-env /home/ma-user/work/envs/user_conda/sfs-tar-env test-env /home/ma-user/work/envs/user_conda/test-env
  • 克隆原有的虚拟环境到SFS盘 # shell conda create --prefix /home/ma-user/work/envs/user_conda/sfs-clone-env --clone PyTorch-1.8 -y Source: /home/ma-user/anaconda3/envs/PyTorch-1.8 Destination: /home/ma-user/work/envs/user_conda/sfs-clone-env Packages: 20 Files: 39687 Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate /home/ma-user/work/envs/user_conda/sfs-clone-env # # To deactivate an active environment, use # # $ conda deactivate 查看新创建的clone虚拟环境,如果出现新创建的虚拟环境的名称为空的情况,可以参考添加新创建到虚拟环境到conda env。 # shell conda env list # conda environments: # base /home/ma-user/anaconda3 PyTorch-1.8 /home/ma-user/anaconda3/envs/PyTorch-1.8 python-3.7.10 /home/ma-user/anaconda3/envs/python-3.7.10 sfs-clone-env /home/ma-user/work/envs/user_conda/sfs-clone-env sfs-new-env * /home/ma-user/work/envs/user_conda/sfs-new-env (可选)将新建的虚拟环境注册到JupyterLab kernel(可以在JupyterLab中直接使用虚拟环境) # shell pip install ipykernel ipython kernel install --user --name=sfs-clone-env rm -rf /home/ma-user/.local/share/jupyter/kernels/sfs-clone-env/logo-* 说明:此处“.local/share/jupyter/kernels/sfs-clone-env”为举例,请以用户实际的安装路径为准。 刷新JupyterLab页面,可以看到新的kernel。
  • 算子优化 为了更好地发挥昇腾设备的性能,将ChatGLM-6B原模型中的部分算子替换成了NPU亲和的算子,修改的是modeling_chatglm.py文件,下图通过对比列举了对应的修改方式,图示中左边为原始方式,右边为修改后的方式。 使用torch.bmm替换torch.baddbmm。 图1 torch.bmm替换 因为toch.baddbmm函数中beta=0.0、alpha=1.0,所以是等价替换。 npu_scaled_masked_softmax亲和api替换。 图2 亲和api替换 连续性转换。 图3 连续性转换 数组切片操作改用torch接口方式。 图4 数组切片操作修改1 图5 数组切片操作修改2 gelu小算子使用torch的fast_gelu()、gelu()融合算子替换。 图6 融合算子替换
  • 调优结果 这里对deepspeed单机8卡环境下,调优之前和调优之后的train metrics做了统计,结果如下。 性能基线: ***** train metrics ***** epoch = 0.06 train_loss = 3.0146 train_runtime = 2:15:20.44 train_samples = 1649399 train_samples_per_second = 12.61 train_steps_per_second = 0.012 算子调优后结果: ***** train metrics ***** epoch = 0.06 train_loss = 3.0128 train_runtime = 1:39:41.32 train_samples = 1649399 train_samples_per_second = 17.12 train_steps_per_second = 0.017
  • 背景说明 ModelArts支持第三方的推理框架在ModelArts上部署,本文以TFServing框架、Triton框架为例,介绍如何迁移到推理自定义引擎。 TensorFlow Serving是一个灵活、高性能的机器学习模型部署系统,提供模型版本管理、服务回滚等能力。通过配置模型路径、模型端口、模型名称等参数,原生TFServing镜像可以快速启动提供服务,并支持gRPC和HTTP Restful API的访问方式。 Triton是一个高性能推理服务框架,提供HTTP/gRPC等多种服务协议,支持TensorFlow、TensorRT、PyTorch、ONNXRuntime等多种推理引擎后端,并且支持多模型并发、动态batch等功能,能够提高GPU的使用率,改善推理服务的性能。 当从第三方推理框架迁移到使用ModelArts推理的AI应用管理和服务管理时,需要对原生第三方推理框架镜像的构建方式做一定的改造,以使用ModelArts推理平台的模型版本管理能力和动态加载模型的部署能力。本案例将指导用户完成原生第三方推理框架镜像到ModelArts推理自定义引擎的改造。自定义引擎的镜像制作完成后,即可以通过AI应用导入对模型版本进行管理,并基于AI应用进行部署和管理服务。 适配和改造的主要工作项如下: 图1 改造工作项 针对不同框架的镜像,可能还需要做额外的适配工作,具体差异请见对应框架的操作步骤。 TFServing框架迁移操作步骤 Triton框架迁移操作步骤
  • 场景描述 本示例使用Linux x86_64架构的主机,操作系统ubuntu-18.04,通过编写Dockerfile文件制作自定义镜像。 目标:构建安装如下软件的容器镜像,并在ModelArts平台上使用CPU/GPU规格资源运行训练任务。 ubuntu-18.04 cuda-11.1 python-3.7.13 mlnx ofed-5.4 pytorch-1.8.1 horovod-0.22.1
  • Step1 创建OBS桶和文件夹 在OBS服务中创建桶和文件夹,用于存放样例数据集以及训练代码。需要创建的文件夹列表如表1所示,示例中的桶名称“test-modelarts”和文件夹名称均为举例,请替换为用户自定义的名称。 创建OBS桶和文件夹的操作指导请参见创建桶和新建文件夹。 请确保您使用的OBS与ModelArts在同一区域。 表1 OBS桶文件夹列表 文件夹名称 用途 “obs://test-modelarts/pytorch/demo-code/” 用于存储训练脚本文件。 “obs://test-modelarts/pytorch/log/” 用于存储训练日志文件。
  • 迁移环境准备 迁移环境准备有以下两种方式: 方式一 ModelArts Notebook:该环境为在线调试环境,主要面向演示、体验和快速原型调试场景。 优点:可快速、低成本地搭建环境,使用标准化容器镜像,官方notebook示例可直接运行。 缺点:由于是容器化环境因此不如裸机方式灵活,例如不支持root权限操作、驱动更新等。 环境开通指导参考:Notebook环境创建。 样例演示可参考Notebook样例:Stable Diffusion模型迁移到Ascend上进行推理。 方式二 ModelArts Lite DevServer:该环境为裸机开发环境,主要面向深度定制化开发场景。 优点:支持深度自定义环境安装,可以方便的替换驱动、固件和上层开发包,具有root权限,结合配置指导、初始化工具及容器镜像可以快速搭建昇腾开发环境。 缺点:资源申请周期长,购买成本高,管理视角下资源使用效率较低。 环境开通指导参考:DevServer资源开通 环境配置指导参考:Snt9B裸金属服务器环境配置指南 本文基于方式二的环境进行操作,请参考方式二中的环境开通和配置指导完成裸机和容器开发初始化配置。注意业务基础镜像选择Ascend+PyTorch镜像。 配置好的容器环境如下图所示: 图1 环境配置完成 父主题: AIGC推理业务昇腾迁移指导
  • HuggingFace权重转换操作 下载Llama2-70B的预训练权重和词表文件,并上传到/home/ma-user/ws/tokenizers/Llama2-70B目录下。具体下载地址请参见表1。如果已下载,忽略此步骤。 创建权重转换后的输出目录/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights/。 cd /home/ma-user/ws/ #进入/home/ma-user/ws/目录 mkdir -p processed_for_ma_input/Llama2-70B/converted_weights 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink,在代码目录中执行util.py脚本。xxx-Ascend请根据实际目录替换。 #加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #进入到ModelLink目录下 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink # 权重格式转换 python tools/checkpoint/util.py --model-type GPT \ --loader llama2_hf \ --saver megatron \ --target-tensor-parallel-size 8 \ --target-pipeline-parallel-size 8 \ --load-dir /home/ma-user/ws/tokenizers/Llama2-70B \ --save-dir /home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights \ --tokenizer-model /home/ma-user/ws/tokenizers/Llama2-70B/tokenizer.model 参数说明如下: --model-type:模型类型。 --loader:权重转换要加载检查点的模型名称。 --tensor-model-parallel-size:张量并行数,需要与训练脚本中的TP值配置一样。 --pipeline-model-parallel-size:流水线并行数,需要与训练脚本中的PP值配置一样。 --saver:检查模型保存名称。 --load-dir:加载转换模型权重路径。 --save-dir : 权重转换完成之后保存路径。 --tokenizer-model : tokenizer路径。 权重转换完成后,在/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights目录下查看转换后的权重文件。 图1 转换后的权重文件
  • 训练输出保存结构说明 ModelArts训练作业的模型输出和日志信息会定时同步到指定的OBS中,本示例中模型输出路径和日志输出路径分别为f"{default_obs_dir}/mindspore_model/output/"和f"{default_obs_dir}/mindspore_model/logs/",用户可以在OBS中查看训练输出信息。 本示例中训练输出保存在OBS的目录结构如下所示: ${your_bucket} └── intermidiate ├── dataset │ └── flower_photos │ └── flower_photos.zip └── mindspore_model ├── logs │ └── xxx-xxx-xxx--0.log ├── output │ └── 20220627-105226-resnet50-224 └── mindspore-image-models.zip
  • 步骤5:使用SDK提交训练作业 本地调测完成后可以提交训练作业。因为数据在Notebook中,设置InputData中“is_local_source”的参数为“True”,会自动将本地数据同步上传到OBS中。 步骤如下: 在“/home/ma-user/work/models/official/cv/resnet/”下创建train_notebook.py, 复制代码至train_notebook.py, 运行train_notebook.py,进行训练作业提交。 # train_notebook.py # 导入ModelArts SDK的依赖,并初始化Session,此处的ak、sk、project_id、region_name请替换成用户自己的信息 from modelarts.train_params import TrainingFiles from modelarts.train_params import OutputData from modelarts.train_params import InputData from modelarts.estimatorV2 import Estimator from modelarts.session import Session # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 __AK = os.environ["HUAWEICLOUD_SDK_AK"] __SK = os.environ["HUAWEICLOUD_SDK_SK"] # 如果进行了加密还需要进行解密操作 session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***') # 样例中为了方便默认创建一个OBS桶,推荐将调测所需要传输的文件统一放到`${default_bucket}/intermidiate`目录下,也可以按照注释代码自行指定 obs_bucket = session.obs.get_default_bucket() print("Default bucket name: ", obs_bucket) default_obs_dir = f"{obs_bucket}/intermidiate" #default_obs_dir = "obs://your-bucket-name/folder-name" # 本地的工程代码文件夹路径 code_dir_local = "/home/ma-user/work/models/official/cv/resnet/" #@param {type:"string"} # 代码的启动文件名称 boot_file = "train.py" #@param {type:"string"} train_file = TrainingFiles(code_dir=code_dir_local, boot_file=boot_file) # 本地数据集路径 local_data_path = "/home/ma-user/work/models/dataset/flower_photos" #@param {type:"string"} # 模型输出保存路径 output_local = "/home/ma-user/work/models/official/cv/resnet/output" #@param {type:"string"} # 模拟训练过程中模型输出回传至指定OBS的路径,需要以"/"结尾 obs_output_path = f"{default_obs_dir}/mindspore_model/output/" # 指定一个obs路径用于存储输出结果 output = [OutputData(local_path=output_local, obs_path=obs_output_path, name="output")] # 模拟训练过程中模训练日志回传至指定OBS的路径,需要以"/"结尾 log_obs_path = f"{default_obs_dir}/mindspore_model/logs/" # 训练所需的代码路径,代码会自动从本地上传至OBS code_obs_path = f"{default_obs_dir}/mindspore_model/" data_obs_path = f"{default_obs_dir}/dataset/flower_photos/" # sdk会将代码自动上传至OBS,并同步到训练环境 train_file = TrainingFiles(code_dir=code_dir_local, boot_file=boot_file, obs_path=code_obs_path) # 指定OBS中的数据集路径,会自动将local_path数据上传至obs_path,用户可以在代码中通过 --data_url接收这个数据集路径 input_data = InputData(local_path=local_data_path, obs_path=data_obs_path, is_local_source=True, name="data_url") from modelarts.service import SWRManagement image_organization = SWRManagement(session).get_default_namespace() # image_organization = "your-swr-namespace-name" print("Default image_organization:", image_organization) image_name = "mindspore-image-models-image" #@param {type:"string"} image_tag = "1.0.0" #@param {type:"string"} import os ENV_NAME=os.getenv('ENV_NAME') # 启动训练任务:使用user_command(shell命令)方式启动训练任务 # 注意:训练启动默认的工作路径为"/home/ma-user/modelarts/user-job-dir",而代码上传路径为"./resnet/${code_dir}"下 # --enable_modelarts=True 该代码仓已适配ModelArts estimator = Estimator(session=session, training_files=train_file, outputs=output, user_image_url=f"{image_organization}/{image_name}:{image_tag}", # 自定义镜像swr地址,由镜像仓库组织/镜像名称:镜像tag组成 user_command=f'cd /home/ma-user/modelarts/user-job-dir/ && /home/ma-user/anaconda3/envs/MindSpore/bin/python ./resnet/train.py --net_name=resnet50 --dataset=imagenet2012 --enable_modelarts=True --class_num=5 --config_path=./resnet/config/resnet50_imagenet2012_config.yaml --epoch_size=10 --device_target="Ascend" --enable_modelarts=True', # 执行训练命令 train_instance_type="modelarts.p3.large.public", # 虚拟资源规格,不同region的资源规格可能不同,请参考“Estimator参数说明”表下的说明查询修改 train_instance_count=1, # 节点数,适用于多机分布式训练,默认是1 #pool_id='若指定专属池,替换为页面上查到的poolId',同时修改资源规格为专属池专用的虚拟子规格 log_url=log_obs_path ) # job_name是可选参数,可不填随机生成工作名 job_instance = estimator.fit(inputs=[input_data], job_name="modelarts_training_job_with_sdk_by_command_v01") 表1 Estimator参数说明 参数名称 参数说明 session modelarts session training_files 训练代码的路径和启动文件 user_image_url 自定义镜像swr地址,由镜像仓库组织/镜像名称:镜像tag组成 user_command 执行训练命令 train_instance_type 本地调测'local'或云端资源规格。每个region的资源规格可能是不同的,可以通过下述说明查询对应的资源规格信息。 train_instance_count 节点数 log_url 日志输出路径 job_name 作业名称,不可以重复 train_instance_type表示训练的资源规格,每个region的资源规格可能是不同的。通过如下方法查询资源规格: 公共资源池执行如下命令查询 from modelarts.session import Session from modelarts.estimatorV2 import Estimator from pprint import pprint # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 __AK = os.environ["HUAWEICLOUD_SDK_AK"] __SK = os.environ["HUAWEICLOUD_SDK_SK"] # 如果进行了加密还需要进行解密操作 session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***') info = Estimator.get_train_instance_types(session=session) pprint(info) 专属池规格 ModelArts专属资源池统一使用虚拟子规格,不区分GPU和Ascend。资源规格参考表2查询。 表2 专属资源池虚拟规格的说明 train_instance_type 说明 modelarts.pool.visual.xlarge 1卡 modelarts.pool.visual.2xlarge 2卡 modelarts.pool.visual.4xlarge 4卡 modelarts.pool.visual.8xlarge 8卡
  • 提交训练作业常见问题 报错信息:Exception: You have attempted to create more buckets than allowed 原因分析:由于桶的数量多于限额,无法自动创建。 解决方法:用户可以删除一个桶,或者直接指定一个已存在的桶(修改变量obs_bucket的值)。 报错信息:"errorMessage":"The number of namespaces exceeds the upper limit"或"namespace is invalid" 原因分析:SWR组织数限额,SWR组织默认最多只能创建5个组织。 解决方法:用户可以删除一个SWR组织,或者直接指定一个已存在的SWR组织(修改变量image_organization的值)。 报错信息:standard_init_linux.go:224: exec user process caused "exet format error" 原因分析:可能由于训练规格错误导致训练作业卡死。 解决方法:请参考说明查询资源规格。 报错信息:报错镜像失败,报错:401,'Unauthorized',b'{errors":[{"errorCode":"SVCSTG.SWR.4010000",errorMessage":"Authenticate Error",……}] 原因分析:远程连接Notebook时需要输入鉴权信息。 解决方法:传入AK,SK信息。 1 2 3 4 5 6 # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 __AK = os.environ["HUAWEICLOUD_SDK_AK"] __SK = os.environ["HUAWEICLOUD_SDK_SK"] # 如果进行了加密还需要进行解密操作 session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***')
  • 加速慢算子的执行速度 首先需要寻找执行速度比较慢的NPU算子列表,Kernel视图包含在NPU上执行的所有算子的信息,主要用于确认高耗时算子。 图7 Kernel视图 推荐基于以下思路尝试优化: 搜索Cast类算子,查看是否Cast类算子最大耗时超过30us或者总耗时占比超过1%,如果超过,需尝试启动混合精度训练,详见此处。 图8 Cast类算子 基于Accelerator Core排序,统计AI_CPU算子,如果有AI_CPU类算子执行时长超过1000us或者AI_CPU类算子总执行时长占比超过10%,可尝试修改代码替换API_CPU算子。 需要注意:PyTorch Adaptor针对部分算子,会基于输入类型下发不同运行硬件的算子,所以除了使用同语义算子替换API_CPU算子外,还可以通过修改输入类型使算子下发到API_CORE上(比如torch.topk在参数为一维list使用API_CPU计算,多维参数则基于AI_CORE Vector计算)。 图9 Accelerator Core排序 如果遇到算子运行期间NPU的计算单元和存储单元使用率都未达到80%(查看aiv_*_ratio和aic_*_ratio是否达到0.8),或者算子的“Block Dim”小于AI Core/Vector Core,可尝试使用AOE算子调优,提高NPU硬件资源利用率。 图10 aiv_*_ratio 针对总耗时最长、平均执行耗时最长以及最大耗时的三种排序的TOP算子,可联系华为工程师获得帮助。 图11 耗时排序
  • 使用镜像创建AI应用 登录ModelArts管理控制台,进入“ AI应用”页面,单击“创建”,跳转至创建AI应用页面。 完成AI应用配置,部分配置如下: 元模型来源:选择“从容器镜像中选择”。 容器镜像所在的路径:选择上传镜像至容器镜像服务上传的路径。 容器调用接口:根据实际情况配置容器调用接口。 健康检查:保持默认。如果镜像中配置了健康检查则按实际情况配置健康检查。 图1 AI应用配置参数 单击“立即创建”,进入AI应用列表页,等AI应用状态变为“正常”,表示AI应用创建成功。
  • 背景说明 WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。
  • 训练profiling工具使用 五板斧操作之后,如果性能仍然不满足要求,便需要通过profiling工具采集性能数据,基于数据分析是哪个环节、哪个算子导致的性能消耗,进而做性能优化。 目前有两种方式采集训练profiling数据:Ascend PyTorch Profiler数据采集与分析和E2E Profiling数据采集与分析。 其中推荐使用Ascend PyTorch Profiler数据采集与分析方法,基于这种用法性能调优更高效,可以全面采集PyTorch训练场景下的性能数据,主要包括PyTorch层算子信息、CANN层算子信息、底层NPU算子信息、以及算子内存占用信息等,可以全方位分析PyTorch训练时的性能状态,有四种视图来展示PyTorch性能数据,其中Trace视图与第二种profiling方法展示同样的信息。第二种采集方式的优势主要在于不需要额外启动tensorboard服务来展示数据,在本地浏览器就能展示性能数据。 训练profiling工具使用说明: 通过键盘上的快捷键(w:放大/s:缩小/a:左移/d:右移)可以很方便地进行查看算子运行信息(tensorboard的Trace View页面和chrome的tracing页面都支持快捷键)。 如果是在docker中运行tensorboard,启动docker容器的时候,需要将tensorboard的端口映射到宿主机的端口,这样才能在浏览器基于宿主机的ip+宿主机的端口访问tensorboard服务;同时启动tensorboard的时候,需要“—bind_all”参数。 docker run -itd -p 12345:6006 my-image bash .... tensorboard --bind_all --logdir result_dir/ 图1 TensorBoard 性能调优是一个不断迭代的过程,每个版本的代码与profiling的对应关系需要提前做好规划,否则随着迭代次数的增多,无法梳理清楚某一版本的代码修改究竟是否带来性能提升或带来多少性能提升。推荐对应关系可以使用git commit来管理。 PyTorch API会调用其他API以及算子,调用关系在Trace View的Python cpu区域可以展示出来,如下图所示,tensor对象的*或者mul操作(对应图中的aten::mul)会调用aten::item和Mul算子,以此类推。其中如果某一个算子调用了Enqueue算子,代表该算子将会被下发到NPU中执行。鼠标点中某个算子/API,可查看对应详情,包括调用堆栈。 图2 调用关系 父主题: PyTorch迁移性能调优
  • 操作事项 ModelArts:设置资源池的网络 用户VPC:安装和配置正向代理 算法镜像:设置DNS代理和公网地址调用 ModelArts:设置资源池的网络 专属资源池的创建作业类型包含推理服务,选择的网络需打通VPC网络,如下图所示: 图2 创建专属资源池 图3 打通VPC 打通VPC可实现ModelArts资源池和用户VPC的网络打通。打通VPC前需要提前创建好VPC和子网,具体步骤请参考创建虚拟私有云和子网。 用户VPC:安装和配置正向代理 在安装正向代理前,需要先购买一台弹性云服务器ECS(镜像可选择Ubuntu最新版本),并配置好弹性EIP,然后登录ECS进行正向代理Squid的安装和配置,步骤如下: 如果没有安装Docker,执行以下命令进行Docker安装 curl -sSL https://get.daocloud.io/docker | sh 拉取Squid镜像 docker pull ubuntu/squid 创建主机目录,配置whitelist.conf和squid.conf 先创建主机目录: mkdir –p /etc/squid/ 添加whitelist.conf配置文件,内容为安全控制可访问的地址,如: .apig.cn-east-3.huaweicloudapis.com 添加squid.conf配置文件,内容如下: # An ACL named 'whitelist' acl whitelist dstdomain '/etc/squid/whitelist.conf' # Allow whitelisted URLs through http_access allow whitelist # Block the rest http_access deny all # Default port http_port 3128 然后设置主机目录和配置文件权限如下: chmod 640 -R /etc/squid 启动squid实例 docker run -d --name squid -e TZ=UTC -v /etc/squid:/etc/squid -p 3128:3128 ubuntu/squid:latest 如果whitelist.conf或squid.conf有更新,则进入容器刷新squid docker exec –it squid bash root@{container_id}:/# squid -k reconfigure 算法镜像:设置DNS代理和公网地址调用 设置代理 在代码中设置代理指向代理服务器私有IP和端口,如下所示: proxies = { "http": "http://{proxy_server_private_ip}:3128", "https": "http://{proxy_server_private_ip}:3128" } 服务器私有IP获取如下图所示: 图4 ECS私有IP 地址调用 在推理代码中,使用服务URL进行业务请求,如: https://e8a048ce25136addbbac23ce6132a.apig.cn-east-3.huaweicloudapis.com
  • Step1 配置预训练超参 预训练脚本glm3_base.sh,存放在“xxx-Ascend/llm_train/AscendSpeed/scripts/glm3”目录下。训练前,可以根据实际需要修改超参配置。xxx-Ascend请根据实际目录替换。 表1 预训练超参配置 参数 示例值 参数说明 DATASET_PATH /home/ma-user/ws/processed_for_ma_input/GLM3-6B/data/pretrain/alpaca_text_document 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/GLM3-6B 必填。加载tokenizer时,tokenizer存放地址。 请根据实际规划修改。 MODEL_TYPE 6B 必填。表示模型加载类型。 TRAIN_ITERS 200 非必填。表示训练迭代周期,根据实际需要修改。 MBS 1 非必填。表示流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 该值与TP和PP以及模型大小相关,可根据实际情况进行调整。 默认值1。单机建议为1,双机建议为2。 GBS 64 非必填。表示训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长。默认值64。单机建议为64,双机建议为128。 TP 2 非必填。表示张量并行。默认值为2。 PP 4 非必填。表示流水线并行。默认值为4。单机建议为4,双机建议为8。 RUN_TYPE pretrain 必填。表示训练类型,根据实际训练任务类型选择。取值说明: pretrain:表示预训练 retrain:表示断点续训 sft:表示SFT微调训练 lora:表示LoRA微调训练 MASTER_ADDR localhost 多机必填,单机忽略;指定主节点IP地址,多台机器中需要指定一个节点IP为主节点IP。 一般指定第一个节点IP为主节点IP。 NNODES 1 多机必填,单机忽略;节点总数,单机写1,双机写2。 NODE_RANK 0 多机必填,单机忽略;节点序号,当前节点ID,一般从0开始,单机默认是0。 WORK_DIR /home/ma-user/ws 非必填。容器的工作目录。训练的权重文件保存在此路径下。默认值为:/home/ma-user/ws。 SEQ_LEN 8192 非必填。默认值为8192。
  • Step2 启动训练脚本 请根据表1修改超参值后,再启动训练脚本。 单机启动 以GLM3-6B为例,单机训练启动样例命令如下,以自己实际为准。 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本。xxx-Ascend请根据实际目录替换。 MODEL_TYPE=6B RUN_TYPE=pretrain DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/GLM3-6B/data/pretrain/alpaca_text_document TOKENIZER_PATH=/home/ma-user/ws/tokenizers/GLM3-6B TRAIN_ITERS=200 MBS=1 GBS=64 TP=2 PP=4 SEQ_LEN=8192 WORK_DIR=/home/ma-user/ws sh scripts/glm3/glm3_base.sh 其中MODEL_TYPE、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH为必填。TRAIN_ITERS、MBS、GBS、TP、PP、SEQ_LEN 为非必填,有默认值。 多机启动 以GLM3-6B为例,多台机器执行训练启动命令如下。多机启动需要在每个节点上执行,以下命令以双机为例。 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本。xxx-Ascend请根据实际目录替。 #第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=0 MODEL_TYPE=6B RUN_TYPE=pretrain DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/GLM3-6B/data/pretrain/alpaca_text_document TOKENIZER_PATH=/home/ma-user/ws/tokenizers/GLM3-6B TRAIN_ITERS=200 MBS=2 GBS=128 TP=2 PP=8 SEQ_LEN=8192 WORK_DIR=/home/ma-user/ws sh scripts/glm3/glm3_base.sh ... ... # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=1 MODEL_TYPE=6B RUN_TYPE=pretrain DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/GLM3-6B/data/pretrain/alpaca_text_document TOKENIZER_PATH=/home/ma-user/ws/tokenizers/GLM3-6B TRAIN_ITERS=200 MBS=2 GBS=128 TP=2 PP=8 SEQ_LEN=8192 WORK_DIR=/home/ma-user/ws sh scripts/glm3/glm3_base.sh 以上命令多台机器执行时,只有${NODE_RANK}:节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH为必填;TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR、SEQ_LEN为非必填,有默认值。 等待模型载入 执行训练启动命令后,等待模型载入,当出现“training”关键字时,表示开始训练。训练过程中,训练日志会在最后的Rank节点打印。 图1 等待模型载入 更多查看训练日志和性能操作,请参考查看日志和性能章节。 如果需要使用断点续训练能力,请参考断点续训练章节修改训练脚本。
  • 约束与限制 只有主账号可以使用委托授权,可以为当前账号授权,也可以为当前账号下的所有IAM用户授权。 多个IAM用户或账号,可使用同一个委托。 一个账号下,最多可创建50个委托。 对于首次使用ModelArts新用户,请直接新增委托即可。一般用户新增普通用户权限即可满足使用要求。如果有精细化权限管理的需求,可以自定义权限按需设置。 如果未获得委托授权,当打开“访问授权”页面时,ModelArts会提醒您当前用户未配置授权,需联系此IAM用户的管理员账号进行委托授权。
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量(tokens/s/p):global batch size*seq_length/(总卡数*elapsed time per iteration)*1000,其参数在日志里可找到,默认seq_len值为8192,默认global batch size为64;其global batch size(GBS)、seq_len(SEQ_LEN)为训练时设置的参数。 loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。也可以使用可视化工具TrainingLogParser查看loss收敛情况,如图2所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在最后一个节点上。 图2 Loss收敛情况(示意图)
  • 查看日志 训练过程中,训练日志会在最后的Rank节点打印。 图1 打印训练日志 训练完成后,如果需要单独获取训练日志文件,可以在${SAVE_PATH}/logs路径下获取。日志存放路径为{work_dir}/saved_dir_for_ma_output/GLM3-6B/logs,本实例日志路径为/home/ma-user/ws/saved_dir_for_ma_output/GLM3-6B/logs
  • 上传代码到工作环境 使用root用户以SSH的方式登录DevServer。 将AscendSpeed代码包AscendCloud-3rdLLM-xxx-xxx.zip上传到${workdir}目录下并解压缩,如:/home/ma-user/ws目录下,以下都以/home/ma-user/ws为例。 unzip AscendCloud-3rdLLM-xxx-xxx.zip #解压缩,-xxx-xxx表示软件包版本号和时间戳 上传tokenizers文件到工作目录中的/home/ma-user/ws/tokenizers/BaiChuan2-13B目录。 具体步骤如下: 进入到${workdir}目录下,如:/home/ma-user/ws。 cd /home/ma-user/ws mkdir -p tokenizers/BaiChuan2-13B 将 权重和词表文件 文件放置此处。 修改tokenizer目录下tokenization_baichuan.py中约71行内容。 调整 super().__init__()位置:将super().__init__()放置def __init__()方法最底层,如下图所示。 图1 修改tokenization_baichuan.py
  • 权重和词表文件介绍 下载完毕后的HuggingFace原始权重文件包含以下内容,此处以baichuan2-13B为例。 baichuan2-13B ├── config.json ├── configuration_baichuan.py ├── generation_config.json ├── generation_utils.py ├── handler.py ├── modeling_baichuan.py ├── pytorch_model-00001-of-00003.bin ├── pytorch_model-00002-of-00003.bin ├── pytorch_model-00003-of-00003.bin ├── pytorch_model.bin.index.json ├── quantizer.py ├── README.md ├── special_tokens_map.json ├── tokenization_baichuan.py ├── tokenizer_config.json ├── tokenizer.model ├── transform.ckpt ├── transformed.ckpt
  • 获取数据及代码 表1 准备代码 代码包名称 代码说明 下载地址 AscendCloud-3rdLLM-6.3.904-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见代码目录介绍。 AscendSpeed是用于模型并行计算的框架,其中包含了许多模型的输入处理方法。 获取路径:Support网站 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 权重和词表文件 包含了本教程使用到的HuggingFace原始权重文件和Tokenizer。 标记器(Tokenizer)是NLP管道的核心组件之一。它们有一个目的:将文本转换为模型可以处理的数据。模型只能处理数字,因此标记器(Tokenizer)需要将文本输入转换为数字数据。 baichuan2-13b-chat 这个路径下既有权重,也有Tokenizer,全部下载。具体内容参见权重和词表文件介绍。
  • 代码目录介绍 AscendCloud-3rdLLM代码包结构介绍如下: xxx-Ascend #xxx表示版本号 ├──llm_evaluation #推理评测代码包 ├──benchmark_eval #精度评测 ├──benchmark_tools #性能评测 ├──llm_train #模型训练代码包 ├──AscendSpeed #基于AscendSpeed的训练代码 ├──AscendSpeed #加速库 ├──ModelLink #基于ModelLink的训练代码 ├──scripts/ #训练需要的启动脚本 本教程需要使用到的训练相关代码存放在llm_train/AscendSpeed目录下,具体文件介绍如下: ├──llm_train #模型训练代码包 ├──AscendSpeed #基于AscendSpeed的训练代码 ├──AscendSpeed #加速库 ├──ModelLink #基于ModelLink的训练代码,数据预处理脚本 ├──scripts/ #训练需要的启动脚本,调用ModelLink ├──baichuan2 #Baichuan2的训练代码 ├──baichuan2.sh #Baichuan2训练脚本
共100000条