关于 marimo-batch
marimo-batch 是一项将 marimo 笔记本改造成可配置批处理作业的技能,面向运行机器学习或其他参数化任务的笔记本用户。它涵盖 UI 与命令行参数、环境配置及可选的网格搜索。
主要功能
- 01用 Pydantic 定义批处理参数
- 02通过 marimo UI 和命令行传参
- 03使用 EnvConfig 配置环境变量
- 04设置可选的网格搜索任务
适用场景
- 01按指定命令行参数运行笔记本
- 02用较小参数快速检查笔记本
- 03抽样并启动超参数组合任务
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ marimo-team/ skills --skill marimo-batch安装后在 Claude Code 中输入/marimo-batch确认已加载。
附带文件references/grid.pyreferences/starting-point.py
详细介绍
Pydantic 是声明批处理任务事实来源的绝佳方式,尤其适用于 ML。你可以声明如下内容:
from pydantic import BaseModel, Field
class ModelParams(BaseModel):
sample_size: int = Field(
default=1024 * 4, description="Number of training samples per epoch."
)
learning_rate: float = Field(default=0.01, description="Learning rate for the optimizer.")
你也可以通过两种方式填写这些模型参数,还可以想象一下 UI 中的表单。
el = mo.md("""
{sample_size}
{learning_rate}
""").batch(
sample_size=mo.ui.slider(1024, 1024 * 10, value=1024 * 4, step=1024, label="Sample size"),
learning_rate=mo.ui.slider(0.001, 0.1, value=0.01, step=0.001, label="Learning rate"),
).form()
el
不过,你也可以使用 marimo 的 CLI。
if mo.app_meta().mode == "script":
if "help" in mo.cli_args() or len(cli_args) == 0:
print("Usage: uv run git_archaeology.py --repo <url> [--samples <n>]")
print()
for name, field in ModelParams.model_fields.items():
default = f" (default: {field.default})" if field.default is not None else " (required)"
print(f" --{name:12s} {field.description}{default}")
exit()
model_params = ModelParams(
**{k.replace("-", "_"): v for k, v in mo.cli_args().items()
})
else:
model_params = ModelParams(**el.value)
现在,用户可以通过命令行运行:
uv run notebook.py --sample-size 4096 --learning-rate 0.005
这样就能兼顾两全:你可以使用 UI 进行测试和迭代,然后使用 CLI 运行批处理任务。另一个好处是,你可以使用相关设置运行笔记本,以便快速检查笔记本中是否存在错误。
用户希望使用这种模式运行笔记本,因此请务必询问用户希望通过 CLI 配置哪些参数,然后再对笔记本进行相应修改。修改前,请务必先让用户确认这些更改。
Weights and Biases
用户可能有兴趣添加对 weights and biases 的支持。请务必确认用户是否有此需求(是/否)。如果有,请确保记录这些 ModelParams。还要确保将 wandb_project 和 wandb_run_name 纳入 ModelParams(如果用户希望采用这种方案)。
如果用户希望启动 ML 训练任务,请务必使用这个起点。请确保保留此笔记本中的列!
Environment Variables
你可能需要读取任务的环境变量。如果 .env 文件存在,请使用 python-dotenv 读取;同时还要添加一个 EnvConfig,以便用户可以在 UI 中手动添加键。
from wigglystuff import EnvConfig
# With validators
config = EnvConfig({
"OPENAI_API_KEY": lambda k: openai.Client(api_key=k).models.list(),
"WANDB_API_KEY": lambda k: wandb.login(key=k, verify=True)
})
# Block until valid, useful in cell that needs the key
config.require_valid()
# Access values
config["OPENAI_API_KEY"]
config.get("OPENAI_API_KEY", "some default")
请务必在笔记本顶部添加此 EnvConfig。
Columns
较大的 marimo 笔记本通常会使用 columns 功能,以便于导航。如果是这种情况,必须保留这些列!
@app.cell(column=0, hide_code=True)
def _(mo):
mo.md(r"""demo""")
Compute platform
当任务准备好使用大量算力时,请务必遵循良好的实践。考虑数据集的批次大小,并确保提供充足的日志,以便用户发现可能出现的问题。
Grid search
当用户希望运行超参数扫描时,请引导他们使用这个网格启动器。它可以直接与 references/starting-point.py 中的笔记本配合使用:它会从与笔记本 ModelParams 字段匹配的搜索空间中随机抽取组合,并将每个组合作为独立任务启动。
默认情况下,脚本会进行试运行(uv run grid.py),以便用户在消耗算力前检查这些组合。传入 --launch 可实际提交任务。--count 和 --seed 标志分别用于控制抽取的组合数量和 RNG 种子。
此参考方案使用 Hugging Face Jobs 作为计算提供方,但这只是其中一种选择。用户可以将其替换为 Modal、RunPod,或任何能够运行 uv 脚本的其他提供方。