この記事では、Hugging Face Transformers と Hugging Face Datasets を使用して、オープン ソースの大規模言語モデルを微調整するためのデータを準備する方法について説明しています。
要件
- Databricks Runtime for Machine Learning 13.0 以降。 このガイドの例では、Databricks Runtime 13.0 ML 以降に含まれる Hugging Face データセットを使用します。
- Unity Catalog が有効になっているワークスペース。 また、Unity カタログ ボリュームにデータを書き込むには、次のアクセス許可が必要です。
- ファイルをアップロードしたいボリュームに対する WRITE VOLUME 権限。
- 親スキーマに対する USE SCHEMA 特権。
- 親カタログに対する USE CATALOG アクセス許可。
- 大規模なデータセットをダウンロードするための重要なコンピューティング リソース。 サンプル ノートブックで使用されている大規模なデータセットは、ダウンロードに 1 日以上かかります。
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_df
と test_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
には、すべてのワーカーがアクセスできる必要があります。 これらの制約を満たすために、cache_dir
は Unity カタログ ボリューム パスである必要があります。
ボリュームへのアクセスは、 Unity カタログを使用して管理できます。
データセットが大きい場合、Unity カタログへの書き込みに時間がかかる場合があります。 プロセスを高速化するには、 working_dir
パラメーターを使用して、Hugging Face datasets
ディスク上の一時的な場所にデータセットを書き込み、Unity カタログに移動させることができます。 たとえば、SSD を一時的な場所として使用するには、次のようにします。
import datasets
dataset = datasets.Dataset.from_spark(
train_df,
cache_dir="/Volumes/main/default/my-volume/train",
working_dir="/local_disk0/tmp/train",
)
データセットのキャッシュ
キャッシュは、datasets
で効率を向上させる方法の 1 つです。 ダウンロードおよび処理されたすべてのデータセットが格納されるため、ユーザーが中間データセットを使用する必要がある場合は、キャッシュから直接再度読み込まれます。
データセットの既定のキャッシュ ディレクトリは ~/.cache/huggingface/datasets
です。 クラスターが終了すると、キャッシュ データも失われます。 クラスターの終了時にキャッシュ ファイルを保持するために、Databricks では、環境変数を HF_DATASETS_CACHE
設定して、キャッシュの場所を Unity カタログ ボリューム パスに変更することをお勧めします。
import os
os.environ["HF_DATASETS_CACHE"] = "/Volumes/main/default/my-volume/"
モデルの微調整
データの準備ができたら、それを使用して、Hugging Face モデルを微調整できます。
ノートブック: Hugging Face からデータセットをダウンロードする
このノートブックの例では、Hugging Face load_dataset
関数を使用して、さまざまなサイズのデータに対して Azure Databricks 上のデータセットをダウンロードして準備する場合に推奨されるベスト プラクティスを提供します。