跳到内容

可复现性

为了追求性能,vLLM 默认不保证结果的可复现性。您需要执行以下操作才能实现可复现的结果

  • 对于 V1:通过设置 VLLM_ENABLE_V1_MULTIPROCESSING=0 关闭多进程以使调度具有确定性。
  • 对于 V0:设置全局种子(见下文)。

示例: examples/offline_inference/reproducibility.py

警告

应用上述设置会更改用户代码中的随机状态

注意

即使采用上述设置,vLLM 也仅在使用相同硬件和相同 vLLM 版本时提供可复现性。此外,在线服务 API (vllm serve) 不支持可复现性,因为在在线设置中几乎不可能使调度具有确定性。

设置全局种子

vLLM 中的 seed 参数用于控制各种随机数生成器的随机状态。

如果提供了特定的种子值,则 randomnp.randomtorch.manual_seed 的随机状态将据此设置。

然而,在某些情况下,设置种子也会更改用户代码中的随机状态

默认行为

在 V0 中,seed 参数默认为 None。当 seed 参数为 None 时,randomnp.randomtorch.manual_seed 的随机状态不会被设置。这意味着如果 temperature > 0,每次运行 vLLM 将产生不同的结果,这是预期行为。

在 V1 中,seed 参数默认为 0,它会为每个工作进程设置随机状态,因此即使 temperature > 0,每次 vLLM 运行的结果也会保持一致。

注意

对于 V1,无法取消指定种子,因为不同的工作进程需要采样相同的输出以支持推测解码等工作流程。

更多信息,请参见: 拉取请求 #17929

随机状态的局部性

vLLM 在以下条件下会更新用户代码(即构建 LLM 类的代码)中的随机状态

  • 对于 V0:指定了种子。
  • 对于 V1:工作进程与用户代码在同一进程中运行,即:VLLM_ENABLE_V1_MULTIPROCESSING=0

默认情况下,这些条件不处于活动状态,因此您可以使用 vLLM,而无需担心意外地将依赖随机状态的后续操作变为确定性。