LoRA 极速挑战 :如何在单张 L40S 上,用 LoRA 微调 Qwen2.5-1.5B 在 GSM8K 上达到 ≥57% 准确率?
你能在单张 L40S GPU 上,用 LoRA 微调 Qwen2.5-1.5B 模型,使其在 GSM8K 数据集上达到 ≥57% 的准确率,并跑出多快的速度?
这就是 modded-nanogpt 的微调版本:一个固定的任务、固定的硬件,以及一个公开的挂钟时间排行榜。每条记录在被认可前,都会在相同硬件上使用全新随机种子独立重跑 3 次。
尝试和验证都是免费的:官方计时在 Modal L40S 沙盒上运行,Modal 的月度免费计算额度足以覆盖完整运行——所以任何人都可以参与竞争,任何人都可以用一条命令重新验证任何记录。
排行榜
赛道 1 — GSM8K · Qwen2.5-1.5B · 目标 ≥ 57.0% · 1× L40S
当前记录:6m 05s,由 @Saivineeth147 创造 — 序列打包 + 仅完成部分损失掩码,2 个 epoch。与 #0 相同的 LoRA 配置;速度提升约 2 倍,准确率更高。
- 2026-07-18 — 11m 57s — 基线
- 2026-07-18 — 6m 05s — −49%
赛道 2 — SQuAD v1.1 · SmolLM2-1.7B · 目标 ≥ 75.5% · 1× L40S
当前记录:11m 08s,由 @Saivineeth147 创造 — 赛道 2 基线:在 SQuAD 上使用普通 LoRA r=16,前 20k 个样本,1 个 epoch,全序列损失。无技巧。
- 2026-07-20 — 11m 08s — 基线
包含验证报告的完整历史记录:records/RECORDS.md
赛道
两条固定的赛道,特意选择了不同的模型系列和任务类型——因此,一项技术只有在两条赛道上都获胜,才能证明其通用性。所有赛道共享相同的硬件、上限和验证流程。
- 赛道 1:Qwen/Qwen2.5-1.5B,GSM8K 数学 → ≥ 57.0% 精确匹配,仅使用 GSM8K 训练集,训练挂钟时间。时间越短越好。1× L40S (48 GB),Modal 沙盒,仅适配器参数,≤ 30M 可训练参数
机器可读规格:spec.yaml · spec-t2.yaml。完整规则:TASK.md。
你可以控制其他一切:LoRA 秩和放置位置、量化、学习率调度、序列打包、数据子集选择和排序、自定义内核、何时停止训练。如果你能确保达到目标,可以在 90 秒内用 1,000 个精心挑选的样本进行训练。
为什么存在这个项目
LoRA/QLoRA 是大多数实际微调发生的方式,并且技术空间已经爆炸式增长——DoRA、rsLoRA、PiSSA、LoRA+、NEFTune、Unsloth 内核、秩自适应方法——但缺乏一个对抗性的、公平的竞技场,让这些想法在公开场合相互竞争。论文在不同模型、数据和硬件上报告数字;没有任何可比性。
nanoGPT 极速挑战为预训练解决了这个问题,并产生了真正的科学成果(Muon 优化器就源于此)。这个仓库为参数高效微调做了同样的事情:一个固定的任务、一个 GPU、挂钟时间、需要提供凭证。
快速开始
官方硬件运行(免费)。创建一个 Modal 账户,然后:
# 克隆仓库
git clone https://github.com/Saivineeth147/lora-speedrun.git
cd lora-speedrun
# 安装依赖
pip install -r requirements.txt
# 运行基线(Modal 上)
modal run harness/run_submission.py --submission submissions/000-baseline
本地迭代(可选)。任何 24 GB+ 的显卡都可以运行基线,以便快速实验——bash scripts/setup_gpu.sh,然后 python harness/run_submission.py submissions/000-baseline --runs 1。本地时间不是官方时间;排行榜时钟是 Modal L40S。
然后复制 submissions/TEMPLATE/,让它更快,并提交一个 PR。请参阅 CONTRIBUTING.md。
记录如何被验证
从日志中回放的真实验证过程(种子 463953844,时间压缩):训练 → 完整性 + 适配器审计 → 评估 → 3 个种子判定结果。
- 你提交一个包含训练脚本、配置、说明和自我报告数字的 PR。
- CI 进行静态验证,一个自动化的 Claude 安全审查会检查 diff(防止数据外泄尝试、网络使用、框架篡改、测试集接触),并公开发布其发现。
- 维护者审查代码,然后评论
/verify——这会在网络封锁的 Modal 沙盒中,使用规格 L40S 和全新种子,将你的提交重跑 3 次。所有 3 次运行都必须达到目标;官方时间是平均值。 - 框架会审计适配器参数数量,并重新验证模型/数据内容哈希(防篡改),验证报告会发布在 PR 上,并提交到
records/verifications/,附带接受/拒绝的理由。
完整的协议、评分标准和威胁模型:JUDGING.md · SECURITY.md。
尚未被认领的想法
目前已采用:序列打包 + 仅完成部分掩码(记录 #1)。
- 1-epoch 激进学习率调度
- 数据剪枝(在最难的前 2k 个样本上训练?)
- 块对角/变长打包注意力
- QLoRA NF4 与 bf16 权衡
- rsLoRA / DoRA / PiSSA 初始化
- LoRA+(A/B 的非对称学习率)
- NEFTune 噪声
- 课程学习排序
- 秩/放置位置搜索(仅 MLP 与仅注意力)
- torch.compile
- Unsloth 内核
- Liger 内核
- 融合交叉熵
- 短运行更智能的预热
认领一个想法,击败 6m 05s,让你的名字登上排行榜。
常见问题解答
技术不会过拟合到一个模型和一个任务上吗?这正是为什么有两条使用不同模型系列和任务类型的赛道——并且未来会有更多遵循相同冻结和校准协议的赛道加入。一个只在一条赛道上获胜的技巧可以创造记录,但值得信赖的技术是那些能够迁移的技术。赛道系统将这个问题变成了一个经验性问题,而不是一场争论。
为什么选择 Qwen2.5-1.5B?它不是在数学上预训练的吗?可能吧,就像所有现代基础模型一样。但这并不重要:目标是一个锚点,而不是关于数学发现的声明。比赛本身才是有趣的部分——就像 nanoGPT 极速挑战针对一个任意的验证损失一样。(赛道 2 使用了不同的模型系列 SmolLM2,部分原因就在于此。)
为什么使用挂钟时间而不是 FLOPs 或步数?因为挂钟时间是你实际付出的成本,它迫使内核、数据加载和算法使用相同的货币进行竞争。与 modded-nanogpt 的规则相同。
为什么使用 Modal 上的 L40S 而不是 4090 或 H100?三个原因。它是一个一致的数据中心 SKU,因此时间实际上是可比的(租用的消费�