华为云用户手册

  • Step2 修改训练yaml文件配置 LlamaFactroy配置文件为yaml文件,启动训练前需修改yaml配置文件,yaml配置文件在代码目录下的{work_dir}/llm_train/LLaMAFactory/demo.yaml。修改详细步骤如下所示: 选择指令微调类型 sft,复制sft_yaml样例模板内容覆盖demo.yaml文件内容。 lora,复制lora_yaml样例模板内容覆盖demo.yaml文件内容。 修改yaml文件(demo.yaml)的参数如表1所示 表1 修改重要参数 参数 示例值 参数说明 model_name_or_path /home/ma-user/ws/tokenizers/Qwen2-72B 必须修改。加载tokenizer与Hugging Face权重时存放目录绝对或相对路径。请根据实际规划修改。 template qwen 必须修改。用于指定模板。如果设置为"qwen",则使用Qwen模板进行训练,模板选择可参照表1中的template列 output_dir /home/ma-user/ws/Qwen2-72B/sft-4096 必须修改。指定输出目录。训练过程中生成的模型参数和日志文件将保存在这个目录下。用户根据自己实际要求适配。 per_device_train_batch_size 1 指定每个设备的训练批次大小 gradient_accumulation_steps 8 指定梯度累积的步数,这可以增加批次大小而不增加内存消耗。可根据自己要求适配 num_train_epochs 5 表示训练轮次,根据实际需要修改。一个Epoch是将所有训练样本训练一次的过程。可根据自己要求适配 cutoff_len 4096 文本处理时的最大长度,此处为4096,用户可根据自己要求适配。 dataset identity,alpaca_en_demo 【可选】指定用于训练的数据集,数据集都放置在此处为identity,alpaca_en_demo表示使用了两个数据集,一个是 identity,一个是alpaca_en_demo。如选用定义数据请参考准备数据(可选)配置dataset_info.json文件 dataset_dir /home/ma-user/ws/LLaMAFactory/LLaMA-Factory/data 【可选】自定义数据集dataset_info.json配置文件绝对路径;如使用自定义数据集,yaml配置文件需添加此参数。 是否选择加速深度学习训练框架Deepspeed,可参考表1选择不同的框架 是,选用ZeRO (Zero Redundancy Optimizer)优化器 ZeRO-0,配置以下参数 deepspeed: examples/deepspeed/ds_z0_config.json ZeRO-1,配置以下参数,并复制ds_z1_config.json样例模板至工作目录/home/ma-user/LLaMAFactory/LLaMA-Factory/examples/deepspeed deepspeed: examples/deepspeed/ds_z1_config.json ZeRO-2,配置以下参数 deepspeed: examples/deepspeed/ds_z2_config.json ZeRO-3,配置以下参数 deepspeed: examples/deepspeed/ds_z3_config.json 否,默认选用Accelerate加速深度学习训练框架,注释掉deepspeed参数。 是否使用固定句长 是,配置以下参数 packing: true 否,默认使用动态句长,注释掉packing参数。 选用数据精度格式,以下参数二选一。 bf16,配置以下参数 bf16: true fp16,配置以下参数 fp16: true 是否使用自定义数据集 是,参考准备数据(可选)后,填写自定义注册后数据集前缀名称及数据集绝对路径,参考表1dataset_dir行,如demo.json数据集前缀则为demo dataset: demo dataset_dir: /home/ma-user/ws/llm_train/LLaMAFactory/LLaMA-Factory/data 否,使用代码包自带数据集,配置参数如 dataset: identity,alpaca_en_demo 如需其他配置参数,可参考表1按照实际需求修改
  • Step3 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。启动容器命令如下。 export work_dir="自定义挂载的工作目录" #容器内挂载的目录,例如/home/ma-user/ws export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称" docker run -itd \ --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 \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ --cpus 192 \ --memory 1000g \ --shm-size 200g \ --net=host \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ $image_name \ /bin/bash 参数说明: --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如llamafactory。 -v ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载/home/ma-user目录,此目录为ma-user用户家目录。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 ${image_name} 为docker镜像的ID,在宿主机上可通过docker images查询得到。 --shm-size:表示共享内存,用于多进程间通信。由于需要转换较大内存的模型文件,因此大小要求200g及以上。 修改目录权限,上传代码和数据到宿主机时使用的是root用户,如用ma-user用户训练,此处需要执行如下命令统一文件权限。 #统一文件权限 chmod -R 777 ${work_dir} # ${work_dir}:/home/ma-user/ws 宿主机代码和数据目录 #例如: chmod -R 777 /home/ma-user/ws 通过容器名称进入容器中。启动容器时默认用户为ma-user用户。 docker exec -it ${container_name} bash 使用ma-user用户安装依赖包。 #进入scripts目录换 cd /home/ma-user/ws/llm_train/LLaMAFactory #执行安装命令,安装依赖包及/LLaMAFactory代码包 sh install.sh
  • 镜像地址 本教程中用到的训练和推理的基础镜像地址和配套版本关系如下表所示,请提前了解。 表1 基础容器镜像地址 镜像用途 镜像地址 基础镜像 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 表2 模型镜像版本 模型 版本 CANN cann_8.0.rc2 驱动 23.0.5 PyTorch 2.1.0
  • Step1 检查环境 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
  • 上传自定义数据到指定目录 将下载的原始数据存放在{work_dir}/llm_train/LLaMAFactory/LLaMA-Factory/data目录下。具体步骤如下: 进入到/home/ma-user/ws/llm_train/LLaMAFactory/LLaMA-Factory/data目录下。 cd /home/ma-user/ws/llm_train/LLaMAFactory/LLaMA-Factory/data 将自定义原始数据如demo.json放置在此处。 数据存放参考目录结构如下: ${workdir}(例如/home/ma-user/ws/llm_train ) |── LLaMAFactory/data |── alpaca_en_demo.json # 代码原有数据集 |── identity.json # 代码原有数据集 ... |── demo.json # 自定义数据集 更新代码目录下 data/dataset_info.json 文件。关于数据集文件的格式及配置,请参考 data/README_zh.md 的内容。 vim dataset_info.json
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.907中的AscendCloud-LLM-xxx.zip软件包和算子包AscendCloud-OPP,AscendCloud-LLM关键文件介绍如下。 |——AscendCloud-LLM |──llm_train # 模型训练代码包 |──LLaMAFactory # 基于LLaMAFactory的训练代码 |──ascendcloud_patch/ # 针对昇腾云平台适配的功能补丁包 |──demo.yaml # 样例yaml配置文件 |──demo.sh # 指令微调启动shell脚本 |──intall.sh # 需要的依赖包 |──LLaMA-Factory # LLaMAFactory的代码目录 |──AscendSpeed # 基于AscendSpeed的训练代码
  • 上传代码和权重文件到工作环境 使用root用户以SSH的方式登录DevServer。 将AscendCloud代码包AscendCloud-xxx-xxx.zip上传到${workdir}目录下并解压缩,如:/home/ma-user/ws目录下,以下都以/home/ma-user/ws为例,请根据实际修改。 unzip AscendCloud-*.zip unzip AscendCloud-LLM-*.zip 上传tokenizers文件到工作目录中的/home/ma-user/ws/tokenizers/{Model_Name}目录,用户根据自己实际规划路径修改;如Qwen2-72B。 具体步骤如下: 进入到${workdir}目录下,如:/home/ma-user/ws,创建tokenizers文件目录将权重和词表文件放置此处,以Qwen2-72B为例。 cd /home/ma-user/ws mkdir -p tokenizers/Qwen2-72B
  • 工作目录介绍 详细的工作目录参考如下,建议参考以下要求设置工作目录。 ${workdir}(例如/home/ma-user/ws ) |──llm_train #解压代码包后自动生成的代码目录,无需用户创建 |── LLaMAFactory # 代码目录 |──ascendcloud_patch/ # 针对昇腾云平台适配的功能代码包 |──demo.sh # 指令微调启动shell脚本 |──demo.yaml # 样例yaml配置文件 |──intall.sh # 需要的依赖包 |──LLaMA-Factory # 执行install.sh后生成此目录,容器内执行参考Step3 启动容器镜像 |──data # 原始数据目录,如使用自定义数据,参考准备数据(可选) |── tokenizers #原始权重/tokenizer目录,用户手动创建,用户根据实际规划目录修改,后续操作步骤中会提示 |── Qwen2-72B # 输出权重及日志路径,用户可根据实际自行规划,无需手动创建,此路径对应表1表格中output_dir参数值 |── saved_dir_for_output_lf # 训练输出保存权重,目录结构会自动生成,无需用户创建 |── ${model_name} # 模型名称,根据实际训练模型创建,训练完成权重文件及日志目录
  • 获取模型软件包和权重文件 本方案支持的模型对应的软件和依赖包获取地址如表1所示,模型列表、对应的开源权重获取地址如表1所示。 表1 模型对应的软件包和依赖包获取地址 代码包名称 代码说明 下载地址 AscendCloud-6.3.907-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的模型训练代码、推理部署代码和推理评测代码。代码包具体说明请参见模型软件包结构说明。 AscendSpeed是用于模型并行计算的框架,其中包含了许多模型的输入处理方法。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 训练支持的模型列表 本方案支持以下模型的训练,如表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
  • 附录:基于vLLM不同模型推理支持最小卡数和最大序列说明 基于vLLM(v0.5.0)部署推理服务时,不同模型推理支持的最小昇腾卡数和对应卡数下的max-model-len长度说明,如下面的表格所示。 以下值是在gpu-memory-utilization为0.9时测试得出,为服务部署所需的最小昇腾卡数及该卡数下推荐的最大max-model-len长度,不代表最佳性能。 以llama2-13b为例,NPU卡显存为32GB时,至少需要2张卡运行推理业务,2张卡运行的情况下,推荐的最大序列max-model-len长度最大是16K,此处的单位K是1024,即16*1024。 测试方法:gpu-memory-utilization为0.9下,以4k、8k、16k递增max-model-len,直至达到能执行静态benchmark下的最大max-model-len。 表1 基于vLLM不同模型推理支持最小卡数和最大序列说明 序号 模型名 32GB显存 64GB显存 最小卡数 最大序列(K) max-model-len 最小卡数 最大序列(K) max-model-len 1 llama-7b 1 16 1 32 2 llama-13b 2 16 1 16 3 llama-65b 8 16 4 16 4 llama2-7b 1 16 1 32 5 llama2-13b 2 16 1 16 6 llama2-70b 8 32 4 64 7 llama3-8b 1 32 1 128 8 llama3-70b 8 32 4 64 9 qwen-7b 1 8 1 32 10 qwen-14b 2 16 1 16 11 qwen-72b 8 8 4 16 12 qwen1.5-0.5b 1 128 1 256 13 qwen1.5-7b 1 8 1 32 14 qwen1.5-1.8b 1 64 1 128 15 qwen1.5-14b 2 16 1 16 16 qwen1.5-32b 4 32 2 64 17 qwen1.5-72b 8 8 4 16 18 qwen1.5-110b -- 8 128 19 qwen2-0.5b 1 128 1 256 20 qwen2-1.5b 1 64 1 128 21 qwen2-7b 1 8 1 32 22 qwen2-72b 8 32 4 64 23 chatglm2-6b 1 64 1 128 24 chatglm3-6b 1 64 1 128 25 glm-4-9b 1 32 1 128 26 baichuan2-7b 1 8 1 32 27 baichuan2-13b 2 4 1 4 28 yi-6b 1 64 1 128 29 yi-9b 1 32 1 64 30 yi-34b 4 32 2 64 31 deepseek-llm-7b 1 16 1 32 32 deepseek-coder-instruct-33b 4 32 2 64 33 deepseek-llm-67b 8 32 4 64 34 mistral-7b 1 32 1 128 35 mixtral-8x7b 4 8 2 32 36 gemma-2b 1 64 1 128 37 gemma-7b 1 8 1 32 38 falcon-11b 1 8 1 64 父主题: 主流开源大模型基于DevServer适配PyTorch NPU推理指导(6.3.907)
  • 附录:大模型推理常见问题 问题1:在推理预测过程中遇到NPU out of memory。 解决方法:调整推理服务启动时的显存利用率,将--gpu-memory-utilization的值调小。 问题2:在推理预测过程中遇到ValueError:User-specified max_model_len is greater than the drived max_model_len。 解决方法:修改config.json文件中的"seq_length"的值,"seq_length"需要大于等于 --max-model-len的值。config.json存在模型对应的路径下,例如:/data/nfs/benchmark/tokenizer/chatglm3-6b/config.json 问题3:使用离线推理时,性能较差或精度异常。 解决方法:将block_size大小设置为128。 from vllm import LLM, SamplingParams llm = LLM(model="facebook/opt-125m", block_size=128) 问题4:使用llama3.1系模型进行推理时,报错:ValueError: 'rope_scaling' must be a dictionary with two fields, 'type' and 'factor', got {'factor': 8.0, 'low_freq_factor': 1.0, 'high_freq_factor': 4.0, 'original_max_position_embeddings': 8192, 'rope_type': 'llama3'} 解决方法:升级transformers版本到4.43.1:pip install transformers --upgrade 问题5:使用SmoothQuant进行W8A8进行模型量化时,报错:AttributeError: type object 'LlamaAttention' has no attribute '_init_rope' 解决方法:降低transformers版本到4.42:pip install transformers==4.42 --upgrade 父主题: 主流开源大模型基于DevServer适配PyTorch NPU推理指导(6.3.907)
  • Step3 启动kv-cache-int8量化服务 在使用OpenAI接口或vLLM接口启动推理服务时添加如下参数: --kv-cache-dtype int8 #只支持int8,表示kvint8量化 --quantization-param-path kv_cache_scales.json #输入Step2 抽取kv-cache量化系数生成的json文件路径; 如果只测试推理功能和性能,不需要此json文件,此时scale系数默认为1,但是可能会造成精度下降。
  • Step1使用tensorRT量化工具进行模型量化,必须在GPU环境 使用tensorRT 0.9.0版本工具进行模型量化,工具下载使用指导请参见https://github.com/NVIDIA/TensorRT-LLM/tree/v0.9.0。 量化脚本convert_checkpoint.py存放在TensorRT-LLM/examples路径对应的模型文件夹下,例如:llama模型对应量化脚本的路径是examples/llama/convert_checkpoint.py。 执行convert_checkpoint.py脚本进行权重转换生成量化系数,详细参数解释请参见https://github.com/NVIDIA/TensorRT-LLM/tree/main/examples/llama#int8-kv-cache。 python convert_checkpoint.py \ --model_dir ./llama-models/llama-7b-hf \ --output_dir ./llama-models/llama-7b-hf/int8_kv_cache/ \ --dtype float16 \ --int8_kv_cache 运行完成后,会在output_dir下生成量化后的权重。量化后的权重包括原始权重和kvcache的scale系数。
  • 使用SmoothQuant量化 SmoothQuant(W8A8)量化方案能降低模型显存以及需要部署的卡数。也能同时降低首token时延和增量推理时延。支持SmoothQuant(W8A8)量化的模型列表请参见表3。 本章节介绍如何使用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量化服务。 参考Step6 启动推理服务,启动推理服务时添加如下命令。 -q smoothquant 或者 --quantization smoothquant --dtype=float16 父主题: 推理模型量化
  • Step2 权重格式转换 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 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包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:存放输出结果的目录。
  • 静态benchmark验证 本章节介绍如何进行静态benchmark验证。 已经上传benchmark验证脚本到推理容器中。如果在Step4 制作推理镜像步骤中已经上传过AscendCloud-LLM-x.x.x.zip并解压,无需重复执行。 进入benchmark_tools目录下,切换一个conda环境。 cd benchmark_tools conda activate python-3.9.10 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 python benchmark_parallel.py --backend vllm --host ${docker_ip} --port 8080 --tokenizer /path/to/tokenizer --epochs 5 \ --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等。本文档使用的推理接口是vllm。 --host ${docker_ip}:服务部署的IP,${docker_ip}替换为宿主机实际的IP地址。 --port:推理服务端口8080。 --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。 --served-model-name: 选择性添加,在接口中使用的模型名;如果没有配置,则默认为tokenizer。 脚本运行完成后,测试结果保存在benchmark_parallel.csv中,示例如下图所示。 图1 静态benchmark测试结果(示意图)
  • 动态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 vllm --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 --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。 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图2 动态benchmark测试结果(示意图)
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-LLM-xxx.zip的llm_tools/llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态、动态性能评测脚本 ├── requirements.txt # 第三方依赖
  • Step1 检查环境 SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。 npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态 npu-smi info -l | grep Total # 在每个实例节点上运行此命令可以看到总卡数,用来确认对应卡数已经挂载 npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。 驱动版本要求是23.0.6。如果不符合要求请参考安装固件和驱动章节升级驱动。 检查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 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /var/log/npu/:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ${dir}:${container_work_dir} \ --net=host \ --name ${container_name} \ ${image_id} \ /bin/bash 参数说明: --device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7。 -v ${dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的大文件系统,dir为宿主机中文件目录,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,即第四步中生成的新镜像id,在宿主机上可通过docker images查询得到。
  • Step3 上传代码包和权重文件 上传安装依赖软件推理代码AscendCloud-LLM-6.3.907-xxx.zip和算子包AscendCloud-OPP-6.3.907-xxx.zip到主机中,包获取路径请参见表2。 将权重文件上传到DevServer机器中。权重文件的格式要求为Huggingface格式。开源权重文件获取地址请参见表3。 如果使用模型训练后的权重文件进行推理,模型训练及训练后的权重文件转换操作可以参考相关文档章节中提供的模型训练文档。 权重要求放在磁盘的指定目录,并做目录大小检查,参考命令如下: df -h
  • Step4 制作推理镜像 解压AscendCloud压缩包及该目录下的推理代码AscendCloud-LLM-6.3.907-xxx.zip和算子包AscendCloud-OPP-6.3.907-xxx.zip,并执行build_image.sh脚本制作推理镜像。安装过程需要连接互联网git clone,请确保机器环境可以访问公网。 unzip AscendCloud-*.zip -d ./AscendCloud && unzip ./AscendCloud/AscendCloud-OPP-*.zip -d ./AscendCloud/AscendCloud-OPP && unzip ./AscendCloud/AscendCloud-LLM-*.zip -d ./AscendCloud/AscendCloud-LLM && cd ./AscendCloud/AscendCloud-LLM/llm_inference/ascend_vllm/ && sh build_image.sh --base-image=${base_image} --image-name=${image_name} 参数说明: ${base_image}为基础镜像地址。 ${image_name}为推理镜像名称,可自行指定。 运行完后,会生成推理所需镜像。
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.907中的AscendCloud-LLM-xxx.zip软件包和算子包AscendCloud-OPP,AscendCloud-LLM关键文件介绍如下。 |——AscendCloud-LLM ├──llm_inference # 推理代码 ├──ascend_vllm ├── vllm_npu # 推理源码 ├── ascend_vllm-0.5.0-py3-none-any.whl # 推理安装包 ├── build.sh # 推理构建脚本 ├── vllm_install.patch # 社区昇腾适配的补丁包 ├── Dockerfile # 推理构建镜像dockerfile ├── build_image.sh # 推理构建镜像启动脚本 ├──llm_tools # 推理工具包 ├──AutoSmoothQuant # W8A8量化工具 ├── ascend_autosmoothquant_adapter # 昇腾量化使用的算子模块 ├── autosmoothquant # 量化代码 ├── build.sh # 安装量化模块的脚本 ├──AutoAWQ # W4A16量化工具 ├──convert_awq_to_npu.py # awq权重转换脚本 ├──quantize.py # 昇腾适配的量化转换脚本 ├──build.sh # 安装量化模块的脚本 ├──llm_evaluation # 推理评测代码包 ├──benchmark_tools #性能评测 ├── benchmark.py # 可以基于默认的参数跑完静态benchmark和动态benchmark ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── benchmark_utils.py # 抽离的工具集 ├── generate_datasets.py # 生成自定义数据集的脚本 ├── requirements.txt # 第三方依赖 ├──benchmark_eval #精度评测 ├──opencompass.sh #运行opencompass脚本 ├──install.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字
  • 支持的模型列表和权重文件 本方案支持vLLM的v0.5.0版本。不同vLLM版本支持的模型列表有差异,具体如表3所示。 表3 支持的模型列表和权重获取地址 序号 模型名称 是否支持fp16/bf16推理 是否支持W4A16量化 是否支持W8A8量化 是否支持 kv-cache-int8量化 开源权重获取地址 1 llama-7b √ √ √ √ https://huggingface.co/huggyllama/llama-7b 2 llama-13b √ √ √ √ https://huggingface.co/huggyllama/llama-13b 3 llama-65b √ √ √ √ https://huggingface.co/huggyllama/llama-65b 4 llama2-7b √ √ √ √ https://huggingface.co/meta-llama/Llama-2-7b-chat-hf 5 llama2-13b √ √ √ √ https://huggingface.co/meta-llama/Llama-2-13b-chat-hf 6 llama2-70b √ √ √ √ https://huggingface.co/meta-llama/Llama-2-70b-hf https://huggingface.co/meta-llama/Llama-2-70b-chat-hf (推荐) 7 llama3-8b √ √ √ √ https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct 8 llama3-70b √ √ √ √ https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct 9 yi-6b √ √ √ √ https://huggingface.co/01-ai/Yi-6B-Chat 10 yi-9b √ √ √ √ https://huggingface.co/01-ai/Yi-9B 11 yi-34b √ √ √ √ https://huggingface.co/01-ai/Yi-34B-Chat 12 deepseek-llm-7b √ x x x https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat 13 deepseek-coder-33b-instruct √ x x x https://huggingface.co/deepseek-ai/deepseek-coder-33b-instruct 14 deepseek-llm-67b √ x x x https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat 15 qwen-7b √ √ √ x https://huggingface.co/Qwen/Qwen-7B-Chat 16 qwen-14b √ √ √ x https://huggingface.co/Qwen/Qwen-14B-Chat 17 qwen-72b √ √ √ x https://huggingface.co/Qwen/Qwen-72B-Chat 18 qwen1.5-0.5b √ √ √ x https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat 19 qwen1.5-7b √ √ √ x https://huggingface.co/Qwen/Qwen1.5-7B-Chat 20 qwen1.5-1.8b √ √ √ x https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat 21 qwen1.5-14b √ √ √ x https://huggingface.co/Qwen/Qwen1.5-14B-Chat 22 qwen1.5-32b √ √ √ x https://huggingface.co/Qwen/Qwen1.5-32B/tree/main 23 qwen1.5-72b √ √ √ x https://huggingface.co/Qwen/Qwen1.5-72B-Chat 24 qwen1.5-110b √ √ √ x https://huggingface.co/Qwen/Qwen1.5-110B-Chat 25 qwen2-0.5b √ √ √ x https://huggingface.co/Qwen/Qwen2-0.5B-Instruct 26 qwen2-1.5b √ √ √ x https://huggingface.co/Qwen/Qwen2-1.5B-Instruct 27 qwen2-7b √ √ x x https://huggingface.co/Qwen/Qwen2-7B-Instruct 28 qwen2-72b √ √ √ x https://huggingface.co/Qwen/Qwen2-72B-Instruct 29 baichuan2-7b √ x x x https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat 30 baichuan2-13b √ x x x https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 31 gemma-2b √ x x x https://huggingface.co/google/gemma-2b 32 gemma-7b √ x x x https://huggingface.co/google/gemma-7b 33 chatglm2-6b √ x x x https://huggingface.co/THUDM/chatglm2-6b 34 chatglm3-6b √ x x x https://huggingface.co/THUDM/chatglm3-6b 35 glm-4-9b √ x x x https://huggingface.co/THUDM/glm-4-9b-chat 36 mistral-7b √ x x x https://huggingface.co/mistralai/Mistral-7B-v0.1 37 mixtral-8x7b √ x x x https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1 38 falcon-11b √ x x x https://huggingface.co/tiiuae/falcon-11B/tree/main 39 qwen2-57b-a14b √ x x x https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct 40 llama3.1-8b √ x x x https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct 41 llama3.1-70b √ x x x https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct 说明:当前版本中yi-34b、qwen1.5-32b模型暂不支持单卡启动。
  • 镜像版本 本教程中用到基础镜像地址和配套版本关系如下表所示,请提前了解。 表1 基础容器镜像地址 镜像用途 镜像地址 配套版本 基础镜像 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
  • 软件配套版本 本方案支持的软件配套版本和依赖包获取地址如表2所示。 表2 软件配套版本和获取地址 软件名称 说明 下载地址 AscendCloud-6.3.907-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的推理部署代码和推理评测代码、推理依赖的算子包。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 资源规格要求 本文档中的模型运行环境是ModelArts Lite的DevServer。推荐使用“西南-贵阳一”Region上的资源和Ascend Snt9B。 如果使用DevServer资源,请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。
  • 约束限制 本方案目前仅适用于部分企业客户。 本文档适配昇腾云ModelArts 6.3.907版本,请参考软件配套版本获取配套版本的软件包,请严格遵照版本配套关系使用本文档。 资源规格推荐使用“西南-贵阳一”Region上的DevServer和昇腾Snt9B资源。 推理部署使用的服务框架是vLLM。vLLM支持v0.5.0版本。 支持FP16和BF16数据类型推理。 DevServer驱动版本要求23.0.6。
共100000条