準備用於微調 Hugging Face 模型的資料
本文示範如何使用擁抱臉部轉換器和擁抱臉部數據集,準備您的數據以微調 開放原始碼 大型語言模型。
需求
- Databricks Runtime for Machine Learning 13.0 或更新版本。 本指南中的範例使用 Databricks Runtime 13.0 ML 和更新版本中包含的 Hugging Face 資料集。
從 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_df
和 test_df
DataFrame,可以使用下列程式碼為每個 DataFrame 建立資料集:
import datasets
train_dataset = datasets.Dataset.from_spark(train_df, cache_dir="/dbfs/cache/train")
test_dataset = datasets.Dataset.from_spark(test_df, cache_dir="/dbfs/cache/test")
Dataset.from_spark
快取資料集。 此範例描述驅動程式上的模型訓練,因此必須向驅動程式提供資料。 此外,由於快取具體化是使用 Spark 平行處理的,因此,提供的 cache_dir
必須可供所有背景工作角色存取。 若要滿足這些條件約束,cache_dir
應是 Databricks 檔案系統 (DBFS) 根磁碟區或掛接點。
DBFS 根磁碟區可供工作區的所有使用者存取,但只能用於沒有存取限制的資料。 如果您的資料需要存取控制,請使用掛接點,而不是 DBFS 根目錄。
如果您的資料集很大,將其寫入 DBFS 可能需要很長時間。 若要加速程序,您可以使用 working_dir
參數讓 Hugging Face datasets
將資料集寫入磁碟上的暫存位置,然後將其移至 DBFS。 例如,若要使用 SSD 作為暫存位置,請執行以下操作:
import datasets
dataset = datasets.Dataset.from_spark(
train_df,
cache_dir="/dbfs/cache/train",
working_dir="/local_disk0/tmp/train",
)
資料集的快取
快取是 datasets
提高效率的方法之一。 快取會儲存所有已下載和已處理的資料集,因此,當使用者需要使用中繼資料集時,系統會直接從快取中重新載入這些資料集。
資料集的預設快取目錄為 ~/.cache/huggingface/datasets
。 當叢集終止時,快取資料也會遺失。 若要在叢集終止時保存快取檔案,Databricks 建議透過設定環境變數 HF_DATASETS_CACHE
將快取位置變更為 DBFS:
import os
os.environ["HF_DATASETS_CACHE"] = "/dbfs/place/you/want/to/save"
微調模型
當資料準備就緒時,您可以使用它來微調 Hugging Face 模型。
筆記本:從 Hugging Face 下載資料集
此範例筆記本提供使用 Hugging Face load_dataset
函數在 Azure Databricks 中為不同大小的資料下載和準備資料集的建議最佳做法。