Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

快速上手

你的第一个目标是做出一个能完成试赛并登上天梯的版本。先从一个你清楚其输入和输出的简单模型开始,再用对局结果来改进它的决策。

你需要准备什么

你需要一个本站登录服务商的账户(登录页面列出了所有服务商)、一种训练并导出 ONNX 模型的方法,以及一份 Ants 的清单。平台只用服务商来让你登录,别无他用。你的公开用户名取自你第一次登录时在服务商那里的登录名,之后即使你在服务商那里改名,它也保持不变。准备参赛模型之前,先查看该游戏的赛季:提交必须落在某个赛季的开放窗口之内,而受限赛季只允许它的参与者参赛。

tinybrains 命令行工具可以进行对局、运行审核的各项检查,并把真实卡带暴露为一个训练环境,这样你的训练循环驱动的就是天梯所用的同一个引擎。安装它只需一条 brew install,或者下载一个发布版本。参加托管的竞赛不需要你自己运行平台。

捷径:从一份可用的参赛模型开始

Tiny-Brains/ants-starter 是一份训练好的 nano 参赛模型,原样提交就能通过审核。它附带生成好的清单、平台会测量的 metrics.json 和 card.md、两个对局文件,以及一个在每次推送时重新检查它的 CI 工作流。

brew tap tiny-brains/cli https://github.com/Tiny-Brains/cli    # 只需一次
brew install tiny-brains/cli/tinybrains                         # 只需一次
git clone https://github.com/Tiny-Brains/ants-starter
cd ants-starter
tinybrains check model.onnx manifest.json      # 审核会给出的结论
tinybrains matches/self-play.json              # 用真实引擎让它和自己对战
pip install -r requirements.txt                # 训练代码,来自 ants 仓库
python train.py                                # 重新训练它:大约一小时

先原样提交它,完整地看一遍整个流程,然后改点什么再重新训练。它是用自己的种子训练的,所以天梯会把它当作一份新的参赛模型;旁边的 models/ 目录里有三个训练好的对手可以陪它练习。

完整流程

1. 训练一个小模型

先阅读 Ants,再决定如何表示观测。例如,一个空间模型可以用几个平面分别表示你的蚂蚁、可见的敌人、食物和已知的水域,然后为每只蚂蚁或每个地图格子输出五个移动得分。

用竞技场提供的信息来训练,条件允许的话就直接对着同一个引擎训练:tinybrains env 可以从 Python 驱动它,这样你永远不用把规则再写一遍。导出为 model.onnx 时,给输入和输出张量命名,以便在清单中引用。在确定架构之前,先查看模型要求和重量级;能导出的计算图仍然可能通不过审核。

2. 编写清单

创建 manifest.json。它按名称、dtype 和形状声明你的计算图的每个输入和输出,并为每个输入附带一个适配器:一个把观测转换成对应张量的小程序。维度可以是一个名称,这样同一份参赛模型就能在任何地图尺寸上比赛。

裁判按游戏公布的通道顺序读取你的策略头(为什么),所以输出端不需要你编写任何程序。清单一章有一个完整的小例子,逐段解读一份真实清单则逐段讲解一份真正能比赛的清单。

用本地检查跑一遍这两个文件。把每张基础地图(2 到 8 个席位,每边 24 到 124 格)、空列表、大蚁群和支离破碎的已知水域掩码都试一遍。确认执行能够返回,并检查运算次数和它产生的动作。

3. 计算两个文件的哈希,或者交给网站

文件名必须严格是 model.onnx 和 manifest.json:平台会为这两个名字签发上传 URL。如果你通过网站提交,可以跳过这一步:/submit 页面会在浏览器中计算两个文件的哈希。要自己计算,就对这些字节原样计算 SHA-256:

# Linux
sha256sum model.onnx manifest.json

# macOS
shasum -a 256 model.onnx manifest.json

计算哈希之后不要再改动文件。提交时写的是 sha256: 后接每个文件的 64 位十六进制哈希值。

4. 创建模型,再向它提交

登录后,在个人主页上用“新建模型”表单创建模型,剩下的交给网站的 /submit 表单:选择模型,选择两个文件,按下按钮。表单会在你的浏览器中计算文件哈希,并把它们直接上传到对象存储,也就是替你完成了第 3 步。

通过 API 则需要两次调用。模型就是你的参赛模型:一个名字,加上你在它名下提交的每个版本。创建它只需一次:

POST /v1/games/ants/models
{ "name": "First try" }

响应中带有 model_id。针对它提交版本:

POST /v1/submissions
{
  "game": "ants",
  "season": "<赛季的 slug;省略则为精选赛季>",
  "model": "<上面返回的 model_id>",
  "weights_hash": "sha256:<64 位十六进制哈希,对应 model.onnx>",
  "manifest_hash": "sha256:<64 位十六进制哈希,对应 manifest.json>"
}

把占位的哈希替换成你自己的。保存返回的 version_id。版本号由平台分配,第一个版本是 v1。

201 响应中带有两个一次性上传 URL,在你使用它们之前什么都不会发生:

curl -T model.onnx    "$MODEL_URL"       # 对应 upload.model_onnx
curl -T manifest.json "$MANIFEST_URL"    # 对应 upload.manifest_json

平台自己不保存任何字节,也不从你那里下载任何东西,所以存储桶为空的版本会以 ARTIFACT_MISSING 被拒绝。它会对收到的文件重新计算哈希,并与你声明的值比较。提交版本介绍会话的使用和错误处理,模型与版本解释为什么是两次独立的调用。

5. 观看试赛

在版本页面上观看,或者读取 GET /v1/me/versions/{version_id},它会显示你自己的版本,无论处于什么状态。它的 phase 区分“等待验证”和“等待试赛”。通过审核的版本变为 verified,试赛成功后变为 active。试赛输了也能通过,但被判负则不通过。试赛只检查你的版本能否正常比赛,它从不改变评分。

被拒绝时会附带 reject_reason。修复指出的问题,重新验证,再把修正后的文件作为下一个版本提交。如果版本仍在等待,再次向同一个模型提交之前,先查看它的阶段和试赛状态:每个模型同一时间只能有一个候选版本在进行中。在此期间你可以向自己的其他模型提交。

遇到问题

到 Discord 提问,参赛者和平台的运营者都在那里交流。带上版本的 id 和它的 reject_reason,或者对局的 id:帮你的人首先要查的就是这些。每个部分的源代码都在 GitHub 上。

接下来读什么

对局、回放和排名解释你的最初几场结果。每次只改进一种行为,并趁提交窗口开放再提交一个版本。平台测试替代版本期间,模型当前参赛的版本会继续比赛,你的其他模型也始终在比赛。

回放可视化(计划中):一份通过审核的参赛模型的试赛,标出它第一次采集食物、一次战斗和最终结果,并在完整回放旁边显示候选版本的视角。