纸| ? HuggingFace 系列 |讨论页
我们引入了 Granite 系列仅解码器代码模型,用于代码生成任务(例如修复错误、解释代码、记录代码),并使用 116 种编程语言编写的代码进行训练。对 Granite Code 模型系列在不同任务上的综合评估表明,我们的模型在可用的开源代码 LLM 中始终达到最先进的性能。
Granite Code 模型的主要优点包括:
Granite 代码模型系列有两个主要变体:
基本型号和指导型号均提供 3B、8B、20B 和 34B 参数尺寸。
我们准备代码预训练数据的过程涉及几个阶段。首先,我们收集公开可用的数据集(例如 GitHub Code Clean、Starcoder 数据)、公共代码存储库和来自 GitHub 的问题的组合。其次,我们根据写入数据的编程语言(我们根据文件扩展名确定)过滤收集的代码数据。然后,我们也过滤掉代码质量低的数据。第三,我们采用积极的重复数据删除策略,包括精确重复数据删除和模糊重复数据删除,以删除具有(几乎)相同代码内容的文档。最后,我们应用 HAP 内容过滤器来降低模型生成仇恨、辱骂或亵渎语言的可能性。我们还确保通过将 PII 内容(例如姓名、电子邮件地址、密钥、密码)替换为相应的令牌(例如,⟨NAME⟩、⟨EMAIL⟩、⟨KEY⟩、⟨PASSWORD⟩)来编辑个人身份信息 (PII) 。我们还使用 ClamAV 扫描所有数据集,以识别并删除源代码中的恶意软件实例。除了收集模型训练的代码数据之外,我们还策划了几个公开的高质量自然语言数据集,以提高模型在语言理解和数学推理方面的熟练程度。
Granite Code Base模型在 3-4T 代码数据标记和与代码相关的自然语言数据集上进行训练。数据通过字节对编码 (BPE) 进行标记,使用与 StarCoder 相同的标记器。我们利用高质量数据进行两个阶段的训练,如下所示:
Granite Code Instruct 模型针对以下类型的指令数据进行了微调:1)来自 CommitPackFT 的代码提交,2)高质量数学数据集,特别是我们使用 MathInstruct 和 MetaMathQA,3)代码指令数据集,例如 Glaive-Code-Assistant- v3、Self-OSS-Instruct-SC2、Glaive-Function-Calling-v2、NL2SQL11 和一小部分合成 API 调用数据集,以及 4) 高质量语言指令数据集,例如 HelpSteer 和 Platypus 的开放许可证过滤版本。
我们根据全面的基准测试列表对我们的代码模型进行了广泛的评估,其中包括但不限于 HumanEvalPack、MBPP 和 MBPP+。这组基准测试涵盖了常用编程语言(例如 Python、JavaScript、Java、Go、C++、Rust)的不同编码任务。
我们的研究结果表明,Granite Code 模型在各个模型大小上都优于强大的开源模型。下图说明了Granite-8B-Code-Base
在三个编码任务中如何优于Mistral-7B
、 LLama-3-8B
和其他开源模型。我们在论文中提供了进一步的评估结果。
要使用我们的任何模型,请从以下位置选择适当的model_path
:
ibm-granite/granite-3b-code-base-2k
ibm-granite/granite-3b-code-instruct-2k
ibm-granite/granite-8b-code-base-4k
ibm-granite/granite-8b-code-instruct-4k
ibm-granite/granite-20b-code-base-8k
ibm-granite/granite-20b-code-instruct-8k
ibm-granite/granite-34b-code-base-8k
ibm-granite/granite-34b-code-instruct-8k
from transformers import AutoModelForCausalLM , AutoTokenizer
device = "cuda" # or "cpu"
model_path = "ibm-granite/granite-3b-code-base-2k" # pick anyone from above list
tokenizer = AutoTokenizer . from_pretrained ( model_path )
# drop device_map if running on CPU
model = AutoModelForCausalLM . from_pretrained ( model_path , device_map = device )
model . eval ()
# change input text as desired
input_text = "def generate():"
# tokenize the text
input_tokens = tokenizer ( input_text , return_tensors = "pt" )
# transfer tokenized inputs to the device
for i in input_tokens :
input_tokens [ i ] = input_tokens [ i ]. to ( device )
# generate output tokens
output = model . generate ( ** input_tokens )
# decode output tokens into text
output = tokenizer . batch_decode ( output )
# loop over the batch to print, in this example the batch size is 1
for i in output :
print ( i )
我们使用 Dolomite 引擎来微调(或指令调整)我们的所有模型。我们提供了用于微调ibm-granite/granite-3b-code-base
示例脚本。要微调模型,只需按照以下步骤操作:
git clone https://github.com/IBM/dolomite-engine/
cd dolomite-engine
# you might need to modify configs/granite-example/training.yml
sh scripts/finetune.sh configs/granite-example/training.yml
# once the model is trained, convert to HuggingFace-compatible safetensors
sh scripts/export.sh configs/granite-example/export.yml
提示
如果您想在训练期间使用无填充变压器来节省内存占用和 FLOP,请按照 Dolomite 引擎自述文件中的说明了解更多详细信息。
请查看我们的指南和行为准则,为我们的项目做出贡献。
每个模型变体的模型卡都可以在各自的 HuggingFace 存储库中找到。请在这里访问我们的收藏。
可以使用以下命令克隆所选模型(本例中为 Granite-3b-code-base):
git clone https://huggingface.co/ibm-granite/granite-3b-code-base-2k
所有 Granite 代码模型均根据 Apache 2.0 许可证分发。
请访问我们的收藏,让我们知道您对我们的代码模型系列的评论。选择您想要提供反馈的模型的存储库。然后,转到“社区”选项卡,然后单击“新讨论” 。或者,您也可以在我们的 github 讨论页面上发布任何问题/评论。