Sophia
Sophia 是一款专为大型语言模型预训练设计的高效优化器,源自论文《Sophia: A Scalable Stochastic Second-order Optimizer for Language Model Pre-training》的官方实现。它旨在解决传统一阶优化器(如 AdamW)在处理超大规模模型时收敛速度慢、计算资源消耗大的痛点。
通过引入随机二阶优化技术,Sophia 能够利用海森矩阵(Hessian)的对角线估计来动态调整参数更新步长。其核心亮点在于独特的“梯度裁剪”机制:仅对曲率较大的参数方向进行限制,从而允许在其余方向使用更大的学习率。这种策略不仅显著提升了训练速度,还保持了极高的稳定性,实测表明在同等条件下比 Lion 等先进优化器更快收敛。
Sophia 主要面向 AI 研究人员和深度学习开发者,特别是那些从事大模型预训练、需要优化训练效率的专业团队。代码基于 nanoGPT 和 levanter 构建,提供了清晰的 PyTorch 接口和详细的超参数调优指南(如 $\rho$ 值与学习率的设定),方便用户快速集成到现有的训练流程中。如果你正在寻求突破大模型训练瓶颈的方案,Sophia 提供了一个经过验证的高性能选择。
使用场景
某大型 AI 实验室团队正在基于海量语料库从头预训练一个百亿参数级别的垂直领域大语言模型,面临巨大的算力成本与时间压力。
没有 Sophia 时
- 训练周期漫长:使用传统的 AdamW 优化器时,受限于学习率上限,模型收敛速度缓慢,完成整个预训练任务预计需要数周甚至更久。
- 超参调优困难:为了维持训练稳定性,不得不保守地设置较小的学习率,导致在损失函数曲面平坦区域徘徊,难以快速跳出局部最优。
- 算力资源浪费:漫长的迭代过程意味着需要占用昂贵的 GPU 集群更长时间,显著推高了研发成本和碳排放。
- 二阶信息缺失:传统一阶优化器无法利用曲率信息(Hessian 矩阵),在面对病态条件数的问题时,梯度更新方向往往不是最优路径。
使用 Sophia 后
- 收敛速度倍增:Sophia 通过引入随机二阶优化机制,允许使用比 Lion 或 AdamW 大得多的学习率,将整体预训练时间缩短了 50% 以上。
- 智能梯度裁剪:利用海森矩阵对角线估计动态调整更新步长,自动平衡不同参数的更新幅度,既加快了收敛又避免了损失函数爆炸。
- 大幅降低成本:在达到相同困惑度(Perplexity)指标的前提下,显著减少了所需的 GPU 运行小时数,直接节省了数十万美元的算力开支。
- 稳定高效更新:通过每隔 k 步更新一次海森指数移动平均(EMA),以极低的计算开销获得了二阶优化器的优势,确保了大规模分布式训练下的数值稳定性。
Sophia 通过巧妙融合随机二阶信息与自适应学习率,让大模型预训练在保持稳定的同时实现了“加速跑”,彻底改变了算力与时间的博弈格局。
运行环境要求
- 未说明
- 需要 NVIDIA GPU
- 示例中使用了 10x A5000 (24GB) 或 8x A100 (40GB)
- 对于 1.5B 模型训练提到了 TPU 实例支持
未说明

快速开始
Sophia:用于语言模型预训练的可扩展随机二阶优化器
这是论文https://arxiv.org/abs/2305.14342中Sophia-G优化器以及GPT-2训练脚本的官方实现。代码基于nanoGPT和levanter。如果您觉得Sophia有用,请引用该论文并给本仓库点个赞!谢谢!
@article{liu2023sophia,
title={Sophia: A Scalable Stochastic Second-order Optimizer for Language Model Pre-training},
author={Liu, Hong and Li, Zhiyuan and Hall, David and Liang, Percy and Ma, Tengyu},
journal={arXiv preprint arXiv:2305.14342},
year={2023}
}
新闻与更新
- 使用最新版PyTorch更新了实验结果。
依赖项
- PyTorch 2.1.2
- transformers 4.33.0
- datasets
- tiktoken
- wandb
一般用法
以下是使用SophiaG训练具有NLL损失的一般模型的示例代码片段。有关超参数调优的指导,请参阅下一节。
import torch
import torch.nn.functional as F
from sophia import SophiaG
# 初始化模型、损失函数和输入数据
model = Model()
data_loader = ...
# 初始化优化器
optimizer = SophiaG(model.parameters(), lr=2e-4, betas=(0.965, 0.99), rho=0.01, weight_decay=1e-1)
total_bs = len(data_loader)
bs = total_bs * block_size
k = 10
iter_num = -1
# 训练循环
for epoch in range(epochs):
for X, Y in data_loader:
# 标准训练代码
logits, loss = model(X, Y)
loss.backward()
optimizer.step(bs=bs)
optimizer.zero_grad(set_to_none=True)
iter_num += 1
if iter_num % k != k - 1:
continue
else:
# 更新Hessian EMA
logits, _ = model(X, None)
samp_dist = torch.distributions.Categorical(logits=logits)
y_sample = samp_dist.sample()
loss_sampled = F.cross_entropy(logits.view(-1, logits.size(-1)), y_sample.view(-1), ignore_index=-1)
loss_sampled.backward()
optimizer.update_hessian()
optimizer.zero_grad(set_to_none=True)
model.zero_grad()
超参数调优
学习率的定义
- 代码中的更新形式为$\theta_{t+1} = \theta_t - lr*\textup{clip}(m_t / (\rho * h_t + \epsilon), 1)$,这与论文中的更新形式在重新参数化后等价。(这里的$lr$对应于论文中的$\rho \cdot \eta_t$)。因此,AdamW和Lion的学习率并不直接可比。经验上,Adam和Lion以5:1的学习率比例时行为相似。SophiaG和Lion的学习率则可以直接比较。Sophia允许使用比Lion大得多的学习率,这也是Sophia速度更快的原因。
调整超参数$\rho$
- 调整$\rho$使被截断的坐标比例保持稳定且处于适当范围。这在GPT-2训练示例中作为
train/win_rate进行跟踪。train/win_rate应在训练初期达到峰值,并在之后保持稳定。其值应维持在0.1至0.5之间。通常,较大的$\rho$会导致较高的train/win_rate。下文提供了T5模型中典型win_rate行为的示例。
调整学习率和权重衰减
- 选择略小于您用于AdamW的学习率,或为用于Lion的学习率的3至5倍。
如果损失发散,可适当降低学习率或增大$\rho$。
始终使用约为AdamW两倍的权重衰减。
GPT-2模型的超参数
- 选择与您用于AdamW的学习率相近,或为用于Lion的学习率的5至10倍。
- 调整$\rho$使未被截断的参数比例保持稳定且处于适当范围。这在GPT-2训练示例中作为
train/win_rate进行跟踪。train/win_rate应在训练初期达到峰值,并在之后保持稳定。其值应维持在0.1至0.5之间。通常,较大的$\rho$会导致较高的train/win_rate。 - 使用略大于AdamW的权重衰减,例如0.2。
- 除学习率外,其他超参数在不同模型规模间均可通用。
- 下表列出了不同模型规模的超参数。
| 模型规模 | Adam的学习率 | Lion的学习率 | Sophia的学习率 | Sophia的$\rho$ | Sophia的权重衰减 |
|---|---|---|---|---|---|
| 125M | 6e-4 | 1e-4 | 6e-4 | 0.05 | 0.2 |
| 355M | 3e-4 | 1e-4 | 7e-4 | 0.08 | 0.2 |
| 770M | 2e-4 | 8e-5 | 3e-4 | 0.05 | 0.2 |
- 欢迎您在超参数调优过程中分享您的发现。我们非常感谢您的宝贵反馈和建议!
复现 GPT-2 结果
按照 nanoGPT 的说明准备 OpenWebText 数据集:
$ python data/openwebtext/prepare.py
开始预训练 GPT2 Small(1.25亿参数):
如果你的机器有 10 张 A5000(24GB 显存)显卡,
$ torchrun --standalone --nproc_per_node=10 \
train_sophiag.py \
config/train_gpt2_small_sophiag.py \
--batch_size=8 \
--gradient_accumulation_steps=6
如果你的机器有 8 张 A100(40GB 显存)显卡,
$ torchrun --standalone --nproc_per_node=8 \
train_sophiag.py \
config/train_gpt2_small_sophiag.py \
--batch_size=12 \
--gradient_accumulation_steps=5
要复现 nanoGPT 中的 AdamW 基线,
$ torchrun --standalone --nproc_per_node=10 \
train_adam.py \
config/train_gpt2_small_adam.py \
--batch_size=8 \
--gradient_accumulation_steps=6
这将得到下图所示的结果:
开始预训练 GPT2 Medium(3.55亿参数):
如果你的机器有 8 张 A100(40GB 显存)显卡,
$ torchrun --standalone --nproc_per_node=8 \
train_sophiag.py \
config/train_gpt2_medium_sophiag.py \
--batch_size=6 \
--gradient_accumulation_steps=10
要复现 AdamW 基线:
$ torchrun --standalone --nproc_per_node=8 \
train_adam.py \
config/train_gpt2_medium_adam.py \
--batch_size=6 \
--gradient_accumulation_steps=10
请根据你使用的硬件配置相应调整 nproc_per_node, batch_size 和 gradient_accumulation_steps,确保三者的乘积等于 480。
这将得到下图所示的结果:
开始预训练 GPT2 15亿参数模型:
我们使用 The Pile 数据集和 GPT NeoX 分词器。首先按照 levanter 的说明设置 TPU 实例及环境。然后在 optim.py 中将 GAMMA_SOPHIA_G 修改为 200。15亿参数模型的训练脚本如下:
gcloud compute tpus tpu-vm ssh <instance_name> \
--zone <zone_name> \
--worker=all \
--command 'WANDB_API_KEY=<wandb_api_key> levanter/infra/launch.sh python levanter/examples/gpt2_example.py --config_path levanter/config/gpt2_1536_pile.yaml --trainer.beta1 0.965 --trainer.beta2 0.99 --trainer.min_lr_ratio 0.020 --trainer.weight_decay 0.15 --trainer.learning_rate 2.5e-4 --trainer.warmup_ratio 0.01'
致谢
GPT-2 的训练代码基于 nanoGPT,其代码简洁高效,令人赞叹。
常见问题
相似工具推荐
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 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
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 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备