本方案可以实现多卡推理 DeepSeek R1 Distill Qwen 模型,全程操作没有使用容器,特别适合在 Batch System (e.g., Slurm, CraneSched) 下使用。

一开始尝试使用昇腾 MindIE 推理引擎(DeepSeek 推荐),但该方案部分文件需要获取华为的授权,无法下载。因此使用 LMDeploy 项目推理 DeepSeek-R1-Distill-Qwen-32B 模型。

环境准备

Driver

下载并安装昇腾 Driver(直接参考教程即可)。

CANN

使用 LMDeploy 需要 CANN 8.0。

下载地址:https://www.hiascend.com/developer/download/community/result?module=pt+cann

选择 CANN 8.0.0beta(2025/01 最新版),aarch64 架构。下载以下安装包(.run 或 .rpm 格式均可):

  • cann toolkit
  • cann kernels
  • cann naal

下载后按 toolkit -> kernels -> naal 的顺序安装。

Pytorch

  1. 新建一个 Conda 虚拟环境,使用 Python 3.10 版本:
conda create env -n lmdeploy python=3.10
  1. 进入虚拟环境,直接安装 torch 2.3.1:
pip install torch==2.3.1
  1. 下载安装对应版本的昇腾 NPU 插件(torch_npu):
    下载地址:https://gitee.com/ascend/pytorch/releases/download/v6.0.0-pytorch2.3.1/torch_npu-2.3.1.post4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pip install ./torch_npu-2.3.1.post4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

LMDeploy

需要通过源代码安装。

  1. 首先从远程拉取代码:
git clone https://github.com/InternLM/lmdeploy.git
  1. 激活环境变量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh --cxx_abi=0
  • 注意后续使用 LMDeploy 时也必须先加载这些环境变量。
  1. 从源代码安装 lmdeploy:
cd lmdeploy
LMDEPLOY_TARGET_DEVICE=ascend pip3 install -v --no-build-isolation -e .
  • 注意必须使用 LMDEPLOY_TARGET_DEVICE=ascend 否则安装失败。

验证安装

  • Pytorch 调用 NPU 功能验证:
python -c "import torch;import torch_npu; a = torch.randn(3, 4).npu(); print(a + a);"
  • LMDeploy 验证:
which lmdeploy
lmdeploy --help

获取权重

可以使用 Hugging Face / ModelScope 的 Safe-tensor 格式权重。推荐使用 Hugging Face 或 ModelScope 的 CLI,支持断点续传:

# hugging face cli
pip install "huggingface_hub[cli]"
# modelscope
pip install modelscope

下载权重:

# 从 hugging face 下载(注意网络问题)
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-32B --local-dir ./DeepSeek-R1-Distilled-Qwen-32B
# 从 modelscope 下载(阿里云)
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-32B --local_dir ./DeepSeek-R1-Distilled-Qwen-32B

命令行推理

可以在命令行中快捷加载权重,在终端中测试 LLM 推理。

lmdeploy chat ./DeepSeek-R1-Distill-Qwen-32B --backend pytorch --device ascend --eager-mode
  • 注意替换模型路径。
  • 必须使用 pytorch 后端,并指定使用 ascend 设备类型。
  • 以上命令为单机单卡推理,如果需要多卡,需要使用 --tp 开启张量并行(必须为 2^n)。

API Server

启动 API Server:

lmdeploy serve api_server $MODEL_PATH \
         --backend pytorch \
         --device ascend \
         --dtype 'bfloat16' \
         --tp $TENSOR_PARA \
         --model-name $MODEL_PATH \
         --server-name '0.0.0.0'\
         --server-port 9000 \
         --eager-mode

测试 API

curl -X POST "http://0.0.0.0:9000/v1/completions" \
     -H "Content-Type: application/json" -d '{
        "model": "/data/hf-models/DeepSeek/DeepSeek-R1-Distill-Qwen-32B",
        "prompt": "What is the answer of expression 27d & 10b + 11o? Output the answer in \boxed{}.",
        "max_tokens": 8192,
        "context_length": 8192
     }'
  • 注意替换 Model 字段为启动 API Server 时的模型路径/模型名称。