Ajuster les modèles Hugging Face pour un seul GPU
Cet article explique comment affiner un modèle Hugging Face avec la bibliothèque Hugging Face transformers
sur un seul GPU. Il inclut également des recommandations spécifiques à Databricks pour le chargement de données à partir des modèles lakehouse et de journalisation dans MLflow, ce qui vous permet d’utiliser et de régir vos modèles sur Azure Databricks.
La bibliothèque Hugging Face transformers
fournit l’utilitaire Trainer et les classes Auto Model qui permettent le chargement et l’optimisation des modèles Transformers.
Ces outils sont disponibles pour les tâches suivantes avec des modifications simples :
- Le chargement de modèles à afficher.
- La construction de la configuration de l’utilitaire Hugging Face Transformers Trainer.
- L’exécution d’un entraînement sur un seul GPU.
Consulter Qu’est-ce que Hugging Face Transformers ?
Spécifications
- Un cluster à nœud unique avec un GPU sur le pilote.
- La version GPU de Databricks Runtime 13.0 ML et versions ultérieures.
- Cet exemple d’affinage nécessite les packages 🤗 Transformers, 🤗 Datasets et 🤗 Evaluate inclus dans Databricks Runtime 13.0 ML et versions ultérieures.
- MLflow 2.3.
- Données préparées et chargées pour affiner un modèle avec des transformateurs.
Tokénisation d’un jeu de données Hugging Face
Les modèles Hugging Face Transformers s’attendent à une entrée tokenisée, plutôt que le texte dans les données téléchargées. Pour garantir la compatibilité avec le modèle de base, utilisez un AutoTokenizer chargé à partir du modèle de base. Hugging Face datasets
vous permet d’appliquer directement le générateur de jetons de manière cohérente aux données d’entraînement et de test.
Par exemple :
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)
Régler la configuration d’entraînement
Vous pouvez utiliser les outils de configuration d’entraînement Hugging Face pour configurer un Trainer. Les classes Trainer nécessitent que l’utilisateur fournisse les informations suivantes :
- Métriques
- Un modèle de base
- Une configuration d’entraînement
Vous pouvez configurer les métriques d’évaluation en plus de la métrique par défaut loss
calculée par le Trainer
. L’exemple suivant illustre l’ajout de accuracy
en tant que métrique :
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)
Utilisez les classes Auto Model pour NLP pour charger le modèle approprié pour votre tâche.
Pour la classification de texte, utilisez AutoModelForSequenceClassification pour charger un modèle de base pour la classification de texte. Lors de la création du modèle, fournissez le nombre de classes et les mappages d’étiquettes créés pendant la préparation du jeu de données.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
base_model,
num_labels=len(label2id),
label2id=label2id,
id2label=id2label
)
Ensuite, créez la configuration d’entraînement. La classe TrainingArguments vous permet de spécifier le répertoire de sortie, la stratégie d’évaluation, le taux d’entraînement et d’autres paramètres.
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir=training_output_dir, evaluation_strategy="epoch")
L’utilisation d’un collateur de données rassemble les entrées par lots dans les jeux de données d’entraînement et d’évaluation. DataCollatorWithPadding offre de bonnes performances de base pour la classification de texte.
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer)
Une fois tous ces paramètres construits, vous pouvez maintenant créer une 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,
)
Entraînement et connexion à MLflow
Hugging Face interagit bien avec Mlflow et journalise automatiquement les métriques pendant l’entraînement d’un modèle grâce à MlflowCallback. Toutefois, vous devez journaliser vous-même le modèle entraîné.
Encapsulage de l’entraînement dans une exécution MLflow. Cela construit un pipeline Transformers à partir du générateur de jetons et du modèle entraîné, et l’écrit sur le disque local. Enfin, connectez le modèle à MLflow avec 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!",
)
Si vous n’avez pas besoin de créer un pipeline, vous pouvez envoyer les composants utilisés dans l’apprentissage dans un dictionnaire :
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!"],
)
Chargez le modèle à utiliser pour l’inférence
Lorsque votre modèle est journalisé et prêt, le chargement du modèle pour l’inférence est semblable au chargement du modèle préentraîné MLflow encapsulé.
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)
Pour plus d’informations, consultez Service de modèles avec Azure Databricks.
Résolution des erreurs CUDA courantes
Cette section décrit les erreurs CUDA courantes et les conseils sur la façon de les résoudre.
OutOfMemoryError : CUDA n'a plus de mémoire
Lors de l’entraînement de modèles volumineux, une erreur courante que vous pouvez rencontrer est l’erreur de mémoire insuffisante CUDA.
Exemple :
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.
Essayez les recommandations suivantes pour résoudre cette erreur :
Réduisez la taille de lot pour l’entraînement. Vous pouvez réduire la valeur
per_device_train_batch_size
dans TrainingArguments.Baissez la précision de l’entraînement. Vous pouvez définir
fp16=True
dans TrainingArguments.Utilisez gradient_accumulation_steps dans TrainingArguments pour augmenter efficacement la taille globale des lots.
Utilisez l’optimiseur 8-bit Adam.
Nettoyez la mémoire GPU avant l’entraînement. Parfois, la mémoire GPU peut être occupée par du code inutilisé.
from numba import cuda device = cuda.get_current_device() device.reset()
Erreurs de noyau CUDA
Lors de l’exécution de l’entraînement, vous pouvez obtenir des erreurs de noyau CUDA.
Exemple :
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.
Pour résoudre les problèmes :
Essayez d’exécuter le code sur le CPU pour voir si l’erreur est reproductible.
Une autre option consiste à avoir un meilleur suivi en définissant
CUDA_LAUNCH_BLOCKING=1
:import os os.environ["CUDA_LAUNCH_BLOCKING"] = "1"
Notebook : Ajuster la classification du texte sur un seul GPU
Pour commencer rapidement avec un exemple de code, cet exemple de notebook fournit un exemple de bout en bout pour affiner un modèle pour la classification de texte. Les sections suivantes de cet article décrivent plus en détail l’utilisation de Hugging Face pour un affinage sur Azure Databricks.
Notebook d’affinage de modèles de classification de texte avec Hugging Face
Ressources supplémentaires
En savoir plus sur Hugging Face sur Azure Databricks.
- Qu’est-ce que les transformateurs Hugging Face ?
- Vous pouvez utiliser des modèles Hugging Face Transformers sur Spark pour effectuer un scale-out de vos applications de traitement par lots NLP. Consultez Inférence de modèle à l’aide des transformateurs Hugging Face pour le traitement du langage naturel.