メインコンテンツまでスキップ

ファインチューニング Hugging Face モデル用のデータ準備

この記事では、Hugging Face TransformersHugging Face データセットを使用して、ファインチューニング オープンソース 大規模言語モデル用のデータを準備する方法について説明します。

必要条件

  • Databricks Runtime for Machine Learning 13.0 以降。 このガイドの例では、Databricks Runtime 13.0 ML 以降に含まれている 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 ドキュメントを参照してください。

Python
from datasets import load_dataset
dataset = load_dataset("imdb")

Hugging Face Hub の一部のデータセットは、 load_dataset が呼び出されたときにダウンロードおよび生成されるデータのサイズを提供します。 load_dataset_builder を使用して、データセットをダウンロードする前にサイズを知ることができます load_dataset

Python
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 データフレームに書式設定する必要があります。 次に、 Hugging Face datasets ライブラリを使用して データフレーム をロードします。

まず、トレーニングデータをトレーナーの期待に応えるテーブルにフォーマットします。 テキスト分類の場合、これは 2 つの列 (テキスト列とラベルの列) を持つテーブルです。

ファインチューニングを行うためには、モデルを提供する必要があります。 Hugging Face Transformer AutoClasses ライブラリを使用すると、自然言語処理の幅広いAuto Modelsを含むモデルと構成設定を簡単にロードできます。

たとえば、Hugging Face transformers は、カテゴリ ラベルとして整数 ID を想定しているテキスト分類のモデル ローダーとして AutoModelForSequenceClassification を提供します。 ただし、文字列ラベルを持つ データフレーム がある場合は、モデルの作成時に整数ラベルと文字列ラベルの間のマッピングも指定する必要があります。 この情報は、次のように収集できます。

Python
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 を持つラベル列として作成します。

Python
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 データフレーム から Hugging Face データセットを読み込む

Hugging Face datasets は、 datasets.Dataset.from_sparkを使用した Spark データフレーム からの読み込みをサポートしています。 from_spark() メソッドの詳細については、Hugging Face のドキュメントを参照してください。

たとえば、 train_dftest_df データフレームがある場合、次のコードを使用してそれぞれにデータセットを作成できます。

Python
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 を一時的な場所として使用するには、次のようにします。

Python
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

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

モデルの微調整

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

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

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

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

Open notebook in new tab