Hugging Faceモデルをファインチューニングするためのデータ準備
この記事では、 Hugging Face Transformers と Hugging Face データセットを使用して、オープンソースの大規模な言語モデルを微調整するためのデータを準備する方法について説明します。
要件
Databricks Runtime for Machine Learning 13.0 以降。 このガイドの例では、Databricks Runtime 13.0 機械学習以降に含まれている Hugging Face データセット を使用します。
Hugging Faceからデータを読み込む
Hugging Face データセットは、オーディオ、コンピュータービジョン、および自然言語処理(NLP)タスクのデータセットにアクセスして共有するための Hugging Face ライブラリです。 Hugging Face datasets
を使用すると、さまざまな場所からデータをロードできます。datasets
ライブラリには、 Hugging Face Hub からデータセットを読み取るためのユーティリティがあります。 load_dataset
関数を使用して Hugging Face Hub からダウンロードおよび読み取り可能なデータセットが多数あります。 Hugging Face データセットを使用したデータの読み込み の詳細については、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")
さまざまなサイズのデータ用に Databricks でデータセットをダウンロードして準備する方法については、 Hugging Face からデータセットをダウンロードするベストプラクティスノートブック を参照してください。
トレーニングと評価のデータを書式設定する
モデルのファインチューニングに独自のデータを使用するには、まずトレーニング データと評価データを Spark DataFramesに書式設定する必要があります。 次に、 Hugging Face datasets
ライブラリを使用して DataFrames をロードします。
まず、トレーニングデータをトレーナーの期待に応えるテーブルにフォーマットします。 テキスト分類の場合、これはテキスト列とラベルの列の 2 つの列を持つテーブルです。
微調整を実行するには、モデルを提供する必要があります。 Hugging Face Transformer AutoClasses ライブラリを使用すると、 自然言語処理のさまざまな Auto Models
を含むモデルと構成設定を簡単に読み込むことができます。
たとえば、Hugging Face transformers
は、カテゴリ ラベルとして整数 ID を必要とするテキスト分類のモデル ローダーとして 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)}
次に、整数 ID を 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 DataFrames からの読み込みをサポートしています。 from_spark() メソッドの詳細については、 Hugging Face のドキュメントを参照してください。
たとえば、 train_df
と test_df
DataFramesがある場合は、次のコードを使用してそれぞれのデータセットを作成できます。
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",
)
データセットのキャッシュ
キャッシュは、効率を向上させる方法の1つです datasets
。 ダウンロードおよび処理されたすべてのデータセットが保存されるため、ユーザーが中間データセットを使用する必要がある場合は、キャッシュから直接リロードされます。
データセットのデフォルトのキャッシュディレクトリは ~/.cache/huggingface/datasets
です。 クラスターが終了すると、キャッシュ データも失われます。 クラスターの終了時にキャッシュ ファイルを保持するには、Databricks では、環境変数を HF_DATASETS_CACHE
に設定してキャッシュの場所を DBFS に変更することをお勧めします。
import os
os.environ["HF_DATASETS_CACHE"] = "/dbfs/place/you/want/to/save"
モデルをファインチューニングする
データの準備ができたら、それを使用して Hugging Face モデルを微調整できます。