marimo-batch

marimo-batch

热门

一个用于准备 marimo 笔记本以进行定时运行的固执己见的技能。

161Star
14Fork
更新于 2026/6/15
SKILL.md
readonly只读
name
marimo-batch
description

一个用于准备 marimo 笔记本以进行定时运行的固执己见的技能。

Pydantic 是声明批处理作业事实来源的好方法,尤其适用于机器学习。你可以声明如下内容:

from pydantic import BaseModel, Field

class ModelParams(BaseModel):
    sample_size: int = Field(
        default=1024 * 4, description="每个训练周期的训练样本数。"
    )
    learning_rate: float = Field(default=0.01, description="优化器的学习率。")

你也可以通过两种方式填充这些模型参数,可以想象在 UI 中有一个表单。

el = mo.md("""
{sample_size} 
{learning_rate}
""").batch(
    sample_size=mo.ui.slider(1024, 1024 * 10, value=1024 * 4, step=1024, label="样本大小"),
    learning_rate=mo.ui.slider(0.001, 0.1, value=0.01, step=0.001, label="学习率"),
).form()
el

但你也可以使用 marimo 的命令行界面。

if mo.app_meta().mode == "script":
    if "help" in mo.cli_args() or len(cli_args) == 0:
        print("用法: uv run git_archaeology.py --repo <url> [--samples <n>]")
        print()
        for name, field in ModelParams.model_fields.items():
            default = f" (默认: {field.default})" if field.default is not None else " (必填)"
            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_projectwandb_run_name 是 ModelParams 的一部分。

如果用户希望启动机器学习的训练作业,请确保使用这个起点。确保在此笔记本中保持列完整!

环境变量

你可能需要为作业读取环境变量。使用 python-dotenv 读取 .env 文件(如果存在),但也要添加一个 EnvConfig,以便用户可以在 UI 中手动添加密钥。

from wigglystuff import EnvConfig

# 带验证器
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)
})

# 阻塞直到有效,在需要密钥的单元格中有用
config.require_valid()

# 访问值
config["OPENAI_API_KEY"]
config.get("OPENAI_API_KEY", "some default")

确保将此 EnvConfig 添加到笔记本的顶部。

较大的 marimo 笔记本通常使用列功能来方便导航。如果是这种情况,你必须保持这些列完整!

@app.cell(column=0, hide_code=True)
def _(mo):
    mo.md(r"""demo""")

计算平台

当作业准备进行大规模计算时,务必牢记良好实践。考虑数据集的批次大小,并确保有足够的日志,以便用户在出现问题时能够发现。

网格搜索

当用户想要运行超参数搜索时,请将他们指向这个网格启动器。它开箱即用地与 references/starting-point.py 中的笔记本配合使用:它从与笔记本的 ModelParams 字段匹配的搜索空间中随机采样组合,并将每个组合作为单独的作业启动。

默认情况下,脚本执行空运行(uv run grid.py),以便用户在花费计算资源之前检查组合。传递 --launch 以实际提交作业。--count--seed 标志控制要采样的组合数量和 RNG 种子。

该参考使用 Hugging Face Jobs 作为计算提供者,但这只是一个选项。用户可以将其替换为 Modal、RunPod 或任何其他可以运行 uv 脚本的提供者。