昇腾910B/910C 多模态模型私有化部署实战:11 个模型 + Nginx 统一 API 网关

摘要:本文分享一套基于昇腾 910B ×32 + 910C ×16 的多模态模型私有化部署方案,覆盖 LLM、视觉理解、文生视频、文生音频/音乐、语音识别与 RAG 组件共 11 个模型,每个模型单实例部署,推理框架直接暴露 API,通过 Nginx 统一网关对外提供服务。含节点资源分配、Docker 昇腾运行时配置、逐模型部署命令、网关路由与排障清单,可直接照抄落地。


一、部署目标与总体方案

1.1 部署目标

在私有化环境中完成 LLM 与多模态(文生视频、文生音频/音乐、语音识别、视觉理解、RAG 组件)模型的推理服务部署,并通过 Nginx 统一 API 网关对外提供服务。由于多模态接口(视频 / 音频 / 语音)需要自建推理服务,本文方案将全部模型服务统一自建、单实例部署,不依赖任何外部模型管理平台。

1.2 硬件资源清单

芯片型号数量单卡显存FP16 算力折合服务器
昇腾 910B32 张64GB HBM2e~320 TFLOPS4 台 × 8 卡
昇腾 910C16 张96GB HBM2e~500 TFLOPS2 台 × 8 卡

1.3 覆盖模型

类型模型
LLMDeepSeek-V4 Flash、Qwen3.8-27B
视觉理解InternVL2.5-78B
文生视频MiniMax H3、Wan2.2、Step-Video-T2V、Open-Sora Plan V1.5(备选)
文生音频/音乐Ming-Flash-Omni 2.0、Step-Audio 2 mini
语音识别Whisper-large-v3
RAG 组件BGE-M3、BGE-Reranker-v2-m3

1.4 部署原则

  • 单实例:每个模型单实例部署,空余 NPU 资源加载不同模型,不搞同模型多实例负载均衡;
  • 原生 API:各模型推理框架(vLLM / SGLang)直接暴露 HTTP API,通过 Nginx 统一网关对外服务;
  • 大卡跑大模型:910C(96GB)分配给最吃显存的视频模型和主力 LLM,910B(64GB)分配给音频、轻量 LLM 和备选模型。

二、整体架构与资源分配

2.1 节点分配总览

节点硬件部署模型用途推理引擎
Node-18×910CMiniMax H3主力文生视频(2K/15秒/音画同步)SGLang / vLLM-Omni
Node-28×910CDeepSeek-V4 Flash主力 LLM(高并发推理)vLLM Ascend
Node-38×910BWan2.2 + Open-Sora Plan备选视频模型(分时复用)vLLM-Omni × MindIE
Node-48×910BQwen3.8-27B(2卡)+ InternVL2.5-78B(6卡)轻量 LLM + 视觉理解/OCRvLLM Ascend
Node-58×910BMing-Flash-Omni(4卡)+ Whisper(2卡)+ BGE-M3(1卡)+ BGE-Reranker(1卡)音乐生成 + 语音识别 + RAG 组件vLLM / MIS-TEI
Node-68×910BStep-Video-T2V(6卡)+ Step-Audio(2卡)+ Nginx 网关备选视频 + TTS + 统一 API 网关CANN 原生 / Nginx

2.2 分配逻辑

  • 910C(96GB 大显存)→ MiniMax H3 视频模型、DeepSeek-V4 Flash 主力 LLM;
  • 910B(64GB)→ 音频模型、轻量 LLM、备选视频模型;
  • Qwen3.8-27B 量化后仅约 17GB,2 卡即可运行,空余 6 卡部署 InternVL2.5-78B;
  • Node-5 空余 4 卡部署 Whisper 与 BGE Embedding / Rerank 等 RAG 配套模型;
  • Open-Sora Plan 与 Wan2.2 分时复用 Node-3,不同时运行。

2.3 API 服务层架构

各模型推理框架直接暴露 HTTP API,通过 Nginx 统一网关(Node-6)按路径路由到对应模型后端:

客户端应用
    │
    ▼
Nginx 统一网关(Node-6)
    │  按路径路由
    ├── /v1/chat/deepseek/  → DSV4 Flash (Node-2:8000)
    ├── /v1/chat/qwen/      → Qwen3.8-27B (Node-4:8001)
    ├── /v1/vision/internvl/→ InternVL2.5-78B (Node-4:8002)
    ├── /v1/video/minimax/  → MiniMax H3 (Node-1:8500)
    ├── /v1/video/wan/      → Wan2.2 (Node-3:8600)
    ├── /v1/video/step/     → Step-Video (Node-6:8700)
    ├── /v1/audio/ming/     → Ming-Flash-Omni (Node-5:8800)
    ├── /v1/audio/step/     → Step-Audio (Node-6:8900)
    ├── /v1/audio/whisper/  → Whisper-large-v3 (Node-5:9000)
    ├── /v1/embedding/bge/  → BGE-M3 (Node-5:9100)
    └── /v1/rerank/bge/     → BGE-Reranker (Node-5:9200)

三、环境准备

3.1 操作系统与基础软件

组件推荐版本说明
操作系统openEuler 22.03 LTS / Ubuntu 22.04鲲鹏 CPU 推荐 openEuler;x86 可用 Ubuntu
昇腾驱动25.5.0与 CANN 8.5 匹配
CANN8.5(商用版)华为异构计算架构,所有部署的基础
torch_npu对应 CANN 8.5 的版本PyTorch 昇腾插件
Docker24.0+容器化部署
Python3.10推理框架兼容最佳

⚠️ 版本对齐警告:驱动、CANN、torch_npu、推理框架四者版本必须严格匹配。CANN 8.5 对应驱动 25.5.0,版本不匹配会导致算子加载失败或运行时崩溃。

3.2 验证昇腾环境

在每台服务器上执行:

# 查看 NPU 设备信息(预期能看到 8 张昇腾芯片,状态 OK,显存正常)
npu-smi info

# 验证 CANN 安装
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python3 -c "import torch; import torch_npu; print('torch_npu version:', torch_npu.__version__); print('NPU available:', torch.npu.is_available())"

# 预期输出:torch_npu 版本号 + NPU available: True

3.3 Docker 与昇腾容器运行时

安装 Ascend Docker Runtime(使容器能访问 NPU),然后验证:

docker run --rm --device=/dev/davinci0 --device=/dev/davinci_manager \
  --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  ascendai/ascend-pytorch:24.0.RC1-ubuntu22.04 \
  bash -c "npu-smi info"

3.4 模型权重存储规划

所有模型权重统一存放在共享存储或各节点本地 /data/models/ 目录下:

/data/models/
├── llm/
│   ├── DeepSeek-V4-Flash-w8a8-mtp/
│   └── Qwen3.8-27B-Instruct/
├── vlm/
│   └── InternVL2_5-78B/
├── video/
│   ├── MiniMax-H3/
│   ├── Wan2.2-T2V-14B/
│   └── Step-Video-T2V-30B/
├── audio/
│   ├── Ming-Flash-Omni-2.0/
│   ├── Step-Audio-2-mini/
│   └── whisper-large-v3/
├── embedding/
│   ├── bge-m3/
│   └── bge-reranker-v2-m3/
└── opensora/
    └── Open-Sora-Plan-v1.5/

四、LLM 模型部署

4.1 DeepSeek-V4 Flash 部署(Node-2,8×910C)

模型信息

项目详情
架构MoE,总参数 304B(0731 版),激活参数 13B
上下文1M Token
推荐量化W8A8 + MTP 投机解码版(DeepSeek-V4-Flash-w8a8-mtp)
单卡显存约 48-52GB(W8A8),910C 96GB 余量充足
推理性能910B 单并发约 35 token/s;910C 更高

获取模型权重

python3 -c "
from modelscope import snapshot_download
snapshot_download('deepseek-ai/DeepSeek-V4-Flash-w8a8-mtp', cache_dir='/data/models/llm')
"

启动服务(8 卡 TP)

docker run -d \
  --name deepseek-v4-flash \
  --restart unless-stopped \
  -p 8000:8000 \
  --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 \
  --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/llm/DeepSeek-V4-Flash-w8a8-mtp:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
  -e VLLM_USE_V1=1 \
  vllm/vllm-ascend:v0.13.0rc3 \
  --model /model \
  --served-model-name deepseek-v4-flash \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 8 \
  --max-model-len 131072 \
  --gpu-memory-utilization 0.85 \
  --trust-remote-code \
  --dtype float16 \
  --enable-mtp \
  --mtp-num-draft-layers 3

验证

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "deepseek-v4-flash", "messages": [{"role": "user", "content": "你好,请介绍一下你自己"}], "max_tokens": 200, "stream": true}'

成功标志:日志中出现 Application startup complete,API 调用返回正常 JSON(含 choices[0].message.content)。


4.2 Qwen3.8-27B 部署(Node-4,卡 0-1)

Qwen3.8-27B 是 27B 稠密原生多模态模型,INT4 量化后仅约 17GB,2 张 910B 即可稳定运行,剩余 6 卡用于 InternVL2.5-78B。

# 获取权重
python3 -c "
from modelscope import snapshot_download
snapshot_download('Qwen/Qwen3.8-27B-Instruct', cache_dir='/data/models/llm')
"

# 启动单实例(2 卡 TP)
docker run -d \
  --name qwen38-27b \
  --restart unless-stopped \
  -p 8001:8000 \
  --device=/dev/davinci0 --device=/dev/davinci1 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/llm/Qwen3.8-27B-Instruct:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=0,1 \
  vllm/vllm-ascend:v0.13.0rc3 \
  --model /model \
  --served-model-name qwen3.8-27b \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 2 \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.9 \
  --trust-remote-code \
  --quantization awq \
  --dtype float16

验证

curl http://localhost:8001/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "qwen3.8-27b", "messages": [{"role": "user", "content": "写一个快速排序的 Python 函数"}], "max_tokens": 500}'

4.3 InternVL2.5-78B 部署(Node-4,卡 2-7)

InternVL2.5-78B 是上海人工智能实验室开源的 78B 视觉语言模型,支持图文理解、OCR 文字识别、文档/表格/图表分析、多图推理和 Grounding 定位。昇腾 ModelZoo 官方适配,BF16 全量约 156GB,6 张 910B 张量并行可稳定运行。

# 获取权重(或从昇腾 ModelZoo 下载适配版本)
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('OpenGVLab/InternVL2_5-78B', local_dir='/data/models/vlm/InternVL2_5-78B')
"

# 启动(6 卡 TP)
docker run -d \
  --name internvl2-78b \
  --restart unless-stopped \
  -p 8002:8000 \
  --device=/dev/davinci2 --device=/dev/davinci3 --device=/dev/davinci4 \
  --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/vlm/InternVL2_5-78B:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=2,3,4,5,6,7 \
  vllm/vllm-ascend:v0.13.0rc3 \
  --model /model \
  --served-model-name internvl2.5-78b \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 6 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.85 \
  --trust-remote-code \
  --dtype bfloat16 \
  --limit-mm-per-prompt image=4

验证(图文理解)

curl http://localhost:8002/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "internvl2.5-78b", "messages": [{"role": "user", "content": [{"type": "text", "text": "请描述这张图片的内容"}, {"type": "image_url", "image_url": {"url": "https://example.com/test.jpg"}}]}], "max_tokens": 500}'

五、文生视频模型部署

5.1 MiniMax H3 部署(Node-1,8×910C)—— 主力视频模型

模型信息

项目详情
架构33B 全模态视频生成模型(H3-Context-IR + H3-Base + H3-Regenerate-2K)
能力文生视频、图生视频、视频编辑、V2V 动作迁移;原生立体声同步生成
规格最高 2K 分辨率,最长 15 秒,24fps
昇腾适配开源当日 0Day 适配,Atlas 800 A3 (910C) / A2 (910B) 稳定运行
性能排名Artificial Analysis 有声视频编辑全球第一(Elo 1130)
# 获取权重
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('MiniMaxAI/H3-Base', local_dir='/data/models/video/MiniMax-H3')
"

# 使用 SGLang 部署(推荐)
docker run -d \
  --name minimax-h3 \
  --restart unless-stopped \
  -p 8500:30000 \
  --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 \
  --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/video/MiniMax-H3:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
  lmsysorg/sglang:latest \
  python3 -m sglang.launch_server \
    --model-path /model \
    --served-model-name minimax-h3 \
    --host 0.0.0.0 \
    --port 30000 \
    --tensor-parallel-size 8 \
    --trust-remote-code \
    --dtype bfloat16 \
    --mem-fraction-static 0.85

验证

curl http://localhost:8500/v1/videos/generations \
  -H "Content-Type: application/json" \
  -d '{"model": "minimax-h3", "prompt": "一只猫在阳光下打盹,镜头缓慢推进", "num_frames": 81, "width": 1280, "height": 720, "num_inference_steps": 20}' \
  --output output.mp4

生成耗时参考:720P/5秒/30步 ≈ 2-4 分钟;2K/15秒 ≈ 8-15 分钟。


5.2 Wan2.2 部署(Node-3,8×910B)

Wan2.2-T2V-14B 是阿里通义万相开源的 14B DiT 文生视频模型,指令遵循强,支持运镜控制。vLLM-Omni × MindIE SD 在昇腾上性能提升 2.4 倍。

docker run -d \
  --name wan22 \
  --restart unless-stopped \
  -p 8600:8000 \
  --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 \
  --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/video/Wan2.2-T2V-14B:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
  vllm/vllm-omni-ascend:latest \
  --model /model \
  --served-model-name wan2.2 \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 8 \
  --trust-remote-code \
  --dtype bfloat16 \
  --gpu-memory-utilization 0.85

5.3 Step-Video-T2V 部署(Node-6,卡 0-5)

Step-Video-T2V-30B 是阶跃星辰开源的 30B 文生视频模型,基于华为昇腾 CANN 完成适配,魔乐社区上架。占用 Node-6 的 6 张卡,剩余 2 卡部署 Step-Audio。

docker run -d \
  --name step-video \
  --restart unless-stopped \
  -p 8700:8000 \
  --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 \
  --device=/dev/davinci3 --device=/dev/davinci4 --device=/dev/davinci5 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/video/Step-Video-T2V-30B:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=0,1,2,3,4,5 \
  stepfun/step-video-ascend:latest \
  --model /model \
  --served-model-name step-video \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 6 \
  --trust-remote-code \
  --dtype float16

5.4 Open-Sora Plan V1.5(备选,分时复用 Node-3)

Open-Sora Plan V1.5 是行业首个 100% 基于昇腾架构的视觉生成模型,昇腾上性能最优。与 Wan2.2 分时复用 Node-3,不同时运行:

# 停止 Wan2.2
docker stop wan22

# 启动 Open-Sora
cd /data/models/opensora/Open-Sora-Plan-v1.5
bash scripts/inference.sh --config configs/opensora-v1-5/inference.py --prompt "测试视频"

六、文生音频 / 语音与 RAG 组件部署

6.1 Ming-Flash-Omni 2.0 部署(Node-5,卡 0-3,4 卡)—— 主力音乐/音频模型

模型信息

项目详情
定位业界首个全场景音频统一生成模型(蚂蚁百灵)
能力同一条音轨同时生成语音 + 环境音效 + 音乐;自然语言控制音色、语速、语调、音量、情绪、方言
规格推理帧率 3.1Hz,可生成分钟级音频
昇腾生态同家族 Ling-3.0-flash 获昇腾 0Day 适配,配套官方标准化部署方案
docker run -d \
  --name ming-flash-omni \
  --restart unless-stopped \
  -p 8800:8000 \
  --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/audio/Ming-Flash-Omni-2.0:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=0,1,2,3 \
  vllm/vllm-ascend:v0.13.0rc3 \
  --model /model \
  --served-model-name ming-flash-omni \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 4 \
  --trust-remote-code \
  --dtype bfloat16 \
  --gpu-memory-utilization 0.8 \
  --max-model-len 8192

API 调用示例

# 音乐生成
curl http://localhost:8800/v1/audio/music \
  -H "Content-Type: application/json" \
  -d '{"model":"ming-flash-omni","prompt":"轻快的钢琴曲,适合咖啡厅背景","duration":30}' \
  --output music.wav

# 语音生成
curl http://localhost:8800/v1/audio/speech \
  -H "Content-Type: application/json" \
  -d '{"model":"ming-flash-omni","input":"你好,欢迎使用智能语音服务","voice":"female_calm"}' \
  --output speech.wav

6.2 Step-Audio 2 mini 部署(Node-6,卡 6-7)

模型信息

项目详情
定位行业首个产品级开源端到端语音交互模型
能力情绪、方言、语种、歌声、个性化风格;高质量音色复刻;连续对话+打断处理
架构端到端多模态,语音理解+音频推理+生成统一建模
昇腾支持基于 CANN 完成适配,魔乐社区上架
docker run -d \
  --name step-audio \
  --restart unless-stopped \
  -p 8900:8000 \
  --device=/dev/davinci6 --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/audio/Step-Audio-2-mini:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=6,7 \
  stepfun/step-audio-ascend:latest \
  --model /model \
  --served-model-name step-audio \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 2 \
  --trust-remote-code \
  --dtype float16

6.3 Whisper-large-v3 部署(Node-5,卡 4-5)

Whisper-large-v3 是 OpenAI 开源的多语言语音识别模型,支持 99 种语言的语音转文字和翻译。昇腾有 Atomgit-Ascend 官方优化版,支持 CANN 8.0+,提供 OpenAI Whisper API 兼容接口。2 张 910B 可支撑大 batch 并发和长音频处理。

# 获取权重(或使用昇腾优化版:https://ai.gitcode.com/atomgit-ascend/whisper-large-v3-turbo)
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('openai/whisper-large-v3', local_dir='/data/models/audio/whisper-large-v3')
"

# 启动(2 卡)
docker run -d \
  --name whisper-large-v3 \
  --restart unless-stopped \
  -p 9000:9000 \
  --device=/dev/davinci4 --device=/dev/davinci5 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/audio/whisper-large-v3:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=4,5 \
  -e MODEL_PATH=/model \
  -e PORT=9000 \
  atomgit-ascend/whisper-large-v3:latest \
  python3 server.py --model /model --host 0.0.0.0 --port 9000 --device npu

验证

curl http://localhost:9000/v1/audio/transcriptions \
  -H "Content-Type: multipart/form-data" \
  -F "file=@test_audio.wav" \
  -F "model=whisper-large-v3" \
  -F "language=zh" \
  -F "response_format=json"

6.4 BGE-M3 Embedding 部署(Node-5,卡 6)

BGE-M3 是智源 BAAI 开源的多语言 Embedding 模型,支持 100+ 语言,提供稠密/稀疏/多向量三种模式,最大上下文 8192。单张 910B 即可轻松运行,可支撑数百 QPS 的向量化请求,是 RAG 系统的核心组件。

# 获取权重
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('BAAI/bge-m3', local_dir='/data/models/embedding/bge-m3')
"

# 启动(1 卡,MIS-TEI)
docker run -d \
  --name bge-m3 \
  --restart unless-stopped \
  -p 9100:8080 \
  --device=/dev/davinci6 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/embedding/bge-m3:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=6 \
  -e MODEL_ID=/model \
  -e MAX_BATCH_TOKENS=8192 \
  mis-tek/tei-ascend:latest

验证

curl http://localhost:9100/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{"model": "bge-m3", "input": ["你好世界", "Hello World"]}'

6.5 BGE-Reranker-v2-m3 部署(Node-5,卡 7)

BGE-Reranker-v2-m3 是智源 BAAI 开源的多语言重排序模型,用于 RAG 系统中对初筛结果精排,显著提升检索准确率。单张 910B 即可运行,与 BGE-M3 配合构成完整 RAG 检索增强链路。

# 获取权重
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download('BAAI/bge-reranker-v2-m3', local_dir='/data/models/embedding/bge-reranker-v2-m3')
"

# 启动(1 卡,MIS-TEI)
docker run -d \
  --name bge-reranker \
  --restart unless-stopped \
  -p 9200:8080 \
  --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
  -v /data/models/embedding/bge-reranker-v2-m3:/model \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
  -e ASCEND_VISIBLE_DEVICES=7 \
  -e MODEL_ID=/model \
  mis-tek/tei-ascend:latest

验证

curl http://localhost:9200/rerank \
  -H "Content-Type: application/json" \
  -d '{"model": "bge-reranker-v2-m3", "query": "什么是昇腾910?", "documents": ["昇腾910是华为自研的AI训练芯片", "今天天气很好", "昇腾910B支持64GB HBM2e显存"]}'

七、统一 API 网关部署

7.1 架构说明

本方案不引入额外的模型管理平台,各模型推理框架(vLLM Ascend、vLLM-Omni、SGLang)直接启动 HTTP API Server 暴露服务。在 Node-6 部署 Nginx 作为统一入口,按请求路径路由到对应模型后端。LLM 接口天然兼容 OpenAI 格式,视频和音频生成接口按各推理框架原生格式暴露。

💡 为什么不用 GPUStack:GPUStack 适合需要 Web UI、多租户、模型自动调度的场景。如果只需要部署模型并提供 API,直接用各推理框架自带的 API Server + Nginx 反向代理更轻量,减少一层依赖和性能开销,排障也更直接。

7.2 各模型 API 端口汇总

模型节点端口API 路径接口格式
DeepSeek-V4 FlashNode-28000/v1/chat/completionsOpenAI 兼容
Qwen3.8-27BNode-48001/v1/chat/completionsOpenAI 兼容
InternVL2.5-78BNode-48002/v1/chat/completions(多模态)OpenAI 兼容
MiniMax H3Node-18500/v1/videos/generationsSGLang 原生
Wan2.2Node-38600/v1/videos/generationsvLLM-Omni 原生
Step-Video-T2VNode-68700/v1/videos/generations框架原生
Ming-Flash-OmniNode-58800/v1/audio/music, /v1/audio/speechvLLM 扩展
Step-AudioNode-68900/v1/audio/speech框架原生
Whisper-large-v3Node-59000/v1/audio/transcriptionsOpenAI 兼容
BGE-M3Node-59100/v1/embeddingsOpenAI 兼容
BGE-Reranker-v2-m3Node-59200/rerankCohere 兼容

7.3 Nginx 部署与配置

在 Node-6 上使用 Docker 运行 Nginx 容器作为统一入口:

docker run -d \
  --name ai-gateway \
  --restart unless-stopped \
  --network host \
  -v /opt/ai-gateway/nginx.conf:/etc/nginx/nginx.conf:ro \
  nginx:1.25-alpine

创建 /opt/ai-gateway/nginx.conf(将 Node-X-IP 替换为各节点实际内网 IP):

worker_processes auto;
events { worker_connections 4096; }

http {
    upstream llm_deepseek {
        server Node-2-IP:8000 max_fails=3 fail_timeout=30s;
        keepalive 32;
    }
    upstream llm_qwen {
        server Node-4-IP:8001 max_fails=3 fail_timeout=30s;
        keepalive 32;
    }
    upstream vision_internvl {
        server Node-4-IP:8002 max_fails=3 fail_timeout=30s;
        keepalive 16;
    }
    upstream video_minimax {
        server Node-1-IP:8500 max_fails=3 fail_timeout=30s;
    }
    upstream video_wan {
        server Node-3-IP:8600 max_fails=3 fail_timeout=30s;
    }
    upstream video_step {
        server Node-6-IP:8700 max_fails=3 fail_timeout=30s;
    }
    upstream audio_ming {
        server Node-5-IP:8800 max_fails=3 fail_timeout=30s;
    }
    upstream audio_step {
        server Node-6-IP:8900 max_fails=3 fail_timeout=30s;
    }
    upstream audio_whisper {
        server Node-5-IP:9000 max_fails=3 fail_timeout=30s;
    }
    upstream embedding_bge {
        server Node-5-IP:9100 max_fails=3 fail_timeout=30s;
        keepalive 32;
    }
    upstream rerank_bge {
        server Node-5-IP:9200 max_fails=3 fail_timeout=30s;
        keepalive 16;
    }

    server {
        listen 80;
        server_name ai-gateway.yourdomain.com;
        client_max_body_size 200m;

        location /v1/chat/deepseek/ {
            rewrite ^/v1/chat/deepseek/(.*)$ /v1/$1 break;
            proxy_pass http://llm_deepseek;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_read_timeout 600s;
            proxy_buffering off;
        }
        location /v1/chat/qwen/ {
            rewrite ^/v1/chat/qwen/(.*)$ /v1/$1 break;
            proxy_pass http://llm_qwen;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_read_timeout 600s;
            proxy_buffering off;
        }
        location /v1/vision/internvl/ {
            rewrite ^/v1/vision/internvl/(.*)$ /v1/$1 break;
            proxy_pass http://vision_internvl;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_read_timeout 600s;
            proxy_buffering off;
        }
        location /v1/video/minimax/ {
            rewrite ^/v1/video/minimax/(.*)$ /v1/$1 break;
            proxy_pass http://video_minimax;
            proxy_set_header Host $host;
            proxy_read_timeout 900s;
            proxy_buffering off;
        }
        location /v1/video/wan/ {
            rewrite ^/v1/video/wan/(.*)$ /v1/$1 break;
            proxy_pass http://video_wan;
            proxy_set_header Host $host;
            proxy_read_timeout 900s;
            proxy_buffering off;
        }
        location /v1/video/step/ {
            rewrite ^/v1/video/step/(.*)$ /v1/$1 break;
            proxy_pass http://video_step;
            proxy_set_header Host $host;
            proxy_read_timeout 900s;
            proxy_buffering off;
        }
        location /v1/audio/ming/ {
            rewrite ^/v1/audio/ming/(.*)$ /v1/$1 break;
            proxy_pass http://audio_ming;
            proxy_set_header Host $host;
            proxy_read_timeout 600s;
            proxy_buffering off;
        }
        location /v1/audio/step/ {
            rewrite ^/v1/audio/step/(.*)$ /v1/$1 break;
            proxy_pass http://audio_step;
            proxy_set_header Host $host;
            proxy_read_timeout 600s;
            proxy_buffering off;
        }
        location /v1/audio/whisper/ {
            rewrite ^/v1/audio/whisper/(.*)$ /v1/$1 break;
            proxy_pass http://audio_whisper;
            proxy_set_header Host $host;
            proxy_read_timeout 600s;
            client_max_body_size 100m;
        }
        location /v1/embedding/bge/ {
            rewrite ^/v1/embedding/bge/(.*)$ /v1/$1 break;
            proxy_pass http://embedding_bge;
            proxy_set_header Host $host;
            proxy_read_timeout 120s;
        }
        location /v1/rerank/bge/ {
            rewrite ^/v1/rerank/bge/(.*)$ /$1 break;
            proxy_pass http://rerank_bge;
            proxy_set_header Host $host;
            proxy_read_timeout 120s;
        }
        location /health {
            access_log off;
            return 200 "ok\n";
            add_header Content-Type text/plain;
        }
    }
}

📝 配置说明:路径采用 /v1/<类型>/<模型名>/ 前缀区分不同模型,Nginx 通过 rewrite 去掉前缀后转发到对应后端。LLM 流式输出(SSE)必须设置 proxy_buffering off,否则客户端无法实时收到 token。

7.4 网关验证

# 健康检查
curl http://Node-6-IP/health

# LLM 接口(DeepSeek)
curl http://Node-6-IP/v1/chat/deepseek/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"你好"}],"max_tokens":50}'

# 视频生成接口(MiniMax)
curl http://Node-6-IP/v1/video/minimax/videos/generations \
  -H "Content-Type: application/json" \
  -d '{"model":"minimax-h3","prompt":"测试","num_frames":41,"width":640,"height":480,"num_inference_steps":10}'

# 语音识别接口(Whisper)
curl http://Node-6-IP/v1/audio/whisper/audio/transcriptions \
  -F "file=@test.wav" -F "model=whisper-large-v3" -F "language=zh"

# Embedding 接口(BGE-M3)
curl http://Node-6-IP/v1/embedding/bge/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{"model":"bge-m3","input":["你好世界"]}'

八、验证与性能测试

8.1 逐模型验证清单

模型验证命令预期结果
DeepSeek-V4 Flashcurl /v1/chat/completions返回正常文本,首 token 延迟 < 2s
Qwen3.8-27Bcurl /v1/chat/completions返回正常文本,2 卡单实例稳定运行
InternVL2.5-78Bcurl /v1/chat/completions(带图片)返回图片描述,OCR 文字识别正确
MiniMax H3curl /v1/videos/generations返回视频文件,720P/5秒
Wan2.2curl /v1/videos/generations返回视频文件,1080P/10秒
Ming-Flash-Omnicurl /v1/audio/music返回 wav 音频,可播放
Step-Audiocurl /v1/audio/speech返回语音 wav,自然流畅
Whisper-large-v3curl /v1/audio/transcriptions返回识别文本,中文准确率 > 95%
BGE-M3curl /v1/embeddings返回 1024 维向量,响应 < 100ms
BGE-Rerankercurl /rerank返回相关性打分,排序正确

8.2 性能基准测试

# LLM 吞吐测试
for i in $(seq 1 10); do
  curl -s http://Node-2-IP:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"写一首关于秋天的诗"}],"max_tokens":200,"stream":true}' \
    | grep -o '"delta":{"content":"[^"]*"' | wc -c
done

# 视频生成耗时测试
time curl -s http://Node-1-IP:8500/v1/videos/generations \
  -H "Content-Type: application/json" \
  -d '{"model":"minimax-h3","prompt":"测试视频","num_frames":81,"width":1280,"height":720,"num_inference_steps":20}' \
  -o /dev/null

九、运维与排障

9.1 常用运维命令

# 实时查看 NPU 利用率和显存
watch -n 1 npu-smi info

# 查看指定芯片详细信息
npu-smi info -t board -i 0

# 查看 NPU 健康状态
npu-smi info -t health -i 0

# 查看模型加载日志
docker logs -f --tail 100 deepseek-v4-flash

# 查看最近的错误
docker logs minimax-h3 2>&1 | grep -i error | tail -20

9.2 常见问题与解决方案

问题现象可能原因解决方案
容器启动后 npu-smi 无设备未正确挂载 /dev/davinci* 设备检查 docker run 的 --device 参数
模型加载 OOM(显存不足)量化版本不对或 max-model-len 过大降低 max-model-len,使用更激进量化,增加 TP 卡数
算子不支持报错CANN 版本与模型算子不匹配升级 CANN,或使用模型官方推荐的镜像
视频生成花屏/噪点VAE 解码精度问题或 dtype 不对确保使用 bfloat16/float16,检查 VAE 权重
音频生成有杂音采样率不匹配或音频解码器问题检查 sample_rate 参数,使用默认声码器配置
vLLM 启动卡住模型权重路径错误或格式不支持检查模型路径,确认权重格式(safetensors)
Nginx 502 Bad Gateway后端模型服务未启动或端口不通检查对应节点容器状态,curl 后端端口验证
Whisper 识别慢音频过长或 batch 配置不当分段处理长音频,调整 batch_size

9.3 监控建议

  • 部署 Prometheus + npu-exporter 采集 NPU 利用率、显存、温度指标;
  • 配置 Grafana 仪表盘,实时监控 6 台节点的 NPU 状态;
  • 对模型 API 配置健康检查(/health 端点),异常时自动告警;
  • 视频/音频生成任务为长耗时操作,建议接入任务队列(Redis + Celery)做异步处理。

十、附录

10.1 模型下载地址汇总

模型下载地址协议
DeepSeek-V4-Flash-w8a8-mtpModelScope: deepseek-ai/DeepSeek-V4-Flash-w8a8-mtpMIT
Qwen3.8-27B-InstructModelScope: Qwen/Qwen3.8-27B-InstructApache 2.0
InternVL2.5-78B昇腾 ModelZoo / HuggingFace: OpenGVLab/InternVL2_5-78BApache 2.0
MiniMax H3-BaseHuggingFace: MiniMaxAI/H3-BaseApache 2.0
Wan2.2-T2V-14BModelScope: Wan-AI/Wan2.2-T2V-14BApache 2.0
Step-Video-T2V-30B魔乐社区 Modelers / HuggingFace: stepfunApache 2.0
Ming-Flash-Omni-2.0ModelScope: ant-research/Ming-Flash-Omni-2.0Apache 2.0
Step-Audio-2-miniHuggingFace: stepfun/Step-Audio-2-miniApache 2.0
Whisper-large-v3HuggingFace: openai/whisper-large-v3 / Atomgit-Ascend 优化版MIT
BGE-M3HuggingFace: BAAI/bge-m3MIT
BGE-Reranker-v2-m3HuggingFace: BAAI/bge-reranker-v2-m3MIT
Open-Sora Plan V1.5GitHub: hpcaitech/Open-SoraApache 2.0

10.2 版本兼容性矩阵

组件版本 A版本 B(推荐)版本 C备注
CANN8.38.59.0(测试)8.5 对应驱动 25.5.0
驱动25.3.025.5.026.0.0必须与 CANN 匹配
vLLM Ascendv0.12.0v0.13.0rc3latestv0.13.0rc3 支持 DSV4
torch_npu2.4.02.5.02.6.0与 PyTorch 版本对应
Nginx1.241.251.27统一 API 网关,支持流式代理

10.3 参考资源

  • 昇腾社区:https://www.hiascend.com
  • CANN 文档:https://www.hiascend.com/document
  • vLLM Ascend:https://github.com/vllm-project/vllm
  • 魔乐社区(Modelers):https://modelers.cn
  • 魔搭社区(ModelScope):https://modelscope.cn
  • 华为云论坛昇腾专区:https://developer.huawei.com/consumer/cn/forum/ascend

总结

本方案的核心在于单实例 + 原生 API + Nginx 统一网关:每个模型独占所需 NPU 资源、推理框架直接暴露 HTTP 接口、网关按路径路由,整体架构轻量、排障直接,适合私有化场景快速交付。模型与昇腾工具链更新频繁,部署前请核对各模型官方仓库的最新昇腾适配说明

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐