Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

重量级

TinyBrains 按你提交的两个文件的大小给参赛模型分组。重量级由审核分配,不由你在提交时选择。每个参赛中的作品都带有一个评分,位于无差别级天梯上。

重量级由赛季决定

每个赛季声明自己的大小限制,所以请从你要参加的赛季中读取;本页展示的是默认值。API 在它报告的每个赛季上都会返回这些限制:GET /v1/games/{game} 和 GET /v1/games/{game}/seasons 都带有 weight_classes 表。网站在首页和你的参赛模型旁显示它们。赛季也可以只开放部分重量级。一个专注的赛季可能只开 Nano,模型若测量后落入赛季未开放的重量级,审核会以 CLASS_NOT_OFFERED 拒绝,这与对每个重量级都过大是不同的拒绝原因。

以下是平台的初始限制,新赛季默认沿用上一赛季的限制:

重量级实测大小上限memory_flat_bytesmemory_cell_bytes
Nano(nano)16 KiB = 16,384 字节00
Micro(micro)128 KiB = 131,072 字节00
Mini(mini)1 MiB = 1,048,576 字节00
Small(small)8 MiB = 8,388,608 字节00
Large(large)64 MiB = 67,108,864 字节00

最后两列是该重量级的记忆。0 和 0 表示没有记忆,这也是默认值。

限制包含边界值。按上表,16,384 字节的作品是 Nano,16,385 字节的是 Micro。超过赛季开放的最大重量级的作品,对该赛季来说就太大了。

重量级限制的是大小和允许的记忆。没有哪个重量级限制算力,或配给你的计算图可以做多少运算。约束它的是游戏的回合时限:Ants 为 1,000 ms,而且只属于你,因为每个席位是各自独立的调用。来不及作答的计算图会错过该回合并受到一次判罚。审核会报告你在参考集上的推理时间,只有当它在你的 probe_dims 下的探测根本放不进一个回合时,才会因时间拒绝你。

大小限制属于赛季,所以重量级内的成绩在同一赛季内可比,跨赛季只有在限制相同时才可比。Nano 限制不同的两个赛季是两场不同的比赛,排名会注明各自是在什么限制下进行的。

记忆

重量级可以允许模型在回合之间携带记忆。赛季重量级表中的两个数字规定能带多少,在 rows × cols 个格子的地图上,上限为

memory_flat_bytes + memory_cell_bytes × rows × cols

它们由赛季设定,默认都是 0,即没有记忆:在这样的重量级里声明了记忆输出的模型,审核会以 MEMORY_NOT_ALLOWED 拒绝。在 API 中,赛季 weight_classes 的每一项在 max_bytes 旁带有 memory_flat_bytes 和 memory_cell_bytes,缺少它们的项表示 0。网站凡是显示重量级大小限制的地方,都会在旁边显示它的记忆,地图页面则显示这在每张地图上允许多少。赛季一旦开始,重量级就固定下来,所以在某个上限下通过审核的模型整个赛季都在该上限下比赛。

赛季最多允许 262,144 字节的固定部分,外加每格 16 字节。审核会按最小和最大的地图计算你的记忆开销,详见上限;而且记忆不计入你的大小:重量级仍由两个文件的字节数决定。

能装下多少参数

度量统计的是原始字节,中间没有压缩,所以能装下的参数数量取决于你导出时使用的 dtype:

初始化器 dtype每个参数的字节数相对容量
float3241.00x
float1622.00x
int814.00x

以 float16 导出权重能让重量级容纳的模型翻倍,而代价小到你察觉不到。在每个初始化器的使用处把它转换回来,让计算图的计算保持在 float32;运行时优化执行计划时会把这次转换折叠掉。不需要新的算子,因为 Cast 在允许列表上。在一次实测对比中,float16 计算图在三场对局的每一只蚂蚁上都选出了与 float32 相同的走法。

先减去你的清单。基线的清单是 930 字节:占 Nano 预算的 6%,在更大的重量级里可以忽略不计。

两个完整示例,来自平台自己的基线:

参数model.onnxmanifest.jsonS'占上限
nano-bc3,00611,35093012,280Nano 的 75%
micro-bc24,07753,49593154,426Micro 的 42%

时限比重量级更早限制大模型

表格的上端很宽裕,而回合很紧。你的席位独占整个回合:1,000 ms,每个席位一次 model_infer 调用,各有自己的时限。即便如此,在最大的 Ants 地图上,全卷积网络耗尽回合时间远早于耗尽字节。要填满 Mini 及以上的重量级,把参数花在每回合开销更低的地方:降低分辨率,或者放进计算图无需乘法即可读取的查找表。同一网络单纯加宽的版本会先耗尽回合时间。

卷积在每个格子上都应用全部参数,所以字节数和运算量同步增长,任何调参都无法把它们分开:一个参数在每个格子上花费一次乘加,即 2 × cells 次算术运算,卷积核大小、分组和 dtype 都不会改变这个比例。重量级上限是字节预算,回合是运算预算,两者在不同的规模上耗尽。

审核只拒绝在其 probe_dims 下探测耗时超过一个回合的模型(PROBE_TOO_SLOW)。装得下但跑得接近临界的模型要到对局里才会发现问题,那里每错过一个回合就是一次判罚。

审核如何决定重量级

大小度量是 bytes(model.onnx) + bytes(manifest.json)。审核在你提交到的那个赛季里选择大小限制能容纳这个总和的最小重量级。审核不做第二次检查,也绝不会因为算力把你挪到别的重量级,因为重量级不配给算力。

直接测量这两个文件的字节数。按参数数量估算会漏掉计算图元数据、导出器的节点名称和清单本身的长度,而这些都算在内;清单变大可能把一个没有改动的网络推进下一个重量级。

无差别级天梯

无差别级是唯一的评分天梯,涵盖所有大小。每个参赛模型在它上面只有一个评分,每场对局都更新这一个评分,无论配对的是哪些重量级。

重量级是无差别级的一个视图:它把你和同一大小级别的版本放在一起排名,用的是同一个评分而不是单独的评分。所以不同大小的参赛模型直接在无差别级上比较,而查看重量级视图可以了解你在同等体量的对手中排在哪里。

选择参赛的模型

从一个你能训练、检查和运行而不出意外的模型开始。尽早测量大小,为更大的观测留出算子预算余量,并盯住推理时间与回合时限的差距。在针对某个边界做优化之前,先在每张基础地图上验证(它们合起来覆盖游戏的全部限制)。

重量级内没用完的字节不会带来任何加分。大小是你做工程时要对抗的约束,而排名来自对局结果。比较不同修订版时,既看实测大小,也看对局表现。