Настройка моделей Hugging Face для одного GPU

В этой статье описывается, как осуществить тонкую настройку модели Hugging Face с использованием библиотеки Hugging Face transformers на одном GPU. Она также содержит рекомендации, специфичные для Databricks, по загрузке данных из lakehouse и регистрации моделей в MLflow, что позволяет использовать и управлять вашими моделями в Azure Databricks.

Библиотека Hugging Face transformers предоставляет служебную программу Trainer и классы Auto Model, которые позволяют загружать и настраивать модели Transformers.

Эти средства доступны для следующих задач с простыми изменениями:

  • Загрузка моделей для точной настройки.
  • Создание конфигурации для утилиты Trainer компании Hugging Face с использованием трансформеров.
  • Выполнение обучения на одном графическом процессоре.

См. Что такое трансформеры Hugging Face?

Требования

Токенизация набора данных Hugging Face

Модели Hugging Face Transformers ожидают на вход токенизированные данные, а не текст из скачанных данных. Чтобы обеспечить совместимость с базовой моделью, используйте autoTokenizer , загруженный из базовой модели. Hugging Face datasets позволяет последовательно применять токенизатор к данным для обучения и тестирования.

Например:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(base_model)
def tokenize_function(examples):
    return tokenizer(examples["text"], padding=False, truncation=True)

train_test_tokenized = train_test_dataset.map(tokenize_function, batched=True)

Настройка конфигурации обучения

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

  • Метрики
  • Базовая модель
  • Конфигурация обучения

Вы можете настроить оценочные метрики в дополнение к метрике по умолчанию loss, которую вычисляет Trainer. В следующем примере показано добавление accuracy в качестве метрики:

import numpy as np
import evaluate
metric = evaluate.load("accuracy")
def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

Используйте классы автоматической модели для NLP, чтобы загрузить соответствующую модель для задачи.

Для классификации текста используйте AutoModelForSequenceClassification для загрузки базовой модели для классификации текста. При создании модели укажите количество классов и сопоставлений меток, созданных во время подготовки набора данных.

from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
        base_model,
        num_labels=len(label2id),
        label2id=label2id,
        id2label=id2label
        )

Затем создайте конфигурацию обучения. Класс TrainingArguments позволяет указать выходной каталог, стратегию оценки, скорость обучения и другие параметры.

from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir=training_output_dir, evaluation_strategy="epoch")

Использование сортировщика данных осуществляется для пакетирования входных данных в обучающие и оценочные наборы. DataCollatorWithPadding обеспечивает хорошую базовую производительность для классификации текста.

from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer)

Теперь, при помощи всех этих параметров, можно создать Trainer.

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_test_dataset["train"],
    eval_dataset=train_test_dataset["test"],
    compute_metrics=compute_metrics,
    data_collator=data_collator,
)

Обучение и логирование в MLflow

Hugging Face хорошо интегрируется с MLflow и автоматически фиксирует метрики в процессе обучения модели с помощью MLflowCallback. Однако вы должны самостоятельно записать обученную модель.

Обёртывание процесса обучения в запуске MLflow. Это создает конвейер Преобразователей из токенизатора и обученной модели и записывает его на локальный диск. Наконец, запишите модель в MLflow с помощью mlflow.transformers.log_model.

from transformers import pipeline

with mlflow.start_run() as run:
  trainer.train()
  trainer.save_model(model_output_dir)
  pipe = pipeline("text-classification", model=AutoModelForSequenceClassification.from_pretrained(model_output_dir), batch_size=1, tokenizer=tokenizer)
  model_info = mlflow.transformers.log_model(
        transformers_model=pipe,
        artifact_path="classification",
        input_example="Hi there!",
    )

Если вам не нужно создавать конвейер, можно поместить компоненты, которые используются в обучении, в словарь.

model_info = mlflow.transformers.log_model(
  transformers_model={"model": trainer.model, "tokenizer": tokenizer},
  task="text-classification",
  artifact_path="text_classifier",
  input_example=["MLflow is great!", "MLflow on Databricks is awesome!"],
)

Загрузка модели для вывода

Когда ваша модель зарегистрирована и готова, загрузка модели для прогнозирования то же самое, что загрузка предварительно обученной модели в MLflow.

logged_model = "runs:/{run_id}/{model_artifact_path}".format(run_id=run.info.run_id, model_artifact_path=model_artifact_path)

# Load model as a Spark UDF. Override result_type if the model does not return double values.
loaded_model_udf = mlflow.pyfunc.spark_udf(spark, model_uri=logged_model, result_type='string')

test = test.select(test.text, test.label, loaded_model_udf(test.text).alias("prediction"))
display(test)

Дополнительные сведения см. в статье "Развертывание моделей с помощью службы моделей ".

Устранение распространенных ошибок CUDA

В этом разделе описываются распространенные ошибки CUDA и рекомендации по их устранению.

Ошибка OutOfMemoryError: недостаточно памяти для CUDA

При обучении крупных моделей вы можете столкнуться с ошибкой нехватки памяти CUDA.

Пример:

OutOfMemoryError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 14.76 GiB total capacity; 666.34 MiB already allocated; 17.75 MiB free; 720.00 MiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF.

Чтобы устранить эту ошибку, попробуйте выполнить следующие рекомендации.

  • Уменьшите размер пакета для обучения. Вы можете уменьшить per_device_train_batch_size значение в TrainingArguments.

  • Используйте тренировку с более низкой точностью. Вы можете задать fp16=True в TrainingArguments.

  • Используйте gradient_accumulation_steps в TrainingArguments , чтобы эффективно увеличить общий размер пакета.

  • Используйте 8-разрядный оптимизатор Адама.

  • Очистка памяти GPU перед обучением. Иногда память GPU может быть занята неиспользуемым кодом.

    from numba import cuda
    device = cuda.get_current_device()
    device.reset()
    

Ошибки ядра CUDA

При выполнении обучения могут возникнуть ошибки ядра CUDA.

Пример:

CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.

For debugging, consider passing CUDA_LAUNCH_BLOCKING=1.

Устранение неполадок:

  • Попробуйте запустить код на ЦП, чтобы узнать, является ли ошибка воспроизводимой.

  • Еще одним вариантом является получение лучшей функции трассировки путем установки CUDA_LAUNCH_BLOCKING=1:

    import os
    os.environ["CUDA_LAUNCH_BLOCKING"] = "1"
    

Записная книжка: точно настроенная классификация текста на одном GPU

Чтобы быстро приступить к работе с примером кода, в этом примере записная книжка предоставляет комплексный пример для точной настройки модели для классификации текста. В последующих разделах этой статьи подробно описывается использование Hugging Face для дообучения на платформе Azure Databricks.

Тетрадь по тонкой настройке моделей классификации текста Hugging Face

Получите записную книжку

Дополнительные ресурсы

Узнайте больше о Hugging Face в Azure Databricks.