Точное определение моделей распознавания лиц для одного GPU
В этой статье описывается, как настроить модель hugging Face с библиотекой Hugging Face transformers
на одном GPU. Она также содержит рекомендации по загрузке данных из lakehouse и моделей ведения журналов в MLflow, что позволяет использовать и управлять моделями в Azure Databricks.
Библиотека распознавания лиц transformers
предоставляет служебную программу Trainer и классы автомодели , которые позволяют загружать и настраивать модели преобразователей.
Эти средства доступны для следующих задач с простыми изменениями:
- Загрузка моделей для точной настройки.
- Создание конфигурации для служебной программы Обнимания преобразователей распознавания лиц.
- Выполнение обучения на одном GPU.
См. сведения о преобразователях лиц?
Требования
- Кластер с одним узлом с одним GPU на драйвере.
- Версия GPU Databricks Runtime 13.0 ML и выше.
- В этом примере для точной настройки требуются 🤗 преобразователи, 🤗 наборы данных и 🤗 пакеты оценки, включенные в Databricks Runtime 13.0 ML и более поздних версий.
- MLflow 2.3.
- Данные подготовлены и загружены для точной настройки модели с преобразователями.
Токенизация набора данных об обнимания лиц
Модели преобразователей лиц ожидают маркеризованные входные данные, а не текст в скачанных данных. Чтобы обеспечить совместимость с базовой моделью, используйте 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.Используйте обучение с более низкой точностью. Вы можете set
fp16=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.
Записная книжка для моделей классификации текста для распознавания лиц
Дополнительные ресурсы
Дополнительные сведения об обнимке лиц в Azure Databricks.
- Что такое обнимать преобразователи лиц?
- Вы можете использовать модели преобразователей распознавания лиц в Spark для масштабирования пакетных приложений NLP, см. сведения о выводе модели с помощью преобразователей распознавания лиц для NLP.