在调用大模型时,固定随机数种子是确保输出结果可复现、稳定一致的关键操作。这通常需要从三个层面协同设置:模型调用参数、推理框架环境和底层计算库。

层面一:设置模型调用参数

这是最直接、最常用的一层。主要通过API调用参数来控制模型生成文本时的随机性。

  • 设置 temperature=0
    将温度参数(Temperature)设为0是实现确定性的黄金法则。这会让模型采用“贪婪解码”(Greedy Decoding)策略,即在生成每个词元(token)时,总是选择概率最高的那一个,从根本上消除了生成过程中的随机采样。

  • 指定 seed 参数
    许多大模型API或推理框架支持一个 seed 参数。通过固定一个整数(例如 42),可以确保模型内部的伪随机数生成器从相同的初始状态开始工作。即使 temperature 不为0,只要输入和种子相同,输出序列也会完全一致。

最佳实践是“双控法”:同时设置 temperature=0 和 seed=42,以实现最大程度的稳定性。

代码示例 (使用 OpenAI 兼容 SDK):

import openai

client = openai.Client(base_url="YOUR_API_URL", api_key="YOUR_API_KEY")

response = client.chat.completions.create(
    model="qwen-plus",
    messages=[{"role": "user", "content": "Hello, how are you?"}],
    temperature=0,  # 关键设置1:消除随机性
    seed=42         # 关键设置2:固定随机种子
)

print(response.choices[0].message.content)

注意:seed 参数并非所有API的标准配置,可能需要通过 extra_body 等扩展字段传递,具体需查阅相应框架的文档。

层面二:配置推理框架环境

如果您是自己部署和运行大模型(例如使用 PyTorch、SGlang 等框架),则需要从环境层面进行更全面的控制。

  • 固定 Python 及框架的随机种子
    需要确保所有可能引入随机性的库都使用相同的种子进行初始化.

    import random
    import numpy as np
    import torch
    
    def set_seed(seed=42):
        random.seed(seed)           # 固定 Python 内置 random 模块
        np.random.seed(seed)        # 固定 NumPy 的随机数生成器
        torch.manual_seed(seed)     # 固定 PyTorch CPU 随机数生成器
        torch.cuda.manual_seed_all(seed) # 固定 PyTorch 所有 GPU 的随机数生成器
    
    set_seed(42)
  • 确保底层计算确定性
    在GPU上,某些计算(尤其是卷积操作)为了追求极致性能,默认会使用非确定性算法。必须显式禁用它们

    # 强制 CuDNN 使用确定性算法
    torch.backends.cudnn.deterministic = True
    # 关闭 CuDNN 的自动优化,防止其选择非确定性算法
    torch.backends.cudnn.benchmark = False
  • 模型置于评估模式
    在推理前,务必调用 model.eval()。这会关闭模型中如 Dropout 等在训练时引入随机性的层,确保推理行为是确定的。

 层面三:保证系统级一致性

除了上述技术设置,还有一些宏观因素会影响结果的复现。

  • 锁定模型版本
    大模型更新迭代很快,不同版本的模型权重和行为可能存在差异。在调用API时,务必明确指定模型的具体版本号(如 gpt-4-turbo-2024-04-09),而不是使用 latest 这类会变动的别名。

  • 确保输入完全一致
    模型对输入的微小变化极为敏感。必须保证每次调用的提示词(Prompt)在字符级别上完全相同,包括空格、换行、标点符号等。

  • 固化运行环境
    硬件(如不同型号的GPU)、CUDA版本、PyTorch/TensorFlow版本等差异都可能导致浮点数计算的微小误差,这些误差在深层网络中累积,最终可能影响输出。使用 Docker 等容器化技术可以有效固化整个运行环境。

通过从这三个层面系统性地设置,可以最大限度地固定随机数种子,确保大模型调用结果的稳定性和可复现性。

层面四: 提升输出层精度

###################################################

示例:

方案一:通过 API 请求传递(推荐)

启动服务后,在每个请求中传入 temperature

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-32b",
    "messages": [{"role": "user", "content": "Hello"}],
    "temperature": 0.0,
    "seed": 42
  }'

方案二:设置服务端默认值

如果希望所有请求都默认使用 temperature=0.0,可以在启动命令中添加 --sampling-params 参数(需要确认vLLM 版本是否支持):

--sampling-params '{"temperature": 0.0, "seed": 42}'

方案三:客户端硬编码

在调用 vLLM 的客户端代码中,固定设置 temperature=0.0

VLLM其他参数的检查

参数 状态 说明
--seed 42 正确 这是有效的引擎参数,会固定全局随机种子
--dtype half 正确 强制使用 float16
--disable-log-requests 正确 减少日志干扰

VLLM的建议配置

--model /root/models

--host 0.0.0.0

--port 8000

--trust-remote-code

--served-model-name qwen3-32b

--gpu-memory-utilization 0.8

--max-model-len 36000

--tensor-parallel-size 4

--enable-lora

--lora-modules lora1=/root/loras

# --- 稳定性核心参数开始 ---

--seed 42    # 【正确】固定随机种子

--dtype half    # 【正确】强制 float16

--disable-log-requests    # 【可选】减少日志干扰

# --- 稳定性核心参数结束 ---

然后在客户端请求时固定传入 "temperature": 0.0 即可。

核心区别

维度 --seed 42 (引擎参数) "seed": 42 (请求参数)
作用层级 全局引擎级别 单次请求级别
影响范围 所有请求 + 所有随机操作 仅当前请求的采样过程
主要目的 确保分布式下结果可复现 控制单次生成的随机性
vLLM 特有 是,为了解决多卡同步问题 否,遵循 OpenAI API 标准

详细解释

--seed 42 (引擎启动参数)

作用:设置 vLLM 引擎内部的全局随机种子

为什么需要

  • 当使用张量并行 (TP=4) 或多卡时,如果不固定全局种子,不同 GPU 上的随机数生成器状态不同步

  • 会导致同一个请求每次运行结果都不同,即使 temperature=0 也无效

影响的操作

  • 模型权重的随机初始化

  • Dropout 等训练时操作(推理时一般不用)

  • 确保分布式环境下采样的确定性

"seed": 42 (请求体参数)

作用:为这一次请求设置采样随机种子。

影响的操作

  • 仅影响 temperaturetop_ptop_k 等采样过程的随机数生成

  • 配合 temperature=0 使用时,确保每次返回相同的确定性结果

实际效果示例

# 引擎启动时
--seed 42  # 固定全局种子

# 请求 A
{"temperature": 0.0, "seed": 100}  # 使用种子 100 采样
# 请求 B  
{"temperature": 0.0, "seed": 200}  # 使用种子 200 采样
# 请求 C
{"temperature": 0.0}  # 使用引擎全局种子 42 采样

最佳实践建议

对于稳定性需求:

# 引擎启动(固定一次)
--seed 42  # 保持全局确定性
# API 请求(每次请求固定)
curl ... -d '{
    "temperature": 0.0,
    "seed": 42  # 可选,与引擎 seed 保持一致
}'

推荐策略

  1. 始终设置 --seed 引擎参数 → 保证分布式环境基础确定性

  2. 请求中可选 "seed" 参数 → 如果需要不同请求使用不同随机策略

  3. 对于完全确定性输出,建议两者都设置,且值保持一致

重要提示

  • vLLM 官方文档强调:--seed 必须设置,否则张量并行会导致结果不可复现

  • 即使 temperature=0,没有 --seed 参数,多次运行结果仍可能不同

  • 请求中的 "seed" 会覆盖引擎的全局 --seed 对该请求的影响

此配置是正确的:设置了 --seed 42,然后在请求中也传入 "seed": 42 是最稳妥的确定性方案。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐