一、引言
1.1 工具概述
EvalScope是一款专为大模型部署后性能评估设计的压力测试工具,支持多并发场景下的吞吐量、延迟、稳定性等核心指标测试。通过配置输入/输出Token长度、并发数等参数,可模拟真实业务负载,验证模型服务在不同上下文场景下的性能表现。工具基于Apptainer容器化部署,确保环境一致性,降低依赖冲突风险。
注意:该工具只有X86架构适配版(适用于NVIDIA GPU),无法直接在arm架构(昇腾 910B)下使用,因此实际测试时需要在X86架构机器上通过ssh执行。
1.2 使用须知
- 环境依赖:需预先安装Apptainer(若物理机使用Galaxy镜像,默认已集成),如需安装,具体安装指南见Apptainer官方文档。
- 网络配置:被测模型服务需暴露HTTP接口(如
http://{IP}:{PORT}/v1/chat/completions
),确保工具可通过IP和端口正常访问。 - 资源要求:测试过程可能产生高I/O和网络负载,建议在独立测试环境中执行,避免影响生产服务。
1.3 应用场景
- 模型部署验证:确认模型服务在指定并发和上下文长度下的响应能力。
- 性能瓶颈定位:通过多并发和Token配置组合,识别吞吐量下降或延迟突增的临界点。
- 服务稳定性测试:长时间高负载下验证服务是否存在内存泄漏、连接超时等异常。
二、测试过程
2.1 环境准备
2.1.1 安装Apptainer(Galaxy相关镜像环境默认已安装,可跳过此步骤)
根据操作系统类型选择对应安装方式(以Ubuntu为例):
# 安装依赖
sudo apt-get update && sudo apt-get install -y libseccomp-dev squashfs-tools
# 下载并安装Apptainer
wget https://github.com/apptainer/apptainer/releases/download/v1.2.8/apptainer_1.2.8-1_amd64.deb
sudo dpkg -i apptainer_1.2.8-1_amd64.deb
2.1.2 下载测试工具
创建工作目录并获取EvalScope容器镜像:
mkdir -p /root/ctyun/log
cd /root/ctyun
wget https://xxx/evalscope-ctyun.sif (需联系公有云事业部,获取sif文件)
2.2 全量测试脚本配置与执行
2.2.1 脚本参数说明
编辑 run.sh
脚本(vim run.sh
,可按需调整参数):
#!/bin/bash
# 定义日志输出路径
log_dir="/root/ctyun/log" # 请替换为实际的日志存储路径
mkdir -p "$log_dir" # 如果目录不存在,则创建
# 定义parallel的取值
parallel_values=(1 10 20 32 40 64 128)
# 定义inputtokens和outputtokens的取值
token_pairs=("255 256" "255 1024" "255 2048" "511 512" "511 1024" "1023 1024" "1023 2048" "2047 2048" "4095 1024" "4095 4096")
#token_pairs=("20480 8192")
# 获取当前时间戳,格式为 YYYYMMDD_HHMMSS
timestamp=$(date +"%Y%m%d_%H%M%S")
# 外循环:遍历inputtokens和outputtokens的取值
for tokens in "${token_pairs[@]}"; do
# 将inputtokens和outputtokens分开
inputtokens=$(echo $tokens | awk '{print $1}')
outputtokens=$(echo $tokens | awk '{print $2}')
# 定义日志文件名,格式为 inputtokens_outputtokens_timestamp.log
log_file="${log_dir}/${inputtokens}_${outputtokens}_${timestamp}.log"
# 清空日志文件(如果存在)
> "$log_file"
echo "Running tests for inputtokens=$inputtokens, outputtokens=$outputtokens"
echo "Logging to $log_file"
# 内循环:遍历parallel的取值
for parallel in "${parallel_values[@]}"; do
echo "Running with parallel=$parallel" | tee -a "$log_file"
# 执行apptainer命令,并将输出追加到日志文件
apptainer exec evalscope-ctyun.sif evalscope perf \
--url "http://127.0.0.1:8000/v1/completions" \
--parallel "$parallel" \
--model /model/deepseek-r1 \
--dataset-repeat "$parallel" \
--dataset-input-length "$inputtokens" \
--connect-timeout 6000 \
--read-timeout 6000 \
--max-tokens "$outputtokens" \
--min-tokens "$outputtokens" \
--api openai \
--dataset speed_benchmark 2>&1 | tee -a "$log_file"
done
echo "Completed tests for inputtokens=$inputtokens, outputtokens=$outputtokens"
echo "----------------------------------------" | tee -a "$log_file"
done
echo "All tests completed. Logs are stored in $log_dir"
- 并发配置:
parallel_values
定义并发数梯度(如1, 10, 20, 32, 40, 64, 128
),覆盖低负载到高负载场景。 - Token配置:
token_pairs
定义输入/输出Token组合,格式为"输入长度 输出长度"
,支持多组上下文场景(如"255 256"
表示输入255 Token,输出256 Token)。 - 日志路径:
log_dir
指定测试日志存储目录,日志文件命名规则为输入长度_输出长度_时间戳.log
。
2.2.2 执行全量测试
启动后台测试任务,避免终端断开影响:
nohup sh run.sh &
测试日志自动生成至 /root/ctyun/log/
目录,包含各并发和Token组合的详细输出。
2.3 简易快速测试(单场景验证)
针对特定场景(如输入1023 Token,输出1024 Token,并发64),在evalscope-ctyun.sif所在目录,直接执行命令:
apptainer exec evalscope-ctyun.sif evalscope perf \
--url "http://{IP}:{PORT}/v1/chat/completions" \ # 模型服务API地址
--model DeepSeek-R1 \ # 模型名称(需与服务端一致)
--api openai \ # API协议类型(适配OpenAI格式)
--dataset speed_benchmark \ # 测试数据集(固定值)
--max-tokens 1024 \ # 最大输出Token数(与最小一致以固定输出长度)
--min-tokens 1024 \
--dataset-input-length 1023 \ # 输入Token数(实际输入为该值+1,需预留起始Token)
--dataset-repeat 64 \ # 总请求数(建议≥并发数,通常设为并发数倍数)
--parallel 64 \ # 并发数
--connect-timeout 6000 \ # 连接超时时间(ms)
--read-timeout 6000 \ # 读取超时时间(ms)
2.4 核心参数详解
参数名 | 描述 | 示例值 |
---|---|---|
--url |
模型服务API端点,需包含协议、IP、端口和路径 | http://127.0.0.1:8000/v1/chat/completions |
--parallel |
并发数,模拟同时发起的请求量 | 32 |
--dataset-input-length |
输入Token长度(实际输入为该值+1,因包含起始Token) | 1023 |
--max-tokens |
单请求最大输出Token数 | 2048 |
--dataset-repeat |
总请求次数,控制测试样本量(建议≥并发数以覆盖全链路压力) | 64 |
--model |
模型标识(需与服务端返回的 model 字段一致) |
DeepSeek-R1 |
三、结果分析
3.1 关键指标解读
-
Throughput(吞吐量):单位时间内成功处理的请求数(req/s),反映服务负载能力,越高表明性能越优。
-
Latency(延迟):
- Mean Latency:平均响应时间,关注是否随并发升高而显著增加。
- P95/P99 Latency:高百分位延迟,衡量服务稳定性(如P95表示95%请求的响应时间低于该值)。
-
Error Rate(错误率):超时、服务异常等失败请求占比,理想值为0%,超过1%需排查问题。
四、注意事项
- 测试耗时:全量测试包含多组并发和Token组合,耗时可能长达数小时,建议通过
nohup
或任务调度工具执行。 - 资源监控:同步使用
nmon
、htop
等工具监控服务器CPU、内存、网络带宽,排除硬件瓶颈对测试结果的干扰。 - API兼容性:确保
--api
参数与模型服务协议一致(当前支持OpenAI格式),请求体结构需符合对应API规范。 - 输入Token修正:
--dataset-input-length
设置值需比实际输入Token数少1(工具自动添加起始Token),例如预期输入1024 Token时,该参数应设为1023。
五、附录
- 工具文档:EvalScope详细使用说明见官方文档。
- 日志示例:各测试场景的输出日志包含完整请求响应数据,可通过文本分析工具(如Grep、Excel)进行多维度对比。
本指南适用于大模型服务性能评估,旨在为技术人员提供标准化测试流程。实际操作中请根据具体环境调整参数,并结合业务负载特征设计测试用例。