evalstone/DOCKER_SOP_BEGINNER.md

277 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# EvalScope Docker 评测 SOP新手版
本文档以 P800-02 为例,假设模型已经由 `/data1/yy/deploy_dsv4.sh` 部署为 OpenAI 兼容 API。
## 0. 固定目录
统一使用以下目录,避免宿主机和容器路径混淆:
```bash
export EVAL_ROOT=/data1/sora/temp/evalstone
export IMAGE=evalscope-complete-py312:latest
export MODEL=DeepSeek-V4-Flash-INT8
export API_URL=http://127.0.0.1:30000/v1
```
重要EvalScope 会自动在 `--dataset-dir` 后查找 `datasets/`,所以数据位于
`$EVAL_ROOT/datasets/` 时,必须传 `$EVAL_ROOT`,不能传 `$EVAL_ROOT/datasets`
## 1. 检查机器和目录
```bash
test -d "$EVAL_ROOT" && echo '代码目录 OK'
test -d /data1/models/DeepSeek-V4-Flash-INT8 && echo '模型目录 OK'
docker version
docker image inspect "$IMAGE" >/dev/null && echo '评测镜像 OK'
```
若代码不存在:
```bash
git clone https://git.meta-stone.net/sora/evalstone.git "$EVAL_ROOT"
```
## 2. 下载数据集
```bash
mkdir -p "$EVAL_ROOT/datasets"
modelscope download \
--repo-type dataset \
--local_dir "$EVAL_ROOT/datasets" \
SoraAmami/evalscope-datasets
```
验证数据没有多套 `datasets/` 嵌套:
```bash
test -d "$EVAL_ROOT/datasets"
find "$EVAL_ROOT/datasets" -mindepth 1 -maxdepth 1 -type d | head
test ! -d "$EVAL_ROOT/datasets/datasets" && echo '数据目录结构 OK'
```
## 3. 安装/验证 Python 入口
评测代码内置 EvalScope 源码。宿主机直接运行时:
```bash
cd "$EVAL_ROOT"
python3 -m py_compile bash/run.py
python3 bash/run.py --help
```
Docker 中运行时,使用 `/opt/evalscope`,不要使用不存在的 `/workspace/evalscope`
## 4. 启动并验证模型
```bash
bash /data1/yy/deploy_dsv4.sh int8 30000
```
验证 OpenAI API
```bash
curl -sS "$API_URL/models"
```
必须能看到模型列表。若 `/health` 返回空响应但 `/v1/models` 正常,以 `/v1/models` 为准。
## 5. 准备代码执行 sandbox
humaneval 和 bigcodebench 需要 Docker sandbox
```bash
docker pull python:3.11-slim
docker pull bigcodebench/bigcodebench-evaluate:latest
cd "$EVAL_ROOT"
docker build -t bigcodebench-sandbox:latest -f - . <<'EOF'
FROM bigcodebench/bigcodebench-evaluate:latest
ENTRYPOINT []
CMD ["tail", "-f", "/dev/null"]
EOF
```
## 6. Docker 运行评测容器
```bash
mkdir -p "$EVAL_ROOT/output"
docker run --rm --network host \
-v "$EVAL_ROOT:/opt/evalscope" \
-v /data1/models:/opt/models:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
"$IMAGE" bash -lc '
cd /opt/evalscope
python3 bash/run.py --help
'
```
关键路径规则:
- 宿主机 `$EVAL_ROOT` 对应容器 `/opt/evalscope`
- 容器内数据目录是 `/opt/evalscope/datasets`
- `--dataset-dir``/opt/evalscope`
- `--tokenizer-path``/opt/models/DeepSeek-V4-Flash-INT8`
## 7. 先做一条样本 smoke test
```bash
docker run --rm --network host \
-v "$EVAL_ROOT:/opt/evalscope" \
-v /data1/models:/opt/models:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
"$IMAGE" bash -lc '
cd /opt/evalscope
python3 bash/run.py \
--model DeepSeek-V4-Flash-INT8 \
--api-url http://127.0.0.1:30000/v1 \
--dataset-dir /opt/evalscope \
--output-dir /opt/evalscope/output_smoke \
--tokenizer-path /opt/models/DeepSeek-V4-Flash-INT8 \
--datasets gsm8k \
--limit 1 \
--batch-size 1
'
```
smoke test 成功标准:生成 `output_smoke/`,并出现 `reports/gsm8k.json`
## 8. Suite 选择
```text
full 28 个:完整标准评测
lite 6 个:快速检查
mid 13 个:中等规模
k3 9 个gpqa_diamond、hle、terminal_bench_v2、browsecomp、
mcp_atlas、officeqa、deepsearchqa、jobbench、automation_bench
tencent_hunyuan 当前为空,等清单确认后再启用
```
正式运行示例:
```bash
python3 bash/run.py \
--model DeepSeek-V4-Flash-INT8 \
--api-url http://127.0.0.1:30000/v1 \
--dataset-dir /data1/sora/temp/evalstone \
--output-dir /data1/sora/temp/evalstone/output \
--tokenizer-path /data1/models/DeepSeek-V4-Flash-INT8 \
--suite lite \
--limit none \
--batch-size 4
```
也可以覆盖 suite
```bash
python3 bash/run.py --datasets gsm8k,arc --limit none
```
## 9. 查看结果
```bash
find "$EVAL_ROOT/output" -name '*.json' | sort
python3 - <<'PY'
import glob, json
for f in sorted(glob.glob('/data1/sora/temp/evalstone/output/*/seed_*/reports/*/*.json')):
d=json.load(open(f))
print(f, d.get('score', d.get('mean_acc', 'N/A')))
PY
```
## 10. 常见问题
- `ModuleNotFoundError: evalscope`:使用仓库最新版 `bash/run.py`,或在容器内从 `/opt/evalscope` 执行。
- 找不到数据:确认 `--dataset-dir` 指向父目录,而不是 `datasets/`
- API 连接失败:先执行 `curl http://127.0.0.1:30000/v1/models`
- XCCL `shmget errno=17`:检查其他 XPU 任务和残留共享内存,不要未经确认执行全局 `ipcrm`
- Docker sandbox 失败:确认已加载 `python:3.11-slim``bigcodebench-sandbox:latest`
- Excel 汇总失败:镜像和宿主机应包含 `openpyxl`;可验证 `python3 -c 'import openpyxl'`
## 11. 清理
只删除本次输出,不删除数据和模型:
```bash
rm -rf "$EVAL_ROOT/output_smoke"
```
删除 Docker benchmark 镜像前,必须确认没有其他评测任务使用它们。
## 12. Benchmark 与环境矩阵
当前 `full` 套件共 28 项:
| 类型 | 数量 | Benchmark | 环境要求 |
|---|---:|---|---|
| Multi-run | 8 | humaneval、live_code_bench、aime24、aime25、aime26、hmmt26、imo_answerbench、gpqa_diamond | 普通 APIhumaneval 另需代码 sandbox |
| Single-run | 18 | bigcodebench、bfcl_v3、competition_math、gsm8k、hle、super_gpqa、arc、bbh、cmmlu、drop、hellaswag、mmlu、mmlu_pro、simple_qa、trivia_qa、winogrande、openai_mrcr、longbench_v2 | 普通 APIbigcodebench 另需代码 sandbox长文本项目需要 tokenizer |
| Agent | 2 | tau2_bench、general_fc | API、judge API 和工具/Agent 配置 |
套件数量:`full=28``lite=6``mid=13``k3=9``tencent_hunyuan` 已预留入口,具体清单确认后再启用。
## 13. 环境构建代码索引
仓库中已有以下环境脚本和说明:
| 环境 | 构建/加载代码 |
|---|---|
| EvalScope 主镜像 | `DOCKER_BUILD.md``DOCKER_README.md` |
| BigCodeBench sandbox | 本文第 5 节的 Dockerfile`Dockerfile.withcode` |
| Humaneval | `bash/run.py``SANDBOX_CONFIGS`,使用 `python:3.11-slim` |
| SWE-bench 镜像 | `bash/load_swe_images.sh``bash/save_swe_images.sh` |
| Terminal Bench | `bash/images_load/preload_terminal_bench_images.sh` |
| Docker 镜像清理 | `bash/cleanup_docker_images.sh` |
| SWE 镜像诊断 | `bash/diagnose_swe_images.py` |
构建代码 sandbox
```bash
cd "$EVAL_ROOT"
docker pull bigcodebench/bigcodebench-evaluate:latest
docker build -t bigcodebench-sandbox:latest -f - . <<'EOF'
FROM bigcodebench/bigcodebench-evaluate:latest
ENTRYPOINT []
CMD ["tail", "-f", "/dev/null"]
EOF
```
加载 SWE-bench 镜像:
```bash
bash bash/load_swe_images.sh "$EVAL_ROOT/docker/swe_images"
```
加载 Terminal Bench 镜像:
```bash
bash bash/images_load/preload_terminal_bench_images.sh
```
## 14. 全量启动与状态检查
全量任务会运行 Multi-run 重复次数,预计需要很长时间。建议后台启动:
```bash
nohup docker run --rm --name evalscope_full \
--network host \
-v "$EVAL_ROOT:/opt/evalscope" \
-v /data1/models:/opt/models:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
"$IMAGE" bash -lc '
cd /opt/evalscope && python3 bash/run.py \
--model DeepSeek-V4-Flash-INT8 \
--api-url http://127.0.0.1:30000/v1 \
--dataset-dir /opt/evalscope \
--output-dir /opt/evalscope/output_full \
--tokenizer-path /opt/models/DeepSeek-V4-Flash-INT8 \
--suite full --limit none --batch-size 4
' >/tmp/evalscope_full.log 2>&1 &
```
状态检查:
```bash
docker ps --filter name=evalscope_full
tail -f /tmp/evalscope_full.log
find "$EVAL_ROOT/output_full" -name '*.json' | sort
```