В этой статье мы увидим, как работать с PyTorch 2.0 и Hugging Face Transformers, на примере тонкой настройки модели BERT для классификации текста.

ПиТорч 2.0 лучше с точки зрения производительности, скорости, более совместим с Python, но все так же динамично, как и раньше.

Давайте пройдем следующие шаги:

  1. Настройка среды и установка PyTorch 2.0.

  2. Загрузка и подготовка набора данных.

  3. Уточните и оцените модель BERT с помощью Hugging Face Trainer.

  4. Запустите вывод и протестируйте модель.

Краткое введение: PyTorch 2.0

PyTorch 2.0, а точнее 1.14, полностью обратно совместим с предыдущими версиями. Это не потребует каких-либо изменений в вашем существующем коде PyTorch, но может оптимизировать ваш код, если вы добавите model = torch.compile(model). Команда PyTorch объясняет появление новой версии в своих Часто задаваемые вопросы: «Мы выпустили несколько важных новых функций, которые, по нашему мнению, изменят способ использования PyTorch, поэтому мы назвали его 2.0 вместо 1.14».

Эти новые функции включают полную поддержку TorchDynamo, AOTAutograd, PrimTorch и TorchInductor. Это позволяет PyTorch 2.0 сократить время обучения в 1,3–2 раза. на более чем 40 модельных архитектурах С лицо трансформеры. Более подробную информацию о PyTorch 2.0 можно найти на официальном сайте. “НАЧИНАТЬ”.

Примечание. Это руководство было создано и запущено на экземпляре AWS EC2 g5.xlarge, который включает графический процессор NVIDIA A10G.

1. Настройка среды и установка PyTorch 2.0

Первый шаг — установить PyTorch 2.0 и библиотеки Hugging Face, transformers И datasets.

# Установка PyTorch 2.0 с cuda 11.7
!pip install "torch>=2.0" --extra-index-url  --upgrade --quiet 

Также установите последнюю версию transformers который включает встроенную интеграцию PyTorch 2.0 в Trainer.

# Установка transformers и dataset
!pip install "transformers==4.27.1" "datasets==2.9.0" "accelerate==0.17.1" "evaluate==0.4.0" tensorboard scikit-learn
# Установка git-lfs для загрузки модели и логов в hugging face hub
!sudo apt-get install git-lfs --yes

В этом примере для управления версиями модели мы будем использовать Обниматься Face Hub. Чтобы загрузить модель в Хаб, необходимо сначала зарегистрироваться на обнимающее лицо. Чтобы войти в свою учетную запись и сохранить токен (ключ доступа) на диск, используйте login пакета huggingface_hub.

from huggingface_hub import login

login(
  token="", # ADD YOUR TOKEN HERE
  add_to_git_credential=True
)

2. Загрузка и подготовка набора данных

Мы будем обучать модель классификации текста на наборе данных БАНКОВСКОЕ ДЕЛО77. Набор данных BANKING77 содержит текстовые сообщения от клиентов банковского/финансового сектора. Он состоит из 13 083 обращений, разбитых на 77 интенций (классов).

ЧИТАТЬ   ЭТО ЛУЧШЕ, ЧЕМ GPT ЧАТ | АНАЛОГОВЫЙ ЧАТ GIPTI | КАК ЗАРАБАТЫВАТЬ С ИСКУССТВЕННЫМ ИНТЕЛЛЕКТОМ?

Чтобы скачать BANKING77, мы будем использовать метод load_dataset() из библиотеки 🤗 Наборы данных.

from datasets import load_dataset

# Dataset id from huggingface.co/dataset
dataset_id = "banking77"

# Load raw dataset
raw_dataset = load_dataset(dataset_id)

print(f"Train dataset size: {len(raw_dataset['train'])}")
print(f"Test dataset size: {len(raw_dataset['test'])}")

Давайте рассмотрим пример из набора данных.

from random import randrange

random_id = randrange(len(raw_dataset['train']))
raw_dataset['train'][random_id]
# {'text': "I can't get google pay to work right.", 'label': 2}

Чтобы обучить модель, необходимо сначала преобразовать текст в токены. Это делает токенизатор. Он также преобразует токены в соответствующие им идентификаторы в предварительно обученном словаре. Дополнительные сведения о токенизации см. головы 6 С Курс по объятиям лица.

from transformers import AutoTokenizer

# Model id to load the tokenizer
model_id = "bert-base-uncased"
# Load Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_id)

# Tokenize helper function
def tokenize(batch):
    return tokenizer(batch['text'], padding='max_length', truncation=True, return_tensors="pt")

# Tokenize dataset
raw_dataset =  raw_dataset.rename_column("label", "labels") # to match Trainer
tokenized_dataset = raw_dataset.map(tokenize, batched=True,remove_columns=["text"])

print(tokenized_dataset["train"].features.keys())
# dict_keys(['input_ids', 'token_type_ids', 'attention_mask','lable'])

3. Подгонка и оценка модели BERT с помощью Hugging Face Trainer.

После подготовки данных можно приступить к обучению модели. Мы будем использовать модель bert-base-без кожуха. Первый шаг — загрузить модель с помощью класса AutoModelForSequenceClassification от Hugging Face Hub. Поэтому мы создаем модель с весами из предварительно обученной модели BERT, но с «головой» сверху специально для нашей задачи классификации. Здесь мы передаем количество классов (77) в нашем наборе данных и имена меток, чтобы сделать вывод более читаемым.

from transformers import AutoModelForSequenceClassification

# Model id to load the tokenizer
model_id = "bert-base-uncased"

# Prepare model labels - useful for inference
labels = tokenized_dataset["train"].features["labels"].names
num_labels = len(labels)
label2id, id2label = dict(), dict()
for i, label in enumerate(labels):
    label2id[label] = str(i)
    id2label[str(i)] = label

# Download the model from huggingface.co/models
model = AutoModelForSequenceClassification.from_pretrained(
    model_id, num_labels=num_labels, label2id=label2id, id2label=id2label
)

Мы будем контролировать качество модели во время обучения. Trainer поддерживает оценку во время обучения, для этого мы определяем compute_metrics. Использование библиотеки evaluate для расчета метрика f1 на тестовом наборе данных.

import evaluate
import numpy as np

# Metric Id
metric = evaluate.load("f1")

# Metric helper method
def compute_metrics(eval_pred):
    predictions, labels = eval_pred
    predictions = np.argmax(predictions, axis=1)
    return metric.compute(predictions=predictions, references=labels, average="weighted")

Последним шагом является определение гиперпараметров TrainingArguments учить. Здесь мы добавим параметры из PyTorch 2.0 для быстрого обучения. Чтобы использовать последние улучшения PyTorch 2.0, передайте параметр torch_compile В TrainingArguments.

Мы также используем интеграцию Trainer с Hugging Face Hub для загрузки весов моделей, журналов и метрик в репозиторий во время обучения.

from huggingface_hub import HfFolder
from transformers import Trainer, TrainingArguments

# Id for remote repository
repository_id = "bert-base-banking77-pt2"

# Define training args
training_args = TrainingArguments(
    output_dir=repository_id,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=8,
    learning_rate=5e-5,
	num_train_epochs=3,
	# PyTorch 2.0 specifics
    bf16=True, # bfloat16 training
	torch_compile=True, # optimizations
    optim="adamw_torch_fused", # improved optimizer
    # logging & evaluation strategies
    logging_dir=f"{repository_id}/logs",
    logging_strategy="steps",
    logging_steps=200,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    save_total_limit=2,
    load_best_model_at_end=True,
    metric_for_best_model="f1",
    # push to hub parameters
    report_to="tensorboard",
    push_to_hub=True,
    hub_strategy="every_save",
    hub_model_id=repository_id,
    hub_token=HfFolder.get_token(),

)

# Create a Trainer instance
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset["train"],
    eval_dataset=tokenized_dataset["test"],
    compute_metrics=compute_metrics,
)

Для начала обучения используйте метод train С Trainer.

# Start training
trainer.train()
df776d278ae439f30a2d0a8802251630

Чтобы сравнить время обучения, мы также провели обучение без опции torch_compile:

{'train_runtime': 696.2701, 'train_samples_per_second': 43.1, 'eval_f1': 0.928788}

Использование опции torch_compile и оптимизация adamw_torch_fused, время обучения сокращается на 52,5% по сравнению с обучением без PyTorch 2.0:

{'train_runtime': 457.7964, 'train_samples_per_second': 65.55, 'eval_f1': 0.931773}

Таким образом, время обучения сократилось с 696 до 457 секунд. Значение train_samples_per_second увеличен с 43 до 65. Значение метрики f1 такое же или чуть лучше, чем при обучении без использования torch_compile.

Невероятно мощный PyTorch 2.0! 🚀

ЧИТАТЬ   Петербуржец случайно нашел двухкилограммовый клад

Давайте сохраним наши результаты и наш токенизатор в Hugging Face Hub и создадим карточку модели.

# Save processor and create model card
tokenizer.save_pretrained(repository_id)
trainer.create_model_card()
trainer.push_to_hub()

4. Запустите вывод и протестируйте модель

Давайте посмотрим на вывод модели на текстовом примере. Окончательный классификатор получается с использованием pipeline из библиотеки transformers.

from transformers import pipeline

# load model from huggingface.co/models using our repository id
classifier = pipeline("sentiment-analysis", model=repository_id, tokenizer=repository_id, device=0)

sample = "I have been waiting longer than expected for my bank card, could you provide information on when it will arrive?"


pred = classifier(sample)
print(pred)
# [{'label': 'card_arrival', 'score': 0.9903606176376343}]

Заключение

В этой статье мы узнали, как использовать PyTorch 2.0 для обучения модели классификации текста в наборе данных BANKING77. PyTorch 2.0 — мощный инструмент для ускорения обучения. В нашем примере с NVIDIA A10G мы смогли повысить производительность на 52,5%.

Более того, мы видели, как легко обучить BERT для вашей задачи, используя Hugging Face и PyTorch.

мой телеграмм канал про ДС и прочее.

Source

От admin