Experiment Template
- Blog prose for an outside reader (load
writing:style): no run names, arm codes or flags; say what each setup does. - The title names what the experiment measures, never its result; the card uses it. Cards run newest first, the grey template card last.
- English and Chinese for every text element.
- No standfirst and no Takeaways until right before publishing; the Takeaways sentence is also the page's description (meta); cards carry no text.
- While runs go on, the draft is a dashboard: every running or planned figure is already on the page with its axes, legend and a status word (Running, Queued, Planned), and fills in when its runs finish. A figure whose runs are dropped is deleted. Publish only when no placeholder is left.
- The page opens with the cover animation alone: no section, no heading, no caption, not in the side contents. Then the sections in order: Setup, Experiments, Takeaways, Related work, Acknowledgements, Experiment record, Citation. The side contents lists every section and, under Experiments, every question.
- 写给外部读者的博客(先加载
writing:style):不出现 run 名、分组代号或开关名,说清每种做法做了什么。 - 标题写实验衡量什么,不写结果;卡片用同一标题。卡片按新到旧排,灰色模板卡片放最后。
- 每个文字元素都有中英两版。
- 导语和 Takeaways 留到发布前再写;Takeaways 那一句同时用作页面简介(meta);卡片上不放文字。
- 作业还在跑时,草稿就是看板:运行中或计划中的图先放上页面,画好坐标轴和图例,面板中间写状态(运行中、排队中、计划中),作业跑完就填上数据。不再跑的图直接删掉。没有占位图了才发布。
- 页面以封面动画开头,只放动画:不作为一节,没有标题和图注,也不列入侧边目录。之后各节顺序:Setup、Experiments、Takeaways、Related work、Acknowledgements、Experiment record、Citation。侧边目录列出每一节,并在 Experiments 下列出每个问题。
- Cover: a schematic of the setup, never a result, used only as the card picture. Inline SVG 1600×1000, no text, in the site's Epoch style (owner, 2026-10-12; the outlined look): white ground, flat GM2 fills inside a grey 700
#5F6368outline (grey 100#F1F3F4at rest, blue 50#E8F0FEreached), Google blue#1A73E8for what moves or matters, blue 300#8AB4F8for inputs, near-black#202124for the fixed or target part, which takes no outline; no wobble filter and no offset fills. The primitives are intools/exp-art/style.js. - Card picture: the homepage and Experiments card shows an abstract picture, not the schematic, in a low-poly style (owner, 2026-10-14, picked from 50 styles; it replaces the Josef Albers squares of 2026-10-13): a faceted landscape seen from above, inside 120 px margins: a height field draws the setup abstractly (peaks, ridges, terraces, a plateau), a jittered triangle mesh samples it, and each triangle takes one GM2 tone (blue ramp, or the grey ramp for parts at rest) chosen by its height and by how much it faces the light from the upper left; no tone is interpolated. Redrawn from scratch the same day so that no card keeps an Albers layout. The generator is
tools/exp-art/lowpoly_cards.py; add a card as one field function there. The cover animation on the page stays the literal schematic. - Animation: the same picture in motion, one part per setup, dots for the current part, no text or caption. A page with
render(t)andwindow.Tdrawn withstyle.js, rendered bytools/exp-art/render_anim.py, placed asfigure.ar-video#overview, first on the page. A picture or animation still drawn in the old Anthropic style goes throughtools/exp-art/restyle_svg.py(inline SVG) orrender_anim.py --restyle(animation pages), which map it to this style. - Content: the cover carries the whole setup: every role or part, what passes between them, and the variable the page compares, so a reader can tell the experiment from the picture alone; a row of unrelated icons is not enough (owner, 2026-10-04).
- One style: every other illustration or animation on the page (setup schematics, step-by-step explainers) uses the cover's style: the same palette and grey outlines, moving tokens instead of arrows, and as few labels as possible (owner, 2026-10-04; style changed 2026-10-12).
- Card: the cover picture, the date and the title, with no text below them: no description and no Takeaways (owner, 2026-10-04).
- 封面:实验做法的示意图,不画结果,只用作卡片图。内联 SVG,1600×1000,无文字,用网站的 Epoch 风格(作者,2026-10-12,有轮廓线的版本):白底,GM2 纯色块加灰 700
#5F6368轮廓(静止的部件用灰 100#F1F3F4,已经到达的用蓝 50#E8F0FE),移动的和要比较的部分用 Google 蓝#1A73E8,输入用蓝 300#8AB4F8,固定的或目标部分用近黑#202124,深色块不加轮廓;不用抖动滤镜,不用偏移色块。绘图函数在tools/exp-art/style.js。 - 卡片图:首页和 Experiments 列表的卡片用抽象图,不用示意图,画法是低多边形(作者,2026-10-14,从 50 种风格中选出,取代 2026-10-13 的 Josef Albers 方块):四周留 120 px 边距,画面是从上往下看的一片多面体地形:用一个高度场抽象地画出实验做法(山峰、山脊、台地、平台),用随机错开的三角网格取样,每个三角形按它的高度和朝向左上方光源的程度取一个 GM2 色阶(蓝色系,静止的部分用灰色系),不插值。同日彻底重画,任何卡片都不再沿用 Albers 的构图。生成脚本是
tools/exp-art/lowpoly_cards.py,新卡片在其中加一个区域函数。页面里的封面动画仍是写实的示意图。 - 动画:同一张图动起来,比较几种做法就分几段,小点表示当前段,没有文字和图注。页面用
style.js绘制,提供render(t)和window.T,用tools/exp-art/render_anim.py渲染,放成figure.ar-video#overview,页面第一项。还是旧 Anthropic 风格的图或动画,用tools/exp-art/restyle_svg.py(内联 SVG)或render_anim.py --restyle(动画页)转换成这种风格。 - 内容:封面要画出完整的实验设置:每个角色或部件、它们之间传递什么、本页比较的变量,让读者只看图就知道实验在做什么;一排互不相关的小图标不够(作者,2026-10-04)。
- 同一风格:页面上其他所有插图和动画(做法示意图、分步讲解动画)都用封面的风格:同样的配色和灰色轮廓,用移动的小圆点代替箭头,文字标签越少越好(作者,2026-10-04;2026-10-12 换成新风格)。
- 卡片:只有封面图、日期和标题,下面不放文字:不放简介,也不放 Takeaways(作者,2026-10-04)。
Setup设置
[The baseline exactly, its name linked to the original recipe: the recipe and the sizes it covers. What we change, and the metric.] Code
【准确写出基线,名字链接到原始配方:配方和它覆盖的规模。改了什么、用什么指标衡量。】代码
--- baseline [function] (simplified)+++ ours (simplified; the Code link has the real code) [unchanged line]-[baseline line]+ # [what this step does]+[our line]
- One or two sentences: the baseline by its exact name, linked to the original recipe at a fixed commit, with the full range of sizes it covers; what we change; the metric, with the compute axis defined once. Sizes and tokens of the runs go to the figures. End with a link to the exact public commit of the runs.
- One diff of the core change and of any switch the figures compare, rewritten for reading: baseline red, ours green, simplified alike, one comment per changed step in each language, a header saying it is simplified. Rendered by
make_diff_html.py(Pygments, inline mode) between thediff:SLUGmarkers. - Controls that need no code change go in the captions of the figures that use them.
- 一两句话:写准基线名字,链接到原始配方的固定提交,并写出它覆盖的全部规模;写改了什么;写指标,并在这里定义一次算力轴。本实验跑的规模和 token 数归图。最后链接到实验所用的公开提交。
- 一个 diff,只放核心改动和图中比较的开关,改写成最好读的样子:基线标红,我们的标绿,两边同样简化,每个改动步骤配一行中英注释,文件头注明已简化。由
make_diff_html.py(Pygments,inline 模式)生成在diff:SLUG标记之间。 - 不改代码的对照组写在用到它的图的图注里。
- One branch per experiment on the public fork
wenhaochai/marin-pli, named after the slug, carrying the history as it was run. - In a fresh clone,
scrub.sh(git filter-repo) replaces only the cluster user, group directory and Slurm account withUSER,GROUPandgroup, in contents, archives, file names and messages. Scan every blob and archive member until keys and identifiers are zero. The private original stays onarchive. A.gitignoreblock keeps credentials and job output out. - Each public push needs the owner's approval, or a standing approval the owner gave for that branch; either way, push only when both scans are zero. Code links go live after the push.
- 每个实验一个分支,推到公开的
wenhaochai/marin-pli,分支名用 slug,历史保持实际运行时的样子。 - 在新克隆里用
scrub.sh(git filter-repo)只把集群用户名、组目录和 Slurm 账户换成USER、GROUP和group,文件内容、压缩包、文件名和提交信息都换。扫描所有文件和压缩包成员,直到密钥和标识都为 0。私有原始历史留在archive。.gitignore挡住凭据和作业输出。 - 每次公开推送都要作者批准,或者作者已对这个分支给了长期授权;两种情况都只在两项扫描都为 0 时才推。推送后代码链接才生效。
Experiments实验
Answered已有结论[First question]【第一个问题】
[The answer in one or two sentences, e.g. "Yes: our run follows the paper's curve."]
【一两句话的结论,例如“能复现:我们的 run 一路跟住论文的曲线。”】
Testing检验中[Question the results raised]【结果引出的问题】
- Experiments is organized by question: each subsection is titled with the question its figures answer, in the order the questions came up, so the page shows how the work went. A tag before the title gives its status: Answered or Testing.
- An Answered question is followed at once by its answer, one or two sentences in words, at the altitude the figures support (e.g. "Yes: our run follows the paper's curve."), without supporting numbers; the tag alone is not enough (owner, 2026-10-04). A Testing question gets its answer when it turns Answered.
- Each subsection opens with a schematic, in the cover style, of the setups it introduces: one panel per setup, controls included, each with its name and one sentence; tags mark the main setup (Main) and the setup it is measured against (Baseline). A setup drawn in an earlier subsection is not drawn again.
- The first figure compares every setup on the raw metric with the baseline; a setup equal to the baseline by construction is left out. Each later figure makes one point, with the data processed around it. Once the page settles on a setup, later scales and variants follow that setup only.
- A title names what is plotted and never an axis or the comparison the y axis already states: no "against backbone compute", "by training tokens", "during training", "against the baseline" or "X minus Y", since the axis labels already say it.
- The compute axis is backbone compute 6ND: N the parameters of the layers counted, without the embedding and the heads; D the training tokens.
- A model outside the baseline's named sizes gives its shape in the title (layers, width) and its MLP width, heads and parameter counts (backbone, embedding, heads) in the caption.
- Charts are
figure.vizdrawn byassets/article-charts.jsfrom a generated file inassets/data/, never typed numbers, under thewriting:plotrules. Titles and captions in both languages; no running text in Experiments that lists numbers or restates what a figure shows: each figure's title and caption carry its point. - Every caption states, in this order: the motivation (the question the figure answers and why it comes at this point of the page), what is plotted, and what the figure shows, in words, without the numbers that support it (the chart carries them). A placeholder's caption states the motivation and what the figure will test.
- 实验部分按问题组织:每个小节的标题是它的图所回答的问题,按问题出现的先后排列,让页面呈现研究推进和修正的过程。标题前用标签写状态:已有结论或检验中。
- 标为“已有结论”的问题,标题后紧接着用一两句话写出结论:用文字说图里得出了什么,说到证据支持的程度为止(例如“能复现:我们的 run 一路跟住论文的曲线。”),不配支撑数字;只有标签不够(作者,2026-10-04)。“检验中”的问题在改标为“已有结论”时再写结论。
- 每个小节开头放一张封面风格的示意图,只画本小节引入的做法:每种做法一格,包括对照组,每格配名字和一句话;用标签标出主做法和它所对照的基线。前面小节画过的做法不再重画。
- 第一张图用原始指标比较所有做法和基线;按构造等于基线的做法不画。之后每张图只讲一件事,数据围绕它处理。页面定下主做法以后,更大规模和变体实验只跑这一种做法。
- 标题只写画了什么,不写坐标轴:不写“与骨干算力”“按训练 token”“训练过程中”这类话,坐标轴标签已经写了。
- 算力轴用骨干算力 6ND:N 是计入的各层参数量,不算 embedding 和头;D 是训练 token 数。
- 基线命名规模之外的模型,标题写形状(层数、宽度),图注写 MLP 宽度、头数和参数量(骨干、embedding、头)。
- 图用
figure.viz,由assets/article-charts.js根据assets/data/里脚本生成的文件绘制,数字不手填,遵守writing:plot。标题和图注中英双语;实验部分不写罗列数字、复述图中结果的正文:每张图的结论由它的标题和图注说清。 - 每张图的图注按顺序写清:动机(这张图回答什么问题、为什么放在页面的这个位置)、画了什么、这张图表达了什么;只用文字,不配支撑数字(数字由图本身给出)。占位图的图注写动机和这张图将要检验什么。
Takeaways核心结论
[Empty while drafting. Right before publishing: one precise sentence with the result, negatives included; the same sentence is the page's description.]
【起草时留空。发布前再写:一句准确的话给出结果,负面结果也写;同一句话用作页面简介。】
Acknowledgements致谢
The author is pleased to acknowledge that the work reported on in this post was substantially performed using the Princeton Research Computing resources at Princeton University. Princeton Research Computing is a consortium of groups including the Princeton Institute for Computational Science and Engineering (PICSciE) and Research Computing at Princeton University.
本文报告的工作主要使用普林斯顿大学 Princeton Research Computing 的计算资源完成。Princeton Research Computing 是由普林斯顿计算科学与工程研究所(PICSciE)和普林斯顿大学 Research Computing 等团队组成的联合体。
Experiment record实验记录
| Setup做法 | [Config配置] | [Varied variable被改变的变量] | TokensToken | H100sH100 | Hours小时 | Figures图 | Code代码 | W&B |
|---|---|---|---|---|---|---|---|---|
| [Setup in words]【用文字写的做法】 | [130m] | [6] | [2.6B] | [4] | [3.1] | [1, 2] | code代码 | run运行 |
| Main runs: [X] H100-hours, [N] jobs正式的 job:[X] H100·时,[N] 个 job | ||||||||
| Other compute: [X] H100-hours, [N] jobsOther compute:[X] H100·时,[N] 个 job | ||||||||
- No text above the table. One row per training run behind the page, generated by
build_record.pyintoassets/data/SLUG-record.jsand drawn by the page: finished runs from W&B, queued and running jobs fromsacct(which fails loudly rather than guess), the rest planned. Never typed. Only main runs get rows. The table ends with two lines, "Main runs: X H100-hours, N jobs" and then "Other compute: X H100-hours, N jobs", counted fromsacctover every GPU job of the project (H100-hours = GPUs x elapsed), so the two add up to everything the page cost. A job is a main run job if it belongs to a run that has a row in the table, every resume segment included. Everything else is other compute: smoke tests, debug runs, superseded versions, abandoned runs, probes not on the page (owner, 2026-10-05). A packed job (several tasks in one allocation: smoke then run, runs in order, or two 4-GPU runs side by side) writes a task ledger,logs/packed/JOBID.tsv, one line per task: task, run, main or other, GPUs, start, end, exit code. ItssacctH100-hours are split by the ledger: each task's GPUs x its wall time goes to its run's line, smoke copies and failed tasks to other compute, and the remainder (startup, gaps, GPUs a task left idle) to other compute, so the two lines still add up to thesaccttotal. The job counts once, as a main run job if any of its tasks is (owner, 2026-10-07). - Columns follow the topic: the setup in words, then each variable the page varies in a column of its own (layers on a depth page), then H100s, hours, figures, code and W&B. No state column; H100-hours appear only in the two closing lines.
- Figures link to the figures on the page (figure n is the n-th
figure.viz). Code links to the public commit the run used: the commit W&B recorded, mapped through the scrub's commit map. The links are for tracing a run afterwards, not for monitoring it (owner, 2026-10-04): every finished run links both, and a queued or running run may leave them empty until it finishes; never create a W&B page ahead of a run. W&B links are absolute. Both open in a new tab. - Every finished run appears in at least one figure; a run in no figure gets a figure or leaves the page.
- On phones no column is hidden: the setup column narrows and wraps, and the table fits without sideways scrolling at 420, 375 and 360 px in both languages.
- 表格上方不写说明文字。页面背后的每个训练 run 一行;由
build_record.py生成到assets/data/SLUG-record.js,再由页面绘制:已完成的 run 取自 W&B,排队和运行中的作业取自sacct(取不到就报错,不猜),其余标为计划中。不手填。只有正式的 run 占行。表格最后两行依次写“正式的 job:X H100·时,N 个 job”和“Other compute:X H100·时,N 个 job”,从sacct统计项目的全部 GPU job(H100·时 = GPU 数 × 运行时长),两行相加就是这个页面的全部花费。属于表格中某个 run 的 job(包括它的每一段续跑)算正式的 job;其余都算 other compute:冒烟测试、调试、被替换的旧版本、放弃的 run、不在页面上的探针(作者,2026-10-05)。打包的 job(一个分配里跑多个任务:先 smoke 再训练、按顺序跑几个 run、或两个 4 卡 run 并排跑)要写任务台账logs/packed/JOBID.tsv,每个任务一行:任务、run、正式或 other、GPU 数、开始、结束、退出码。它在sacct里的 H100·时按台账拆分:每个任务的 GPU 数 × 运行时长记到它的 run 那一行;smoke 副本和失败的任务记到 other compute;剩下的部分(启动、任务之间的空隙、任务没用上的 GPU)也记到 other compute。这样两行相加仍等于sacct的总数。这个 job 只算一个;只要有一个任务是正式的,它就算正式的 job(作者,2026-10-07)。 - 列按研究话题来定:先是用文字写的做法,然后页面改变的每个变量单独一列(研究深度的页面就有层数列),再是 H100 数、小时、图、代码和 W&B。不设状态列;H100·时只写在最后两行。
- “图”链接到页面上的图(第 n 张图是第 n 个
figure.viz)。“代码”链接到这个 run 所用的公开提交:取 W&B 记下的提交号,按清除时的对照表换成公开提交号。这两种链接用于事后追溯,不用于监控(作者,2026-10-04):每个跑完的 run 两种链接都要有;排队或运行中的 run 可以先空着,跑完再填;不要为还没开跑的 run 预先建 W&B 页面。W&B 链接用绝对地址。两种链接都在新标签页打开。 - 每个完成的 run 至少出现在一张图里;不在任何图里的 run,要么补一张图,要么从页面上去掉。
- 手机上不隐藏任何列:收窄“做法”列并换行;在 420、375、360 像素下,中英文两版的表格都不需要横向拖动。
Citation
@misc{chai2026SLUG,
title = {[Title]},
author = {Chai, Wenhao},
year = {2026},
howpublished = {Blog post},
url = {https://wenhaochai.com/blogs/SLUG.html}
}