大模型:吞吐量深度调优实践
吞吐量是衡量训练、推理服务生产落地能力的核心指标,直接决定算力资源利用率、业务 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 采样推理吞吐,二者共同决定端到端项目迭代效率。
更多推荐



所有评论(0)