
🏠 主页 | 📖 博客 | 🪧 演示 | 🤖 下载模型 | 📄 论文 | 🌐 中文
🛠 支持 VS Code, Jetbrains, Cloud Studio | 👋 加入我们的 Discord, Slack, Telegram, 微信
🌟 最新一代 CodeGeeX4 模型已经正式开源。 | The newest CodeGeeX4 has been released.
我们介绍 CodeGeeX,一个拥有 130 亿参数的多语言代码生成预训练模型。CodeGeeX 采用华为昇腾 910 AI 处理器和 MindSpore 框架实现,在 23 种编程语言的代码语料库(>8500 亿Token)上预训练得到。截至 2022年6月22日,CodeGeeX 已在 1536 个 Ascend 910 AI 处理器集群上训练了超过 8500 亿Token。CodeGeeX 具有以下独特特性:
HumanEval-X:真实的多语言基准测试。为了帮助标准化多语言代码生成和翻译的评估,我们开发并发布了 HumanEval-X 基准。HumanEval-X 是一个新的多语言基准,包含 5 种编程语言(Python、C++、Java、JavaScript 和 Go)的 820 个人工编写的编程问题,每个问题都配有测试用例和解决方案。使用说明 🤗 HuggingFace 上可用

与其他开源多语言基线模型相比,CodeGeeX 取得了最高的平均性能。
🌟 2023-07-24: CodeGeeX2 已发布,更强大、更快速、更轻量。支持 100+ 种语言和许多新功能。
2023-5-16: CodeGeeX 论文已被 KDD 2023, Long Beach 接收,并将在会议期间展示。
2023-03-30: CodeGeeX 论文现已在 arxiv 上发布。
2023-02-14: CodeGeeX 现已支持腾讯出品的优秀网页 IDE Cloud Studio。点击本页顶部的徽章可快速启动环境测试 CodeGeeX。
2023-02-13: 非常感谢 OneFlow 团队为 CodeGeeX 的推理添加了 oneflow 后端(在 FP16 下甚至比 FasterTransformer 更快!)。查看详情请点击此处。
2023-02: 我们正在举办 CodeGeeX "Coding With AI" 黑客松,基于 CodeGeeX 设计酷炫应用并赢取奖品(RTX 4090、大疆无人机等)!
2022-12-31: 我们在 codegeex-fastertransformer 中发布了 CodeGeeX 的 FasterTransformer 版本。INT8 加速版本平均速度达到 <15ms/Token。祝大家新年快乐!
2022-12-13: 我们在 codegeex-vscode-extension 中发布了 CodeGeeX VS Code 扩展的源代码。按照快速开始进行开发。
2022-12-11: CodeGeeX 现已可用于 Jetbrains IDE(IntelliJ IDEA、PyCharm、GoLand、CLion 等),点击此处下载。
2022-12-04: 我们发布了量化(减少 GPU 显存需求:27GB -> 15GB)和模型并行(可在多张 <8G 显存的 GPU 上运行)的源代码。
2022-09-30: 我们发布了跨平台源代码和模型权重,同时支持昇腾和 NVIDIA 平台。
CodeGeeX 最初基于 Mindspore 实现,并在 Ascend 910 AI 处理器上训练。我们提供了一个基于 Megatron-LM 的 torch 兼容版本,以方便在 GPU 平台上使用。
需要 Python 3.7+ / CUDA 11+ / PyTorch 1.10+ / DeepSpeed 0.6+。通过以下命令安装 codegeex 包:
git clone git@github.com:THUDM/CodeGeeX.git
cd CodeGeeX
pip install -e .
或者使用 CodeGeeX docker 快速设置环境(需安装 nvidia-docker):
docker pull codegeex/codegeex:latest
# 如需启用 GPU 支持,请使用 --device 明确指定设备 ID
docker run --gpus '"device=0,1"' -it --ipc=host --name=codegeex codegeex/codegeex
通过此链接申请并下载模型权重。您将通过邮件收到包含临时下载链接的 urls.txt 文件。我们建议使用 aria2 通过以下命令下载(请确保有足够的磁盘空间来下载检查点(约 26GB)):
aria2c -x 16 -s 16 -j 4 --continue=true -i urls.txt
运行以下命令获取完整的模型权重:
cat codegeex_13b.tar.gz.* > codegeex_13b.tar.gz
tar xvf codegeex_13b.tar.gz
尝试使用 CodeGeeX 生成第一个程序。首先,在 configs/codegeex_13b.sh 中指定模型权重的路径。其次,将提示(自然语言描述或代码片段)写入一个文件,例如 tests/test_prompt.txt,然后运行以下脚本:
# 在单张 GPU 上(显存大于 27GB)
bash ./scripts/test_inference.sh <GPU_ID> ./tests/test_prompt.txt
# 使用量化(显存大于 15GB)
bash ./scripts/test_inference_quantized.sh <GPU_ID> ./tests/test_prompt.txt
# 在多张 GPU 上(每张显存大于 6GB,需要先将 ckpt 转换为 MP_SIZE 分区)
bash ./scripts/convert_ckpt_parallel.sh <LOAD_CKPT_PATH> <SAVE_CKPT_PATH> <MP_SIZE>
bash ./scripts/test_inference_parallel.sh <MP_SIZE> ./tests/test_prompt.txt
基于 CodeGeeX,我们还为 VS Code 和 Jetbrains IDE 开发了免费扩展,未来将支持更多平台。
对于 VS Code,在市场中搜索 "codegeex" 或点击此处安装。详细说明请参阅 VS Code 扩展指南。对于开发者,我们已在 codegeex-vscode-extension 中发布了源代码,请按照快速开始进行开发。
对于 Jetbrains IDE,在插件中搜索 "codegeex" 或点击此处安装。请确保您的 IDE 版本为 2021.1 或更高。CodeGeeX 目前支持 IntelliJ IDEA、PyCharm、GoLand、CLion、Android Studio、AppCode、Aqua、DataSpell、DataGrip、Rider、RubyMine 和 WebStorm。
架构:CodeGeeX 是一个基于 Transformer 的大规模预训练编程语言模型。它是一个从左到右的自回归解码器,接收代码和自然语言作为输入,并预测下一个 Token 的概率。CodeGeeX 包含 40 个 Transformer 层,自注意力模块的隐藏层大小为 5,120,前馈网络层大小为 20,480,使其参数量达到 130 亿。它支持的最大序列长度为 2,048。

左图: CodeGeeX 训练数据中编程语言的比例。 右图: CodeGeeX 训练损失随训练步数的变化曲线。
代码语料库:我们的训练数据包含两部分。第一部分来自开源代码数据集,The Pile 和 CodeParrot。The Pile 包含一个代码语料库子集,收集了 GitHub 上星标超过 100 的公共仓库,我们从中选取了 23 种流行编程语言的代码。第二部分是从未出现在先前数据集中的公共 GitHub 仓库直接抓取的补充数据,包括 Python、Java 和 C++。为了获得潜在更高质量的数据,我们选择了至少有一个星标且大小小于 10MB 的仓库。文件如果满足以下条件之一则被过滤:1) 平均每行超过 100 个字符,2) 是自动生成的,3) 字母比例低于 40%,或 4) 大于 100KB 或小于 1KB。为了帮助模型区分不同语言,我们在每个片段的开头添加了特定语言的前缀,格式为 [注释符号] language: [LANG],例如 # language: Python。对于分词,我们使用与 GPT-2 相同的分词器,并将空格作为额外 Token 处理,最终词汇表包含 50,400 个 Token。总计,代码语料库涵盖 23 种编程语言,包含 1587 亿 Token。
训练:我们在 Mindspore 1.7 中实现 CodeGeeX,并在 1,536 个 Ascend 910 AI 处理器(32GB)上训练。模型权重采用 FP16 格式,但为了提高精度和稳定性,层归一化和 softmax 使用 FP32。整个模型消耗约 27GB 内存。为了提高训练效率,我们采用了 8 路模型并行训练和 192 路数据并行训练,并启用了 ZeRO-2 优化器。微批次大小为 16,全局批次大小达到 3,072。此外,我们还采用了逐元素算子融合、快速 gelu 激活、矩阵乘法维度优化等技术来进一步提升训练效率。整个训练过程历时近两个月,从 2022年4月18日持续到6月22日,期间通过了 8500 亿 Token 的训练,即 5+ 个 epoch。
为了更好地评估代码生成模型的多语言能力,我们提出了新的基准 HumanEval-X。以往的工作通常在语义相似度(如 CodeBLEU)下评估多语言程序合成,但这常常具有误导性,而 HumanEval-X 评估生成程序的功能正确性。HumanEval-X 包含 Python、C++、Java、JavaScript 和 Go 五种语言的 820 个高质量人工编写的数据样本(每个都配有测试用例),可用于多种任务。

HumanEval-X 支持任务的示意图。声明、文档字符串和解决方案分别用红色、绿色和蓝色标记。代码生成使用声明和文档字符串作为输入,生成解决方案。代码翻译使用两种语言的声明,并将源语言的解决方案翻译为目标语言的解决方案。
在 HumanEval-X 中,每种语言的每个样本都包含声明、文档字符串和解决方案,可以以各种方式组合以支持不同的下游任务,包括生成、翻译、总结等。我们目前重点关注两个任务:代码生成和代码翻译。对于代码生成,模型使用声明和文档字符串作为输入来生成解决方案。对于代码翻译,模型使用两种语言的声明和源语言的解决方案作为输入,生成目标语言的解决方案。我们在代码翻译过程中移除了描述,以防止模型直接解决问题。对于这两个任务,我们使用 Codex 中提出的无偏 pass@k 指标:$\text{pass}@k:= \mathbb{E}[1-\frac{\tbinom{n-c}{k}}{\tbinom{n}{k}}]$,其中 $n=200$,$k\in(1,10,100)$。

左图: HumanEval-X 中五种语言在代码生成任务上的详细 pass@k (k=1,10,100) 性能。右图: 每个模型在所有语言上的平均性能。与 InCoder-6.7B、CodeGen-Multi-6B 和 CodeGen-Multi-16B 相比,CodeGeeX