东方智慧AI 算力
AI算力 · 昇腾部署课件 G8

G8 容量与成本

2026-10-05

编制:观澜|日期:2026-10-06|级别:T2 标准级 层级:G 层 · 企业落地(G 层第 8 课;前接 G6 问答编排、G7 效果评估,后接 G9 企业安全) 素材来源:MindIE 3.1.0(《性能/精度测试工具》AISBench、《大规模专家并行方案典型配置》、《服务化调优工具》msServiceProfiler)+ MindStudio 26.1.0(《MindIE 推理性能解决方案 · TopN 性能问题的解决方案》含服务化性能上限评估与显存瓶颈算法、《服务化专家建议工具》、《服务化自动寻优工具》)+ CANN 9.2.0-beta.2(《服务化自动寻优工具》)+ MindSDK 26.1.0(RAG SDK《模型推理加速》)+ 官方案例库 版本口径:MindIE 3.1.0 / MindStudio 26.1.0 / CANN 9.2.0-beta.2 / RAG SDK 26.1.0,各条已单独标注 数据纪律:任何性能与成本数字都必须有官方出处;官方没给的(单价、"一张卡支持多少并发"的通用值)一律明写「官方未给出」,不编。


第一段 章前定位

这一课不教你什么

先把三课的边界划清——这一课不是 D5,也不是 F4。

D5《可用性与调优》 F4《性能调优》 本课 G8《容量与成本》
问的问题 服务别挂:进程卡死没有、健康检查通不通 跑得慢怎么变快:慢在哪一层、数据怎么采、怎么看 算力要买多少、卡怎么分、成本怎么算
视角 服务视角(就绪、自愈、静默故障) 设备与执行视角(算子、搬运、通信、下发) 采购与业务视角(并发数、显存容量、节点台数、单位成本)
触发场景 服务起来了但不稳定 服务稳定但时延/吞吐不达标 服务达标了,但老板问"这要几台机器、一年多少钱"

一句话分工:

D5 管"活着",F4 管"跑得快不快",G8 管"要花多少、怎么花最省"。

三课都会碰到 maxBatchSize、吞吐、显存 这些词,但问的问题完全不同: F4 问"怎么把吞吐提上去",G8 问"这个吞吐下,显存够撑到多少并发、要几台机器、每台机器摊到每千 token 多少钱"。 F4 是把机器跑快,G8 是决定买几台机器。

其次,这一课有几件事给不了你答案

这是本课最需要提前说明的一条,因为它直接决定这份文档可不可信:

你想要的 为什么给不了
"一张 Atlas 800I A2 能支持多少并发" 的通用值 并发上限取决于模型、权重精度、输入输出长度、序列长度、NPU_MEMORY_FRACTION 等;官方未给出与场景无关的通用数字,只能按你的场景实测 + 按官方公式估算
"一年多少钱" 的报价 硬件/云资源价格随采购渠道与时间变;官方文档不含价格数字。本课给的是算成本的公式与取数口径,价格按实际采购/计费填进去
"这个模型该用几台机器" 的固定答案 官方给的是按 AI 计算节点规模查的典型配置表(P/D 实例与节点数的对应),不是按模型名给的固定值

⭐ 所以本课教的是四件"能自己算出来"的事: ① 怎么测出发上限;② 怎么把上限折算成并发/批量;③ 怎么按官方表查出机器台数;④ 怎么用实测吞吐 × 按实际计价得到单位成本。

第三,一条数据纪律先讲明

性能与成本数字最容易被编造("这张卡能带 1000 并发"这类)。本课的原则:

凡官方给了公式/阈值/示例值的,写明「出处 + 版本 + 是示例还是要现场确认」;官方没给的,正文里明写「官方未给出,需现场实测/按实际计价」。

一个必须记住的口径: 官方在不同产品、不同场景下给的数字口径并不统一(例如"未掩盖通信 ≤10%"来自 MindSpeed LLM 的 FSDP2 训练场景)。 本课会逐条标明每个数字来自哪篇文档、哪个场景,避免把一个场景的值当普适真理用。


第二段 学习目标

学完这一课,你应该能:

  1. ✅ 说清容量规划的四个问题:一张卡能扛多少并发 → 卡怎么分 → 要几台机器 → 一年多少钱,以及每个问题各自的依据来源
  2. ✅ 用官方公式把"显存"折算成"最大并发/maxBatchSize":记住 cacheBlockSize 默认值、最大/平均 Block 数量 公式、Floor[Total Block Num / Block 数量] 这条上限
  3. ✅ 用实测拿到 Total Block Num(查日志关键字 npuBlockNum)和纯模型性能上限,并知道服务化吞吐要按纯模型折算(官方口径 0.8~0.9)
  4. ✅ 说清"卡怎么分"的四个维度:TP / DP / PP / EP,以及官方的三条调优建议(Attention 的 TP 尽量小、增加 DP、纯 DP 可省 KV Cache)
  5. ✅ 按官方典型配置表查出机器台数:知道 A2 与 A3 两种服务器各自的 P/D 实例规格、每套集群管理组件管多少节点、以及前提条件
  6. ✅ 说清成本怎么算、哪里算不出来:用实测吞吐 × 按实际计价;知道单价官方未给出,"一张卡多少并发"官方也没有通用值
  7. ✅ 排错时先分清"算错了(约束没查)"和"跑不对(参数太大/太小)"

第三段 全景:容量与成本是"四问一条链"

3.1 一句话总览

容量与成本 = 四问,从下往上问,不能跳:

④ 一年多少钱?        ← 吞吐(实测)× 单价(官方未给,按实际计价)
       ↑
③ 要几台机器?        ← 查官方「大规模专家并行方案典型配置」表(按节点规模查 P/D 规格)
       ↑
② 卡怎么分?          ← 并行策略 TP/DP/PP/EP + 显存策略(MEMORY_FRACTION / 量化 W8A8)
       ↑
① 一张卡能扛多少?    ← 显存约束 → KV Cache Block 数 → 反推 maxBatchSize(官方有公式)

⭐ 顺序为什么不能跳: 不先测出"一张卡的上限",就不知道要几台机器;不知道要几台机器,谈"一年多少钱"就是猜。 而"一张卡能扛多少"这件事,官方没有通用答案 —— 只能①按公式估、②按实测定。

3.2 四个问题各自的"依据来源"(本课的骨架,后面逐段展开)

# 问题 依据来源 关键官方物
① 一张卡能扛多少 官方有公式 + 需实测取数 TopN 解决方案的"服务化性能上限评估"(KV Cache Block 算法)
② 卡怎么分 官方有建议策略 + 需现场调 TopN 的"并行策略调优 / 通信策略优化"
③ 要几台机器 官方有典型配置表,按节点规模查 MindIE《大规模专家并行方案典型配置》
④ 一年多少钱 官方无价格;给定吞吐与取数口径由你填价 无需官方物,价格按实际采购/计费

3.3 三个必须记住的"官方没有"

在往下看之前,先把三件官方没给的事记牢,免得后面误用:

① 官方未给出「一张(某型号)卡在通用场景下能支持多少并发」的通用数字。
   → 并发上限 = 显存能容纳多少 Block / 每个请求占多少 Block(要按你的场景算 + 实测)

② 官方未给出硬件/云资源的单价。
   → 本文只给「成本 = 吞吐(实测,tokens/s 或 req/s)× 单价」的框架,
      价格按实际采购合同或云计费填。

③ 官方未给出「本模型该用几台机器」的固定值。
   → 官方给的是「按 AI 计算节点规模查典型配置表」,台数由你的模型规模与并发需求决定。

3.4 一条"先测纯模型、再算服务化"的官方思路(很重要)

官方《MindIE 推理性能解决方案》给的整体思路是分两层看:

MindIE 推理性能可以从纯模型和服务化两个角度进行优化。 先确认当前纯模型的性能是否有调优空间 → 达到预期则进行服务化性能调优。

这条思路在容量规划里就是一句话:

先用纯模型测试量出"硬件上限",再折算成服务化能交付的容量。

官方给出的折算口径(照抄):

服务化的输出吞吐和非首 Token 时延,可参考相同并发(即 Decode Batchsize)下的纯模型结果作为理论估计的上限; 考虑到服务化推理会有框架侧调度等额外的时间开销,服务化吞吐的乐观估计可折算为纯模型吞吐 0.8~0.9 倍。

⭐ 0.8~0.9 这个系数是本课唯一敢写的"折算比例"——因为它出自官方原文。 除此之外,任何"提升 N 倍 / 单卡 N 并发"的数字本课一个都不写,因为官方没给。

3.5 本课也要用到的"加速"这一侧(RAG SDK)

在 G 层,容量里还有一块容易被漏掉的算力:embedding(向量化)。 知识库的"灌数据"和"在线问答的每一问"都要跑一次 embedding —— 官方在 RAG SDK 里专门给了模型推理加速这一支:

模型推理加速配置说明:TextEmbedding 模型当前支持 bert、roberta、xlm_roberta 类 embedding 模型向量化推理加速, 支持的数据类型为 float16。如需使用该功能,安装 RAG SDK 软件包时需将算子模块一并安装, 并且确保已经启用该功能(默认为关闭状态)。

这段话对容量规划的含义:embedding 的算力是默认没有加速的 —— 你按默认状态估的吞吐,会比开启加速后低; 反过来,你要先把加速开关打开,再测容量,不然基数就错了。具体命令见第五段。


第四段 【如果我来做】——一次真实的容量测算路径

这一节是本课的核心。 前三段讲的是"容量分四问、各自的依据在哪",这一节讲: 如果客户把"这套要几台机器、卡怎么分"交给我,我按什么顺序做、每一步凭什么判断。

4.0 先亮结论:我会按这个顺序做

为什么顺序不能反:

  • 不先对口径就开测 → 测出来的数字不知道对应什么场景,没法用;
  • 不先量纯模型上限 → 直接压服务化,得到的是"服务化交付值",不知道还有多少优化空间(也分不清是模型慢还是框架慢);
  • 不先算清显存能撑多少 → maxBatchSize 只能拍脑袋,要么拉不起来,要么显存浪费;
  • 先谈价格再谈台数 → 台数没定,价格无从谈起。

我会按这个顺序做(顺序 = 我"手伸进去"的顺序):

① 先对口径:确认 TTFT/TPOT 的 SLO、输入/输出长度、目标并发或请求速率——没有这三样,后面全白算 ② 先看卡与显存:npu-smi info 看有几张卡、显存多大、有没有残留进程占着显存(占着就会算错) ③ 先量纯模型上限:按官方口径把"输入长度→Preill 时间、输出长度→Decode 时间"测出来,拿到 prefill_batchsize / decode_batchsize ④ 再取 Total Block Num:查日志关键字 npuBlockNum,拿 KV Cache 总 Block 数 ⑤ 算出 maxBatchSize 上限:按官方公式算"每个请求占几个 Block",再 Floor[Total Block Num / Block 数量] ⑥ 用工具定推荐值:advisor 给 maxBatchSize 范围,optimizer 自动搜参数组合 ⑦ 定"卡怎么分":选 TP/DP/PP/EP,先按官方给的参考配置起步,再按输入输出调 ⑧ 定"几台机器":按节点规模查官方典型配置表,确定 P:D 比例与集群管理组件 ⑨ 算成本:实测吞吐 × 按实际计价,单价官方没有,必须问采购/看云计费 ⑩ 同口径复测 + 出证据:TTFT / 吞吐 / 成功率,调前调后同一个场景比 ⑪ 诚实:官方没给的部分(单价、通用并发值),明说是我按现场条件取的数

下面把中间的每一步展开。

4.1 第 0 步:先把"容量"定义出来(不做任何操作)

目的:在做任何测算之前,先拿到一组能对得上的口径。官方《MindIE 推理性能解决方案》把"明确优化目标"拆成两类场景:

场景 关注点 关注哪个阶段
低时延场景 实时交互(如对话系统),关注首 Token 生成速度 Prefill 阶段优化
高吞吐场景 离线批量处理(如文档生成),关注 Tokens/秒 Decode 阶段优化

我要对齐的四样(对齐不了就不做测算):

要对齐的 为什么 官方给的对齐依据
时延 SLO 是 TTFT 还是 TPOT?限制多少? 官方寻优工具参数里就有 ttft_slo / tpot_slo(单位 s)
输入 / 输出长度 决定每个请求占多少 KV Cache Block 官方算法明确按"输入 Token 数 / 最大输出 Token 数"算
并发 / 请求速率 决定显存与算力压力 官方压测工具里有 Concurrency 与 RequestRate 两个可设定项
数据类型 float16 / float32 决定算力与显存口径 RAG SDK 推理加速支持 float16

⚠️ 官方有一条重要提醒(照抄): 有时性能目标和实际差异较大,可以根据纯模型性能简单评估性能上限,判断时延或吞吐的极限,从而判断目标是否有可能达成。 这句话我要背下来:客户给的 SLO 有可能物理上就达不到。 先估上限、再承诺 —— 这一步不做,后面就是白干一场。

4.2 第 1 步:先看卡与显存(零成本粗判)

先敲 npu-smi info(见第五段命令 ①)。我要看三件事:

  1. 有几张卡、每卡多大显存 —— 这直接决定"最多能放几个请求的 KV Cache";
  2. 利用率是不是高 —— 如果设备已经很忙,说明现有配置下算力已接近上限(利用率口径见第六段);
  3. 有没有残留进程占着显存 —— 这是最容易让容量算错的一条(官方案例 topic_0000001589894865 就是"用 npu-smi info 查看显存时发现 Python 进程残留")。 残留进程没清,你会以为"这张卡只剩这么点显存",于是把并发算小。

所以第 1 步的作用是:确认"这张卡的可用显存到底是多少",而不是直接读出并发数。读取的显存只能当"分母",分子要靠第 2、3 步。

4.3 第 2 步:先量纯模型上限(这是"分母"的来源)

官方《MindIE 推理性能解决方案》"纯模型初步测试"给了一条可照做的步骤,我把它当清单抄下来:

  1. 设 --case_pair [[输入长度,1]],模拟单个 Prefill Batch 的纯模型测试,--batch_size 记为 prefill_batchsize,结果中的 Total Time(s) 记为 prefill_time;
  2. 按实际输入输出长度设 --case_pair 正常测试,--batch_size 记为 decode_batchsize,结果中的 Non-first token time(ms) 记为 decode_token_time;
  3. 调整两个 batchsize,找满足要求的配置;
  4. 如需要(并行策略、环境变量等),对不同配置重复步骤 1,选最优;
  5. 把纯模型的 Decode Batchsize 和 Prefill Batchsize 转化为服务化参数 maxBatchSize 和 maxPrefillBatchSize;
  6. 设服务化与测试参数,按实测结果调整 maxBatchSize / maxPrefillBatchsize / RequestRate。

官方还给了"按目标怎么配"的对照表(这是第 3 步的决策依据):

场景 配置方法(官方原文)
不限时延、要基线吞吐 调大 decode_batchsize 至 OOM(或选增速放缓的 decode_batchsize)
限制 TPOT,不限制 TTFT 调整 decode_batchsize 至 decode_token_time 刚好满足 TPOT 限制
限制 TPOT 和 TTFT(爬坡测试,限 Request Rate) 调 decode_batchsize 至刚好满足 TPOT;调 prefill_batchsize 令 prefill_time 接近 TTFT 限制
限制 TPOT 和 TTFT(固定并发,不限 Request Rate) 调 decode_batchsize 至刚好满足 TPOT;设 prefill_batchsize = dp,调小 decode_batchsize 直至接近平均 TTFT 限制

⭐ 上表第一行"调大至 OOM"很关键:"最省心"的容量基线,就是把批量一直加到显存装不下—— 加不动的那个点,就是这张卡在这个场景下的吞吐上限。这与第 3 步的公式是同一个物理约束的两面。

4.4 第 3 步:把"显存"折算成"最大并发"(官方公式)

这一步是 G8 区别于 F4 的地方:F4 讲"怎么把显存用得更满",G8 讲"显存这么大,最多能同时服务几个请求"。

官方原话(《MindIE 推理性能解决方案 · 服务化性能上限评估》):

显存瓶颈下的最大并发/maxBatchsize 的理论上限:Decode 阶段 maxBatchSize 主要受显存限制,可根据 KV Cache Block 数量和序列长度计算。 - KV Cache 缓存池以 Block 为单位分配,Block 的大小通过 MindIE 服务化参数配置中的 cacheBlockSize 设置,一般使用默认值 128,即每个 Block 可存储 128 个 Token,根据使用场景的上下文长度计算每个请求需要占用的 KV Cache Block 数量:

最大Block数量 = Ceil(输入Token数 / cacheBlockSize) + Ceil(最大输出Token数 / cacheBlockSize)
平均Block数量 = Ceil(平均输入Token数 / cacheBlockSize) + Ceil(平均输出Token数 / cacheBlockSize)
  • MindIE 服务端 NPU 上 KV Cache Block 总可用数量 Total Block Num 可通过实测获取。
  • 为保持最佳性能,maxBatchSize 一般不宜超过 Floor[Total Block Num / 最大Block数量]; 若请求之间的上下文长度差距较大,则上限可适当提高至 Floor[Total Block Num / 平均Block数量]。

把公式翻译成一句话:

能放多少并发 = 显存里的总 Block 数 ÷ 每个请求要占的 Block 数。

官方还给了一个完整算例(照抄,用作"期望输出长什么样"的参照):

估算显存瓶颈下的并发上限,Profiling 显示可用的 KV Cache block 数量是 1747,默认配置下每个 Block 大小是 128 个 Token, 根据 1024 输入 2048 输出的上下文要求,平均上下文为 1536,KV Cache 平均可容纳 1747 / [(1024+2048)/2/128] ≈ 145。

⭐ 这个算例的价值:它把"显存 → 并发"这条链完整走了一遍。 注意官方的口径是用"平均上下文"算平均值(145 是平均值口径), 而上限要用"最大 Block 数量"——两者别混(第六段会明确区分)。

4.5 第 4 步:拿 Total Block Num(实测取数)

官方给的取数方法(照抄):

MindIE 服务端 NPU 上 KV Cache Block 总可用数量 Total Block Num 可通过实测获取。 - 清空 /root/mindie/log 下的所有旧日志文件,通过使能环境变量 MINDIE_LLM_PYTHON_LOG_LEVEL 和 MINDIE_LLM_PYTHON_LOG_TO_FILE,使 MindIE LLM 中 Python 程序运行时产生 INFO 级别日志并写入文件; - 在确定除 maxBatchSize 之外的其他服务化配置后,使用默认值拉起服务,在服务端拉起成功后,使用 grep 命令搜索 MindIE LLM Python 程序日志中的 npuBlockNum 关键字,根据使用的卡数不同会返回多个结果,其中的最小值即为 MindIE 服务端 NPU 上 KV Cache Block 总可用数量,以图为例,总可用数量为 817。

这条我要记住两点:

  1. 为什么先"清空旧日志" —— 不清空,grep 出来的是历史值,会拿旧配置的 Block 数去算新配置的上限;
  2. 为什么取"最小值" —— 多卡时会返回多条,最小值代表最紧的那张卡 —— 容量要按最紧的算,不能按最松的算。

4.6 第 5 步:用工具把"拍脑袋"变成"有推荐值"

手动算完上限,还要落到具体参数。官方给了两个工具:

工具 干什么 官方定位
服务化专家建议工具(advisor) 给 maxBatchSize / maxPrefillBatchSize 的推荐值 基于 benchmark 输出、config.json、NPU 显存情况、部署模型综合分析
服务化自动寻优工具(optimizer) 用 PSO 算法自动搜服务化参数组合 获取符合时延要求的最佳吞吐参数组合,支持 MindIE 与 vLLM

官方对 advisor 的一句话坦白(必须转述):

注意:由于 CPU、内存等硬件差异,网络环境等不同,以及模型参数配置的细节不同等,当前建议值不能保证性能一定有提升,需要实际修改后验证。

⭐ 所以 advisor 的定位是"起点"不是"答案" —— 它替你从 0 猜到一个范围,最终值仍要实测。 官方还给了两条经验:maxPrefillBatchSize 通常都设置为 maxBatchSize 的一半; 且建议先把 maxBatchSize 设为建议范围的平均值再逐步向最大值靠(设太大会导致模型拉起失败)。

4.7 第 6 步:定"卡怎么分"——并行策略

"卡怎么分"就是问:N 张卡,沿哪几个维度切。 官方给的维度与参考配置:

当前 16 卡推理场景,一般最优配置是 TP=8,DP=2,MOE_TP=4,MOE_EP=4; 但用户有不同的 Host 端(arm/x86)、输入输出要求等,这会造成最优的并行策略发生变化,因此需要调整并行策略。

官方另给了一批通信策略调优建议(照抄,这是"卡怎么分"背后的判断依据):

  • Attention 的 TP 尽量减小,增加 DP,避免 KV Cache 复制,避免重复访问和存储。
  • 纯 DP 通信可节省 KV Cache,但模型权重需要占更多空间。
  • 专家通信(EP)通过 ATB-Models 安装目录中配置文件 config.json 里的 ep_level 关键字配置。
  • 通信可选择走 LCCL 或 HCCL,通常 LCCL 性能更优,但部分并行策略下适配可能有问题。

⭐ 学会读上面这段话:"TP 小、DP 大"能省 KV Cache(因为 TP 会把 KV Cache 复制到每张卡上); 但纯 DP 会让每张卡都要放完整权重 —— 于是显存被权重吃掉。 "卡怎么分"的本质就是在这两头之间找平衡:省了 KV Cache 可能装不下权重,权重分开了 KV Cache 又翻倍。

"卡怎么分"还牵涉显存策略,官方给的方向是量化:

优化达到瓶颈后,一个直观的方法是优化显存来使用更优的配置(例如并发数,并行策略等),可考虑采用量化来降低计算量和显存,目前适配最好方案为 W8A8。

还有一条可直接改的显存开关(官方案例里用的):

调整服务化参数,export NPU_MEMORY_FRACTION=0.96,maxSeqLen 降低到 3K,达到最优效果。

⚠️ 0.96 与 3K 是官方案例里的取值,不是通用推荐值 —— 照抄前要按你的场景重测。

4.8 第 7 步:定"要几台机器"——查官方典型配置表

"几台机器"不是算出来的,是查出来的。 官方在《大规模专家并行方案典型配置》里,按AI 计算节点规模给了 P/D 实例规格表。

先看前提条件(选型先过这一关):

大规模专家并行方案采用的 Atlas 800I A2 仅支持 Atlas 800I A2 HCCS 款,且 NPU 片上内存必须为 64GB,NPU 网口光模块必须为 200G。

再看 A2 的典型配置表(照抄):

AI 计算节点规模 PD 实例规格 集群管理组件实例规格 通算节点规格
8 节点 2P+1D,每 P 实例 2 个计算节点,每 D 实例 4 个计算节点,另可配 1 冗余节点 1*(Coordinator+Controller) 单机或双机
16 节点 4P+1D(每 P 2 节点、每 D 8 节点),另可配 1 冗余节点;也可组成 4P+2D 1*(Coordinator+Controller) 单机或双机
32 节点 8P+2D(每 P 2 节点、每 D 8 节点) 1*(Coordinator+Controller) 单机或双机
64 节点 16P+4D(每 P 2 节点、每 D 8 节点) 1*(Coordinator+Controller) 单机或双机
96 节点 24P+6D(每 P 2 节点、每 D 8 节点) 1*(Coordinator+Controller) 单机或双机
N * 96 节点 N*(24P+6D) 1*(Coordinator+Controller) 单机或双机

两条容量相关的硬约束(照抄):

每套集群管理组件实例(即 Coordinator/Controller 实例)管理一套 PD 实例,每套集群管理组件实例最大支持管理 96 节点(24P+6D)。 以 192 节点集群为例,需划分为两套独立的 24P+6D 实例,集群管理组件实例也需要对应创建两套。

通算节点用于部署集群管理组件(Coordinator/Controller),不承担模型主体推理计算。

A3 超节点则是另一套规格(照抄要点): 每 P 实例分配 1 个计算节点,每 D 实例可分配 1/2/4/8 个计算节点; 每套集群管理组件实例管理一个超节点(48 计算节点);如现场部署多个超节点,需划分多套独立的 PD 实例(每套 48 节点)。

通算节点的硬件最低要求(照抄):按每个 Controller 实例 4 核 / Coordinator 实例 16 核计算,一套 Controller+Coordinator 实例共需要 20 核;内存最低 8GB;至少 2 个 25GE 网口。

⭐ "几台机器"的最后一块拼图:算力节点(P/D)+ 通算节点(跑集群管理组件)。 通算节点不参与模型推理 —— 报价时别漏了它,也别把它算进算力。

4.9 第 8 步:算成本——官方只给了"骨架"

成本 = 吞吐(实测)× 单价(按实际计价)

要填的 从哪来 官方给不给
每分钟/秒的吞吐 AISBench 或自有压测工具的实测结果(如 Total Token Throughput) 工具会给,具体数字要自己测
算力节点台数 4.8 的典型配置表 + 你的并发需求 表给,规模由你的场景定
通算节点台数 每套集群管理组件一套 表给
单价(元/卡·时 或 元/台·年) 采购合同或云计费单 ❌ 官方未给出
单位成本 吞吐 ÷ 成本 自定义口径

⚠️ 本课在这里必须停住:官方文档不含任何价格数字。 任何"一年 X 万""每千 token X 分"的说法,如果不是来自你的采购合同或云计费单,就是编的。 本课能给的是公式与取数口径,价格那一格留给你填。

4.10 第 9 步:复测与出证据

官方给的验证方法(照抄):

业务指标:在相同负载下使用 AISBench 或自有压测工具,对比调优前后的 TTFT(首 Token 时延)、吞吐(Output Token Throughput)、端到端时延等,确认有提升且无劣化。 剖析数据:使用 msprof 或 MindIE 提供的 msServiceProfiler 服务化调优工具 采集调优后的性能数据(含算子级与调度链路),解析后通过 MindStudio Insight 等工具做可视化分析。

验收证据(我会留给客户的三样):

  1. 一份压测报告:同场景下的 TTFT / TPOT / 吞吐 / 成功率(AISBench 输出);
  2. 一页容量测算:总 Block 数、每请求 Block 数、maxBatchSize 上限、实际设定值;
  3. 一张成本表:算力节点数 + 通算节点数 + 实际单价 + 单位成本口径。

4.11 第 10 步:诚实——哪些地方我要明说"官方没给"

我做不到的 为什么
给"某型号卡支持多少并发"的通用值 取决于模型/精度/输入输出长度/序列长度/显存策略;官方未给出通用数字
给"一年多少钱"的报价 官方文档不含价格;只有采购合同/云计费单能回答
给"某模型该用几台机器"的固定值 官方给的是按节点规模查的典型配置表,不是按模型名给的固定值
承诺"这套参数在你的场景也行" 官方明说建议值需实际修改后验证;并行策略随 Host 端与输入输出变化

第五段 怎么确认"算对了":可照抄的命令与取数

本节命令全部来自官方文档,逐条标注出处;每条给「含义 / 拆解 / 用法 / 期望 / 不过会怎样」五项。 命令用行内码书写;只有真正的多行配置/输出才用代码块。

命令 ① npu-smi info

命令 npu-smi info

含义:查 NPU 设备信息与显存占用——容量测算的分母来源(先知道有多少显存、有没有被占) 拆解:npu-smi(昇腾设备管理工具)+ info(显示设备信息) 用法:直接敲。官方 RAG SDK 文档明确:可用它获取对应 npu 卡的 <bus-id>(后面绑核要用) 期望:一张表,列出每张卡的型号、温度、显存占用、进程等;没被占用时应只有系统进程 不过会怎样:命令不存在 → 驱动没装(回 A1);有 Python 进程残留占着显存 → 你会把"可用显存"算小, 先清残留(官方案例 topic_0000001589894865 就是这个现象)

命令 ② lspci -vs 0000:83:00.0

命令 lspci -vs 0000:83:00.0

含义:按命令 ① 拿到的 <bus-id>,查这张 NPU 卡对应的 NUMA node 拆解:lspci(列 PCI 设备)+ -v(详细信息)+ -s(指定设备地址)+ 0000:83:00.0(换成你查到的 bus-id) 用法:官方 RAG SDK"绑CPU核提升推理性能"章节第 2 步;这是为后面 numactl 绑核做准备的 期望:输出里能看到该设备的 NUMA node 编号 不过会怎样:参数不对 → 报 No such device;bus-id 抄错(npu-smi info 里有多个卡,容易抄到别的卡上)

命令 ③ lscpu | grep NUMA

命令 lscpu | grep NUMA

含义:查 NUMA node 对应的 CPU 核数范围,为 numactl 准备核号 拆解:lscpu(打印 CPU 架构信息)+ 管道 | + grep NUMA(只留含 NUMA 的行) 用法:官方同章节第 3 步 期望:看到 NUMA node 数、每个 node 的 CPU 列表(如 NUMA node0 CPU(s): 0-47) 不过会怎样:输出为空 → 机器不支持或 lscpu 缺失;不看这一步直接抄官方示例的 48-71 → 核号不属于该 NUMA node,绑核反而更慢

命令 ④ numactl -C 48-71 xxxx程序

命令 numactl -C 48-71 xxxx程序

含义:在程序执行前把程序绑到指定 CPU 核上,减少跨 NUMA 访问 拆解:numactl(NUMA 控制工具)+ -C 48-71(绑到 48–71 号核,须按命令 ③ 的实测核号替换)+ 后面跟你的程序 用法:官方同章节第 4 步;注意官方写的是"在程序执行前添加",即它是命令前缀 期望:程序正常跑,逻辑上减少跨 NUMA 访问(具体收益官方未给数字,要实测) 不过会怎样:核号不属于该 NUMA node → 报错或性能反而下降;numactl 未安装 → command not found ⚠️ 官方把这条归在"如果设备为鲲鹏系列服务器" —— 非鲲鹏平台是否适用,需现场确认

命令 ⑤ pip3 show mx_rag

命令 pip3 show mx_rag

含义:查 RAG SDK 的安装路径,用来判断它是 run 包装的还是 whl 包装的 拆解:pip3 show(显示已装 Python 包信息)+ mx_rag(包名) 用法:官方明确:run 包安装时 mx_rag 装在 $HOME/./local/lib 下;这决定你在代码里用哪一种导包方式 期望:打印包的版本、路径(如 Location: /root/.local/lib/python3.x/site-packages) 不过会怎样:报 Package(s) not found → RAG SDK 没装(回 G3 的安装步骤);用错导包方式 → ImportError

命令 ⑥ export ENABLE_BOOST=True

命令 export ENABLE_BOOST=True

含义:打开 embedding 向量化的推理加速(官方默认关闭) 拆解:ENABLE_BOOST 是官方环境变量;官方原文:设置值为 "True"、"true"、"1" 时表示使能加速,设置其他值表示不使能加速 用法:官方示例是在 Python 里 os.environ["ENABLE_BOOST"] = "True";shell 里就是本命令。必须在测容量前打开,否则你测的是未加速的基数 期望:加速生效;但注意官方提示:clip 类模型开启加速后"首次推理会进行图编译,预计耗时 1-2 分钟" 不过会怎样:设成 "true "(带空格)等非法值 → 静默不生效(官方口径:设其他值表示不使能); 加速不生效时你的容量测算偏低,而且不会报错——这是最难发现的一类错 ⚠️ 官方注明:clip 系列模型在 Atlas 300I Duo 上支持加速的 batch 为 <=4,其他 batch 加速无明显性能提升甚至有劣化

命令 ⑦ MINDIE_LLM_PYTHON_LOG_LEVEL + grep npuBlockNum

命令 grep npuBlockNum <MindIE LLM Python 程序日志>

含义:从日志里取到 KV Cache 总 Block 数(Total Block Num)—— 这是算 maxBatchSize 上限的分母 拆解:官方给的前置动作是使能 MINDIE_LLM_PYTHON_LOG_LEVEL 与 MINDIE_LLM_PYTHON_LOG_TO_FILE(让 Python 程序输出 INFO 级日志到文件); 然后用 grep 搜关键字 npuBlockNum 用法:先清空 /root/mindie/log 下的旧日志 → 用默认值拉起服务 → 再 grep。官方明说:多卡会返回多个结果,取其中最小值 期望:日志中出现多行含 npuBlockNum 的记录,最小值即总可用 Block 数(官方示例值:817) 不过会怎样:没清旧日志 → grep 到历史值,上限算错;没开 INFO 日志 → grep 不出任何东西; 取的是最大值而非最小值 → 按最松的卡算,实际跑起来会掉 ⚠️ 默认值 817、cacheBlockSize 默认 128 都是官方示例/默认口径,你的机器是多少要现场取

命令 ⑧ export MINDIE_LLM_PYTHON_LOG_LEVEL=...(配合 ⑦ 使用)

命令 export MINDIE_LLM_PYTHON_LOG_LEVEL=INFO export MINDIE_LLM_PYTHON_LOG_TO_FILE=1

含义:打开 MindIE LLM 的 Python 侧 INFO 日志并落盘,否则命令 ⑦ 无数据可查 拆解:官方原文只说"通过使能环境变量 MINDIE_LLM_PYTHON_LOG_LEVEL 和 MINDIE_LLM_PYTHON_LOG_TO_FILE,使 Python 程序运行时产生 INFO 级别日志并写入文件", 这两个变量的取值范围官方未在本处给出,须以你所用版本的《MindIE 用户指南》为准 用法:拉起服务前 export;配合命令 ⑦ 一起用 期望:服务拉起后,MindIE 日志目录下出现 Python 程序的 INFO 日志文件 不过会怎样:变量名拼错 → 不报错、也不生效(日志照样不生成); ⚠️ 取值口径由你按版本确认,本课不写死(避免照抄一个过期值)

命令 ⑨ msserviceprofiler advisor -in 4096 -out 256

命令 msserviceprofiler advisor -in 4096 -out 256

含义:让服务化专家建议工具根据显存、模型、输入输出长度给出 maxBatchSize 的建议取值范围 拆解:advisor(专家建议子命令)+ -in/--input_token_num 4096(请求输入长度)+ -out/--output_token_num 256(请求输出长度); 另有 -t/--target(ttft 默认 / firsttokentime / throughput)、-m/--target_metrics(average 默认 / P90 / P99 等)、-tp 用法:先装工具:git clone https://gitcode.com/Ascend/msserviceprofiler.git → cd msserviceprofiler/msservice_advisor → pip install .; 前置要有 MindIE Service 的 config.json,且 npuDeviceIds 对应的 NPU 显存占用贴近拉起服务前的实际情况 期望:输出形如 [config] maxBatchSize / [advice] 取值范围为 [xx, xx],平均值为 xx / [reason] ...; 官方建议先把 maxBatchSize 设为平均值,maxPrefillBatchSize 设为 maxBatchSize 的一半,再向 range 最大值靠 不过会怎样:以 root 运行会被官方劝阻(官方安全警告:请勿以 root 用户身份运行此工具); 显存数据不准 → 建议值偏离;maxBatchSize 设太大会导致模型拉起失败(官方原文),此时要往 range 最小值靠

命令 ⑩ msserviceprofiler advisor -i /your/path/instance/

命令 msserviceprofiler advisor -i /your/path/instance/

含义:同上工具,但改成基于 benchmark 的 instance 结果拟合,同时给出 maxBatchSize 与 maxPrefillBatchSize 拆解:-i / --instance_path(benchmark 输出的 instance 路径);官方要求样本量不少于 1000 条 用法:先用 MindIE benchmark 跑出 instance 结果并落盘到该路径,再执行本命令 期望:输出 [advice] 尝试设置为 X,原值 Y(含两个参数),并生成拟合数据图像(如 func_curv_xxxx.png)用于查看拟合是否合理 不过会怎样:样本量不足 1000 → 拟合不可靠;报找不到 instance 路径 → benchmark 没跑或路径写错; ⚠️ 官方提醒:可尝试把推荐值应用到 config.json 并重新验证性能,如果结果不理想,可只应用其中一个值再验证

命令 ⑪ msserviceprofiler optimizer

命令 msserviceprofiler optimizer

含义:服务化自动寻优 —— 基于 PSO 算法自动搜服务化参数组合,找出符合时延要求的最佳吞吐参数组合 拆解:optimizer(寻优子命令);常用参数:-e/--engine(mindie 默认 / vllm)、-b/--benchmark_policy(ais_bench 默认 / vllm_benchmark)、-d/--deploy_policy(single 默认 / multiple)、--pd(competition 默认 / disaggregation)、-c/--config(自定义 TOML 配置) 用法:先装:cd msserviceprofiler/ms_serviceparam_optimizer → pip install -e .[real](轻量化版);vLLM 场景加 -e vllm 期望:寻优时间由模型大小和数据集大小决定,一般在 4~8 小时完成;结束后在当前目录 result/store 下生成 data_storage_*.csv, 每行一组参数,前四列为 generate_speed / time_to_first_token / time_per_output_token / success_rate,另有 throughput / CONCURRENCY / REQUESTRATE / fitness 不过会怎样:配置文件里 n_particles / iters / ttft_slo / tpot_slo 等寻优参数均为必填 —— 删掉或省略会直接报错; 不设 ASCEND_RT_VISIBLE_DEVICES → 可能用到不是你预期的那张卡

命令 ⑫ msserviceprofiler train -i=/path/to/input -o=/path/to/output

命令 msserviceprofiler train -i=/path/to/input -o=/path/to/output

含义:仿真模式下,先用 profiling 数据训练一个时延预测模型,之后寻优可在低 NPU 占用下快速给出推荐值 拆解:train 子命令 + -i/--input(必选,profiling 的输出路径)+ -o/--output(输出目录)+ -t/--type(mindie 默认 / vllm) 用法:官方要求先按"服务化调优快速入门"实际跑一遍 MindIE 推理服务测试并采集 profiling,再拿来训练 期望:训练完成后,寻优时需开启 MODEL_EVAL_STATE_ALL=True、MODEL_EVAL_STATE_IS_SLEEP_FLAG=True 与 PYTHONPATH 不过会怎样:profiling 数据缺字段则训练不好 —— 官方点名需要包含 batch_type、batch_size、forward_time、need_blocks、first_token_latency(ms) 等; 仿真结果文件里 real_evaluation=false 的行是模型预测值,不是实测值(官方口径),别把预测当实测 ⚠️ 官方注明仿真模式的版本配套:MindIE 侧为 CANN 8.3.RC2 / MindIE 2.2.RC1;VLLM 侧为 CANN 8.2.RC1 / VLLM 0.8.4 —— 与本文其他部分的版本不同,注意区分

命令 ⑬ export NPU_MEMORY_FRACTION=0.96

命令 export NPU_MEMORY_FRACTION=0.96

含义:调整服务化可用的显存占比,把更多显存让给 KV Cache(容量不够时的一个开关) 拆解:NPU_MEMORY_FRACTION 是服务化参数;官方在显存瓶颈案例里用的取值是 0.96,并同时把 maxSeqLen 降低到 3K 用法:案例语境是"Batchsize 达不到期望、KV Block 用尽" 时用;配合序列长度一起调 期望:同配置下能容纳的 KV Cache 变多,实际可达的 batchsize 提高 不过会怎样:0.96 是官方案例取值,不是通用推荐值 —— 照抄到别的模型可能直接拉不起来; 只调这一个而不调 maxSeqLen / maxBatchSize,可能仍达不到目标 ⚠️ 官方未给出该参数的取值范围与各值影响,需按你的版本手册与实测确认


第六段 判据:怎么算"容量估对了"

⚠️ 先看这一行:下面的每条判据都标了来源与口径。 官方未给出跨场景通用的"容量达标线" —— 容量是"你的场景 + 你的 SLO"决定的,没有通用阈值。

6.1 容量公式类判据(来源:MindStudio 26.1.0《MindIE 推理性能解决方案》)

判据 官方公式 / 口径 口径提醒
每个请求占几个 Block(上限) 最大Block数量 = Ceil(输入Token数/cacheBlockSize) + Ceil(最大输出Token数/cacheBlockSize) 用最大输出长度算,是"最坏情况"
每个请求占几个 Block(平均) 平均Block数量 = Ceil(平均输入Token数/cacheBlockSize) + Ceil(平均输出Token数/cacheBlockSize) 官方算例 145 就是这个口径
最优性能下的并发上限 maxBatchSize 一般不宜超过 Floor[Total Block Num / 最大Block数量] 官方原话是"为保持最佳性能"
上下文长度差异大时 上限可适当提高至 Floor[Total Block Num / 平均Block数量] 是"可以适当放宽"不是"可以随便用"
Block 大小 cacheBlockSize一般使用默认值 128(每 Block 128 个 Token) 是默认值,"一般"用
总 Block 数 Total Block Num 须实测(grep npuBlockNum,取最小值) 官方示例 817 / 案例 1747 都是具体环境的实测值

6.2 折算类判据(来源同上)

判据 官方口径
服务化吞吐的乐观估计 折算为纯模型吞吐的 0.8~0.9 倍(考虑框架侧调度等额外开销)
单并发 与纯模型单并发性能接近
大并发下的首 Token 时延上限 用纯模型测到算力瓶颈处的 Prefill Batchsize,以它划分服务化的并发请求数;FCFS 调度下平均首 Token 时延约为该轮的折算
显存瓶颈的物理边界 调大 decode_batchsize 至 OOM —— 加不动处即吞吐上限

⭐ 这两条要一起记:"0.8~0.9"是服务化相对纯模型的折扣,"至 OOM"是纯模型自身的边界。 先找 OOM 边界,再打 0.8~0.9 的折,就是你要规划的服务化吞吐。

6.3 并行策略的参考值(来源:MindStudio 26.1.0,场景级参考)

判据 官方口径 口径提醒
16 卡推理的一般最优配置 TP=8,DP=2,MOE_TP=4,MOE_EP=4 官方原话带"一般",且随 Host 端(arm/x86)与输入输出要求变化,因此需要调整
省 KV Cache 的方向 Attention 的 TP 尽量减小,增加 DP,避免 KV Cache 复制 是方向,不是数值
纯 DP 的代价 可节省 KV Cache,但模型权重需要占更多空间 一头省必然一头费
专家通信 通过 ATB-Models 目录 config.json 的 ep_level 配置 —
通信库选择 可选 LCCL 或 HCCL,通常 LCCL 性能更优,但部分并行策略下适配可能有问题 "通常"不是"一定"
显存优化的首选量化 目前适配最好方案为 W8A8 官方口径:用于在满足精度前提下降低计算量和显存

6.4 可复用的性能判据(来自体系已有 F4,口径必须带)

⚠️ 这一小节是"借用",不是"新增"。它们是性能调优口径的判据,不是容量判据—— 在 G8 里它们的用途是:当你把容量压到上限时,会用这些指标去确认"设备是不是真的忙起来了"。

判据 数值 来源与口径(逐条标)
Device Free 时间占比 < 3% 好,≥ 3% 需关注 来源:MindSpeed LLM 26.1.0《FSDP2 后端模型性能优化指南》;口径:FSDP2 分布式训练场景,官方另声明该文不适用于在线推理、KV Cache 与推理量化
未掩盖通信 ≤ 10% 好,> 20% 需关注 来源同上(同一张表、同一场景)
访存 bound 初判 aiv_mte2_ratio > 0.8(大量出现则需优化) 来源:Rec SDK 26.1.0《性能调优》;口径:算子级字段,ratio = 该单元耗时 ÷ 总耗时
通信等待时长比例 Wait Time Ratio > 0.2(怀疑慢卡) 来源:CANN 9.2.0-beta.2《性能调优工具·扩展功能》;口径:等待时长/(等待时长+通信时长),较新版本建议改用 msprof-analyze
带宽使用率 > 0.8 说明链路无瓶颈 来源同上

⭐ 一句必须记住的话:以上阈值全部是"场景级参考值",跨场景不可直接套用。 官方未给出通用阈值 —— 你要做的是给自己的场景建一条基线,然后"改前 vs 改后"用同一口径比。

6.5 容量测算的验收清单(自查)

项 判据
口径齐了 TTFT/TPOT SLO、输入输出长度、目标并发/请求速率、数据类型 —— 四样都在
显存干净 npu-smi info 无残留进程占显存
总 Block 数取了最小值 grep npuBlockNum 的结果取最小,且基于清空旧日志后的新日志
上限算过 有 Floor[Total Block Num / 最大Block数量] 的计算记录,且实际 maxBatchSize 不超过它
纯模型基线有 有 prefill_time / decode_token_time 的纯模型测试记录
服务化口径对 计划吞吐按纯模型 × 0.8~0.9 折算过
台数有表可依 机器台数来自典型配置表 + 显存/算力复核,不靠拍脑袋
成本有价可填 单价来自采购合同/云计费单(不是文档里的数字)

第七段 出问题怎么查

排查原则:先分"算错了(约束没查)"和"跑不对(参数不对)"两类,再往下查。

算错了(规划链)  ── 显存看错 / Block 数取错 / 上限公式用错 / 台数漏了通算节点
跑不对(运行链)  ── 服务拉不起来 / 并发上不去 / 吞吐不达标 / 加速没生效

7.1 先看现象 → 先查什么(排查顺序)

现象 大概是什么 先查什么
容量算出来跟实测差很多 显存分母错了 npu-smi info 看有没有残留进程占显存(官方案例 topic_0000001589894865)
并发上限忽大忽小 总 Block 数取的是历史值 是不是没清 /root/mindie/log 旧日志就 grep npuBlockNum;是不是取了最大值而非最小值
按公式算的 maxBatchSize 一设就拉不起来 显存被权重/其他占用吃掉 官方明说设太大会导致模型拉起失败,先降到 range 最小值再往上试;查 NPU_MEMORY_FRACTION、是否开了量化
请求变多后吞吐反而下降 到了显存/KV Block 边界 官方服务化调优工具篇专门点过这种"反直觉现象"(并发量增加时吞吐反而降低);查 KV Block 是否用尽
显存够但并发上不去 序列长度太长 查 maxSeqLen / maxInputTokenLen / maxIterTimes(官方的"序列长度三件套");官方案例里就是把 maxSeqLen 降到 3K 才达到最优
多卡时个别卡先打满 负载/显存不均 看是不是按"平均值"而不是"最小值"算的上限;查并行策略(TP/DP)分布
embedding 那一段特别慢 推理加速没开 查 ENABLE_BOOST 是不是设成了 "True"/"true"/"1"(设其他值静默不生效);clip 模型注意首次图编译 1-2 分钟与 batch ≤4 的限制
一模一样的配置,两台机器性能差很多 环境不一致 查 CPU/内存/网络/驱动与 CANN 版本;官方寻优工具文档把"CPU、内存等硬件差异、网络环境不同"列为会导致建议值失效的原因
寻优跑完结果都是预测值 用了仿真模式没训练好 看结果 csv 的 real_evaluation=false 就是 gp 模型预测值(官方口径),不是实测
测吞吐时数字比预期低一截 把纯模型值当服务化值 记得按官方口径折算 0.8~0.9 倍;或用 AISBench 直接测服务化

7.2 按"规划 vs 运行"排的排查顺序

① 先确认"分母"对不对(显存与 Block 数)
   ├─ 有残留进程 → 清掉,重取显存
   └─ Block 数取自旧日志/取了最大值 → 清日志、重拉服务、取最小值
② 再确认公式用对没有
   ├─ 用了"平均Block数量"当上限 → 只在上下文差异大时才允许,默认用"最大Block数量"
   └─ 没按 0.8~0.9 折算服务化吞吐 → 补上
③ 再看"卡怎么分"
   ├─ 想起步 → 按官方 16 卡参考(TP=8/DP=2/MOE_TP=4/MOE_EP=4)试,再按 Host 与输入输出调
   └─ 想省 KV Cache → 减小 Attention 的 TP、增加 DP(但注意权重会占更多显存)
④ 最后看"台数"
   ├─ 只算了算力节点 → 别忘了通算节点(跑 Coordinator/Controller,不参与推理)
   └─ 节点规模超限 → 每套集群管理组件最多管 96 节点(A2),超了要划多套
⑤ 若始终对不上 → 用 optimizer 自动寻优兜底,并注意结果里的 real_evaluation 标记

⚠️ 一条判断法(本课自用,非官方表述): "先怀疑分母,再怀疑公式,最后才怀疑硬件。" 容量算错,十次有八次是"显存/Block 数"这个分母取错了,而不是卡不行。

7.3 一条最容易漏的检查:集群管理组件的容量上限

官方对每套集群管理组件的管理规模有明确上限: A2:每套最大支持管理 96 节点(24P+6D);A3:每套管理一个超节点(48 计算节点)。

这条为什么容易漏:你在算"要几台机器"时,很容易只数算力节点, 忘了"节点数到一定规模,要额外划出第二套集群管理组件实例" —— 而每多一套集群管理组件,就要多一台/一对通算节点。 官方口径是"192 节点需划分为两套独立的 24P+6D 实例,集群管理组件实例也需要对应创建两套"。


第八段 常见报错清单

检索口径:到官方案例库 https://www.hiascend.com/document/caselibrary 按现象里的稳定特征词检索, 不要按"容量规划"这种泛词检索。下表的案例编号均为官方真实编号,另附查看量供参考。

报错 / 现象 官方案例编号 查看量 口径与做法
部署 service 服务,加载 LLaMA-65B 模型时出现 out of memory topic_0000002250112009 727 官方服务化加载大模型时的显存不足;与"容量规划"直接相关 —— 先算清总 Block 数与权重占用再定 maxBatchSize
npu-smi info 查看显存时发现 Python 进程残留 topic_0000001589894865 2117 残留进程占着力算显存;不清掉会把可用显存放小、并发算少
在 310P 上部署 qwen2.5-32b 推理报错内存不足(明确指出 NPU0 卡内存不足) topic_0000002549203555 595 官方案例:单卡内存不足;多卡时"哪张卡先满"是容量估算的关键线索
设备 device 侧内存不足导致片上内存压测失败 toolboxcase_0075 2208 官方工具案例;与"片上内存容量"直接相关
加载大模型时耗时过长(1300B 模型加载约 3 小时) topic_0000002214923358 1337 官方案例;加载时间也是容量规划的一部分(它影响上线时长与停机窗口)
模型调测时报 RuntimeError: malloc ... NPU error, error code is 500000 topic_0000001589894849 1425 官方案例;500000 属 AscendCL 的"无法识别的错误"(见 E1 的分段规则),软硬件内部异常,别死磕
部署 DeepSeek 服务化,性能不佳(实测与预期差异较大) topic_0000002193154190 7969 官方服务化性能案例(浏览量最高的一条);注意这是"服务化"口径,与单机性能分析不同
在 estimator 模式下执行 train_and_evaluate 提示显存不足 topic_0000002176651049 1005 官方案例;训练侧显存不足,与推理侧容量口径不同,注意区分

⚠️ 三条本课要明说的"没有答案":

  1. 没有"某型号卡支持多少并发"的官方通用数字 —— 只能按你的场景(模型/精度/输入输出/序列长度/显存策略)实测 + 按官方公式估算。
  2. 没有官方价格 —— 硬件/云资源价格不在官方文档里;成本必须用实际采购或计费数据填。
  3. 没有"某模型该几台机器"的固定答案 —— 官方给的是按节点规模查的典型配置表。

第九段 小结与下一课

这一课要带走的三句话:

  1. 容量是"四问一条链",顺序不能反 —— 一张卡能扛多少 → 卡怎么分 → 要几台机器 → 一年多少钱; 不先量出单卡上限,后面全是猜。
  2. 官方给了"算"的公式和"查"的表,但没给"价" —— 显存→并发有公式(Floor[Total Block Num / 最大Block数量]),台数有典型配置表(P/D 实例规格), 只有价格要按实际采购/计费填;"一张卡多少并发"也没有通用值。
  3. 所有数字都要带出处与口径 —— cacheBlockSize 默认 128、服务化吞吐折算 0.8~0.9 倍、16 卡参考 TP=8/DP=2/MOE_TP=4/MOE_EP=4 是官方给的口径; Free < 3%、未掩盖通信 ≤10%、aiv_mte2_ratio > 0.8 来自其他场景, 用之前先看它是哪篇文档、哪个场景;通用阈值官方未给出,要自己建基线。

一次完整容量测算的动作顺序(串联本课):

对口径(TTFT/TPOT SLO + 输入输出长度 + 并发 + 数据类型)
   → npu-smi info 看卡与显存(先清残留进程)
   → 纯模型测试量上限(prefill_batchsize / decode_batchsize)
   → grep npuBlockNum 取总 Block 数(清空旧日志,取最小值)
   → 算 maxBatchSize 上限(Floor[Total Block Num / 最大Block数量])
   → advisor 给范围 / optimizer 自动搜参数
   → 定卡怎么分(TP/DP/EP,起步用官方参考配置)
   → 定几台机器(查典型配置表 + 别漏通算节点)
   → 算成本(实测吞吐 × 按实际计价)
   → 同口径复测 → 出证据
   → 官方没给的,明说"这是按现场条件取的数"

下一课预告(G9 企业安全): 容量算完、机器定了,最后一环是"交出去之后怎么管住": 权限与审计(官方只给到 user_id / role)、多租户隔离(AVI 虚拟化实例), 以及一条官方安全警告 —— Cache 数据库未做加密存储,涉及银行卡号、身份证号、护照号、口令等个人数据请勿存放。 G8 讲"用多少",G9 讲"怎么用得安全"。

自测(能答上来才算学完)

  1. 容量规划的四问是什么?每一问的依据来源在哪?
  2. "能放多少并发"的官方公式是什么?为什么上限用"最大 Block 数量"而不是"平均"?
  3. Total Block Num 怎么取?为什么必须清空旧日志、为什么取最小值?
  4. 服务化吞吐相对纯模型要打几折?这个系数出自哪篇文档?
  5. "卡怎么分"里的四条官方建议是什么?为什么"TP 小、DP 大"能省 KV Cache,代价是什么?
  6. A2 服务器每套集群管理组件最多管多少节点?通算节点为什么不能漏?
  7. Free < 3% / 未掩盖通信 ≤10% / aiv_mte2_ratio > 0.8 各来自哪里、为什么不能当通用红线?
  8. 成本公式里的单价从哪来?为什么本课不写价格?

附录 A · 本课引用的官方出处

内容 来源文档(版本)
AISBench 支持的功能特性表(推理模式/推理引擎/数据集/发送模式/精度测试/性能测试/token 推理/多模态/稳态/压力/多任务/可视化/断点续测/自定义数据集)、性能测试结果指标表(TTFT / ITL / TPOT / E2EL / PrefillTokenThroughput / OutputTokenThroughput / Concurrency / Request Throughput / Total Token Throughput 等) 《性能/精度测试工具》(MindIE 3.1.0 · MindIE Motor CPP 开发指南 · 配套工具)
整体思路(纯模型 vs 服务化两个角度)、纯模型初步测试步骤与 --case_pair / --batch_size 用法、按目标配置的四种场景表、服务化性能上限评估(单并发/大并发首 Token 时延/大并发吞吐)、KV Cache Block 算法与 cacheBlockSize 默认 128、Floor[Total Block Num/最大Block数量]、grep npuBlockNum 取总 Block 数、显存瓶颈算例(1747 / 1024-2048 / ≈145)、核心参数表(低时延/高吞吐)、并行策略调优(16 卡 TP=8/DP=2/MOE_TP=4/MOE_EP=4)、通信策略优化四条建议、ep_level、LCCL/HCCL、显存分析(W8A8)、NPU_MEMORY_FRACTION=0.96 + maxSeqLen 3K、设置总请求数=并发数×10 《MindIE 推理性能解决方案 · TopN 性能问题的解决方案》(MindStudio 26.1.0 · 实践案例)
大规模专家并行方案典型配置:A2 表 1(8/16/32/64/96/N*96 节点的 P/D 规格)、每套集群管理组件最大 96 节点(24P+6D)、192 节点划两套、通算节点不承担主体推理计算;A3 表 3(2/4/8/16/32/48 节点规格、每套管一个超节点 48 节点);前提条件(HCCS 款 / 64GB 片上内存 / 200G 光模块);通算节点硬件要求(Controller 4 核 + Coordinator 16 核 = 20 核,内存最低 8GB,至少 2 个 25GE 网口);验证方法(AISBench 对比 TTFT / 吞吐 / 端到端) 《大规模专家并行方案典型配置》(MindIE 3.1.0 · MindIE Motor CPP 开发指南 · 附录)
服务化调优工具定位(黑盒→白盒、框架调度透视 / 性能瓶颈定界 / 动态采集)、SERVICE_PROF_CONFIG_PATH、[msservice_profiler] 日志、配置字段(enable / prof_dir / acl_task_time 及其"推荐集中采集 3~5s")、解析命令 python3 -m ms_service_profiler.parse --input-path=、依赖版本(python ≥ 3.10 / pandas ≥ 2.2 等) 《服务化调优工具》(MindIE 3.1.0 · MindIE Motor CPP 开发指南 · 配套工具)
服务化专家建议工具(advisor)简介、支持产品表、数据准备、安装(pip install scipy loguru pandas psutil)、命令(-in / -out / -i / -s / -t / -m / -tp)、输出建议格式、maxPrefillBatchSize 设为 maxBatchSize 一半、设太大会拉起失败、不能保证性能一定有提升需实测验证、安全警告勿用 root 《服务化专家建议工具》(MindStudio 26.1.0 · msServiceProfiler)
服务化自动寻优工具:PSO 算法、仿真/轻量化两模式、三大模块、支持产品表、安装(pip install -e .[real]/[speed]/[train])、msserviceprofiler optimizer / train 参数表、config.toml 寻优参数(n_particles / iters / ttft_penalty / tpot_penalty / success_rate_penalty / ttft_slo / tpot_slo / service / sample_size)、输出结果文件字段表(含 real_evaluation / fitness)、4~8 小时完成、ASCEND_RT_VISIBLE_DEVICES、target_field 的 dtype 与 ternary_factories(dp = 总卡数 ÷ (tp × pp))、PD 分离寻优约束、仿真模式版本配套(CANN 8.3.RC2 / MindIE 2.2.RC1;VLLM 侧 CANN 8.2.RC1 / VLLM 0.8.4) 《服务化自动寻优工具》(CANN 9.2.0-beta.2 调试与分析工具 · 性能调优工具 · 服务化调优工具;同文另见 MindStudio 26.1.0)
模型推理加速配置说明(TextEmbedding 支持 bert/roberta/xlm_roberta,数据类型 float16,默认关闭,需装算子模块)、clip 支持型号与首次图编译 1-2 分钟、ENABLE_BOOST 取值口径、ATB_LOG_* 日志变量、Atlas 300I Duo 上 clip batch ≤4、绑 CPU 核提升推理性能四步(npu-smi info 取 bus-id → lspci -vs → lscpu \| grep NUMA → numactl -C)、pip3 show mx_rag 判断安装方式 RAG SDK《模型推理加速》(MindSDK 26.1.0 · 知识增强 · 接口参考;在线版亦见 72rc1)
案例 topic_0000002250112009、topic_0000001589894865、topic_0000002549203555、toolboxcase_0075、topic_0000002214923358、topic_0000001589894849、topic_0000002193154190、topic_0000002176651049 官网 案例库(https://www.hiascend.com/document/caselibrary/detail/<案例编号>)
可复用的性能判据:Free < 3% / 未掩盖通信 ≤10%(来自 MindSpeed LLM 26.1.0《FSDP2 后端模型性能优化指南》,训练场景);aiv_mte2_ratio > 0.8(Rec SDK 26.1.0《性能调优》);Wait Time Ratio > 0.2 / 带宽使用率 > 0.8(CANN 9.2.0-beta.2《性能调优工具 · 扩展功能》) 见各条括注;本课仅转述口径,均为场景级参考值

本课未写的东西(数据纪律:官方未给出,故不编)

  • 任何价格数字(元/卡·时、元/台·年、元/千 token)—— 官方文档不含价格,只能按实际采购或云计费填。
  • "某型号卡在通用场景下能支持多少并发"的通用值 —— 官方未给出;只能按场景实测 + 按官方公式估算。
  • "某模型该用几台机器"的固定值 —— 官方给的是按节点规模查的典型配置表,不是按模型名给的固定值。
  • cacheBlockSize 的取值 128 之外的推荐值 —— 官方只说"一般使用默认值 128",未给其他场景的推荐值。
  • MINDIE_LLM_PYTHON_LOG_LEVEL / MINDIE_LLM_PYTHON_LOG_TO_FILE 的取值范围 —— 官方在本处只说了"使能…产生 INFO 级别日志",未给取值;须按用户所用版本的《MindIE 用户指南》确认。
  • NPU_MEMORY_FRACTION 的取值范围与各取值影响 —— 官方只给了案例里的 0.96,未给取值范围。
  • NPU_MEMORY_FRACTION=0.96、maxSeqLen=3K、TP=8/DP=2/MOE_TP=4/MOE_EP=4 的通用性 —— 均为官方案例/参考值,换模型或换 Host 端需重调。
  • 服务化调优/寻优工具在 Atlas 训练系列上的支持 —— 官方支持表标注为 "×"(不支持);是否可绕过须现场确认。
  • 训练侧容量规划(显存、并行度、集群规模)—— 属官方四大场景的"训练开发",不在本课范围,计划归 H 层。

附录 B · 命令与参数逐条详解

B.1 容量测算的"取数三件套"

要取的数 命令 出处
显存与卡 npu-smi info RAG SDK《模型推理加速》绑核章节第 1 步
Total Block Num 使能 MINDIE_LLM_PYTHON_LOG_LEVEL + MINDIE_LLM_PYTHON_LOG_TO_FILE 后 grep npuBlockNum MindStudio《MindIE 推理性能解决方案》
纯模型 batchsize 与耗时 设 --case_pair / --batch_size 跑纯模型测试,读 Total Time(s) 与 Non-first token time(ms) 同上"纯模型初步测试"

B.2 KV Cache Block 算法(照抄,仅作参照,数字要换成你的实测值)

最大Block数量 = Ceil(输入Token数/cacheBlockSize) + Ceil(最大输出Token数/cacheBlockSize)
平均Block数量 = Ceil(平均输入Token数/cacheBlockSize) + Ceil(平均输出Token数/cacheBlockSize)

maxBatchSize 上限  ∝  Floor[Total Block Num / 最大Block数量]        (最佳性能口径)
上下文差异大时可提高到  Floor[Total Block Num / 平均Block数量]      (官方"可适当提高")

官方算例:可用 block = 1747,cacheBlockSize = 128,1024 输入 / 2048 输出
         平均上下文 = 1536 → 平均可容纳 ≈ 1747 / [(1024+2048)/2/128] ≈ 145

B.3 AISBench 性能测试指标(照抄表 2 性能测试结果指标,取容量规划最常用的几条)

指标 官方含义
TTFT Time To First Token,首 token 时延(beam search 场景下无法测量)
TPOT Time Per Output Token,decode token 间时延,公式 (E2EL - TTFT)/(OutputTokens - 1)(beam search 下无法测量)
E2EL End To End Latency,请求端到端时延
OutputTokenThroughput 请求的吞吐,公式 OutputTokens / E2EL
Input Token Throughput 本次测试的 input token 计算速度,公式 Total Input Tokens / Benchmark Duration
Output Token Throughput 本次测试的 output token 计算速度,公式 Total generated tokens / Benchmark Duration
Total Token Throughput 输入输出总 token 速度,公式 (Total Input Tokens + Total generated tokens) / Benchmark Duration
Concurrency 平均并发连接数,公式 sum(E2EL)/Benchmark Duration
Request Throughput 请求吞吐量,公式 Successful Requests / Total Requests
Failed / Successful Requests 失败 / 成功总请求数

⭐ 算成本时要挑对指标: 按"多少人在线"收费 → 看 Concurrency;按"消耗多少 token"收费 → 看 Total Token Throughput。

B.4 AISBench 的能力覆盖(照抄表 1 工具特性,选型时对照)

特性 AISBench 与容量规划的关系
推理模式 支持 Client 模式下的流式推理和文本推理 流式与否影响 TTFT 口径
推理引擎 支持 MindIE、vLLM、SGLang、TGI 和 Triton 换引擎要重测容量
数据集 支持 39 个开源数据集和 synthetic 随机数据集 随机数据集用来构造压力
发送模式 支持均匀分布和泊松分布 泊松更接近真实到达
并发/速率 支持压测(并发与请求速率可设) 容量测算的直接输入
稳态测试 / 压力测试 均支持 找饱和点用
过程可视化 / 断点续测 均支持 长压测用

⚠️ 官方在 MindIE 文档里只给了这张"能力表",具体命令行请见官方文档指向的 AISBench 工具仓库 —— 本课不转述仓库里的命令(那是站外文档,且会随版本变),需要时按官方链接取当版本文档。

B.5 两个调优工具的定位差异(别用混)

工具 输入 输出 适用
advisor(专家建议) instance 结果 或 输入输出长度 + config.json + 显存 maxBatchSize / maxPrefillBatchSize 建议值 已知场景、想快速拿到参数起点
optimizer(自动寻优) config.toml(寻优参数 + 测评工具参数 + 服务化参数范围) data_storage_*.csv(各组参数的 TTFT / TPOT / 吞吐 / 成功率) 不知道最优在哪、愿意花 4~8 小时自动搜

对照记法:advisor 给"一个值",optimizer 给"一堆组合 + 谁最好"。

B.6 寻优工具的 target_field:把"卡怎么分"交给工具推导(官方示例,照抄)

官方给的核心用法:让 dp 由总卡数自动推导,tp / pp 只枚举合法候选。

[[mindie.target_field]]
name = "tp"
config_position = "BackendConfig.ModelDeployConfig.ModelConfig.0.tp"
min = 0
max = 1
dtype = "enum"
dtype_param = [1, 2, 4, 8]

[[mindie.target_field]]
name = "dp"
config_position = "BackendConfig.ModelDeployConfig.ModelConfig.0.dp"
min = 0
max = 0
dtype = "ternary_factories"
dtype_param = {target_names = ["tp", "pp"], product = 16, dtype = "int"}

官方口径:ternary_factories 是 product ÷ (field_a × field_b);示例 tp=4, pp=2 → dp = 16 ÷ (4 × 2) = 2。 派生字段由依赖关系自动推导,不参与粒子群搜索 —— 所以要把它的 min / max 都设为 0。 ⚠️ 官方约束:product 必须能被依赖字段乘积整除,否则会触发修复(修复失败则按 min/max 降级并输出 WARNING)。

B.7 服务化调优工具的采集配置(照抄,字段与推荐值均为官方口径)

{
    "enable": 1,
    "prof_dir": "${PATH}/prof_dir/",
    "acl_task_time": 0
}
字段 官方说明
enable 总开关:0 关闭 / 1 开启。即便其他开关开启,该开关不开启仍不会采集;只开它则只采服务化性能数据
prof_dir 性能原始数据存放路径,默认 ${HOME}/.ms_server_profiler。⚠️ enable 为 1 时直接改 prof_dir 不生效
acl_task_time 采集算子下发/执行耗时:0 关闭 / 1 开启。⚠️ 官方:开启会占用设备性能导致数据不准,建议仅在模型执行耗时异常时开启;推荐集中采集 3~5s

⭐ 最后一条与容量测算相关:采集本身会拖慢服务。所以测容量时不要同时开算子级采集 —— 你会把"采集开销"当成"服务变慢",从而把吞吐报小、把机器要多了。

B.8 落盘与安全提示(官方原文,跑这些工具前必读)

  • advisor:官方安全警告 —— 请勿以 root 用户身份运行此工具,建议使用普通用户账户。
  • optimizer 轻量化版依赖最少;[speed](仿真插件)与 [train](大数据量训练)为额外选项。
  • 寻优参数均为必填:n_particles(建议 15~30)/ iters(建议 5~10)/ ttft_penalty / tpot_penalty / success_rate_penalty / ttft_slo / tpot_slo / service —— 删除或省略会直接报错。
  • 数据量控制:官方建议 sample_size 取原数据集请求的 1/3;num_prompts 控制运行数据集的条数。
  • 结果里 real_evaluation=false 的行是模型预测值,不是实测 —— 报容量时不要引用预测行。
选修 · 昇腾 AI 部署实操 本机读完 0/51
选修 C · 昇腾 AI 部署实操
从零把昇腾 AI 部署学一遍:先看懂分几层,再逐层装起来,最后出问题能自己定位到哪一层。不需要先有卡就能开始。
下一站 → G7 效果评估 (文章)
看完整学习路径(6 站 + 3 门选修) · 进度只存在你这台设备的浏览器里,不用登录
辽ICP备2026019944号-1