全部任务 (Kubernetes)
使用 Kubernetes 集群运行完整的 EdgeBench 任务套件(约 50 个任务)。
前提条件
| 要求 | 验证方式 |
|---|---|
已配置 kubectl 的 Linux 主机 | kubectl cluster-info |
| NetworkPolicy 支持(网络隔离需要) | CNI 支持并执行 NetworkPolicy;kubeconfig 有在目标 namespace 创建/删除 NetworkPolicy 的权限 |
| Docker Engine(用于推送镜像) | docker run hello-world |
| Python >= 3.10 | python --version |
| K8s 节点可访问的容器镜像仓库 | 如 <registry-ip>:5000 |
操作步骤
1. 安装 SForge
pip install sforge2. 获取任务定义
sforge fetch-tasks edgebench
sforge list # 确认任务可见3. 推送镜像到集群仓库
K8s Pod 在运行时拉取镜像。从 Docker Hub 等公共仓库拉取速度太慢,会严重影响 Agent 性能——每个任务的镜像拉取可能需要数分钟,占用评测时间预算。应当事先将 所有镜像推送到与 K8s 集群在同一 VPC 内的私有仓库。
# 从公共仓库拉取预构建镜像
sforge pull --all --registry seededge
# 推送到私有仓库
sforge push --all --registry <registry-ip>:5000验证镜像是否已入库:
curl -s http://<registry-ip>:5000/v2/_catalog | head自建私有 Docker Registry
如果还没有私有仓库,可以用一行命令启动:
docker run -d -p 5000:5000 --restart=always --name registry registry:2配置信任 HTTP 仓库: Docker 默认只信任 HTTPS 仓库。对于局域网内的 HTTP 仓库,需要在每台推送/拉取的机器(包括 K8s 节点)上配置信任:
编辑
/etc/docker/daemon.json(不存在则创建):json{ "insecure-registries": ["<registry-ip>:5000"] }重启 Docker:
bashsudo systemctl restart docker使用 containerd 的 K8s 节点,需要在集群内每个节点上修改
/etc/containerd/config.toml(Pod 可能被调度到任意节点):toml[plugins."io.containerd.grpc.v1.cri".registry.configs."<registry-ip>:5000".tls] insecure_skip_verify = true然后重启 containerd:
sudo systemctl restart containerd
4. 启动 Judge 服务器
启动 Judge 服务器,--judge-url 设置为本机 IP 地址,确保 K8s Pod 可以 访问(不能用 localhost 或 host.docker.internal):
sforge serve --port 80805. 配置 LLM 评分任务
college_english_exam_bank 任务使用 LLM 评分,其 Judge 容器需要调用模型 API。通过 SFORGE_JUDGE_EXTRA_ENV 传入凭证。
在启动 Judge 服务器前设置:
export SFORGE_JUDGE_EXTRA_ENV="SFORGE_JUDGE_API_KEY=your-key,SFORGE_JUDGE_API_BASE_URL=https://api.openai.com/v1,SFORGE_JUDGE_MODEL=gpt-5.5"
sforge serve --port 8080| 变量(Judge 容器内) | 用途 |
|---|---|
SFORGE_JUDGE_API_KEY | 评分脚本调用 LLM 的 API 密钥 |
SFORGE_JUDGE_API_BASE_URL | 评分用 LLM 端点的 Base URL |
SFORGE_JUDGE_MODEL | 评分脚本使用的模型 ID |
非评分任务会忽略这些变量,因此可以统一设置。
6. 运行实验
experiment.yaml 定义了完整的 EdgeBench 套件——所有任务、 单任务覆盖、模型配置和资源限制。详见下方 实验 YAML 说明。
sforge run --experiment experiment.yaml \
--judge-url http://<judge-host-ip>:8080 \
--run-id edgebench-001所有任务会在 600 秒内依次启动(间隔均匀分配给每个任务)。查看进展:
sforge visualizer
# 打开 http://127.0.0.1:8000也可以查看特定任务的日志:
tail -f logs/runs/*/ad_placement_optimization/agent_output.txt实验 YAML 说明
实验 YAML(示例)中有详细注释。关键部分:
env:
在解析其余配置前注入到宿主机进程的环境变量。K8s 最重要的配置:
env:
SFORGE_K8S_IMAGE_REGISTRY: "<registry-ip>:5000" # K8s 必须stagger:
所有任务启动的总间隔秒数,均匀分配给每个任务。50+ 个任务同时启动会导致 API 限流和 K8s 调度压力。600 秒(10 分钟)是安全的默认值。设为 0 可同时启动 所有任务。
model:
model:
api_key: "sk-xxxx"
model: claude-opus-4-8
# 仅第三方/自建端点需要,使用 Anthropic API 时省略
# api_base_url: "https://api.deepseek.com/anthropic"defaults:
应用于所有任务,除非被单任务覆盖。
单任务覆盖
tasks:
smt_solver:
work_cpu_limit: 16 # 需要比默认 4 核更多的 CPU
work_mem_limit: "16g"
anchorhead_text_adventure:
submission_cooldown: 0 # 游戏模式任务,无需冷却
carleson_formalization: *lean_task # YAML 锚点引用YAML 锚点
用 x- 前缀定义共享覆盖块,用 * 引用:
x-lean-task: &lean_task
work_cpu_limit: 8
work_mem_limit: "16g"
judge_cpu_limit: 8
judge_mem_limit: "16g"
tasks:
carleson_formalization: *lean_task
pfr_formalization: *lean_task其他实验配置
示例目录中提供了其他 Agent 和第三方模型的实验配置:
experiment-codex.yaml— Codex + GPT-5.5experiment-deepseek.yaml— Claude Code + DeepSeek V4 Pro(1M 上下文)experiment-glm.yaml— Claude Code + GLM 5.1(200K 上下文)
sforge run --experiment experiment-codex.yaml \
--judge-url http://<judge-host-ip>:8080 \
--run-id edgebench-codex-001Claude Code 使用第三方模型时需要额外配置(缓存优化、模型路由变量、上下文窗口),详见单任务运行 (Docker) — 使用第三方模型。
K8s 专用环境变量
| 变量 | 是否必需 | 用途 |
|---|---|---|
SFORGE_K8S_IMAGE_REGISTRY | 是 | K8s Pod 拉取镜像的仓库地址,不设置后端初始化会报错 |
SFORGE_K8S_NAMESPACE | 否(默认 default) | Kubernetes 命名空间 |
SFORGE_K8S_KUBECONFIG | 否 | kubeconfig 文件路径(省略则使用默认上下文) |
SFORGE_K8S_NODE_SELECTOR | 否 | Pod 节点选择器,格式:"key1=val1,key2=val2" |
其他环境变量请参见环境变量。