LLM 生成候选 · 异步批量提交 · 选优迭代 — BigModel GLM × Kaggle CIFAR-10 / CIFAR-100
给 LLM 一个训练脚本和当前最优指标,让它自主提出改进方案、生成完整代码;框架自动跑实验、选出最优、喂回下一轮。如此循环,模型在无人干预下持续进化。
LLM 调用走 Batch API:把一批候选请求异步打包提交、等待返回、收集结果,享 5 折成本与批量处理窗口,天然契合这种非实时的优化循环——一次提交 K 个方向,而非串行试错。
本报告最重要的不是"涨了多少分",而是方法论纪律:baseline 必须充分训练(否则增益虚高)、算力必须匹配模型(否则好方案被误判失败)、增益必须对照文献参考线(否则不知道身处何处)。下面两个数据集的实验,每一个数字都经得起这三条检验。
# Population-based Batch 优化循环 for round in range(N): requests = planner.build(best_code, K) # K个候选请求 batch_id = provider.submit(requests) # Batch API 异步提交 responses = provider.poll(batch_id) # 等待批量返回 candidates = sanitize(ast_validate(responses)) # 安全+环境适配 results = run_all(candidates) # 跑实验 best_code = select_best(results) # 选最优 → 下一轮
| 模块 | 职责 |
|---|---|
batch_provider | Anthropic / OpenAI / BigModel 三种 Batch API 抽象 |
patch | AST 安全验证(拦 eval/os.system/shell=True) |
runner | 子进程执行 + 超时 + 环境适配(num_workers、device→GPU) |
planner | focus hints 轮换,构建候选生成请求 |
state / adaptive | 原子持久化 + 自适应调度(学习历史 Batch 耗时) |
训练脚本只需一行协议:print(f"ARB_METRIC: {acc:.4f}")
Kaggle 经典 10 类图像分类。公平 baseline:充分训练的 3 层 CNN,val_acc 0.7579(非 smoke-test)。通过 Batch API 生成 4 个候选,GPU 上跑。
| 候选 | LLM 提出的改进 | val_acc | vs baseline |
|---|---|---|---|
| — | Baseline 3层CNN | 0.7579 | 起点 |
| c0 | BatchNorm | 0.7746 | +1.7pp |
| c1 | 数据增强 RandomCrop+Flip | 0.7992 | +4.1pp |
| c2 ★ | VGG 风格加深 | 0.8370 | +7.9pp |
| c3 | CosineAnnealingLR + 标签平滑 | 0.7743 | +1.6pp |
没有人告诉它"换 CNN 架构"。GLM 读到 baseline,自主判断加深网络能提取更丰富特征,写出 VGG 风格代码——架构级推理,不是超参搜索。
CIFAR-10 · Round 1 观察100 类,比 CIFAR-10 难得多,真正需要 GPU。公平 baseline:充分训练的 4 层 CNN,在云端 Tesla T4 上实测 0.4633。通过 Batch API 生成一轮 6 个候选方向,T4 上跑。
| 候选 | LLM 提出的改进 | val_acc | vs baseline |
|---|---|---|---|
| — | Baseline 4层CNN | 0.4633 | 起点 |
| c0 | BatchNorm | 0.5079 | +4.5pp |
| c1 | 数据增强 | 0.4690 | +0.6pp |
| c2 ★ | ResNet-18(50 epochs) | 0.5132 | +5.0pp |
| c3 | CosineAnnealingLR | 0.4691 | +0.6pp |
| c4 | SGD+Nesterov(lr=0.1) | 0.3825 | −8.1pp |
| c5 | Dropout + 宽分类头 | 0.4326 | −3.1pp |
核心矛盾:Batch API 异步、有延迟、不定时;而优化实验序列依赖(下一轮依赖上一轮)。把"实时贪心搜索"改造成"离线批量进化"。
| 要点 | 说明 |
|---|---|
| 批次要够宽 | 每批 K 个候选(K=8~50)摊薄 Batch 固定延迟;宽而浅 > 窄而深 |
| 两阶段筛选 | 先短 epoch 筛全部,再全量训练 Top-K,解耦"批次宽度"与"执行成本" |
| 投机预提交 | 用筛选阶段赢家提前提交下一轮 Batch,消除等待死时间 |
| 自适应调度 | 记录历史 Batch 耗时,预测最优提交时机(夜间窗口对齐) |
| 状态可续 | batch_job_id 立即落盘,扛 24h 中断与断点续跑 |
| 安全沙箱 | LLM 代码过夜无人值守,AST 校验 + 环境适配不可省 |
必须诚实面对一个问题:Batch API 单独省的钱,是小头。一个优化任务的成本由两块构成——LLM 生成候选代码、GPU 训练实验。Batch API 只打折前者,而后者才是大头。
图 · 单轮成本结构(CIFAR-100 一轮 8 候选,真实量级)
GPU 训练成本 ≈ LLM 调用的 10 倍。Batch API 把 5 折打在占比最小的那块上,省下约 ¥1,仅占总成本 ~5%。
只看「Batch vs 实时」这一层,省得有限——它打折的恰是占比最小的部分。这套方法真正的经济性来自下面三个杠杆,Batch API 是让它们成立的载体。
三个真正的省钱杠杆
| 杠杆 | 省的是什么 | 量级 |
|---|---|---|
| ① 两阶段筛选 | GPU 训练(大头) | K=50 单轮 583→127min,−78% |
| ② 错峰算力 | 非高峰 / spot GPU | spot T4 比按量便宜 60–70% |
| ③ 替代人力 | 工程师手工调参时间 | 1–2 天 → 过夜自动 |
什么时候真划算
| 划算 ✅ | 不划算 ❌ |
|---|---|
| 有持续优化需求(反复迭代) | 一次性 demo,为涨 2 点烧 GPU |
| 模型/数据大,人工调参昂贵 | 小模型本地几分钟能调完 |
| 配两阶段筛选 + spot 算力 | 全量训练 + 按量峰值 GPU |
Batch API 的角色不是「省钱」本身,而是让宽批次 + 错峰 + 离线迭代这套省钱组合成为可能的载体。把它当成"5 折降本"会失望;把它当成"非实时批量优化的高效底座"才对。
成本剖析 · 诚实结论图 A · 同一批候选的训练耗时(真实数据,T4)
⚠ c2 = LLM 自设 50 epochs(38 分钟)。单轮总耗时 ≈ 6 个候选之和,被这一个重候选主导。候选越宽(K 越大),含一个重候选的概率越高,全量训练的代价就越失控。
图 B · 解法 · 两阶段筛选:先短 epoch 筛全部,再全量训 Top-2
| 批次宽度 K | 全量模式 单轮总时 | 两阶段 单轮总时 | 节省 |
|---|---|---|---|
| K = 8 | 93 min | 71 min | −24% |
| K = 20 | 233 min | 87 min | −63% |
| K = 50 | 583 min | 127 min | −78% |
为什么两阶段是必需而非可选:全量模式下,总时间随 K 线性增长(每个候选都付全价训练);两阶段则把绝大多数候选挡在「2 epoch 快筛」阶段,只让 Top-2 幸存者付全量代价。K 越大,被筛掉的重候选越多,省得越多——K=50 时单轮从近 10 小时压到 2 小时。这让「宽批次」(Batch API 的核心优势)真正可行,而不被「重实验」拖死。
在两个 Kaggle 经典数据集上,LLM 都能通过 Batch API 自主提出有效的架构与训练改进:CIFAR-10 用 VGG 加深拿到 +7.9pp(0.7579→0.8370),CIFAR-100 用 ResNet-18 拿到 +5.0pp(0.4633→0.5132)。增益真实、可复现、对照文献参考线合理,无 baseline 注水。
| 验收项 | 结果 | 状态 |
|---|---|---|
| LLM 自主架构改进 | CNN→VGG / CNN→ResNet | 达成 |
| 公平 baseline | 充分训练,非 smoke-test | 达成 |
| 真实增益(对照文献线) | C10 +7.9pp / C100 +5.0pp | 达成 |
| Batch API 闭环 | 提交→轮询→执行→迭代 | 达成 |
| 双数据集验证 | CIFAR-10 + CIFAR-100 | 达成 |
下一步: