seed 的作用与边界
seed 是采样阶段的随机数种子:固定它可以让同一组输入在「尽力而为」的意义上复现同一段输出,主要用于评测对比、缺陷复现与回归测试。它只对带随机性的采样有意义,temperature 取 0 时通常已退化为一贯的最优选择,seed 影响随之减弱。即便固定了 seed,并行度、批组合与算子实现差异仍可能让结果出现细微不同。
基本信息
| 字段名 | OpenAI 兼容字段 seed / vLLM SamplingParams.seed |
|---|---|
| 作用 | 固定采样随机序列,提升可复现性 |
| 能力边界 | 尽力而为,不保证逐字节一致 |
| 适用 | 评测、缺陷复现、A/B 对照、回归测试 |
| 常见的失败原因 | 模型 revision 变了、框架版本变了、量化档位或批组合不同 |
典型使用场景
- 版本对比评测:新旧两版模型或两套参数用同一 seed 取样,差异更容易归因到模型本身
- 线上缺陷复现:把请求原样回放,避免随机性把问题掩盖掉
- 回归测试:固定 seed 的输出作为基线,改动后做差异比对
- 调参实验:排除随机噪声,才能判断某次改动是否真的有效
- 演示与教学:需要稳定输出时避免每次都换一段话
固定与记录
固定与记录
# 请求级固定:OpenAI 兼容接口
# client.chat.completions.create(model="<模型名>", messages=[...], seed=42, temperature=0.8)
# vLLM 离线推理
from vllm import SamplingParams
sp = SamplingParams(temperature=0.8, top_p=0.9, seed=42)
# 复现四件套一起写进结果元数据:模型 revision、框架版本、采样参数、批处理配置
# 缺任何一项,事后都无法判断差异来自哪里复现需要固定什么
| 要素 | 为什么必须固定 | 典型疏漏 |
|---|---|---|
| 模型 revision | 上游仓库会更新,权重一变输出就变 | 只写模型名不写 commit |
| 推理框架版本 | 采样实现与算子可能随版本调整 | 升级后无记录 |
| 采样参数 | temperature/top_p/惩罚项决定分布 | 只记 seed |
| 并行与批处理配置 | 影响归约顺序与浮点结果 | 未记录张量并行度 |
相同 seed 在不同推理引擎之间不通用:随机数生成方式与采样实现不同,跨引擎对比要各自固定 seed 后分别取样。
单次生成只是一条样本:即使 seed 固定,用一条输出宣布效果提升缺乏说服力,评测应统计多条样本或直接固定 temperature=0 做确定性对照。