s1

GitHub
6.6k 764 较难 1 次阅读 昨天Apache-2.0语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

s1 是一个专注于“测试时扩展”(Test-time Scaling)的开源 AI 项目,旨在通过极简的方法显著提升大模型的推理能力。它的核心目标是让模型在回答问题时进行更深入的思考,从而在数学、逻辑等复杂任务上达到媲美顶尖闭源模型(如 o1-preview)的性能,而无需昂贵的训练成本。

传统大模型往往受限于固定的生成长度,难以处理需要多步推导的难题。s1 巧妙地解决了这一痛点,它提出了一套最小化的训练方案:仅使用 1000 个高质量示例,配合独特的“预算强制”(Budget Forcing)技术,就能教会模型自主规划思考过程。所谓“预算强制”,是指在推理阶段动态控制模型的思考令牌数量,甚至允许忽略早期的停止信号,强制模型进行更充分的演算后再输出最终答案。

该项目非常适合 AI 研究人员、开发者以及对大模型推理机制感兴趣的技术爱好者。对于研究者,s1 提供了完整的论文、数据集和训练脚本,是探索高效推理范式的绝佳案例;对于开发者,项目集成了 vLLM 等主流推理框架,支持快速部署和微调,方便将强大的推理能力集成到实际应用中。凭借极低的资源门槛和出色的效果,s1 为构建高智商 AI 助手提供了一条简单而高效的新路径。

使用场景

某教育科技公司的算法团队正在开发一款面向中学生的 AI 数学辅导助手,需要模型不仅能给出答案,更要展示严谨的逐步推导过程以帮助学生理解。

没有 s1 时

  • 推理深度不足:面对复杂的几何证明或奥数题,普通模型往往直接跳跃步骤给出结论,甚至因缺乏深思熟虑而产生“幻觉”错误。
  • 训练成本高昂:为了提升逻辑能力,团队通常需要收集数十万条高质量思维链数据进行微调,数据清洗与标注耗时数月且费用昂贵。
  • 响应不可控:模型有时过早停止思考输出不完整方案,有时又冗长啰嗦,难以在有限的算力预算内平衡思考时间与回答质量。
  • 效果天花板明显:即使增加参数量,模型在处理需要多步回溯的高难度问题时,准确率仍远低于人类专家水平,无法满足教学需求。

使用 s1 后

  • 强化测试时扩展:s1 通过“预算强制(budget forcing)”机制,迫使模型在生成答案前充分利用预设的思考 token 上限,显著提升了复杂问题的推导准确率。
  • 极低数据依赖:团队仅需使用 s1 提供的约 1,000 条精选示例进行微调,即可让模型获得媲美 o1-preview 的强推理能力,将数据准备周期从数月缩短至几天。
  • 思考过程可控:开发者可精确设定最大思考 token 数(如 32,000),确保模型在资源受限环境下依然能完成深度推理并输出完整解答,避免中途截断。
  • 性能越级提升:原本需要千亿参数模型才能解决的难题,现在基于 32B 的 s1 模型即可高效处理,大幅降低了推理部署的硬件门槛和运营成本。

s1 通过极简的训练配方和创新的测试时扩展策略,让中小规模模型也能具备顶尖的深度推理能力,极大降低了高性能 AI 助手的落地门槛。

运行环境要求

操作系统
  • Linux
GPU
  • 训练必需:推荐 16 张 NVIDIA H100 GPU (2 节点 x8)
  • 推理必需:支持 CUDA 的 NVIDIA GPU,需足够显存加载 32B 模型 (建议 80GB+ 或使用多卡 tensor_parallel_size),CUDA 版本未说明
内存

未说明 (取决于模型加载方式,32B 模型通常需大量系统内存或显存)

依赖
notes1. 训练 s1-32B/s1.1-32B 推荐配置为 16 张 H100 GPU,若显存不足 (OOM) 需设置 block size 为 20000 或开启梯度检查点 (--gradient_checkpointing=True)。2. 推理 32B 模型建议使用 vLLM 并配置 tensor_parallel_size (示例为 2)。3. 已知问题:使用 budget forcing 且 temperature=1 时,vLLM 可能报错 'Token id out of vocabulary',需修改 vLLM 源码注释掉相关检查行。4. 评估模块基于修改版的 lm-evaluation-harness。5. 数据复现需替换 HuggingFace 组织名为自有组织。
python未说明
vllm
transformers
torch
lm-evaluation-harness
s1 hero image

快速开始

s1:简单的测试时缩放

仅需1,000个示例和预算强制,即可实现测试时缩放并达到与o1-preview相当的强大推理性能的极简方案



更新:


本仓库提供了论文"s1:简单的测试时缩放"的所有资源概览。

成果

结构

  • eval/:评估脚本
  • data/:合成数据生成脚本等
  • train/:训练脚本

推理

vLLM

安装vllm库并运行:

from vllm import LLM, SamplingParams
from transformers import AutoTokenizer

model = LLM(
    "simplescaling/s1.1-32B",
    tensor_parallel_size=2,
)
tok = AutoTokenizer.from_pretrained("simplescaling/s1-32B")

stop_token_ids = tok("<<|im_end|>>")["input_ids"]

sampling_params = SamplingParams(
    max_tokens=32768,
    min_tokens=0,
    stop_token_ids=stop_token_ids,
)

prompt = "How many r in raspberry"
prompt = "<<|im_start|>>system\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<<|im_end|>>\n<<|im_start|>>user\n" + prompt + "<<|im_end|>>\n<<|im_start|>>assistant\n"

o = model.generate(prompt, sampling_params=sampling_params)
print(o[0].outputs[0].text)

带预算强制的vLLM

from vllm import LLM, SamplingParams
from transformers import AutoTokenizer

# 决定思考时的token限制;由于模型的最大token数为32768,通常设置为32000可以确保模型仍有足够的空间来回答
MAX_TOKENS_THINKING = 32000
# 决定忽略结束思考标记的次数
NUM_IGNORE = 1

model = LLM(
    "simplescaling/s1-32B", # s1原本会错误地回答这个问题,但在预算强制下则能纠正
    tensor_parallel_size=2,
)
tok = AutoTokenizer.from_pretrained(
    "simplescaling/s1-32B"
)

stop_token_ids = tok("<<|im_end|>>")["input_ids"]
sampling_params = SamplingParams(
    max_tokens=32768,
    min_tokens=0,
    stop_token_ids=stop_token_ids,
    skip_special_tokens=False,
    temperature=0.0,
)

# 对于论文中提到的覆盆子具体例子,请参见
prompts = [
    "How many r in raspberry",
]

for i, p in enumerate(prompts):
    prompt = "<<|im_start|>>system\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<<|im_end|>>\n<<|im_start|>>user\n" + p + "<<|im_end|>>\n<<|im_start|>>assistant\n"
    stop_token_ids = tok("<<|im_start|>><<|im_end|>>")["input_ids"]
    sampling_params = SamplingParams(
        max_tokens=MAX_TOKENS_THINKING,
        min_tokens=0,
        stop_token_ids=stop_token_ids,
        skip_special_tokens=False,
        temperature=0.0,
    )
    prompt += "<<|im_start|>>think"
    o = model.generate(
        prompt,
        sampling_params=sampling_params
    )
    ignore_str = "Wait"
    max_tokens_thinking_tmp = MAX_TOKENS_THINKING
    for i in range(NUM_IGNORE): # 忽略结束标记的次数
        max_tokens_thinking_tmp -= len(o[0].outputs[0].token_ids)
        if max_tokens_thinking_tmp > 0:
            prompt += o[0].outputs[0].text + ignore_str
            sampling_params = SamplingParams(
                max_tokens=max_tokens_thinking_tmp,
                min_tokens=1,
                stop_token_ids=stop_token_ids,
                skip_special_tokens=False,
                temperature=0.0,
            )
            o = model.generate(
                prompt,
                sampling_params=sampling_params
            )
    ### 最终答案 ###
    prompt += o[0].outputs[0].text # 你也可以在这里加上“Final Answer:”,就像我们在某些评估中做的那样,以防止模型在提前退出时继续在其答案中进行推理
    stop_token_ids = tok("<<|im_end|>>")["input_ids"]
    sampling_params = SamplingParams(
        max_tokens=32768,
        min_tokens=0,
        stop_token_ids=stop_token_ids,
        skip_special_tokens=False,
        temperature=0.0,
    )
    o = model.generate(
        prompt,
        sampling_params=sampling_params,
    )
    print("With budget forcing:") # 你会看到,在推理轨迹中的“Wait”之后,模型会修正其答案
    print(prompt + o[0].outputs[0].text)

transformers

安装transformerstorch库并运行:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
model_name = "simplescaling/s1.1-32B"

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

prompt = "How many r in raspberry"
messages = [
    {"role": "system", "content": "You are a helpful and harmless assistant. You are Qwen developed by Alibaba. You should think step-by-step."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

训练

要运行训练,您可以在 train/sft.py 中找到我们的脚本,可以通过 train/sft*sh 脚本之一调用它。如果您在 SLURM 集群上,还可以通过 train/launch.sh 启动这些脚本(需要根据您的集群设置编辑该文件)。

对于 s1-32B 和 s1.1-32B 的训练,我们建议使用 16 张 H100 GPU,即两台节点,每台配备 8 张卡。对于 s1.1,我们将块大小设置为 20000,以避免内存溢出(OOM)问题(https://github.com/simplescaling/s1/blob/0ad4b3de32507b4aa0d4be28f336276ee99b2315/train/sft.sh#L17);请在此处查看 wandb 日志:链接

快速入门:

git clone https://github.com/simplescaling/s1.git
cd s1
pip3 install -r requirements.txt
bash train/sft.sh

注意:如果您在使用 8 张 GPU 时遇到内存溢出(OOM)问题,可以考虑启用梯度检查点功能,在脚本中添加以下行:--gradient_checkpointing=True

评估

我们克隆了 lm-evaluation-harness,版本为 4cec66e4e468d15789473d6d63c3a61a751fa524,并对其进行了修改。设置步骤如下:

cd eval/lm-evaluation-harness
pip install -e .[math,vllm]

所有命令都位于 eval/commands.sh 中。对于 AIME24,我们始终选择 aime24_nofigures 结果,该结果使用的数据集仅包含对任务重要的 AIME24 图形。

如果您想计算某次评估运行的统计信息(如平均思考 token 数等),可以使用以下命令: python eval/compute_sample_stats.py path_to_samples_file.jsonl

我们所有的评估结果文件都位于:https://hf.co/datasets/simplescaling/results

要运行 REBASE:相关命令位于 eval/rebase/run.sh 中。

请注意,在讨论部分使用 REBASE 进行的评估中,我们使用的是 https://huggingface.co/simplescaling/step-conditional-control-old 模型,该模型是在旧版数据集 https://huggingface.co/datasets/simplescaling/s1K-step-conditional-control-old 上训练的,并且是在旧版评估流程 https://huggingface.co/datasets/Maxwell-Jia/AIME_2024 下运行的。

数据

要重现 s1K 数据集,请按照以下步骤操作。在多个文件中,您需要将组织名称 simplescalingqfq 替换为您自己的组织名称。请注意,s1K-1.1 是一个更好的数据集,它是基于 r1 跟踪日志生成的,而非 Gemini 跟踪日志。

  1. 先运行 data/collect_data.py,然后依次运行 data/fix_gpqa.pydata/add_aime.py 来收集题目;请务必在相应文件中将 hub 路径替换为您自己的路径。
  2. 使用 python data/gemini.py 通过 Gemini 生成跟踪日志。此步骤将使用 https://hf.co/datasets/qfq/train 数据集,该数据集应大致与您在第一步中生成的数据集相当。
  3. 使用 Qwen 通过 python data/bulk_inference.py 生成答案,可通过 data/bulk_inference.sh 启动批量推理。
  4. 运行 python data/featurization.py 添加特征。
  5. 最后通过 data/filter.ipynb 进行最终筛选。
  6. 如果您希望对最终题目进行评分,以生成例如 此数据集 中的 gemini_grade 列,可以使用 data/grading.ipynb

可视化

所有图表和部分表格均通过 此 Colab 笔记本 生成,该笔记本相当于 visuals/visuals.ipynb。部分图表随后通过 visuals/s1.fig 文件进行编辑,您可以将其导入 Figma。最终生成的图表以 PDF 或 PNG 格式保存在 visuals/ 目录中。

已知问题

  • vLLM 抛出 ValueError: Token id XXXXX is out of vocabulary 错误。
    • 这种情况可能发生在预算强制优化时,尤其是在使用温度 1 运行时,模型有时会做出一些异常行为,预测超出其最大 token ID 但仍在嵌入空间范围内的词汇 ID,即小于 152064、大于 151664 的 ID。当我们重新输入模型之前的输出作为输入时(例如在评估中设置 max_thinking_tokens 时),就会触发此错误,因为 vLLM 会执行这种检查,尽管只有超过 152064 的 ID 才会导致实际问题。要解决这个问题,您可以取消注释 vLLM 中的 ValueError 检查代码(位于 vllm/engine/llm_engine.py 中的 if max_input_id > tokenizer.max_token_id: 这一行)。

引用

@misc{muennighoff2025s1simpletesttimescaling,
      title={s1: Simple test-time scaling}, 
      author={Niklas Muennighoff and Zitong Yang and Weijia Shi and Xiang Lisa Li and Li Fei-Fei and Hannaneh Hajishirzi and Luke Zettlemoyer and Percy Liang and Emmanuel Candès and Tatsunori Hashimoto},
      year={2025},
      eprint={2501.19393},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2501.19393}, 
}

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架