Hugging Face Transformers
Hugging Face Transformers — в настоящее время самая популярная библиотека NLP / AI с открытым исходным кодом, предоставляющая тысячи предварительно обученных моделей, которые охватывают почти все задачи ИИ, включая текстовые, графические, аудио- и мультимодальные.
Её основная ценность: инкапсуляция сложных процессов загрузки моделей, инференса и обучения в несколько строк кода.
Поддерживаемые типы задач
Основные принципы архитектуры Transformer
Прежде чем использовать библиотеку, понимание лежащей в основе архитектуры позволит вам понять, почему вы настраиваете параметры именно так.
Общая архитектура: энкодер-декодер

Три основных семейства моделей
Установка и настройка окружения
Установка
# 基础安装 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__)"
Настройка переменных окружения
# 设置模型缓存目录(模型下载后缓存到此路径,默认 ~/.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
Пример
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
# Просмотр текущего каталога кэша
from transformers.utils import TRANSFORMERS_CACHE
print(TRANSFORMERS_CACHE)
Pipeline: запуск ИИ с помощью пяти строк кода
Pipeline — это абстракция самого высокого уровня в Transformers. Она позволяет выполнить загрузку модели, предобработку, инференс и постобработку полностью всего в пяти строках кода.
Коллекция быстрых примеров Pipeline
Пример
# 1. Анализ тональности (классификация текста)
classifier = pipeline("sentiment-analysis")
result = classifier("I love using Hugging Face Transformers!")
# -> [{'label': 'POSITIVE', 'score': 0.9998}]
# 2. Генерация текста
generator = pipeline("text-generation", model="gpt2")
result = generator("Once upon a time in a land far away,",
max_new_tokens=50, num_return_sequences=1, temperature=0.8)
# 3. Заполнение пропусков (маскированная языковая модель)
unmasker = pipeline("fill-mask", model="bert-base-uncased")
result = unmasker("The capital of France is [MASK].")
# -> [{'token_str': 'paris', 'score': 0.9823}, ...]
# 4. Распознавание именованных сущностей (NER)
ner = pipeline("ner", aggregation_strategy="simple")
result = ner("My name is John and I work at Google in New York.")
# -> [{'entity_group': 'PER', 'word': 'John', 'score': 0.998}, ...]
# 5. Извлечение ответов на вопросы
qa = pipeline("question-answering")
result = qa(question="Who invented Python?",
context="Python was created by Guido van Rossum in 1991.")
# -> {'answer': 'Guido van Rossum', 'score': 0.9887}
# 6. Суммаризация текста
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
result = summarizer(article, max_length=60, min_length=20)
# 7. Машинный перевод
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. Zero-shot классификация (не требует специального обучения)
zero_shot = pipeline("zero-shot-classification")
result = zero_shot("I love playing football",
candidate_labels=["sports", "politics", "technology"])
# -> {'labels': ['sports', ...], 'scores': [0.972, ...]}
Расширенная конфигурация пайплайна
Пример
from transformers import pipeline
# Указать GPU
pipe = pipeline("text-generation", model="gpt2", device=0)
# Указать точность (экономия памяти)
pipe = pipeline("text-generation", model="meta-llama/Llama-2-7b-hf",
torch_dtype=torch.float16, device_map="auto")
# Пакетная обработка (увеличение пропускной способности)
pipe = pipeline("sentiment-analysis", batch_size=32)
results = pipe(large_text_list) # Автоматический пакетный вывод
# Разбиение большого текста на фрагменты
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)
Углублённый анализ токенизатора
Токенизатор — это первый шаг в NLP: преобразование необработанного текста в последовательность чисел, которую может понять модель.
Полный процесс токенизации
Основное использование токенизатора
Пример
# Загрузить токенизатор
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# Кодировать за один шаг
encoding = tokenizer(
"Привет, я изучаю Transformers!",
return_tensors="pt", # Вернуть тензор PyTorch
padding=True, # Дополнить до самой длинной последовательности
truncation=True, # Обрезать при превышении длины
max_length=128, # Максимальная длина
)
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=реальный токен, 0=паддинг
# Декодировать (ID -> Текст)
decoded = tokenizer.decode(encoding["input_ids"][0], skip_special_tokens=True)
print(decoded) # -> "привет, я изучаю трансформеры!"
# Пакетное кодирование (автоматическое выравнивание заполнения)
texts = ["Коротко.", "Это гораздо более длинное предложение для тестирования."]
batch = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
print(batch["input_ids"].shape) # -> torch.Size([2, 10])
# Информация о словаре
print(f"Размер словаря: {tokenizer.vocab_size}") # -> 30522
print(f"[CLS] ID: {tokenizer.cls_token_id}") # -> 101
print(f"[SEP] ID: {tokenizer.sep_token_id}") # -> 102
print(f"Максимальная длина: {tokenizer.model_max_length}") # -> 512
Сравнение распространённых типов токенизаторов
Загрузка модели и инференс
AutoClass: автоматический выбор правильного класса модели
Пример
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"
)
# Полный процесс ручного инференса
text = "Transformers — потрясающая библиотека!"
# 1. Кодирование
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
inputs = {k: v.to(model.device) for k, v in inputs.items()}
# 2. Прямое распространение
with torch.no_grad():
outputs = model(**inputs)
# 3. Разбор вывода
logits = outputs.logits # форма: [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"Предсказанный класс: {id2label[pred]}, уверенность: {probs[0][pred]:.4f}")
Извлечение векторов предложений
Пример
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)
# Применить mean pooling ко всем токенам
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])
Практическое руководство по десяти распространённым задачам
Классификация текста (анализ тональности)
Пример
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(["Я люблю это!", "Это ужасно."]))
# -> [{'text': 'Я люблю это!', 'label': 'positive', 'score': 0.9756}, ...]
Генерация текста (диалог / продолжение)
Пример
import torch
model_name = "Qwen/Qwen2-1.5B-Instruct" # Alibaba Tongyi Qianwen (поддерживает китайский)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name, torch_dtype=torch.float16, device_map="auto"
)
messages = [
{"role": "system", "content": "Вы — полезный ИИ-ассистент."},
{"role": "user", "content": "Пожалуйста, объясните, что такое Transformer, в трёх предложениях."},
]
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)
Распознавание именованных сущностей (NER)
Пример
ner = pipeline("ner", model="dslim/bert-base-NER", aggregation_strategy="simple")
result = ner("Elon Musk founded SpaceX in 2002 and Tesla Motors in 2003.")
for entity in result:
print(f"{entity['word']:<20} -> {entity['entity_group']} ({entity['score']:.3f})")
# NER для китайского языка
ner_cn = pipeline("ner", model="hfl/chinese-bert-wwm-ext-ner-msra",
aggregation_strategy="simple")
result = ner_cn("Xiao Ming studied at Peking University and later went to work at Alibaba.")
Машинный перевод
Пример
# С английского на китайский
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-en-zh")
result = translator("Artificial intelligence is transforming the world.")
print(result[0]["translation_text"]) # -> Искусственный интеллект меняет мир.
# С китайского на английский
translator_zh = pipeline("translation", model="Helsinki-NLP/opus-mt-zh-en")
result = translator_zh("Искусственный интеллект меняет мир.")
print(result[0]["translation_text"])
Суммаризация текста
Пример
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"])
Дообучение
Тонкая настройка адаптирует предварительно обученную модель к вашей конкретной задаче и данным и является наиболее важным сценарием применения Transformers.
Обзор процесса тонкой настройки
Полный пример тонкой настройки: классификация текста
Пример
from transformers import (
AutoTokenizer, AutoModelForSequenceClassification,
TrainingArguments, Trainer, DataCollatorWithPadding,
EarlyStoppingCallback,
)
import evaluate, numpy as np
# 1. Загрузка набора данных
dataset = load_dataset("imdb") # публичный набор данных HF Hub
# 2. Токенизатор + предобработка
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. Загрузка модели
model = AutoModelForSequenceClassification.from_pretrained(
MODEL_NAME, num_labels=2,
id2label={0: "NEGATIVE", 1: "POSITIVE"},
label2id={"NEGATIVE": 0, "POSITIVE": 1},
)
# 4. Метрики оценки
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. Аргументы обучения
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. Создайте Trainer и обучите
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. Оцените и сохраните
eval_result = trainer.evaluate()
print(f"Точность: {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")
LoRA: параметрически эффективная тонкая настройка (рекомендуется)
Пример
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, # 4-битная квантованная загрузка (QLoRA), дополнительно экономит память GPU
)
# Настройка 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()
# -> обучаемых: 4,194,304 || всего: 6,742,609,920 || 0.0622%
Преимущества LoRA: обучает менее 1% параметров, сокращает потребление памяти GPU на 60-70%, работает в 2-3 раза быстрее, файлы весов занимают всего несколько МБ, и для одной базовой модели можно сохранить несколько LoRA-адаптеров для разных задач.
Сохранение, загрузка и публикация модели
Пример
model.save_pretrained("./my-model")
tokenizer.save_pretrained("./my-model")
# Загрузить локально
model = AutoModelForSequenceClassification.from_pretrained("./my-model")
tokenizer = AutoTokenizer.from_pretrained("./my-model")
# Опубликовать в 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")
# Публикация напрямую через Trainer
training_args = TrainingArguments(
output_dir="your-username/my-model",
push_to_hub=True, hub_strategy="every_save",
)
Советы по оптимизации производительности
Обзор ускорения инференса
Пример
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",
)
# Ускорение FlashAttention-2 (требуется 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")
Устранение распространённых проблем
Резюме и путь обучения
Краткий справочник по основному API
Пример
tokenizer = AutoTokenizer.from_pretrained("model_name")
# 2. Кодировать текст
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)
# 3. Загрузка модели
model = AutoModelForSequenceClassification.from_pretrained("model_name", num_labels=N)
# 4. Инференс
with torch.no_grad():
outputs = model(**inputs)
# 5. Пайплайн
pipe = pipeline("task_name", model="model_name")
# 6. Конфигурация обучения
args = TrainingArguments(output_dir="./out", num_train_epochs=3, learning_rate=2e-5)
# 7. Обучение
trainer = Trainer(model=model, args=args, train_dataset=ds, compute_metrics=fn)
# 8. Сохранение
model.save_pretrained("./my-model")
tokenizer.save_pretrained("./my-model")
# 9. Набор данных
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)