面试 · 岗位分支面试题
按 6 个岗位方向分别出题,各 5-8 题。考察特定岗位的深度能力。
6.1 AI Infra Platform 工程师#
Q1:如何设计模型生命周期管理?#
从模型训练产出到上线服务的全生命周期:
Checkpoint 产出 → Model Registry 注册(MLflow + 元信息)
→ Eval Pipeline 自动评测(Argo Workflows)
→ 准入门禁(评测达标 + 安全评测通过 + 备案材料就绪)
→ 灰度发布(网关层按比例分流:10% → 50% → 100%)
→ 全量上线(Registry 标记 production,老版本归档)
→ 持续监控(质量漂移检测 + 成本归因 + 效果劣化自动回滚)关键设计:平台化(模型提交者自助走流程)、可审计(每一步有记录)、可回滚(保留最近N个版本)。
Q2:如何做多租户、权限、审计和成本统计?#
- 多租户:Team → Virtual Key(每个 Key 绑定模型白名单 + 预算 + RPM/TPM)
- 权限:Key 粒度的模型访问控制;管理员 Key(master_key)独立存储(Vault)
- 审计:LiteLLM SpendLogs 全量记录(谁 + 什么模型 + 多少 token + 多少花费)
- 成本统计:Grafana 面板按 Team/Model/Feature 维度拆分,配预算告警
Q3:如何设计模型评测流水线?#
评测流水线的自动化 DAG:
触发器:新模型上传 → Argo Workflows DAG
├─ Step 1:部署临时推理实例(加载权重)
├─ Step 2:通用 Benchmark(MMLU、HumanEval、C-Eval)
├─ Step 3:业务专属评测(真实 prompt 集 + 自动评分 + 人工抽检)
├─ Step 4:安全评测(Prompt Injection、有害内容拒答率)
├─ Step 5:性能基准(TTFT/TPOT/QPS/显存 vs baseline)
├─ Step 6:合规评测(违法内容生成测试、敏感词检测)
└─ Step 7:汇总 → 写入 Registry → 自动准入判定Q4:如何在平台层内建备案合规与内容安全闸口?#
- 备案四要素自动化:训练数据审查报告、安全评测结果、拒答测试通过率自动生成
- 内容安全闸口:在 AI Gateway 层集成 Guardrails(LiteLLM + LlamaGuard),请求前后各一次检测
- 审计不可绕过:所有 LLM 调用的输入/输出全量记录(Langfuse)
- 上线公示:API 元信息中自动注入备案号
Q5:如何设计模型灰度发布系统?#
灰度系统设计
├─ 灰度策略
│ ├─ 按比例(10% → 50% → 100%)
│ ├─ 按租户(先内部团队 → 再小客户 → 最后大客户)
│ └─ 按地域(先小地区 → 再大地区)
├─ 监控指标
│ ├─ 性能:TTFT/TPOT/P95 延迟不恶化
│ ├─ 质量:在线采样评估 + 用户反馈
│ └─ 错误率:5xx 不飙升
├─ 回滚机制
│ ├─ 网关层秒级切回老版本
│ ├─ Registry 标记新版本 rolled-back
│ └─ 保留最近 3 个 production 版本
└─ 自动化
├─ 效果劣化自动回滚(质量漂移 > 阈值)
└─ 灰度推进需人工审批Q6:如何做平台成本优化?#
- 模型路由优化:按成本将请求优先路由到便宜模型(cost-based routing)
- 量化:FP8 量化减少显存占用,同样 GPU 服务更多并发
- 分级 KV:RAG/多轮场景复用重复前缀,省下大量 prefill(收益视命中率与前缀占比,别套固定百分比,见 3-Q12)
- Scale-to-zero:低频模型空闲时缩到零
- 闲置回收:GPU 利用率 < 20% 持续 30min 自动回收
- Spot Instance:开发测试环境用 Spot 降本 60%
6.2 Inference Infra 工程师#
Q1:如何优化 vLLM/SGLang 推理吞吐?#
基线建立(压测取 baseline)
↓
显存参数调优
├─ gpu-memory-utilization:0.9 → 0.92(多出并发槽位)
├─ max-model-len:从模型上限调到业务实际(8K-32K)
└─ 量化:FP16 → FP8(KV Cache 减半)
↓
调度参数调优
├─ max-num-seqs:256(高吞吐)/ 64(低延迟)
├─ max-num-batched-tokens:8192-16384
└─ enable-chunked-prefill:长上下文场景
↓
前缀优化
├─ enable-prefix-caching(vLLM)
└─ RadixAttention + schedule-policy lpm(SGLang)
↓
评估:TTFT/TPOT/QPS/P99 是否达标Q2:如何设计多模型推理服务?如何做限流、熔断和降级?#
架构:
LiteLLM Gateway(统一入口)
├─ 模型 alias:fast-small / fast-medium / smart / local-only
├─ Virtual Key 体系:每个业务线独立 Key + 配额
├─ 限流:RPM + TPM + 月度预算
├─ 熔断:连续失败 N 次进入冷却,自动切换 fallback
├─ 降级:fast-small → fast-medium → smart(容量降级)
│ context 超限 → 自动切大上下文模型
└─ 监控:Prometheus + Grafana + 成本报表Q3:如何处理长上下文导致的延迟?#
- Chunked Prefill:将长 prefill 切片,与 decode 交替,防止单个请求憋死 batch
- 分级 KV Cache:LMCache 三级缓存,命中率越高、可复用前缀越长,省下的 prefill 越多(口径见 3-Q12)
- PD 分离:长上下文 prefill 走专门的高算力节点
- 限流:对请求的 input 长度设上限,超出部分提示用户精简
- 按上下文长度分流:长上下文单独集群/引擎
Q4:如何用编排层(Dynamo)做多节点 PD 分离部署?#
Dynamo 编排:
├─ 声明 prefill 节点组(高算力 GPU)+ decode 节点组(高显存带宽)
├─ Dynamo 自动分配请求:
│ ├─ prefill 请求 → prefill 节点
│ ├─ KV 自动传输到 decode 节点(400Gbps InfiniBand)
│ └─ decode 请求 → decode 节点(KV-aware routing)
├─ 动态调整:高峰期加 decode 节点
└─ 监控:prefill/decode 节点的负载 + KV 传输延迟Q5:如何部署 MoE 模型(DeepSeek-V4)?#
MoE 部署要点
├─ 引擎选择:SGLang(MLA/MoE 优化最深度,DeepSeek 官方推荐)
├─ 并行策略:TP + EP 组合
│ ├─ TP 切 attention 层(单机 NVLink 域)
│ └─ EP 切 expert 层(expert 分布到多卡)
├─ EPLB:必须开启,解决专家路由不均衡
├─ MLA:压缩 KV Cache,为 expert 权重腾显存
├─ 显存计算:全部 expert 权重都要加载(1.6T × 1 byte FP8 = 1.6TB)
└─ 监控:各 GPU 显存/SM 分布(EPLB 效果验证)Q6:如何设计推理服务压测方案?#
- 压测数据:真实业务 prompt 采样,多种长度混合(短/中/长 + 短输出/长输出)
- 压测工具:vLLM benchmark_serving.py / Locust / k6
- 压测步骤:阶梯加压(10 → 50 → 100 → 200 QPS)+ 持续压测(30 分钟)+ 极限压测
- 监控指标:TTFT/TPOT/P95/P99 + GPU Util/显存/KV Cache/Queue + 错误率
- 输出:最大 QPS、瓶颈点、扩容阈值、SLA 达标情况
Q7:如何部署多模态(VLM)推理服务?和纯文本有什么不同?#
VLM 部署要点
├─ 结构:vision encoder(ViT)+ projector + LLM,图片先编码成 image token 再拼进 prompt
├─ 引擎:vLLM / SGLang 均支持主流 VLM(Qwen-VL / InternVL / Llama-Vision)
├─ 容量估算变了:
│ ├─ 一张高清图展开成几百~几千 image token → 按图像 token 重估 max-model-len 和显存
│ ├─ image token 一样进 KV Cache,长图/多图请求 KV 占用大
│ └─ 对高分辨率图设 token 上限,防单请求爆 KV
├─ 瓶颈:vision encoder 是独立 compute-bound 段,TTFT 里多一块视觉编码;
│ encoder 通常不与 LLM 一起 continuous batching → 易成独立瓶颈,可单独扩容/批处理
├─ 缓存:文本前缀可命中;图片只有"同一张图"按 hash 命中,多轮追问同图可复用视觉特征/KV
└─ 监控:分别看 encoder 段与 LLM 段耗时,别只看总 TTFTQ8:如何做 Multi-LoRA(多适配器)服务?#
Multi-LoRA 服务
├─ 场景:一个 base 模型 + 成百上千个 LoRA adapter(各业务/租户微调版),共享 base 权重与 KV 池
├─ 开启:--enable-lora --max-loras N --max-lora-rank R,请求里指定 adapter 名
├─ 显存管理:adapter 小(几十~几百 MB)可驻留很多;冷/热 adapter 按 LRU 动态换入换出
│ └─ S-LoRA 的 Unified Paging:统一显存池同时管 adapter 权重 + 不同长度 KV,减碎片
├─ 性能注意:
│ ├─ 同一 batch 混不同 adapter 靠异构批处理 kernel,混得太杂会掉 kernel 效率
│ ├─ max-loras(同时活跃 adapter 数)设太大增加调度/显存压力
│ └─ 高频 adapter 尽量常驻,避免频繁换入换出
└─ vs 独立部署:N 个满血实例 → 显存/成本爆炸;Multi-LoRA 边际成本接近单模型,适合多租户6.3 AI Compute / 智算平台工程师#
Q1:为什么 AI 任务需要队列和配额?Gang Scheduling 解决什么问题?#
队列和配额:AI 训练/推理任务资源需求经常超过集群容量。没有队列 → 先到先得,后到的抢不到。没有配额 → 一个团队可能吃掉全部 GPU。
Gang Scheduling:分布式训练需要 N 个 Pod 同时就位。默认调度器逐个调度,可能部分 Pod 占着资源等不到剩余 Pod。Gang Scheduling 的 All-or-Nothing 语义:要么全部调度成功,要么一个都不调——防止资源死锁。
Q2:GPU 资源碎片怎么治理?#
碎片成因:小 Pod(Notebook、CI)被 binpack 到节点的角落,剩下的 GPU 资源无法组成整节点给大训练作业。
治理手段:
- 分离调度:Notebook 走独立队列(小 GPU 规格),训练作业走大规格队列
- Binpack 策略:优先将小任务塞满已占用的节点
- Anti-affinity:小 Pod 分散到不同节点,保留整机可用性
- Preemption:需要整机的大作业可以抢占碎片任务
Q3:Volcano / Kueue / HAMi 分别解决什么问题?#
| 工具 | 解决问题 | 核心机制 |
|---|---|---|
| Volcano | 批作业调度(Gang、队列、配额、抢占) | PodGroup + Queue + Proportion |
| Kueue | 队列管理与公平共享 | ResourceFlavor + ClusterQueue + cohort 借用 |
| HAMi | GPU 共享虚拟化 | vGPU 级别显存+算力隔离 |
Q4:如何设计多团队共享 GPU 资源池?#
资源池设计:
├─ Volcano 层级队列
│ ├─ root → ai-org(总配额 256 GPU)
│ ├── team-nlp(guarantee=64, weight=30)
│ ├── team-recommend(guarantee=64, weight=30)
│ ├── team-research(guarantee=32, weight=20)
│ └─ emergency(guarantee=16, weight=100, 不可抢占)
├─ PriorityClass:emergency > high > normal > low
├─ 借用机制:空闲队列资源可被其他队列借用(reclaimable)
└─ 碎片治理:binpack + anti-affinityQ5:MIG vs HAMi vs Time-Slicing 怎么选?如何实现 GPU 共享?#
选型:
- 强隔离 + A100/H100 → MIG(物理切分,规格固定)
- 灵活 + 国产化 → HAMi(vGPU 级隔离)
- 同租户多进程 → MPS(SM 并发共享)
- 开发测试 → Time-Slicing(无显存隔离)
实现:
- MIG:GPU Operator 的 MIG Manager 配置切分规格
- HAMi:安装 HAMi Device Plugin,Pod 配置
nvidia.com/gpumem+nvidia.com/gpucores - Time-Slicing:GPU Operator 配置时间片策略
- MPS:GPU Operator 配置 MPS 模式
Q6:如何做 GPU 集群的弹性伸缩?#
弹性伸缩方案
├─ 节点级弹性:Karpenter + Spot Instance
│ ├─ 按需拉起 GPU 节点
│ ├─ 空闲时自动释放
│ └─ Spot Instance 降本 60%
│
├─ Pod 级弹性:KEDA + GPU 指标
│ ├─ 按 vllm:num_requests_waiting 扩缩
│ ├─ minReplicas / maxReplicas
│ └─ scale-to-zero(低频模型)
│
├─ 调度级弹性:Volcano/Kueue 抢占
│ ├─ 紧急推理抢占实验训练
│ └─ 配合 checkpoint 机制
│
└─ 容量规划
├─ 历史数据预测增长
├─ 峰值前预扩容
└─ 闲置回收6.4 Training Infra 工程师#
Q1:DDP / FSDP / DeepSpeed 分别解决什么?#
| 方案 | 核心思想 | 显存节省 | 适用场景 |
|---|---|---|---|
| DDP | 每 GPU 一份完整模型,梯度 AllReduce | 无(只并行、不省显存) | 单卡装得下的模型 |
| FSDP | 全分片 params + grads + optimizer states 到多卡,用时 all-gather | 大(≈ ZeRO-3) | 大模型主力,70B/405B(Llama-3 405B 即用 FSDP 类分片) |
| DeepSpeed ZeRO-1/2/3 | 逐级分片 optimizer states → +grads → +params | ZeRO-3 = 最大(与 FSDP 基本等价) | 大模型(ZeRO-3 与 FSDP 二选一) |
关键辨析(常被问,别答错):
- FSDP 本质就是 PyTorch 原生版的 ZeRO-3——都是把参数、梯度、优化器状态全分片,前向/反向时按需 all-gather 出当前层完整权重、用完即释放。两者能力基本等价,不是"FSDP 中等档、ZeRO-3 强档"。FSDP 是训练 70B/405B 的主力(Llama-3 405B 用的就是 FSDP 类全分片)。
- "单卡跑 70B"靠的不是纯 ZeRO-3,而是 ZeRO-Infinity 的 CPU/NVMe offload(把分片再卸载到内存/硬盘)。纯 ZeRO-3 / FSDP 是多卡分片,单卡显存仍装不下 70B 全部训练状态。
- 选型:FSDP(PyTorch 原生、生态顺)vs DeepSpeed(ZeRO-Infinity offload、MoE、流水线等功能更全),按团队栈选,能力重叠很大。
Q2:Checkpoint 机制怎么设计?#
- 保存频率:按 step(如 1000)或时间间隔(如 1h),取更频繁者
- 分布式一致性:所有 rank 同时保存(NCCL barrier 同步)
- 存储:对象存储(S3/COS)+ 本地 NVMe 双写
- 恢复:断点续训从最近 checkpoint 加载 → 重放 data loader → 继续
- 容错:配合 Kueue/Volcano 的抢占 → checkpoint 保存再被杀
Q3:多机多卡训练失败怎么排查?#
1. 看 NCCL 通信是否正常
├─ NCCL_DEBUG=INFO 确认拓扑
├─ 检查是否退化到 TCP
└─ 检查错包数(> 0 立刻告警)
2. 看 GPU 状态
├─ nvidia-smi:显存、温度、功耗
└─ DCGM:ECC 错误(不可修复 = 硬件故障)
3. 看训练日志
├─ loss NaN → 学习率/梯度爆炸
├─ OOM → batch size 太大 / gradient accumulation 不够
└─ timeout → 某个 rank 慢了(straggler)
4. 看 CPU/内存
└─ DataLoader 慢 → num_workers 不够 / I/O 瓶颈Q4:ZeRO 核心思想?训练中断后如何恢复?#
ZeRO 核心思想:将原本每个 GPU 都要存一份完整副本的数据(优化器状态、梯度、模型参数)分片存储到多 GPU。Stage 1/2/3 逐步扩大分片范围,显存需求逐步降低。
训练恢复:
- 从最近 checkpoint 加载模型 + optimizer state + lr_scheduler
- 如果 data loader 有状态(shuffle 种子),设定相同种子继续
- 如果用了 DeepSpeed,
engine.load_checkpoint()自动恢复所有状态 - 每次被抢占前必须保存(preStop hook)
Q5:MoE 训练怎么优化?3D/4D 并行怎么组合?#
MoE 训练优化
├─ 并行策略:4D 并行 = DP × TP × PP × EP
│ ├─ TP 切 attention 层(单机 NVLink 域)
│ ├─ PP 跨机(层间切分)
│ ├─ EP 切 expert 层(expert 分布到多卡)
│ └─ DP 扩吞吐(多副本)
│
├─ Expert 路由优化
│ ├─ 负载均衡 loss(防止路由倾斜)
│ ├─ Shared Expert(DeepSeek,保证基础计算)
│ └─ Top-K 路由(K=2 或 K=8)
│
├─ 通信优化
│ ├─ EP 的 all-to-all 通信(expert 路由分发)
│ ├─ 通信融合(多个小 all-to-all 合并)
│ └─ NVLink/RDMA 利用
│
└─ Checkpoint
├─ 全部 expert 权重都要保存
└─ 恢复时 expert 到 GPU 的映射要一致Q6:训练容错怎么设计?#
训练容错机制
├─ 节点故障自动恢复
│ ├─ 健康检查(DCGM ECC 错误 / NCCL 超时)
│ ├─ 故障节点隔离(cordon + drain)
│ └─ 从最近 checkpoint 恢复到新节点
│
├─ 抢占容忍
│ ├─ Volcano/Kueue 抢占前 preStop hook 保存 checkpoint
│ ├─ 低优先级任务可被抢占
│ └─ 恢复后继续训练
│
├─ Straggler 处理
│ ├─ 检测慢节点(NCCL timeout)
│ ├─ 排除慢节点继续训练(减少 worker 数)
│ └─ 或等待慢节点恢复
│
└─ 数据一致性
├─ 所有 rank 同步 checkpoint
├─ data loader 种子可重现
└─ RNG 状态保存6.5 推理优化 / ML Systems 工程师#
Q1:FlashAttention 为什么快?#
核心优化:标准 Attention 中 QK^T 的中间结果(seq_len × seq_len)太大,必须反复读写 HBM(global memory)。FlashAttention 通过 tiling——将 Q、K、V 切成小块,每块小到能放进 SRAM——在 SRAM 内完成 softmax + attention 计算,大幅减少 HBM 读写次数。
H100 HBM 带宽 3TB/s vs SRAM 带宽 19TB/s → 减少 HBM 访问是加速的关键。标准 Attention 有 3 次大矩阵 HBM 读写,FlashAttention 只 1 次。
Q2:PagedAttention 核心思想?#
类比操作系统虚拟内存分页:把 KV Cache 切成固定大小的 Block(默认 16 token),通过 Block Table 映射逻辑块到物理块,不要求连续显存。
解决的问题:
- KV Cache 内部碎片(不需要预分配固定大小)
- 多个请求可共享相同前缀的 Block(Prefix Sharing)
- 显存利用率 ~60% → 96%+
Q3:如何用 Nsight 分析推理性能?#
- Nsight Systems:看 timeline——kernel launch 间隔(overhead)、CPU-GPU 同步点、数据拷贝
- Nsight Compute:看单个 kernel——occupancy、memory throughput、compute utilization、bank conflict
- 关注指标:HBM 带宽利用率(decode 阶段瓶颈)、SM occupancy(batch 是否够大)
分析方法:
1. Nsight Systems 抓全局 timeline
├─ 找 kernel launch 间隔大的地方(launch overhead)
├─ 找 CPU-GPU 同步点(不必要的 sync)
└─ 找 H2D/D2H 拷贝(数据传输瓶颈)
2. Nsight Compute 分析热点 kernel
├─ Occupancy 低 → 调整 block/grid size
├─ Memory throughput 低 → 优化访存模式
├─ Bank conflict → 调整 shared memory 布局
└─ Stall reasons → 对症优化
3. CUDA Graph 消除 launch overhead
└─ decode 阶段小 batch,launch overhead 占 20-40%Q4:MoE 推理为什么难优化?MLA 怎么实现 KV 压缩?#
MoE 推理难点:
- Expert 路由不均衡(热门 expert 过载、冷门空闲)→ EPLB
- 全部 expert 权重需加载(显存需求大)
- Expert 间的通信(EP 跨 GPU 路由分发)
MLA KV 压缩:在 K 和 V 计算路径插入低秩瓶颈(latent projection),实际缓存的是压缩后的 latent vector(原始维度的 1/8~1/16),decode 时再恢复为完整 K/V。本质是用计算换显存。
Q5:Speculative Decoding 为什么加速?#
LLM decode 串行生成 token,GPU 利用率低。Speculative Decoding 用小模型(或额外预测头)先"猜"多个 token,大模型一次验证。
加速原理:把串行的 decode 变成批处理验证。吞吐提升 1.5x-3x(取决于 draft model 的猜测准确率和任务的可预测性)。
Q6:CUDA Graph 为什么对 decode 有效?通信融合怎么做?#
CUDA Graph 对 decode 有效:decode 阶段小 batch,每次 forward 涉及几十个小 kernel,kernel launch overhead 占 20-40%。CUDA Graph 捕获 kernel 序列为图,一次 launch 执行全部,消除 launch overhead。
通信融合:
不融合:
AllReduce 1 → 计算 → AllReduce 2 → 计算 → AllReduce 3
融合后:
AllReduce(1+2+3) → 计算
(多个小 AllReduce 合并为一次大 AllReduce)
收益:
├─ 减少 NCCL launch 次数
├─ 提高网络利用率(大包比小包效率高)
└─ 减少 sync 开销Q7:FlashMLA 怎么实现?与 FlashAttention 有什么区别?#
FlashMLA:MLA 的高效 CUDA 实现,DeepSeek 开源。
与 FlashAttention 的区别:
- FlashAttention 优化标准 MHA/GQA 的 attention 计算
- FlashMLA 优化 MLA 的低秩投影 + attention 计算
- MLA 比 MHA 多一步 latent vector 恢复 K/V,FlashMLA 把这步也融合进 kernel
优化要点:
- tiling 适配 MLA 的 latent vector 维度
- 融合 latent projection + attention 到一个 kernel
- 减少 HBM 读写(latent vector 比 K/V 小,读写量本就更少)
6.6 国产化 / 异构算力工程师#
Q1:CUDA/NCCL 与 CANN/HCCL 如何类比?#
| 英伟达 | 华为昇腾 | 功能 |
|---|---|---|
| CUDA | CANN | 计算框架 |
| NCCL | HCCL | 集合通信 |
| cuBLAS/cuDNN | 昇腾算子库 | 数学库 |
| Nsight | Profiling 工具 | 性能分析 |
| TensorRT | MindIE | 推理引擎 |
API 层面有对照关系(cudaMalloc→aclrtMalloc,ncclAllReduce→hcclAllReduce),但底层算子实现和性能特征不同。
Q2:模型迁移到昇腾可能遇到什么问题?#
常见问题:
- 算子缺失:某些 CUDA 算子无 CANN 对等实现 → 用已有算子拼接或提交需求
- 精度差异:同一模型不同芯片上输出有差异(尤其量化场景)→ 精度对齐测试
- 性能差异:某些算子在国产芯片上慢 → profiling 定位 + kernel 调优
- 通信差异:HCCL 工作原理与 NCCL 不同 → 环境变量 + 拓扑优化
- 框架适配:从 PyTorch CUDA 到 PyTorch NPU(torch_npu)或 MindSpore
Q3:vllm-ascend 与 MindIE 各自适合什么场景?#
| vllm-ascend | MindIE | |
|---|---|---|
| 定位 | vLLM 的昇腾适配版 | 华为官方推理引擎 |
| API 兼容 | vLLM API,含 OpenAI 兼容 | vLLM/SGLang 接口兼容 |
| 上手 | vLLM 用户几乎零迁移 | 需要学习 MindIE 配置 |
| 性能 | 社区维护 | 华为官方深度优化 |
| 模型支持 | 通用开源模型 | 0day 首发主流模型 |
| 适用场景 | 已有 vLLM 经验的团队 | 华为生态深度绑定 |
Q4:如何评估同一模型在不同芯片上的性能差异?#
评估维度:
├─ 吞吐:同一 batch 下的 tokens/s
├─ 延迟:TTFT/TPOT P50/P95/P99
├─ 显存:同等并发下的显存占用
├─ 精度:同一批 prompt 的输出差异(ROUGE/BLEU/人工评估)
├─ 成本:每 1M token 的等效成本(算力租金 + 功耗)
└─ 稳定性:长时运行的波动/内存泄漏
方法:
1. 用同一版本模型权重
2. 用同一批真实业务 prompt
3. 同等并发压测 1 小时+
4. 对比关键指标,生成对比报告Q5:多芯混部怎么实现?#
多芯混部架构
├─ 统一 API 层(OpenAI Compatible)
│ └─ 业务侧无感知底层芯片类型
│
├─ 多芯路由层
│ ├─ 按模型可用性路由(某些模型只在特定芯片上部署)
│ ├─ 按成本路由(便宜芯片优先)
│ └─ 按延迟路由(低延迟芯片优先)
│
├─ 芯片池
│ ├─ 英伟达 GPU 池(vLLM/SGLang)
│ ├─ 昇腾 NPU 池(vllm-ascend/MindIE)
│ └─ 海光 DCU 池(ROCm + vLLM)
│
└─ 监控
├─ 各芯片池的 QPS/延迟/成本
└─ 故障切换(某芯片池故障 → 切到其他池)Q6:昇腾 950PR 的 FP4 和 Blackwell B200 的 FP4 有什么区别?#
相同点:都是 4bit 浮点,目的是减半再减半显存。
不同点:
- 底层实现:昇腾 FP4 配合 CANN 算子库;B200 配合 CUDA
- 性能:需要实测对比(不同算子的 FP4 性能不同)
- 精度:浮点格式细节(指数/尾数位数)可能不同
- 生态:B200 的 FP4 工具链更成熟(TRT-LLM 支持);昇腾 FP4 在 MindIE 中支持
选型:已有昇腾集群 → 昇腾 FP4;已有 B200 → Blackwell FP4;混合集群 → 多芯路由。
Q7:算子不支持怎么处理?#
算子缺失处理流程
├─ 1. 确认算子是否真的缺失
│ ├─ 查 CANN 算子库文档
│ └─ 用 msprof profiling 确认
│
├─ 2. 替代方案
│ ├─ 用已有算子拼接实现(如用 matmul + element-wise 拼出某个 fused 算子)
│ ├─ 换等价的数学表达(如 SiLU → Sigmoid × mul)
│ └─ 降级到等价但不优的实现
│
├─ 3. 自定义算子
│ ├─ 用 CANN 的 Ascend C 开发自定义算子
│ └─ 注册到 torch_npu
│
├─ 4. 提交需求
│ ├─ 向华为提交算子需求
│ └─ 等待下一个 CANN 版本
│
└─ 5. 临时绕过
└─ 该层回退到 CPU 计算(性能差但能跑)