【昇腾CANN训练营·服务化篇】从Offline到Online:使用MindIE构建高并发LLM推理服务
本文介绍了昇腾NPU的MindIE推理引擎在大模型部署中的创新技术。通过ContinuousBatching技术实现动态批处理调度,类比俄罗斯方块填补计算空隙;采用PagedAttention机制分页管理KVCache,解决显存碎片问题。文章详细演示了如何使用MindIE部署LLaMA模型:从环境准备、配置文件修改到服务启动,并展示了兼容OpenAI API的调用方式。MindIE支持直接加载To
训练营简介
2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。
报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro

前言
在之前的 ACL 部署篇中,我们学习了如何加载 .om 模型进行推理。这种模式被称为 Offline Inference(离线推理),非常适合 ResNet、YOLO 这种一次处理一张图的任务。
但在 ChatGPT 这样的大模型对话场景中,事情变得复杂了:
-
输入输出不等长:有的问题只有 5 个字,有的回答有 1000 个字。
-
生成过程漫长:是一个 Token 一个 Token 蹦出来的(Decode 阶段)。
如果强行用静态 Batch(比如 Batch=8)跑,只要其中一个请求没生成完,整个 Batch 的资源都被占用,导致显存利用率低,并发上不去。
MindIE (Mind Inference Engine) 是昇腾针对大模型推出的推理加速引擎(对标 NVIDIA Triton + TensorRT-LLM)。它引入了 Continuous Batching 和 PagedAttention 两大杀手锏,能将推理吞吐量提升数倍。
一、 核心图解:像玩俄罗斯方块一样调度
传统的 Static Batching 像是在做“拼车”,必须等最后一个人上车才能发车,等最后一个人下车才能收车。 MindIE 的 Continuous Batching 像是“俄罗斯方块”,只要有空隙(显存/算力),新的请求立刻插进来。

二、 核心技术:PagedAttention
除了调度,显存也是瓶颈。LLM 推理需要缓存 KV(Key-Value),这些数据随着生成长度动态增加。 如果预分配最大长度(比如 4096),显存瞬间就被吃光了,而且大部分是空的(Fragmentation)。
PagedAttention 借鉴了操作系统的 虚拟内存(Virtual Memory) 机制。
-
把 KV Cache 切成一个个小的 Page(页)。
-
物理上不连续,逻辑上通过页表(Page Table)连起来。
-
用多少申请多少,彻底解决了显存碎片化问题。
三、 实战:使用 MindIE Service 部署 LLaMA
MindIE 提供了类似 OpenAI 的标准接口,部署过程非常标准化。
3.1 环境准备
你需要一台安装了 CANN 和 MindIE 的 NPU 服务器(通常是 910B)。 下载 LLaMA2-7B 或 LLaMA3-8B 的 HuggingFace 权重。
3.2 配置 MindIE Server
修改 conf/config.json,这是 MindIE 的控制中枢。
{
"ServerConfig": {
"ipAddress": "0.0.0.0",
"port": 1025,
"maxLinkNum": 1000
},
"BackendConfig": {
"backendName": "mindieservice_llm_engine",
"modelInstanceNumber": 1,
"npuDeviceIds": [[0]], // 使用 0 号卡
"ModelDeployConfig": {
"maxBatchSize": 128, // 允许的最大并发
"maxSeqLen": 4096,
"ModelConfig": [
{
"modelName": "llama_7b",
"modelWeightPath": "/path/to/llama-7b-hf", // 权重路径
"worldSize": 1,
"npuMemSizeRatio": 0.8 // KV Cache 占用显存比例
}
]
}
}
}
3.3 启动服务
MindIE 极其方便的一点是,它不需要你先把模型转成 OM(虽然它底层支持 OM,但也支持直接加载 Torch 权重进行图编译)。
# 启动 MindIE Server
cd /usr/local/Ascend/mindie/latest/bin
./mindieservice_daemon
启动后,你会看到日志中开始进行 Graph Compilation(图编译)和 KV Cache Pre-allocation(KV Cache 预分配)。当看到 Server Start Success 时,服务就这就绪了。
3.4 发送请求 (OpenAI 兼容)
MindIE Service 提供了兼容 OpenAI Chat Completions API 的接口。你可以直接用 curl 或 openai python 库调用。
Curl 测试:
curl [http://127.0.0.1:1025/v1/chat/completions](http://127.0.0.1:1025/v1/chat/completions) \
-H "Content-Type: application/json" \
-d '{
"model": "llama_7b",
"messages": [{"role": "user", "content": "Hello, introduce Ascend NPU."}],
"max_tokens": 100,
"stream": true
}'
Python 测试:
from openai import OpenAI
client = OpenAI(
api_key="EMPTY",
base_url="[http://127.0.0.1:1025/v1](http://127.0.0.1:1025/v1)",
)
response = client.chat.completions.create(
model="llama_7b",
messages=[{"role": "user", "content": "写一段 Python 代码实现冒泡排序"}],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
四、 进阶:自定义 Backend
如果你有一些特殊的算子(比如第 20 期写的 RMSNorm)想在 MindIE 里用,怎么办?
MindIE 支持 Torch 模式。你可以修改模型源码(Python),把其中的 torch.nn.RMSNorm 替换成我们通过 PyTorch Adapter 注册的 custom_ops.rms_norm。 MindIE 在加载模型时,会通过 Dynamo 或 TorchScript 捕获图,此时你的自定义算子就会被编译进图里,享受 Continuous Batching 的调度红利。
五、 总结
MindIE 是昇腾大模型落地的“航母”。
-
调度革命:Continuous Batching 解决了动态 Batch 的效率问题。
-
显存革命:PagedAttention 解决了长序列推理的 OOM 问题。
-
接口标准:OpenAI 兼容接口让应用迁移几乎零成本。
从手写算子到部署服务,我们终于走完了 AI 落地的全链路。
更多推荐





所有评论(0)