Project Icon

bigcodebench

高难度代码生成基准测试评估LLM编程能力

BigCodeBench是一个具有挑战性的代码生成基准测试,用于评估大型语言模型的实际编程能力。它提供复杂指令和多样函数调用,包括数据集、生成和评估脚本。基于EvalPlus框架,BigCodeBench实现精确评估和排名,提供预生成样本以加速研究。支持多种评估环境,采用unittest进行代码测试,为研究人员提供全面工具。

BigCodeBench

BigCodeBench

🌸关于🔥快速开始🔍失败检查🚀完整脚本📊结果分析💻LLM生成的代码🐞已知问题📜引用🙏致谢

🌸 关于

BigCodeBench

BigCodeBench是一个易于使用的代码生成基准测试,包含实用具有挑战性的编程任务。它旨在以更真实的环境评估大型语言模型(LLMs)的真实编程能力。该基准测试设计用于类似HumanEval的函数级代码生成任务,但具有更复杂的指令和多样化的函数调用。 为了便于在BigCodeBench上评估LLMs,我们提供了这个Python包bigcodebench,其中包含数据集、生成脚本和评估脚本。该包基于EvalPlus框架构建,这是一个灵活且可扩展的代码生成任务评估框架。

为什么选择BigCodeBench?

BigCodeBench专注于评估具有多样化函数调用复杂指令的LLM4Code,具有以下特点:

  • 精确评估和排名:查看我们的排行榜,了解严格评估前后的最新LLM排名。
  • 预生成样本:BigCodeBench通过开源各种模型的LLM生成样本加速代码智能研究 -- 无需重新运行昂贵的基准测试!

与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是标准实现
  • testunittest.TestCase

注意

[模型名称]--bigcodebench-[任务]--[后端]-[温度]-[样本数].jsonl的预期模式

  1. task_id:任务ID,即get_bigcodebench()的键
  2. 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个核心)上只需要几分钟。但是,如果每个任务有多个样本,评估将需要更长时间。 以下是一些加速评估的提示:

🔍 失败检查

你可以使用以下命令检查失败的样本:

# 检查失败的样本并将结果保存到`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.zipsanitized_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}
}

🙏 致谢

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号