🚀 Granite-3B-Code-Base-2K
Granite-3B-Code-Base-2K 是一个仅解码器的代码模型,专为代码生成任务(如代码生成、代码解释、代码修复等)而设计。它采用两阶段训练策略从头开始训练,能全面理解多种编程语言和语法,还具备良好的推理和遵循指令的能力。
🚀 快速开始
预期用途
大语言模型在软件工程生产力方面的重要企业用例包括代码生成、代码解释、代码修复、生成单元测试、生成文档、解决技术债务问题、漏洞检测、代码翻译等。所有 Granite 代码基础模型,包括这个 30 亿参数的模型,都能够处理这些任务,因为它们是在来自 116 种编程语言的大量代码数据上进行训练的。
生成代码示例
以下是一个如何使用 Granite-3B-Code-Base-2K 模型的简单示例:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
model_path = "ibm-granite/granite-3b-code-base-2k"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()
input_text = "def generate():"
input_tokens = tokenizer(input_text, return_tensors="pt")
for i in input_tokens:
input_tokens[i] = input_tokens[i].to(device)
output = model.generate(**input_tokens)
output = tokenizer.batch_decode(output)
for i in output:
print(i)
✨ 主要特性
- 全面的语言理解:在来自 116 种编程语言的 4 万亿个标记上进行训练,确保对编程语言和语法有全面的理解。
- 两阶段训练策略:第一阶段在大量代码数据上训练,第二阶段在精心设计的高质量代码和自然语言数据混合的 5000 亿个标记上训练,提高模型的推理和遵循指令的能力。
📦 安装指南
文档未提供安装步骤,故跳过此章节。
💻 使用示例
基础用法
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
model_path = "ibm-granite/granite-3b-code-base-2k"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device)
model.eval()
input_text = "def generate():"
input_tokens = tokenizer(input_text, return_tensors="pt")
for i in input_tokens:
input_tokens[i] = input_tokens[i].to(device)
output = model.generate(**input_tokens)
output = tokenizer.batch_decode(output)
for i in output:
print(i)
高级用法
文档未提供高级用法示例,故跳过此部分。
📚 详细文档
模型概述
Granite-3B-Code-Base-2K 是一个仅解码器的代码模型,专为代码生成任务(如代码生成、代码解释、代码修复等)而设计。它采用两阶段训练策略从头开始训练。在第一阶段,模型在来自 116 种编程语言的 4 万亿个标记上进行训练,确保对编程语言和语法有全面的理解。在第二阶段,模型在精心设计的高质量代码和自然语言数据混合的 5000 亿个标记上进行训练,以提高模型的推理和遵循指令的能力。
开发者信息
训练数据
- 数据收集和过滤:预训练代码数据来自公开可用的数据集(如 GitHub Code Clean、Starcoder data),以及来自 GitHub 的其他公共代码仓库和问题。我们对原始数据进行过滤,保留 116 种编程语言的代码。在进行语言过滤后,我们还会过滤掉低质量的代码。
- 精确和模糊去重:我们采用积极的去重策略,包括精确和模糊去重,以删除具有(近乎)相同代码内容的文档。
- HAP、PII、恶意软件过滤:我们应用 HAP 内容过滤器,以降低模型生成仇恨、辱骂或亵渎性语言的可能性。我们还通过用相应的标记(如 ⟨NAME⟩、⟨EMAIL⟩、⟨KEY⟩、⟨PASSWORD⟩)替换个人身份信息(PII)内容(如姓名、电子邮件地址、密钥、密码)来确保对其进行编辑。此外,我们使用 ClamAV 扫描所有数据集,以识别和删除源代码中的恶意软件实例。
- 自然语言数据集:除了收集用于模型训练的代码数据外,我们还策划了几个公开可用的高质量自然语言数据集,以提高模型在语言理解和数学推理方面的能力。与代码数据不同,我们不会对这些数据集进行去重。
基础设施
我们使用 IBM 的两个超级计算集群 Vela 和 Blue Vela 来训练 Granite 代码模型,这两个集群分别配备了 NVIDIA A100 和 H100 GPU。这些集群为在数千个 GPU 上训练我们的模型提供了可扩展且高效的基础设施。
伦理考虑和局限性
使用大语言模型涉及人们必须意识到的风险和伦理考虑。在代码生成方面,强烈建议不要完全依赖特定的代码模型来做出关键决策或获取有影响力的信息,因为生成的代码不能保证按预期工作。Granite-3B-Code-Base-2K 模型在这方面也不例外。尽管该模型适用于多个与代码相关的任务,但它没有进行任何安全对齐,因此可能会产生有问题的输出。此外,由于较小的模型尺寸和记忆容量,尚不确定它们在生成场景中是否可能因直接从训练数据集中复制源代码而更容易出现幻觉。这方面目前是一个活跃的研究领域,我们预计在这个领域会有更严格的探索、理解和缓解措施。在伦理方面,所有大语言模型都存在被恶意利用的潜在风险。我们敦促社区以合乎道德的意图和负责任的方式使用 Granite-3B-Code-Base-2K 模型。
🔧 技术细节
模型指标
任务类型 |
数据集 |
pass@1 值 |
文本生成 |
MBPP |
36.0 |
文本生成 |
MBPP+ |
45.1 |
文本生成 |
HumanEvalSynthesis(Python) |
36.6 |
文本生成 |
HumanEvalSynthesis(JavaScript) |
37.2 |
文本生成 |
HumanEvalSynthesis(Java) |
40.9 |
文本生成 |
HumanEvalSynthesis(Go) |
26.2 |
文本生成 |
HumanEvalSynthesis(C++) |
35.4 |
文本生成 |
HumanEvalSynthesis(Rust) |
22.0 |
文本生成 |
HumanEvalExplain(Python) |
25.0 |
文本生成 |
HumanEvalExplain(JavaScript) |
18.9 |
文本生成 |
HumanEvalExplain(Java) |
29.9 |
文本生成 |
HumanEvalExplain(Go) |
17.1 |
文本生成 |
HumanEvalExplain(C++) |
26.8 |
文本生成 |
HumanEvalExplain(Rust) |
14.0 |
文本生成 |
HumanEvalFix(Python) |
18.3 |
文本生成 |
HumanEvalFix(JavaScript) |
23.2 |
文本生成 |
HumanEvalFix(Java) |
29.9 |
文本生成 |
HumanEvalFix(Go) |
24.4 |
文本生成 |
HumanEvalFix(C++) |
16.5 |
文本生成 |
HumanEvalFix(Rust) |
3.7 |
模型信息表格
属性 |
详情 |
模型类型 |
仅解码器的代码模型 |
训练数据 |
来自 116 种编程语言的 4 万亿个标记(第一阶段);精心设计的高质量代码和自然语言数据混合的 5000 亿个标记(第二阶段) |
训练数据集 |
codeparrot/github-code-clean、bigcode/starcoderdata、open-web-math/open-web-math、math-ai/StackMathQA 等 |
评估指标 |
code_eval |
库名称 |
transformers |
标签 |
code、granite |
📄 许可证
本模型使用 Apache 2.0 许可证。