Transformers documentation
CodeLlama
Ce modèle a été publié dans HF papers le 2023-08-24 et contribué à Hugging Face Transformers le 2023-08-25.
CodeLlama
Code Llama est une famille spécialisée de grands modèles de langage basée sur Llama 2 pour les tâches de codage. Elle se décline en différentes variantes – code général, spécifique à Python et variante suivant des instructions – toutes disponibles en 7B, 13B, 34B et 70B paramètres. Les modèles Code Llama peuvent générer, expliquer et même compléter les parties manquantes de votre code (appelé « infilling »). Ils peuvent également gérer des contextes très longs avec une génération stable jusqu’à 100k jetons, bien qu’ils aient été entraînés sur des séquences de 16K jetons.
Vous pouvez trouver tous les points de contrôle originaux de Code Llama dans la collection Code Llama.
Cliquez sur les modèles Code Llama dans la barre latérale droite pour plus d’exemples sur la façon d’appliquer Code Llama à différentes tâches de codage.
L'exemple ci-dessous montre comment générer du code avec Pipeline, ou le AutoModel, et depuis la ligne de commande.
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)La quantification réduit la charge mémoire des grands modèles en représentant les poids avec une précision inférieure. Reportez-vous à l'aperçu de la Quantization pour plus d'informations sur les backends de quantification disponibles.
L'exemple ci-dessous utilise bitsandbytes pour quantiser uniquement les poids sur 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))Utilisez le AttentionMaskVisualizer pour mieux comprendre les jetons auxquels le modèle peut ou non prêter attention.
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
return a + b""")
Notes
L'infilling n'est disponible que dans les modèles de base 7B et 13B, et non dans les modèles Python, Instruct, 34B ou 70B.
Utilisez le jeton
<FILL_ME>à l’endroit où vous souhaitez que votre entrée soit complétée. Le tokenizer découpe ce jeton pour créer une chaîne d’entrée formatée qui suit le modèle d’entraînement original. Cette approche est plus robuste que la préparation manuelle du modèle.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))Utilisez
bfloat16pour l’entraînement supplémentaire ou l’ajustement fin etfloat16pour l’inférence.Le caractère
BOSn'est pas utilisé pour le remplissage lors de l'encodage du préfixe ou du suffixe, mais uniquement au début de chaque invite.Le tokenizer est un modèle d’encodage par paires de bytes basé sur SentencePiece. Lors du décodage, si le premier jeton est le début d’un mot (par exemple, « Banana »), le tokenizer n’ajoute pas l’espace préfixe à la chaîne.
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 )
Paramètres
- clean_up_tokenization_spaces (
str, facultatif, par défautFalse) — Indique s'il faut nettoyer les espaces après le décodage. Le nettoyage consiste à supprimer les artefacts potentiels, comme les espaces superflus. - unk_token (
str, facultatif, par défaut"<unk>") — Le jeton inconnu. Un jeton qui n'est pas dans le vocabulaire ne peut pas être converti en identifiant et est remplacé par ce jeton. - bos_token (
str, facultatif, par défaut"<s>") — Le jeton de début de séquence utilisé lors de la préformation. Peut être utilisé comme jeton de classifieur de séquence. - eos_token (
str, facultatif, par défaut"</s>") — Le jeton de fin de séquence. - prefix_token (
str, facultatif, par défaut"▁<PRE>") — Jeton de préfixe utilisé pour l'infilling. - middle_token (
str, facultatif, par défaut"▁<MID>") — Jeton intermédiaire utilisé pour l'infilling. - suffix_token (
str, facultatif, par défaut"▁<SUF>") — Jeton de suffixe utilisé pour l'infilling. - eot_token (
str, facultatif, par défaut"▁<EOT>") — Jeton de fin de texte utilisé pour le remplissage. - fill_token (
str, facultatif, par défaut"<FILL_ME>") — Le jeton utilisé pour séparer l’entrée entre le préfixe et le suffixe. - additional_special_tokens (
list[str], facultatif) — Jetons spéciaux supplémentaires utilisés par le tokeniseur. - add_bos_token (
bool, facultatif, par défautTrue) — Indique s'il faut ajouter un jeton de début de séquence au début des séquences. - add_eos_token (
bool, facultatif, par défautFalse) — Indique s'il faut ajouter un jeton de fin de séquence à la fin des séquences. - use_default_system_prompt (
bool, facultatif, par défautFalse) — Indique s'il faut ou non utiliser l'invite système par défaut pour Llama. - add_prefix_space (
bool, facultatif) — Indique s'il faut ajouter un espace initial à l'entrée. Cela permet de traiter le mot initial comme n'importe quel autre mot. - vocab (
str,dictoulist, facultatif) — Dictionnaire de vocabulaire personnalisé. S'il n'est pas fourni, le vocabulaire est chargé depuis vocab_file. - merges (
stroulist, facultatif) — Liste de fusions personnalisée. Si non fournie, les fusions sont chargées depuis merges_file. - vocab_file (
str, facultatif) — fichier SentencePiece (généralement avec l’extension .model) qui contient le vocabulaire nécessaire pour instancier un tokenizer.
Construit un tokenizer Llama. Basé sur l'encodage par paires de bytes au niveau des octets.
Cela utilise notamment ByteFallback et aucune normalisation.
>>> 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]Si vous souhaitez modifier le bos_token ou le eos_token, assurez-vous de les spécifier lors de l’initialisation du modèle, ou
d’appeler tokenizer.update_post_processor() pour vous assurer que le post-traitement est correctement effectué (sinon les
valeurs du premier jeton et du dernier jeton d’une séquence encodée ne seront pas correctes). Pour plus de détails, consultez la
documentation des [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Ce tokenizer hérite de PreTrainedTokenizerFast, qui contient la plupart des méthodes principales. Les utilisateurs doivent se référer à cette superclasse pour plus d'informations sur ces méthodes. La configuration par défaut correspond à celle de meta-llama/CodeLlama-7b-Instruct-hf, qui prend en charge le remplissage de prompt.
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]
Paramètres
- token_ids_0 — Liste des identifiants de la séquence (éventuellement déjà formatée).
- token_ids_1 — Non utilisé lorsque
already_has_special_tokens=True. Doit être None dans ce cas. - already_has_special_tokens — Indique si la séquence est déjà formatée avec des jetons spéciaux.
Retourne
Une liste d'entiers dans l'intervalle [0, 1]
1 pour un jeton spécial, 0 pour un jeton de séquence.
Récupérer les identifiants de séquences à partir d'une liste de jetons à laquelle aucun jeton spécial n'a été ajouté.
Pour les tokenizers rapides, les data collators appellent cette fonction avec already_has_special_tokens=True pour construire un masque sur une séquence déjà formatée. Dans ce cas, nous calculons le masque en vérifiant l’appartenance à all_special_ids.
Met à jour le post-processeur sous-jacent avec les bos_token et eos_token actuels.
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 )
Paramètres
- clean_up_tokenization_spaces (
str, facultatif, par défautFalse) — Indique s'il faut nettoyer les espaces après le décodage. Le nettoyage consiste à supprimer les artefacts potentiels, comme les espaces superflus. - unk_token (
str, facultatif, par défaut"<unk>") — Le jeton inconnu. Un jeton qui n'est pas dans le vocabulaire ne peut pas être converti en identifiant et est remplacé par ce jeton. - bos_token (
str, facultatif, par défaut"<s>") — Le jeton de début de séquence utilisé lors de la préformation. Peut être utilisé comme jeton de classifieur de séquence. - eos_token (
str, facultatif, par défaut"</s>") — Le jeton de fin de séquence. - prefix_token (
str, facultatif, par défaut"▁<PRE>") — Jeton de préfixe utilisé pour l'infilling. - middle_token (
str, facultatif, par défaut"▁<MID>") — Jeton intermédiaire utilisé pour l'infilling. - suffix_token (
str, facultatif, par défaut"▁<SUF>") — Jeton de suffixe utilisé pour l'infilling. - eot_token (
str, facultatif, par défaut"▁<EOT>") — Jeton de fin de texte utilisé pour le remplissage. - fill_token (
str, facultatif, par défaut"<FILL_ME>") — Le jeton utilisé pour séparer l’entrée entre le préfixe et le suffixe. - additional_special_tokens (
list[str], facultatif) — Jetons spéciaux supplémentaires utilisés par le tokeniseur. - add_bos_token (
bool, facultatif, par défautTrue) — Indique s'il faut ajouter un jeton de début de séquence au début des séquences. - add_eos_token (
bool, facultatif, par défautFalse) — Indique s'il faut ajouter un jeton de fin de séquence à la fin des séquences. - use_default_system_prompt (
bool, facultatif, par défautFalse) — Indique s'il faut ou non utiliser l'invite système par défaut pour Llama. - add_prefix_space (
bool, facultatif) — Indique s'il faut ajouter un espace initial à l'entrée. Cela permet de traiter le mot initial comme n'importe quel autre mot. - vocab (
str,dictoulist, facultatif) — Dictionnaire de vocabulaire personnalisé. S'il n'est pas fourni, le vocabulaire est chargé depuis vocab_file. - merges (
stroulist, facultatif) — Liste de fusions personnalisée. Si non fournie, les fusions sont chargées depuis merges_file. - vocab_file (
str, facultatif) — fichier SentencePiece (généralement avec l’extension .model) qui contient le vocabulaire nécessaire pour instancier un tokenizer.
Construit un tokenizer Llama. Basé sur l'encodage par paires de bytes au niveau des octets.
Cela utilise notamment ByteFallback et aucune normalisation.
>>> 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]Si vous souhaitez modifier le bos_token ou le eos_token, assurez-vous de les spécifier lors de l’initialisation du modèle, ou
d’appeler tokenizer.update_post_processor() pour vous assurer que le post-traitement est correctement effectué (sinon les
valeurs du premier jeton et du dernier jeton d’une séquence encodée ne seront pas correctes). Pour plus de détails, consultez la
documentation des [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
Ce tokenizer hérite de PreTrainedTokenizerFast, qui contient la plupart des méthodes principales. Les utilisateurs doivent se référer à cette superclasse pour plus d'informations sur ces méthodes. La configuration par défaut correspond à celle de meta-llama/CodeLlama-7b-Instruct-hf, qui prend en charge le remplissage de prompt.
Met à jour le normalisateur pour s’assurer que le format de prompt pour infilling est respecté. Le format d’infilling est le
suivant : si suffix_first
” <PRE> <SUF>{suf} <MID> {pre}”
sinon :
” <PRE> {pre} <SUF>{suf} <MID>”
Si reset est défini sur True, le normalizer et le post_processor sont réinitialisés à leur comportement « normal », qui consiste à ajouter un espace de préfixe pour le normalizer, et à ajouter un bos_token au texte d’entrée pour le post_processor.