共用方式為


準備用於微調 Hugging Face 模型的資料

本文示範如何使用擁抱臉部轉換器擁抱臉部數據集,準備您的數據以微調 開放原始碼 大型語言模型。

需求

  • Databricks Runtime for Machine Learning 13.0 或更新版本。 本指南中的範例使用 Databricks Runtime 13.0 ML 和更新版本中包含的 Hugging Face 資料集
  • 已啟用 Unity 目錄的工作區。 您也需要具備下列許可權,才能將數據寫入 Unity 目錄磁碟區:
    • 您要上傳檔案之磁碟區的 WRITE VOLUME 許可權。
    • 父架構的 USE SCHEMA 許可權。
    • 父目錄上的 USE CATALOG 許可權。
  • 下載大型數據集的重要計算資源。 提供的範例筆記本中使用的大型數據集需要超過一天的時間才能下載。

從 Hugging Face 載入資料

Hugging Face Datasets 是一個 Hugging Face 程式庫,用於存取和共用音訊、電腦視覺和自然語言處理 (NLP) 工作的資料集。 使用 Hugging Face datasets,您可以從各種位置載入資料。 datasets 程式庫具有用於從 Hugging Face Hub 讀取資料集的公用程式。 您可以使用 load_dataset 函數,從 Hugging Face Hub 下載和讀取許多資料集。 若要深入了解使用 Hugging Face Datasets 載入資料,請參閱 Hugging Face 文件。

from datasets import load_dataset
dataset = load_dataset("imdb")

Hugging Face Hub 中的某些資料集提供了呼叫 load_dataset 時下載和產生的資料的大小。 在使用 load_dataset_builder 下載資料集之前,您可以使用 load_dataset 來了解大小。

from datasets import load_dataset_builder
from psutil._common import bytes2human

def print_dataset_size_if_provided(*args, **kwargs):
  dataset_builder = load_dataset_builder(*args, **kwargs)

  if dataset_builder.info.download_size and dataset_builder.info.dataset_size:
    print(f'download_size={bytes2human(dataset_builder.info.download_size)}, dataset_size={bytes2human(dataset_builder.info.dataset_size)}')
  else:
    print('Dataset size is not provided by uploader')

print_dataset_size_if_provided("imdb")

如需如何在 Azure Databricks 上為不同大小的資料下載和準備資料集的指引,請參閱從 Hugging Face 最佳做法筆記本下載資料集

格式化訓練和評估資料

若要使用您自己的資料進行模型微調,您必須先將訓練和評估資料格式化為 Spark DataFrame。 然後,使用 Hugging Face datasets 程式庫載入 DataFrame。

首先,將訓練資料格式化為符合訓練員預期的資料表。 對於文字分類,這是具有兩個資料行的資料表:文字資料行和標籤的資料行。

若要執行微調,您需要提供模型。 Hugging Face Transformer AutoClasses 程式庫可讓您輕鬆地載入模型和組態設定,包括用於Auto Models的各種

例如,Hugging Face transformers 提供 AutoModelForSequenceClassification 作為文字分類的模型載入器,它要求提供整數識別碼作為類別標籤。 但是,如果您具有帶字串標籤的 DataFrame,則還必須在建立模型時指定整數標籤與字串標籤之間的對應。 您可以收集此資訊,如下所示:

labels = df.select(df.label).groupBy(df.label).count().collect()
id2label = {index: row.label for (index, row) in enumerate(labels)}
label2id = {row.label: index for (index, row) in enumerate(labels)}

然後,使用 Pandas UDF 建立整數識別碼作為標籤資料行:

from pyspark.sql.functions import pandas_udf
import pandas as pd
@pandas_udf('integer')
def replace_labels_with_ids(labels: pd.Series) -> pd.Series:
  return labels.apply(lambda x: label2id[x])

df_id_labels = df.select(replace_labels_with_ids(df.label).alias('label'), df.text)

從 Spark DataFrame 載入 Hugging Face 資料集

Hugging Face datasets 支援使用 datasets.Dataset.from_spark 從 Spark DataFrame 載入。 請參閱 Hugging Face 文件,以深入了解 from_spark() 方法。

例如,如果您具有 train_dftest_df DataFrame,可以使用下列程式碼為每個 DataFrame 建立資料集:

import datasets
train_dataset = datasets.Dataset.from_spark(train_df, cache_dir="/Volumes/main/default/my-volume/train")
test_dataset = datasets.Dataset.from_spark(test_df, cache_dir="/Volumes/main/default/my-volume/test")

Dataset.from_spark 快取資料集。 此範例描述驅動程式上的模型訓練,因此必須向驅動程式提供資料。 此外,由於快取具體化是使用 Spark 平行處理的,因此,提供的 cache_dir 必須可供所有背景工作角色存取。 若要滿足這些條件約束,cache_dir 應該是 Unity 目錄磁碟區路徑

您可以使用 Unity 目錄來管理儲存體的存取。

如果您的數據集很大,將它寫入 Unity Catalog 可能需要很長的時間。 若要加速此程式,您可以使用 working_dir 參數讓 Hugging Face datasets 將數據集寫入磁碟上的暫存位置,然後將它移至 Unity 目錄。 例如,若要使用 SSD 作為暫存位置,請執行以下操作:

import datasets
dataset = datasets.Dataset.from_spark(
  train_df,
  cache_dir="/Volumes/main/default/my-volume/train",
  working_dir="/local_disk0/tmp/train",
)

資料集的快取

快取是 datasets 提高效率的方法之一。 快取會儲存所有已下載和已處理的資料集,因此,當使用者需要使用中繼資料集時,系統會直接從快取中重新載入這些資料集。

資料集的預設快取目錄為 ~/.cache/huggingface/datasets。 當叢集終止時,快取資料也會遺失。 若要在叢集終止時保存快取檔案,Databricks 建議將快取位置變更為 Unity 目錄磁碟區路徑,方法是將環境變數設定為 HF_DATASETS_CACHE

import os
os.environ["HF_DATASETS_CACHE"] = "/Volumes/main/default/my-volume/"

微調模型

當資料準備就緒時,您可以使用它來微調 Hugging Face 模型

筆記本:從 Hugging Face 下載資料集

此範例筆記本提供使用 Hugging Face load_dataset 函數在 Azure Databricks 中為不同大小的資料下載和準備資料集的建議最佳做法。

從 Hugging Face 下載資料集最佳做法筆記本

取得筆記本