云服务器内容精选

  • Step2 启动训练脚本 单机启动 以baichuan2-13b为例,单机SFT全参微调启动命令如下。进入代码目录/home/ma-user/ws/6.3.904-Ascend/llm_train/AscendSpeed下执行启动脚本,超参详解参考表1 增量预训练超参配置 MODEL_TYPE=13B RUN_TYPE=sft DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/finetune/alpaca_ft TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B CKPT_LOAD_DIR= /home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/converted_weights TRAIN_ITERS=300 MBS=1 GBS=16 TP=8 PP=1 WORK_DIR=/home/ma-user/ws sh scripts/baichuan2/baichuan2.sh 其中 MODEL_TYPE 、RUN_TYPE、DATA_PATH、TOKENIZER_MODEL为必填;TRAIN_ITERS、MBS、GBS、 TP、PP WORK_DIR为非必填,有默认值。 多机启动 以baichuan2-13b为例,多台机器执行训练启动命令如下。多机启动需要在每个节点上执行,以双机为例。进入代码目录/home/ma-user/ws/6.3.904-Ascend/llm_train/AscendSpeed下执行启动脚本,超参详解参考表1 增量预训练超参配置 第一台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=0 MODEL_TYPE=13B RUN_TYPE=sft DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/finetune/alpaca_ft TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B CKPT_LOAD_DIR=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/converted_weights TRAIN_ITERS=300 MBS=1 GBS=16 TP=8 PP=1 WORK_DIR=/home/ma-user/ws sh scripts/baichuan2/baichuan2.sh ... ... # 第二台节点 MASTER_ADDR=xx.xx.xx.xx NNODES=2 NODE_RANK=1 MODEL_TYPE=13B RUN_TYPE=sft DATA_PATH=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/data/finetune/alpaca_ft TOKENIZER_MODEL=/home/ma-user/ws/tokenizers/BaiChuan2-13B CKPT_LOAD_DIR=/home/ma-user/ws/processed_for_ma_input/BaiChuan2-13B/converted_weights TRAIN_ITERS=300 MBS=1 GBS=16 TP=8 PP=1 WORK_DIR=/home/ma-user/ws sh scripts/baichuan2/baichuan2.sh 以上命令多台机器执行时,只有${NODE_RANK}:节点ID值不同,其他参数都保持一致。 其中MASTER_ADDR、NODE_RANK、MODEL_TYPE 、RUN_TYPE、DATA_PATH、TOKENIZER_MODEL、CKPT_LOAD_DIR为必填;TRAIN_ITERS、MBS、GBS、TP、PP、WORK_DIR为非必填,有默认值。 可以参考查看日志和性能操作,查看训练日志。 训练完成后,请参考查看日志和性能章节查看性能。
  • 操作步骤 登录Imagenet数据集下载官网地址,下载Imagenet21k数据集:http://image-net.org/ 下载格式转换后的annotation文件:ILSVRC2021winner21k_whole_map_train.txt和ILSVRC2021winner21k_whole_map_val.txt。 下载完成后将上述3个文件数据上传至OBS桶中的imagenet21k_whole文件夹中。上传方法请参考上传数据和算法至OBS(首次使用时需要)。
  • Step3 启动推理服务 配置需要使用的NPU卡编号。例如:实际使用的是第1张卡,此处填写“0”。 export ASCEND_RT_VISIBLE_DEVI CES =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)
  • 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的代码示例
  • 核心概念 推理业务昇腾迁移整体流程及工具链 图1 推理业务昇腾迁移整体路径 推理业务昇腾迁移整体分为七个大的步骤,并以完整工具链覆盖全链路: 迁移评估:针对迁移可行性、工作量,以及可能的性能收益进行大致的预估。 环境准备:利用ModelArts提供的开发环境一键式准备好迁移、调测需要的运行环境与工具链。 模型适配:针对昇腾迁移模型必要的转换和改造。 模型准备,导出和保存确定格式的模型。 转换参数准备,准备模型业务相关的关键参数。 模型转换,包含模型转换、优化和量化等。 应用集成。 针对转换的模型运行时应用层适配。 数据预处理。 模型编排。 模型裁剪。 精度校验。 精度对比误差统计工具。 自动化精度对比工具。 网络结构可视化工具。 性能调优。 性能测试。 性能调优三板斧。 性能分析与诊断。 迁移测试报告。 推理迁移验收表。 ModelArts开发环境 ModelArts作为华为云上的 AI开发平台 ,提供交互式云上开发环境,包含标准化昇腾算力资源和完整的迁移工具链,帮助用户完成昇腾迁移的调测过程,进一步可在平台上将迁移的模型一键部署成为在线服务向外提供推理服务,或者运行到自己的运行环境中。 MindSpore Lite 华为自研的AI推理引擎,后端对于昇腾有充分的适配,模型转换后可以在昇腾上获得更好的性能,配合丰富的适配工具链,降低迁移成本,该工具在推理迁移工作的预置镜像已安装,可在镜像中直接使用(见环境准备)。关于MindSpore Lite详细介绍可参考MindSpore Lite文档。
  • 迁移路线介绍 当前推理迁移时,不同的模型类型可能会采取不同的迁移技术路线。主要分为以下几类: 1. CV类小模型例如yolov5,以及部分AIGC场景的模型迁移,目前推荐使用MindSpore-Lite推理路线,可以利用MindSpore提供的图编译和自动调优能力,达到更好的模型性能。 2. LLM大语言模型场景,在GPU下通常会使用vLLM等大模型推理框架,因此迁移到昇腾时,推荐使用PyTorch + ascend-vllm技术路线进行迁移。 如果您使用的模型在上述案例文档中已包含,建议您直接使用案例中迁移好的模型,如果您的模型不在已提供的范围内,或者您因业务要求需要自行完成端到端的迁移,可以参考本迁移指导书介绍的步骤进行操作。 本文的迁移指导及快速入门案例均针对路线1也即MindSpore-Lite迁移路线进行介绍。使用ascend-vllm路线的迁移指导会在后续提供,您可以从上面的案例中下载相关代码并直接参考实现源码。
  • Step8 启动scheduler实例 建议在PD服务(即全量推理和增量推理服务)启动后,再启动scheduler服务。 启动scheduler容器。启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ -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设备,示例中挂载了0张卡。 -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查询得到。 进入容器。 docker exec -it -u ma-user ${container-name} /bin/bash 启动scheduler实例,命令如下。 export GLOBAL_RANK_TABLE_FILE_PATH=global_ranktable_10.**.**.18.json export RANK_TABLE_FILE_PATH=local_rank_table_10.**.**.18_host.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=9000 \ --served-model-name ${served-model-name} # 当前schduler端口port对外提供推理服务,故使用该端口进行性能验证和精度对齐 其中环境变量说明如下: GLOBAL_RANK_TABLE_FILE_PATH:global rank_table的路径,必选。不同实例类型的global rank_table均一致。 NODE_PORTS:仅在服务入口实例生效,用于与全量推理实例、增量推理实例的信息交互。该参数入参为形如{port1},{port2},{portn}的字符串,与全量/增量推理实例启动的--port参数相关,--port表示服务部署的端口。每个全量/增量推理实例基于配置的端口号(--port)启动服务,并按照global rank_table中的全量实例、增量实例的顺序,对全量推理实例、增量推理实例启动的端口号进行排序,端口之间用`,`分隔开作为该环境变量的输入。当前端口9000是对外服务端口,而8088、8089则为scheduler调度推理服务端口。 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量化章节对模型做量化处理。 全量和增量节点的local rank table必须一一对应。 全量和增量节点不能使用同一个端口。 scheduler实例中NODE_PORTS=8088,8089;端口设置顺序必须与global rank table文件中各全量和增量节点顺序一致,否则会报错。
  • Step4 制作推理镜像 解压AscendCloud压缩包及该目录下的推理代码AscendCloud-LLM-6.3.908-xxx.zip和算子包AscendCloud-OPP-6.3.908-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}为推理镜像名称,可自行指定。 运行完后,会生成推理所需镜像。
  • Step3 上传代码包和权重文件 上传安装依赖软件推理代码AscendCloud-LLM-6.3.908-xxx.zip和算子包AscendCloud-OPP-6.3.908-xxx.zip到主机中,包获取路径请参见表2。 将权重文件上传到DevServer机器中。权重文件的格式要求为Huggface格式。开源权重文件获取地址请参见表3。 如果使用模型训练后的权重文件进行推理,模型训练及训练后的权重文件转换操作可以参考相关文档章节中提供的模型训练文档。 3.权重要求放在磁盘的指定目录,并做目录大小检查,参考命令如下: df -h
  • Step5 生成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 合并不同机器的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" } ] } ] } ```
  • Step6 启动全量推理实例 以下介绍如何启动全量推理实例。 启动容器镜像前请先按照参数说明修改${}中的参数。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功能。 --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.5.0版本一致,此处介绍关键参数。详细参数解释请参见https://github.com/vllm-project/vllm/blob/main/vllm/engine/arg_utils.py。
  • Step7 启动增量推理实例 启动增量推理容器 启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd \ --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设备,示例中挂载了2张卡davinci6、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查询得到。 进入容器 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_67.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=8089 \ --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量化章节对模型做量化处理。
  • 什么是分离部署 大模型推理是自回归的过程,有以下两阶段: Prefill阶段(全量推理) 将用户请求的prompt传入大模型,进行计算,中间结果写入KVCache并推出第1个token,属于计算密集型。 Decode阶段(增量推理) 将请求的前1个token传入大模型,从显存读取前文产生的KVCache再进行计算,属于访存密集型。 分离部署场景下,全量推理和增量推理在不同的容器上进行,用于提高资源利用效率。 分离部署的实例类型启动分为以下三个阶段: Step6 启动全量推理实例:必须为NPU实例,用于启动全量推理服务,负责输入的全量推理。全量推理占用至少1个容器。 Step7 启动增量推理实例:必须为NPU实例,用于启动增量推理服务,负责输入的增量推理。增量推理占用至少1个容器。 Step8 启动scheduler实例:可为CPU实例,用于启动api-server服务,负责接收推理请求,向全量或增量推理实例分发请求,收集推理结果并向客户端返回推理结果。服务调度实例不占用显卡资源,建议增加1个容器,也可以在全量推理或增量推理的容器上启动。
  • 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
  • 准备数据 登录coco数据集下载官网地址:https://cocodataset.org/#download 下载coco2017数据集的Train(18GB)、Val images(1GB)、Train/Val annotations(241MB),分别解压后并放入coco文件夹中。 下载完成后,将数据上传至SFS相应目录中。由于数据集过大,推荐先通过obsutil工具将数据集传到OBS桶后,再将数据集迁移至SFS。 在本机机器上运行,通过obsutil工具将本地数据集传到OBS桶。 # 将本地数据传至OBS中 # ./obsutil cp ${数据集所在的本地文件夹路径} ${存放数据集的obs文件夹路径} -f -r # 例如 ./obsutil cp ./coco obs://your_bucket/ -f -r 登录E CS 服务器,通过obsutil工具将数据集迁移至SFS,样例代码如下: # 将OBS数据传至SFS中 # ./obsutil cp ${数据集所在的obs文件夹路径} ${SFS文件夹路径} -f -r # 例如 ./obsutil cp obs://your_bucket/coco/ /mnt/sfs_turbo/ -f -r /mnt/sfs_turbo/coco文件夹内目录结构如下: coco |---annotations |---train2017 |---val2017 更多obsutil的操作,可参考obsutil简介。 将文件设置归属为ma-user: chown -R ma-user:ma-group coco