华为云用户手册

  • Step3 准备训练脚本并上传至OBS 准备本案例所需的训练脚本mnist.py,并上传至OBS桶的“obs://test-modelarts/tensorflow/code/”文件夹下。 mnist.py文件内容如下: import argparse import tensorflow as tf parser = argparse.ArgumentParser(description='TensorFlow quick start') parser.add_argument('--data_url', type=str, default="./Data", help='path where the dataset is saved') args = parser.parse_args() mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data(args.data_url) x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10) ]) loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy']) model.fit(x_train, y_train, epochs=5)
  • Step4 启动训练脚本 请根据表1修改超参值后,再启动训练脚本。Llama2-70B建议为8机64卡训练。 多机启动 以Llama2-70B为例,多台机器执行训练启动命令如下。进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本。 #第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=0 MODEL_TYPE=70B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=1 MODEL_TYPE=70B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh ... ... # 第八台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=8 NODE_RANK=7 MODEL_TYPE=70B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-70B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights TRAIN_ITERS=200 MBS=2 GBS=1024 TP=8 PP=8 WORK_DIR=/home/ma-user/ws sh scripts/llama2/llama2.sh 以上命令多台机器执行时,只有${NODE_RANK}的节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、 NODE_RANK、 NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH、MODEL_PATH为必填项。 TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR为非必填,有默认值。 单机启动 对于Llama2-7B和Llama2-13B,操作过程与Llama2-70B相同,只需修改对应参数即可,可以选用单机启动,以Llama2-13B为例。 进入代码目录/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed下执行启动脚本。先修改以下命令中的参数,再复制执行 #非必填参数,有默认值,如需修改请根据实际要求填入以下参数。 MBS=4 \ GBS=64 \ TP=8 \ PP=1 \ TRAIN_ITERS=200 \ WORK_DIR=/home/ma-user/ws \ #必填参数 MODEL_TYPE=13B \ RUN_TYPE=lora \ DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-13B/data/finetune/alpaca_ft \ TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Llama2-13B \ MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Llama2-13B/converted_weights \ sh scripts/llama2/llama2.sh 训练完成后,请参考查看日志和性能章节查看LoRA微调训练的日志和性能。
  • Step3 LoRA微调超参配置 LoRA微调训练脚本llama2.sh,存放在xxx-Ascend/llm_train/AscendSpeed/scripts/llama2/目录下。训练前,可以根据实际需要修改超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型不同,以及输入输出路径的配置的不同。 表1 LoRA微调超参配置 参数 值 参数说明 DATASET_PATH /home/ma-user/ws/processed_for_ma_input/Llama2-70B/data/finetune/alpaca_ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/Llama2-70B 必填。加载tokenizer时,tokenizer存放地址。请根据实际规划修改。 MODEL_PATH /home/ma-user/ws/processed_for_ma_input/Llama2-70B/converted_weights 必填。加载的权重文件路径。Step2 LoRA微调权重转换章节中将HuggingFace格式转化为Megatron格式的权重文件。 MODEL_TYPE 70B 必填。模型加载类型,根据实际填写7B、13B或70B。 TRAIN_ITERS 200 非必填。训练迭代周期。根据实际需要修改。 MBS 2 非必填。表示流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 该值与TP和PP以及模型大小相关,可根据实际情况进行调整。默认值为2。取值建议如下: Llama2-7B:4 Llama2-13B:4 Llama2-70B:2 GBS 1024 非必填。表示训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长。取值默认值: Llama2-7B:64 Llama2-13B:64 Llama2-70B:1024 TP 8 非必填。表示张量并行。默认值为8,取值建议: Llama2-7B:8 Llama2-13B:8 Llama2-70B:8 PP 8 非必填。表示流水线并行。取值建议: Llama2-7B:1,一般此值与运行节点数相等 Llama2-13B:1,一般此值与运行节点数相等 Llama2-70B:大于等于4,建议值为8,一般选用几台机器训练则值为几。 RUN_TYPE lora 必填。表示训练类型,lora表示LoRA微调训练。 MASTER_ADDR xx.xx.xx.xx 多机必填,单机忽略;指定主节点IP地址,多台机器中需要指定一个节点IP为主节点IP。 一般指定第一个节点IP为主节点IP。 NNODES 8 多机必填,单机忽略;节点总数,单机写1,双机写2,8机写8。 NODE_RANK 0 多机必填,单机忽略;节点序号,当前节点ID,一般从0开始,单机默认是0。以8机训练为例,节点ID依次为(0 1 2 3 4 5 6 7);一般ID为0的节点设置为主节点IP。 WORK_DIR /home/ma-user/ws 非必填。容器的工作目录。训练的权重文件保存在此路径下。默认值为:/home/ma-user/ws。
  • Step2 LoRA微调权重转换 LoRA微调训练前,需要先把训练权重文件转换为Megatron格式。 LoRA微调训练和SFT全参微调使用的是同一个HuggingFace权重文件转换为Megatron格式后的结果也是通用的。 如果在SFT微调任务中已经完成了HuggingFace权重转换操作,此处无需重复操作,可以直接使用SFT微调中的权重转换结果。 如果前面没有执行HuggingFace权重转换任务,可以参考SFT全参微调权重转换章节完成。
  • Step3 水表读数识别 执行如下命令安装mmocr套件。 python manage.py install algorithm mmocr==0.2.1 安装mmocr套件后,“./algorithms/mmocr/config/textrecog”文件夹中包括config.py(算法外壳配置)和robustscanner_r31_academic.py(模型结构),需要根据所需算法和数据集路径修改配置文件。以下以robust_scanner算法为例。 图15 进入textrecog文件夹 修改“robustscanner_r31_academic.py”,如下所示: ... train_prefix = 'data/raw/water_meter_crop/' # 修改数据集路径改为水表ocr识别数据集路径 train_img_prefix1 = train_prefix + 'train' train_ann_file1 = train_prefix + 'train.txt' ... test_prefix = 'data/raw/water_meter_crop/' test_img_prefix1 = test_prefix + 'val/' test_ann_file1 = test_prefix + 'val.txt' 执行如下命令安装robust_scanner预训练模型。 python manage.py install model mmocr:textrecog/robust_scanner/robustscanner_r31_academic 图16 安装robust_scanner模型 训练OCR模型。 初次使用mmcv时需要编译mmcv-full,该过程较慢,可以直接使用官方预编译的依赖包。 预编译包URL: https://download.openmmlab.com/mmcv/dist/cu102/torch1.6.0/index.html pip uninstall mmcv -y pip install https://download.openmmlab.com/mmcv/dist/cu102/torch1.6.0/mmcv_full-1.3.9-cp37-cp37m-manylinux1_x86_64.whl pip install rapidfuzz==2.15.1 pip install numpy -U 修改“./algorithms/mmocr/config/textrecog/config.py”,将EPOCHS(迭代数量)改为2。 图17 修改textrecog文件夹下的config.py文件 图18 迭代数量修改为2 执行如下命令训练OCR模型。(仅使用GPU进行训练,大概需要几分钟) python manage.py run --cfg algorithms/mmocr/config/textrecog/config.py 图19 OCR模型训练结果 训练好的模型会保存在指定位置中,默认为output/robustscanner_r31_academic/文件夹中。 验证模型效果。 模型训练完成后,可以在验证集上计算模型的指标,首先修改配置文件的模型位置。 修改“./algorithms/mmocr/config/textrecog/config.py” #config.py ... model_path = './output/robustscanner_r31_academic/latest.pth' ... 执行如下命令验证模型。 python manage.py run --cfg algorithms/mmocr/config/textrecog/config.py --pipeline evaluate 图20 计算模型的指标 可选:模型推理。 模型推理能够指定某一张图片,并且推理出图片的分割区域,并进行可视化。首先需要指定待推理的图片路径,修改“./algorithms/mmocr/config/textrecog/config.py”,具体如下。 ... infer_img_file='./data/raw/water_meter_crop/val/train_10.jpg' # 指定需要推理的图片路径 ... 执行如下命令推理。 python manage.py run --cfg algorithms/mmocr/config/textrecog/config.py --pipeline infer 图21 模型推理结果 推理输出的图片路径在“output/robustscanner_r31_academic/vis”文件夹下。 图22 表盘读数识别结果图 执行如下命令导出算法SDK。 python manage.py export --cfg algorithms/mmocr/config/textrecog/config.py
  • Step2 使用deeplabv3完成水表区域分割任务 执行如下命令安装ivgSegmentation套件。 python manage.py install algorithm ivgSegmentation==1.0.2 图4 ivgSegmentation套件安装成功 如果提示ivgSegmentation版本不正确,可以通过命令python manage.py list algorithm查询版本。 安装ivgSegmentation套件后,在JupyterLab界面左侧的工程目录中进入“./algorithms/ivgSegmentation/config/sample”文件夹中查看目前支持的分割模型,以sample为例(sample默认的算法就是deeplabv3),文件夹中包括config.py(算法外壳配置)和deeplabv3_resnet50_standard-sample_512x1024.py(模型结构)。 图5 进入sample文件夹 表盘分割只需要区分背景和读数区域,因此属于二分类,需要根据项目所需数据集对配置文件进行修改,如下所示: 修改“config.py”文件。 图6 修改sample文件夹下的config.py文件 # config.py ... alg_cfg = dict( ... data_root='data/raw/water_meter_segmentation', # 修改为真实路径本地分割数据集路径 ... ) 修改完后按Ctrl+S保存。 修改“deeplabv3_resnet50_standard-sample_512x1024.py”文件。 图7 修改deeplabv3_resnet50_standard-sample_512x1024.py文件 # deeplabv3_resnet50_standard-sample_512x1024.py gpus=[0] ... data_cfg = dict( ... num_classes=2, # 修改为2类 ... ... train_scale=(512, 512), # (h, w)#size全部修改为(512, 512) ... train_crop_size=(512, 512), # (h, w) ... test_scale=(512, 512), # (h, w) ... infer_scale=(512, 512), # (h, w) ) 修改完按Ctrl+S保存。 在water_meter工程目录下,执行如下命令安装deeplabv3预训练模型。 python manage.py install model ivgSegmentation:deeplab/deeplabv3_resnet50_cityscapes_512x1024 图8 安装deeplabv3预训练模型 执行如下命令训练分割模型。(推荐使用GPU进行训练) python manage.py run --cfg algorithms/ivgSegmentation/config/sample/config.py --gpus 0 图9 分割模型训练结果 训练好的模型会保存在指定位置中,默认为“./output/deeplabv3_resnet50_standard-sample_512x1024/checkpoints/”中。 验证模型效果。 模型训练完成后,可以在验证集上计算模型的指标,首先修改配置文件的模型位置。 修改“config.py”文件,修改完按Ctrl+S保存。 # config.py ... alg_cfg = dict( ... load_from='./output/deeplabv3_resnet50_standard-sample_512x1024/checkpoints/checkpoint_best.pth.tar', # 修改训练模型的路径 ... ) 执行如下命令计算模型指标。 python manage.py run --cfg algorithms/ivgSegmentation/config/sample/config.py --pipeline evaluate 图10 模型指标计算结果 模型推理。 模型推理能够指定某一张图片,并且推理出图片的分割区域,并进行可视化,首先需要指定需要推理的图片路径。 修改“config.py”文件,修改完按Ctrl+S保存。 alg_cfg = dict( ... img_file='./data/raw/water_meter_segmentation/image/train_10.jpg' # 指定需要推理的图片路径 ... ) 执行如下命令推理模型。 python manage.py run --cfg algorithms/ivgSegmentation/config/sample/config.py --pipeline infer 图11 表盘分割模型推理结果 推理输出的图片路径在“./output/deeplabv3_resnet50_standard-sample_512x1024”下。 图12 水表表盘分割结果可视化 执行如下命令导出算法SDK。 python manage.py export --cfg algorithms/ivgSegmentation/config/sample/config.py --is_deploy 算法开发套件支持将模型导出成一个模型SDK,方便进行模型部署等下游任务。SDK导出的路径为“./export/deeplabv3_resnet50_standard-sample_512x1024/Linux_x86_64_GPU_PyTorch_Common_py” 图13 SDK导出路径 图14 SDK导出示意图
  • 准备数据 登录OBS控制台,创建OBS对象桶,区域选择“华北-北京四”。 登录ModelArts控制台,选择控制台区域为“华北-北京四”。 在“全局配置”页面查看是否已经配置授权,允许ModelArts访问OBS。如果没有配置授权,请参考配置访问授权(全局配置)添加授权。 分别下载本案例的数据集,水表表盘分割数据集和水表表盘读数OCR识别数据集到OBS桶中,单击数据集右侧的“下载”,弹出“选择云服务区域”,选择区域后单击“确定”进入下载详情页面。下载方式选择“ 对象存储服务 (OBS)”,填写OBS路径信息等,详细步骤请参考下载数据集。 OBS路径示例如下: obs://{OBS桶名称}/water_meter_segmentation 水表表盘分割数据集 obs://{OBS桶名称}/water_meter_crop 水表表盘读数OCR识别数据集 从AI Gallery下载数据集免费,但是数据集存储在OBS桶中会收取少量费用,具体计费请参见OBS价格详情页,案例使用完成后请及时清除资源和数据。
  • Step1 创建算法工程 在JupyterLab的Terminal中,在work目录下执行ma-cli createproject命令创建工程,根据提示输入工程名称,例如:water_meter。然后按回车键选择默认参数(连续按五次回车),并选择跳过资产安装步骤(选择6)。 图2 创建工程 执行以下命令进入工程目录。 cd water_meter 执行以下命令复制项目数据到Notebook中。 python manage.py copy --source {obs_dataset_path} --dest ./data/raw/water_meter_crop python manage.py copy --source {obs_dataset_path} --dest ./data/raw/water_meter_segmentation {obs_dataset_path}路径为Step1 准备数据中下载到OBS中的数据集路径,比如“obs://{OBS桶名称}/water_meter_segmentation”和“obs://{OBS桶名称}/water_meter_crop” 图3 复制数据集到Notebook中
  • 操作流程 开始使用如下样例前,请务必按准备工作指导完成必要操作。 Step1 准备算法:在AI Gallery中订阅算法。 Step2 准备训练数据:准备训练数据。创建OBS桶和文件夹,并将训练数据上传到OBS中。 Step3 全量微调训练:对算法进行全量微调。 Step4 部署模型并推理预测:训练完成后,部署模型并进行推理预测。 Step5 清理资源:运行完成后,停止服务并删除OBS中的数据,避免不必要的资源浪费。
  • Step2 准备训练数据 以Llama-7B为例,全量微调训练使用的是开源的wiki2048数据集。下载数据集之后,需要将开源数据集转化为MindSpore可以读取的数据格式,然后上传到OBS桶中,用于后续的算法训练。 下载WikiText2数据集到用户本地电脑,并转化数据集格式为MindSpore可以读取的数据格式(xxx.mindrecord.db和xxx.mindrecord),具体操作请参见文档。 请参考以下要求创建OBS桶中的文件夹,并上传数据到OBS桶中,用于后续的算法微调训练。 OBS文件夹目录要求如下: {OBS桶} # OBS对象桶,用户可以自定义名称,例如:llm-mindspore-ma -{OBS文件夹} # OBS文件夹,用于存放训练输入数据,用户可以自定义名称,例如:wiki2048 - wiki2048.mindrecord.db # 训练数据集 - wiki2048.mindrecord # 训练数据集 -{OBS文件夹} #训练输出路径,用于存放训练生成的模型文件等,用户可以自定义名称,例如:output -{OBS文件夹} #作业日志路径,用于存放训练日志,用户可以自定义名称,例如:log 本文档中使用的是开源数据集,主要用于跑通流程和体验,客户的实际业务开展需要根据数据集格式要求匹配自己的业务数据来做精细的调参。
  • 第三方案例列表 第三方案例来源为华为云开发者社区“云驻计划”。由于ModelArts产品的持续更新和迭代,第三方案例中的界面和步骤可能因时效性而与最新产品有所差异,仅供学习和参考。 表1 第三方案例列表 分类 文章名称 作者 自动学习 2步打通ModelArts和Astro实现AI应用落地 胡琦 开发环境 想不想让一张静态的照片动起来 林欣 基于TensorFlow训练轻量化ssdlite_mbv2人脸手机检测模型 AI练习生 基于ModelArts的手写数字识别 AXYZdong AI 文字编辑图片 instruct-pix2pix 案例 AXYZdong 推理部署 上线二维码检测识别服务 林欣 使用ModelArts对8类常见生活垃圾进行分类 福州司马懿 使用ModelArts搭建"花卉种类识别"服务 福州司马懿
  • Step3 LoRA微调超参配置 LoRA微调训练脚本qwen.sh,存放在llm_train/AscendSpeed/scripts/qwen/目录下。训练前,可以根据实际需要修改超参配置。 微调任务配置,操作同预训练配置类似,不同点为RUN_TYPE类型不同,以及输入输出路径的配置的不同。 表1 LoRA微调超参配置 参数 示例值 参数说明 DATASET_PATH /home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/pretrain/alpaca_ft 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/Qwen-14B 必填。加载tokenizer时,tokenizer存放地址。 请根据实际规划修改。 MODEL_TYPE 14B 必填。表示模型加载类型,根据实际填写7B、14B或72B。 TRAIN_ITERS 300 非必填。训练迭代周期。根据实际需要修改。 MBS 4 非必填。表示流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 该值与TP和PP以及模型大小相关,可根据实际情况进行调整。默认值为4。取值建议如下: Qwen-14B:4 Qwen-7B:2 Qwen-72B:1 GBS 64 非必填。表示训练中所有机器一个step所处理的样本量,影响每一次训练迭代的时长。于PP(流水线并行)值大于1的场景,适当增大GBS值吞吐性能会有所提升。 TP 8 非必填。表示张量并行。默认值为8,取值建议: Qwen-14B:8 Qwen-7B:4 Qwen-72B:8 PP 1 非必填。表示流水线并行。默认值为1,取值建议: Qwen-14B:1 Qwen-7B:1 Qwen-72B:大于等于5,例如5机填写5,8机填8。 RUN_TYPE lora 必填。表示训练类型。lora表示LoRA微调。 MASTER_ADDR localhost 多机必填。主节点IP地址,多台机器中指定一个节点IP为主节点IP。 一般指定第一个节点IP为主节点IP。 NNODES 1 多机必填。节点总数,如为双机,则写2。单机默认是1。 NODE_RANK 0 多机必填。节点序号,当前节点ID,一般从0开始。单机默认是0。以Qwen-72B 5机训练为例,节点ID依次为(0 1 2 3 4);一般ID为0的节点设置为主节点IP。 MODEL_PATH /home/ma-user/ws/processed_for_ma_input/Qwen-14B/converted_weights 必填。加载的权重文件路径。SFT微调权重转换章节中将HuggingFace格式转化为Megatron格式的权重文件。 WORK_DIR /home/ma-user/ws 非必填。容器的工作目录,训练的权重文件保存在此路径下。默认值为:/home/ma-user/ws。 SEQ_LEN 4096 非必填。默认值为4096。 在qwen.sh脚本默认情况下Lora微调的配置为: --lora-r 16 --lora-alpha 32 LoRA微调训练的计算量要小于预训练,可以适当增加MBS的值,这里建议: 对于7B:TP=4 PP=1 MBS=2 对于14B:TP=8 PP=1 MBS=4 对于72B:TP=8 PP=5 MBS=1
  • Step4 启动训练脚本 请根据表1修改超参值后,再启动训练脚本。 单机启动 以Qwen-14B为例,单机SFT微调启动命令如下。在/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/代码目录下执行。 MODEL_TYPE=14B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Qwen-14B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/converted_weights TRAIN_ITERS=300 MBS=4 GBS=64 TP=8 PP=1 SEQ_LEN=4096 WORK_DIR=/home/ma-user/ws sh scripts/qwen/qwen.sh 其中 MODEL_TYPE 、RUN_TYPE、DATA_PATH、TOKENIZER_MODEL、MODEL_PATH为必填;TRAIN_ITERS、MBS、GBS、TP、PP、SEQ_LEN为非必填,有默认值。 多机启动 以Qwen-14B为例,多台机器执行训练启动命令如下。多机启动需要在每个节点上执行,此处以双机为例。在/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/代码目录下执行。 第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=0 MODEL_TYPE=14B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Qwen-14B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/converted_weights TRAIN_ITERS=300 MBS=4 GBS=64 TP=8 PP=1 SEQ_LEN=4096 WORK_DIR=/home/ma-user/ws sh scripts/qwen/qwen.sh ... ... # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=1 MODEL_TYPE=14B RUN_TYPE=lora DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/alpaca_ft TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Qwen-14B MODEL_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/converted_weights TRAIN_ITERS=300 MBS=4 GBS=64 TP=8 PP=1 SEQ_LEN=4096 WORK_DIR=/home/ma-user/ws sh scripts/qwen/qwen.sh 以上命令多台机器执行时,只有${NODE_RANK}的节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、 NODE_RANK、 NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH、MODEL_PATH为必填;TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR为非必填,有默认值。 训练完成后,请参考查看日志和性能章节,查看LoRA微调训练的日志和性能。
  • Step2 LoRA微调权重转换 LoRA微调训练前,需要先把训练权重文件转换为Megatron格式。 LoRA微调训练和SFT全参微调使用的是同一个HuggingFace权重文件转换为Megatron格式后的结果也是通用的。 如果在SFT微调任务中已经完成了HuggingFace权重转换操作,此处无需重复操作,可以直接使用SFT微调中的权重转换结果。 如果前面没有执行HuggingFace权重转换任务,可以参考SFT微调权重转换章节完成。
  • 核心概念 推理业务昇腾迁移整体流程及工具链 图1 推理业务昇腾迁移整体路径 推理业务昇腾迁移整体分为七个大的步骤,并以完整工具链覆盖全链路: 迁移评估:针对迁移可行性、工作量,以及可能的性能收益进行大致的预估。 环境准备:利用ModelArts提供的开发环境一键式准备好迁移、调测需要的运行环境与工具链。 模型适配:针对昇腾迁移模型必要的转换和改造。 模型准备,导出和保存确定格式的模型。 转换参数准备,准备模型业务相关的关键参数。 模型转换,包含模型转换、优化和量化等。 应用集成。 针对转换的模型运行时应用层适配。 数据预处理。 模型编排。 模型裁剪。 精度校验。 精度对比误差统计工具。 自动化精度对比工具。 网络结构可视化工具。 性能调优。 性能测试。 性能调优三板斧。 性能分析与诊断。 迁移测试报告。 推理迁移验收表。 ModelArts开发环境 ModelArts作为华为云上的 AI开发平台 ,提供交互式云上开发环境,包含标准化昇腾算力资源和完整的迁移工具链,帮助用户完成昇腾迁移的调测过程,进一步可在平台上将迁移的模型一键部署成为在线服务向外提供推理服务,或者运行到自己的运行环境中。 MindSpore Lite 华为自研的AI推理引擎,后端对于昇腾有充分的适配,模型转换后可以在昇腾上获得更好的性能,配合丰富的适配工具链,降低迁移成本,该工具在推理迁移工作的预置镜像已安装,可在镜像中直接使用(见环境准备)。关于MindSpore Lite详细介绍可参考MindSpore Lite文档。
  • 逐个替换模型,检测有问题的模型 该方式主要是通过模型替换,先定位出具体哪个模型引入的误差,进一步诊断具体的模型中哪个算子或者操作导致效果问题,模型替换原理如下图所示。通过设置开关选项(是否使用onnx模型),控制模型推理时,模型使用的是onnx模型或是mindir的模型。 图1 精度诊断流程 一般情况下,onnx模型推理的结果可以认为是标杆数据,单独替换某个onnx模型为MindSpore Lite模型,运行得到的结果再与标杆数据做对比,如果没有差异则说明pipeline的差异不是由当前替换的MindSpore Lite模型引入。 如果有差异,则说明当前模型与原始onnx的结果存在差异。依次单独替换onnx模型为对应的MindSpore Lite模型,从而定位出有差异的模型。在模型初始化的代码块已经添加了use_ascend参数,修改参考如下: 图2 代码修改 以上述现象为例,通过修改use_ascend参数值对模型替换,可以发现:当text_encoder模型为onnx模型,其余模型为mindir模型时,能够得到和标杆数据相同的输出,因此可以判断出转换得到的text_encoder模型是产生pipeline精度误差的根因。通过下一小节可以进一步确认模型精度的差异。
  • pipeline应用准备 当前迁移路径是从onnx模型转换到mindir模型,再用mindspore lite做推理, 所以迁移前需要用户先准备好自己的onnx pipeline。下文以官方开源的图生图的Stable Diffusion v1.5的onnx pipeline代码为例进行说明。 进入容器环境,创建自己的工作目录,由于在Snt9B裸金属服务器环境配置指南的配置环境步骤中,在启动容器时将物理机的home目录挂载到容器的“/home_host”目录下,该目录下可以直接使用上传到物理机“home”目录下的文件。本文中,将基于容器的“/home_host”目录创建工作目录: mkdir -p /home_host/work cd /home_host/work 在迁移onnx pipeline前,首先需要确保原始的onnx pipeline能在昇腾机器的ARM CPU上正常执行。进入容器环境后,安装依赖包。 pip install torch==1.11.0 onnx transformers==4.27.4 accelerate onnxruntime diffusers==0.11.1 下载git lfs,用于下载git仓中的大文件。由于欧拉源上没有git-lfs包,所以需要从压缩包中解压使用,在浏览器中输入如下地址下载git-lfs压缩包并上传到服务器的/home目录。 https://github.com/git-lfs/git-lfs/releases/download/v3.2.0/git-lfs-linux-arm64-v3.2.0.tar.gz 安装git lfs: tar -zxvf git-lfs-linux-arm64-v3.2.0.tar.gz cd git-lfs-3.2.0 sh install.sh rm -rf git-lfs-linux-arm64-v3.2.0.tar.gz git-lfs-3.2.0 通过git下载sd pytorch模型。 该模型用于获取模型shape,也可以转换生成onnx模型。后文中的modelarts-ascend仓库已经给出了模型shape,可以直接使用,onnx模型也可以单独下载。 # git clone sd模型 git lfs install mkdir -p /home_host/work/runwayml cd /home_host/work/runwayml git clone https://huggingface.co/runwayml/stable-diffusion-v1-5/ -b main # 将下载的文件夹重命名,以便后续脚本中引用 mv stable-diffusion-v1-5 pytorch_models 这里由于Huggingface网站的限制以及模型文件的大小原因,很可能会下载失败。可以进到Huggingface网站,从浏览器下载模型后,再手工上传到物理机/home/pytorch_models目录下。 通过git下载sd onnx模型。 # git clone sd模型 git lfs install cd /home_host/work/runwayml git clone https://huggingface.co/runwayml/stable-diffusion-v1-5 -b onnx # 将下载的文件夹重命名,以便后续脚本中引用 mv stable-diffusion-v1-5 onnx_models 这里由于Huggingface网站的限制以及模型文件的大小原因,很可能会下载失败。可以进到Huggingface网站,从浏览器下载模型后,再手工上传到物理机/home/onnx_models目录下。 下载好模型后,需要编写推理脚本。为了便于讲解,本指导中所需的代码已发布在ModelArts代码仓,可以使用如下命令下载推理脚本样例代码: cd /home_host/work git clone https://gitee.com/ModelArts/modelarts-ascend.git ll modelarts-ascend/examples/AIGC/stable_diffusion 代码目录如下图所示,onnx_pipeline.py是图生图推理脚本。mslite_pipeline.py、mslite_model_proxy.py、pipeline_onnx_stable_diffusion_img2img_mslite.py是迁移后的文件,其中mslite_model_proxy.py是代理模型类,pipeline_onnx_stable_diffusion_img2img_mslite.py是从Stable Diffusion源码中的pipeline复制并修改的,这些文件在后续的章节中会使用并做进一步讲解。 图1 代码目录 将“modelarts-ascend/examples/AIGC/stable_diffusion/onnx_pipeline.py”文件中的“onnx_model_path”改为步骤6中下载的onnx_models地址“/home_host/work/runwayml/onnx_models”。执行推理脚本进行测试,这里使用的推理硬件是CPU,验证待迁移的代码能在CPU跑通,由于是CPU执行会比较慢,大约需要15分钟左右: cd modelarts-ascend/examples/AIGC/stable_diffusion # 必须执行该命令,否则会报错找不到sketch-mountains-input.jpg python onnx_pipeline.py 生成的图片fantasy_landscape.png会保存在当前路径下,该图片也可以作为后期精度校验的一个对比。 图2 生成图片 父主题: AIGC推理业务昇腾迁移指导
  • 场景描述 目标:构建安装如下软件的容器镜像,并在ModelArts平台上使用Ascend规格资源运行训练任务。 ubuntu-18.04 cann-6.3.RC2 (商用版本) python-3.7.13 mindspore-2.1.1 本教程以cann-6.3.RC2.、mindspore-2.1.1为例介绍。 本示例仅用于示意Ascend容器镜像制作流程,且在匹配正确的Ascend驱动/固件版本的专属资源池上运行通过。
  • Step2 上传Summary数据 在开发环境中使用TensorBoard可视化功能,需要用到Summary数据。 Summary数据可以直接传到开发环境的这个路径下/home/ma-user/work/,也可以放到OBS并行文件系统中。 Summary数据上传到Notebook路径/home/ma-user/work/下的方式,请参见上传数据至Notebook。 Summary数据如果是通过OBS并行文件系统挂载到Notebook中,请将模型训练时产生的Summary文件先上传到OBS并行文件系统,并确保OBS并行文件系统与ModelArts在同一区域。在Notebook中启动TensorBoard时,Notebook会自动从挂载的OBS并行文件系统目录中读取Summary数据。
  • 相关操作 关闭TensorBoard方式如下: 方式1:单击下图所示的,进入TensorBoard实例管理界面,该界面记录了所有启动的TensorBoard实例,单击对应实例后面的SHUT DOWN即可停止该实例。 图8 单击SHUT DOWN停该实例 方式2:在开发环境JupyterLab中的“.ipynb”文件窗口中输入命令,关闭TensorBoard。PID在启动界面有提示或者通过ps -ef | grep tensorboard查看。 !kill PID 方式3:单击下方红框中的按钮可以关闭所有启动的TensorBoard实例。 图9 关闭所有启动的TensorBoard实例 方式4(不推荐):直接在JupyterLab中上关闭TensorBoard窗口,此方式仅关闭可视化窗口,并未关闭后台。
  • Step3 启动TensorBoard 在开发环境的JupyterLab中打开TensorBoard有多种方法。可根据使用习惯选择。 图1 JupyterLab中打开TensorBoard的方法 方式1(推荐): 在JupyterLab左侧导航创建名为“summary”的文件夹,将数据上传到“/home/ma-user/work/summary”路径。注:文件夹命名只能为summary否则无法使用。 进入“summary”文件夹,单击方式1,直接进入TensorBoard可视化界面。如图2所示。 图2 TensorBoard界面(1) 方式2: 用户可以自行升级除2.4.0之外的TensorBoard,但需注意升级后只有方式2使用新的TensorBoard,其余方式保持TensorBoard2.1.1不变。
  • 配置ModelArts委托权限 给用户配置ModelArts委托授权,允许ModelArts服务在运行时访问OBS等依赖服务。 使用华为云账号登录ModelArts管理控制台,在左侧导航栏单击“全局配置”,进入“全局配置”页面,单击“添加授权”。 在弹出的“访问授权”窗口中, 授权对象类型:所有用户 委托选择:新增委托 权限配置:普通用户 选择完成后勾选“我已经详细阅读并同意《ModelArts服务声明》”,然后单击“创建”。 图1 配置委托访问授权 完成配置后,在ModelArts控制台的全局配置列表,可查看到此账号的委托配置信息。 图2 查看委托配置信息 父主题: 权限配置
  • 单模型性能测试工具Mindspore lite benchmark 可以直接使用benchmark命令测试mindir模型性能,用来对比调优前后性能是否有所提升。 # shell cd /home_host/work benchmark --modelFile=diffusers/scripts/mindir_models/text_encoder.mindir --device=Ascend 上述命令中:modelFile指定生成的mindir模型文件;device指定运行推理的设备。其他用法参考benchmark文档。 测试结果如下所示: 图1 测试结果 父主题: 性能调优
  • 步骤4:运行工作流 在自动学习的运行总览页面,会产生一条工作流。工作流会自动从数据标注节点开始,依次运行数据集版本发布、数据校验、物体检测、模型注册、服务部署等节点,直至工作流全部运行完成。您需要做的是: 在数据标注节点,待数据标注节点变为橘色即为“等待操作”状态,双击数据标注节点,打开数据标注节点的运行详情页面。前往实例详情页确认所有图片是否都标注完成,确认无误后,回到工作流页面单击“继续运行”。 在“确认是否继续允许”的弹窗中,单击“确定”,工作流会继续从数据标注节点依次运行到服务部署节点。该段时间不需要用户做任何操作。 当工作流运行到“服务部署”节点,“服务部署”节点会变成橙色,双击“服务部署”节点。在服务部署页签中,可以看到状态变为了“等待输入”。 需要选择填写以下两个参数,其他参数均为默认值,保持不变。 计算节点规格:根据您的实际需求选择相应的规格。 是否自动停止:为避免资源浪费,建议打开自动停止开关,根据您的实际需要,选择自动停止时间,也可以自定义自动停止的时间。 图3 选择计算节点规格 图4 设置自动停止 参数填写完毕之后,单击运行状况右边的“继续运行”,单击确认弹窗中的“确定”即可继续完成工作流的运行。
  • 步骤3:创建自动学习物体检测项目 确保数据集创建完成且可正常使用后,在ModelArts控制台,左侧导航栏选择“自动学习”默认进入新版自动学习页面,选择物体检测项目,单击“创建项目”。 进入“创建物体检测”页面后,填写相关参数。 计费模式:默认按需计费。 名称:自行创建项目名称。 描述:自行描述项目详情,例如口罩检测。 数据集:下拉选择已下载的数据集(步骤2中已成功导入的数据集,默认为下拉数据集列表中的第一个数据集)。 输出路径:选择步骤2的3中的数据集输出位置。 训练规格:根据您的实际需要选择对应的训练规格。 确认无误后单击右下角“创建项目”可自动跳转至自动学习的运行总览页面。
  • 步骤1:准备工作 注册华为账号 并开通华为云、实名认证 注册华为账号并开通华为云 进行实名认证 配置委托访问授权 ModelArts使用过程中涉及到OBS、SWR、IEF等服务交互,首次使用ModelArts需要用户配置委托授权,允许访问这些依赖服务。 使用华为云账号登录ModelArts管理控制台,在左侧导航栏单击“全局配置”,进入“全局配置”页面,单击“添加授权”。 在弹出的“访问授权”窗口中,授权对象类型选“所有用户”,委托选择选“新增委托”,权限配置选择“普通用户”,并勾选“我已经详细阅读并同意《ModelArts服务声明》”,然后单击“创建”。 完成配置后,在ModelArts控制台的全局配置列表,可查看到此账号的委托配置信息。
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-3rdLLM-x.x.x.zip的llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态,动态性能评测脚本 父主题: 推理性能测试
  • 预训练超参配置 预训练脚本qwen.sh,存放在“xxx-Ascend/llm_train/AscendSpeed/scripts/qwen”目录下。训练前,需要根据实际需要配置超参。 表1 预训练超参配置 参数 示例值 参数说明 DATASET_PATH /home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/pretrain/alpaca_text_document 必填。训练时指定的输入数据路径。一般为数据地址/处理后的数据前缀名,不加文件类型后缀。 请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/Qwen-14B 必填。加载tokenizer时,tokenizer存放地址。 请根据实际规划修改。 MODEL_TYPE 14B 必填。表示模型加载类型,根据实际填写7B、14B或72B。 TRAIN_ITERS 200 非必填。表示训练迭代周期,根据实际需要修改。 MBS 2 非必填。表示流水线并行中一个micro batch所处理的样本量。在流水线并行中,为了减少气泡时间,会将一个step的数据切分成多个micro batch。 该值与TP和PP以及模型大小相关,可根据实际情况进行调整。默认值为2。取值建议如下: Qwen-14B:2 Qwen-7B:2 Qwen-72B:1 GBS 64 非必填。表示训练中所有机器一个step所处理的样本量。影响每一次训练迭代的时长。 默认值为64。对于PP(流水线并行)值大于1的场景,增大GBS值吞吐性能会有提升。 TP 8 非必填。表示张量并行。默认值为8,取值建议: Qwen-14B:8 Qwen-7B:4 Qwen-72B:8 PP 1 非必填。表示流水线并行。默认值为1,取值建议: Qwen-14B:1 Qwen-7B:1 Qwen-72B:大于等于5,例如5机填写5,8机填8。 RUN_TYPE pretrain 必填。表示训练类型,根据实际训练任务类型选择。取值说明: pretrain:表示预训练 retrain:表示断点续训 sft:表示SFT微调训练 lora:表示LoRA微调训练 MASTER_ADDR localhost 多机必填。主节点IP地址,多台机器中需要指定一个节点IP为主节点IP。 一般指定第一个节点IP为主节点IP。 NNODES 1 多机必填。节点总数,如为双机,则写2。单机默认是1。 NODE_RANK 0 多机必填。节点序号,当前节点ID,一般从0开始,单机默认是0。以Qwen-72B 5机训练为例,节点ID依次为(0 1 2 3 4);一般ID为0的节点设置为主节点IP。 WORK_DIR /home/ma-user/ws 容器的工作目录。训练的权重文件保存在此路径下。非必填,默认值为:/home/ma-user/ws。 SEQ_LEN 4096 非必填。默认值为4096。
  • 启动训练脚本 请根据表1修改超参值后,再启动训练脚本。 单机启动 以Qwen-14B为例,单机训练启动样例命令如下。在/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/代码目录下。 MODEL_TYPE=14B RUN_TYPE=pretrain DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/pretrain/alpaca_text_document TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Qwen-14B TRAIN_ITERS=200 MBS=2 GBS=64 TP=8 PP=1 SEQ_LEN=4096 WORK_DIR=/home/ma-user/ws sh scripts/qwen/qwen.sh 其中 MODEL_TYPE 、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH为必填,TRAIN_ITERS、MBS、GBS、TP、PP、SEQ_LEN为非必填,有默认值。 多机启动 以Qwen-14B为例,多台机器执行训练启动命令如下。多机启动需要在每个节点上执行,以双机为例。在/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/代码目录下执行。 #第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=0 MODEL_TYPE=14B RUN_TYPE=pretrain DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/pretrain/alpaca_text_document TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Qwen-14B TRAIN_ITERS=200 MBS=2 GBS=64 TP=8 PP=1 SEQ_LEN=4096 WORK_DIR=/home/ma-user/ws sh scripts/qwen/qwen.sh ... ... # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=1 MODEL_TYPE=14B RUN_TYPE=pretrain DATASET_PATH=/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/pretrain/alpaca_text_document TOKENIZER_PATH=/home/ma-user/ws/tokenizers/Qwen-14B TRAIN_ITERS=200 MBS=2 GBS=64 TP=8 PP=1 SEQ_LEN=4096 WORK_DIR=/home/ma-user/ws sh scripts/qwen/qwen.sh 以上命令多台机器执行时,只有${NODE_RANK}的节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、 NODE_RANK、 NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATASET_PATH、TOKENIZER_PATH为必填,TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR、SEQ_LEN为非必填,有默认值。 等待模型载入 执行训练启动命令后,等待模型载入,当出现“training”关键字时,表示开始训练。训练过程中,训练日志会在最后的Rank节点打印。 图1 等待模型载入 更多查看训练日志和性能操作,请参考查看日志和性能章节。 如果需要使用断点续训练能力,请参考断点续训练章节修改训练脚本。
  • 操作步骤 连接 容器镜像服务 。 登录容器 镜像服务 控制台。 单击右上角“创建组织”,输入组织名称完成组织创建。请自定义组织名称,本示例使用“deep-learning”,下面的命令中涉及到组织名称“deep-learning”也请替换为自定义的值。 选择左侧导航栏的“总览”,单击页面右上角的“登录指令”,在弹出的页面中单击复制登录指令。 此处生成的登录指令有效期为24小时,如果需要长期有效的登录指令,请参见获取长期有效登录指令。获取了长期有效的登录指令后,在有效期内的临时登录指令仍然可以使用。 登录指令末尾的域名为镜像仓库地址,请记录该地址,后面会使用到。 在安装容器引擎的机器中执行上一步复制的登录指令。 登录成功会显示“Login Succeeded”。 在安装容器引擎的机器上执行如下命令,为镜像打标签。 docker tag [镜像名称1:版本名称1] [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2] [镜像名称1:版本名称1]:${image_name}:${image_version}请替换为您所要上传的实际镜像的名称和版本名称。 [镜像仓库地址]:可在SWR控制台上查询,即1.c中登录指令末尾的域名。 [组织名称]:/${organization_name}请替换为您创建的组织。 [镜像名称2:版本名称2]:${image_name}:${image_version}请替换为您期待的镜像名称和镜像版本。 示例: docker tag ${image_name}:${image_version} swr.cn-north-4.myhuaweicloud.com/${organization_name}/${image_name}:${image_version} 上传镜像至镜像仓库。 docker push [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2] 示例: docker push swr.cn-north-4.myhuaweicloud.com/${organization_name}/${image_name}:${image_version} 上传镜像完成后,返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
共100000条