Transformers documentation
CodeLlama
Este modelo foi publicado no HF papers em 2023-08-24 e contribuído para o Hugging Face Transformers em 2023-08-25.
CodeLlama
Code Llama é uma família especializada de grandes modelos de linguagem baseada em Llama 2 para tarefas de codificação. Ela está disponível em diferentes variações — código geral, específico para Python e variante de seguimento de instruções — todas com 7B, 13B, 34B e 70B parâmetros. Os modelos Code Llama podem gerar, explicar e até preencher partes ausentes do seu código (chamado de “infilling”). Eles também conseguem lidar com contextos muito longos, com geração estável de até 100k tokens, mesmo tendo sido treinados em sequências de 16K tokens.
Você pode encontrar todos os checkpoints originais do Code Llama na coleção Code Llama.
Clique nos modelos Code Llama na barra lateral à direita para ver mais exemplos de como aplicar o Code Llama a diferentes tarefas de programação.
O exemplo abaixo demonstra como gerar código com Pipeline, ou com o AutoModel, e a partir da linha de comando.
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/CodeLlama-7b-hf",
device_map=0
)
# basic code generation
result = pipe("# Function to calculate the factorial of a number\ndef factorial(n):", max_new_tokens=256)
print(result[0]['generated_text'])
# infilling
infill_result = pipe("def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result", max_new_tokens=200)
print(infill_result[0]['generated_text'])from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-7b-hf",
device_map="auto",
attn_implementation="sdpa"
)
# basic code generation
prompt = "# Function to calculate the factorial of a number\ndef factorial(n):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(
**input_ids,
max_new_tokens=256,
cache_implementation="static"
)
print(tokenizer.decode(output[0], skip_special_tokens=True))
# infilling
infill_prompt = "def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result"
input_ids = tokenizer(infill_prompt, return_tensors="pt").to(model.device)
filled_output = model.generate(**input_ids, max_new_tokens=200)
filled_text = tokenizer.decode(filled_output[0], skip_special_tokens=True)
print(filled_text)A quantização reduz a carga de memória de modelos grandes ao representar os pesos em uma precisão menor. Consulte a visão geral de Quantização para mais backends de quantização disponíveis.
O exemplo abaixo usa bitsandbytes para quantizar apenas os pesos para 4 bits.
# pip install bitsandbytes
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, CodeLlamaTokenizer
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True)
tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-34b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-34b-hf",
device_map="auto",
quantization_config=bnb_config
)
prompt = "# Write a Python function to check if a string is a palindrome\ndef is_palindrome(s):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(**input_ids, max_new_tokens=200, cache_implementation="static")
print(tokenizer.decode(output[0], skip_special_tokens=True))Use o AttentionMaskVisualizer para entender melhor quais tokens o modelo pode e não pode observar.
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
return a + b""")
Observações
O infilling está disponível apenas nos modelos base de 7B e 13B, e não nos modelos Python, Instruct, 34B ou 70B.
Use o token
<FILL_ME>no local em que deseja que a entrada seja preenchida. O tokenizer divide esse token para criar uma string de entrada formatada que segue o padrão de treinamento original. Isso é mais robusto do que preparar o padrão manualmente.from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf") model = LlamaForCausalLM.from_pretrained("meta-llama/CodeLlama-7b-hf", device_map="auto") PROMPT = '''def remove_non_ascii(s: str) -> str: """ <FILL_ME> return result ''' input_ids = tokenizer(PROMPT, return_tensors="pt").to(model.device)["input_ids"] generated_ids = model.generate(input_ids, max_new_tokens=128) filling = tokenizer.batch_decode(generated_ids[:, input_ids.shape[1]:], skip_special_tokens = True)[0] print(PROMPT.replace("<FILL_ME>", filling))Use
bfloat16para treinamento adicional ou ajuste fino efloat16para inferência.O caractere
BOSnão é usado para infilling ao codificar o prefixo ou o sufixo, mas apenas no início de cada prompt.O tokenizer é um modelo de codificação de pares de bytes baseado no SentencePiece. Durante a decodificação, se o primeiro token for o início de uma palavra (por exemplo, “Banana”), o tokenizer não adiciona o espaço de prefixo à string.
CodeLlamaTokenizer
classe transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_token = '<unk>'bos_token = '<s>'eos_token = '</s>'prefix_token = '▁<PRE>'middle_token = '▁<MID>'suffix_token = '▁<SUF>'eot_token = '▁<EOT>'fill_token = '<FILL_ME>'additional_special_tokens = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
Parâmetros
- clean_up_tokenization_spaces (
str, opcional, padrãoFalse) — Se deve limpar os espaços após a decodificação. A limpeza consiste em remover possíveis artefatos, como espaços extras. - unk_token (
str, opcional, padrão"<unk>") — O token desconhecido. Um token que não está no vocabulário não pode ser convertido em um ID e é definido como este token em vez disso. - bos_token (
str, opcional, padrão"<s>") — O token de início de sequência usado durante o pré-treinamento. Pode ser usado como token de classificador de sequência. - eos_token (
str, opcional, padrão"</s>") — O token de fim de sequência. - prefix_token (
str, opcional, padrão"▁<PRE>") — Token de prefixo usado para infilling. - middle_token (
str, opcional, padrão"▁<MID>") — Token intermediário usado para infilling. - suffix_token (
str, opcional, padrão"▁<SUF>") — Token de sufixo usado para infilling. - eot_token (
str, opcional, padrão"▁<EOT>") — Token de fim de texto usado para infilling. - fill_token (
str, opcional, padrão"<FILL_ME>") — O token usado para dividir a entrada entre o prefixo e o sufixo. - additional_special_tokens (
list[str], opcional) — Tokens especiais adicionais usados pelo tokenizer. - add_bos_token (
bool, opcional, padrãoTrue) — Se deve adicionar um token de início de sequência no início das sequências. - add_eos_token (
bool, opcional, padrãoFalse) — Indica se um token de fim de sequência deve ser adicionado ao final das sequências. - use_default_system_prompt (
bool, opcional, padrãoFalse) — Indica se o prompt de sistema padrão para Llama deve ser utilizado. - add_prefix_space (
bool, opcional) — Indica se deve ou não adicionar um espaço inicial à entrada. Isso permite tratar a palavra inicial como qualquer outra palavra. - vocab (
str,dictoulist, opcional) — Dicionário de vocabulário personalizado. Se não for fornecido, o vocabulário é carregado de vocab_file. - merges (
stroulist, opcional) — Lista de mesclagens personalizada. Se não for fornecida, as mesclagens são carregadas de merges_file. - vocab_file (
str, opcional) — arquivo SentencePiece (geralmente com a extensão .model) que contém o vocabulário necessário para instanciar um tokenizador.
Construa um tokenizador Llama. Baseado em Byte-Pair-Encoding em nível de bytes.
Isso usa notavelmente ByteFallback e sem normalização.
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]Se você quiser alterar o bos_token ou o eos_token, certifique-se de especificá-los ao inicializar o modelo, ou
chamar tokenizer.update_post_processor() para garantir que o pós-processamento seja realizado corretamente (caso contrário,
os valores do primeiro token e do token final de uma sequência codificada não serão corretos). Para mais detalhes, consulte a
documentação de [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Este tokenizer herda de PreTrainedTokenizerFast, que contém a maioria dos métodos principais. Os usuários devem consultar essa superclasse para obter mais informações sobre esses métodos. A configuração padrão é a mesma de meta-llama/CodeLlama-7b-Instruct-hf, que suporta prompt infilling.
get_special_tokens_mask
< source >( token_ids_0: list[int]token_ids_1: list[int] | None = Nonealready_has_special_tokens: bool = False ) → A list of integers in the range [0, 1]
Parâmetros
- token_ids_0 — Lista de IDs da sequência (possivelmente já formatada).
- token_ids_1 — Não utilizado quando
already_has_special_tokens=True. Deve ser None nesse caso. - already_has_special_tokens — Indica se a sequência já está formatada com tokens especiais.
Retorna
Uma lista de inteiros no intervalo [0, 1]
1 para um token especial, 0 para um token de sequência.
Obter os ids de sequência de uma lista de tokens que não possui tokens especiais adicionados.
Para tokenizadores rápidos, os data collators chamam isso com already_has_special_tokens=True para construir uma máscara sobre uma sequência já formatada. Nesse caso, calculamos a máscara verificando a pertença em all_special_ids.
Atualiza o pós-processador subjacente com o bos_token e o eos_token atuais.
CodeLlamaTokenizerFast
classe transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_token = '<unk>'bos_token = '<s>'eos_token = '</s>'prefix_token = '▁<PRE>'middle_token = '▁<MID>'suffix_token = '▁<SUF>'eot_token = '▁<EOT>'fill_token = '<FILL_ME>'additional_special_tokens = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
Parâmetros
- clean_up_tokenization_spaces (
str, opcional, padrãoFalse) — Se deve limpar os espaços após a decodificação. A limpeza consiste em remover possíveis artefatos, como espaços extras. - unk_token (
str, opcional, padrão"<unk>") — O token desconhecido. Um token que não está no vocabulário não pode ser convertido em um ID e é definido como este token em vez disso. - bos_token (
str, opcional, padrão"<s>") — O token de início de sequência usado durante o pré-treinamento. Pode ser usado como token de classificador de sequência. - eos_token (
str, opcional, padrão"</s>") — O token de fim de sequência. - prefix_token (
str, opcional, padrão"▁<PRE>") — Token de prefixo usado para infilling. - middle_token (
str, opcional, padrão"▁<MID>") — Token intermediário usado para infilling. - suffix_token (
str, opcional, padrão"▁<SUF>") — Token de sufixo usado para infilling. - eot_token (
str, opcional, padrão"▁<EOT>") — Token de fim de texto usado para infilling. - fill_token (
str, opcional, padrão"<FILL_ME>") — O token usado para dividir a entrada entre o prefixo e o sufixo. - additional_special_tokens (
list[str], opcional) — Tokens especiais adicionais usados pelo tokenizer. - add_bos_token (
bool, opcional, padrãoTrue) — Indica se um token de início de sequência deve ser adicionado no início das sequências. - add_eos_token (
bool, opcional, padrãoFalse) — Indica se um token de fim de sequência deve ser adicionado ao final das sequências. - use_default_system_prompt (
bool, opcional, padrãoFalse) — Indica se o prompt de sistema padrão para Llama deve ser utilizado. - add_prefix_space (
bool, opcional) — Indica se deve ou não adicionar um espaço inicial à entrada. Isso permite tratar a palavra inicial como qualquer outra palavra. - vocab (
str,dictoulist, opcional) — Dicionário de vocabulário personalizado. Se não for fornecido, o vocabulário é carregado de vocab_file. - merges (
stroulist, opcional) — Lista de mesclagens personalizada. Se não for fornecida, as mesclagens são carregadas de merges_file. - vocab_file (
str, opcional) — arquivo SentencePiece (geralmente com a extensão .model) que contém o vocabulário necessário para instanciar um tokenizador.
Construa um tokenizador Llama. Baseado em Byte-Pair-Encoding em nível de bytes.
Isso usa notavelmente ByteFallback e sem normalização.
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]Se você quiser alterar o bos_token ou o eos_token, certifique-se de especificá-los ao inicializar o modelo, ou
chamar tokenizer.update_post_processor() para garantir que o pós-processamento seja realizado corretamente (caso contrário,
os valores do primeiro token e do token final de uma sequência codificada não serão corretos). Para mais detalhes, consulte
a documentação de [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Este tokenizer herda de PreTrainedTokenizerFast, que contém a maioria dos métodos principais. Os usuários devem consultar essa superclasse para obter mais informações sobre esses métodos. A configuração padrão corresponde à de meta-llama/CodeLlama-7b-Instruct-hf, que suporta infilling de prompt.
Atualiza o normalizador para garantir que o formato de prompt para infilling seja respeitado. O formato de infilling é o
seguinte: se suffix_first
” <PRE> <SUF>{suf} <MID> {pre}”
caso contrário:
” <PRE> {pre} <SUF>{suf} <MID>”
Se reset estiver definido como True, o normalizer e o post_processor são redefinidos para o seu comportamento “normal”, que consiste em adicionar um espaço de prefixo para o normalizer e adicionar um bos_token ao texto de entrada para o post_processor.