BigCodeBench
🌸关于 • 🔥快速开始 • 🔍失败检查 • 🚀完整脚本 • 📊结果分析 • 💻LLM生成的代码 • 🐞已知问题 • 📜引用 • 🙏致谢
🌸 关于
BigCodeBench
BigCodeBench是一个易于使用的代码生成基准测试,包含实用且具有挑战性的编程任务。它旨在以更真实的环境评估大型语言模型(LLMs)的真实编程能力。该基准测试设计用于类似HumanEval的函数级代码生成任务,但具有更复杂的指令和多样化的函数调用。
为了便于在BigCodeBench上评估LLMs,我们提供了这个Python包bigcodebench
,其中包含数据集、生成脚本和评估脚本。该包基于EvalPlus框架构建,这是一个灵活且可扩展的代码生成任务评估框架。
为什么选择BigCodeBench?
BigCodeBench专注于评估具有多样化函数调用和复杂指令的LLM4Code,具有以下特点:
与EvalPlus的主要区别
我们继承了EvalPlus框架的设计,这是一个灵活且可扩展的代码生成任务评估框架。然而,BigCodeBench有以下不同之处:
- 执行环境:BigCodeBench中的执行环境比EvalPlus更少受限,以支持具有多样化库依赖的任务。
- 测试评估:BigCodeBench依赖
unittest
来评估生成的代码,这更适合BigCodeBench中的测试框架。
🔥 快速开始
[!提示]
BigCodeBench ❤️ bigcode-evaluation-harness! BigCodeBench将被集成到bigcode-evaluation-harness中,您也可以在那里运行它!
要开始使用,请首先设置环境:
# 安装以使用bigcodebench.evaluate
pip install bigcodebench --upgrade
# 如果您想在本地使用evaluate,需要安装requirements
pip install -I -r https://raw.githubusercontent.com/bigcode-project/bigcodebench/main/Requirements/requirements-eval.txt
# 安装以使用bigcodebench.generate
# 强烈建议您在单独的环境中安装generate依赖
pip install bigcodebench[generate] --upgrade
⏬ 安装每日构建版本 :: 点击展开 ::
# 安装以使用bigcodebench.evaluate
pip install "git+https://github.com/bigcode-project/bigcodebench.git" --upgrade
⏬ 将BigCodeBench作为本地仓库使用? :: 点击展开 ::
git clone https://github.com/bigcode-project/bigcodebench.git
cd bigcodebench
export PYTHONPATH=$PYTHONPATH:$(pwd)
# 安装以使用bigcodebench.evaluate
pip install -e .
# 安装以使用bigcodebench.generate
pip install -e .[generate]
代码生成
建议使用flash-attn
生成代码样本。
pip install -U flash-attn
要从模型生成代码样本,可以使用以下命令:
# 当使用贪婪搜索时,不需要设置温度和样本数
bigcodebench.generate \
--model [模型名称] \
--split [complete|instruct] \
--subset [full|hard] \
[--greedy] \
--bs [批处理大小] \
--temperature [温度] \
--n_samples [样本数] \
--resume \
--backend [vllm|hf|openai|mistral|anthropic|google] \
--tp [GPU数量] \
[--trust_remote_code] \
[--base_url [基础URL]] \
[--tokenizer_name [分词器名称]]
生成的代码样本将存储在名为[模型名称]--bigcodebench-[instruct|complete]--[后端]-[温度]-[样本数].jsonl
的文件中。或者,你可以使用以下命令来使用我们预构建的Docker镜像生成代码样本:
# 如果你使用GPU
docker run --gpus '"device=$CUDA_VISIBLE_DEVICES"' -v $(pwd):/app -t bigcodebench/bigcodebench-generate:latest \
--model [模型名称] \
--split [complete|instruct] \
--subset [full|hard] \
[--greedy] \
--bs [批处理大小] \
--temperature [温度] \
--n_samples [样本数] \
--resume \
--backend [vllm|hf|openai|mistral|anthropic|google] \
--tp [GPU数量]
# ...或者如果你使用CPU
docker run -v $(pwd):/app -t bigcodebench/bigcodebench-generate:latest \
--model [模型名称] \
--split [complete|instruct] \
--subset [full|hard] \
[--greedy] \
--bs [批处理大小] \
--temperature [温度] \
--n_samples [样本数] \
--resume \
--backend [vllm|hf|openai|mistral|anthropic|google]
# 如果你想使用受限或私有的HuggingFace模型和数据集
docker run -e HUGGING_FACE_HUB_TOKEN=$token -v $(pwd):/app -t bigcodebench/bigcodebench-generate:latest # 省略其他参数
# 同样,要使用需要认证的其他后端
docker run -e OPENAI_API_KEY=$OPENAI_API_KEY -v $(pwd):/app -t bigcodebench/bigcodebench-generate:latest # 省略其他参数
docker run -e GOOGLE_API_KEY=$OPENAI_API_KEY -v $(pwd):/app -t bigcodebench/bigcodebench-generate:latest # 省略其他参数
docker run -e ANTHROPIC_KEY=$ANTHROPIC_KEY -v $(pwd):/app -t bigcodebench/bigcodebench-generate:latest # 省略其他参数
之后,你可以按上述方式运行构建好的容器。
problem
的结构?(点击展开)
task_id
是任务的标识符字符串entry_point
是函数名complete_prompt
是BigCodeBench-Complete的提示instruct_prompt
是BigCodeBench-Instruct的提示canonical_solution
是标准实现test
是unittest.TestCase
类
注意
[模型名称]--bigcodebench-[任务]--[后端]-[温度]-[样本数].jsonl
的预期模式
task_id
:任务ID,即get_bigcodebench()
的键solution
(可选):自包含的解决方案(通常包括提示)- 示例:
{"task_id": "BigCodeBench/?", "solution": "def f():\n return 1"}
- 示例:
代码后处理
LLM生成的文本可能不是可编译的代码,因为它可能包含自然语言行或不完整的额外代码。我们提供了一个名为bigcodebench.sanitize
的工具来清理代码:
# 💡 如果你想获取校准后的结果:
bigcodebench.sanitize --samples samples.jsonl --calibrate
# 清理后的代码将输出到`samples-sanitized-calibrated.jsonl`
# 💡 可选择使用多进程运行清理步骤以加速
bigcodebench.sanitize --samples samples.jsonl --calibrate --parallel 8
# 💡 如果你想获取原始结果:
bigcodebench.sanitize --samples samples.jsonl
# 清理后的代码将输出到`samples-sanitized.jsonl`
# 💡 如果你将代码存储在目录中:
bigcodebench.sanitize --samples /path/to/vicuna-[??]b_temp_[??]
# 清理后的代码将输出到`/path/to/vicuna-[??]b_temp_[??]-sanitized`
如果你想使用预构建的Docker镜像进行后处理,可以使用以下命令:
# 在任何预构建的Docker镜像中将入口点改为bigcodebench.sanitize,例如bigcodebench/bigcodebench-evaluate:latest
docker run -it --entrypoint bigcodebench.sanitize -v $(pwd):/app bigcodebench/bigcodebench-evaluate:latest --samples samples.jsonl
检查后处理代码的兼容性(点击展开)
要再次检查后处理结果,你可以使用bigcodebench.syncheck
来检查清理前后的代码有效性,它会打印出错误的代码片段及其错误原因:
# 💡 如果你将代码存储在jsonl中:
bigcodebench.syncheck --samples samples.jsonl
# 💡 如果你将代码存储在目录中:
bigcodebench.syncheck --samples /path/to/vicuna-[??]b_temp_[??]
# 💡 或者在任何预构建的Docker镜像中将入口点改为bigcodebench.syncheck,例如
docker run -it --entrypoint bigcodebench.syncheck -v $(pwd):/app bigcodebench/bigcodebench-evaluate:latest --samples samples.jsonl
代码评估
强烈建议使用沙盒环境,如docker:
# 将当前目录挂载到容器中
# 如果你想更改RAM地址空间限制(单位MB,默认30 GB):`--max-as-limit XXX`
# 如果你想更改RAM数据段限制(单位MB,默认30 GB):`--max-data-limit`
# 如果你想更改RAM栈限制(单位MB,默认10 MB):`--max-stack-limit`
# 如果你想增加执行时间限制(单位秒,默认240秒):`--min-time-limit`
docker run -v $(pwd):/app bigcodebench/bigcodebench-evaluate:latest --split [complete|instruct] --subset [full|hard] --samples samples-sanitized-calibrated.jsonl
# 如果你只想检查标准答案
docker run -v $(pwd):/app bigcodebench/bigcodebench-evaluate:latest --split [complete|instruct] --subset [full|hard] --samples samples-sanitized-calibrated.jsonl --check-gt-only
...或者如果你不顾风险想在本地尝试 ⚠️:
首先,安装BigCodeBench的依赖:
pip install -r https://raw.githubusercontent.com/bigcode-project/bigcodebench/main/Requirements/requirements-eval.txt
然后运行评估:
# ...或在本地运行 ⚠️
bigcodebench.evaluate --split [complete|instruct] --subset [full|hard] --samples samples-sanitized-calibrated.jsonl
# ...如果你真的不想检查标准答案
bigcodebench.evaluate --split [complete|instruct] --subset [full|hard] --samples samples-sanitized-calibrated.jsonl --no-gt
# 如果你想将通过率保存到文件中
bigcodebench.evaluate --split [complete|instruct] --subset [full|hard] --samples samples-sanitized-calibrated.jsonl --save_pass_rate
# 强烈建议你在评估后使用以下命令清理环境:
pids=$(ps -u $(id -u) -o pid,comm | grep 'bigcodebench' | awk '{print $1}'); if [ -n \"$pids\" ]; then echo $pids | xargs -r kill; fi;
rm -rf /tmp/*
[!提示]
你的机器运行很慢吗?
LLM解决方案在超时(以及内存不足等情况)时被视为失败。 具体来说,我们根据标准答案解决方案的运行时间设置动态超时。
此外,我们不鼓励你在运行评估时使机器过度压力。 例如,在4核机器上使用
--parallel 64
或在评估过程中做其他事情都是不好的做法...
⌨️ 更多命令行参数 :: 点击展开 ::
--parallel
: 默认为核心数的一半
输出应该类似于(以下是GPT-4贪婪解码的示例):
断言标准答案...
预期输出在1200.0秒内计算完成
读取样本...
1140it [00:00, 1901.64it/s]
评估样本...
100%|██████████████████████████████████████████| 1140/1140 [19:53<00:00, 6.75it/s]
BigCodeBench-Instruct-calibrated
标准答案通过率: 1.000
pass@1: 0.568
- "k"包括
[1, 5, 10]
,其中<=
样本大小的k值将被使用 - 一个名为
samples_eval_results.json
的缓存文件将被缓存。删除它以重新运行评估
🤔 需要多长时间? :: 点击展开 ::
如果你进行贪婪解码,每个任务只有一个样本,评估应该在Intel(R) Xeon(R) Gold 6150 CPU @ 2.70GHz(由2个插槽组成,每个插槽18个核心)上只需要几分钟。但是,如果每个任务有多个样本,评估将需要更长时间。 以下是一些加速评估的提示:
- 使用
--parallel $(nproc)
- 使用我们的预评估结果(参见LLM生成的代码)
🔍 失败检查
你可以使用以下命令检查失败的样本:
# 检查失败的样本并将结果保存到`inspect/`
bigcodebench.inspect --eval_results sample-sanitized-calibrated_eval_results.json --split complete --subset hard
# 就地重新运行检查
bigcodebench.inspect --eval_results sample-sanitized-calibrated_eval_results.json --split complete --subset hard --in_place
🚀 完整脚本
我们提供了一个示例脚本来运行完整的流程:
bash run.sh
📊 结果分析
我们提供了一个脚本来复现Elo评分和任务解决率等分析,这有助于你进一步了解模型的性能。
要运行分析,你需要将所有`samples_eval_results.json`文件放在与脚本相同目录下的`results`文件夹中。
```bash
cd analysis
python get_results.py
💻 LLM生成的代码
我们分享了我们评估过的LLM预生成的代码样本:
- 请参见我们的v0.1.5附件。为了方便,我们同时包含了
sanitized_samples.zip
和sanitized_samples_calibrated.zip
。
🐞 已知问题
-
由于Hugging Face分词器更新,一些分词器可能会出现问题并降低评估性能。因此,我们在初始化时设置
legacy=False
。如果你注意到意外行为,请在生成时尝试使用--tokenizer_legacy
。 -
由于评估的不稳定性,执行结果可能在不同运行之间略有差异(完整集约0.2%,困难集约0.6%)。我们正在努力提高评估的稳定性。
-
运行评估时,你可能会遇到类似
ImportError: /usr/local/lib/python3.10/site-packages/matplotlib/_c_internal_utils.cpython-310-x86_64-linux-gnu.so: failed to map segment from shared object
的错误。这是由于docker容器的内存限制导致的。你可以增加docker容器的内存限制来解决这个问题。 -
我们意识到一些用户需要使用代理来访问互联网的问题。我们正在开发一个不需要互联网访问就能评估代码的任务子集。
📜 引用
@article{zhuo2024bigcodebench,
title={BigCodeBench: Benchmarking Code Generation with Diverse Function Calls and Complex Instructions},
author={Zhuo, Terry Yue and Vu, Minh Chien and Chim, Jenny and Hu, Han and Yu, Wenhao and Widyasari, Ratnadira and Yusuf, Imam Nur Bani and Zhan, Haolan and He, Junda and Paul, Indraneil and others},
journal={arXiv preprint arXiv:2406.15877},
year={2024}
}