华为云用户手册

  • 步骤六:进入容器 进入容器。 docker exec -it -u ma-user ${container_name} /bin/bash 评估推理资源。运行如下命令,返回NPU设备信息可用的卡数。 npu-smi info # 启动推理服务之前检查卡是否被占用、端口是否被占用,是否有对应运行的进程 如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。 驱动版本要求是23.0.6。如果不符合要求请参考安装固件和驱动章节升级驱动。启动后容器默认端口是8080。 配置需要使用的NPU卡为容器中的第几张卡。例如:实际使用的是容器中第1张卡,此处填写“0”。 export ASCEND_RT_VISIBLE_DEVI CES =0 如果启动服务需要使用多张卡,则按容器中的卡号依次编排。例如:实际使用的是容器中第1张和第2张卡,此处填写为“0,1”,以此类推。 export ASCEND_RT_VISIBLE_DEVICES=0,1 可以通过命令npu-smi info查询NPU卡为容器中的第几张卡。例如下图查询出两张卡,如果希望使用第一和第二张卡,则“export ASCEND_RT_VISIBLE_DEVICES=0,1”,注意编号不是填4、5。 图1 查询结果 启动推理服务的具体操作步骤请参见启动推理服务。
  • 步骤四:制作推理镜像 解压AscendCloud压缩包及该目录下的推理代码AscendCloud-LLM-xxx.zip和算子包AscendCloud-OPP-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-py39-*.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
  • 步骤五:启动容器 启动容器镜像前请先按照参数说明修改${}中的参数。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-LLM-xxx.zip和算子包AscendCloud-OPP-xxx.zip到主机中,包获取路径请参见表2。 将权重文件上传到DevServer机器中。权重文件的格式要求为Huggingface格式。开源权重文件获取地址请参见支持的模型列表。 如果使用模型训练后的权重文件进行推理,模型训练及训练后的权重文件转换操作可以参考大模型训练相关文档。 权重要求放在磁盘的指定目录,并做目录大小检查,参考命令如下。 df -h
  • 步骤一:检查环境 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-xxx中的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评测配置脚本名字
  • 软件配套版本 本方案支持的软件配套版本和依赖包获取地址如表2所示。 表2 软件配套版本和获取地址 软件名称 说明 下载地址 AscendCloud-6.5.901-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的推理部署代码和推理评测代码、推理依赖的算子包。代码包具体说明请参见软件包结构说明。 获取路径:Support-E,在此路径中查找下载ModelArts 6.5.901 版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 资源规格要求 本文档中的模型运行环境是ModelArts Lite的弹性节点Server。推荐使用“西南-贵阳一”Region上的资源和Ascend Snt9B。 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。 当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。
  • 镜像版本 本方案中用到的基础镜像地址和配套版本关系如下表所示,请提前了解。 表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-20241213131522-aafe527 cann_8.0.rc3
  • 支持的模型列表 表1 支持的大语言模型列表和权重获取地址 序号 模型名称 是否支持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 deepseek-v2-236b x x √ x x https://huggingface.co/deepseek-ai/DeepSeek-V2 53 deepseek-v2-lite-16b √ x √ x x https://huggingface.co/deepseek-ai/DeepSeek-V2-Lite 54 qwen-vl √ x x x x https://huggingface.co/Qwen/Qwen-VL 55 qwen-vl-chat √ x x x x https://huggingface.co/Qwen/Qwen-VL-Chat 56 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) 57 gte-Qwen2-7B-instruct √ x x x x Alibaba-NLP/gte-Qwen2-7B-instruct at main (huggingface.co) 58 bge-large-en-v1.5 √ x x x x https://huggingface.co/BAAI/bge-large-en-v1.5 59 bge-base-en-v1.5 √ x x x x https://huggingface.co/BAAI/bge-base-en-v1.5 表2 支持的多模态模型列表和权重获取地址 序号 模型名称 是否支持fp16/bf16推理 是否支持W4A16量化 是否支持W8A8量化 是否支持W8A16量化 是否支持 kv-cache-int8量化 开源权重获取地址 1 internvl2-8B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-8B/tree/main 2 internvl2-26B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-26B/tree/main 3 internvl2-40B √ x x x x https://huggingface.co/OpenGVLab/InternVL2-40B/tree/main 4 internVL2-Llama3-76B √ √ x x x https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B/tree/main https://huggingface.co/OpenGVLab/InternVL2-Llama3-76B-AWQ 6 MiniCPM-v2.6 √ x x x x https://huggingface.co/openbmb/MiniCPM-V-2_6/tree/main 7 qwen2-vl-2B √ x x x x https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct/tree/main 8 qwen2-vl-7B √ x x x x https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct/tree/main 9 qwen2-vl-72B √ √ x x x https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct/tree/main https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct-AWQ 10 llava-1.5-7b √ x x x x https://huggingface.co/llava-hf/llava-1.5-7b-hf/tree/main 11 llava-1.5-13b √ x x x x https://huggingface.co/llava-hf/llava-1.5-13b-hf/tree/main 12 llava-v1.6-7b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-vicuna-7b-hf/tree/main 13 llava-v1.6-13b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-vicuna-13b-hf/tree/main 14 llava-v1.6-34b √ x x x x https://huggingface.co/llava-hf/llava-v1.6-34b-hf/tree/main 15 llava-onevision-qwen2-0.5b-ov-hf √ x x x x https://huggingface.co/llava-hf/llava-onevision-qwen2-0.5b-ov-hf 16 llava-onevision-qwen2-7b-ov-hf √ x x x x https://huggingface.co/llava-hf/llava-onevision-qwen2-7b-ov-hf 17 internvl2.5-4B √ x x x x https://huggingface.co/OpenGVLab/InternVL2_5-4B 18 internvl2.5-8B √ x x x x https://huggingface.co/OpenGVLab/InternVL2_5-8B 19 internvl2.5-78B √ x x x x https://huggingface.co/OpenGVLab/InternVL2_5-78B 各模型支持的卡数请参见各模型支持的最小卡数和最大序列章节。 父主题: 主流开源大模型基于Lite Server适配Ascend-vLLM PyTorch NPU推理指导(6.5.901)
  • Ascend-vLLM概述 vLLM是GPU平台上广受欢迎的大模型推理框架,因其高效的continuous batching和pageAttention功能而备受青睐。此外,vLLM还具备投机推理和自动前缀缓存等关键功能,使其在学术界和工业界都得到了广泛应用。 Ascend-vLLM是华为云针对NPU优化的推理框架,继承了vLLM的优点,并通过特定优化实现了更高的性能和易用性。它使得在NPU卡上运行大模型变得更加高效和便捷,为用户带来了极大的便利和性能提升。Ascend-vLLM可广泛应用于各种大模型推理任务,特别是在需要高性能和高效率的场景中,如 自然语言处理 、图像生成和 语音识别 等。 Ascend-vLLM的主要特点 易用性:Ascend-vLLM简化了在大模型上的部署和推理过程,使开发者可以更轻松地使用它。 易开发性:提供了友好的开发和调试环境,便于模型的调整和优化。 高性能:通过自研特性和针对NPU的优化,如PD分离、前后处理、sample等,实现了高效的推理性能。
  • Ascend-vLLM架构 Ascend-vLLM架构图如下所示。 算子:使用CANN基础算子和高性能融合算子,同时支持用户自定义算子,持续迭代优化,提高推理效率。 模型:结构实现和社区一致,Huggingface模型开箱即用,同时可以快速适配新模型。 调用:提供高性能算子下发和图模式两种方案,兼顾性能和灵活性。 特性:服务调度、特性实现和社区一直,针对昇腾硬件做亲和替换和优化。 接口:离线SDK、在线OpenAI Server和社区完全一直,无缝迁移。
  • Ascend-vLLM支持的特性介绍 表1 Ascend-vLLM支持的特性 特性名称 特性说明 调度 Page-attention 分块管理kvcache,提升吞吐。 Continuous batching 迭代级调度,动态调整batch,降低延迟,提升吞吐。 Multi-step 一次调度多次推理,降低调度上的cpu-overhead。 量化 W4A16-AWQ、GPTQ 权重Int4量化,降低显存消耗和时延。小并发时延提升80%,精度损失2%以内。 W8A8-smoothQuant 权重Int8量化,降低显存消耗,吞吐提升30%;精度损失1.5%以内。 W8A16-GPTQ Int8量化,降低显存消耗,提高吞吐20%。精度损失1%以内。 Kv8 Kv-cache量化,提高吞吐,支持更长序列。 高效解码 Auto-prefix-caching 前缀缓存,降低首token时延。在system prompt较长或多轮对话场景收益明显 Chunked-prefill 又名split-fuse。全量增量同时推理,提高资源利用率,提升吞吐。 Speculative Decoding 支持大小模型投机推理和eager模式投机,提升推理性能。 图模式 Cuda-graph/cann-graph 记录算子执行的依赖关系构图;消除python host耗时;且支持动态shape。 Torch.compile Torch.dynamo构图,转ascend-GE后端推理;使用静态分档。 实例复用 Multi-lora 多lora挂载,多个不同微调模型共用一份权重同时部署。 控制输出 Guided Decoding 通过特定模式控制模型输出。 Beam search 通过beamsearch输出多个候选结果。 分离部署 PD分离部署 全量、增量分离部署,提高资源利用率,提升体验。 剪枝 FASP (Fast and Accurate Structured Pruning) 剪枝 FASP剪枝是一种结构化稀疏剪枝方法,能有效降低模型显存以及需要部署的资源依赖,减小推理过程中的计算量,降低增量推理时延,提升吞吐。
  • 镜像版本 本方案中用到的基础镜像地址和配套版本关系如下表所示,请提前了解。 表3 基础容器镜像地址 镜像用途 镜像地址 配套版本 基础镜像 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
  • 软件配套版本 本方案支持的软件配套版本和依赖包获取地址如表4所示。 表4 软件配套版本和获取地址 软件名称 说明 下载地址 AscendCloud-6.5.912-xxx.zip 说明: 软件包名称中的xxx表示时间戳。 包含了本教程中使用到的推理部署代码和推理评测代码、推理依赖的算子包。 获取路径:Support-E,在此路径中查找下载ModelArts 6.5.912版本。 说明: 如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。
  • 资源规划 本方案部署支持用BF16量化权重,使用的Ascend Snt9B资源规格见下表。 以下值是在gpu-memory-utilization为0.9时测试得出,为服务部署所需的最小昇腾卡数及该卡数下推荐的最大max-model-len长度,不代表最佳性能。 表1 支持最小卡数和最大序列说明 序号 模型名 32GB显存 64GB显存 最小卡数 最大序列(K) max-model-len 最小卡数 最大序列(K) max-model-len 1 DeepSeek-R1-Distill-Qwen-1.5B 1 32 1 32 2 DeepSeek-R1-Distill-Qwen-7B 1 32 1 32 3 DeepSeek-R1-Distill-Llama-8B 1 32 1 128 4 DeepSeek-R1-Distill-Qwen-14B 2 32 1 32 5 DeepSeek-R1-Distill-Qwen-32B 4 32 2 64 6 DeepSeek-R1-Distill-Llama-70B 8 32 4 64
  • 支持的模型列表和权重文件 支持的DeepSeek蒸馏版模型列表和权重文件获取路径如下,详细的模型介绍请参见DeepSeek-R1。 表2 DeepSeek蒸馏版模型列表 Model Base Model Download DeepSeek-R1-Distill-Qwen-1.5B Qwen2.5-Math-1.5B HuggingFace DeepSeek-R1-Distill-Qwen-7B Qwen2.5-Math-7B HuggingFace DeepSeek-R1-Distill-Llama-8B Llama-3.1-8B HuggingFace DeepSeek-R1-Distill-Qwen-14B Qwen2.5-14B HuggingFace DeepSeek-R1-Distill-Qwen-32B Qwen2.5-32B HuggingFace DeepSeek-R1-Distill-Llama-70B Llama-3.3-70B-Instruct HuggingFace
  • 步骤一:检查环境 SSH登录机器后,检查NPU设备检查。如果驱动版本不是24.1.0,请先升级驱动和对应固件。 npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本 24.1.0版本驱动文件为Ascend-hdk-910b-npu-driver_24.1.0_linux-aarch64.run,对应固件文件为Ascend-hdk-910b-npu-firmware_7.5.0.3.220.run,请申请下载。 安装固件命令如下,安装完后需要reboot重启机器。 chmod 700 *.run ./Ascend-hdk-910b-npu-firmware_7.5.0.3.220.run --full reboot 安装24.1.0驱动命令如下: ./Ascend-hdk-910b-npu-driver_24.1.0_linux-aarch64.run --full --install-for-all 安装完成后再使用如下命令查看是否安装正确。 npu-smi info -t board -i 1 | egrep -i "software|firmware" 检查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
  • 步骤三:调用 执行请求调用模型 curl -ik -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"请讲一个笑话"}],"model":"${model_name}","temperature":0.6,"max_tokens":1024}' -X POST http://${ip}:${port}/v1/chat/completions model_name:为要调用的模型名称,即DeepSeek-V3或DeepSeek-R1 ip:为步骤二:自动化部署中nodeIps中第一个IP port:为要访问的端口,默认1025
  • 步骤二:自动化部署 需要先安装yum和expect。 sudo apt-get install yum yum install expect 把rank_table_file.json、start.sh和权重文件放在同一目录下。其中rank_table_file.json和start.sh只需要在主节点即可。rank_table_file.json仅作为模板使用,会在start.sh脚本里自动更新,文件内容详见附录:rank_table_file.json文件和一键部署脚本start.sh。参考目录结构如下: ${mountPath} |---rank_table_file.json |---start.sh |---DeepSeekR1-w8a8 # 权重文件所在目录,每个节点都要有,且目录结构保持一致 执行部署脚本start.sh。 sh start.sh --model_name ${modelName} --mount_path ${mountPath} --maxSeqLen ${maxSeqLen} --node_ips ${nodeIps} --passwords ${nodePwds} modelName:模型权重所在文件夹名称。注意:文件夹名称需要包含R1或V3。例如:DeepSeekR1-w8a8。 mountPath:容器挂载的路径,且不能为/home,该路径下包含权重文件所在目录。即为权重文件所在目录的父目录。 maxSeqLen:输入长度+输出长度的最大值。推荐默认16384。 nodeIps:节点IP列表,使用“,“分隔。填2个节点IP地址。 nodePwds:各节点的root用户登录密码,使用“,“分隔,和上述节点要一一对应。
  • 附录:config.json文件 config.json文件用于推理服务启动时,需要修改以下参数,2台机器的每个容器中config.json文件内容一致。 ipAddress:主节点IP地址,即rank_table_file.json文件中的server_id。 managementIpAddress:主节点IP地址,和ipAddress取值一致。 httpsEnabled:取值需要修改为false。 interCommTLSEnabled和interNodeTLSEnabled:如果不需要开启安全认证,这2个参数取值需要修改为false。 multiNodesInferEnabled:取值需要修改true,表示开启多机推理。 modelName:设置为DeepSeek-V3或DeepSeek-R1。 modelWeightPath:权重文件在容器内的地址,例如:${container_work_dir}/deepseekV3-w8a8或$${container_work_dir}/deepseekR1-w8a8目录。${container_work_dir}在步骤四:启动容器时定义。 maxPrefillBatchSize:最大prefill batch size。config.json文件中默认是50,并发请求数量超出设置,推理请求会被拒绝。用户可以根据实际修改。maxPrefillBatchSize和maxPrefillTokens谁先达到各自的取值就完成本次组batch。 maxSeqLen:输入长度+输出长度的最大值。该值为maxInputTokenLen+maxIterTimes的和。config.json文件中默认是16k,用户可以根据自己的推理场景设置。 maxInputTokenLen:输入最大长度。config.json文件中默认是15k,用户可以根据自己的推理场景设置。 maxPrefillTokens:最大prefill token数。和maxInputTokenLen保持相同。 maxIterTimes:最大输出长度。config.json文件中默认是1k,用户可以根据自己的推理场景设置。 当前在W8A8量化权重、2台Ascend Snt9B资源下支持的maxSeqLen最大为32768。 { "Version" : "1.0.0", "LogConfig" : { "logLevel" : "Info", "logFileSize" : 20, "logFileNum" : 20, "logPath" : "logs/mindie-server.log" }, "ServerConfig" : { "ipAddress" : "7.242.110.112", "managementIpAddress" : "7.242.110.112", "port" : 1025, "managementPort" : 1026, "metricsPort" : 1027, "allowAllZeroIpListening" : false, "maxLinkNum" : 1000, "httpsEnabled" : false, "fullTextEnabled" : false, "tlsCaPath" : "security/ca/", "tlsCaFile" : ["ca.pem"], "tlsCert" : "security/certs/server.pem", "tlsPk" : "security/keys/server.key.pem", "tlsPkPwd" : "security/pass/key_pwd.txt", "tlsCrlPath" : "security/certs/", "tlsCrlFiles" : ["server_crl.pem"], "managementTlsCaFile" : ["management_ca.pem"], "managementTlsCert" : "security/certs/management/server.pem", "managementTlsPk" : "security/keys/management/server.key.pem", "managementTlsPkPwd" : "security/pass/management/key_pwd.txt", "managementTlsCrlPath" : "security/management/certs/", "managementTlsCrlFiles" : ["server_crl.pem"], "kmcKsfMaster" : "tools/pmt/master/ksfa", "kmcKsfStandby" : "tools/pmt/standby/ksfb", "inferMode" : "standard", "interCommTLSEnabled" : false, "interCommPort" : 1121, "interCommTlsCaPath" : "security/grpc/ca/", "interCommTlsCaFiles" : ["ca.pem"], "interCommTlsCert" : "security/grpc/certs/server.pem", "interCommPk" : "security/grpc/keys/server.key.pem", "interCommPkPwd" : "security/grpc/pass/key_pwd.txt", "interCommTlsCrlPath" : "security/grpc/certs/", "interCommTlsCrlFiles" : ["server_crl.pem"], "openAiSupport" : "vllm" }, "BackendConfig" : { "backendName" : "mindieservice_llm_engine", "modelInstanceNumber" : 1, "npuDeviceIds" : [[0,1,2,3]], "tokenizerProcessNumber" : 8, "multiNodesInferEnabled" : true, "multiNodesInferPort" : 1120, "interNodeTLSEnabled" : false, "interNodeTlsCaPath" : "security/grpc/ca/", "interNodeTlsCaFiles" : ["ca.pem"], "interNodeTlsCert" : "security/grpc/certs/server.pem", "interNodeTlsPk" : "security/grpc/keys/server.key.pem", "interNodeTlsPkPwd" : "security/grpc/pass/mindie_server_key_pwd.txt", "interNodeTlsCrlPath" : "security/grpc/certs/", "interNodeTlsCrlFiles" : ["server_crl.pem"], "interNodeKmcKsfMaster" : "tools/pmt/master/ksfa", "interNodeKmcKsfStandby" : "tools/pmt/standby/ksfb", "ModelDeployConfig" : { "maxSeqLen" : 16384, "maxInputTokenLen" : 15360, "truncation" : false, "ModelConfig" : [ { "modelInstanceType" : "Standard", "modelName" : "DeepSeek-V3", "modelWeightPath" : "/data/model/DeepSeek-V3-w8a8", "worldSize" : 4, "cpuMemSize" : 5, "npuMemSize" : -1, "backendType" : "atb", "trustRemoteCode" : false } ] }, "ScheduleConfig" : { "templateType" : "Standard", "templateName" : "Standard_LLM", "cacheBlockSize" : 128, "maxPrefillBatchSize" : 50, "maxPrefillTokens" : 15360, "prefillTimeMsPerReq" : 150, "prefillPolicyType" : 0, "decodeTimeMsPerReq" : 50, "decodePolicyType" : 0, "maxBatchSize" : 200, "maxIterTimes" : 1024, "maxPreemptCount" : 0, "supportSelectBatch" : false, "maxQueueDelayMicroseconds" : 5000 } } } 父主题: DeepSeek模型基于ModelArts Lite Server适配MindIE推理部署指导
  • 步骤二:获取推理镜像 镜像获取命令如下。 docker pull swr.cn-southwest-2.myhuaweicloud.com/ei_ascendcloud_devops/mindie:2.0.T3.1-800I-A2-py311-openeuler24.03-lts-0220 如果是权限导致的镜像拉取失败,请参考昇腾社区提供的MindIE镜像申请并下载2.0.T3.1-800I-A2-py311-openeuler24.03-lts版本的镜像。
  • 步骤四:启动容器 启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示,启动成功会有对应的docker id生成,并且不会报错。 docker run -itd --privileged \ --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 /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \ --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为宿主机中的${path-to-file}目录,存放的是权重文件和rank_table_file.json文件,${container_work_dir}为要挂载到的容器中的目录。为方便两个地址可以相同。 容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。 driver及npu-smi需同时挂载至容器。 不要将同一个NPU挂载给多个容器使用,会导致后续的容器无法正常使用NPU功能。 --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。 {image_id} 为docker镜像的ID,在宿主机上可通过docker images查询得到。
  • 步骤五:在每个节点进入容器并启动推理服务 进入容器。 docker exec -it -u root ${container-name} /bin/bash 修改MindIE文件权限。 cd /usr/local/Ascend/mindie/latest chmod 750 mindie-service chmod -R 550 mindie-service/bin chmod -R 500 mindie-service/bin/mindie_llm_backend_connector chmod 550 mindie-service/lib chmod 440 mindie-service/lib/* chmod 550 mindie-service/lib/grpc chmod 440 mindie-service/lib/grpc/* chmod -R 550 mindie-service/include chmod -R 550 mindie-service/scripts chmod 750 mindie-service/logs chmod 750 mindie-service/conf chmod 640 mindie-service/conf/config.json chmod 700 mindie-service/security chmod -R 700 mindie-service/security/* 启动推理前需要先配置服务化环境变量。 source /usr/local/Ascend/ascend-toolkit/set_env.sh source /usr/local/Ascend/nnal/atb/set_env.sh source /usr/local/Ascend/atb-models/set_env.sh unset HCCL_OP_EXPANSION_MODE export ATB_LLM_HCCL_ENABLE=1 export ATB_LLM_COMM_BACKEND="hccl" export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True export MIES_CONTAINER_IP=${container_ip} export RANKTABLEFILE=${RANKTABLEFILE} export HCCL_DETERMINISTIC=false export PARALLEL_PA RAM S=[1,16,1,16,-1,-1] export ATB_WORKSPACE_MEM_ALLOC_ALG_TYPE=3 export ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 export NPU_MEMORY_FRACTION=0.96 export HCCL_CONNECT_TIMEOUT=7200 export HCCL_EXEC_TIMEOUT=0 ${container_ip}:当前容器的IP地址,和rank_table_file.json文件中配置的container_ip保持一致。 expandable_segments-使能内存池扩展段功能,即虚拟内存特性。 ${RANKTABLEFILE}:rank_table_file.json文件挂载到容器中的地址${container_work_dir}/rank_table_file.json。 PARALLEL_PARAMS=[dp,tp,moe_tp,moe_ep,pp,microbatch_size],当前推荐配置为 tp=16, moe_ep=16。 NPU_MEMORY_FRACTION:表示显存比。 修改config.json文件中的服务化参数。config.json文件修改要求和样例参考附录:config.json文件。 cd /usr/local/Ascend/mindie/latest/mindie-service/ vim conf/config.json 启动推理服务。 # 拉起服务化 cd /usr/local/Ascend/mindie/latest/mindie-service/ ./bin/mindieservice_daemon 执行命令后出现“Daemon start success!”,表示服务成功启动。
  • 步骤一:检查环境 SSH登录机器后,检查NPU设备检查。如果驱动版本不是24.1.0,请先升级驱动和对应固件。 npu-smi info -t board -i 1 | egrep -i "software|firmware" #查看驱动和固件版本 24.1.0版本驱动文件为Ascend-hdk-910b-npu-driver_24.1.0_linux-aarch64.run,对应固件文件为Ascend-hdk-910b-npu-firmware_7.5.0.3.220.run,请申请下载。 安装固件命令如下,安装完后需要reboot重启机器。 chmod 700 *.run ./Ascend-hdk-910b-npu-firmware_7.5.0.3.220.run --full reboot 安装24.1.0驱动命令如下: ./Ascend-hdk-910b-npu-driver_24.1.0_linux-aarch64.run --full --install-for-all 安装完成后再使用如下命令查看是否安装正确。 npu-smi info -t board -i 1 | egrep -i "software|firmware" 检查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
  • 步骤六:调用 调用DeepSeek-V3 curl -ik -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"请讲一个笑话"}],"model":"DeepSeek-V3","temperature":0,"max_tokens":128}' -X POST http://${ip}:${port}/v1/chat/completions 调用DeepSeek-R1 curl -ik -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"请讲一个笑话"}],"model":"DeepSeek-R1","temperature":0,"max_tokens":128}' -X POST http://${ip}:${port}/v1/chat/completions ip:为步骤五:在每个节点进入容器并启动推理服务第4小步中配置的config.json中ipAddress值 port:为步骤五:在每个节点进入容器并启动推理服务第4小步中配置的config.json中port字段的值 请求调用返回json参考如下:
  • 步骤三:创建rank_table_file.json 在启动容器前需要使用rank_table_file.json文件用于多机部署。 检查机器网络情况 # 检查物理链接 for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done # 检查链接情况 for i in {0..7}; do hccn_tool -i $i -link -g ; done # 检查网络健康情况 for i in {0..7}; do hccn_tool -i $i -net_health -g ; done # 查看侦测ip的配置是否正确 for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done # 查看网关是否配置正确 for i in {0..7}; do hccn_tool -i $i -gateway -g ; done # 检查NPU底层tls校验行为一致性,建议全0 for i in {0..7}; do hccn_tool -i $i -tls -g ; done | grep switch # NPU底层tls校验行为置0操作 for i in {0..7};do hccn_tool -i $i -tls -s enable 0;done 获取每张卡的IP地址。 for i in {0..7};do hccn_tool -i $i -ip -g; done 配置rank_table_file.json文件,并复制到每台机器上的${path-to-file}目录中。存放路径例如:/home/data/rank_table_file.json。详细样例参见附录:rank_table_file.json文件。注意:样例为4机部署配置,如果是2机部署则需要删除多余的配置,仅保留2机16卡的配置。 设置rank_table_file.json文件权限。进入rank_table_file.json文件存放目录${path-to-file},执行如下命令。 chmod 640 rank_table_file.json
  • W8A8量化权重生成 介绍如何将BF16权重量化为W8A8的权重,具体操作步骤如下。 在Server机器上创建权重量化后的存放目录${path-to-file}/deepseekV3-w8a8或${path-to-file}/deepseekR1-w8a8目录。 下载msit源码,请下载指定分支br_noncom_MindStudio_8.0.0_POC_20251231。 git clone -b br_noncom_MindStudio_8.0.0_POC_20251231 https://gitee.com/ascend/msit.git 进入到msit/msmodelslim的目录;并在进入的msmodelslim目录下,运行安装脚本install.sh。 cd msit/msmodelslim bash install.sh 执行install过程会下载依赖包,因此需要确保能够访问到pip源。 进入到msit/msmodelslim/example/DeepSeek目录,执行转换命令。 BF16权重路径是${path-to-file}/deepseekV3-bf16,例如:/home/data/deepseekV3-bf16,将量化后的W8A8权重输出到${path-to-file}/deepseekV3-w8a8,例如:/home/data/deepseekV3-w8a8,可以使用以下命令,此处以deepseekV3为例。 cd example/DeepSeek python3 quant_deepseek_w8a8.py --model_path ${path-to-file}/deepseekV3-bf16 --save_path ${path-to-file}/deepseekV3-w8a8 量化后的权重文件再复制到另外一台机器的相同目录。
  • 附录:rank_table_file.json文件 rank_table_file.json文件样例如下,需要根据实际修改server_count,device_ip,server_id,container_ip参数,每台机器上的rank_table_file.json文件内容一致。在步骤三:创建rank_table_file.json步骤中会用到。 server_count:节点个数。当前默认为2。 device_ip:当前卡的IP地址,2台机器共16张卡。device_ip查询命令 for i in {0..7};do hccn_tool -i $i -ip -g; done server_id:当前Server节点的IP地址,涉及2台机器。 container_ip:容器IP地址,无特殊配置时与server_id保存一致。 { "server_count": "2", "server_list": [ { "device": [ { "device_id": "0", "device_ip": "29.82.85.12", "rank_id": "0" }, { "device_id": "1", "device_ip": "29.82.98.67", "rank_id": "1" }, { "device_id": "2", "device_ip": "29.82.133.21", "rank_id": "2" }, { "device_id": "3", "device_ip": "29.82.175.69", "rank_id": "3" }, { "device_id": "4", "device_ip": "29.82.13.154", "rank_id": "4" }, { "device_id": "5", "device_ip": "29.82.140.51", "rank_id": "5" }, { "device_id": "6", "device_ip": "29.82.157.87", "rank_id": "6" }, { "device_id": "7", "device_ip": "29.82.15.225", "rank_id": "7" } ], "server_id": "7.242.110.112", "container_ip": "7.242.110.112" }, { "device": [ { "device_id": "0", "device_ip": "29.82.177.28", "rank_id": "8" }, { "device_id": "1", "device_ip": "29.82.41.231", "rank_id": "9" }, { "device_id": "2", "device_ip": "29.82.16.3", "rank_id": "10" }, { "device_id": "3", "device_ip": "29.82.154.20", "rank_id": "11" }, { "device_id": "4", "device_ip": "29.82.56.73", "rank_id": "12" }, { "device_id": "5", "device_ip": "29.82.177.138", "rank_id": "13" }, { "device_id": "6", "device_ip": "29.82.29.230", "rank_id": "14" }, { "device_id": "7", "device_ip": "29.82.1.176", "rank_id": "15" } ], "server_id": "7.242.104.54", "container_ip": "7.242.104.54" } ], "status": "completed", "version": "1.0" } 父主题: DeepSeek模型基于ModelArts Lite Server适配MindIE推理部署指导
  • 方式一:直接获取HuggingFace社区已经转换完成的BF16权重 通过下述地址直接下载HuggingFace社区中开发者贡献的已经转换成功的BF16权重。建议在Server机器上创建${path-to-file}/deepseekV3-bf16或${path-to-file}/deepseekR1-bf16目录,并直接将权重文件下载到该目录中。 opensourcerelease/DeepSeek-V3-bf16 opensourcerelease/DeepSeek-R1-bf16 下载完成后,需要修改权重文件中config.json文件,把model_type字段值改为“deepseekv2”。
共100000条