Поделиться через


Точное определение моделей распознавания лиц для одного GPU

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

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

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

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

См. сведения о преобразователях лиц?

Требования

Токенизация набора данных об обнимания лиц

Модели преобразователей лиц ожидают маркеризованные входные данные, а не текст в скачанных данных. Чтобы обеспечить совместимость с базовой моделью, используйте autoTokenizer , загруженный из базовой модели. Обнимающее лицо 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)

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

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

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

Вы можете настроить метрики оценки в дополнение к метрике по умолчанию 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 позволяет указать выходной каталог, стратегию оценки, скорость обучения и другие параметры parameters.

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)

Со всеми этими parameters построенными, теперь вы можете создать 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

Обнимает интерфейсы распознавания лиц с 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 out of memory

При обучении больших моделей часто возникает ошибка 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.

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

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

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

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

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

Ошибки ядра CUDA

При запуске обучения вы можете столкнуться с ошибками get в ядре 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.

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

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

  • Другим вариантом является get более эффективной трассировки, задав CUDA_LAUNCH_BLOCKING=1:

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

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

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

Записная книжка для моделей классификации текста для распознавания лиц

Get записная книжка

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

Дополнительные сведения об обнимке лиц в Azure Databricks.