华为云用户手册

  • Step1 配置精度测试环境 获取精度测试代码。精度测试代码存放在代码包AscendCloud-LLM的llm_tools/llm_evaluation目录中,代码目录结构如下。 benchmark_eval ├──opencompass.sh #运行opencompass脚本 ├──install.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字 确保Notebook内通网,已通网可以跳过这一步,未通网需要配置$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: 要保存的结果路径。
  • Step1 准备模型文件和权重文件 在OBS桶中,创建文件夹,准备模型权重文件、推理启动脚本run_vllm.sh及SSL证书。此处以chatglm3-6b为例。 模型权重文件获取地址请参见表1。 若需要部署量化模型,请参考推理模型量化在Notebook中进行权重转换,并将转换后的权重上传至OBS中。 权重文件夹不要以"model"命名,若以"model"命名会导致后续创建AI应用报错。 推理启动脚本run_vllm.sh制作请参见•创建推理脚本文件run_vllm.sh。 SSL证书制作包含cert.pem和key.pem,需自行生成。生成方式请参见•通过openssl创建SSLpem证书。 图1 准备模型文件和权重文件 创建推理脚本文件run_vllm.sh run_vllm.sh脚本示例如下。 通过vLLM服务API接口启动服务 source /home/ma-user/.bashrc export ASCEND_RT_VISIBLE_DEVI CES =${ASCEND_RT_VISIBLE_DEVICES} python -m vllm.entrypoints.api_server --model ${model_path} \ --ssl-keyfile="/home/mind/model/key.pem" \ --ssl-certfile="/home/mind/model/cert.pem" \ --max-num-seqs=256 \ --max-model-len=4096 \ --max-num-batched-tokens=4096 \ --dtype=float16 \ --tensor-parallel-size=1 \ --block-size=128 \ --host=0.0.0.0 \ --port=8080 \ --gpu-memory-utilization=0.9 \ --trust-remote-code 通过OpenAI服务API接口启动服务 source /home/ma-user/.bashrc export ASCEND_RT_VISIBLE_DEVICES=${ASCEND_RT_VISIBLE_DEVICES} python -m vllm.entrypoints.openai.api_server --model ${model_path} \ --ssl-keyfile="/home/mind/model/key.pem" \ --ssl-certfile="/home/mind/model/cert.pem" \ --max-num-seqs=256 \ --max-model-len=4096 \ --max-num-batched-tokens=4096 \ --dtype=float16 \ --tensor-parallel-size=1 \ --block-size=128 \ --host=0.0.0.0 \ --port=8080 \ --gpu-memory-utilization=0.9 \ --trust-remote-code 参数说明: ${ASCEND_RT_VISIBLE_DEVICES}:使用的NPU卡,单卡设为0即可,4卡可设为0,1,2,3。 ${model_path}:模型路径,填写为/home/mind/model/权重文件夹名称,如:/home/mind/model/chatglm3-6b。 /home/mind/model路径为推理平台固定路径,部署服务时会将Step1 准备模型文件和权重文件OBS路径下的文件传输至/home/mind/model路径下。 --tensor-parallel-size:并行卡数。 --hostname:服务部署的IP,使用本机IP 0.0.0.0。 --port:服务部署的端口8080。 --max-model-len:最大数据输入+输出长度,不能超过模型配置文件config.json里面定义的“max_position_embeddings”和“seq_length”;如果设置过大,会占用过多显存,影响kvcache的空间。 --gpu-memory-utilization:NPU使用的显存比例,复用原vLLM的入参名称,默认为0.9。 --trust-remote-code:是否相信远程代码。 --dtype:模型推理的数据类型。仅支持FP16和BF16数据类型推理。float16表示FP16,bfloat16表示BF16。 推理启动脚本必须名为run_vllm.sh,不可修改其他名称。 hostname和port也必须分别是0.0.0.0和8080不可更改。 高阶参数说明: --enable-prefix-caching:如果prompt的公共前缀较长或者多轮对话场景下推荐使用prefix-caching特性。在推理服务启动脚本中添加此参数表示使用,不添加表示不使用。 --quantization:推理量化参数。当使用量化功能,则在推理服务启动脚本中增加该参数,若未使用量化功能,则无需配置。根据使用的量化方式配置,可选择awq或smoothquant方式。 --speculative-model ${container_draft_model_path}:投机草稿模型地址,模型格式是HuggingFace的目录格式。即Step2 准备权重文件上传的HuggingFace权重文件存放目录。投机草稿模型为与--model入参同系列,但是权重参数远小于--model指定的模型。若未使用投机推理功能,则无需配置。 --num-speculative-tokens:投机推理小模型每次推理的token数。若未使用投机推理功能,则无需配置。参数--num-speculative-tokens需要和--speculative-model ${container_draft_model_path}同时使用。 可在run_vllm.sh增加如下环境变量开启高阶配置: export DEFER_DECODE=1 # 是否使用推理与Token解码并行;默认值为1表示开启并行,取值为0表示关闭并行。开启该功能会略微增加首Token时间,但可以提升推理吞吐量。 export DEFER_MS=10 # 延迟解码时间,默认值为10,单位为ms。将Token解码延迟进行的毫秒数,使得当次Token解码能与下一次模型推理并行计算,从而减少总推理时延。该参数需要设置环境变量DEFER_DECODE=1才能生效。 export USE_VOCAB_PARALLEL=1 # 是否使用词表并行;默认值为1表示开启并行,取值为0表示关闭并行。对于词表较小的模型(如llama2系模型),关闭并行可以减少推理时延,对于词表较大的模型(如qwen系模型),开启并行可以减少显存占用,以提升推理吞吐量。 export USE_PFA_HIGH_PRECISION_MODE=1 # PFA算子是否使用高精度模式;默认值为0表示不开启。针对Qwen2-7B模型,必须开启此配置,否则精度会异常;其他模型不建议开启,因为性能会有损失。
  • Step4 调用在线服务 进入在线服务详情页面,选择“预测”。 若以vllm接口启动服务,设置请求路径:“/generate”,输入预测代码“{"prompt": "你好", "temperature":0, "max_tokens":20}”,单击“预测”既可看到预测结果。 图4 预测-vllm 若以openai接口启动服务,设置请求路径:“/v1/completions”,输入预测代码“{"prompt": "你是谁","model": "${model_path}","max_tokens": 50,"temperature":0}”,单击“预测”既可看到预测结果。 图5 预测-openai 在线服务的更多内容介绍请参见文档查看服务详情。
  • Step2 准备权重文件 将OBS中的模型权重上传到Notebook的工作目录/home/ma-user/work/下。上传代码参考如下。 import moxing as mox obs_dir = "obs://${bucket_name}/${folder-name}" local_dir = "/home/ma-user/work/qwen-14b" mox.file.copy_parallel(obs_dir, local_dir) 实际操作如下图所示。 图1 上传OBS文件到Notebook的代码示例
  • Step3 启动推理服务 配置需要使用的NPU卡编号。例如:实际使用的是第1张卡,此处填写“0”。 export ASCEND_RT_VISIBLE_DEVICES=0 如果启动服务需要使用多张卡,例如:实际使用的是第1张和第2张卡,此处填写为“0,1”,以此类推。 export ASCEND_RT_VISIBLE_DEVICES=0,1 NPU卡编号可以通过命令npu-smi info查询。 配置环境变量。 export DEFER_DECODE=1 # 是否使用推理与Token解码并行;默认值为1表示开启并行,取值为0表示关闭并行。开启该功能会略微增加首Token时间,但可以提升推理吞吐量。 export DEFER_MS=10 # 延迟解码时间,默认值为10,单位为ms。将Token解码延迟进行的毫秒数,使得当次Token解码能与下一次模型推理并行计算,从而减少总推理时延。该参数需要设置环境变量DEFER_DECODE=1才能生效。 export USE_VOCAB_PARALLEL=1 # 是否使用词表并行;默认值为1表示开启并行,取值为0表示关闭并行。对于词表较小的模型(如llama2系模型),关闭并行可以减少推理时延,对于词表较大的模型(如qwen系模型),开启并行可以减少显存占用,以提升推理吞吐量。 export USE_PFA_HIGH_PRECISION_MODE=1 # PFA算子是否使用高精度模式;默认值为0表示不开启。针对Qwen2-7B模型,必须开启此配置,否则精度会异常;其他模型不建议开启,因为性能会有损失。 如果需要增加模型量化功能,启动推理服务前,先参考推理模型量化章节对模型做量化处理。 启动服务与请求。此处提供vLLM服务API接口启动和OpenAI服务API接口启动2种方式。详细启动服务与请求方式参考:https://docs.vllm.ai/en/latest/getting_started/quickstart.html。 以下服务启动介绍的是在线推理方式,离线推理请参见https://docs.vllm.ai/en/latest/getting_started/quickstart.html#offline-batched-inference。 通过vLLM服务API接口启动服务 在ascend_vllm目录下通过vLLM服务API接口启动服务,具体操作命令如下,API Server的命令相关参数说明如下,可以根据参数说明修改配置。 python -m vllm.entrypoints.api_server --model ${model_path} \ --max-num-seqs=256 \ --max-model-len=4096 \ --max-num-batched-tokens=4096 \ --dtype=float16 \ --tensor-parallel-size=1 \ --block-size=128 \ --host=${docker_ip} \ --port=8080 \ --gpu-memory-utilization=0.9 \ --trust-remote-code 通过OpenAI服务API接口启动服务 在ascend_vllm目录下通OpenAI服务API接口启动服务,具体操作命令如下,可以根据参数说明修改配置。 python -m vllm.entrypoints.openai.api_server --model ${model_path} \ --max-num-seqs=256 \ --max-model-len=4096 \ --max-num-batched-tokens=4096 \ --dtype=float16 \ --tensor-parallel-size=1 \ --block-size=128 \ --host=${docker_ip} \ --port=8080 \ --gpu-memory-utilization=0.9 \ --trust-remote-code 具体参数说明如下: --model ${model_path}:模型地址,模型格式是HuggingFace的目录格式。即Step2 准备权重文件上传的HuggingFace权重文件存放目录。如果使用了量化功能,则使用推理模型量化章节转换后的权重。 --max-num-seqs:最大同时处理的请求数,超过后拒绝访问。 --max-model-len:推理时最大输入+最大输出tokens数量,输入超过该数量会直接返回。max-model-len的值必须小于config.json文件中的"seq_length"的值,否则推理预测会报错。config.json存在模型对应的路径下,例如:/home/ma-user/work/chatglm3-6b/config.json。 --max-num-batched-tokens:prefill阶段,最多会使用多少token,必须大于或等于--max-model-len,推荐使用4096或8192。 --dtype:模型推理的数据类型。支持FP16和BF16数据类型推理。float16表示FP16,bfloat16表示BF16。 --tensor-parallel-size:模型并行数。取值需要和启动的NPU卡数保持一致,可以参考1。此处举例为1,表示使用单卡启动服务。 --block-size:PagedAttention的block大小,推荐设置为128。 --host=${docker_ip}:服务部署的IP,${docker_ip}替换为宿主机实际的IP地址。 --port:服务部署的端口。 --gpu-memory-utilization:NPU使用的显存比例,复用原vLLM的入参名称,默认为0.9。 --trust-remote-code:是否相信远程代码。 高阶参数说明: --enable-prefix-caching:如果prompt的公共前缀较长或者多轮对话场景下推荐使用prefix-caching特性。在推理服务启动脚本中添加此参数表示使用,不添加表示不使用。 --quantization:推理量化参数。当使用量化功能,则在推理服务启动脚本中增加该参数,若未使用量化功能,则无需配置。根据使用的量化方式配置,可选择awq或smoothquant方式。 --speculative-model ${container_draft_model_path}:投机草稿模型地址,模型格式是HuggingFace的目录格式。即Step2 准备权重文件上传的HuggingFace权重文件存放目录。投机草稿模型为与--model入参同系列,但是权重参数远小于--model指定的模型。若未使用投机推理功能,则无需配置。 --num-speculative-tokens:投机推理小模型每次推理的token数。若未使用投机推理功能,则无需配置。参数--num-speculative-tokens需要和--speculative-model ${container_draft_model_path}同时使用。 服务启动后,会打印如下类似信息。 server launch time cost: 15.443044185638428 s INFO: Started server process [2878] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
  • 准备Notebook ModelArts Notebook云上云下,无缝协同,更多关于ModelArts Notebook的详细资料请查看Notebook使用场景介绍。本案例中使用ModelArts的开发环境Notebook部署推理服务进行调试,请按照以下步骤完成Notebook的创建。 登录ModelArts控制台,在贵阳一区域,进入开发环境的Notebook界面,单击右上角“创建”,创建一个开发环境。创建Notebook的详细介绍可以参考创建Notebook实例,此处仅介绍关键步骤。 创建Notebook时,选择 自定义镜像 ,并选择Step8 注册镜像章中注册的镜像。 图1 选择自定义镜像 资源类型推荐使用专属资源池,规格选到Ascend snt9b,显存规格建议选择64G以上的规格,磁盘规格建议选择500GB及以上。 创建完Notebook后,待Notebook状态变为“运行中”时,打开Notebook,可参考后续章节在Notebook调试环境中部署推理服务。 父主题: 准备工作
  • Step9 通过openssl创建SSL pem证书 在E CS 中执行如下命令,会在当前目录生成cert.pem和key.pem,并将生成的pem证书上传至OBS。证书用于后续在推理生产环境中部署HTTPS推理服务。 openssl genrsa -out key.pem 2048 openssl req -new -x509 -key key.pem -out cert.pem -days 1095
  • 镜像版本 本教程中用到基础镜像地址和配套版本关系如下表所示,请提前了解。 表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-20240606190017-b881580 CANN:cann_8.0.rc2 PyTorch:2.1.0
  • Step2 安装Docker 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • 软件配套版本 本方案支持的软件配套版本和依赖包获取地址如表1所示。 表1 软件配套版本和获取地址 软件名称 说明 下载地址 AscendCloud-6.3.906-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的推理部署代码和推理评测代码、推理依赖的算子包。代码包具体说明请参见模型软件包结构说明。 获取路径:Support-E 说明: 如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 模型软件包结构说明 本教程需要使用到的AscendCloud-6.3.906中的AscendCloud-LLM-xxx.zip软件包和算子包AscendCloud-OPP,AscendCloud-LLM关键文件介绍如下。 |——AscendCloud-LLM ├──llm_inference # 推理代码 ├──ascend_vllm ├── vllm_npu # 推理源码 ├── ascend_vllm-0.4.2-py3-none-any.whl # 推理安装包 ├── build.sh # 推理构建脚本 ├── vllm_install.patch # 社区昇腾适配的补丁包 ├──llm_tools # 推理工具包 ├──AutoSmoothQuant # W8A8量化工具 ├── ascend_autosmoothquant_adapter # 昇腾量化使用的算子模块 ├── autosmoothquant # 量化代码 ├── build.sh # 安装量化模块的脚本 ├──awq # W4A16量化工具 ├──convert_awq_to_npu.py # awq权重转换脚本 ├──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脚本 ├──start.sh #安装opencompass脚本 ├──vllm_api.py #启动vllm api服务器 ├──vllm.py #构造vllm评测配置脚本名字
  • 准备权重 获取对应模型的权重文件,获取链接参考表1。 在创建的OBS桶下创建文件夹用以存放权重文件,例如在桶中创建文件夹。将下载的权重文件上传至OBS中,得到OBS下数据集结构。此处以qwen-14b举例。 obs://${bucket_name}/${folder-name}/ #OBS桶名称和文件目录可以自定义创建,此处仅为举例。 ├── config.json ├── generation_config.json ├── gitattributes.txt ├── LICENSE.txt ├── Notice.txt ├── pytorch_model-00001-of-00003.bin ├── pytorch_model-00002-of-00003.bin ├── pytorch_model-00003-of-00003.bin ├── pytorch_model.bin.index.json ├── README.md ├── special_tokens_map.json ├── tokenizer_config.json ├── tokenizer.json ├── tokenizer.model └── USE_POLICY.md └── ... 父主题: 准备工作
  • 创建OBS桶 ModelArts使用 对象存储服务 (Object Storage Service,简称OBS)存储输入输出数据、运行代码和模型文件,实现安全、高可靠和低成本的存储需求。因此,在使用ModelArts之前通常先创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。 本文档也以将运行代码存放OBS为例,请参考创建OBS桶,例如桶名:standard-qwen-14b。并在该桶下创建文件夹目录用于后续存储代码使用,例如:code。 创建的OBS桶和开通的Standard资源必须在同一个Region。
  • 操作流程 图1 操作流程图 表2 操作任务流程说明 阶段 任务 说明 准备工作 准备资源 本教程案例是基于ModelArts Standard运行,需要购买ModelArts专属资源池。 准备权重 准备对应模型的权重文件。 准备代码 准备AscendCloud-6.3.906-xxx.zip。 准备镜像 准备推理模型适用的容器镜像。 准备Notebook 本案例在Notebook上部署推理服务进行调试,因此需要创建Notebook。 部署推理服务 在Notebook调试环境中部署推理服务 介绍如何在Notebook中配置NPU环境,部署并启动推理服务,完成精度测试和性能测试。 若需要部署量化模型,需在Notebook中进行模型权重转换后再部署推理服务。 在推理生产环境中部署推理服务 介绍如何在创建AI应用,部署并启动推理服务,在线预测在线服务。
  • 支持的模型列表 本方案支持的模型列表、对应的开源权重获取地址如表1所示。 表1 支持的模型列表和权重获取地址 序号 模型名称 是否支持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 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
  • 动态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_datasets.py脚本生成数据集方法: generate_datasets.py脚本通过指定输入输出长度的均值和标准差,生成一定数量的正态分布的数据。具体操作命令如下,可以根据参数说明修改参数。 cd benchmark_tools python generate_datasets.py --datasets 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_datasets.py脚本执行参数说明如下: --datasets:数据集保存路径,如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中进行测试: 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等。本文档使用的推理接口是vllm。 --host:服务IP地址,如127.0.0.1。 --port:服务端口。 --url:API接口公网地址与"/v1/completions"拼接而成,部署成功后的在线服务详情页中可查看API接口公网地址。 图3 API接口公网地址 --app-code:获取方式见访问在线服务(APP认证)。 --datasets:数据集路径。 --datasets-type:支持三种 "alpaca","sharegpt","custom"。custom为自定义数据集。 --tokenizer:tokenizer路径,可以是huggingface的权重路径。若服务部署在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测试结果(示意图)
  • benchmark方法介绍 性能benchmark包括两部分。 静态性能测试:评估在固定输入、固定输出和固定并发下,模型的吞吐与首token延迟。该方式实现简单,能比较清楚的看出模型的性能和输入输出长度、以及并发的关系。 动态性能测试:评估在请求并发在一定范围内波动,且输入输出长度也在一定范围内变化时,模型的延迟和吞吐。该场景能模拟实际业务下动态的发送不同长度请求,能评估推理框架在实际业务中能支持的并发数。 性能benchmark验证使用到的脚本存放在代码包AscendCloud-3rdLLM-x.x.x.zip的llm_evaluation目录下。 代码目录如下: benchmark_tools ├── benchmark_parallel.py # 评测静态性能脚本 ├── benchmark_serving.py # 评测动态性能脚本 ├── generate_dataset.py # 生成自定义数据集的脚本 ├── benchmark_utils.py # 工具函数集 ├── benchmark.py # 执行静态,动态性能评测脚本 执行性能测试脚本前,需先安装相关依赖。 pip install -r requirements.txt
  • 静态benchmark 运行静态benchmark验证脚本benchmark_parallel.py,具体操作命令如下,可以根据参数说明修改参数。 notebook中进行测试: cd benchmark_tools python benchmark_parallel.py --backend vllm --host 127.0.0.1 --port 8080 --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 vllm --url xxx --app-code xxx --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等。本文档使用的推理接口是vllm。 --host:服务IP地址,如127.0.0.1。 --port:服务端口,和推理服务端口8080。 --url:API接口公网地址与"/v1/completions"拼接而成,部署成功后的在线服务详情页中可查看API接口公网地址。 图1 API接口公网地址 --app-code:获取方式见访问在线服务(APP认证)。 --tokenizer:tokenizer路径,HuggingFace的权重路径。若服务部署在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的数量对应。 脚本运行完成后,测试结果保存在benchmark_parallel.csv中,示例如下图所示。 图2 静态benchmark测试结果(示意图)
  • Step2 查看精度测试结果 默认情况下,评测结果会按照result/{service_name}/{eval_dataset}-{timestamp} 的目录结果保存到对应的测试工程。执行多少次,则会在{service_name}下生成多少次结果。 单独的评测结果如下: {eval_dataset}-{timestamp} # 例如: mmlu-20240205093257 ├── accuracy │ ├── evaluation_accuracy.xlsx # 测试的评分结果,包含各个学科数据集的评分和总和评分。 ├── infer_info │ ├── xxx1.csv # 单个数据集的评测结果 │ ├── ...... │ ├── xxxn.csv # 单个数据集的评测结果 ├── summary_result │ ├── answer_correct.xlsx # 回答正确的结果 │ ├── answer_error.xlsx # 保存回答了问题的选项,但是回答结果错误 │ ├── answer_result_unknow.xlsx # 保存未推理出结果的问题,例如超时、系统错误 │ ├── system_error.xlsx # 保存推理结果,但是可能答非所问,无法判断是否正确,需要人工判断进行纠偏。
  • Step1 执行精度测试 精度测试需要数据集进行测试。推荐公共数据集mmlu和ceval。AscendCloud-3rdLLM-6.3.905-xxx.zip代码包已包含数据集。 精度测试使用的是openai接口,部署服务的时候请使用openai-api启动,暂不支持vllm-api接口。 获取精度测试代码。精度测试代码存放在代码包AscendCloud-3rdLLM的/llm_evaluation目录中,代码目录结构如下: benchmark_eval ├── config │ ├── config.json # 服务的配置模板,已配置了ma-standard,tgi示例 │ ├── mmlu_subject_mapping.json # mmlu数据集学科信息 │ ├── ceval_subject_mapping.json # ceval数据集学科信息 ├── evaluators │ ├── evaluator.py # 数据集数据预处理方法集 │ ├── chatglm.py # 处理请求相应模块, 一般和chatglm的官方评测数据集ceval搭配 │ ├── llama.py # 处理请求相应模块, 一般和llama的评测数据集mmlu搭配 ├── mmlu-exam, mmlu数据集 ├── ceval-exam, ceval数据集 ├── eval_test.py # 启动脚本,建立线程池发送请求,并汇总结果 ├── service_predict.py # 发送请求的服务 执行精度测试启动脚本eval_test.py,具体操作命令如下,可以根据参数说明修改参数。 python eval_test.py \ --max_workers=1 \ --service_name=qwen-14b-test \ --eval_dataset=ceval \ --service_url=${API接口公网地址}/v1/completions \ --few_shot=3 \ --is_devserver=False \ --vllm_model=${model_path} \ --deploy_method=vllm 参数说明: max_workers:请求的最大线程数,默认为1。 service_name:服务名称,保存评测结果时创建目录,示例为:qwen-14b-test。 eval_dataset:评测使用的评测集(枚举值),目前仅支持mmlu、ceval。 service_url:服务接口地址,若服务部署在notebook中,该地址为"http://127.0.0.1:${port}/v1/completions";若服务部署在生产环境中,该地址由API接口公网地址与"/v1/completions"拼接而成,部署成功后的在线服务详情页中可查看API接口公网地址。 图1 API接口公网地址 few_shot:开启少量样本测试后添加示例样本的个数。默认为3,取值范围为0~5整数。 is_devserver: 是否DevServer部署方式,True表示DevServer模式。False表示ModelArts Standard模式。 vllm_model:对应Step4 部署并启动推理服务中的模型地址参数model,模型格式是Huggingface的目录格式。 deploy_method:部署方法,不同的部署方式api参数输入、输出解析方式不同,目前支持tgi、vllm等方式,本案例使用vllm部署方式。 若要在生产环境中进行精度测试,还需修改benchmark_eval/config/config.json中app_code,app_code获取方式见访问在线服务(APP认证)。
  • Step5 推理服务高阶配置(可选) 如需开启以下高阶配置,请在•创建推理脚本文件run_vllm.sh章节创建的推理脚本run_vllm.sh中增加需要开启的高阶配置。 词表切分 在分布式场景下,默认不使用词表切分能提升推理性能,同时也会增加单卡的显存占用。不建议开启词表并行,如确需使用词表切分,配置以下环境变量。 export USE_VOCAB_PARALLEL=1 关闭词表切分的命令: unset USE_VOCAB_PARALLEL 配置后重启推理服务生效。 Matmul_all_reduce融合算子 使用Matmul_all_reduce融合算子能提升全量推理性能,该算子对驱动和固件版本要求较高,默认不开启。如需开启,配置以下环境变量。 export USE_MM_ALL_REDUCE_OP=1 关闭Matmul_all_reduce融合算子的命令: unset USE_MM_ALL_REDUCE_OP 配置后重启推理服务生效。 查看详细日志 查看详细耗时日志可以辅助定位性能瓶颈,但会影响推理性能。如需开启,配置以下环境变量。 export DETAIL_TIME_ LOG =1 export RAY_DEDUP_LOGS=0 关闭详细日志命令: unset DETAIL_TIME_LOG 配置后重启推理服务生效。
  • Step1 准备模型文件和权重文件 在OBS桶中,创建文件夹,准备ascend_vllm代码包、模型权重文件、推理启动脚本run_vllm.sh及SSL证书。此处以chatglm3-6b为例。 ascend_vllm代码包在Step9 构建推理代码已生成。 模型权重文件获取地址请参见表1。 推理启动脚本run_vllm.sh制作请参见•创建推理脚本文件run_vllm.sh。 SSL证书制作包含cert.pem和key.pem,需自行生成。生成方式请参见•通过openssl创建SSLpem证书。 图1 准备模型文件和权重文件 创建推理脚本文件run_vllm.sh run_vllm.sh脚本内容如下。 source /home/ma-user/.bashrc export ASCEND_RT_VISIBLE_DEVICES=${ASCEND_RT_VISIBLE_DEVICES} export PYTHONPATH=$PYTHONPATH:/home/mind/model/ascend_vllm cd /home/mind/model/ascend_vllm/ python /home/mind/model/ascend_vllm/vllm/entrypoints/api_server.py --model="${model_path}" --ssl-keyfile="/home/mind/model/key.pem" --ssl-certfile="/home/mind/model/cert.pem" --tensor-parallel-size 1 --gpu-memory-utilization 0.95 --max-model-len=4096 --trust-remote-code --dtype="float16" --host=0.0.0.0 --port=8080 参数说明: ${ASCEND_RT_VISIBLE_DEVICES}:使用的NPU卡,单卡设为0即可,4卡可设为0,1,2,3。 ${model_path}:模型路径,填写为/home/mind/model/权重文件夹名称,如:home/mind/model/chatglm3-6b。 --tensor-parallel-size:并行卡数。 --hostname:服务部署的IP,使用本机IP 0.0.0.0。 --port:服务部署的端口8080。 --max-model-len:最大数据输入+输出长度,不能超过模型配置文件config.json里面定义的“max_position_embeddings”和“seq_length”;如果设置过大,会占用过多显存,影响kvcache的空间。不同模型推理支持的max-model-len长度不同,具体差异请参见附录:基于vLLM(v0.3.2)不同模型推理支持的max-model-len长度说明。 --gpu-memory-utilization:NPU使用的显存比例,复用原vLLM的入参名称,默认为0.9。 --trust-remote-code:是否相信远程代码。 --dtype:模型推理的数据类型。仅支持FP16和BF16数据类型推理。float16表示FP16,bfloat16表示BF16。 其他参数可以根据实际情况进行配置,也可使用openai接口启动服务。 推理启动脚本必须名为run_vllm.sh,不可修改其他名称。 hostname和port也必须分别是0.0.0.0和8080不可更改。
  • Step3 配置NPU环境 在Notebook的terminal中执行如下命令进行环境配置。 配置需要的NPU卡。 export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 0,1,2,3修改为需要使用的卡,如需使用全部8张卡,修改为0,1,2,3,4,5,6,7。 配置PYTHONPATH。 export PYTHONPATH=$PYTHONPATH:${vllm_path} ${vllm_path}:指定到ascend_vllm文件夹的绝对路径。 进入工作目录。 cd ascend_vllm
  • Step4 部署并启动推理服务 在Step3中的terminal部署并启动推理服务。有2种方式,使用vllm-api启动推理服务,或者使用openai-api启动推理服务。参考命令如下: # 使用vllm-api python vllm/entrypoints/api_server.py \ --model="${model_path}" \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.95 \ --max-model-len=4096 \ --trust-remote-code \ --dtype="float16" \ --host=0.0.0.0 \ --port=8080 # 使用openai-api python vllm/entrypoints/openai/api_server.py \ --model="${model_path}" \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.95 \ --max-model-len=4096 \ --trust-remote-code \ --dtype="float16" \ --host=0.0.0.0 \ --port=8080 参数说明: --model:模型地址,模型格式是Huggingface的目录格式。 --tensor-parallel-size:并行卡数。 --gpu-memory-utilization:0~1之间的float,实际使用的显存是系统读取的最大显存*gpu-memory-utilization。 --max-model-len:最大数据输入+输出长度,不能超过模型配置文件config.json里面定义的“max_position_embeddings”和“seq_length”;如果设置过大,会占用过多显存,影响kvcache的空间。不同模型推理支持的max-model-len长度不同,具体差异请参见附录:基于vLLM(v0.3.2)不同模型推理支持的max-model-len长度说明。 --hostname:服务部署的IP,使用本机IP 0.0.0.0。 --port:服务部署的端口。 服务启动后,会打印如下信息。 server launch time cost: 15.443044185638428 s INFO: Started server process [2878] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
  • 附录:基于vLLM(v0.3.2)不同模型推理支持的max-model-len长度说明 基于vLLM(v0.3.2)部署推理服务时,不同模型推理支持的max-model-len长度说明如下面的表格所示。如需达到以下值,需要将--gpu-memory-utilization设为0.9,qwen系列、qwen1.5系列、llama3系列模型还需打开词表切分配置export USE_VOCAB_PARALLEL=1。 序号 模型名称 4*64GB 8*32GB 1 qwen1.5-72b 24576 8192 2 qwen-72b 24576 8192 3 llama3-70b 32768 8192 4 llama2-70b 98304 32768 6 llama-65b 24576 8192 序号 模型名称 2*64GB 4*32GB 1 qwen1.5-32b 65536 24576 序号 模型名称 1*64GB 1*32GB 1 qwen1.5-7b 49152 16384 2 qwen-7b 49152 16384 3 llama3-8b 98304 32768 4 llama2-7b 126976 16384 5 chatglm3-6b 126976 65536 6 chatglm2-6b 126976 65536 序号 模型名称 1*64GB 2*32GB 1 qwen1.5-14b 24576 24576 2 qwen-14b 24576 24576 3 llama2-13b 24576 24576 说明:机器型号规格以卡数*显存大小为单位,如4*64GB代表4张64GB显存的NPU卡。
  • Step6 推理服务的高阶配置(可选) 如需开启以下高阶配置,请在Step3 配置NPU环境时增加需要开启的高阶配置参数。 词表切分 在分布式场景下,默认不使用词表切分能提升推理性能,同时也会增加单卡的显存占用。不建议开启词表并行,如确需使用词表切分,配置以下环境变量。 export USE_VOCAB_PARALLEL=1 关闭词表切分的命令: unset USE_VOCAB_PARALLEL 配置后重启推理服务生效。 Matmul_all_reduce融合算子 使用Matmul_all_reduce融合算子能提升全量推理性能,该算子对驱动和固件版本要求较高,默认不开启。如需开启,配置以下环境变量。 export USE_MM_ALL_REDUCE_OP=1 关闭Matmul_all_reduce融合算子的命令: unset USE_MM_ALL_REDUCE_OP 配置后重启推理服务生效。 查看详细日志 查看详细耗时日志可以辅助定位性能瓶颈,但会影响推理性能。如需开启,配置以下环境变量。 export DETAIL_TIME_LOG=1 export RAY_DEDUP_LOGS=0 关闭详细日志命令: unset DETAIL_TIME_LOG 配置后重启推理服务生效。
  • Step2 准备模型代码包和权重文件 将OBS中的模型权重和表1获取的AscendCloud-3rdLLM-6.3.905-xxx.zip代码包上传到Notebook的工作目录/home/ma-user/work/下。上传代码参考如下。 import moxing as mox obs_dir = "obs://${bucket_name}/${folder-name}" local_dir = "/home/ma-user/work/qwen-14b" mox.file.copy_parallel(obs_dir, local_dir) 实际操作如下图所示。 图1 上传OBS文件到Notebook的代码示例 构建推理代码。 解压AscendCloud-3rdLLM-6.3.905-xxx.zip代码包。 unzip AscendCloud-3rdLLM-6.3.905-*.zip 运行推理构建脚本build.sh文件,自动获取ascend_vllm_adapter文件夹中提供的vLLM相关算子代码。 cd llm_inference bash build.sh 运行完后,在当前目录下会生成ascend_vllm文件夹,即为昇腾适配后的vLLM代码。
  • 准备Notebook ModelArts Notebook云上云下,无缝协同,更多关于ModelArts Notebook的详细资料请查看开发环境介绍。本案例中使用ModelArts的开发环境Notebook部署推理服务进行调试,请按照以下步骤完成Notebook的创建。 登录ModelArts控制台,在贵阳一区域,进入开发环境的Notebook界面,单击右上角“创建”,创建一个开发环境。创建Notebook的详细介绍可以参考创建Notebook实例,此处仅介绍关键步骤。 创建Notebook时,选择自定义镜像,并选择Step8 注册镜像章中注册的镜像。 图1 选择自定义镜像 资源类型推荐使用专属资源池,规格选到Ascend snt9b,显存规格建议选择64G以上的规格,磁盘规格建议选择500GB及以上。 创建完Notebook后,待Notebook状态变为“运行中”时,打开Notebook,在Notebook调试环境中部署推理服务。 父主题: 准备工作
  • Step2 安装Docker 检查docker是否安装。 docker -v #检查docker是否安装 如尚未安装,运行以下命令安装docker。 yum install -y docker 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。 sysctl -p | grep net.ipv4.ip_forward 如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。 sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
  • Step10 通过openssl创建SSL pem证书 在ECS中执行如下命令,会在当前目录生成cert.pem和key.pem,并将生成的pem证书上传至OBS。证书用于后续在推理生产环境中部署HTTPS推理服务。 openssl genrsa -out key.pem 2048 openssl req -new -x509 -key key.pem -out cert.pem -days 1095
共100000条