SPIN
SPIN(Self-Play Fine-Tuning)是一种创新的开源大语言模型微调技术,旨在通过“自我博弈”机制显著提升模型能力。它核心解决了传统对齐方法过度依赖昂贵且稀缺的人工标注偏好数据这一痛点。SPIN 无需额外的人类反馈,仅利用现有的监督微调(SFT)数据集,就能让模型与自己之前的版本进行“对弈”:模型生成新的回答,并学习区分这些自生成内容与原始高质量数据,从而在迭代中不断自我进化。
这项技术的独特亮点在于其高效的数据闭环策略。实验表明,经过几轮自我博弈训练,原本表现平平的模型在开放大模型排行榜(Open LLM Leaderboard)和 MT-Bench 等权威评测中的得分均大幅超越直接使用人类偏好数据训练的模型,甚至能媲美更强大的基线。
SPIN 非常适合 AI 研究人员、大模型开发者以及希望以低成本优化私有模型的企业团队使用。对于缺乏大规模人工标注资源但拥有基础 SFT 数据的用户而言,SPIN 提供了一条极具性价比的性能提升路径。该项目已公开完整的训练代码、复现脚本及预训练模型,支持基于 Mistral-7B 等主流架构快速上手,助力社区以更少的资源构建更强的语言模型。
使用场景
某初创团队希望基于开源的 Mistral-7B 模型构建专属客服助手,但受限于预算无法承担昂贵的人工偏好标注成本。
没有 SPIN 时
- 数据依赖重:为了提升模型回答的自然度和逻辑性,必须雇佣专业人员编写大量“人类偏好数据”,资金和时间成本极高。
- 迭代周期长:每次调整模型策略都需要等待新一轮的人工标注,导致模型优化流程停滞,难以快速响应业务需求。
- 性能瓶颈明显:仅依靠基础的监督微调(SFT),模型在面对复杂多轮对话时容易出现机械重复或逻辑断层,难以达到商用标准。
- 资源利用率低:已有的 SFT 数据集被一次性使用后便闲置,缺乏机制让模型从自身历史表现中挖掘更多训练价值。
使用 SPIN 后
- 实现自我进化:SPIN 让模型通过“自我博弈”机制,利用上一版本的输出作为负样本,自动生成训练数据,完全省去了额外的人工标注环节。
- 加速迭代闭环:团队只需运行脚本即可让模型在内部进行多轮对抗训练,将原本数周的数据准备周期缩短至几天甚至几小时。
- 显著突破上限:经过几轮自博弈微调,模型在 Open LLM Leaderboard 和 MT-Bench 上的得分显著提升,能够更精准地区分并模仿高质量回答,对话流畅度媲美强基座模型。
- 盘活存量数据:无需新数据输入,SPIN 巧妙地将原有的 SFT 数据集转化为持续的进化动力,最大化了初始数据的价值。
SPIN 通过让大模型在自我对抗中不断“左右互搏”,以零额外标注成本将弱模型转化为强模型,彻底打破了高性能对齐的数据壁垒。
运行环境要求
- Linux
必需 NVIDIA GPU(用于安装 flash-attn 及 accelerate 多卡训练),具体显存需求未说明(建议 24GB+ 以运行 7B 模型),需支持 CUDA
未说明

快速开始
自对弈微调(SPIN)
本仓库包含论文《自对弈微调将弱语言模型转化为强语言模型》(https://arxiv.org/abs/2401.01335)的官方代码。
作者:Zixiang Chen*, Yihe Deng*, Huizhuo Yuan*, Kaixuan Ji, Quanquan Gu
[网页] [HuggingFace]
🔔 新闻
- [05/01/2024] SPIN已被ICML2024接收!
- [04/06/2024] 我们发布了用于复现实验结果的训练脚本。
- [04/04/2024] ❗ 我们发现之前上传的数据集存在错误,现已重新上传修正后的数据集。
- [02/13/2024] 我们更新了arXiv v2版本:https://arxiv.org/abs/2401.01335。
- [02/09/2024] 我们的代码已开源!
- [01/02/2024] 我们的论文已在arXiv上发布:https://arxiv.org/abs/2401.01335。
❗ 注意:我们注意到HuggingFace对齐手册自我们的实验以来已经更新了其配置和SFT检查点。我们在实验中用于数据生成和微调的对齐手册中的配置及SFT模型均为旧版本(配置,模型)。HuggingFace上的该模型检查点(alignment-handbook/zephyr-7b-sft-full)已使用新配置更新过一次。如果您希望使用最新的SFT模型,可以加载带有revision=ac6e600eefcce74f5e8bae1035d4f66019e93190的检查点,或者自行生成数据,而非使用我们在HuggingFace上提供的数据集。
目录
🌀 关于SPIN
SPIN采用自对弈机制,允许语言模型通过与自身先前版本的交互来不断提升性能,而无需额外的人工标注偏好数据,仅依赖于SFT数据集本身即可。具体而言,语言模型会基于其先前版本生成自己的训练数据,并通过区分这些自动生成的响应与原始SFT数据,不断优化自身的策略。
HuggingFace Open LLM排行榜上,不同迭代次数下SPIN的平均得分。
在六个基准数据集上与DPO训练的性能对比。SPIN在第0次迭代时,性能已可与使用6.2万条新增数据进行DPO训练的模型相媲美;而在第1次迭代时,SPIN已经在大多数数据集上超越了DPO训练的结果。
更多详细信息,请参阅我们的论文此处。
设置
以下步骤提供了运行我们代码所需的必要设置。
- 使用Conda创建一个Python虚拟环境:
conda create -n myenv python=3.10
conda activate myenv
- 安装以下Python依赖以运行代码:
python -m pip install .
python -m pip install flash-attn --no-build-isolation
- 登录您的HuggingFace账户以便下载模型:
huggingface-cli login --token "${your_access_token}"
数据
我们在此仓库以及HuggingFace上提供了实验中使用的数据,同时还包含了我们生成的合成数据。这些数据已被转换为.parquet格式,以便进行微调。
❗ 2024年4月4日,我们发现之前上传的数据集存在错误,现已重新上传了修正后的数据集。
| 数据集 | 下载 |
|---|---|
| SPIN_iter0 | 🤗 HuggingFace |
| SPIN_iter1 | 🤗 HuggingFace |
| SPIN_iter2 | 🤗 HuggingFace |
| SPIN_iter3 | 🤗 HuggingFace |
我们代码所需的输入数据必须采用相同格式,每条数据应包含以下属性,类似于HuggingFaceH4/ultrafeedback_binarized:
{
"real": [{"role": "user", "content": <prompt>},
{"role": "assistant", "content": <ground truth>}],
"generated": [{"role": "user", "content": <prompt>},
{"role": "assistant", "content": <generation>}]
}
🔍 注意:在数据生成过程中,生成的回答内容可能为空,因为我们仅使用提示词来生成模型响应。
模型
我们还在 HuggingFace 上提供了模型在第 0、1、2、3 迭代时的检查点。
| 模型 | 下载 |
|---|---|
| zephyr-7b-sft-full-SPIN-iter0 | 🤗 HuggingFace |
| zephyr-7b-sft-full-SPIN-iter1 | 🤗 HuggingFace |
| zephyr-7b-sft-full-SPIN-iter2 | 🤗 HuggingFace |
| zephyr-7b-sft-full-SPIN-iter3 | 🤗 HuggingFace |
🔍 注意: 使用提供的数据,您可以直接跳转到步骤 2:微调,而无需自行生成数据。您也可以从任意迭代开始,利用我们开源的模型检查点复现我们的结果。
使用方法
对于 SPIN,我们会在一个迭代中一次性生成所有合成数据,并基于真实数据和合成数据对齐后的样本对大语言模型进行微调。
步骤 0(可选):重新格式化 SFT 数据集
python spin/reformat.py [options]
选项
--data: SFT 数据集所在的目录(本地或 HuggingFace)- 默认值:
HuggingFaceH4/ultrachat_200k
- 默认值:
--output_dir: 重新格式化后数据文件的本地目录- 默认值:
UCLA-AGI/SPIN_iter0
- 默认值:
🔍 注意:如果选择在整个 HuggingFaceH4/ultrachat_200k 数据集上使用 SPIN,而不是我们提供的 5 万条子集,可以使用 spin/reformat.py 对原始数据进行重新格式化。若要使用其他数据集,只需将其转换为相同格式,然后继续执行后续步骤即可。
步骤 1:生成
accelerate launch spin/generate.py [options]
选项
--model: 加载用于生成的模型检查点。- 默认值:
alignment-handbook/zephyr-7b-sft-full
- 默认值:
--input_dir: 包含生成提示的数据文件所在目录- 代码适用于以下格式的数据生成。
- 默认值:
UCLA-AGI/SPIN_iter0
--output_dir: 保存生成数据的目录。--batch_size: 每个设备的批量大小- 默认值:16
--data_frac: 将数据分成若干份,在不同服务器上分别生成。--frac_len: 数据分片的长度。默认为 0,表示使用整个数据集进行生成。将frac_len设置为正数,则只针对数据的一部分进行生成。注意: 我们建议使用较小的frac_len(例如 800),以小批量生成数据,避免因数据生成耗时较长而导致意外崩溃。- 将
data_frac设置为 0、1、2…,即可针对不同长度的分片进行生成。 - 注意:使用
data_frac进行生成时,请保持相同的分片长度。建议将frac_len设置为 800。
生成的数据为 JSON 格式,每条数据包含以下属性:
{
"real": [{"role": "user", "content": <prompt>},
{"role": "assistant", "content": <ground truth>}],
"generated": [{"role": "user", "content": <prompt>},
{"role": "assistant", "content": <generation>}]
}
注意: 数据生成的迭代次数完全取决于用于生成的模型版本(例如,使用原始 SFT 模型生成第 0 次迭代的数据,使用 SPIN 第 0 次迭代的模型生成第 1 次迭代的数据)。generate.py 脚本只会使用对应数据模型的提示/问题进行生成。
示例. 以下代码生成第 0 次迭代的 8,000 条合成数据。
bash scripts/generate.sh
🚀 使用 vLLM 加速生成
或者,您也可以使用以下示例脚本以更快的速度生成 LLM 回答。使用 vLLM 时可以采用更大的 frac_len。
bash scripts/generate_vllm.sh
感谢 @sumo43 实现了基于 vLLM 的生成功能。
步骤 1.5:收集生成结果并转换数据类型
python spin/convert_data.py [options]
选项
--num_fracs: 需要加载的文件数量。--input_dir: 生成数据文件所在的目录。--output_dir: 用于微调的统一数据存放目录。
该代码将生成两个最终数据文件,分别为 train_prefs-00000-of-00001.parquet 和 test_prefs-00000-of-00001.parquet,这些文件将用于微调。
注意:请确保将生成的数据文件收集到与 --input_dir 相同的目录中。
示例。
python spin/convert_data.py --output_dir new_data/iter0 --input_dir generated/iter0 --num_fracs 63
步骤 2:微调
accelerate launch --config_file configs/multi_gpu.yaml --num_processes=8 --main_process_port 29500 spin/run_spin.py configs/config.yaml
您可能需要修改 configs/config.yaml 中的配置。以下是一些您可能需要自定义的关键配置项:
model_name_or_path: 加载用于微调的模型检查点。- 默认值:
alignment-handbook/zephyr-7b-sft-full
- 默认值:
dataset_mixer: 选择用于微调的数据混合比例。- 默认值:
UCLA-AGI/SPIN_iter0: 1.0 - 对于 SPIN 的第 1 和第 2 次迭代,我们同时包含了当前迭代和上一迭代的数据(例如,第 1 次迭代时,我们加入了
UCLA-AGI/SPIN_iter0: 1.0和UCLA-AGI/SPIN_iter1: 1.0,合计 10 万条数据)。
- 默认值:
output_dir: 微调后模型及检查点的输出目录。- 默认值:
outputs
- 默认值:
per_device_train_batch_size: 单个 GPU 上的训练批次大小。- 默认值:16
gradient_accumulation_steps: 确保per_device_train_batch_size * num_processes * gradient_accumulation_steps等于您的实际批次大小。num_train_epochs: 当前迭代的训练轮数。- 默认值:3
beta: SPIN 中的 beta 参数。- 默认值:0.1
在我们的实验中,我们使用 DeepSpeed ZeRO-3 在多 GPU 机器上进行了全量微调(需要 A100 显卡,80GB 版本)。
示例。
bash scripts/finetune.sh
复现我们的结果
为帮助复现我们的结果,我们已公开与本研究四次迭代相关的脚本。这些脚本已预先配置好论文中使用的精确参数和模型版本。对于每次迭代,基础模型均使用 🤗 HuggingFace 上发布的版本进行初始化,相关链接如下:
| 数据集 | 下载 |
|---|---|
| SPIN_iter0 | 🤗 HuggingFace |
| SPIN_iter1 | 🤗 HuggingFace |
| SPIN_iter2 | 🤗 HuggingFace |
| SPIN_iter3 | 🤗 HuggingFace |
若要使用您本地训练的模型作为基础来执行完整流程,请将配置文件中的 model_name_or_path 参数修改为您模型的路径。
要开始完整的微调过程,可在终端中运行相应的脚本:
bash scripts/finetune.sh
bash scripts/finetune_iter1.sh
bash scripts/finetune_iter2.sh
bash scripts/finetune_iter3.sh
按照上述步骤操作,您应该能够复现我们的结果。
评估
针对 Open LLM Leaderboard 的评估,请使用此 lm-evaluation-harness,其版本为 v0.4.0。此外,请注意,我们将少样本示例的数量设置为与 Leaderboard 中的说明一致。不同版本的评估会导致分数有所差异,但整体趋势将保持不变。
星标历史
引用
若您认为本仓库对您的研究有所帮助,请考虑引用以下论文:
@misc{chen2024selfplay,
title={自对弈微调可将弱语言模型转化为强语言模型},
author={陈子翔、邓一鹤、袁慧卓、季凯旋、顾全全},
year={2024},
eprint={2401.01335},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
致谢
本仓库基于 Alignment Handbook 构建。我们感谢作者们的杰出工作。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
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 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
