在AI模型服务部署和性能调优过程中,如何准确测量吞吐量(TPM)、请求速率(RPM)以及响应延迟(TTFT/TPOT)是每个运维工程师必须掌握的技能。本文将分享一套基于Docker容器化的evalscope测试方案,通过标准化环境构建和自动化测试流程,实现可重复、隔离的性能基准测试。
这套方案的核心价值在于:
首先需要准备Dockerfile构建测试环境基础镜像。虽然原文未提供Dockerfile具体内容,但根据evalscope的使用场景,典型的Dockerfile应包含以下要素:
dockerfile复制FROM python:3.9-slim
WORKDIR /work
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
&& rm -rf /var/lib/apt/lists/*
# 安装evalscope及其依赖
RUN pip install evalscope openai requests tqdm
# 设置容器默认工作目录
VOLUME ["/work/outputs"]
构建镜像时使用以下命令(注意最后的点表示使用当前目录的Dockerfile):
bash复制docker build -t eva .
提示:建议在Dockerfile中固定Python包版本以避免兼容性问题,例如
pip install evalscope==1.2.3
运行容器时需要特别注意数据持久化问题。通过-v参数将宿主机目录挂载到容器内:
bash复制docker run -it -d --name eva-container -v $(pwd)/outputs:/work/outputs eva
这个命令的关键参数解析:
-it:保持交互模式并分配伪终端-d:后台运行容器--name:指定容器名称便于管理-v:将宿主机./outputs目录挂载到容器内的/work/outputs经验:挂载目录使用绝对路径更可靠,
$(pwd)会自动替换为当前目录的绝对路径
进入容器执行命令:
bash复制docker exec -it eva-container bash
从宿主机复制测试文件到容器内:
bash复制docker cp prompt_10k.txt bb452a757455:/work
注意:容器ID可以通过
docker ps查看,建议使用容器名称替代ID,如docker cp prompt_10k.txt eva-container:/work
TPM(Tokens Per Minute)测试需要特定结构的文本数据。使用提供的Python脚本生成基准数据集:
python复制python3 - << 'PY'
base = """You are running a throughput benchmark.
Rules:
- Do NOT stop early.
- Do NOT summarize.
- Do NOT explain.
- Output must be continuous plain text.
- Keep generating until you hit the maximum output tokens.
Task:
Repeat the paragraph below exactly, over and over, until the output limit is reached.
Paragraph:
The quick brown fox jumps over the lazy dog. This text exists only for throughput benchmarking.
"""
prompt = (base + "\n") * 20 # 建议 10~30,别太长
with open("tpm_dataset.txt", "w", encoding="utf-8") as f:
f.write(prompt.replace("\n", " ") + "\n")
print("wrote tpm_dataset.txt")
PY
脚本设计要点:
技巧:调整重复次数(20)可控制数据集大小,建议根据模型上下文长度选择
bash复制evalscope perf \
--api openai \
--url "${CTYUN_URL}" \
--model "${MODEL_ID}" \
--api-key "${CTYUN_APP_KEY}" \
--dataset custom \
--dataset-path ./tpm_dataset.txt \
--rate -1 \
--parallel 29 30 31 \
--number 80 160 80 \
--max-tokens 2048 \
--min-tokens 2048 \
--temperature 0 \
--top-p 1 \
--stream
参数解析:
--parallel 29 30 31:测试三个不同并发级别--number 80 160 80:每个并发级别的请求数--max/min-tokens 2048:固定输出长度--stream:启用流式传输模拟真实场景实测建议:首次测试建议降低并发和请求数,确认系统稳定性后再逐步增加
bash复制evalscope perf \
--api openai \
--url "$CTYUN_URL" \
--api-key "$CTYUN_APP_KEY" \
--model "$MODEL_ID" \
--dataset custom \
--dataset-path /work/prompts.txt \
--number 500 \
--parallel 30 \
--rate -1 \
--max-tokens 1 \
--min-tokens 1 \
--temperature 0.0 \
--no-stream
关键差异:
--max-tokens 1:最小化响应体--no-stream:禁用流式传输bash复制evalscope perf \
--api openai \
--url "$CTYUN_URL" \
--api-key "$CTYUN_APP_KEY" \
--model "$MODEL_ID" \
--dataset custom \
--dataset-path /work/prompts.txt \
--number 3000 \
--parallel 60 \
--rate -1 \
--max-tokens 1 \
--min-tokens 1 \
--temperature 0.0 \
--no-stream
设计考量:
bash复制evalscope perf \
--api openai \
--url "$URL" \
--api-key "$APPKEY" \
--model "$MDID" \
--prompt @./prompt_10k.txt \
--max-tokens 1000 \
--stream \
--parallel 30 \
--number 600 \
--rate -1
延迟测试特点:
并发数选择:
请求量级:
Token长度:
连接超时:
bash复制# 检查容器网络模式
docker inspect eva-container | grep NetworkMode
# 建议使用host模式减少NAT开销
docker run --network host ...
认证失败:
bash复制docker exec -it eva-container env | grep CTYUN
数据集路径错误:
bash复制docker exec -it eva-container ls -l /work
TPM测试:
RPM测试:
延迟测试:
在实际部署中,我们进一步优化了测试流程:
使用Docker Compose管理多容器测试:
yaml复制version: '3'
services:
tester:
image: eva
volumes:
- ./outputs:/work/outputs
environment:
- CTYUN_URL=${CTYUN_URL}
- MODEL_ID=${MODEL_ID}
集成到CI/CD流水线:
bash复制# 样例GitLab CI配置
stages:
- test
performance_test:
stage: test
image: docker:latest
services:
- docker:dind
script:
- docker build -t eva .
- docker run --env-file .env eva python generate_dataset.py
- docker run --env-file .env eva evalscope perf ...
结果可视化方案:
outputs目录挂载到Jupyter容器这套方案在我们多个AI项目的部署验证中表现出色,特别是在对比不同硬件配置和模型版本时,能够提供准确、可比较的性能数据。测试过程中最重要的经验是保持环境一致性——这也是我们坚持使用Docker容器化的根本原因。