Menyempurnakan model Hugging Face untuk satu GPU
Artikel ini menjelaskan cara menyempurnakan model Hugging Face dengan pustaka Hugging Face transformers
pada satu GPU. Ini juga termasuk rekomendasi khusus Databricks untuk memuat data dari lakehouse dan model pengelogan ke MLflow, yang memungkinkan Anda menggunakan dan mengatur model Anda di Azure Databricks.
Pustaka Hugging Face transformers
menyediakan utilitas Trainer dan kelas Model Otomatis yang memungkinkan pemuatan dan penyempurnaan model Transformers.
Alat-alat ini tersedia untuk tugas-tugas berikut dengan modifikasi sederhana:
- Memuat model untuk menyempurnakan.
- Membangun konfigurasi untuk utilitas Hugging Face Transformers Trainer.
- Melakukan pelatihan pada satu GPU.
Lihat Apa itu Pelukan Transformer Wajah?
Persyaratan
- Kluster node tunggal dengan satu GPU pada driver.
- Versi GPU Databricks Runtime 13.0 ML ke atas.
- Contoh untuk penyempurnaan ini memerlukan 🤗 paket Transformer, 🤗 Himpunan Data, dan 🤗 Evaluasi yang disertakan dalam Databricks Runtime 13.0 ML ke atas.
- MLflow 2.3.
- Data disiapkan dan dimuat untuk menyempurnakan model dengan transformator.
Tokenisasi himpunan data Hugging Face
Memeluk model Face Transformers mengharapkan input token, bukan teks dalam data yang diunduh. Untuk memastikan kompatibilitas dengan model dasar, gunakan AutoTokenizer yang dimuat dari model dasar. Memeluk Wajah datasets
memungkinkan Anda untuk langsung menerapkan tokenizer secara konsisten ke data pelatihan dan pengujian.
Contohnya:
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)
Menyiapkan konfigurasi pelatihan
Alat konfigurasi pelatihan Hugging Face dapat digunakan untuk mengonfigurasi Trainer. Kelas Trainer mengharuskan pengguna untuk menyediakan:
- Metrik
- Model dasar
- Konfigurasi pelatihan
Anda dapat mengonfigurasi metrik evaluasi selain metrik default loss
yang Trainer
dihitung. Contoh berikut menunjukkan penambahan accuracy
sebagai metrik:
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)
Gunakan kelas Model Otomatis untuk NLP untuk memuat model yang sesuai untuk tugas Anda.
Untuk klasifikasi teks, gunakan AutoModelForSequenceClassification untuk memuat model dasar untuk klasifikasi teks. Saat membuat model, berikan jumlah kelas dan pemetaan label yang dibuat selama persiapan himpunan data.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
base_model,
num_labels=len(label2id),
label2id=label2id,
id2label=id2label
)
Selanjutnya, buat konfigurasi pelatihan. Kelas TrainingArguments memungkinkan Anda menentukan direktori output, strategi evaluasi, tingkat pembelajaran, dan parameter lainnya.
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir=training_output_dir, evaluation_strategy="epoch")
Menggunakan kolase data mengumpulkan input dalam himpunan data pelatihan dan evaluasi. DataCollatorWithPadding memberikan performa garis besar yang baik untuk klasifikasi teks.
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer)
Dengan semua parameter ini dibangun, Anda sekarang dapat membuat 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,
)
Melatih dan masuk ke MLflow
Memeluk antarmuka Face dengan baik dengan MLflow dan secara otomatis mencatat metrik selama pelatihan model menggunakan MLflowCallback. Namun, Anda harus mencatat model terlatih sendiri.
Bungkus pelatihan dalam eksekusi MLflow. Ini membangun alur Transformers dari tokenizer dan model terlatih, dan menulisnya ke disk lokal. Terakhir, catat model ke MLflow dengan 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!",
)
Jika Anda tidak perlu membuat alur, Anda dapat mengirimkan komponen yang digunakan dalam pelatihan ke dalam kamus:
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!"],
)
Muat model untuk inferensi
Ketika model Anda dicatat dan siap, memuat model untuk inferensi sama dengan memuat model MLflow yang dibungkus sebelumnya.
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)
Lihat Model melayani dengan Azure Databricks untuk informasi selengkapnya.
Memecahkan masalah kesalahan CUDA umum
Bagian ini menjelaskan kesalahan dan panduan CUDA umum tentang cara mengatasinya.
OutOfMemoryError: CUDA kehabisan memori
Saat melatih model besar, kesalahan umum yang mungkin Anda temui adalah KESALAHAN CUDA kehabisan memori.
Contoh:
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.
Coba rekomendasi berikut untuk mengatasi kesalahan ini:
Kurangi ukuran batch untuk pelatihan. Anda dapat mengurangi
per_device_train_batch_size
nilai dalam TrainingArguments.Gunakan pelatihan presisi yang lebih rendah. Anda dapat mengatur
fp16=True
di TrainingArguments.Gunakan gradient_accumulation_steps dalam TrainingArguments untuk meningkatkan ukuran batch secara efektif.
Gunakan pengoptimal Adam 8-bit.
Bersihkan memori GPU sebelum pelatihan. Terkadang, memori GPU mungkin ditempati oleh beberapa kode yang tidak digunakan.
from numba import cuda device = cuda.get_current_device() device.reset()
Kesalahan kernel CUDA
Saat menjalankan pelatihan, Anda mungkin mendapatkan kesalahan kernel CUDA.
Contoh:
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.
Pemecahan masalah:
Coba jalankan kode pada CPU untuk melihat apakah kesalahan dapat direproduksi.
Opsi lain adalah mendapatkan traceback yang lebih baik dengan mengatur
CUDA_LAUNCH_BLOCKING=1
:import os os.environ["CUDA_LAUNCH_BLOCKING"] = "1"
Notebook: Menyempurnakan klasifikasi teks pada satu GPU
Untuk memulai dengan cepat dengan contoh kode, contoh buku catatan ini menyediakan contoh end-to-end untuk menyempurnakan model untuk klasifikasi teks. Bagian berikutnya dari artikel ini membahas lebih detail tentang menggunakan Hugging Face untuk penyempurnaan di Azure Databricks.
Menyempurnakan buku catatan model klasifikasi teks Wajah Pelukan
Sumber Daya Tambahan:
Pelajari selengkapnya tentang Memeluk Wajah di Azure Databricks.
- Apa itu Memeluk Transformer Wajah?
- Anda dapat menggunakan model Hugging Face Transformers di Spark untuk menskalakan aplikasi batch NLP Anda, lihat Inferensi model menggunakan Hugging Face Transformers untuk NLP.