Granite-20B-Code-Base-8K 项目介绍
项目概述
Granite-20B-Code-Base-8K 是一个专为代码生成任务(如代码生成、代码解释、代码修复等)设计的解码器模型。该模型采用了两阶段训练策略:在第一阶段中,从116种编程语言中提取的3万亿个标记为训练数据,确保对各种编程语言和语法有全面理解;在第二阶段,使用包含5000亿个标记的高质量数据混合体对模型进行训练,以提升其推理和理解指令的能力。
- 开发者: IBM Research
- GitHub 仓库: ibm-granite/granite-code-models
- 论文: Granite Code Models: A Family of Open Foundation Models for Code Intelligence
- 发布日期: 2024年5月6日
- 许可证: Apache 2.0
使用说明
预期用途
Granite-20B-Code-Base-8K 模型适用于软件工程中的各种生产力提升任务,如代码生成、代码解释、代码修复、生成单元测试、生成文档、处理技术债务问题、漏洞检测、代码翻译等。这些任务得益于其从116种编程语言的海量代码数据中获得的训练。
生成示例
以下是如何使用 Granite-20B-Code-Base-8K 模型的简单示例:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # 或 "cpu"
model_path = "ibm-granite/granite-20b-code-base-8k"
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 如果在CPU上运行,移除设备映射
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)
# 循环遍历批次打印结果,本例中批大小为1
for i in output:
print(i)
训练数据
- 数据收集与过滤: 预训练代码数据来自多种公开可用的数据库(如 GitHub Code Clean、Starcoder data),以及额外的公共代码仓库和GitHub的问题。经过过滤后保留了116种编程语言,并剔除了低质量代码。
- 精确和模糊去重: 采用了包括精确和模糊去重在内的积极去重策略,以移除具有(近似)相同代码内容的文档。
- HAP、PII、恶意软件过滤: 使用HAP内容过滤器减少生成仇恨、辱骂或亵渎语言的可能性,并通过用相应的标记替换个人识别信息(PII)(如姓名、邮箱地址、密钥、密码)来确保安全。此外,使用ClamAV扫描所有数据集,以识别和移除源代码中的恶意软件。
- 自然语言数据集: 除了收集代码数据用于模型训练外,还精心挑选了几个公开可用的高质量自然语言数据集,以提高模型的语言理解和数学推理能力。这些数据集未进行去重。
基础设施
Granite代码模型使用IBM的两大超级计算集群Vela和Blue Vela进行训练,它们分别配备了NVIDIA A100和H100 GPU。这样的集群提供了可扩展和高效的基础设施,支持数千个GPU进行模型训练。
道德考量与局限性
使用大型语言模型的过程中,存在各种风险和道德考量。关于代码生成,建议人们不要完全依赖特定代码模型作出关键决策或提供重要信息,因为生成的代码可能无法正常工作。Granite-20B-Code-Base-8K 模型也不例外。尽管该模型适合多种代码相关任务,但它尚未经过安全对齐,因此可能会生成有问题的输出。同时,一些更小的模型由于规模和记忆能力的限制,在生成场景中可能更容易从训练数据集中直接复制源码,这也是一个正在积极研究的领域。关于道德,一个潜在风险是所有大型语言模型都可能被恶意使用。我们呼吁社区以道德方式和负责任地使用 Granite-20B-Code-Base-8K 模型。