共用方式為


微調單一 GPU 的擁抱臉部模型

本文說明如何在單一 GPU 上使用擁抱臉部連結庫微調擁抱臉部 transformers 模型。 它也包含 Databricks 特定的建議,可將數據從 Lakehouse 載入,並將模型記錄至 MLflow,這可讓您在 Azure Databricks 上使用及控管模型。

擁抱臉部 transformers 連結庫提供 定型 器公用程式和 自動模型 類別,以啟用載入和微調轉換器模型。

這些工具適用於下列具有簡單修改的工作:

  • 載入模型以微調。
  • 建構擁抱臉部轉換器訓練器公用程式的組態。
  • 在單一 GPU 上執行定型。

請參閱 什麼是擁抱臉部轉換器?

需求

  • 具有驅動程式上一個 GPU 的單一節點 叢集
  • Databricks Runtime 13.0 ML 和更新版本的 GPU 版本。
    • 此微調範例需要 🤗 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)

設定定型組態

擁抱臉部訓練設定工具可用來設定 定型器。 定型器類別需要使用者提供:

  • 計量
  • 基底模型
  • 定型組態

除了計算的預設 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 類別可讓您指定輸出目錄、評估策略、學習速率和其他參數。

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)

建構所有這些參數后,您現在可以建立 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 執行中包裝訓練。 這會從 Tokenizer 和定型模型建構 Transformers 管線,並將它寫入本機磁碟。 最後,使用 mlflow.transformers.log_model 將模型記錄至 MLflow。

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)

如需詳細資訊,請參閱 使用 Azure Databricks 提供模型。

針對常見的 CUDA 錯誤進行疑難解答

本節說明常見的 CUDA 錯誤,以及如何解決這些錯誤。

OutOfMemoryError:CUDA 記憶體不足

定型大型模型時,您可能會遇到的常見錯誤是 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.

請嘗試下列建議來解決此錯誤:

  • 減少定型的批次大小。 您可以在 TrainingArguments減少per_device_train_batch_size值。

  • 使用較低的精確度定型。 您可以在 TrainingArguments設定 fp16=True

  • 在 TrainingArguments 中使用gradient_accumulation_steps,以有效增加整體批次大小。

  • 使用 8 位 Adam 優化器

  • 在定型之前清除 GPU 記憶體。 有時候,GPU 記憶體可能會由一些未使用的程式代碼所佔用。

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

CUDA 核心錯誤

執行定型時,您可能會收到 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.

若要進行疑難排解:

  • 請嘗試在 CPU 上執行程式碼,以查看錯誤是否可重現。

  • 另一個選項是藉由設定 CUDA_LAUNCH_BLOCKING=1來取得更好的追蹤:

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

筆記本:微調單一 GPU 上的文字分類

為了快速開始使用範例程式代碼,此範例筆記本會提供端對端範例,以微調文字分類的模型。 本文後續各節會深入探討如何使用 Hugging Face 來微調 Azure Databricks。

微調擁抱臉部文字分類模型筆記本

取得筆記本

其他資源

深入瞭解 Azure Databricks 上的擁抱臉部。