华为云用户手册

  • 动态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_datasets.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的权重路径。 --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_serving.py测试动态benchmark。具体操作命令如下,可以根据参数说明修改参数。 Notebook中进行测试: conda activate python-3.9.10 cd benchmark_tools python benchmark_serving.py --backend vllm --host 127.0.0.1 --port 8080 --dataset custom_dataset.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 --benchmark-csv benchmark_serving.csv 生产环境中进行测试: python benchmark_serving.py --backend vllm --url xxx --app-code xxx --dataset custom_dataset.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 --benchmark-csv benchmark_serving.csv --backend:服务类型,支持tgi、vllm、mindspore、openai等。本文档使用的推理接口是vllm。 --host:服务IP地址,如127.0.0.1。 --port:服务端口。 --url:如果以vllm接口方式启动服务,API接口公网地址与"/generate"拼接而成;如果以openai接口方式启动服务,API接口公网地址与"/v1/completions"拼接而成。部署成功后的在线服务详情页中可查看API接口公网地址。 图3 API接口公网地址 --app-code:获取方式见访问在线服务(APP认证)。 --dataset:数据集路径。 --dataset-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。 --tokenizer:tokenizer路径,可以是huggingface的权重路径。如果服务部署在Notebook中,该参数为Notebook中权重路径;如果服务部署在生产环境中,该参数为本地模型权重路径。 --served-model-name:仅在以openai接口启动服务时需要该参数。如果服务部署在Notebook中,该参数为Notebook中权重路径;如果服务部署在生产环境中,该参数为服务启动脚本run_vllm.sh中的${model_path}。 --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。 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图4 动态benchmark测试结果(示意图)
  • 约束限制 创建在线服务时,每秒服务流量限制默认为100次,如果静态benchmark的并发数(parallel-num参数)或动态benchmark的请求频率(request-rate参数)较高,会触发推理平台的流控,请在ModelArts Standard“在线服务”详情页修改服务流量限制。 同步请求时,平台每次请求预测的时间不能超过60秒。例如输出数据比较大的调用请求(例如输出大于1k),请求预测会超过60秒导致调用失败,可提交工单设置请求超时时间。
  • 投机推理benchmark验证 本章节介绍如何进行投机推理benchmark验证,当前投机推理benchmark仅支持在Notebook中进行测试。 进入benchmark_tools目录下。 cd benchmark_tools 运行验证脚本speculative_benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 python speculative_benchmark_parallel.py --backend vllm --host ${docker_ip} --port 8080 --dataset human-eval-v2-20210705.jsonl \ --tokenizer /path/to/tokenizer --num-prompts 80 \ --output_len 4096 --trust-remote-code --backend:服务类型,如tgi,vllm,mindspore、openai。 --host ${docker_ip}:服务部署的IP地址,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口。 --dataset:数据集路径,推荐使用human-eval-v2-20210705.jsonl数据集,数据集可从https://github.com/openai/human-eval/blob/master/data/HumanEval.jsonl.gz下载压缩包解压获得。 --tokenizer:tokenizer路径,可以是HuggingFace的权重路径,backend取值是openai时,tokenizer路径需要和推理服务启动时--model路径保持一致,比如--model /data/nfs/model/llama_7b, --tokenizer也需要为/data/nfs/model/llama_7b,两者要完全一致。 --num-prompts:某个频率下请求数,默认80。 --output_len:输出长度,默认是1024。 --trust-remote-code:是否相信远程代码。 脚本运行完后,测试结果直接在终端输出。
  • 上传镜像 客户端上传镜像,是指在安装了容器引擎客户端的机器上使用docker命令将镜像上传到 容器镜像服务 的镜像仓库。 如果容器引擎客户端机器为云上的E CS 或CCE节点,根据机器所在区域有两种网络链路可以选择: 如果机器与容器镜像仓库在同一区域,则上传镜像走内网链路。 如果机器与容器镜像仓库不在同一区域,则上传镜像走公网链路,机器需要绑定弹性公网IP。 使用客户端上传镜像,镜像的每个layer大小不能大于10G。 上传镜像的容器引擎客户端版本必须为1.11.2及以上。 连接容器 镜像服务 。 登录容器镜像服务控制台。 单击右上角“创建组织”,输入组织名称完成组织创建。请自定义组织名称,本示例使用“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} 上传镜像完成后,返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
  • 上传数据至OBS 前提条件 已经在OBS上创建好普通OBS桶,请参见创建普通OBS桶。 已经安装obsutil,请参考安装和配置OBS命令行工具。 OBS和训练容器间的数据传输原理可以参考基于ModelArts Standard运行GPU训练作业。 操作步骤 登录Imagenet数据集下载官网地址,下载Imagenet21k数据集:http://image-net.org/ 下载格式转换后的annotation文件:ILSVRC2021winner21k_whole_map_train.txt和ILSVRC2021winner21k_whole_map_val.txt。 下载完成后将上述3个文件数据上传至OBS桶中的imagenet21k_whole文件夹中。上传方法请参考上传数据和算法到OBS。
  • 上传算法到SFS 下载Swin-Transformer代码。 git clone --recursive https://github.com/microsoft/Swin-Transformer.git 修改lr_scheduler.py文件,把第27行:t_mul=1. 注释掉。 修改data文件夹下imagenet22k_dataset.py,把第28行:print("ERROR IMG LOADED: ", path) 注释掉。 修改data文件夹下的build.py文件,把第112行:prefix = 'ILSVRC2011fall_whole',改为prefix = 'ILSVRC2021winner21k_whole'。 在Swin-Transformer目录下创建requirements.txt指定python依赖库: # requirements.txt内容如下 timm==0.4.12 termcolor==1.1.0 yacs==0.1.8 准备run.sh文件中所需要的obs文件路径。 准备imagenet数据集的分享链接。 勾选要分享的imagenet21k_whole数据集文件夹,单击分享按钮,选择分享链接有效期,自定义提取码,例如123456,单击“复制链接”,记录该链接。 准备“obsutil_linux_amd64.tar.gz”的分享链接。 参考下载和安装obsutil下载“obsutil_linux_amd64.tar.gz”,将其上传至OBS桶中,设置为公共读。单击属性,单击复制链接。 链接样例如下: https://${bucketname_name}.obs.cn-north-4.myhuaweicloud.com/${folders_name}/pytorch.tar.gz 在Swin-Transformer目录下,创建运行脚本run.sh。 脚本中的"SRC_DATA_PATH=${imagenet数据集在obs中分享链接}",需要替换为上一步中的imagenet21k_whole文件夹分享链接。 脚本中的"https://${bucket_name}.obs.cn-north-4.myhuaweicloud.com/${folder_name}/obsutil_linux_amd64.tar.gz",需要替换为上一步中obsutil_linux_amd64.tar.gz在OBS上的路径(需将文件设置为公共读)。 单机单卡运行脚本: # 在代码主目录下创建一个run.sh,内容如下 #!/bin/bash # 从obs中下载数据到本地SSD盘 DIS_DATA_PATH=/cache SRC_DATA_PATH=${imagenet数据集在obs中分享链接} OBSUTIL_PATH=https://${bucket_name}.obs.cn-north-4.myhuaweicloud.com/${folder_name}/obsutil_linux_amd64.tar.gz mkdir -p $DIS_DATA_PATH && cd $DIS_DATA_PATH && wget $OBSUTIL_PATH && tar -xzvf obsutil_linux_amd64.tar.gz && $DIS_DATA_PATH/obsutil_linux_amd64*/obsutil share-cp $SRC_DATA_PATH $DIS_DATA_PATH/ -ac=123456 -r -f -j 256 && cd - IMAGE_DATA_PATH=$DIS_DATA_PATH/imagenet21k_whole MASTER_PORT="6061" /home/ma-user/anaconda3/envs/pytorch/bin/python -m torch.distributed.launch --nproc_per_node=1 --master_addr localhost --master_port=$MASTER_PORT main.py --data-path $IMAGE_DATA_PATH --cfg ./configs/swin/swin_base_patch4_window7_224_22k.yaml --local_rank 0 多机多卡运行脚本: # 创建run.sh #!/bin/bash # 从obs中下载数据到本地SSD盘 DIS_DATA_PATH=/cache SRC_DATA_PATH=${imagenet数据集在obs中分享链接} OBSUTIL_PATH=https://${bucket_name}.obs.cn-north-4.myhuaweicloud.com/${folder_name}/obsutil_linux_amd64.tar.gz mkdir -p $DIS_DATA_PATH && cd $DIS_DATA_PATH && wget $OBSUTIL_PATH && tar -xzvf obsutil_linux_amd64.tar.gz && $DIS_DATA_PATH/obsutil_linux_amd64*/obsutil share-cp $SRC_DATA_PATH $DIS_DATA_PATH/ -ac=123456 -r -f -j 256 && cd - IMAGE_DATA_PATH=$DIS_DATA_PATH/imagenet21k_whole MASTER_ADDR=$(echo ${VC_WORKER_HOSTS} | cut -d "," -f 1) MASTER_PORT="6060" NNODES="$VC_WORKER_NUM" NODE_RANK="$VC_TASK_INDEX" NGPUS_PER_NODE="$MA_NUM_GPUS" /home/ma-user/anaconda3/envs/pytorch/bin/python -m torch.distributed.launch --nnodes=$NNODES --node_rank=$NODE_RANK --nproc_per_node=$NGPUS_PER_NODE --master_addr $MASTER_ADDR --master_port=$MASTER_PORT main.py --data-path $IMAGE_DATA_PATH --cfg ./configs/swin/swin_base_patch4_window7_224_22k.yaml 推荐先使用单机单卡运行脚本,待正常运行后再改用多机多卡运行脚本。 多机多卡run.sh中的“VC_WORKER_HOSTS”、“VC_WORKER_NUM”、“VC_TASK_INDEX”、“MA_NUM_GPUS”为ModelArts训练容器中预置的环境变量。训练容器环境变量详细介绍可参考查看训练容器环境变量。 通过obsutils,将代码文件夹放到OBS上,然后通过OBS将代码传至SFS相应目录中。 在SFS中将代码文件Swin-Transformer-main设置归属为ma-user。 chown -R ma-user:ma-group Swin-Transformer 执行以下命令,去除Shell脚本的\r字符。 cd Swin-Transformer sed -i 's/\r//' run.sh Shell脚本在Windows系统编写时,每行结尾是\r\n,而在Linux系统中行每行结尾是\n,所以在Linux系统中运行脚本时,会认为\r是一个字符,导致运行报错“$'\r': command not found”,因此需要去除Shell脚本的\r字符。
  • 操作流程 准备工作: 购买服务资源(VPC/SFS/OBS/SWR/ECS) 配置权限 创建专属资源池(打通VPC) ECS服务器挂载SFS Turbo存储 在ECS中设置ModelArts用户可读权限 安装和配置OBS命令行工具 (可选)工作空间配置 模型训练: 本地构建镜像及调试 上传镜像 上传数据至OBS(首次使用时需要) 上传算法至SFS 使用Notebook进行代码调试 创建多机多卡训练作业
  • CCE集群关联SFS Turbo 进入已购买创建的CCE集群,选择存储,随后单击“创建存储卷声明PVC”。 选择“极速文件存储”,随后输入PVC名称。 选择“新建存储卷PV”,并单击“选择极速文件存储”。 进入选择页面,选择已经创建好的SFS Turbo,最后输入PV名称。 接下来需要通过访问集群节点,挂载SFS Turbo。 可通过ssh登录CCE集群中的某个节点(ssh使用的是eip地址)。 创建/mnt/sfs_turbo目录作为挂载目录 ,命令为:mkdir /mnt/sfs_turbo SFS Turbo存储手动挂载到安装节点中,挂载命令如下截图: 挂载完成后,可通过以下步骤获取到代码和数据,并上传至/mnt/sfs_turbo路径下。
  • kubectl访问集群配置 本步骤需要在节点机器,对kubectl进行集群访问配置。 首先进入已创建的 CCE 集群控制版面中。根据图1的步骤进行操作,单击kubectl配置时,会弹出图2步骤页面。 图1 配置中心 根据图2,按步骤进行:判断是否安装 kubectl、下载kubectl配置文件、在机器中安装和配置kubectl。 图2 kubectl 访问集群配置 在节点机器中,输入命令,查看Kubernetes集群信息。若显示如图图3的内容,则配置成功。 kubectl cluster-info 图3 查看 Kubernetes 集群信息正确弹出内容
  • 创建SFS Turbo SFS Turbo HPC型文件系统为用户提供一个完全托管的共享文件存储。SFS Turbo文件系统支持无缝访问存储在OBS对象存储桶中的对象,用户可以指定SFS Turbo内的目录与OBS对象存储桶进行关联,然后通过创建导入导出任务实现数据同步。通过OBS与SFS Turbo存储联动,可以将最新的训练数据导入到SFS Turbo,然后在训练作业中挂载SFS Turbo到容器对应ckpt目录,实现分布式读取训练数据文件。 创建SFS Turbo文件系统前提条件: 创建SFS Turbo文件系统前,确认已有可用的VPC。 图4 创建SFS Turbo 需要由 IAM 用户设置SFS Turbo FullAccess权限,用于授权ModelArts云服务使用SFS Turbo。 详细操作指导请参考创建SFS Turbo文件系统。 其中,文件系统类型推荐选用500MB/s/TiB或1000MB/s/TiB,应用于AI大模型场景中。存储容量推荐使用 6.0~10.8TB ,以存储更多模型文件。 图5 SFS类型和容量选择
  • kubectl访问集群配置 本步骤需要在节点机器,对kubectl进行集群访问配置。 首先进入已创建的CCE集群控制版面中。根据图2的步骤进行操作,单击kubectl配置时,会弹出图3步骤页面。 图2 配置中心 根据图3,按步骤进行:判断是否安装 kubectl、下载kubectl配置文件、在机器中安装和配置kubectl。 图3 kubectl访问集群配置 在节点机器中,输入命令,查看Kubernetes集群信息。如果显示如图图4的内容,则配置成功。 kubectl cluster-info 图4 查看Kubernetes集群信息正确弹出内容
  • ChatGLMv3-6B 在训练开始前,针对ChatGLMv3-6B模型中的tokenizer文件,需要修改代码。修改文件chatglm3-6b/tokenization_chatglm.py 。 文件最后几处代码中需要修改,具体位置可根据上下文代码信息进行查找,修改后如图2所示。 图2 修改ChatGLMv3-6B tokenizer文件 图3 修改ChatGLMv3-6B tokenizer文件
  • 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文件
  • Megatron转HuggingFace参数说明 训练完成的权重文件默认不会自动转换为Hugging Face格式权重。如果用户需要自动转换,则在运行脚本,例如0_pl_pretrain_13b.sh中,添加变量CONVERT_MG2HF并赋值TRUE。如果用户后续不需要自动转换,则在运行脚本中必须删除CONVERT_MG2HF变量。 Megatron转HuggingFace脚本具体参数如下: --model-type:模型类型。 --save-model-type:输出后权重格式。 --load-dir:训练完成后保存的权重路径。 --save-dir:需要填入原始HF模型路径,新权重会存于../Llama2-13B/mg2hg下。 --target-tensor-parallel-size:任务不同调整参数target-tensor-parallel-size,默认为1。 --target-pipeline-parallel-size :任务不同调整参数target-pipeline-parallel-size,默认为1。 输出转换后权重文件保存路径: 权重转换完成后,在/home/ma-user/work/llm_train/saved_dir_for_output/llama2-13b/saved_models/pretrain_hf/目录下查看转换后的权重文件。 权重转换完成后,需要将例如saved_models/pretrain_hf中的文件与原始Hugging Face模型中的文件进行对比,查看是否缺少如tokenizers.json、tokenizer_config.json、special_tokens_map.json等tokenizer文件或者其他json文件。如果缺少则需要直接复制至权重转换后的文件夹中,否则不能直接用于推理。
  • 用户自定义执行权重转换参数修改说明 如果用户要自定义数据处理脚本并且单独执行,同样以 llama2 为例。注意脚本中的python命令分别有Hugging Face 转 Megatron格式,以及Megatron 转 Hugging Face格式,而脚本使用hf2hg、mg2hf参数传递来区分。 方法一:用户可打开scripts/llama2/2_convert_mg_hf.sh脚本,将执行的python命令复制下来,修改环境变量的值。在Notebook进入到 /home/ma-user/work/llm_train/AscendSpeed/ModelLink 路径中,再执行python命令。 方法二:用户在Notebook直接编辑scripts/llama2/2_convert_mg_hf.sh脚本,自定义环境变量的值,并在脚本的首行中添加 cd /home/ma-user/work/llm_train/AscendSpeed/ModelLink 命令,随后在Notebook中运行该脚本。 其中环境变量详细介绍如下: 表1 权重转换脚本中的环境变量 参数 示例 参数说明 $1 hf2hg、mg2hf 运行 2_convert_mg_hf.sh 时,需要附加的参数值。如下: hf2hg:用于Hugging Face 转 Megatron mg2hf:用于Megatron 转 Hugging Face TP 8 张量并行数,一般等于单机卡数 PP 1 流水线并行数,一般等于节点数量 ORIGINAL_HF_WEIGHT /home/ma-user/work/model/Llama2-13B 原始Hugging Face模型路径 CONVERT_MODEL_PATH /home/ma-user/work/llm_train/processed_for_ma_input/llama2-13b/converted_weights_TP8PP1 权重转换完成之后保存路径 TOKENIZER_PATH /home/ma-user/work/model/llama-2-13b-chat-hf tokenizer路径,即:原始Hugging Face模型路径 MODEL_SAVE_PATH /home/ma-user/work/llm_train/saved_dir_for_output/llama2-13b 训练完成后保存的权重路径。
  • HuggingFace转Megatron参数说明 --model-type:模型类型。 --loader:选择对应加载模型脚本的名称。 --saver:选择模型保存脚本的名称。 --tensor-model-parallel-size:${TP}张量并行数,需要与训练脚本中的TP值配置一样。 --pipeline-model-parallel-size:${PP}流水线并行数,需要与训练脚本中的PP值配置一样。 --load-dir:加载转换模型权重路径。 --save-dir : 权重转换完成之后保存路径。 --tokenizer-model : tokenizer路径。
  • 查看性能 训练性能主要通过训练日志中的2个指标查看,吞吐量和loss收敛情况。 吞吐量(tokens/s/p):可通过修改重要参数表格中output_dir参数值路径下的trainer_log.jsonl计算性能。取中间过程多steps平均值吞吐计算公式为: delta_tokens = end_total_tokens-start_ total_tokens delta_time = end_elapsed_time - start_elapsed_time 吞吐值(tps) = delta_tokens / delta_time / 训练卡数 如图所示: loss收敛情况:日志里存在lm loss参数 ,lm loss参数随着训练迭代周期持续性减小,并逐渐趋于稳定平缓。loss收敛图存放路径对应表1表格中output_dir参数值路径下的training_loss.png中也可以使用可视化工具TrainingLogParser查看loss收敛情况,将trainer_log.jsonl文件长传至可视化工具页面,如图2所示。 单节点训练:训练过程中的loss直接打印在窗口上。 多节点训练:训练过程中的loss打印在第一个节点上。 图2 Loss收敛情况(示意图) ppo训练结束不会打印性能。建议根据保存路径下的trainer_log.jsonl文件的最后一行总的训练steps和时间来判断性能。
  • 解决方法: 通过npu-smi info查看是否有进程资源占用NPU,导致训练时显存不足。解决可通过kill掉残留的进程或等待资源释放。 可调整参数:TP张量并行(tensor-model-parallel-size) 和PP流水线并行(pipeline-model-parallel-size),可以尝试增加 TP和PP的值,一般TP×PP≤NPU数量,并且要被整除,具体调整值可参照表2进行设置。
  • 步骤一:量化模型权重 在GPU的机器上使用开源GPTQ量化工具GPTQ (huggingface.co)量化模型权重。 具体操作如下: 开始之前,请确保安装了以下库: pip install auto-gptq pip install --upgrade accelerate optimum transformers 设置GPTQConfig的参数,并且创建一个数据集用于校准量化的权重,以及一个tokenizer用于准备数据集。 from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig model_id = "meta-llama/CodeLlama-34b-hf" tokenizer = AutoTokenizer.from_pretrained(model_id) gptq_config = GPTQConfig(bits=8, dataset="c4", tokenizer=tokenizer, group_size=-1, damp_percent=0.01, desc_act=False, sym=True, use_exllama=False) 您也可以将自己的数据集作为字符串列表传递,但强烈建议使用GPTQ论文中的相同数据集。 dataset = ["auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."] gptq_config = GPTQConfig(bits=8, dataset=dataset, tokenizer=tokenizer, group_size=-1, damp_percent=0.01, desc_act=False, sym=True, use_exllama=False) 加载要量化的模型,并将gptq_config传递给from_pretrained()方法。 quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=gptq_config) 您还可以使用save_pretrain()方法在本地保存您的量化模型。如果模型是用device_map参数量化的,请确保在保存之前将整个模型移动到GPU或CPU。例如,要将模型保存在CPU上。 quantized_model.save_pretrained("CodeLlama-34b-hf") tokenizer.save_pretrained("CodeLlama-34b-hf") # if quantized with device_map set quantized_model.to("cpu") quantized_model.save_pretrained("CodeLlama-34b-hf")
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.907中的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 # 推理工具
  • 工作目录介绍 详细的工作目录参考如下,建议参考以下要求设置工作目录。训练脚本以分类的方式集中在scripts文件夹中。 ${workdir}(例如/home/ma-user/ws ) |──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 # 预训练输出权重 |── models #原始权重与tokenizer目录,需要用户手动创建,后续操作步骤中会提示 |── Llama2-70B |── tokenizers #tokenizer目录,需要用户手动创建,后续操作步骤中会提示 |── Llama2-70B |── training_data #原始数据目录,需要用户手动创建,后续操作步骤中会提示 |── train-00000-of-00001-a09b74b3ef9c3b56.parquet #原始数据文件 |── alpaca_gpt4_data.json #微调数据文件
  • 获取模型软件包和权重文件 本方案支持的模型对应的软件和依赖包获取地址如表1所示,模型列表、对应的开源权重获取地址如表2所示。 表1 模型对应的软件包和依赖包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.3.907-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 表2 支持的模型列表 序号 支持模型 支持模型参数量 权重文件获取地址 1 llama2 llama2-7b https://huggingface.co/meta-llama/Llama-2-7b-chat-hf 2 llama2-13b https://huggingface.co/meta-llama/Llama-2-13b-chat-hf 3 llama2-70b https://huggingface.co/meta-llama/Llama-2-70b-hf https://huggingface.co/meta-llama/Llama-2-70b-chat-hf (推荐) 4 llama3 llama3-8b https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct 5 llama3-70b https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct 6 Qwen qwen-7b https://huggingface.co/Qwen/Qwen-7B-Chat 7 qwen-14b https://huggingface.co/Qwen/Qwen-14B-Chat 8 qwen-72b https://huggingface.co/Qwen/Qwen-72B-Chat 9 Qwen1.5 qwen1.5-7b https://huggingface.co/Qwen/Qwen1.5-7B-Chat 10 qwen1.5-14b https://huggingface.co/Qwen/Qwen1.5-14B-Chat 11 qwen1.5-32b https://huggingface.co/Qwen/Qwen1.5-32B-Chat 12 qwen1.5-72b https://huggingface.co/Qwen/Qwen1.5-72B-Chat 13 Yi yi-6b https://huggingface.co/01-ai/Yi-6B-Chat 14 yi-34b https://huggingface.co/01-ai/Yi-34B-Chat 15 ChatGLMv3 glm3-6b https://huggingface.co/THUDM/chatglm3-6b 16 Baichuan2 baichuan2-13b https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 17 Qwen2 qwen2-0.5b https://huggingface.co/Qwen/Qwen2-0.5B-Instruct 18 qwen2-1.5b https://huggingface.co/Qwen/Qwen2-1.5B-Instruct 19 qwen2-7b https://huggingface.co/Qwen/Qwen2-7B-Instruct 20 qwen2-72b https://huggingface.co/Qwen/Qwen2-72B-Instruct 21 GLMv4 glm4-9b https://huggingface.co/THUDM/glm-4-9b-chat
  • 上传代码和权重文件到工作环境 使用root用户以SSH的方式登录Server。 将AscendCloud代码包AscendCloud-xxx-xxx.zip上传到${workdir}目录下并解压缩,如:/home/ma-user/ws目录下,以下都以/home/ma-user/ws为例,请根据实际修改。 unzip AscendCloud-*.zip 上传tokenizers文件到工作目录中的/home/ma-user/ws/tokenizers/Llama2-{MODEL_TYPE}目录,如Llama2-70B。 具体步骤如下: 进入到${workdir}目录下,如:/home/ma-user/ws,创建tokenizers文件目录将权重和词表文件放置此处,以Llama2-70B为例。 cd /home/ma-user/ws mkdir -p tokenizers/Llama2-70B 注意:多机情况下,只有在rank_0节点进行数据预处理,转换权重等工作,所以原始数据集和原始权重,包括保存结果路径,都应该在共享目录下。
  • 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 } }
  • dpo_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/model/Qwen2-72B ### method stage: dpo do_train: true # lora finetuning_type: lora lora_target: all pref_beta: 0.1 pref_loss: sigmoid deepspeed: examples/deepspeed/ds_z3_config.json ### dataset dataset: dpo_en_demo dataset_dir: /home/ma-user/ws/llm_train/AscendFactory/data template: qwen cutoff_len: 4096 packing: true max_samples: 50000 overwrite_cache: true preprocessing_num_workers: 16 ### output output_dir: /home/ma-user/ws/saves/dpo/llama3-8b/lora logging_steps: 2 save_steps: 5000 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 5.0e-6 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true flash_attn: sdpa ddp_timeout: 180000000 include_tokens_per_second: true include_num_input_tokens_seen: true
  • 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
  • rm_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/model/llama3-8b ### method stage: rm do_train: true # 全参 # finetuning_type: full # lora finetuning_type: lora lora_target: all deepspeed: examples/deepspeed/ds_z0_config.json ### dataset dataset: dpo_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/rm/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-4 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true ddp_timeout: 180000000 include_tokens_per_second: true include_num_input_tokens_seen: true
  • tune_yaml样例模板 ### model model_name_or_path: /home/ma-user/ws/model/Qwen2-72B ### method stage: sft do_train: true # 全参 finetuning_type: full # lora # finetuning_type: lora # lora_target: all deepspeed: examples/deepspeed/ds_z3_config.json ### dataset dataset: identity,alpaca_en_demo dataset_dir: /home/ma-user/ws/llm_train/AscendFactory/data template: qwen cutoff_len: 4096 packing: true max_samples: 100000 overwrite_cache: true preprocessing_num_workers: 16 ### output output_dir: /home/ma-user/ws/saves/tune/Qwen2-72B/sft logging_steps: 2 save_steps: 5000 plot_loss: true overwrite_output_dir: true ### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 2.0e-5 num_train_epochs: 10.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true flash_attn: sdpa ddp_timeout: 180000000 include_tokens_per_second: true include_num_input_tokens_seen: true
  • 使用MME精度测评工具进行多模态模型精度评测 MME数据集获取。 请用户自行获取MME评估集,将MME评估集上传至llm_tools/llm_evaluation/mme_eval/data/eval/目录中。 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation/mme_eval目录中,代码目录结构如下。 mme_eval ├──metric.py #MME精度测试脚本 ├──MME.sh #运行MME脚本 启动MME精度测试脚本。 export MODEL_PATH=/data/nfs/model/InternVL2-8B/ export MME_PATH=/llm_tools/llm_evaluation/mme_eval/data/eval/MME export MODEL_TYPE=internvl2 export OUTPUT_NAME=internvl2-8B export ASCEND_RT_VISIBLE_DEVI CES ="0:1:2:3:4:5:6:7" bash MME.sh 参数说明: MODEL_PATH:模型权重路径,默认为空。 MME_PATH:MME数据集路径,默认当前路径。 MODEL_TYPE:模型类型。当前可选模型类型包括:llava、llava-next、minicpm、qwen-vl、internvl2、qwen2-vl、llava-onevision。 OUTPUT_NAME:输出结果文件名称, 默认llava。 ASCEND_RT_VISIBLE_DEVICES:表示支持多个模型服务实例,同时支持模型并行,如 0,1:2,3 默认0卡。 QUANTIZATION:为量化选项,不传入默认为None即不启用量化;支持w4a16,需配套对应的权重使用。 GPU_MEMORY_UTILIZATION:NPU使用的显存比例,复用原vLLM的入参名称,默认为0.9。 脚本运行完成后,测试结果输出在终端。
  • 使用Lm-eval精度测评工具进行大语言模型精度评测 使用lm-eval工具暂不支持pipeline_parallel方式,也不支持qwen-7b、qwen-14b、qwen-72b、chatglm2-6b、chatglm3-6b模型。 安装精度评测工具。在启动推理服务的环境,进入到一个固定目录下,执行如下命令。 rm -rf lm-evaluation-harness/ git clone https://github.com/EleutherAI/lm-evaluation-harness.git cd lm-evaluation-harness git checkout 383bbd54bc621086e05aa1b030d8d4d5635b25e6 pip install -e . 执行如下精度测试命令,可以根据参数说明修改参数。 lm_eval --model vllm --model_args pretrained=${vllm_path},dtype=auto,tensor_parallel_size=${tensor_parallel_size},gpu_memory_utilization=${gpu_memory_utilization},add_bos_token=True,max_model_len=${max_model_len},quantization=${quantization},distributed_executor_backend='ray' \ --tasks ${task} --batch_size ${batch_size} --log_samples --cache_requests true --trust_remote_code --output_path ${output_path} 参数说明: model_args:标志向模型构造函数提供额外参数,比如指定运行模型的数据类型; vllm_path是模型权重路径; max_model_len是最大模型长度,默认设置为4096; gpu_memory_utilization是gpu利用率,如果模型出现oom报错,调小参数; tensor_parallel_size是使用的卡数; quantization是量化参数,使用非量化权重,去掉quantization参数;如果使用awq、smoothquant或者gptq加载的量化权重,根据量化方式选择对应参数,可选awq,smoothquant,gptq。 distributed_executor_backend是开启多进程服务方式,选择ray开启。 model:模型启动模式,可选vllm,openai或hf,hf代表huggingface。 tasks:评测数据集任务,比如openllm。 batch_size:输入的batch_size大小,不影响精度,只影响得到结果速度,默认使用auto,代表自动选择batch大小。 output_path:结果保存路径。 以llama3.2-1b模型的权重为例,在加载非量化场景下使用lm-eval,参考命令如下。 lm_eval --model vllm --model_args pretrained="/data/nfs/benchmark/tokenizer/Llama-3.2-1B-Instruct/",dtype=auto,tensor_parallel_size=1,gpu_memory_utilization=0.7,add_bos_token=True,max_model_len=4096,distributed_executor_backend='ray' \ --tasks openllm --batch_size auto --log_samples --cache_requests true --trust_remote_code --output_path ./ 以llama3.1-70b模型的权重为例,在smoothquant量化场景下使用lm-eval,参考命令如下。参数quantization="smoothquant"表示smoothquant量化,可以根据实际量化场景替换为awq等。 lm_eval --model vllm --model_args pretrained="/data/nfs/benchmark/tokenizer_w8a8/llama3.1-70b/",dtype=auto,tensor_parallel_size=4,gpu_memory_utilization=0.7,add_bos_token=True,max_model_len=4096,quantization="smoothquant",distributed_executor_backend='ray' \ --tasks openllm --batch_size auto --log_samples --cache_requests true --trust_remote_code --output_path ./ lm-eval可以验证multi-lora的精度,参考命令如下: lm_eval --model vllm --model_args pretrained=${vllm_path},dtype=auto,tensor_parallel_size=${tensor_parallel_size},gpu_memory_utilization=${gpu_memory_utilization},max_model_len=${max_model_len},lora_local_path=${lora_local_path},distributed_executor_backend='ray',enable_lora=True \ --tasks ${task} --batch_size ${batch_size} --log_samples --cache_requests true --trust_remote_code --output_path ${output_path} --device cuda 参数说明: enable_lora=True表示开启multi-lora的精度验证。如果不开启multi-lora的精度验证,不体现enable_lora参数即可。 lora_local_path=${lora_local_path}是挂载适配器对应路径,取值和multi-lora特性使用说明中的参数lora1=/path/to/lora/adapter1/保持一致。
共100000条
提示

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