Hugging Face モデルを微調整するためのデータを準備する

この記事では、Hugging Face TransformersHugging Face Datasets を使用して、オープン ソースの大規模言語モデルを微調整するためのデータを準備する方法について説明しています。

要件

Hugging Face からデータを読み込む

Hugging Face Datasets は、オーディオ、コンピューター ビジョン、自然言語処理 (NLP) タスク用のデータセットにアクセスして共有するための Hugging Face ライブラリです。 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 DataFrames に書式設定する必要があります。 次に、Hugging Face datasets ライブラリを使用して DataFrame を読み込みます。

まず、トレーニング データをトレーナーの期待に合ったテーブルに書式設定します。 テキスト分類の場合、これは 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)}

次に、Pandas UDF を使用して、ラベル列として整数 ID を作成します。

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 からの読み込みがサポートされます。 from_spark() メソッドの詳細については、Hugging Face のドキュメントを参照してください。

たとえば、train_dftest_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_dirDatabricks ファイル システム (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 で効率を向上させる方法の 1 つです。 ダウンロードおよび処理されたすべてのデータセットが格納されるため、ユーザーが中間データセットを使用する必要がある場合は、キャッシュから直接再度読み込まれます。

データセットの既定のキャッシュ ディレクトリは ~/.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 上のデータセットをダウンロードして準備する場合に推奨されるベスト プラクティスを提供します。

Hugging Face のベスト プラクティス ノートブックからデータセットをダウンロードする

ノートブックを入手