Hugging Faceモデルをファインチューニングするためのデータ準備

この記事では、 Hugging Face TransformersHugging 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_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_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 モデルを微調整できます。

ノートブック: Hugging Faceからデータセットをダウンロードする

このサンプル ノートブックでは、Hugging Face load_dataset 関数を使用して、さまざまなサイズのデータ用に Databricks のデータセットをダウンロードして準備するための推奨されるベスト プラクティスを示します。

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

ノートブックを新しいタブで開く