华为云用户手册

  • 步骤四 根据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}
  • 单模型性能测试工具Mindspore lite benchmark 在模型精度对齐后,针对Stable Diffusion模型性能调优,您可以通过AOE工具进行自助性能调优,进一步可以通过profiling工具对于性能瓶颈进行分析,并针对性地做一些调优操作。 您可以直接使用benchmark命令测试mindir模型性能,用来对比调优前后性能是否有所提升。 # shell cd /home_host/work benchmark --modelFile=diffusers/scripts/mindir_models/text_encoder.mindir --device=Ascend 上述命令中:modelFile指定生成的mindir模型文件;device指定运行推理的设备。其他用法请参考benchmark文档。 测试结果如下所示: 图1 测试结果 父主题: 性能调优
  • 训练支持的模型列表 本方案支持以下模型的训练,如表1所示。 表1 支持的模型列表及权重文件地址 支持模型 Template 支持模型参数量 权重文件获取地址 Llama3 llama3 llama3-8b https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct llama3-70b https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct Qwen1.5 qwen qwen1.5-0.5b https://huggingface.co/Qwen/Qwen1.5-0.5B qwen1.5-1.8b https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat qwen1.5-4b https://huggingface.co/Qwen/Qwen1.5-4B qwen1.5-7b https://huggingface.co/Qwen/Qwen1.5-7B-Chat qwen1.5-14b https://huggingface.co/Qwen/Qwen1.5-14B-Chat Yi yi yi-6b https://huggingface.co/01-ai/Yi-6B-Chat yi-34b https://huggingface.co/01-ai/Yi-34B-Chat Qwen2 qwen qwen2-0.5b https://huggingface.co/Qwen/Qwen2-0.5B-Instruct qwen2-1.5b https://huggingface.co/Qwen/Qwen2-1.5B-Instruct qwen2-7b https://huggingface.co/Qwen/Qwen2-7B-Instruct qwen2-72b https://huggingface.co/Qwen/Qwen2-72B-Instruct Falcon2 falcon falcon-11B https://huggingface.co/tiiuae/falcon-11B
  • 模型软件包结构说明 AscendCloud-6.5.901代码包中AscendCloud-LLM代码包结构如下: |——AscendCloud-LLM |──llm_train # 模型训练代码包 |──AscendFactory |──examples/config # config配置文件目录 |──modellink_performance_cfgs.yaml # modellink配置最优参数yaml文件 |──data.tgz # 样例数据压缩包 |──third-party/ # 三方依赖的代码仓,和补丁patch包 |──src/acs_train_solution/ # 训练运行包 |──intall.sh # 安装脚本 |——dependences.yaml # 需要的三方依赖包的版本和下载地址 |──scripts_llamafactory/ # llamafactory兼容旧版本启动方式目录 |──scripts_modellink/ # modelLink兼容旧版本启动方式目录 |──Dockerfile AscendFactory/examples/config配置文件目录: |──AscendFactory/examples/config/ # config配置文件 |──modellink_performance_cfgs.yaml # modellink配置最优参数yaml文件 |──performance_cfgs.yaml # 微调性能配置yaml文件 |──llama_factory_performance_cfgs_VL.yaml # qwen2vl微调yaml配置文件 |──accuracy_cfgs.yaml # 训练精度配置yaml文件 |──llama_factory_cfgs_posttrain.yaml # RM、PPO、DPO训练阶段样例yaml文件 |──llama_factory_performance_baseline.yaml # 性能基线配置 |──llama_factory_accuracy_baseline.yaml # 精度基线配置 该目录下主要放置性能、精度任务的yaml配置文件,包含性能基线、精度基线、训练最佳实践参数等,以上配置文件仅供参考。
  • Step1 检查环境 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买Lite Server资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问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
  • Step5启动推理 本章节介绍SD3模型的推理过程。使用官方提供的已经训练好的模型进行推理,输入prompt生成指定像素的图片。 使用如下命令登录huggingface,并输入个人账号的token: huggingface-cli login 执行如下命令运行推理脚本启动SD3服务: #配置环境变量 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True python run_inference.py 参数说明: height、width: 指定生成图片的长和宽,例如:512、960、1024 prompt_list: prompt列表,可以自行修改。 推理执行成功如下图所示。 图1 推理执行成功
  • Step3 构建镜像 基于官方提供的基础镜像构建自定义镜像diffusers-sd3-inference:0.0.1。参考如下命令编写Dockerfile文件。镜像地址{image_url}请参见表2。 FROM {image_url} RUN mkdir /home/ma-user/diffusers COPY --chown=ma-user:ma-group diffusers/0.29.2 /home/ma-user/diffusers WORKDIR /home/ma-user/diffusers RUN dos2unix diffusers_sd3.patch RUN cd /home/ma-user/diffusers && sh prepare.sh RUN cp attention_processor.py /home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.9/site-packages/diffusers/models/attention_processor.py RUN pip install transformers RUN pip install accelerate RUN pip install sentencepiece
  • Step4 启动镜像 启动容器镜像,推理只需要启动单卡,启动前可以根据实际需要增加修改参数。 docker run -itd --name ${container_name} -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /etc/localtime:/etc/localtime -v /usr/local/Ascend/driver:/usr/local/Ascend/driver -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi --shm-size 60g --device=/dev/davinci_manager --device=/dev/hisi_hdc --device=/dev/devmm_svm --device=/dev/davinci0 --security-opt seccomp=unconfined --network=bridge diffusers-train:0.0.1 bash 参数说明: --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 --device=/dev/davinci0:挂载NPU设备,该推理示例中挂载了1张卡davinci0。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。
  • 镜像版本 本教程中用到基础镜像地址和配套版本关系如下表所示,请提前了解。 表2 基础容器镜像地址 配套软件版本 镜像用途 镜像地址 配套 获取方式 6.3.907版本 基础镜像 swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc2-py_3.9-hce_2.0.2312-aarch64-snt9b-20240727152329-0f2c29a cann_8.0.rc2 pytorch_2.1.0 驱动23.0.6 从SWR拉取 不同软件版本对应的基础镜像地址不同,请严格按照软件版本和镜像配套关系获取基础镜像。
  • 联网下载SimSun.ttf时可能会遇到网络问题 联网下载SimSun.ttf时肯会遇到网络问题 tonkenization_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" 父主题: 常见错误原因和解决方法
  • 开始推理 执行如下命令开始推理。 python infer.py --tokennizer_config_path ./bert-base-chinese/ --mindir_model_path bert_model_dy.mindir --onnx_model_path bert_model.onnx --input_text [MASK]京是中国的[MASK]都。 infer.py是NPU上使用MindSpore Lite推理的样例,不同业务场景需根据实际情况做相应修改。infer.py文件预置在AscendCloud-CV-6.3.910-xxx.zip软件包中。 infer.py中包含使用MindSpore Lite在NPU上推理和使用推理onnxruntime在CPU上推理,结果如下图,按顺序展示[MASK]位置最大概率填充的文字。 如果是静态seq_len推理,修改infer脚本中45行max_length 的值为静态seq_len,并屏蔽或者删除25~26行以及46~49行,如下图所示。
  • 获取代码并上传 上传推理代码AscendCloud-CV-6.3.910-xxx.zip到宿主机的工作目录中,包获取路径请参见表2。 上传代码到宿主机时使用的是root用户,此处需要在容器中执行如下命令统一文件属主为ma-user用户。 #统一文件属主为ma-user用户 sudo chown -R ma-user:ma-group ${container_work_dir} # ${container_work_dir}:/home/ma-user/ws 容器内挂载的目录 #例如:sudo chown -R ma-user:ma-group /home/ma-user/ws
  • 准备推理环境 安装transformers,用于转换模型和推理。 pip install transformers==4.45.2 获取推理代码。 cd ${container_work_dir} unzip AscendCloud-CV-6.3.910-*.zip cd Bert/bert_infer/mindspore_lite 获取bert-base-chinese模型文件。 mkdir bert-base-chinese wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/pytorch_model.bin wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/config.json wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/tokenizer.json wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/tokenizer_config.json wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/vocab.txt pt模型转onnx模型。 python pth2onnx.py ./bert-base-chinese/ ./bert_model.onnx python modify_onnx.py ./bert_model.onnx 该转换脚本用于Fill-Mask 任务,若是其他类型任务请按实际场景修改转换脚本。 onnx模型转mindir格式,执行如下命令,转换完成后会生成bert_model.mindir文件。 converter_lite --fmk=ONNX --modelFile=bert_model.onnx --outputFile=bert_model --inputShape='input_ids:1,512;attention_mask:1,512;token_type_ids:1,512' --saveType=MINDIR --optimize=ascend_oriented 动态seq_len场景下需要创建转换配置文件convert_config.ini,将如下内容写入配置文件: [acl_build_options] input_format="ND" input_shape="input_ids:1,-1;attention_mask:1,-1;token_type_ids:1,-1" ge.dynamicDims="50,50,50;100,100,100;150,150,150;200,200,200;250,250,250;300,300,300;350,350,350;400,400,400;450,450,450;512,512,512" 其中input_shape中的-1表示设置动态seq_len,ge.dynamicDims表示支持的seq_len值,可根据实际业务场景选取要支持的seq_len,上面的配置表示模型的三个输入shape支持[1, seq_len],seq_len取值[50,100, …,450,512]。另外需要注意seq_len不能超过模型支持的最大值,本文中下载的bert模型seq_len最大支持512。关于动态batch配置说明详见:https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0/use/cloud_infer/converter_tool_ascend.html 使用如下转换命令: converter_lite --fmk=ONNX --modelFile=bert_model.onnx --outputFile=bert_model_dy --saveType=MINDIR --optimize=ascend_oriented --configFile=convert_config.ini 使用converter_lite转换模型时,如果报E10001: Value [linux] for parameter [--host_env_os] is invalid. Reason: os not supported, support setting are the OS types of opp package。 建议在启动容器镜像中通过docker run启动容器时,加上--privileged=true参数。
  • 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 docker run -it --net=host \ --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 \ --shm-size=32g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7,可根据需要选择挂载卡数。 ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统,work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 shm-size:共享内存大小。 ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.910-xxx.zip软件包中的AscendCloud-CV-6.3.910-xxx.zip 说明: 包名中的xxx表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E,在此路径中查找下载ModelArts 6.3.910 版本。 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一: 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.2406-aarch64-snt3p-20240906180137-154bd1b 从SWR拉取。
  • 准备容器环境 请参考Lite Server,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 购买Lite Server资源时如果无可选资源规格,需要联系华为云技术支持申请开通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先释放被挂载的NPU或者联系华为方技术支持。 检查驱动版本。 运行如下命令查询驱动版本,回显信息中的“Software Version”字段值表示驱动版本。NPU ID表示设备编号,可通过npu-smi info -l命令查询。 npu-smi info -t board -i NPU ID 如果Atlas 300I Duo推理卡的驱动版本低于24.1.RC2.3,请参考升级文档升级驱动(24.1.RC2.3升级操作和24.1.RC2相同),24.1.RC2.3驱动软件包获取地址参考驱动软件包。 检查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
  • 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
  • 单条请求性能测试 针对openai的/v1/completions以及/v1/chat/completions两个非流式接口,请求体中可以添加可选参数"return_latency",默认为false,若指定该参数为true,则会在相应请求的返回体中返回字段"latency",返回内容如下: prefill_latency(首token时延):请求从到达服务开始到生成首token的耗时 model_prefill_latency(模型计算首token时延):服务从开始计算首token到生成首token的耗时 avg_decode_latency(平均增量token时延):服务计算增量token的平均耗时 time_in_queue(请求排队时间):请求从到达服务开始到开始被调度的耗时 request_latency(请求总时延):请求从到达服务开始到结束的耗时 以上指标单位均是ms,保留2位小数。
  • 动态benchmark 本章节介绍如何进行动态benchmark验证。 获取数据集。动态benchmark需要使用数据集进行测试,可以使用公开数据集,例如Alpaca、ShareGPT。也可以根据业务实际情况,使用generate_datasets.py脚本生成和业务数据分布接近的数据集。 方法一:使用公开数据集 ShareGPT下载地址: https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json Alpaca下载地址: https://github.com/tatsu-lab/stanford_alpaca/blob/main/alpaca_data.json 方法二:使用generate_dataset.py脚本生成数据集方法: 客户通过业务数据,在generate_dataset.py脚本,指定输入输出长度的均值和标准差,生成一定数量的正态分布的数据。具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python generate_dataset.py --dataset custom_datasets.json --tokenizer /path/to/tokenizer \ --min-input 100 --max-input 3600 --avg-input 1800 --std-input 500 \ --min-output 40 --max-output 256 --avg-output 160 --std-output 30 --num-requests 1000 generate_dataset.py脚本执行参数说明如下: --dataset:数据集保存路径,如custom_datasets.json。 --tokenizer:tokenizer路径,可以是HuggingFace的权重路径。backend取值是openai时,tokenizer路径需要和推理服务启动时--model路径保持一致,比如--model /data/nfs/model/llama_7b, --tokenizer也需要为/data/nfs/model/llama_7b,两者要完全一致。 --min-input:输入tokens最小长度,可以根据实际需求设置。 --max-input:输入tokens最大长度,可以根据实际需求设置。 --avg-input:输入tokens长度平均值,可以根据实际需求设置。 --std-input:输入tokens长度方差,可以根据实际需求设置。 --min-output:最小输出tokens长度,可以根据实际需求设置。 --max-output:最大输出tokens长度,可以根据实际需求设置。 --avg-output:输出tokens长度平均值,可以根据实际需求设置。 --std-output:输出tokens长度标准差,可以根据实际需求设置。 --num-requests:输出数据集的数量,可以根据实际需求设置。 进入benchmark_tools目录下,切换一个conda环境。 cd benchmark_tools conda activate python-3.9.10 执行脚本benchmark_serving.py测试动态benchmark。具体操作命令如下,可以根据参数说明修改参数。 python benchmark_serving.py --backend openai --host ${docker_ip} --port 8080 --dataset custom_datasets.json --dataset-type custom \ --tokenizer /path/to/tokenizer --request-rate 0.01 1 2 4 8 10 20 --num-prompts 10 1000 1000 1000 1000 1000 1000 \ --max-tokens 4096 --max-prompt-tokens 3768 --num-scheduler-steps 8 --benchmark-csv benchmark_serving.csv --backend:服务类型,如tgi,vllm,mindspore、openai。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口。 --dataset:数据集路径。 --dataset-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。 --tokenizer:tokenizer路径,可以是HuggingFace的权重路径,backend取值是openai时,tokenizer路径需要和推理服务启动时--model路径保持一致,比如--model /data/nfs/model/llama_7b, --tokenizer也需要为/data/nfs/model/llama_7b,两者要完全一致。 --request-rate:请求频率,支持多个,如 0.1 1 2。实际测试时,会根据request-rate为均值的指数分布来发送请求以模拟真实业务场景。 --num-prompts:某个频率下请求数,支持多个,如 10 100 100,数量需和--request-rate的数量对应。 --max-tokens:输入+输出限制的最大长度,模型启动参数--max-input-length值需要大于该值。 --max-prompt-tokens:输入限制的最大长度,推理时最大输入tokens数量,模型启动参数--max-total-tokens值需要大于该值,tokenizer建议带tokenizer.json的FastTokenizer。 --benchmark-csv:结果保存路径,如benchmark_serving.csv。 --served-model-name: 选择性添加, 选择性添加,在接口中使用的模型名;如果没有配置,则默认为tokenizer。 --num-scheduler-steps: 需和服务启动时配置的num-scheduler-steps一致。默认为1 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图2 动态benchmark测试结果(示意图)
  • 静态benchmark验证 本章节介绍如何进行静态benchmark验证。 已经上传benchmark验证脚本到推理容器中。如果在步骤四 制作推理镜像步骤中已经上传过AscendCloud-LLM-x.x.x.zip并解压,无需重复执行。 进入benchmark_tools目录下,运行静态benchmark验证。 cd benchmark_tools 语言模型脚本相对路径是tools/llm_evaluation/benchmark_tools/benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 python benchmark_parallel.py --backend openai --host ${docker_ip} --port ${port} --tokenizer /path/to/tokenizer --epochs 5 --num-scheduler-steps 8 \ --parallel-num 1 4 8 16 32 --prompt-tokens 1024 2048 --output-tokens 128 256 --benchmark-csv benchmark_parallel.csv 参数说明 --backend:服务类型,支持tgi、vllm、mindspore、openai等后端。本文档使用的推理接口是openai。 --host:服务部署的IP,${docker_ip}替换为宿主机实 际的IP地址。 --port:推理服务端口。 --tokenizer:tokenizer路径,HuggingFace的权重路径。 --epochs:测试轮数,默认取值为5。 --parallel-num:每轮并发数,支持多个,如 1 4 8 16 32。 --prompt-tokens:输入长度,支持多个,如 128 128 2048 2048,数量需和--output-tokens的数量对应。 --output-tokens:输出长度,支持多个,如 128 2048 128 2048,数量需和--prompt-tokens的数量对应。 --benchmark-csv:结果保存文件,如benchmark_parallel.csv。 --num-scheduler-steps: 需和服务启动时配置的num-scheduler-steps一致。默认为1 --served-model-name: 选择性添加,在接口中使用的模型名;如果没有配置,则默认为tokenizer。 --enable-prefix-caching:服务端是否启用enable-prefix-caching特性,默认为false。 --prefix-caching-num:构造的prompt的公共前缀的序列长度,prefix-caching-num值需小于prompt-tokens。 --use-spec-decode:是否使用投机推理进行输出统计,不输入默认为false。当使用投机推理时必须开启,否则会导致输出token数量统计不正确。注:由于投机推理的性能测试使用随机输入意义不大,建议开启--dataset-type、--dataset-path,并选择性开启--use-real-dataset-output-tokens使用真实数据集进行测试。 --dataset-type:当使用投机推理时开启,benchmark使用的数据类型,当前支持random、sharegpt、human-eval三种输入。random表示构造随机token的数据集进行测试;sharegpt表示使用sharegpt数据集进行测试;human-eval数据集表示使用human-eval数据集进行测试。不输入默认为random。注意:当输入为sharegpt或human-eval时,测试数据的输入长度为数据集的真实长度,--prompt-tokens的值会被忽略。 --dataset-path:数据集的路径,仅当--dataset-type为sharegpt或者human-eval的时候生效。 --use-real-dataset-output-tokens:当使用投机推理时开启,设置输出长度是否使用数据集的真实长度,不输入默认为false。当使用该选项时,测试数据的输出长度为数据集的真实长度,--output-tokens的值会被忽略。 --num-speculative-tokens:仅当开启--use-spec-decode时生效,需和服务启动时配置的--num-speculative-tokens一致。默认为-1。当该值大于等于0时,会基于该值计算投机推理的接受率指标。 脚本运行完成后,测试结果保存在benchmark_parallel.csv中,示例如下图所示。 图1 静态benchmark测试结果(示意图)
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-LLM-xxx.zip的llm_tools/llm_evaluation目录下。 代码目录如下: benchmark_tools |--- modal_benchmark |--- modal_benchmark_parallel.py # modal 评测静态性能脚本 |--- utils.py ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态、动态性能评测脚本 ├── requirements.txt # 第三方依赖
  • 训练支持的模型列表 本方案支持以下模型的训练,如表1所示。 表1 支持的模型列表及权重文件地址 支持模型 Template 支持模型参数量 权重文件获取地址 Llama2 llama2 llama2-7b https://huggingface.co/meta-llama/Llama-2-7b-chat-hf llama2-13b https://huggingface.co/meta-llama/Llama-2-13b-chat-hf llama2-70b https://huggingface.co/meta-llama/Llama-2-70b-chat-hf Llama3 llama3 llama3-8b https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct llama3-70b https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct Llama3.1 llama3 llama3.1-8b https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct/tree/main llama3.1-70b https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct/tree/main Qwen1.5 qwen qwen1.5-0.5b https://huggingface.co/Qwen/Qwen1.5-0.5B qwen1.5-1.8b https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat qwen1.5-4b https://huggingface.co/Qwen/Qwen1.5-4B qwen1.5-7b https://huggingface.co/Qwen/Qwen1.5-7B-Chat qwen1.5-14b https://huggingface.co/Qwen/Qwen1.5-14B-Chat Yi yi yi-6b https://huggingface.co/01-ai/Yi-6B-Chat yi-34b https://huggingface.co/01-ai/Yi-34B-Chat Qwen2 qwen qwen2-0.5b https://huggingface.co/Qwen/Qwen2-0.5B-Instruct qwen2-1.5b https://huggingface.co/Qwen/Qwen2-1.5B-Instruct qwen2-7b https://huggingface.co/Qwen/Qwen2-7B-Instruct qwen2-72b https://huggingface.co/Qwen/Qwen2-72B-Instruct Falcon2 falcon falcon-11B https://huggingface.co/tiiuae/falcon-11B GLM-4 glm4 glm4-9b https://huggingface.co/THUDM/glm-4-9b-chat 说明: glm4-9b模型必须使用版本4b556ad4d70c38924cb8c120adbf21a0012de6ce
  • 方案概览 本文档利用训练框架LlamaFactory+华为自研Ascend Snt9B硬件,为用户提供了常见主流开源大模型在ModelArts Lite Server上的微调方案,包括SFT全参微调、LoRA微调、DPO训练方案。 DPO(Direct Preference Optimization):直接偏好优化方法,通过直接优化语言模型来实现对大模型输出的精确把控,不用进行强化学习,也可以准确判断和学习到使用者的偏好,最后,DPO算法还可以与其他优化算法相结合,进一步提高深度学习模型的性能。 SFT监督式微调(Self-training Fine-tuning):是一种利用有标签数据进行模型训练的方法。 它基于一个预先训练好的模型,通过调整模型的参数,使其能够更好地拟合特定任务的数据分布。 与从头开始训练模型相比,监督式微调能够充分利用预训练模型的知识和特征表示,从而加速训练过程并提高模型的性能。 LoRA微调LoRA(Low-Rank Adaptation):微调是一种用于调整大型预训练模型的高效微调技术。 这种方法主要针对如何在保持模型大部分参数固定的同时,通过引入少量可训练参数来调整模型以适应特定任务。 本方案目前仅适用于部分企业客户,完成本方案的部署,需要先联系您所在企业的华为方技术支持。
  • 使用基础镜像 通过E CS 获取和上传基础镜像将镜像上传至SWR服务后,可创建训练作业,在“选择镜像”中选择SWR中基础镜像。 由于基础镜像内需要安装固定版本依赖包,如果直接使用基础镜像进行训练,每次创建训练作业时,训练作业的图1中都需要执行install.sh文件,来安装依赖以及下载完整代码。命令如下: cd /home/ma-user/modelarts/user-job-dir/AscendSpeed; sh ./scripts/install.sh; sh ./scripts/obs_pipeline.sh 使用基础镜像的方法,需要确认训练作业的资源池是否联通公网,否则执行 install.sh 文件时下载代码会失败。因此可以选择配置网络或使用ECS中构建新镜像的方法。 若要对ChatCLMv3、GLMv4系列模型进行训练时,需要修改 install.sh 中的 transformers 的版本。 由默认 transformers==4.45.0 修改为:transformers==4.44.2 创建训练作业后,会在节点机器中使用基础镜像创建docker容器,并在容器内进行分布式训练。而install.sh则会在容器内安装依赖以及下载完整的代码。当训练作业结束后,对应的容器也会同步销毁。 图1 训练作业启动命令 父主题: 准备镜像
  • Step1 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation目录中,代码目录结构如下。 benchmark_eval ├──opencompass.sh #运行opencompass脚本 ├──install.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字 ├──vllm_ppl.py #ppl精度测试脚本 精度评测切换conda环境,确保之前启动服务为vllm接口,进入到benchmark_eval目录下,执行如下命令。 conda activate python-3.9.10 (可选)如果需要在humaneval数据集上评估模型代码能力,请执行此步骤,否则忽略这一步。原因是通过opencompass使用humaneval数据集时,需要执行模型生成的代码。请仔细阅读human_eval/execution.py文件第48-57行的注释,内容参考如下。了解执行模型生成代码可能存在的风险,如果接受这些风险,请取消第58行的注释,执行下面步骤4进行评测。 # WARNING # This program exists to execute untrusted model-generated code. Although # it is highly unlikely that model-generated code will do something overtly # malicious in response to this test suite, model-generated code may act # destructively due to a lack of model capability or alignment. # Users are strongly encouraged to sandbox this evaluation suite so that it # does not perform destructive actions on their host or network. For more # information on how OpenAI sandboxes its code, see the accompanying paper. # Once you have read this disclaimer and taken appropriate precautions, # uncomment the following line and proceed at your own risk: # exec(check_program, exec_globals) #第58行 执行精度测试启动脚本opencompass.sh,具体操作命令如下,可以根据参数说明修改参数。请确保${work_dir} 已经通过export设置。 vllm_path=${vllm_path} \ service_port=${service_port} \ max_out_len=${max_out_len} \ batch_size=${batch_size} \ eval_datasets=${eval_datasets} \ model_name=${model_name} \ benchmark_type=${benchmark_type} \ bash -x opencompass.sh 参数说明: vllm_path:构造vllm评测配置脚本名字,默认为vllm。 service_port:服务端口,与启动服务时的端口保持,比如8080。 max_out_len:在运行类似mmlu、ceval等判别式回答时,max_out_len建议设置小一些,比如16。在运行human_eval等生成式回答(生成式回答是对整体进行评测,少一个字符就可能会导致判断错误)时,max_out_len设置建议长一些,比如512,至少包含第一个回答的全部字段。 batch_size:输入的batch_size大小,不影响精度,只影响得到结果速度。 eval_datasets:评测数据集和评测方法,比如ceval_gen、mmlu_gen,不同数据集可以详见opencompass下面data目录。 model_name:评测模型名称,不需要与启动服务时的模型参数保持一致。 benchmark_type:作为一个保存log结果中的一个变量名,默认选eval。 参考命令: vllm_path=vllm service_port=8080 max_out_len=16 batch_size=2 eval_datasets=mmlu_gen model_name=llama_7b benchmark_type=eval bash -x opencompass.sh (可选)如果同时运行多个数据集,需要将不同数据集通过空格分开,加入到eval_datasets中,比如eval_datasets=ceval_gen mmlu_gen。运行命令如下所示。 cd opencompass python run.py --models vllm --datasets mmlu_gen ceval_gen --debug -w ${output_path} output_path: 要保存的结果路径。 (可选)创建新conda环境,安装vllm和opencompass。执行完之后,在 opencompass/configs/models/vllm/vllm_ppl.py 里是ppl的配置项。由于离线执行推理,消耗的显存相当庞大。其中以下参数需要根据实际来调整。 batch_size, 推理时传入的 prompts 数量,可配合后面的参数适当减少 offline,是否启动离线模型,使用 ppl 时必须为 True tp_size,使用推理的卡数 max_seq_len,推理的上下文长度,和消耗的显存直接相关,建议稍微高于prompts。其中,mmlu和ceval 建议 3200 另外,在 opencompass/opencompass/models/vllm_api.py 中,可以适当调整 gpu_memory_utilization。如果还是 oom,建议适当往下调整。 最后,如果执行报错提示oom,建议修改数据集的shot配置。例如mmlu,可以修改文件 opencompass/configs/datasets/mmlu/mmlu_ppl_ac766d.py 中的 fix_id_list, 将最大值适当调低。 ppl困惑度评测一般用于base权重测评,会将n个选项上拼接上下文,形成n个序列,再计算这n个序列的困惑度(perplexity)。其中,perplexity最小的序列所对应的选项即为这道题的推理结果。运行时间比较长,例如llama3_8b 跑完mmlu要2~3小时。 在npu卡上,使用多卡进行推理时,需要预置变量 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:False 执行脚本如下: python run.py --models vllm_ppl --datasets mmlu_ppl -w ${output_path} output_path 指定保存结果的路径。 参考模型llama3系列模型,数据集mmlu为例,配置如下: 表1 参数配置 模型 max_seq_len batch_size shot数 llama3_8b 3200 8 采用默认值 llama3_70b 3200 4 [0, 1, 2] (可选) opencompass也支持通过本地权重来进行ppl精度测试。本质上使用transformers进行推理,因为没有框架的优化,执行时间最长。另一方面,由于是使用transformers推理,结果也是最稳定的。对单卡运行的模型比较友好,算力利用率比较高。对多卡运行的推理,缺少负载均衡,利用率低。 在昇腾卡上执行时,需要在 opencompass/opencompass/runners/local.py 中添加如下代码 import torch import torch_npu from torch_npu.contrib import transfer_to_npu 执行脚本如下 # for llama3_8b python run.py --datasets mmlu_ppl \ --hf-type base --hf-path {hf-path} \ --max-seq-len 3200 --max-out-len 16 --hf-num-gpus 1 --batch-size 4 \ -w {output_path} --debug 参数说明如下: --datasets:评测的数据集及评测方法,其中 mmlu 是数据集,ppl 是评测方法。 --hf-type:HuggingFace模型权重类型(base,chat), 默认为chat, 依据实际的模型选择。 --hf-path:本地 HuggingFace 权重的路径,比如/home/ma-user/nfs/model/Meta-Llama-3-8B。 --max-seq-len:模型的最大序列长度。 --max-out-len:模型的最大输出长度。 --hf-num-gpus:需要使用的卡数。 --batch-size:推理每次处理的输入数目。 -w:存放输出结果的目录。
  • Step2 创建LoRA微调训练任务 创建训练作业,并自定义名称、描述等信息。选择自定义算法,启动方式自定义,以及上传的镜像。训练脚本中会自动执行训练前的权重转换操作和数据处理操作。 图1 选择镜像 如果镜像使用使用基础镜像中的基础镜像时,训练作业启动命令中输入: cd /home/ma-user/work/llm_train/AscendSpeed; sh ./scripts/install.sh; sh ./scripts/llama2/0_pl_lora_13b.sh 如果镜像使用ECS中构建新镜像构建的新镜像时,训练作业启动命令中输入: cd /home/ma-user/work/llm_train/AscendSpeed; sh ./scripts/llama2/0_pl_lora_13b.sh 创建训练作业时,可开启自动重启功能。当环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力。此功能已适配断点续训练。 图2 开启故障重启 断点续训练是通过checkpoint机制实现。checkpoint机制是在模型训练的过程中,不断地保存训练结果(包括但不限于EPOCH、模型权重、优化器状态、调度器状态)。即便模型训练中断,也可以基于checkpoint继续训练。 当训练作业发生故障中断本次作业时,代码可自动从训练中断的位置继续训练,加载中断生成的checkpoint,中间不需要改动任何参数。可以通过训练脚本中的SAVE_INTERVAL参数来指定间隔多少step保存checkpoint。
  • Step1 修改训练超参配置 以llama2-13b LORA微调为例,执行脚本0_pl_lora_13b.sh 。 修改模型训练脚本中的超参配置,必须修改的参数如表1所示。其他超参均有默认值,可以参考表1按照实际需求修改。 表1 训练超参配置说明 参数 示例值 参数说明 ORIGINAL_TRAIN_DATA_PATH /home/ma-user/work/training_data/alpaca_gpt4_data.json 必须修改。训练时指定的输入数据路径。请根据实际规划修改。 ORIGINAL_HF_WEIGHT /home/ma-user/work/models/llama-2-13b-chat-hf 必须修改。加载Hugging Face权重(可与tokenizer相同文件夹)时,对应的存放地址。请根据实际规划修改。 TOKENIZER_PATH /home/ma-user/work/tokenizers/llama-2-13b-chat-hf 该参数为tokenizer文件的存放地址。默认与ORIGINAL_HF_WEIGHT路径相同。如果用户需要将Hugging Face权重与tokenizer文件分开存放时,则需要修改参数。 INPUT_PRO CES SED_DIR /home/ma-user/work/llm_train/processed_for_input/llama2-13b 该路径下保存“数据转换”和“权重转换”的结果。示例中,默认生成在“processed_for_input”文件夹下。如果用户需要修改,可添加并自定义该变量。 OUTPUT_SAVE_DIR /home/ma-user/work/llm_train/saved_dir_for_output/ 该路径下统一保存生成的 CKPT、P LOG 、LOG 文件。示例中,默认统一保存在“saved_dir_for_output”文件夹下。如果用户需要修改,可添加并自定义该变量。 CKPT_SAVE_PATH /home/ma-user/work/llm_train/saved_dir_for_output/saved_models/llama2-13b 保存训练生成的模型 CKPT 文件。示例中,默认保存在“saved_dir_for_output/saved_models”文件夹下。如果用户需要修改,可添加并自定义该变量。 LOG_SAVE_PATH /home/ma-user/work/llm_train/saved_dir_for_output/saved_models/llama2-13b/log 保存训练过程记录的日志 LOG 文件。示例中,默认保存在“saved_models/llama2-13b/log”文件夹下。如果用户需要修改,可添加并自定义该变量。 ASCEND_PROCESS_LOG_PATH /home/ma-user/work/llm_train/saved_dir_for_output/plog 保存训练过程中记录的程序堆栈信息日志 PLOG 文件。示例中,默认保存在“saved_dir_for_output/plog”文件夹下。如果用户需要修改,可添加并自定义该变量。 CONVERT_MG2HF TRUE 训练完成的权重文件默认不会自动转换为Hugging Face格式权重。如果需要自动转换,则在运行脚本添加变量CONVERT_MG2HF并赋值TRUE。如果用户后续不需要自动转换,则在运行脚本中必须删除CONVERT_MG2HF变量。转换的Hugging Face格式权重会保存至OUTPUT_SAVE_DIR的目录中。 对于Yi系列模型、ChatGLMv3-6B和Qwen系列模型,还需要手动修改训练参数和tokenizer文件,具体请参见训练tokenizer文件说明。
  • Step6 预测结果 在“在线服务”页面,单击在线服务名称,进入服务详情页面。 单击“预测”页签,请求类型选择“multipart/form-data”,请求参数填写“image”,单击“上传”按钮上传示例图片,然后单击“预测”。 预测完成后,预测结果显示区域将展示预测结果,根据预测结果内容,可识别出此图片的数字是“2”。 本案例中使用的MNIST是比较简单的用做demo的数据集,配套算法也是比较简单的用于教学的神经网络算法。这样的数据和算法生成的模型仅适用于教学模式,并不能应对复杂的预测场景。即生成的模型对预测图片有一定范围和要求,预测图片必须和训练集中的图片相似(黑底白字)才可能预测准确。 图8 示例图片 图9 预测结果展示
  • 操作流程 开始使用如下样例前,请务必按准备工作指导完成必要操作。 Step1 准备训练数据:下载MNIST数据集。 Step2 准备训练文件和推理文件:编写训练与推理代码。 Step3 创建OBS桶并上传文件:创建OBS桶和文件夹,并将数据集和训练脚本,推理脚本,推理配置文件上传到OBS中。 Step4 创建训练作业:进行模型训练。 Step5 推理部署:训练结束后,将生成的模型导入ModelArts用于创建模型,并将模型部署为在线服务。 Step6 预测结果:上传一张手写数字图片,发起预测请求获取预测结果。 Step7 清除资源:运行完成后,停止服务并删除OBS中的数据,避免不必要的扣费。
  • 准备工作 已 注册华为账号 并开通华为云,且在使用ModelArts前检查账号状态,账号不能处于欠费或冻结状态。 配置委托访问授权 ModelArts使用过程中涉及到OBS、SWR、IEF等服务交互,首次使用ModelArts需要用户配置委托授权,允许访问这些依赖服务。 使用华为云账号登录ModelArts管理控制台,在左侧导航栏单击“权限管理”,进入“权限管理”页面,单击“添加授权”。 在弹出的“添加授权”窗口中,选择: 授权对象类型:所有用户 委托选择:新增委托 权限配置:普通用户 选择完成后勾选“我已经详细阅读并同意《ModelArts服务声明》”,然后单击“创建”。 图1 配置委托访问授权 完成配置后,在ModelArts控制台的权限管理列表,可查看到此账号的委托配置信息。 图2 查看委托配置信息
共100000条
提示

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