华为云用户手册

  • 什么是分离部署 大模型推理是自回归的过程,有以下两阶段: Prefill阶段(全量推理) 将用户请求的prompt传入大模型,进行计算,中间结果写入KVCache并推出第1个token,属于计算密集型。 Decode阶段(增量推理) 将请求的前1个token传入大模型,从显存读取前文产生的KVCache再进行计算,属于访存密集型。 分离部署场景下,全量推理和增量推理在不同的容器上进行,用于提高资源利用效率。 分离部署的实例类型启动分为以下三个阶段: 步骤六 启动全量推理实例:必须为NPU实例,用于启动全量推理服务,负责输入的全量推理。全量推理占用至少1个容器。 步骤七 启动增量推理实例:必须为NPU实例,用于启动增量推理服务,负责输入的增量推理。增量推理占用至少1个容器。 步骤八 启动scheduler实例:可为CPU实例,用于启动api-server服务,负责接收推理请求,向全量或增量推理实例分发请求,收集推理结果并向客户端返回推理结果。服务调度实例不占用显卡资源,建议增加1个容器,也可以在全量推理或增量推理的容器上启动。
  • 步骤一 检查环境 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
  • 步骤三 上传代码包和权重文件 上传安装依赖软件推理代码AscendCloud-LLM-6.3.911-xxx.zip和算子包AscendCloud-OPP-6.3.911-xxx.zip到主机中,包获取路径请参见表2。 将权重文件上传到Server机器中。权重文件的格式要求为Huggingface格式。开源权重文件获取地址请参见表3。 如果使用模型训练后的权重文件进行推理,模型训练及训练后的权重文件转换操作可以参考相关文档章节中提供的模型训练文档。 3.权重要求放在磁盘的指定目录,并做目录大小检查,参考命令如下: df -h
  • 步骤四 制作推理镜像 解压AscendCloud压缩包及该目录下的推理代码AscendCloud-LLM-6.3.911-xxx.zip和算子包AscendCloud-OPP-6.3.911-xxx.zip,并执行build_image.sh脚本制作推理镜像。安装过程需要连接互联网git clone,请确保机器环境可以访问公网。 unzip AscendCloud-*.zip -d ./AscendCloud && cd ./AscendCloud && unzip AscendCloud-OPP-*.zip && unzip AscendCloud-OPP-*-torch-2.1.0*.zip -d ./AscendCloud-OPP && cd .. && 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}为推理镜像名称,可自行指定。 运行完后,会生成推理所需镜像。 如果推理需要使用npu加速图片预处理,需要安装torchvision_npu,可放到镜像制作脚本里面。内容如下: git clone https://gitee.com/ascend/vision.git vision_npu cd vision_npu git checkout v0.16.0-6.0.rc3 # 安装依赖库 pip3 install -r requirement.txt # 编包 python setup.py bdist_wheel # 安装 cd dist pip install torchvision_npu-0.16.*.whl
  • 步骤六 启动全量推理实例 以下介绍如何启动全量推理实例。 启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ -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设备,示例中挂载了2张卡davinci4、davinci5。 -v ${dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的大文件系统,dir为宿主机中文件目录,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。 如果需要多个全量实例,每个全量都需要启动一个容器,只挂载对应的NPU --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,即第四步中生成的新镜像id,在宿主机上可通过docker images查询得到。 进入容器。 docker exec -it -u ma-user ${container-name} /bin/bash 启动全量推理实例,命令如下。 export GLOBAL_RANK_TABLE_FILE_PATH=global_ranktable_10.**.**.18.json export RANK_TABLE_FILE_PATH=local_rank_table_10.**.**.18_45.json export NODE_PORTS=8088,8089 export USE_OPENAI=1 sh AscendCloud-LLM/llm_tools/PD_separate/start_servers.sh \ --model=${model} \ --tensor-parallel-size=2 \ --max-model-len=4096 \ --max-num-seqs=256 \ --max-num-batched-tokens=4096 \ --host=0.0.0.0 \ --port=8088 \ --served-model-name ${served-model-name} 其中环境变量说明如下: GLOBAL_RANK_TABLE_FILE_PATH:global rank_table的路径,必选。不同实例类型的global rank_table均一致。 RANK_TABLE_FILE_PATH:local rank_table的路径,必选。当实例类型为全量推理实例或者增量推理实例,local rank_table配置local_ranktable_xx_yy.json文件,其中xx表示当前实例的IP地址,yy表示当前实例使用的device_id信息;当实例类型为服务入口实例,local rank_table配置local_ranktable_xx_host.json文件,其中xx表示当前实例的IP地址。 NODE_PORTS:仅在服务入口实例生效,用于与全量推理实例、增量推理实例的信息交互。该参数入参为形如{port1},{port2},{portn}的字符串,与全量或增量推理实例启动的--port参数相关。--port表示服务部署的端口。每个全量/增量推理实例基于配置的端口号(`--port`)启动服务,并按照global rank_table中的全量实例、增量实例的顺序,对全量推理实例、增量推理实例启动的端口号进行排序,端口之间用`,`分隔开作为该环境变量的输入。 USE_OPENAI:仅在服务入口实例生效,用于配置api-server服务是否使用openai服务,默认为1。当配置为1时,启动服务为openai服务;当配置为0时,启动服务为vllm服务。 其中常见的参数如下: --host:服务部署的IP --port:服务部署的端口,注意如果不同实例部署在一台机器上,不同实例需要使用不同端口号 --model:HuggingFace下载的官方权重 --max-num-seqs:同时处理的最大句子数量 --max-model-len:模型能处理的请求输入+输出的token长度 --max-num-batched-tokens:最多会使用多少token,必须大于或等于--max-model-len,推荐使用4096或8192 --tensor-parallel-size:模型并行数量 --served-model-name:openai服务的model入参名称,仅在环境变量`USE_OPENAI=1`时候生效。 --quantization:如果需要增加模型量化功能,启动推理服务前,先参考使用AWQ量化、使用SmoothQuant量化或使用GPTQ量化章节对模型做量化处理。 参数定义和使用方式与vLLM0.6.3版本一致,此处介绍关键参数。详细参数解释请参见https://github.com/vllm-project/vllm/blob/main/vllm/engine/arg_utils.py。
  • 步骤五 生成ranktable 介绍如何生成ranktable,以1p1d-tp2分离部署模式为例。当前1p1d分离部署模式,全量节点和增量节点分别占用2张卡,一共使用4张卡。 配置tools工具根目录环境变量 使用AscendCloud-LLM发布版本进行推理,基于AscendCloud-LLM包的解压路径配置tool工具根目录环境变量: export LLM_TOOLS_PATH=${root_path_of_AscendCloud-LLM}/llm_tools 其中,`${root_path_of_AscendCloud-LLM}`为AscendCloud-LLM包解压后的根路径。 当使用昇腾云的官方指导文档制作推理镜像时,可直接基于该固定路径配置环境变量: export LLM_TOOLS_PATH=/home/ma-user/AscendCloud/AscendCloud-LLM/llm_tools 获取每台机器的rank_table 在每个机器生成global rank_table信息与local rank_table信息。 python ${LLM_TOOLS_PATH}/PD_separate/pd_ranktable_tools.py --mode gen --prefill-server-list 4,5 --decode-server-list 6,7 --api-server --save-dir ./save_dir 执行后,会生成一个global_ranktable.json文件和使用实例个数的local_ranktable.json文件;如果指定了`--api-server`,还会生成一个local_ranktable_host.json文件用于确定服务入口实例。 ./save_dir 生成ranktable文件如下(假设本地主机ip为10.**.**.18)。 global_ranktable_10.**.**.18.json # global rank_table local_ranktable_10.**.**.18_45.json # 全量节点local rank_table local_ranktable_10.**.**.18_67.json # 增量节点local rank_table local_ranktable_10.**.**.18_host.json # api-server 如果要启动多P多D服务,则需要修改--prefill-server-list和--decode-server-list参数,每个实例之间用空格隔开,例如2p2d-tp2: python ${LLM_TOOLS_PATH}/PD_separate/pd_ranktable_tools.py --mode gen --prefill-server-list 0,1 2,3 --decode-server-list 4,5 6,7 --api-server --save-dir ./save_dir 合并不同机器的global rank_table(可选) 如果分离部署在多台机器,获取每台机器的rank_table后,合并各个机器的global rank_table得到完整的global rank_table。 python ${LLM_TOOLS_PATH}/PD_separate/pd_ranktable_tools.py --mode merge --global-ranktable-list ./ranktable/global_ranktable_0.0,0,0.json ./ranktable/global_ranktable_1.1.1.1.json --save-dir ./save_dir pd_ranktable_tools.py的入参说明如下。 --mode:脚本的处理模式,可选值为gen或者merge。gen模式表示生成rank_table文件,merge模式表示合并global rank_table文件。 --save-dir:保存生成的rank_table文件的根目录,默认为当前目录。 --api-server:仅在`gen`模式有效,可选输入,当存在该输入时,表示分离部署的服务入口在该机器。注意,在多台机器启动分离部署时,只能有一台机器存在服务入口。当存在该输入时,会生成local_ranktable_xx_host.json文件,用于在启动推理服务时确定服务入口实例。 --prefill-server-list:仅在`gen`模式有效,可选输入,后续入参表示若干个vllm全量实例,使用空格隔开,每个vllm实例的数字表示使用的昇腾卡device_id,使用多个昇腾卡时,device_id之间使用`,`分隔开。当存在该输入时,会生成对应全量实例个数的local_ranktable_xx_yy.json文件,用于在启动推理服务时确定全量实例。 --decode-server-list:仅在`gen`模式有效,可选输入,后续入参表示若干个vllm增量实例,使用空格隔开,每个vllm实例的数字表示使用的昇腾卡device_id,使用多个昇腾卡时,device_id之间使用`,`分隔开。当存在该输入时,会生成对应增量实例个数的local_ranktable_xx_yy.json文件,用于在启动推理服务时确定增量实例。 --global-ranktable-list:仅在`merge`模式有效,必选输入,后续入参表示需要合并的global rank_table,使用空格分隔开。 执行后,会生成完成合并的global_ranktable_merge.json文件。 global_rank_table.json格式说明 server_group_list的长度必须为3,第一个元素(group_id="0")代表Scheduler实例的ip信息,只能有一个实例。 第二个元素(group_id="1")代表全量实例信息,长度即为全量实例个数。其中需要配置每个全量实例的ip信息以及使用的device信息。rank_id为逻辑卡号,必然从0开始计算,device_id为物理卡号,device_ip则通过上面的hccn_tool获取。 第三个元素(group_id="2")代表增量实例信息,长度即为增量实例个数。其余信息和全量类似。 global_rank_table.json具体示例如下: { "version": "1.0", "status": "completed", "server_group_list": [ { "group_id": "0", "server_count": "1", "server_list": [ { "server_id": "localhost", "server_ip": "localhost" } ] }, { "group_id": "1", "server_count": "1", "server_list": [ { "server_id": "localhost", "server_ip": "localhost", "device": [ { "device_id": "4", "device_ip": "10.**.**.22", "rank_id": "0" }, { "device_id": "5", "device_ip": "10.**.**.23", "rank_id": "1" } ] } ] }, { "group_id": "2", "server_count": "1", "server_list": [ { "server_id": "localhost", "server_ip": "localhost", "device": [ { "device_id": "6", "device_ip": "29.**.**.56", "rank_id": "0" }, { "device_id": "7", "device_ip": "29.**.**.72", "rank_id": "1" } ] } ] } ] } ``` local_rank_table.json格式说明 每个全量/增量实例都需要local_rank_table.json。下面以某一个增量实例为例,需要和global_rank_table.json中的增量信息完全对应,group_id为0。 ``` { "version": "1.0", "status": "completed", "group_id": "0", "server_count": "1", "server_list": [ { "server_id": "localhost", "server_ip": "localhost", "device": [ { "device_id": "6", "device_ip": "29.**.**.56", "rank_id": "0" }, { "device_id": "7", "device_ip": "29.**.**.72", "rank_id": "1" } ] } ] } ```
  • 步骤五 启动容器镜像 启动容器镜像前请先按照参数说明修改${}中的参数。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查询得到。
  • 步骤四 制作推理镜像 解压AscendCloud压缩包及该目录下的推理代码AscendCloud-LLM-6.3.911-xxx.zip和算子包AscendCloud-OPP-6.3.911-xxx.zip,并执行build_image.sh脚本制作推理镜像。安装过程需要连接互联网git clone,请确保机器环境可以访问公网。 unzip AscendCloud-*.zip -d ./AscendCloud && cd ./AscendCloud && unzip AscendCloud-OPP-*.zip && unzip AscendCloud-OPP-*-torch-2.1.0*.zip -d ./AscendCloud-OPP && cd .. && 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}为推理镜像名称,可自行指定。 运行完后,会生成推理所需镜像。 如果推理需要使用NPU加速图片预处理,适配了llava-1.5模型,启动时需要设置export ENABLE_USE_DVPP=1,需要安装torchvision_npu,可放到镜像制作脚本./AscendCloud/AscendCloud-LLM/llm_inference/ascend_vllm/Dockfile中。内容如下: git clone https://gitee.com/ascend/vision.git vision_npu cd vision_npu git checkout v0.16.0-6.0.rc3 # 安装依赖库 pip3 install -r requirement.txt # 编包 python setup.py bdist_wheel # 安装 cd dist pip install torchvision_npu-0.16.*.whl
  • 步骤一 检查环境 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
  • 步骤三 上传代码包和权重文件 上传安装依赖软件推理代码AscendCloud-LLM-6.3.911-xxx.zip和算子包AscendCloud-OPP-6.3.911-xxx.zip到主机中,包获取路径请参见表2。 将权重文件上传到Server机器中。权重文件的格式要求为Huggingface格式。开源权重文件获取地址请参见表3。 如果使用模型训练后的权重文件进行推理,模型训练及训练后的权重文件转换操作可以参考相关文档章节中提供的模型训练文档。 权重要求放在磁盘的指定目录,并做目录大小检查,参考命令如下。 df -h
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.911中的AscendCloud-LLM-xxx.zip软件包和算子包AscendCloud-OPP,AscendCloud-LLM关键文件介绍如下。 |——AscendCloud-LLM ├──llm_inference # 推理代码 ├──ascend_vllm ├── vllm_npu # 推理源码 ├── ascend_vllm-0.6.3-py3-none-any.whl # 推理安装包 ├── build.sh # 推理构建脚本 ├── vllm_install.patch # 社区昇腾适配的补丁包 ├── Dockerfile # 推理构建镜像dockerfile ├── build_image.sh # 推理构建镜像启动脚本 ├──llm_tools # 推理工具包 ├──AutoSmoothQuant # W8A8量化工具 ├── ascend_autosmoothquant_adapter # 昇腾量化使用的算子模块 ├── autosmoothquant_ascend # 量化代码 ├── 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.6.3版本。不同vLLM版本支持的模型列表有差异,具体如表3所示。 表3 支持的模型列表和权重获取地址 序号 模型名称 是否支持fp16/bf16推理 是否支持W4A16量化 是否支持W8A8量化 是否支持W8A16量化 是否支持 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 x https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat 13 deepseek-coder-33b-instruct √ x x x x https://huggingface.co/deepseek-ai/deepseek-coder-33b-instruct 14 deepseek-llm-67b √ x 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 qwen2.5-0.5b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct 30 qwen2.5-1.5b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct 31 qwen2.5-3b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-3B-Instruct 32 qwen2.5-7b √ √ x √ x https://huggingface.co/Qwen/Qwen2.5-7B-Instruct 33 qwen2.5-14b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-14B-Instruct 34 qwen2.5-32b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-32B-Instruct 35 qwen2.5-72b √ √ √ √ x https://huggingface.co/Qwen/Qwen2.5-72B-Instruct 36 baichuan2-7b √ x x √ x https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat 37 baichuan2-13b √ x x √ x https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 38 gemma-2b √ x x x x https://huggingface.co/google/gemma-2b 39 gemma-7b √ x x x x https://huggingface.co/google/gemma-7b 40 chatglm2-6b √ x x x x https://huggingface.co/THUDM/chatglm2-6b 41 chatglm3-6b √ x x x x https://huggingface.co/THUDM/chatglm3-6b 42 glm-4-9b √ x x x x https://huggingface.co/THUDM/glm-4-9b-chat 43 mistral-7b √ x x x x https://huggingface.co/mistralai/Mistral-7B-v0.1 44 mixtral-8x7b √ x x x x https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1 45 falcon-11b √ x x x x https://huggingface.co/tiiuae/falcon-11B/tree/main 46 qwen2-57b-a14b √ x x x x https://huggingface.co/Qwen/Qwen2-57B-A14B-Instruct 47 llama3.1-8b √ √ √ √ x https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct 48 llama3.1-70b √ √ √ √ x https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct 49 llama-3.1-405B √ √ x x x https://huggingface.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4 50 llama-3.2-1B √ x x x x Llama-3.2-1B-Instruct · 模型库 (modelscope.cn) 51 llama-3.2-3B √ x x x x Llama-3.2-3B-Instruct · 模型库 (modelscope.cn) 52 llava-1.5-7b √ x x x x https://huggingface.co/llava-hf/llava-1.5-7b-hf/tree/main 53 llava-1.5-13b √ x x x x https://huggingface.co/llava-hf/llava-1.5-13b-hf/tree/main 54 llava-v1.6-7b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-vicuna-7b-hf/tree/main 55 llava-v1.6-13b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-vicuna-13b-hf/tree/main 56 llava-v1.6-34b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-34b-hf/tree/main 57 internvl2-8B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-8B/tree/main 58 internvl2-26B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-26B/tree/main 59 internvl2-40B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-40B/tree/main 60 internVL2-Llama3-76B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B/tree/main 61 MiniCPM-v2.6 √ x x x x https://huggingface.co/openbmb/MiniCPM-V-2_6/tree/main 62 deepseek-v2-236b x x √ x x https://huggingface.co/deepseek-ai/DeepSeek-V2 63 deepseek-v2-lite-16b √ x √ x x https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite 64 qwen2-vl-2B √ x x x x https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct/tree/main 65 qwen2-vl-7B √ x x x x https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct/tree/main 66 qwen2-vl-72B √ x x x x https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct/tree/main 67 qwen-vl √ x x x x https://huggingface.co/Qwen/Qwen-VL 68 qwen-vl-chat √ x x x x https://huggingface.co/Qwen/Qwen-VL-Chat 69 MiniCPM-v2 √ x x x x https://huggingface.co/HwwwH/MiniCPM-V-2 注意:需要修改源文件site-packages/timm/layers/pos_embed.py,在第46行上面新增一行代码,如下: posemb = posemb.contiguous() #新增 posemb = F.interpolate(posemb, size=new_size, mode=interpolation, antialias=antialias) 各模型支持的卡数请参见附录:基于vLLM不同模型推理支持最小卡数和最大序列说明章节。
  • 镜像版本 本教程中用到基础镜像地址和配套版本关系如下表所示,请提前了解。 表1 基础容器镜像地址 镜像用途 镜像地址 配套版本 基础镜像 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-20241112192643-c45ac6b cann_8.0.rc3
  • 资源规格要求 本文档中的模型运行环境是ModelArts Lite的DevServer。推荐使用“西南-贵阳一”Region上的资源和Ascend Snt9B。 如果使用DevServer资源,请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。
  • 软件配套版本 本方案支持的软件配套版本和依赖包获取地址如表2所示。 表2 软件配套版本和获取地址 软件名称 说明 下载地址 AscendCloud-6.3.911-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的推理部署代码和推理评测代码、推理依赖的算子包。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E,在此路径中查找下载ModelArts 6.3.911 版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 约束限制 本方案目前仅适用于部分企业客户。 本文档适配昇腾云ModelArts 6.3.911版本,请参考软件配套版本获取配套版本的软件包,请严格遵照版本配套关系使用本文档。 资源规格推荐使用“西南-贵阳一”Region上的DevServer和昇腾Snt9B资源。 推理部署使用的服务框架是vLLM。vLLM支持v0.6.3版本。 支持FP16和BF16数据类型推理。 适配的CANN版本是cann_8.0.rc3。 DevServer驱动版本要求23.0.6。
  • 步骤二:非sharegpt格式数据集转换(可选) 如果数据集json文件不是sharegpt格式,而是常见的 { "prefix": "AAA" "input": "BBB", "output": "CCC" } 格式,则需要执行convert_to_sharegpt.py 文件将数据集转换为share gpt格式。 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 其中: input_file_path:预训练json文件地址。 out_file_name:输出的sharegpt格式文件地址。 prefix_name:预训练json文件的前缀 字段名称 (可设置为None,此时预训练数据集只有 input output 两段)输入前缀,(例如:您是一个xxx专家,您需要回答下面问题) input_name:预训练json文件的指令输入 字段名称(例如:请问苹果是什么颜色) output_name output:预训练json文件的output字段名称,例如:苹果是红色的。 code_type:预训练json文件编码 默认utf-8 当转换为share gpt格式时,prefix和 input会拼接成一段文字,作为human字段,提出问题,而output字段会作为gpt字段,做出回答。
  • 步骤五:训练生成权重转换成可以支持vLLM推理的格式 将训练完成后的权重文件(.bin文件或. safetensors文件),移动到下载好的开源权重目录下(即步骤4中,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 小模型权重文件名 --base-path:为大模型权重地址,例如 ./llama2-7b-chat --draft-path:小模型权重地址 即步骤四中config文件所在目录,例如 ./eagle_llama2-7b-chat --base-weight-name:为大模型包含lm_head的权重文件名,可以在 base-path 目录下的 model.safetensors.index.json 文件获取,例如llama2-7b-chat 的权重名为pytorch_model-00001-of-00002.bin --draft-weight-name 为小模型权重文件名,即刚才移动的.bin文件或者.safetensors 文件
  • 步骤三:sharegpt格式数据生成为训练data数据集 若使用开源数据集,推荐使用原论文代码仓数据集,下载地址:https://huggingface.co/datasets/Aeala/ShareGPT_Vicuna_unfiltered/blob/main/ShareGPT_V4.3_unfiltered_cleaned_split.json 否则使用第二步生成的开源数据集。 python allocation.py \ --outdir outdir0/sharegpt_0_99_mufp16 \ --end_num 100 \ --used_npus "0,1,2,3,4,5,6,7" \ --model_type llama \ --model_name ./llama-7B \ --data_path data_for_sharegpt.json \ --seed 42 \ --max_length 2048 \ --dtype bfloat16 其中 outdir:生成的训练data 地址 end_num:生成的data总条数 used_npus:使用哪些NPU model_type:使用模型类型 目前支持 qwen2 llama1 llama2 及 llama3,其中llama1、2及chat都填写llama model_name:模型地址 data_path:预训练数据集地址 即一中生成的文件地址 seed:生成训练data所使用的seed(此处42为开源训练设定参数) max_length:模型的max_length dtype:为模型dtype 默认为bfloat16
  • 步骤四:执行训练 安装完成后,执行: 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] tmpdir:即为步骤三中的outdir,训练data地址 cpdir:为训练生成权重的地址 configpath:为模型config文件的地址 basepath:为大模型权重地址 bs:为batch大小 其中,要获取模型config文件, 首先到https://github.com/SafeAILab/EAGLE/页找到对应eagle模型地址。 图1 EAGLE Weights 以llama2-chat-7B为例,单击进入后 ,如下图所示config文件,即为对应模型的eagle config文件。
  • 附录:Standard大模型推理常见问题 问题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 问题6:使用AWQ转换llama3.1系列模型权重出现报错ValueError: `rope_scaling` must be a dictionary with two fields, `type` and `factor`, 解决方法:将transformers升级到4.44.0,修改对应transformers中的transformers/models/llama/modeling_llama.py,在class LlamaRotaryEmbedding中的forward函数中增加self.inv_freq = self.inv_freq.npu() 问题7:使用Qwen2-7B、Qwen2-72B模型有精度问题,重复输出感叹号 检查【配置环境变量】章节中,高精度模式的环境变量是否开启 父主题: 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.910)
  • 附录:基于vLLM不同模型推理支持最小卡数和最大序列说明 基于vLLM(v0.6.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.1-8b 1 32 1 128 9 llama3-70b 8 32 4 64 10 llama3.1-70b 8 32 4 64 11 llama3.2-1b 1 128 1 128 12 llama3.2-3b 1 128 1 128 13 qwen-7b 1 8 1 32 14 qwen-14b 2 16 1 16 15 qwen-72b 8 8 4 16 16 qwen1.5-0.5b 1 128 1 256 17 qwen1.5-7b 1 8 1 32 18 qwen1.5-1.8b 1 64 1 128 19 qwen1.5-14b 2 16 1 16 20 qwen1.5-32b 4 32 2 64 21 qwen1.5-72b 8 8 4 16 22 qwen1.5-110b - - 8 128 23 qwen2-0.5b 1 128 1 256 24 qwen2-1.5b 1 64 1 128 25 qwen2-7b 1 8 1 32 26 qwen2-72b 8 32 4 64 27 qwen2.5-0.5b 1 32 1 32 28 qwen2.5-1.5b 1 32 1 32 29 qwen2.5-3b 1 32 1 32 30 qwen2.5-7b 1 32 1 32 31 qwen2.5-14b 2 32 1 32 32 qwen2.5-32b 4 32 2 64 33 qwen2.5-72b 8 32 4 32 34 chatglm2-6b 1 64 1 128 35 chatglm3-6b 1 64 1 128 36 glm-4-9b 1 32 1 128 37 baichuan2-7b 1 8 1 32 38 baichuan2-13b 2 4 1 4 39 yi-6b 1 64 1 128 40 yi-9b 1 32 1 64 41 yi-34b 4 32 2 64 42 deepseek-llm-7b 1 16 1 32 43 deepseek-coder-33b-instruct 4 32 2 64 44 deepseek-llm-67b 8 32 4 64 45 mistral-7b 1 32 1 128 46 mixtral-8x7b 4 8 2 32 47 gemma-2b 1 64 1 128 48 gemma-7b 1 8 1 32 49 falcon-11b 1 8 1 64 50 llava-1.5-7b 1 16 1 32 51 llava-1.5-13b 1 8 1 16 52 llava-v1.6-7b 1 16 1 32 53 llava-v1.6-13b 1 8 1 16 54 llava-v1.6-34b 4 32 2 64 55 internvl2-8b 2 8 1 16 56 internvl2-26b 2 8 1 8 57 internvl2-40b - - 2 32 58 MiniCPM-v2.6 2 4 1 32 59 llama-3.1-405B-AWQ - - 8 32 60 qwen2-57b-a14b - - 2 16 61 deepseek-v2-lite-16b 2 4 1 4 62 deepseek-v2-236b - - 8 4 63 qwen2-vl-7B 2 64 1 64 64 qwen-vl 1 64 1 64 65 qwen-vl-chat 1 64 1 64 66 MiniCPM-v2 2 16 1 16 “-”表示不支持。 父主题: 主流开源大模型基于Standard适配PyTorch NPU推理指导(6.3.910)
  • Step3 启动kv-cache-int8量化服务 参考Step3 启动推理服务,启动推理服务时添加如下命令。 --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。 执行如下脚本进行权重转换生成量化系数,详细参数解释请参见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)量化的模型列表请参见支持的模型列表和权重文件。 本章节介绍如何在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 父主题: 推理模型量化
  • 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:模型路径。
  • 动态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 openai --host 127.0.0.1 --port 8080 --num-scheduler-steps 8 --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 openai --url xxx --app-code xxx --num-scheduler-steps 8 --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。 --num-scheduler-steps: 需和服务启动时配置的num-scheduler-steps一致。默认为1 脚本运行完后,测试结果保存在benchmark_serving.csv中,示例如下图所示。 图4 动态benchmark测试结果(示意图)
  • 约束限制 创建在线服务时,每秒服务流量限制默认为100次,如果静态benchmark的并发数(parallel-num参数)或动态benchmark的请求频率(request-rate参数)较高,会触发推理平台的流控,请在ModelArts Standard“在线服务”详情页修改服务流量限制。 同步请求时,平台每次请求预测的时间不能超过60秒。例如输出数据比较大的调用请求(例如输出大于1k),请求预测会超过60秒导致调用失败,可提交工单设置请求超时时间。
  • 静态benchmark 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 Notebook中进行测试: conda activate python-3.9.10 cd benchmark_tools python benchmark_parallel.py --backend openai --host 127.0.0.1 --port 8080 --num-scheduler-steps 8 \ --tokenizer /path/to/tokenizer --epochs 10 --parallel-num 1 2 4 8 --output-tokens 256 256 --prompt-tokens 1024 2048 --benchmark-csv benchmark_parallel.csv 生产环境中进行测试: python benchmark_parallel.py --backend openai --url xxx --app-code xxx --num-scheduler-steps 8 \ --tokenizer /path/to/tokenizer --epochs 10 --parallel-num 1 2 4 8 --output-tokens 256 256 --prompt-tokens 1024 2048 --benchmark-csv benchmark_parallel.csv 参数说明: --backend:服务类型,支持tgi、vllm、mindspore、openai等。本文档使用的推理接口是vllm。 --host:服务IP地址,如127.0.0.1。 --port:服务端口,和推理服务端口8080。 --url:如果以vllm接口方式启动服务,API接口公网地址与"/generate"拼接而成;如果以openai接口方式启动服务,API接口公网地址与"/v1/completions"拼接而成。部署成功后的在线服务详情页中可查看API接口公网地址。 图1 API接口公网地址 --app-code:获取方式见访问在线服务(APP认证)。 --tokenizer:tokenizer路径,HuggingFace的权重路径。如果服务部署在Notebook中,该参数为Notebook中权重路径;如果服务部署在生产环境中,该参数为本地模型权重路径。 --served-model-name:仅在以openai接口启动服务时需要该参数。如果服务部署在Notebook中,该参数为Notebook中权重路径;如果服务部署在生产环境中,该参数为服务启动脚本run_vllm.sh中的${model_path}。 --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的数量对应。 --num-scheduler-steps: 需和服务启动时配置的num-scheduler-steps一致。默认为1 --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数据集进行测试。注意:当输入为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中,示例如下图所示。 图2 静态benchmark测试结果(示意图)
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-LLM-x.x.x.zip的llm_tools/llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态、动态性能评测脚本 ├── requirements.txt # 第三方依赖 目前性能测试已经支持投机推理能力。 执行性能测试脚本前,需先安装相关依赖。 conda activate python-3.9.10 pip install -r requirements.txt
共100000条