吞吐量是衡量训练、推理服务生产落地能力的核心指标,直接决定算力资源利用率、业务 QPS 与部署成本。在昇腾 NPU 硬件之上,昇思 MindSpore 完整栈,结合 MindSpeed‑MM、MindFormers、vLLM‑MindSpore 插件,从图编译、算子优化、内存管理、并行策略、KVCache 调度、批处理策略多维度对吞吐量进行系统性优化。本文围绕吞吐量原理、关键调优手段、环境部署、可运行调优代码、性能测试与踩坑实践展开,帮助开发者充分释放 Ascend 910/310P 硬件算力,把 token 吞吐推到硬件理论上限。

一、吞吐量基础概念与计算公式

大模型吞吐量一般定义:单卡每秒处理 token 数量 tokens/s/p,分为训练吞吐量与推理吞吐量两类指标。

训练吞吐量公式:

Throughputtrain = SeqLen × samplespersecondper_card

● SeqLen:序列长度;

● samplespersecondpercard:单卡每秒处理样本数;

● 分布式场景下全局吞吐量 = 单卡吞吐量 × NPU 卡数。

推理吞吐量分为输入 token 吞吐、输出 token 吞吐。在线服务场景更关注输出 token 吞吐,受 KVCache 显存、批大小、prefill/decode 阶段调度共同约束。

很多开发者调优时只看单轮迭代耗时,忽略显存瓶颈、通信开销、碎片内存。昇腾 NPU 上,吞吐量的瓶颈常见于:算子未融合、KV‑Cache 显存碎片化、并行策略不合理、小 batch 下调度开销大、图模式未开启、梯度累积配置错误。MindSpore 针对上述痛点,提供算子融合、PageAttention、动态 batching、ZeroBubbleV 流水线并行、混合精度等全套能力来抬升吞吐上限。

二、整体优化架构

整体分为四层,从硬件到业务层逐层协同提升吞吐量:

1. 硬件层:Ascend 910/310P NPU,提供高算力带宽,驱动固件版本需要和 MindSpore 严格匹配;

2. 框架层:MindSpore 核心,图编译、算子融合、内存复用、FlashAttention、PageAttention、混合精度;

3. 组件层:MindSpeed‑MM 高性能算子库、MindFormers 大模型套件、vLLM‑MindSpore 推理插件,ZeroBubbleV 流水线并行、SAPP 自动并行策略推荐工具;

4. 业务层:动态 batch、梯度累积、量化(W8A8/W4A16)、prompt packing,适配训练 / 多模态 RL、在线推理服务。

训练场景下,除基础大模型训练外,前文昇腾多模态生成强化学习框架 GRPO/DanceGRPO/veRL 训练同样受吞吐量约束;Rollout 采样阶段吞吐不足,会直接拖慢整个 RL 训练迭代速度。推理场景 PageAttention 对 KVCache 做块式管理,减少显存碎片,允许更大并发 batch,显著拉高在线吞吐量。

三、环境准备与依赖安装

下面给出可直接在昇腾环境执行的安装脚本,包含 MindSpore、MindSpeed‑MM、MindFormers、vLLM‑MindSpore 性能测试组件。

# 设置昇思pip源
pip config set global.index-url https://pypi.mindspore.cn/simple

# 安装核心框架,建议2.4及以上版本
pip install "mindspore>=2.4.0"
pip install mindspeed-mm
pip install mindformers

# 克隆mindformers,用于大模型训练、推理benchmark
git clone https://gitee.com/mindspore/mindformers.git
cd mindformers
pip install -e .

# vLLM‑mindspore插件,推理吞吐量测试
git clone https://gitee.com/mindspore/vllm-mindspore.git
cd vllm-mindspore
pip install -e .

注意:环境必须匹配 CANN 驱动版本;建议开启GRAPH_MODE静态图模式,PyNative 动态图模式吞吐量会大幅下降,仅用于调试。

四、核心调优代码示例

4.1 训练侧基础吞吐优化配置代码

包含静态图开启、混合精度、FlashAttention、梯度累积,控制训练吞吐基础环境:

import mindspore as ms
from mindspore import context

# 1. 全局上下文配置,吞吐量调优关键
context.set_context(
    mode=ms.GRAPH_MODE,          # 静态图,必须开启,吞吐核心保障
    device_target="Ascend",
    amp_level="O2",               # 混合精度,平衡精度与吞吐
    mem_optimize_level=1,         # 开启内存复用,减少显存占用,支持更大batch
)

# 大模型训练网络构建,开启FlashAttention
from mindformers.models import LlamaForCausalLM, LlamaConfig

config = LlamaConfig(
    vocab_size=32000,
    hidden_size=4096,
    num_layers=32,
    num_heads=32,
    seq_length=2048,
    use_flash_attention=True,     # FlashAttention,降低显存,提升吞吐
)
model = LlamaForCausalLM(config)

# 训练参数:梯度累积,在单卡显存不足时模拟更大global_batch,提升吞吐效率
grad_accumulation_steps = 8

# 优化器
optimizer = ms.nn.AdamWeightDecay(
    model.trainable_params(),
    learning_rate=1e-4,
    weight_decay=0.01
)

4.2 吞吐量指标统计工具代码

自动统计单卡 token 吞吐量,打印关键性能指标,可嵌入训练循环中:

import time
import mindspore as ms

class ThroughputMonitor:
    def __init__(self, seq_len: int, grad_acc: int=1):
        self.seq_len = seq_len
        self.grad_acc = grad_acc
        self.start_time = None
        self.total_samples = 0

    def step_begin(self):
        self.start_time = time.perf_counter()

    def step_end(self, batch_size: int):
        end = time.perf_counter()
        duration = end - self.start_time
        real_batch = batch_size * self.grad_acc
        sample_per_sec = real_batch / duration
        token_per_sec = sample_per_sec * self.seq_len

        print(f"[Perf] batch_samples:{real_batch}, time_cost:{duration:.3f}s")
        print(f"[Throughput] samples/s:{sample_per_sec:.2f}, tokens/s/card:{token_per_sec:.2f}")
        return token_per_sec

# 使用示例
monitor = ThroughputMonitor(seq_len=2048, grad_acc=8)

# 在训练循环内部调用
# monitor.step_begin()
# loss = model(input_ids, labels)
# loss.backward()
# optimizer.step()
# monitor.step_end(batch_size=2)

4.3 推理吞吐量调优(PageAttention 开启)

推理场景开启 PageAttention 优化 KVCache,提升并发与吞吐:

from mindformers import AutoModel, AutoTokenizer

model_config = {
    "model_type": "llama",
    "use_page_attention": True,    # PageAttention,KVCache块存储,降低碎片,提升推理吞吐
    "max_decode_length": 1024,
    "kv_cache_quant": False
}

tokenizer = AutoTokenizer.from_pretrained("Qwen‑7B‑Instruct")
model = AutoModel.from_pretrained("Qwen‑7B‑Instruct", **model_config)

# 推理benchmark脚本可复用vllm‑mindspore自带benchmark_throughput.py

4.4 分布式启动脚本(单机 8 卡训练吞吐量压测)

bash msrun_launcher.sh \
"python train_llama_throughput.py \
--config configs/llama2/llama_7b.yaml \
--mode train \
--device Ascend \
--grad_accumulation 8 \
--use_flash_attention True" 8

五、关键调优策略详解

5.1 训练吞吐量调优要点

1. 必须开启 GRAPH_MODE 静态图:PyNative 调试方便,但缺少算子融合,吞吐下降数倍,生产训练禁止使用;

2. FlashAttention + 内存复用:降低中间激活显存占用,可以调大 micro‑batch,直接拉高样本吞吐;

3. 梯度累积:显存不够放大 global_batch,不会增加单卡显存,但提升统计样本效率;

4. ZeroBubbleV 流水线并行:降低流水线气泡时间,大模型多卡训练显著提升有效计算占比;

5. SAPP 自动并行策略:自动推荐张量 / 流水线 / 数据并行组合,避免人工调参带来的通信瓶颈,复杂多模态 RL 训练场景收益明显;

6. 混合精度 amp_level="O2",注意做 loss‑scale,防止梯度下溢。

多模态强化学习(GRPO/DanceGRPO)场景特别注意:Rollout 采样阶段推理吞吐会成为短板,需要同时优化生成侧推理吞吐,否则训练迭代被采样拖慢。

5.2 推理吞吐量调优要点

1. PageAttention 开启,解决 KVCache 内存碎片,支持更大并发请求数,在线服务吞吐提升显著;

2. 量化:W8A8 权重量化,降低权重显存,支持更多并发;KVCache 量化进一步节省显存;

3. Prefill‑decode 调度分离,长序列场景减少 prefill 阻塞 decode;

4. 动态 batching,合并长短 prompt 请求,避免小请求带来调度开销。

六、性能测试方法

MindSpore 生态提供现成 benchmark 脚本,以推理吞吐量测试为例:

python3 benchmarks/benchmark_throughput.py \
--model Qwen/Qwen‑7B‑Instruct \
--dataset‑name sonnet \
--num‑prompts 64

输出关键指标:requests/s、total tokens/s、output tokens/s,其中output tokens/s为推理业务最核心吞吐指标。

训练场景,使用上文中ThroughputMonitor类输出 tokens/s/card,对比不同并行、batch、开关 FlashAttention 前后数值变化,定位瓶颈。

七、常见踩坑与排错经验

1. 吞吐量上不去,显存还有剩余:大概率没有开启图模式,算子没有融合,检查context.set_context(mode=ms.GRAPH_MODE);

2. 多卡训练吞吐线性度差:通信开销过高,优先使用 SAPP 工具自动推荐并行策略,不要全部靠手工配置;

3. RL 多模态训练中训练吞吐很高,但整体迭代很慢:瓶颈在 Rollout 生成推理吞吐,需要同时优化推理侧 PageAttention、batch;

4. 开启 O2 混合精度出现 loss 爆炸:调整 loss‑scale,开启梯度裁剪;

5. 内存充足但 batch 无法放大:存在激活碎片,开启mem_optimize_level=1内存复用。

八、总结

昇思 MindSpore 在昇腾 NPU 上对大模型吞吐量的优化是一套端到端全栈能力,从底层图编译、算子融合、内存管理,到上层 FlashAttention、PageAttention、ZeroBubbleV 并行调度、量化、自动并行 SAPP,覆盖训练、推理、多模态强化学习全场景。

吞吐量调优不是单一参数调大 batch size,而是在显存约束下平衡算子、内存、通信、批处理策略。通过本文给出的配置、监控代码、benchmark 脚本,开发者可以快速定位吞吐瓶颈,把硬件算力释放出来,降低大模型训练与推理业务的算力成本。在多模态生成强化学习等复杂任务中,既要关注训练更新阶段吞吐,也不能忽视 Rollout 采样推理吞吐,二者共同决定端到端项目迭代效率。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐