华为云用户手册

  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-3rdLLM-xxx.zip的llm_tools/llm_evaluation(6.3.905版本)目录中。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态,动态性能评测脚本、 ├── requirements.txt # 第三方依赖
  • 步骤五:训练生成权重转换成可以支持vLLM推理的格式 将训练完成后的权重文件(.bin文件或. safetensors文件),移动到下载好的开源权重目录下(即步骤四:执行训练中config文件所在目录)。 然后在llm_tools/spec_decode/EAGLE文件夹,执行 python convert_eagle_ckpt_to_vllm_compatible.py --base-path 大模型权重地址 --draft-path 小模型权重地址 --base-weight-name 大模型包含lm_head的权重文件名 --draft-weight-name 小模型权重文件名 具体参数解释如表4所示。 表4 训练后权重转换适配vllm阶段 py文件名称 配置项 取值类型 配置说明 convert_eagle_ckpt_to_vllm_compatible.py --base-path str LLM原始模型权重地址,例如 ./llama2-7b-chat --draft-path str Eagle模型权重存放地址,即步骤四:执行训练中config文件所在目录,例如 ./eagle_llama2-7b-chat --base-weight-name str 为大模型包含lm_head的权重文件名,可以在base-path目录下的model.safetensors.index.json文件获取,例如llama2-7b-chat的权重名为pytorch_model-00001-of-00002.bin --draft-weight-name str Eagle小模型权重文件名,其格式为.bin文件或者.safetensors文件,即刚才移动的.bin文件或者.safetensors文件。 图3 权重文件名
  • 什么是Eagle投机小模型训练 2013年12月滑铁卢大学、加拿大向量研究院、北京大学等机构联合发布Eagle,旨在提升大语言模型的推理速度,同时保证模型输出文本的分布一致。这种方法外推LLM的第二顶层特征向量,能够显著提升生成效率。 Eagle训练了一个单层模型,使用input token和基模型推理出的hidden-state作为输入,输出hidden-state。然后根据这个输出的hidden-state使用基模型的原始LLM的分类头来预测下一个词。hidden-state比input token包含更多信息,使得回归hidden-state的任务比预测词的任务简单得多。总之,Eagle在hidden-state层面上进行外推,使用一个小型单层Eagle模型,然后利用基模型的冻结的分类头生成预测的token。 如此一来,Eagle投机推理可以带来如下优势: 更小的训练成本得到小模型:相较于训练独立的LLM大模型,Eagle仅需训练一个自回归层。这使得其训练成本相较于训练一个独立的LLM模型要小得多。 为每个模型提供针对性的投机模型: Eagle的模型大小及结构,与基模型的某一层完全相同,这使得它的大小远远小于其基模型。解决了对于部分原始LLM模型,找不到合适的投机模型的问题。
  • 步骤四:执行训练 安装完成后,执行: accelerate launch -m --mixed_precision=bf16 eagle.train.main \ --tmpdir [path of data] \ --cpdir [path of checkpoints] \ --configpath [path of config file] \ --basepath [path of base_model] --bs [batch size] 具体的参数解释如表3所示, 表3 执行训练阶段 py文件名称 配置项 取值类型 配置说明 eagle.train.main --tmpdir str 生成的训练所需数据的输出地址,即数据生成中的outdir --cpdir str 训练出的Eagle模型权重存放地址 --configpath str Eagle模型config文件地址,通常将对应LLM原始模型中的num_layers改为1即可。 --basepath str LLM原始模型权重地址 --bs int 训练模型的batch 其中,要获取模型config文件, 首先到https://github.com/SafeAILab/EAGLE/页找到对应Eagle模型地址。 图1 EAGLE Weights 以llama2-chat-7B为例,单击进入后 ,如下图所示config文件,即为对应模型的eagle config文件。 图2 eagle config文件
  • 步骤二:非sharegpt格式数据集转换(可选) 如果数据集json文件不是sharegpt格式,而是常见的如下格式,则需要执行convert_to_sharegpt.py文件将数据集转换为share gpt格式。 { "prefix": "AAA" "input": "BBB", "output": "CCC" } 执行convert_to_sharegpt.py文件。 python convert_to_sharegpt.py \ --input_file_path data_test.json \ --out_file_name ./data_for_sharegpt.json \ --prefix_name instruction \ --input_name input \ --output_name output \ --code_type utf-8 参数解释如表1所示。 当转换为sharegpt格式时,prefix和input会拼接成一段文字,作为human字段,提出问题,而output字段会作为gpt字段,做出回答。 表1 数据集转换为sharegpt格式阶段(可选) py文件名称 配置项 取值类型 配置说明 convert_to_sharegpt.py --input_file_path str 预训练json文件地址。 --out_file_name int 输出的sharegpt格式文件地址。 --prefix_name str 预训练json文件的前缀字段名称,例如:您是一个xxx专家,您需要回答下面问题。prefix_name可设置为None,此时预训练数据集只有input和output两段输入。 --input_name str 预训练json文件的指令输入字段名称,例如:请问苹果是什么颜色。 --output_name str 预训练json文件的output字段名称,例如:苹果是红色的。 --code_type str 预训练json文件编码,默认utf-8。
  • Step5 MiniCPM-V2.6微调前修改脚本 使用/home/ma-user/MiniCPM-V/finetune/finetune_lora.sh官方脚本对MiniCPM-V 2.6进行lora微调。使用/home/ma-user/MiniCPM-V/finetune/finetune_ds.sh官方脚本对MiniCPM-V 2.6进行sft微调。微调脚本默认使用 transformers Trainer 和 DeepSpeed。 在 ds_config_zero2.json 修改overlap_comm为false。 loss固定 pip install mindstudio-probe 在finetune.py脚本前添加 from msprobe.pytorch import seed_all seed_all(1234) npu 在finetune.py脚本前添加 import torch_npu from torch_npu.contrib import transfer_to_npu 下载插件包AscendCloud-AIGC-6.3.912-xxx.zip到${container_work_dir}并解压后得到multimodal_algorithm。 sudo chown -R ma-user:ma-group ${container_work_dir} unzip AscendCloud-AIGC-6.3.909-xxx.zip cd ${container_work_dir}/multimodal_algorithm/ascendcloud_multimodal_plugin pip install -e . # 在MiniCPM-V/finetune/finetune.py引入优化代码包 from ascendcloud_multimodal.train.models.minicpmv.minicpmv2_6 import ascend_modeling_minicpmv2_6
  • Step7 lora微调 bash finetune_lora.sh 修改模型权重路径${model_path},保持其余参数一致。脚本参数设置如下: #!/bin/bash GPUS_PER_NODE=8 NNODES=1 NODE_RANK=0 MASTER_ADDR=localhost MASTER_PORT=6001 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True MODEL=${mdoel_path} # or openbmb/MiniCPM-V-2, openbmb/MiniCPM-Llama3-V-2_5 # ATTENTION: specify the path to your training data, which should be a json file consisting of a list of conversations. # See the section for finetuning in README for more information. DATA="coco2014_train.json" EVAL_DATA="coco2014_val.json" LLM_TYPE="qwen2" # if use openbmb/MiniCPM-V-2, please set LLM_TYPE=minicpm#if use openbmb/MiniCPM-Llama3-V-2_5, please set LLM_TYPE=llama3 MODEL_MAX_Length=2048 # if conduct multi-images sft, please set MODEL_MAX_Length=4096 MODEL_MAX_Length=2048 DISTRIBUTED_ARGS=" --nproc_per_node $GPUS_PER_NODE \ --nnodes $NNODES \ --node_rank $NODE_RANK \ --master_addr $MASTER_ADDR \ --master_port $MASTER_PORT " torchrun $DISTRIBUTED_ARGS finetune.py \ --model_name_or_path $MODEL \ --llm_type $LLM_TYPE \ --data_path $DATA \ --eval_data_path $EVAL_DATA \ --remove_unused_columns false \ --label_names "labels" \ --prediction_loss_only false \ --bf16 true \ --bf16_full_eval true \ --fp16 false \ --fp16_full_eval false \ --do_train \ --do_eval \ --num_train_epochs 1 \ --tune_vision true \ --tune_llm false \ --use_lora true \ --lora_target_modules "llm\..*layers\.\d+\.self_attn\.(q_proj|k_proj|v_proj|o_proj)" \ --model_max_length $MODEL_MAX_Length \ --max_slice_nums 9 \ --max_steps 1000 \ --eval_steps 10000 \ --output_dir output/output__lora \ --logging_dir output/output_lora \ --logging_strategy "steps" \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 1 \ --evaluation_strategy "steps" \ --save_strategy "steps" \ --save_steps 10000 \ --save_total_limit 10 \ --learning_rate 1e-6 \ --weight_decay 0.1 \ --adam_beta2 0.95 \ --warmup_ratio 0.01 \ --lr_scheduler_type "cosine" \ --logging_steps 1 \ --gradient_checkpointing true \ --deepspeed ds_config_zero2.json \ --report_to "tensorboard"
  • Step1 准备环境 请参考Lite Server资源开通,购买Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问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
  • Step6 监督微调 bash finetune_ds.sh 修改模型权重路径${model_path},保持其余参数一致。脚本参数设置如下: #!/bin/bash GPUS_PER_NODE=8 NNODES=1 NODE_RANK=0 MASTER_ADDR=localhost MASTER_PORT=6001 MODEL=${mdoel_path} # or openbmb/MiniCPM-V-2, openbmb/MiniCPM-Llama3-V-2_5 # ATTENTION: specify the path to your training data, which should be a json file consisting of a list of conversations.# See the section for finetuning in README for more information. DATA="coco2014_train.json" EVAL_DATA="coco2014_val.json" LLM_TYPE="qwen2" # if use openbmb/MiniCPM-V-2, please set LLM_TYPE=minicpm, if use openbmb/MiniCPM-Llama3-V-2_5, please set LLM_TYPE="llama3" MODEL_MAX_Length=2048 # if conduct multi-images sft, please set MODEL_MAX_Length=4096 DISTRIBUTED_ARGS=" --nproc_per_node $GPUS_PER_NODE \ --nnodes $NNODES \ --node_rank $NODE_RANK \ --master_addr $MASTER_ADDR \ --master_port $MASTER_PORT " torchrun $DISTRIBUTED_ARGS finetune.py \ --model_name_or_path $MODEL \ --llm_type $LLM_TYPE \ --data_path $DATA \ --eval_data_path $EVAL_DATA \ --remove_unused_columns false \ --label_names "labels" \ --prediction_loss_only false \ --bf16 true \ --bf16_full_eval true \ --fp16 false \ --fp16_full_eval false \ --do_train \ --do_eval \ --tune_vision true \ --tune_llm true \ --model_max_length $MODEL_MAX_Length \ --max_slice_nums 9 \ --max_steps 1000 \ --eval_steps 5000 \ --output_dir output/output_minicpmv26 \ --logging_dir output/output_minicpmv26 \ --logging_strategy "steps" \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 1 \ --evaluation_strategy "steps" \ --save_strategy "steps" \ --save_steps 2000 \ --save_total_limit 10 \ --learning_rate 1e-6 \ --weight_decay 0.1 \ --adam_beta2 0.95 \ --warmup_ratio 0.01 \ --lr_scheduler_type "cosine" \ --logging_steps 1 \ --gradient_checkpointing true \ --deepspeed ds_config_zero2.json \ --report_to "tensorboard"
  • Step3 启动容器镜像 启动容器镜像。启动前请先按照参数说明修改${}中的参数。 export work_dir="自定义挂载的工作目录" export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称或ID" // 启动一个容器去运行镜像 docker run -itd --net=bridge \ --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/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ ${image_name} \ /bin/bash 参数说明: -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 ${image_name}:容器镜像的名称。 --device=/dev/davinci0 :挂载对应卡到容器,当需要挂载多卡,请依次添加多项该配置 通过容器名称进入容器中。默认使用ma-user用户,后续所有操作步骤都在ma-user用户下执行。 docker exec -it -u ma-user ${container_name} bash
  • Step4 安装依赖和软件包 从github拉取MiniCPM-V代码。 cd /home/ma-user git clone https://github.com/OpenBMB/MiniCPM-V.git cd /home/ma-user/MiniCPM-V git checkout c541f1044e7c0bb2ba48e3eb21daf070e90cd6a2 获取openbmb/MiniCPM-V-2_6模型。 https://huggingface.co/openbmb/MiniCPM-V-2_6 #手动下载模型权重放置在指定路径 sudo chown -R ma-user:ma-group ${container_work_dir} mkdir -p ${container_work_dir}/minicpm/MiniCPM-V-2_6/ cp -r MiniCPM-V-2_6 ${container_work_dir}/minicpm/MiniCPM-V-2_6/ 准备coco数据集。 cd MiniCPM-V/finetune/ # Download COCO images wget http://images.cocodataset.org/zips/train2014.zip && unzip train2014.zip wget http://images.cocodataset.org/zips/val2014.zip && unzip val2014.zip 制作数据集,参考官网下面链接data preparation章节。 MiniCPM-V/finetune/readme.md at main · OpenBMB/MiniCPM-V (github.com) 制成coco2014_train.json文件和coco2014_val.json放在MiniCPM-V/finetune/目录中。json文件示例如下。 图1 json文件示例 执行微调脚本前需要补充安装依赖包。 pip install accelerate pip install tensorboard pip install deepspeed==0.15.1 pip install peft pip install numpy==1.24.4 pip install transformers==4.40.0 pip install einops
  • 获取软件和镜像 表2 获取软件和镜像 分类 名称 获取路径 插件代码包 AscendCloud-6.3.912-xxx.zip软件包中的AscendCloud-AIGC-6.3.912-xxx.zip 说明: 包名中的xxx表示具体的时间戳,以包名的实际时间为准。 获取路径:Support-E,在此路径中查找下载ModelArts 6.3.912版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 基础镜像 西南-贵阳一: swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc3-py_3.9-hce_2.0.2409-aarch64-snt9b-20241213131522-aafe527 从SWR拉取。
  • 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路径。
  • 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/ws/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 为例,用户可直接编辑 scripts/llama2/2_convert_mg_hf.sh 脚本,自定义环境变量的值,并运行该脚本。其中环境变量详细介绍如下: 如果用户要自定义数据处理脚本并且单独执行,同样以 llama2 为例。注意脚本中的python命令分别有Hugging Face 转 Megatron格式,以及Megatron 转 Hugging Face格式,而脚本使用hf2hg、mg2hf参数传递来区分。 方法一:用户可打开scripts/llama2/2_convert_mg_hf.sh脚本,将执行的python命令复制下来,修改环境变量的值。进入到 /home/ma-user/ws/llm_train/AscendSpeed/ModelLink 路径中,再执行python命令。 方法二:用户直接编辑scripts/llama2/2_convert_mg_hf.sh脚本,自定义环境变量的值,并在脚本的首行中添加 cd /home/ma-user/ws/llm_train/AscendSpeed/ModelLink 命令,随后运行该脚本。 其中环境变量详细介绍如下: 表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/ws/model/Llama2-13B 原始Hugging Face模型路径 CONVERT_MODEL_PATH /home/ma-user/ws/llm_train/processed_for_ma_input/llama2-13b/converted_weights_TP8PP1 权重转换完成之后保存路径 TOKENIZER_PATH /home/ma-user/ws/tokenizers/Llama2-13B tokenizer路径,即:原始Hugging Face模型路径 MODEL_SAVE_PATH /home/ma-user/ws/llm_train/saved_dir_for_output/llama2-13b 训练完成后保存的权重路径。
  • Step3 权重格式离线转换(可选) AutoAWQ量化完成后,使用int32对int4的权重进行打包。昇腾上使用int8对权重进行打包,在线转换会增加启动时间,可以提前对权重进行转换以减少启动时间,转换步骤如下: 进入llm_tools/AutoAWQ代码目录下执行以下脚本: 执行时间预计10分钟。执行完成后会将权重路径下的原始权重替换成转换后的权重。如需保留之前权重格式,请在转换前备份。 python convert_awq_to_npu.py --model /home/ma-user/Qwen1.5-72B-Chat-AWQ 参数说明: model:模型路径。
  • Step1 环境准备 在节点自定义目录${node_path}下创建config.yaml文件 apiVersion: apps/v1 kind: Deployment metadata: name: yourapp labels: app: infers spec: replicas: 1 selector: matchLabels: app: infers template: metadata: labels: app: infers spec: schedulerName: volcano nodeSelector: accelerator/huawei-npu: ascend-1980 containers: - image: ${image_name} # 推理镜像名称 imagePullPolicy: IfNotPresent name: ${container_name} securityContext: runAsUser: 0 ports: - containerPort: 8080 command: - "sleep" - "1000000000000000000" resources: requests: huawei.com/ascend-1980: "8" # 需求卡数,key保持不变。 limits: huawei.com/ascend-1980: "8" # 限制卡数,key保持不变。 volumeMounts: # 容器内部映射路径 - name: ascend-driver #驱动挂载,保持不动 mountPath: /usr/local/Ascend/driver - name: ascend-add-ons #驱动挂载,保持不动 mountPath: /usr/local/Ascend/add-ons - name: hccn #驱动hccn配置,保持不动 mountPath: /etc/hccn.conf - name: localtime mountPath: /etc/localtime - name: npu-smi # npu-smi mountPath: /usr/local/sbin/npu-smi - name: model-path # 模型权重路径 mountPath: ${model-path} - name: node-path # 节点自定义目录,该目录下包含pod配置文件config.yaml mountPath: ${node-path} volumes: # 物理机外部路径 - name: ascend-driver hostPath: path: /usr/local/Ascend/driver - name: ascend-add-ons hostPath: path: /usr/local/Ascend/add-ons - name: hccn hostPath: path: /etc/hccn.conf - name: localtime hostPath: path: /etc/localtime - name: npu-smi hostPath: path: /usr/local/sbin/npu-smi - name: model-path hostPath: path: ${model-path} - name: node-path hostPath: path: ${node-path} 参数说明: ${container_name}:容器名称,此处可以自己定义一个容器名称,例如ascend-vllm。 ${image_name}:Step3 制作推理镜像构建的推理镜像名称。 ${node-path}:节点自定义目录,该目录下包含pod配置文件config.yaml。 ${model-path}:Step1 上传权重文件中上传的模型权重路径。 参考Step4 创建pod创建pod以用于后续进行模型量化
  • Step1 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation目录中,代码目录结构如下。 benchmark_eval ├──opencompass.sh #运行opencompass脚本 ├──install.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字 确保容器内通网,未通网需要配置$config_proxy_str,$config_pip_str设置对应的代理和pip源,来确保当前代理和pip源可用。 精度评测新建一个conda环境,确保之前启动服务为vllm接口,进入到benchmark_eval目录下,执行如下命令。命令中的$work_dir 是benchmark_eval的绝对路径。 conda activate python-3.9.10 #如果没有该conda环境需要手动建立一个 export work_dir=${work_dir} #指定work_dir路径 bash install.sh 在benchmark_eval目录下安装依赖。 cd opencompass #在benchmark_eval目录下 pip install -e . #下载对应依赖 cd ../human-eval #在benchmark_eval目录下 (可选,如果选择使用humaneval数据集) pip install -e . # 可选,如果选择使用humaneval数据集 (可选)如果需要在humaneval数据集上评估模型代码能力,请执行此步骤,否则忽略这一步。原因是通过opencompass使用humaneval数据集时,需要执行模型生成的代码。请仔细阅读human_eval/execution.py文件第48-57行的注释,内容参考如下。了解执行模型生成代码可能存在的风险,如果接受这些风险,请取消第58行的注释,执行下面步骤6进行评测。 # 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 。 model_name:评测模型名称,不需要与启动服务时的模型参数保持一致。 benchmark_type:评测数据集类型,分为eval、static、awq,也就是精度、静态和量化数据集,默认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 这一步可以在客户端显示运行过程,通过run.py运行。如果同时运行多个数据集,需要将不同数据集通过空格分开,加入到eval_datasets中,比如eval_datasets=ceval_gen mmlu_gen。运行命令如下所示。 cd opencompass python run.py --models vllm --datasets mmlu_gen ceval_gen -w ${output_path} output_path: 要保存的结果路径。
  • 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路径。
  • 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 训练完成后保存的权重路径。
  • 创建Notebook 创建开发环境Notebook实例,具体操作步骤请参考创建Notebook实例。 镜像选择已注册的自定义镜像,资源类型选择创建好的专属资源池,规格推荐选择“Ascend: 8*ascend-snt9b”。 图1 Notebook中选择自定义镜像与规格 云硬盘EVS是Notebook开发环境内存的存储硬盘,作为持久化存储挂载在/home/ma-user/work目录下,该目录下的内容在实例停止后会被保留。可以自定义磁盘空间,若需要存储数据集、模型等大型文件,建议申请规格300GB+。存储支持在线按需扩容。 图2 自定义存储配置
  • 使用SmoothQuant量化工具转换权重 SmoothQuant(W8A8)量化方案能降低模型显存以及需要部署的卡数。也能同时降低首token时延和增量推理时延。支持SmoothQuant(W8A8)量化的模型列表请参见支持的模型列表和权重文件。 本章节介绍如何在Notebook使用SmoothQuant量化工具实现推理量化。 SmoothQuant量化工具使用到的脚本存放在代码包AscendCloud-LLM-x.x.x.zip的llm_tools目录下。 代码目录如下: AutoSmoothQuant #量化工具 ├── ascend_autosmoothquant_adapter # 昇腾量化使用的算子模块 ├── autosmoothquant # 量化代码 ├── build.sh # 安装量化模块的脚本 ... 具体操作如下: 配置需要使用的NPU卡,例如:实际使用的是第1张和第2张卡,此处填写为“0,1”,以此类推。 export ASCEND_RT_VISIBLE_DEVI CES =0,1 NPU卡编号可以通过命令npu-smi info查询。 执行权重转换。 cd autosmoothquant/examples/ python smoothquant_model.py --model-path /home/ma-user/llama-2-7b/ --quantize-model --generate-scale --dataset-path /data/nfs/user/val.jsonl --scale-output scales/llama2-7b.pt --model-output quantized_model/llama2-7b --per-token --per-channel 参数说明: --model-path:原始模型权重路径。 --quantize-model:体现此参数表示会生成量化模型权重。不需要生成量化模型权重时,不体现此参数 --generate-scale:体现此参数表示会生成量化系数,生成后的系数保存在--scale-output参数指定的路径下。如果有指定的量化系数,则不需此参数,直接读取--scale-input参数指定的量化系数输入路径即可。 --dataset-path:数据集路径,推荐使用:https://huggingface.co/datasets/mit-han-lab/pile-val-backup/resolve/main/val.jsonl.zst。 --scale-output:量化系数保存路径。 --scale-input:量化系数输入路径,如果之前已生成过量化系数,则可指定该参数,跳过生成scale的过程。 --model-output:量化模型权重保存路径。 --smooth-strength:平滑系数,推荐先指定为0.5,后续可以根据推理效果进行调整。 --per-token:激活值量化方法,如果指定则为per-token粒度量化,否则为per-tensor粒度量化。 --per-channel:权重量化方法,如果指定则为per-channel粒度量化,否则为per-tensor粒度量化。 启动smoothQuant量化服务。 参考Step3 启动推理服务,启动推理服务时添加如下命令。 -q smoothquant 或者 --quantization smoothquant --dtype=float16 父主题: 推理模型量化
  • Step4 调用在线服务 进入在线服务详情页面,选择“预测”。 如果以vllm接口启动服务,设置请求路径:“/generate”,输入预测代码“{"prompt": "你好", "temperature":0, "max_tokens":20}”,单击“预测”即可看到预测结果。 图8 预测-vllm 如果以openai接口启动服务,设置请求路径:“/v1/completions”,输入预测代码“{"prompt": "你是谁","model": "${model_path}","max_tokens": 50,"temperature":0}”,单击“预测”即可看到预测结果。 图9 预测-openai 在线服务的更多内容介绍请参见文档查看服务详情。
  • 用户自定义执行数据处理脚本修改参数说明 同样以 llama2 为例,用户可直接编辑 scripts/llama2/1_preprocess_data.sh 脚本,自定义环境变量的值,并运行该脚本。其中环境变量详细介绍如下: 表1 数据预处理中的环境变量 环境变量 示例 参数说明 RUN_TYPE pretrain、sft、lora 数据预处理区分: 预训练场景下数据预处理,默认参数:pretrain 微调场景下数据预处理,默认:sft / lora ORIGINAL_TRAIN_DATA_PATH /home/ma-user/ws/training_data/${用户自定义的数据集路径和名称} 原始数据集的存放路径。 TOKENIZER_PATH /home/ma-user/ws/tokenizers/llama2-13b tokenizer的存放路径,与HF权重存放在一个文件夹下。请根据实际规划修改。 PROCESSED_DATA_PREFIX /home/ma-user/ws/llm_train/processed_for_input/llama2-13b/data 处理后的数据集保存路径+数据集前缀 TOKENIZER_TYPE PretrainedFromHF 可选项有:['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为 PretrainedFromHF 。 SEQ_LEN 4096 要处理的最大seq length。脚本会检测超出SEQ_LEN长度的数据,并打印log。
  • LLama-Factory微调数据集预处理参数说明 ModelLink开源仓已经支持LLama-Factory格式的数据预处理,目前仅支持sft全参微调,lora微调。数据集预处理脚本参数说明如下: --input:原始数据集的存放路径。 --output-prefix:处理后的数据集保存路径+数据集名称(例如:moss-003-sft-data) --tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 --tokenizer-name-or-path:tokenizer的存放路径,与HF权重存放在一个文件夹下。 --handler-name:生成数据集的用途,这里是生成的指令数据集,用于微调。可选项有['AlpacaStyleInstructionHandler SharegptStyleInstructionHandler']。 AlpacaStyleInstructionHandler :用于处理Alpaca风格的数据集。 SharegptStyleInstructionHandler:用于处理sharegpt风格的数据集。 --workers:设置数据处理使用执行卡数量 / 启动的工作进程数。 --log-interval:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。 --prompt-type:需要指定使用模型的template。已支持的系列模型可查看:文档更新内容。 输出数据预处理结果路径: 训练完成后,以 llama2-13b 为例,输出数据路径为:/home/ma-user/ws/llm_train/processed_for_input/llama2-13b/
  • ModelLink预训练数据集预处理参数说明 预训练数据集预处理脚本scripts/llama2/1_preprocess_data.sh 中的具体参数如下: --input:原始数据集的存放路径。 --output-prefix:处理后的数据集保存路径+数据集名称(例如:moss-003-sft-data)。 --tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 --tokenizer-name-or-path:tokenizer的存放路径,与HF权重存放在一个文件夹下。 --handler-name:生成数据集的用途,这里是生成的文本数据集,用于预训练。 GeneralPretrainHandler:默认。用于预训练时的数据预处理过程中,将数据集根据key值进行简单的过滤。 --seq-length:要处理的最大seq length。 --workers:设置数据处理使用执行卡数量 / 启动的工作进程数。 --log-interval:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。 输出数据预处理结果路径: 训练完成后,以 llama2-13b 为例,输出数据路径为:/home/ma-user/ws/llm_train/processed_for_input/llama2-13b/data/pretrain/
  • ModelLink微调数据集预处理参数说明 微调包含SFT和LoRA微调。数据集预处理脚本参数说明如下: --input:原始数据集的存放路径。 --output-prefix:处理后的数据集保存路径+数据集名称(例如:moss-003-sft-data) --tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase','BertWordPieceCase','GPT2BPETokenizer','PretrainedFromHF'],一般为PretrainedFromHF。 --tokenizer-name-or-path:tokenizer的存放路径,与HF权重存放在一个文件夹下。 --handler-name:生成数据集的用途,这里是生成的指令数据集,用于微调。 GeneralInstructionHandler:用于sft、lora微调时的数据预处理过程中,会对数据集full_prompt中的user_prompt进行mask操作。 --seq-length:要处理的最大seq length。 --workers:设置数据处理使用执行卡数量 / 启动的工作进程数。 --log-interval:是一个用于设置日志输出间隔的参数,表示输出日志的频率。在训练大规模模型时,可以通过设置这个参数来控制日志的输出。 输出数据预处理结果路径: 训练完成后,以 llama2-13b 为例,输出数据路径为:/home/ma-user/ws/llm_train/processed_for_input/llama2-13b/data/finetune/
  • 在线推理使用Guided Decoding 启动推理服务请参考启动推理服务章节。 在线推理使用Guided Decoding时,在发送的请求中包含上述guided_json架构,具体示例可参考以下代码。 curl -X POST http://${docker_ip}:8080/v1/completions \ -H "Content-Type: application/json" \ -d '{ "model": "${container_model_path}", "prompt": "Meet our valorous character, named Knight, who has reached the age of 32. Clad in impenetrable plate armor, Knight is well-prepared for any battle. Armed with a trusty sword and boasting a strength score of 90, this character stands as a formidable warrior on the field.Please provide details for this character, including their Name, Age, preferred Armor, Weapon, and Strength", "max_tokens": 200, "temperature": 0, "guided_json": "{\"title\": \"Character\", \"type\": \"object\", \"properties\": {\"name\": {\"title\": \"Name\", \"maxLength\": 10, \"type\": \"string\"}, \"age\": {\"title\": \"Age\", \"type\": \"integer\"}, \"armor\": {\"$ref\": \"#/definitions/Armor\"}, \"weapon\": {\"$ref\": \"#/definitions/Weapon\"}, \"strength\": {\"title\": \"Strength\", \"type\": \"integer\"}}, \"required\": [\"name\", \"age\", \"armor\", \"weapon\", \"strength\"], \"definitions\": {\"Armor\": {\"title\": \"Armor\", \"description\": \"An enumeration.\", \"enum\": [\"leather\", \"chainmail\", \"plate\"], \"type\": \"string\"}, \"Weapon\": {\"title\": \"Weapon\", \"description\": \"An enumeration.\", \"enum\": [\"sword\", \"axe\", \"mace\", \"spear\", \"bow\", \"crossbow\"], \"type\": \"string\"}}}" }'
  • 离线推理使用Guided Decoding 离线推理,要使用guided-decoding,需要通过SamplingParams类中的GuidedDecodingParams进行配置。 下面是一种离线使用方式示例: from vllm import LLM, SamplingParams from vllm.sampling_params import GuidedDecodingParams MODEL_NAME = ${MODEL_NAME} llm = LLM(model=MODEL_NAME) guided_decoding_params = GuidedDecodingParams(choice=["Positive", "Negative"]) sampling_params = SamplingParams(guided_decoding=guided_decoding_params) outputs = llm.generate( prompts="Classify this sentiment: vLLM is wonderful!", sampling_params=sampling_params, ) print(outputs[0].outputs[0].text) MODEL_NAME表示对应模型路径。
共100000条
提示

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