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

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

要件

  • Databricks Runtime for Machine Learning 13.0 以降。 このガイドの例では、Databricks Runtime 13.0 機械学習以降に含まれている Hugging Face データセット を使用します。

  • Unity Catalog が有効になっているワークスペース。 また、Unity Catalog ボリュームにデータを書き込むには、次のアクセス許可も必要です。

    • ファイルのアップロード先のボリュームに対する WRITE VOLUME 権限。

    • 親スキーマに対する USE SCHEMA 権限。

    • 親カタログに対する USE CATALOG 権限。

  • 大規模なデータセットをダウンロードするための重要なコンピュート リソース。 提供されているサンプル ノートブックで使用されている大規模なデータセットは、ダウンロードに 1 日以上かかります。

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="/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 はすべてのワーカーがアクセスできる必要があります。 これらの制約を満たすには、Unity Catalog ボリューム パスcache_dirする必要があります。

ボリュームへのアクセスは、 Unity Catalog を使用して管理できます。

データセットが大きい場合、Unity Catalog への書き込みに時間がかかることがあります。 プロセスを高速化するために、 working_dir パラメーターを使用して、Hugging Face datasets でデータセットをディスク上の一時的な場所に書き込んでから、Unity Catalog に移動できます。 たとえば、SSD を一時的な場所として使用するには、次のようにします。

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

データセットのキャッシュ

キャッシュは、効率を向上させる方法の1つです datasets 。 ダウンロードおよび処理されたすべてのデータセットが保存されるため、ユーザーが中間データセットを使用する必要がある場合は、キャッシュから直接リロードされます。

データセットのデフォルトのキャッシュディレクトリは ~/.cache/huggingface/datasetsです。 クラスタリングが終了すると、キャッシュ・データも失われます。 クラスタリングの終了時にキャッシュ・ファイルを保持するには、 Databricks 環境変数を設定して、キャッシュの場所を Unity Catalog ボリューム・パスに変更することを推奨HF_DATASETS_CACHE

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

モデルをファインチューニングする

データの準備ができたら、それを使用して Hugging Face モデルを微調整できます。

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

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

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

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