最完整SWE-bench实战指南:从环境搭建到自动化测试全流程
最完整SWE-bench实战指南:从环境搭建到自动化测试全流程
SWE-bench是一个用于评估大型语言模型在实际软件工程任务上表现的基准测试平台,它包含GitHub问题及其相应修复,使LLM(Large Language Model,大型语言模型)能够通过生成解决这些问题的补丁来进行能力评估。本文将从环境搭建开始,详细介绍SWE-bench的使用流程,包括数据集获取、基础与高级评估以及常见问题解决等内容,帮助你全面掌握SWE-bench的实战应用。
环境搭建:从依赖安装到Docker配置
安装前准备
在安装SWE-bench之前,需要确保系统满足以下先决条件:
- Python 3.9+:运行SWE-bench包的必要环境,可通过Python官方网站下载安装。
- Docker:评估环境的核心组件,用于提供一致的运行环境,安装指南可参考Docker官方安装文档。
标准安装步骤
对于大多数用户,标准安装是最佳选择,具体步骤如下:
# 克隆仓库
git clone https://gitcode.com/GitHub_Trending/sw/SWE-bench
cd SWE-bench
# 安装SWE-bench及其依赖
pip install -e .
此命令将以开发模式安装SWE-bench,便于后续对代码进行修改(如果需要)。
数据集与推理依赖安装
根据使用场景,可能需要安装额外的依赖:
- 数据集生成依赖:
pip install -e ".[make_datasets]"
- 推理与数据集生成依赖:
pip install -e ".[inference]"
Docker环境配置
SWE-bench严重依赖Docker来提供一致的评估环境,安装完成后需进行验证:
# 检查Docker版本
docker --version
# 运行测试容器
docker run hello-world
# 检查Docker磁盘使用情况
docker system df
Docker安装完成后,还需根据不同操作系统进行相应设置,如在macOS和Windows上通过Docker Desktop调整资源分配(至少8个CPU、16GB RAM和120GB磁盘空间),Linux用户则需完成Docker后安装步骤。
Docker的缓存级别配置对于平衡速度和存储至关重要,SWE-bench提供了不同的缓存选项,具体如下表所示:
| 缓存级别 | 描述 | 存储影响 | 性能 |
|---|---|---|---|
none | 无镜像缓存 | 最小(运行时约120GB) | 最慢 |
base | 仅缓存基础镜像 | 最小(运行时约120GB) | 较慢 |
env (默认) | 缓存基础和环境镜像 | 中等(约100GB) | 中等 |
instance | 缓存所有镜像 | 高(约2000GB) | 最快 |
可在运行评估时通过--cache_level参数设置缓存级别,例如:
python -m swebench.harness.run_evaluation \
--predictions_path <path_to_predictions> \
--cache_level env \
--clean True
数据集获取:轻松访问SWE-bench数据
SWE-bench提供了多个数据集以满足不同需求,主要包括:
- SWE-bench:完整基准测试集,包含2294个实例
- SWE-bench Lite:小型子集,包含300个实例,适合初学者入门
- SWE-bench Verified:500个经工程师验证可解决的实例
- SWE-bench Multimodal:包含100个开发实例,带有截图和UI元素
- SWE-bench Multilingual:300个实例,涵盖9种语言和42个仓库
可通过Hugging Face获取这些数据集,代码示例如下:
from datasets import load_dataset
# 加载主要的SWE-bench数据集
swebench = load_dataset('princeton-nlp/SWE-bench', split='test')
# 根据需要加载其他变体
swebench_lite = load_dataset('princeton-nlp/SWE-bench_Lite', split='test')
swebench_verified = load_dataset('princeton-nlp/SWE-bench_Verified', split='test')
swebench_multimodal_dev = load_dataset('princeton-nlp/SWE-bench_Multimodal', split='dev')
swebench_multimodal_test = load_dataset('princeton-nlp/SWE-bench_Multimodal', split='test')
swebench_multilingual = load_dataset('princeton-nlp/SWE-bench_Multilingual', split='test')
数据集的获取流程可参考下图:
基础评估:快速上手SWE-bench测试
基本评估命令
SWE-bench评估的主要入口是swebench.harness.run_evaluation模块,基本评估命令如下:
python -m swebench.harness.run_evaluation \
--dataset_name princeton-nlp/SWE-bench_Lite \
--predictions_path <path_to_predictions> \
--max_workers 8 \
--run_id my_evaluation_run
对于初学者,建议从SWE-bench Lite开始,它是SWE-bench的一个小子集,命令如下:
python -m swebench.harness.run_evaluation \
--dataset_name princeton-nlp/SWE-bench_Lite \
--predictions_path <path_to_predictions> \
--max_workers 8 \
--run_id my_first_evaluation
验证评估设置
为确保评估设置正确,可评估 ground truth("gold")补丁:
python -m swebench.harness.run_evaluation \
--max_workers 1 \
--instance_ids sympy__sympy-20590 \
--predictions_path gold \
--run_id validate-gold
预测格式要求
预测结果需采用JSONL格式,每行包含一个JSON对象,包含以下字段:
instance_id:格式为"repo_owner__repo_name-issue_number"model_name_or_path:模型名称或路径model_patch:补丁内容字符串
示例:
{"instance_id": "sympy__sympy-20590", "model_name_or_path": "gpt-4", "model_patch": "diff --git a/sympy/core/sympify.py b/sympy/core/sympify.py\nindex 6a73a83..fb90e1a 100644\n--- a/sympy/core/sympify.py\n+++ b/sympy/core/sympify.py\n@@ -508,7 +508,7 @@ def sympify(a, locals=None, convert_xor=True, strict=False, rational=False,\n converter[type(a)],\n (SympifyError,\n OverflowError,\n- ValueError)):\n+ ValueError, AttributeError)):\n return a\n"}
高级评估:定制化测试与云评估
评估特定实例
如需仅评估特定实例,可使用--instance_ids参数:
python -m swebench.harness.run_evaluation \
--predictions_path <path_to_predictions> \
--instance_ids astropy__astropy-14539 sympy__sympy-20590 \
--max_workers 2
云基础评估
可使用Modal在云端运行SWE-bench评估,步骤如下:
# 安装Modal
pip install modal swebench[modal]
# 首次使用需设置Modal
modal setup
# 在Modal上运行评估
python -m swebench.harness.run_evaluation \
--dataset_name princeton-nlp/SWE-bench_Lite \
--predictions_path <path_to_predictions> \
--parallelism 10 \
--modal true
使用sb-cli进行云评估
为简化云评估体验,可使用sb-cli工具:
# 安装sb-cli
pip install sb-cli
# 首次使用需认证
sb login
# 提交评估任务
sb submit --predictions <path_to_predictions>
评估流程的示意图如下:
结果分析与优化:提升评估效率与准确性
理解评估结果
评估结果存储在evaluation_results目录中,每个运行包含以下内容:
results.json:总体评估指标instance_results.jsonl:每个实例的详细结果run_logs/:每个评估实例的日志文件
关键指标包括:
- Total instances:数据集中的实例总数
- Instances submitted:模型尝试解决的实例数
- Instances completed:完成评估的实例数
- Instances resolved:补丁成功解决问题的实例数
- Resolution rate:成功解决的提交实例百分比
性能优化建议
- 选择合适的数据集:对于快速测试,使用SWE-bench Lite而非完整数据集
- 调整并行工作进程数:最优工作进程数取决于系统资源,一般建议使用
min(0.75 * os.cpu_count(), 24),例如8核机器使用6个工作进程,16核机器使用12个工作进程
python -m swebench.harness.run_evaluation \
--predictions_path <path_to_predictions> \
--max_workers 8
- 使用云评估:对于大规模测试,考虑使用Modal进行云评估,可显著提高效率
资源管理
Docker资源管理对于SWE-bench的高效运行至关重要,以下是一些常用命令:
# 查看Docker磁盘使用情况
docker system df
# 删除所有停止的容器
docker container prune
# 删除悬空镜像(未标记的)
docker image prune
# 删除所有未使用的Docker对象(容器、镜像、网络、卷)
docker system prune
常见问题与解决方案
Docker相关问题
- 磁盘空间不足:可使用
docker system prune命令清理未使用的Docker资源,或在运行评估时设置--cache_level=env和--clean=True以减少存储需求 - 权限问题:Linux用户需将用户添加到Docker组,具体步骤参考Docker后安装步骤
- 构建失败:检查网络连接,查看
logs/build_images中的构建日志以定位问题
评估相关问题
- 评估卡住或耗时过长:尝试减少并行工作进程数,检查Docker资源限制,确保有足够的磁盘空间
- 预测格式错误:确保预测文件符合JSONL格式要求,包含所有必要字段
- 实例评估失败:检查日志文件
logs/中的错误信息,确认模型补丁是否正确
其他常见问题
- 能否在没有Docker的情况下运行评估:不能,Docker是提供一致评估环境的必要组件,确保评估在不同系统上的可重复性
- 如何在自定义模型上运行评估:生成符合要求格式的预测,然后使用评估工具,代码示例如下:
from swebench.harness.run_evaluation import run_evaluation
predictions = [
{
"instance_id": "repo_owner_name__repo_name-issue_number",
"model_name_or_path": "my-model-name",
"model_patch": "code patch here"
}
]
results = run_evaluation(
predictions=predictions,
dataset_name="SWE-bench_Lite",
)
总结与展望
通过本文的介绍,你已经掌握了SWE-bench从环境搭建到自动化测试的全流程。从依赖安装、Docker配置,到数据集获取、基础与高级评估,再到结果分析和问题解决,每个环节都有详细的步骤和示例。SWE-bench作为评估LLM在实际软件工程任务上表现的重要工具,其应用前景广阔。未来,随着更多数据集和功能的加入,SWE-bench将在推动LLM在软件工程领域的发展中发挥更加重要的作用。
希望本文能够帮助你更好地使用SWE-bench,如有更多问题,可参考官方文档docs/faq.md或提交issue获取支持。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐






所有评论(0)