Hugging Face-modellen verfijnen voor één GPU
In dit artikel wordt beschreven hoe u een Hugging Face-model kunt verfijnen met de bibliotheek Hugging Face transformers
op één GPU. Het bevat ook databricks-specifieke aanbevelingen voor het laden van gegevens uit lakehouse- en logboekregistratiemodellen naar MLflow, waarmee u uw modellen in Azure Databricks kunt gebruiken en beheren.
De hugging Face-bibliotheek transformers
biedt het trainerhulpprogramma en automodelklassen waarmee u transformersmodellen kunt laden en verfijnen.
Deze hulpprogramma's zijn beschikbaar voor de volgende taken met eenvoudige wijzigingen:
- Modellen laden om af te stemmen.
- Het bouwen van de configuratie voor het hulpprogramma Hugging Face Transformers Trainer.
- Training uitvoeren op één GPU.
Zie Wat zijn knuffelingsgezichttransformaties?
Vereisten
- Een cluster met één knooppunt met één GPU op het stuurprogramma.
- De GPU-versie van Databricks Runtime 13.0 ML en hoger.
- Voor dit voorbeeld voor het afstemmen zijn de 🤗 transformatieprogramma's, 🤗 gegevenssets en 🤗 Evaluate-pakketten vereist die zijn opgenomen in Databricks Runtime 13.0 ML en hoger.
- MLflow 2.3.
- Gegevens die zijn voorbereid en geladen voor het verfijnen van een model met transformatoren.
Een gegevensset met een hugging Face tokeniseren
Het knuffelen van Face Transformers-modellen verwacht tokenized invoer in plaats van de tekst in de gedownloade gegevens. Gebruik een AutoTokenizer die is geladen vanuit het basismodel om compatibiliteit met het basismodel te garanderen. Met Face datasets
hugging kunt u de tokenizer rechtstreeks toepassen op zowel de trainings- als testgegevens.
Voorbeeld:
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)
De trainingsconfiguratie instellen
Hulpprogramma's voor het knuffelen van face-training kunnen worden gebruikt om een Trainer te configureren. Voor de trainerklassen moet de gebruiker het volgende verstrekken:
- Metrische gegevens voor
- Een basismodel
- Een trainingsconfiguratie
U kunt metrische evaluatiegegevens configureren naast de standaardmetrieken loss
die door de Trainer
berekeningen worden berekend. In het volgende voorbeeld ziet u hoe u het toevoegen als een metriek toevoegt 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)
Gebruik de klassen AutoModel voor NLP om het juiste model voor uw taak te laden.
Voor tekstclassificatie gebruikt u AutoModelForSequenceClassification om een basismodel voor tekstclassificatie te laden. Wanneer u het model maakt, geeft u het aantal klassen en de labeltoewijzingen op die tijdens de voorbereiding van de gegevensset zijn gemaakt.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
base_model,
num_labels=len(label2id),
label2id=label2id,
id2label=id2label
)
Maak vervolgens de trainingsconfiguratie. Met de klasse TrainingArguments kunt u de uitvoermap, evaluatiestrategie, leersnelheid en andere parameters opgeven.
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir=training_output_dir, evaluation_strategy="epoch")
Het gebruik van een gegevenssorator batches invoer in trainings- en evaluatiegegevenssets. DataCollatorWithPadding biedt goede basislijnprestaties voor tekstclassificatie.
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer)
Nu al deze parameters zijn gemaakt, kunt u nu een 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,
)
Trainen en aanmelden bij MLflow
Face-interfaces goed knuffelen met MLflow en registreert automatisch metrische gegevens tijdens modeltraining met behulp van de MLflowCallback. U moet het getrainde model echter zelf registreren.
Training verpakken in een MLflow-uitvoering. Hiermee wordt een transformatorpijplijn gemaakt van de tokenizer en het getrainde model en wordt deze naar de lokale schijf geschreven. Meld ten slotte het model aan bij MLflow met 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!",
)
Als u geen pijplijn hoeft te maken, kunt u de onderdelen die in de training worden gebruikt, indienen in een woordenlijst:
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!"],
)
Het model laden voor deductie
Wanneer uw model is geregistreerd en gereed is, is het laden van het model voor deductie hetzelfde als het laden van het vooraf getrainde MLflow-model.
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)
Zie Model dat wordt geleverd met Azure Databricks voor meer informatie.
Veelvoorkomende CUDA-fouten oplossen
In deze sectie worden veelvoorkomende CUDA-fouten en richtlijnen beschreven voor het oplossen van deze fouten.
OutOfMemoryError: CUDA onvoldoende geheugen
Bij het trainen van grote modellen is een veelvoorkomende fout die u kunt tegenkomen de CUDA uit het geheugen.
Voorbeeld:
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.
Probeer de volgende aanbevelingen om deze fout op te lossen:
Verklein de batchgrootte voor training. U kunt de
per_device_train_batch_size
waarde in TrainingArguments verminderen.Gebruik training met lagere precisie. U kunt instellen
fp16=True
in TrainingArguments.Gebruik gradient_accumulation_steps in TrainingArguments om de totale batchgrootte effectief te vergroten.
Gebruik 8-bits Adam Optimizer.
Schoon het GPU-geheugen op voordat u traint. Soms kan GPU-geheugen worden bezet door een aantal ongebruikte code.
from numba import cuda device = cuda.get_current_device() device.reset()
CUDA-kernelfouten
Bij het uitvoeren van de training kunnen CUDA-kernelfouten optreden.
Voorbeeld:
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.
Ga als volgt te werk om het probleem op te lossen:
Voer de code uit op de CPU om te zien of de fout reproduceerbaar is.
Een andere optie is om een betere tracering te krijgen door het instellen
CUDA_LAUNCH_BLOCKING=1
van:import os os.environ["CUDA_LAUNCH_BLOCKING"] = "1"
Notebook: Tekstclassificatie verfijnen op één GPU
Om snel aan de slag te gaan met voorbeeldcode, biedt dit voorbeeldnotebook een end-to-end-voorbeeld voor het verfijnen van een model voor tekstclassificatie. In de volgende secties van dit artikel wordt dieper ingegaan op het gebruik van Hugging Face voor het verfijnen van Azure Databricks.
Notitieblok voor het opsnuffelen van face-tekstclassificatiemodellen afstemmen
Aanvullende bronnen
Meer informatie over Hugging Face in Azure Databricks.
- Wat zijn knuffelingsgezichttransformaties?
- U kunt Hugging Face Transformers-modellen in Spark gebruiken om uw NLP-batchtoepassingen uit te schalen. Zie Modeldeductie met behulp van Hugging Face Transformers voor NLP.