Papel | ? Coleção HuggingFace | Página de discussões
Apresentamos a série Granite de modelos de código somente decodificadores para tarefas de geração de código (por exemplo, correção de bugs, explicação de código, documentação de código), treinados com código escrito em 116 linguagens de programação. Uma avaliação abrangente da família de modelos Granite Code em diversas tarefas demonstra que nossos modelos alcançam consistentemente desempenho de última geração entre os LLMs de código-fonte aberto disponíveis.
As principais vantagens dos modelos Granite Code incluem:
A família de Granite Code Models vem em duas variantes principais:
Os modelos base e de instrução estão disponíveis nos tamanhos dos parâmetros 3B, 8B, 20B e 34B.
Nosso processo de preparação de dados de pré-treinamento de código envolve vários estágios. Primeiro, coletamos uma combinação de conjuntos de dados disponíveis publicamente (por exemplo, GitHub Code Clean, dados Starcoder), repositórios de código público e problemas do GitHub. Segundo, filtramos os dados de código coletados com base na linguagem de programação na qual os dados são gravados (que determinamos com base na extensão do arquivo). Em seguida, também filtramos dados com baixa qualidade de código. Terceiro, adotamos uma estratégia agressiva de desduplicação que inclui desduplicação exata e difusa para remover documentos com conteúdo de código (quase) idêntico. Por fim, aplicamos um filtro de conteúdo HAP que reduz a probabilidade dos modelos gerarem linguagem odiosa, abusiva ou profana. Também nos certificamos de redigir informações de identificação pessoal (PII), substituindo o conteúdo de PII (por exemplo, nomes, endereços de e-mail, chaves, senhas) por tokens correspondentes (por exemplo, ⟨NAME⟩, ⟨EMAIL⟩, ⟨KEY⟩, ⟨PASSWORD⟩) . Também verificamos todos os conjuntos de dados usando ClamAV para identificar e remover instâncias de malware no código-fonte. Além de coletar dados de código para treinamento de modelos, selecionamos vários conjuntos de dados de linguagem natural de alta qualidade disponíveis publicamente para melhorar a proficiência do modelo na compreensão da linguagem e no raciocínio matemático.
Os modelos Granite Code Base são treinados em tokens 3-4T de dados de código e conjuntos de dados de linguagem natural relacionados ao código. Os dados são tokenizados por meio de codificação de pares de bytes (BPE), empregando o mesmo tokenizer do StarCoder. Utilizamos dados de alta qualidade com duas fases de treinamento, como segue:
Os modelos Granite Code Instruct são ajustados nos seguintes tipos de dados de instrução: 1) commits de código provenientes de CommitPackFT, 2) conjuntos de dados matemáticos de alta qualidade, especificamente usamos MathInstruct e MetaMathQA, 3) conjuntos de dados de instrução de código, como Glaive-Code-Assistant- v3, Self-OSS-Instruct-SC2, Glaive-Function-Calling-v2, NL2SQL11 e uma pequena coleção de chamadas de API sintéticas conjuntos de dados e 4) conjuntos de dados de ensino de idiomas de alta qualidade, como HelpSteer e uma versão aberta do Platypus com filtro de licença.
Conduzimos uma avaliação extensiva de nossos modelos de código em uma lista abrangente de benchmarks que inclui, entre outros, HumanEvalPack, MBPP e MBPP+. Este conjunto de benchmarks abrange diferentes tarefas de codificação em linguagens de programação comumente usadas (por exemplo, Python, JavaScript, Java, Go, C++, Rust).
Nossas descobertas revelam que os modelos Granite Code superam os fortes modelos de código aberto em todos os tamanhos de modelo. A figura abaixo ilustra como Granite-8B-Code-Base
supera Mistral-7B
, LLama-3-8B
e outros modelos de código aberto em três tarefas de codificação. Fornecemos mais resultados de avaliação em nosso artigo.
Para usar qualquer um de nossos modelos, escolha um model_path
apropriado em:
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 )
Usamos Dolomite Engine para ajuste fino (ou ajuste de instrução) de todos os nossos modelos. Fornecemos scripts de amostra para ajuste fino ibm-granite/granite-3b-code-base
. Para ajustar os modelos, basta seguir estas etapas:
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
Dica
Se você quiser usar transformadores sem preenchimento para economizar memória e FLOPs durante o treinamento, siga as instruções no README do Dolomite Engine para obter mais detalhes.
Consulte nossas Diretrizes e Código de Conduta para contribuir com nosso projeto.
Os cartões de modelo para cada variante de modelo estão disponíveis em seus respectivos repositórios HuggingFace. Por favor visite nossa coleção aqui.
O modelo de escolha (granite-3b-code-base neste exemplo) pode ser clonado usando:
git clone https://huggingface.co/ibm-granite/granite-3b-code-base-2k
Todos os modelos de código Granite são distribuídos sob licença Apache 2.0.
Deixe-nos saber seus comentários sobre nossa família de modelos de código visitando nossa coleção. Selecione o repositório do modelo sobre o qual você gostaria de fornecer feedback. Em seguida, vá para a guia Comunidade e clique em Nova discussão . Alternativamente, você também pode postar perguntas/comentários em nossa página de discussões no github.