Hugging Face Transformers
Hugging Face Transformers est actuellement la bibliothèque NLP / IA open source la plus populaire, proposant des milliers de modèles pré-entraînés qui couvrent presque toutes les tâches d’IA, notamment le texte, l’image, l’audio et le multimodal.
Sa valeur essentielle : encapsuler les processus complexes de chargement de modèle, d’inférence et d’entraînement en quelques lignes de code.
Types de tâches pris en charge
Principes fondamentaux de l’architecture Transformer
Avant d’utiliser la bibliothèque, comprendre l’architecture sous-jacente vous permettra de savoir pourquoi vous ajustez les paramètres de cette façon.
Architecture globale : Encodeur-Décodeur

Trois grandes familles de modèles
Installation et configuration de l'environnement
Installation
# 基础安装 pip install transformers # 完整安装(包含训练依赖) pip install transformers[torch] # PyTorch 后端(推荐) pip install transformers[tf-cpu] # TensorFlow 后端 pip install transformers[flax] # JAX/Flax 后端 # 常用配套库 pip install datasets # HuggingFace 数据集库 pip install evaluate # 模型评估指标 pip install accelerate # 多GPU/混合精度训练 pip install peft # 参数高效微调(LoRA等) pip install tokenizers # 高性能分词器 pip install sentencepiece # 部分模型(T5/LLaMA)需要 # 验证安装 python -c "import transformers; print(transformers.__version__)"
Configuration des variables d'environnement
# 设置模型缓存目录(模型下载后缓存到此路径,默认 ~/.cache/huggingface) export HF_HOME=/data/huggingface_cache # 国内用户:使用镜像站加速下载(推荐 hf-mirror.com) export HF_ENDPOINT=https://hf-mirror.com # 离线模式(网络不可用时,只使用已缓存的模型) export TRANSFORMERS_OFFLINE=1 # 禁用进度条(CI/CD 环境) export DISABLE_TQDM=1
Exemple
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
# Afficher le répertoire de cache actuel
from transformers.utils import TRANSFORMERS_CACHE
print(TRANSFORMERS_CACHE)
Pipeline : exécuter l'IA en cinq lignes de code
Pipeline est l'abstraction de plus haut niveau dans Transformers. Il encapsule entièrement le chargement du modèle, le prétraitement, l'inférence et le post-traitement, vous permettant de réaliser une inférence en seulement trois à cinq lignes de code.
Collection d'exemples rapides Pipeline
Exemple
# 1. Analyse de sentiment (classification de texte)
classifier = pipeline("sentiment-analysis")
result = classifier("J'adore utiliser Hugging Face Transformers!")
# -> [{'label': 'POSITIVE', 'score': 0.9998}]
# 2. Génération de texte
generator = pipeline("text-generation", model="gpt2")
result = generator("Il était une fois dans un pays lointain,",
max_new_tokens=50, num_return_sequences=1, temperature=0.8)
# 3. Texte à trous (modèle de langage masqué)
unmasker = pipeline("fill-mask", model="bert-base-uncased")
result = unmasker("La capitale de la France est [MASK].")
# -> [{'token_str': 'paris', 'score': 0.9823}, ...]
# 4. Reconnaissance d'entités nommées (NER)
ner = pipeline("ner", aggregation_strategy="simple")
result = ner("Je m'appelle John et je travaille chez Google à New York.")
# -> [{'entity_group': 'PER', 'word': 'John', 'score': 0.998}, ...]
# 5. Réponse aux questions extractive
qa = pipeline("question-answering")
result = qa(question="Qui a inventé Python ?",
context="Python a été créé par Guido van Rossum en 1991.")
# -> {'answer': 'Guido van Rossum', 'score': 0.9887}
# 6. Résumé de texte
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
result = summarizer(article, max_length=60, min_length=20)
# 7. Traduction automatique
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-zh")
result = translator("Hello, how are you today?")
# -> [{'translation_text': 'Hello, how are you today?'}]
# 8. Classification zéro-shot (aucun entraînement dédié nécessaire)
zero_shot = pipeline("zero-shot-classification")
result = zero_shot("I love playing football",
candidate_labels=["sports", "politics", "technology"])
# -> {'labels': ['sports', ...], 'scores': [0.972, ...]}
Configuration avancée du pipeline
Exemple
from transformers import pipeline
# Spécifier le GPU
pipe = pipeline("text-generation", model="gpt2", device=0)
# Spécifier la précision (économiser de la mémoire)
pipe = pipeline("text-generation", model="meta-llama/Llama-2-7b-hf",
torch_dtype=torch.float16, device_map="auto")
# Traitement par lots (augmenter le débit)
pipe = pipeline("sentiment-analysis", batch_size=32)
results = pipe(large_text_list) # Inférence par lots automatique
# Découpage de grands textes
asr = pipeline("automatic-speech-recognition",
model="openai/whisper-large-v2",
chunk_length_s=30, stride_length_s=5)
result = asr("long_audio.wav", return_timestamps=True)
Analyse approfondie du Tokenizer
Le Tokenizer est la première étape du NLP : convertir du texte brut en une séquence de nombres que le modèle peut comprendre.
Processus complet de tokenisation
Utilisation essentielle du Tokenizer
Exemple
# Charger le Tokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# Encoder en une seule étape
encoding = tokenizer(
"Bonjour, j'apprends les Transformers !",
return_tensors="pt", # Retourne un tenseur PyTorch
padding=True, # Compléter jusqu'à la séquence la plus longue
truncation=True, # Tronquer en cas de dépassement de la longueur
max_length=128, # Longueur maximale
)
print(encoding.keys())
# -> dict_keys(['input_ids', 'token_type_ids', 'attention_mask'])
print(encoding["input_ids"][0][:8])
# -> tensor([101, 7592, 1010, 1045, 1005, 1049, 4083, 19081])
print(encoding["attention_mask"][0][:8])
# -> tensor([1, 1, 1, 1, 1, 1, 1, 1]) # 1=jeton réel, 0=rembourrage
# Décoder (ID -> Texte)
decoded = tokenizer.decode(encoding["input_ids"][0], skip_special_tokens=True)
print(decoded) # -> "bonjour, j'apprends les transformers !"
# Encodage par lots (alignement automatique du padding)
texts = ["Court.", "Ceci est une phrase beaucoup plus longue pour tester."]
batch = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
print(batch["input_ids"].shape) # -> torch.Size([2, 10])
# Informations sur le vocabulaire
print(f"Taille du vocabulaire : {tokenizer.vocab_size}") # -> 30522
print(f"[CLS] ID : {tokenizer.cls_token_id}") # -> 101
print(f"[SEP] ID : {tokenizer.sep_token_id}") # -> 102
print(f"Longueur maximale : {tokenizer.model_max_length}") # -> 512
Comparaison des types de tokenizers courants
Chargement du modèle et inférence
AutoClass : sélection automatique de la classe de modèle correcte
Exemple
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
model_name, num_labels=2, torch_dtype=torch.float16, device_map="auto"
)
# Processus manuel complet d'inférence
text = "Transformers est une bibliothèque incroyable !"
# 1. Encodage
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
inputs = {k: v.to(model.device) for k, v in inputs.items()}
# 2. Propagation avant
with torch.no_grad():
outputs = model(**inputs)
# 3. Analyser la sortie
logits = outputs.logits # forme : [1, 2]
probs = torch.softmax(logits, dim=-1)
pred = torch.argmax(probs, dim=-1).item()
id2label = model.config.id2label # {0: 'LABEL_0', 1: 'LABEL_1'}
print(f"Classe prédite : {id2label[pred]}, confiance : {probs[0][pred]:.4f}")
Extraction de vecteurs de phrases
Exemple
import torch
model = AutoModel.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def get_sentence_embedding(text: str) -> torch.Tensor:
inputs = tokenizer(text, return_tensors="pt", max_length=512, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
# Appliquer le pooling moyen à tous les tokens
token_embeddings = outputs.last_hidden_state # [1, seq_len, 768]
attention_mask = inputs["attention_mask"].unsqueeze(-1)
mean_embedding = (token_embeddings * attention_mask).sum(1) / attention_mask.sum(1)
return mean_embedding # [1, 768]
vec = get_sentence_embedding("Hello world")
print(vec.shape) # -> torch.Size([1, 768])
Guide pratique pour dix tâches courantes
Classification de texte (analyse de sentiment)
Exemple
import torch
model_name = "cardiffnlp/twitter-roberta-base-sentiment-latest"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
def predict_sentiment(texts):
inputs = tokenizer(texts, return_tensors="pt", padding=True,
truncation=True, max_length=512)
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.softmax(logits, dim=-1)
results = []
for i, t in enumerate(texts):
pid = probs[i].argmax().item()
results.append({"text": t, "label": model.config.id2label[pid],
"score": round(probs[i][pid].item(), 4)})
return results
print(predict_sentiment(["J'adore ça !", "C'est terrible."]))
# -> [{'text': 'J'adore ça !', 'label': 'positif', 'score': 0.9756}, ...]
Génération de texte (Dialogue / Continuation)
Exemple
import torch
model_name = "Qwen/Qwen2-1.5B-Instruct" # Alibaba Tongyi Qianwen (prend en charge le chinois)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name, torch_dtype=torch.float16, device_map="auto"
)
messages = [
{"role": "system", "content": "Vous êtes un assistant IA utile."},
{"role": "user", "content": "Veuillez expliquer ce qu'est un Transformer en trois phrases."},
]
text = tokenizer.apply_chat_template(messages, tokenize=False,
add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
output_ids = model.generate(
**inputs, max_new_tokens=300, temperature=0.7, top_p=0.9,
do_sample=True, repetition_penalty=1.1,
pad_token_id=tokenizer.eos_token_id,
)
new_tokens = output_ids[0][inputs["input_ids"].shape[1]:]
response = tokenizer.decode(new_tokens, skip_special_tokens=True)
print(response)
Reconnaissance d'entités nommées (NER)
Exemple
ner = pipeline("ner", model="dslim/bert-base-NER", aggregation_strategy="simple")
result = ner("Elon Musk a fondé SpaceX en 2002 et Tesla Motors en 2003.")
for entity in result:
print(f"{entity['word']:<20} -> {entity['entity_group']} ({entity['score']:.3f})")
# NER chinois
ner_cn = pipeline("ner", model="hfl/chinese-bert-wwm-ext-ner-msra",
aggregation_strategy="simple")
result = ner_cn("Xiao Ming a étudié à l'Université de Pékin et a ensuite travaillé chez Alibaba.")
Traduction automatique
Exemple
# De l'anglais vers le chinois
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-zh")
result = translator("L'intelligence artificielle transforme le monde.")
print(result[0]["translation_text"]) # -> L'intelligence artificielle change le monde.
# Du chinois vers l'anglais
translator_zh = pipeline("translation", model="Helsinki-NLP/opus-mt-zh-en")
result = translator_zh("L'intelligence artificielle change le monde.")
print(result[0]["translation_text"])
Résumé de texte
Exemple
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
result = summarizer(long_text, max_length=80, min_length=30,
do_sample=False, no_repeat_ngram_size=3)
print(result[0]["summary_text"])
Fine-tuning
Le fine-tuning adapte un modèle pré-entraîné à votre tâche et à vos données spécifiques, et c'est le scénario d'application le plus important des Transformers.
Vue d'ensemble du processus de fine-tuning
Exemple complet de fine-tuning : classification de textes
Exemple
from transformers import (
AutoTokenizer, AutoModelForSequenceClassification,
TrainingArguments, Trainer, DataCollatorWithPadding,
EarlyStoppingCallback,
)
import evaluate, numpy as np
# 1. Charger le jeu de données
dataset = load_dataset("imdb") # Jeu de données public du HF Hub
# 2. Tokenizer + prétraitement
MODEL_NAME = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
def tokenize_fn(examples):
return tokenizer(examples["text"], truncation=True, max_length=512)
tokenized_ds = dataset.map(tokenize_fn, batched=True,
remove_columns=["text"])
tokenized_ds = tokenized_ds.rename_column("label", "labels")
tokenized_ds.set_format("torch")
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
# 3. Charger le modèle
model = AutoModelForSequenceClassification.from_pretrained(
MODEL_NAME, num_labels=2,
id2label={0: "NEGATIVE", 1: "POSITIVE"},
label2id={"NEGATIVE": 0, "POSITIVE": 1},
)
# 4. Métriques d'évaluation
accuracy = evaluate.load("accuracy")
f1 = evaluate.load("f1")
def compute_metrics(eval_pred):
logits, labels = eval_pred
preds = np.argmax(logits, axis=-1)
return {"accuracy": accuracy.compute(predictions=preds, references=labels)["accuracy"],
"f1": f1.compute(predictions=preds, references=labels, average="binary")["f1"]}
# 5. Arguments d'entraînement
training_args = TrainingArguments(
output_dir="./results", num_train_epochs=3,
per_device_train_batch_size=16, per_device_eval_batch_size=32,
gradient_accumulation_steps=2, learning_rate=2e-5,
weight_decay=0.01, warmup_ratio=0.1,
evaluation_strategy="steps", eval_steps=500,
save_strategy="steps", save_steps=500,
load_best_model_at_end=True, metric_for_best_model="f1",
fp16=True, logging_steps=100, seed=42,
)
# 6. Créer Trainer et entraîner
trainer = Trainer(
model=model, args=training_args,
train_dataset=tokenized_ds["train"],
eval_dataset=tokenized_ds["test"],
tokenizer=tokenizer, data_collator=data_collator,
compute_metrics=compute_metrics,
callbacks=[EarlyStoppingCallback(early_stopping_patience=3)],
)
trainer.train()
# 7. Évaluer et sauvegarder
eval_result = trainer.evaluate()
print(f"Exactitude : {eval_result['eval_accuracy']:.4f}")
print(f"F1 : {eval_result['eval_f1']:.4f}")
trainer.save_model("./my-sentiment-model")
tokenizer.save_pretrained("./my-sentiment-model")
Réglage fin efficace en paramètres avec LoRA (recommandé)
Exemple
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
import torch
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
model_name, torch_dtype=torch.float16, device_map="auto",
load_in_4bit=True, # Chargement quantifié en 4 bits (QLoRA), économise davantage de mémoire GPU
)
# Configurer LoRA
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM, r=16, lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# -> entraînables: 4,194,304 || total: 6,742,609,920 || 0.0622%
Avantages de LoRA : n'entraîne que moins de 1% des paramètres, réduit la mémoire GPU de 60-70%, est 2-3x plus rapide, les fichiers de poids ne font que quelques MB, et plusieurs adaptateurs LoRA peuvent être sauvegardés pour le même modèle de base pour différentes tâches.
Sauvegarde, chargement et publication du modèle
Exemple
model.save_pretrained("./my-model")
tokenizer.save_pretrained("./my-model")
# Charger localement
model = AutoModelForSequenceClassification.from_pretrained("./my-model")
tokenizer = AutoTokenizer.from_pretrained("./my-model")
# Publier sur HuggingFace Hub
from huggingface_hub import login
login(token="your_hf_token") # huggingface.co/settings/tokens
model.push_to_hub("your-username/my-sentiment-model")
tokenizer.push_to_hub("your-username/my-sentiment-model")
# Publier directement via Trainer
training_args = TrainingArguments(
output_dir="your-username/my-model",
push_to_hub=True, hub_strategy="every_save",
)
Conseils d'optimisation des performances
Vue d'ensemble de l'accélération de l'inférence
Exemple
from transformers import BitsAndBytesConfig, AutoModelForCausalLM
import torch
quant_config = BitsAndBytesConfig(
load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4",
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-13b-hf",
quantization_config=quant_config, device_map="auto",
)
# Accélération FlashAttention-2 (nécessite pip install flash-attn)
model = AutoModelForCausalLM.from_pretrained(
"mistralai/Mistral-7B-v0.1",
attn_implementation="flash_attention_2",
torch_dtype=torch.bfloat16, device_map="auto",
)
# torch.compile (PyTorch 2.0+)
model = torch.compile(model, mode="reduce-overhead")
Dépannage des problèmes courants
Résumé et parcours d'apprentissage
Référence rapide des API clés
Exemple
tokenizer = AutoTokenizer.from_pretrained("model_name")
# 2. Encoder le texte
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
# 3. Chargement du modèle
model = AutoModelForSequenceClassification.from_pretrained("model_name", num_labels=N)
# 4. Inférence
with torch.no_grad():
outputs = model(**inputs)
# 5. Pipeline
pipe = pipeline("task_name", model="model_name")
# 6. Configuration d'entraînement
args = TrainingArguments(output_dir="./out", num_train_epochs=3, learning_rate=2e-5)
# 7. Entraînement
trainer = Trainer(model=model, args=args, train_dataset=ds, compute_metrics=fn)
# 8. Sauvegarde
model.save_pretrained("./my-model")
tokenizer.save_pretrained("./my-model")
# 9. Jeu de données
dataset = load_dataset("dataset_name")
dataset = dataset.map(tokenize_fn, batched=True)
# 10. LoRA
config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj","v_proj"])
model = get_peft_model(model, config)