evalstone/scripts/deploy_evalscope.sh

293 lines
9.7 KiB
Bash
Executable File
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.

#!/bin/bash
# ============================================================
# EvalScope 完整部署脚本
# 用法: bash deploy_evalscope.sh <BASE_DIR> [TOKEN]
# 示例: bash deploy_evalscope.sh /data1/sora ms-3d554a39-6e07-496d-8022-0b0ee64a6389
# ============================================================
set -euo pipefail
# --------------------------------------------------
# 1. 参数解析
# --------------------------------------------------
BASE_DIR="${1:-/data1/sora}" # 基础目录,默认 /data1/sora
DEFAULT_TOKEN="ms-3d554a39-6e07-496d-8022-0b0ee64a6389"
MODELSCOPE_TOKEN="${2:-$DEFAULT_TOKEN}"
# 派生路径
EVALSCOPE_DIR="$BASE_DIR/evalscope"
DOCKER_DIR="$EVALSCOPE_DIR/docker"
IMAGES_DIR="$DOCKER_DIR/images"
CONTAINERD_DIR="$DOCKER_DIR/containerd"
SWE_IMAGES_DIR="$DOCKER_DIR/swe_images"
DATASETS_DIR="$EVALSCOPE_DIR/datasets"
# --------------------------------------------------
# 2. 安装依赖
# --------------------------------------------------
echo "==> 安装 modelscope..."
pip install modelscope
# --------------------------------------------------
# 3. 登录 ModelScope
# --------------------------------------------------
if [ -n "$MODELSCOPE_TOKEN" ]; then
echo "==> 登录 ModelScope..."
modelscope login --token "$MODELSCOPE_TOKEN"
fi
# --------------------------------------------------
# 4. 下载数据集
# --------------------------------------------------
echo "==> 下载 evalscope 数据集..."
mkdir -p "$DATASETS_DIR"
python3 -c "
from modelscope.hub.snapshot_download import snapshot_download
snapshot_download(
'SoraAmami/evalscope-datasets',
repo_type='dataset',
cache_dir='$EVALSCOPE_DIR',
local_dir='$DATASETS_DIR'
)
"
# --------------------------------------------------
# 5. 下载 Docker 镜像包
# --------------------------------------------------
echo "==> 下载 evalscope Docker 镜像..."
mkdir -p "$DOCKER_DIR"
python3 -c "
from modelscope.hub.file_download import model_file_download
model_file_download(
model_id='SoraAmami/evalscope-docker',
file_path='evalscope-complete-py312.tar.gz',
local_dir='$DOCKER_DIR'
)
"
# --------------------------------------------------
# 6. 配置 Docker 和 containerd 数据目录
# --------------------------------------------------
echo "==> 配置 Docker 和 containerd..."
# 停止服务
sudo systemctl stop docker.socket 2>/dev/null || true
sudo systemctl stop docker 2>/dev/null || true
sudo systemctl stop containerd 2>/dev/null || true
# 创建数据目录
mkdir -p "$IMAGES_DIR"
mkdir -p "$CONTAINERD_DIR"
# 配置 Docker
echo "==> 写入 Docker 配置..."
sudo tee /etc/docker/daemon.json <<EOF
{
"data-root": "$IMAGES_DIR",
"features": {
"containerd-snapshotter": true
},
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://hub.rat.dev",
"https://docker.1panel.live",
"https://dockerproxy.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.mirrors.tuna.tsinghua.edu.cn"
]
}
EOF
# 配置 containerd
echo "==> 写入 containerd 配置..."
sudo tee /etc/containerd/config.toml <<EOF
root = "$CONTAINERD_DIR"
state = "/run/containerd"
EOF
# 重启服务
sudo systemctl reset-failed docker.service 2>/dev/null || true
sudo systemctl start containerd
sudo systemctl start docker
# --------------------------------------------------
# 7. 加载 evalscope 环境镜像
# --------------------------------------------------
echo "==> 加载 evalscope Docker 镜像..."
docker load -i "$DOCKER_DIR/evalscope-complete-py312.tar.gz"
# --------------------------------------------------
# 8. 克隆代码仓库
# --------------------------------------------------
echo "==> 克隆 evalscope 代码..."
cd "$EVALSCOPE_DIR"
if [ ! -d "evalstone" ]; then
git clone https://git.meta-stone.net/sora/evalstone.git
fi
# --------------------------------------------------
# 9. 准备 sandbox 镜像
# --------------------------------------------------
SANDBOX_IMAGES_DIR="$DOCKER_DIR/sandbox_images"
mkdir -p "$SANDBOX_IMAGES_DIR"
# 函数:带超时拉取镜像,本地已有则跳过
pull_with_timeout() {
local image="$1"
local timeout_sec="${2:-600}"
if docker images --format '{{.Repository}}:{{.Tag}}' | grep -qx "$image"; then
echo "镜像 $image 已存在,跳过 pull"
return 0
fi
echo "拉取 $image (超时 ${timeout_sec}s)..."
if timeout "$timeout_sec" docker pull "$image"; then
echo "$image 拉取成功"
return 0
else
echo "警告:$image 拉取失败或超时"
return 1
fi
}
# 优先从 ModelScope 下载预打包的 sandbox 镜像,避免 DockerHub 拉取慢/失败
download_sandbox_image_from_modelscope() {
local file="$1"
if [ -f "$SANDBOX_IMAGES_DIR/$file" ]; then
echo "sandbox 镜像包 $file 已存在,跳过下载"
return 0
fi
echo "==> 从 ModelScope 下载 $file ..."
# 优先使用新版 modelscope_hub API支持 dataset repo
python3 -c "
from modelscope_hub import HubApi
api = HubApi()
api.download_file(
repo_id='SoraAmami/evalscope-sandbox-images',
repo_type='dataset',
path='$file',
local_dir='$SANDBOX_IMAGES_DIR'
)
" && return 0
echo "警告:从 ModelScope 下载 $file 失败"
return 1
}
load_sandbox_image() {
local file="$1"
local expected_image="$2"
if docker images --format '{{.Repository}}:{{.Tag}}' | grep -qx "$expected_image"; then
echo "镜像 $expected_image 已存在,跳过加载"
return 0
fi
if [ -f "$SANDBOX_IMAGES_DIR/$file" ]; then
echo "==> 加载 $file ..."
docker load -i "$SANDBOX_IMAGES_DIR/$file"
return 0
fi
return 1
}
# 9.1 bigcodebench-sandbox:latest
if ! docker images --format '{{.Repository}}:{{.Tag}}' | grep -qx "bigcodebench-sandbox:latest"; then
if ! load_sandbox_image "bigcodebench-sandbox.tar.gz" "bigcodebench-sandbox:latest"; then
download_sandbox_image_from_modelscope "bigcodebench-sandbox.tar.gz" && \
load_sandbox_image "bigcodebench-sandbox.tar.gz" "bigcodebench-sandbox:latest"
fi
fi
# 9.2 python:3.11-slim
if ! docker images --format '{{.Repository}}:{{.Tag}}' | grep -qx "python:3.11-slim"; then
if ! load_sandbox_image "python-3.11-slim.tar.gz" "python:3.11-slim"; then
download_sandbox_image_from_modelscope "python-3.11-slim.tar.gz" && \
load_sandbox_image "python-3.11-slim.tar.gz" "python:3.11-slim"
fi
fi
# 9.3 fallback如果 ModelScope 失败,尝试从 DockerHub / 镜像站拉取
if ! docker images --format '{{.Repository}}:{{.Tag}}' | grep -qx "bigcodebench-sandbox:latest"; then
echo "==> 尝试 fallback拉取 bigcodebench 基础镜像并构建 sandbox..."
pull_with_timeout "bigcodebench/bigcodebench-evaluate:latest" 600 || true
if docker images --format '{{.Repository}}:{{.Tag}}' | grep -qx "bigcodebench/bigcodebench-evaluate:latest"; then
echo "==> 构建 bigcodebench-sandbox..."
mkdir -p /tmp/bigcodebench-sandbox-ctx
docker build -t bigcodebench-sandbox:latest -f - /tmp/bigcodebench-sandbox-ctx <<'EOF' || echo "警告bigcodebench-sandbox 构建失败"
FROM bigcodebench/bigcodebench-evaluate:latest
ENTRYPOINT []
CMD ["tail", "-f", "/dev/null"]
EOF
else
echo "警告bigcodebench 基础镜像不存在,跳过 bigcodebench-sandbox 构建"
fi
fi
if ! docker images --format '{{.Repository}}:{{.Tag}}' | grep -qx "python:3.11-slim"; then
pull_with_timeout "python:3.11-slim" 300 || true
fi
# --------------------------------------------------
# 10. 下载 SWE-Bench 镜像包(可选)
# --------------------------------------------------
if [ -n "$MODELSCOPE_TOKEN" ]; then
echo "==> 下载 SWE-Bench 镜像包..."
mkdir -p "$SWE_IMAGES_DIR"
modelscope download \
--repo-type dataset \
--local_dir "$SWE_IMAGES_DIR" \
SoraAmami/swe-bench-verified-images || echo "警告SWE-Bench 镜像下载失败"
fi
# --------------------------------------------------
# 11. 加载 SWE-Bench 镜像(如果存在)
# --------------------------------------------------
if [ -d "$SWE_IMAGES_DIR" ] && ls "$SWE_IMAGES_DIR"/swebench_batch_*.tar.gz 1>/dev/null 2>&1; then
echo "==> 加载 SWE-Bench 镜像..."
TARS=("$SWE_IMAGES_DIR"/swebench_batch_*.tar.gz)
TOTAL=${#TARS[@]}
echo "共找到 $TOTAL 个镜像包"
IDX=0
for TAR in "${TARS[@]}"; do
IDX=$((IDX + 1))
echo "[$IDX/$TOTAL] 加载 $(basename "$TAR")..."
docker load -i "$TAR"
done
echo "SWE-Bench 镜像加载完成,已加载 $(docker images | grep '^swebench/' | wc -l)"
else
echo "跳过 SWE-Bench 镜像加载(未找到镜像包)"
fi
# --------------------------------------------------
# 12. 验证部署
# --------------------------------------------------
echo ""
echo "========================================"
echo "部署完成!"
echo "========================================"
echo "基础目录: $BASE_DIR"
echo "EvalScope: $EVALSCOPE_DIR"
echo "数据集: $DATASETS_DIR"
echo "Docker 数据: $IMAGES_DIR"
echo "Containerd: $CONTAINERD_DIR"
echo ""
echo "Docker Root Dir:"
docker info 2>/dev/null | grep "Docker Root Dir" || echo "Docker 未运行"
echo ""
echo "已加载镜像:"
docker images | grep -E "evalscope|swebench|bigcodebench|python" || true
echo ""
echo "运行 EvalScope:"
echo " cd $EVALSCOPE_DIR"
echo " docker run -it --rm \\"
echo " --network host \\"
echo " -v $EVALSCOPE_DIR:/opt/evalscope \\"
echo " -v /var/run/docker.sock:/var/run/docker.sock \\"
echo " evalscope-complete-py312:latest \\"
echo " bash"
echo "========================================"