Administrator
Published on 2026-10-22 / 0 Visits
0
0

DeepInfer 确定性推理:先填验收表,再谈可复现

上线评审会上,如果有人问 DeepInfer 能不能保证同输入同输出,回答能或不能都过于粗糙。

工程团队真正需要追问四件事:比较的是 Token 还是概率;允许改变批次、调度还是硬件;保证覆盖哪套软硬件;证据来自功能说明、测试源码,还是目标环境中的实测结果。

DeepInfer 的发布很适合用来建立这套问法。它明确提供批次不变推理和确定性采样,也把开关条件、硬件范围与测试源码公开出来。但这些材料定义的是一个有边界的能力单元,距离跨版本、跨硬件、跨完整服务的可复现承诺仍有若干层。

阅读时间: 8 分钟 | 目标: 产出一张能进入发布流程的确定性验收表

先给确定性主张做一张身份证

任何确定性主张都应带四个字段:

字段 DeepInfer 当前公开信息 部署方还要补什么
比较对象 模型结果、生成 Token、Token 概率与 Top Token 概率 是否要求 Token 完全一致,概率是精确相等还是允许容差
受控变量 批次组合、输入 Token、采样参数和 seq_seed 调度压力、重启、并行拓扑、缓存命中、升级是否纳入
环境边界 DeepSeek-V4.1-Flash;确定性相关能力标注为 NVIDIA 路径 GPU 型号、驱动、CUDA、编译器、内核和服务版本
证据等级 README 声明与仓库测试源码 目标硬件实跑日志、成本数据、升级回归和失败处置

没有这四个字段,同输入同输出只是口号。字段填完整后,团队才能讨论它是不是需要的保证,以及要为它付出多少性能和维护成本。

官方资料已经确认了什么

DeepInfer 官方仓库把当前开源版本定义为面向 DeepSeek 模型的离线推理框架,支持模型只列出 DeepSeek-V4.1-Flash。硬件范围包括 NVIDIA SM100 GPU 和华为 Ascend 950 NPU。

与确定性直接相关的两项能力是:

  • 批次不变推理:设置 DEEPINFER_BATCH_INVARIANT=1,文档标注为仅支持 NVIDIA;
  • 确定性采样:在批次不变模式基础上,设置 DEEPINFER_ENABLE_MTP_VARLEN=0,并为 SamplingParams 提供固定 seq_seed,同样标注为仅支持 NVIDIA。

这里最重要的产品信息不是有一个确定性开关,而是可变长度 MTP 必须关闭。DeepInfer 同时提供 DSpark 和置信度调度验证,这些能力面向解码效率;确定性采样则主动收窄了一部分动态行为。确定性和吞吐优化因此属于两个需要共同测量的目标。

Ascend 950 出现在支持硬件列表中,也不代表确定性采样自动覆盖 Ascend。README 对确定性能力的限定更窄,部署合同必须服从这个更窄的边界。

测试源码提供了比功能列表更强的证据

官方的 test_batch_invariant.py值得逐行看。

测试会构造 64 条长度不同的随机 Token 序列,先把它们作为一个批次运行,再逐条单独运行。比较对象包括:

  • 生成 Token ID;
  • Token Log Probability;
  • Top Token ID;
  • Top Token Log Probability。

断言要求四类结果组成的元组完全相等。当前参数表只有一个模型案例,Expert Parallel Size 为 8。

这个测试的关键细节是 golden_token_ids。逐条运行时,测试把批量输出的 Token 序列作为固定解码路径传入。这样可以沿着同一条生成轨迹比较概率数据,避免第一个采样差异让后续位置全部失去可比性。

因此,它为批次变化下的计算路径不变量提供了很强的源码证据。它没有单独完成另一项实验:在不指定 Golden Path 的情况下,仅依靠固定 seq_seed 多次自然生成,并验证输出可以完整重放。仓库的 Sampler 测试侧重采样分布,也没有替代这项实验。

这不是对功能声明的否定,而是证据分层。源码告诉我们项目准备验证什么;目标环境的运行工件才告诉我们当前部署实际通过了什么。

截至 2026 年 10 月 22 日,公开 GitHub Actions 只显示 CodeQL 与依赖图工作流,没有提供上述模型测试在声明硬件上的公开 pytest 工件。团队可以检查测试设计,但不能把可读源码等同于已经看到公开硬件运行结果。

把部署验收拆成三个回合

与其一次写一张巨大的兼容矩阵,不如按风险扩展测试。

第一回合:证明当前机器可以复现

冻结模型 Checkpoint、Tokenizer、DeepInfer Commit、采样参数和一组真实请求。在同一主机上做四次比较:

  1. 同一请求连续运行;
  2. 进程重启后运行;
  3. 单请求与混合批次对照;
  4. 改变批次中其他请求的长度、内容和顺序。

先比较 Token ID,再比较返回的 Log Probability。Token 一致而概率变化,说明用户看到的文本暂时稳定,但调试、训练或排序管线仍可能观察到漂移。

第二回合:加入真实调度与服务状态

固定目标请求,改变到达时间、队列深度、并发度和批次邻居。记录每次请求实际落到的副本、开关、缓存状态与并行配置。

DeepInfer 默认启用异步调度。异步调度负责减少 CPU 调度与设备执行之间的空闲,不等于自动提供结果一致性。压力测试的目的,是验证在真实调度行为下,第一回合定义的不变量仍成立。

第三回合:把升级当成兼容性事件

模型、框架、内核、编译器、驱动、GPU 代际或并行拓扑任何一项变化,都应触发冻结请求集重放。结果分为三类:

  • 必须完全一致,失败则阻断发布;
  • 允许数值容差,但需要生成漂移报告;
  • 明确属于未支持变化,只记录结果,不继承旧保证。

跨 Tensor Parallel Size 的确定性研究说明,并行拆分本身就可能改变计算与通信顺序。批次不变不能自动推出跨 TP Size 一致。TP、EP 或其他拓扑变化都应拥有自己的验收单元。

离线引擎通过,不等于线上服务通过

DeepInfer README 明确列出完整推理服务仍需要的组件:KV Cache 系统、Vision Encoder/Prefill/Decode 解耦,以及 Prefill 和 Decode 数据并行副本的负载均衡。

这些组件都可能把复现问题重新带回来:

  • 负载均衡把同一请求送到版本或配置不同的副本;
  • 缓存复用了另一套配置生成的状态;
  • 一次请求跨越多个软硬件边界;
  • 编解码、模型生成和后续评分使用了不同的版本或随机状态。

生产日志至少要能还原下面这组环境指纹:

模型 Checkpoint + Tokenizer + DeepInfer Commit
+ 算子/内核版本 + 编译器/驱动/运行时
+ 加速器型号 + 并行拓扑 + 服务副本
+ 确定性开关 + 采样参数 + Seed
+ 缓存血缘 + 请求批次与调度标识

这组信息的价值在于定位。当输出漂移时,团队可以比较具体变量,而不是把问题笼统归因于模型不稳定。

生成稳定,评分仍可能变化

DeepInfer 的评测文档把生成和评分分成两个阶段。AIME 与 GPQA 可以使用确定性规则判分,默认 LLM Judge 仍受 Judge 自身采样影响;HLE 只支持 LLM Judge。

所以一条完整评测链至少有两个随机边界:模型生成与结果评分。即使生成输出逐字一致,Judge 的结论仍可能变化。评测报告应分别记录生成配置、评分器版本、评分模式和重复运行差异。

性能成本必须与一致性一起发布

DeepInfer 公布了 Prefill 与 Decode 的性能曲线,测量环境分别使用 4 张和 64 张 SM100 GPU。仓库当前没有给出确定性模式开启与关闭的成对成本表。

部署方因此需要在自己的负载上同时报告:

  • Prefill 和 Decode 吞吐;
  • 首 Token 延迟、Token 间延迟与尾延迟;
  • 显存、并发容量和失败率;
  • Token 一致率、概率一致规则和未通过的验收单元。

负载形状会改变性能瓶颈。长前缀 Coding Agent、短对话与批量离线任务不应共享一个成本数字。站内的推理调优负载形状分析可以作为性能测试的配套框架。

一张可进入发布流程的工单

上线前要求以下工件同时存在:

  1. 冻结请求集:覆盖真实长度分布、混合批次、结构化输出和适用的多模态输入。
  2. 验收声明:每个测试单元写明保持不变的条件、主动改变的变量和相等规则。
  3. 实跑证据:目标硬件上的原始结果、比较日志和失败样本。
  4. 成本报告:确定性模式开关前后的吞吐、延迟、显存和容量。
  5. 环境指纹:足以复现每次运行的版本、硬件、拓扑、缓存和调度信息。
  6. 漂移策略:失败时阻断发布,或记录经过批准的兼容性变化与回滚方案。

DeepInfer 已经提供了一个质量不错的起点:明确的能力条件、可读的测试和清楚的开源边界。部署团队的工作,是把这些上游材料转换成自己的运行证据。只有持续通过的验收单元,才属于当前生产环境真正拥有的确定性能力。

常见问题

Temperature 设为 0,为什么还要测试?

Temperature 约束采样策略。GPU 归约、内核选择、批次组合、并行拓扑和版本变化仍可能改变数值路径,接近决策边界的 Token 可能随之翻转。

DeepInfer 如何开启确定性采样?

当前 README 要求 DEEPINFER_BATCH_INVARIANT=1、DEEPINFER_ENABLE_MTP_VARLEN=0,并在 SamplingParams 中设置固定 seq_seed。文档把这条能力路径标注为仅支持 NVIDIA。

支持 Ascend 950 是否意味着 Ascend 也有同等确定性保证?

不能这样推断。Ascend 950 位于框架支持硬件列表中,批次不变与确定性采样的说明则明确限定 NVIDIA。Ascend 路径需要单独的官方声明或部署实测。

第一项应该跑什么测试?

选择一条冻结请求,分别单独运行、放进混合批次、重启进程后运行,并在目标调度压力下运行。比较 Token ID 与 Log Probability,同时记录完整环境指纹。这组结果就是验收表的第一个有效单元。

参考资料


Comment