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

Hugging Face Transformers

Hugging Face Transformers ライブラリは、最先端のNLPモデル(例えばBERT)や、混合精度や勾配チェックポイントといったトレーニング技術を簡単に利用できるようにします。W&Bインテグレーション は、インタラクティブな集中ダッシュボードでリッチで柔軟な実験管理とモデルバージョン管理を提供し、その使いやすさを損ないません。

🤗 数行で次のレベルのログ記録

os.environ["WANDB_PROJECT"] = "<my-amazing-project>"  # W&Bプロジェクトの名前を指定
os.environ["WANDB_LOG_MODEL"] = "checkpoint" # すべてのモデルチェックポイントをログ

from transformers import TrainingArguments, Trainer

args = TrainingArguments(..., report_to="wandb") # W&Bログを有効化
trainer = Trainer(..., args=args)

W&amp;Bインタラクティブダッシュボードで実験結果を探索

備考

すぐに作業コードに取り掛かりたい場合は、このGoogle Colabをチェックしてください。

はじめに: 実験をトラック

1) サインアップ、wandbライブラリのインストール、ログイン

a) サインアップして無料アカウントを作成

b) wandbライブラリをpipでインストール

c) トレーニングスクリプトにログインするには、www.wandb.aiでサインインして、[**承認ページ**](https://wandb.ai/authorize)でAPIキーを見つける必要があります。

Weights and Biases を初めて使用する場合は、クイックスタートをチェックすることをお勧めします。

pip install wandb

wandb login

2) プロジェクトの名前を付ける

Project は、関連するRunsからログされたすべてのチャート、データ、モデルが保存される場所です。プロジェクトに名前を付けることで、作業を整理し、単一のプロジェクトに関するすべての情報を一か所にまとめることができます。

プロジェクトにRunを追加するには、簡単にWANDB_PROJECT環境変数をプロジェクトの名前に設定します。WandbCallbackはこのプロジェクト名の環境変数を検出し、それを使ってRunを設定します。

import os
os.environ["WANDB_PROJECT"]="amazon_sentiment_analysis"
備考

Trainerを初期化する前にプロジェクト名を設定してください。

プロジェクト名が指定されていない場合、プロジェクト名はデフォルトで「huggingface」になります。

3) トレーニングのRunsをW&Bにログする

これが最も重要なステップです:コード内またはコマンドラインからTrainerトレーニング引数を定義する際に、W&Bへのログを有効にするために、report_to"wandb"に設定します。

TrainingArgumentslogging_steps引数は、トレーニング中にトレーニングメトリクスをW&Bにプッシュする頻度をコントロールします。また、run_name引数を使用して、W&B内でトレーニングRunの名前を付けることもできます。

これで完了です!トレーニング中にモデルの損失、評価メトリクス、モデルトポロジー、勾配がWeights & Biasesにログされます。

from transformers import TrainingArguments, Trainer

args = TrainingArguments(
# 他の引数とキーワード引数
report_to="wandb", # W&Bへのログを有効化
run_name="bert-base-high-lr", # W&B Runの名前(オプション)
logging_steps=1, # W&Bへのログ頻度
)

trainer = Trainer(
# 他の引数とキーワード引数
args=args, # あなたのトレーニング引数
)

trainer.train() # トレーニングとW&Bへのログを開始
備考

TensorFlowを使用していますか?PyTorchのTrainerをTensorFlowのTFTrainerに置き換えてください。

4) モデルのチェックポイントを有効にする

Weights & BiasesのArtifactsを使用すると、無料で最大100GBのモデルとデータセットを保存し、Weights & BiasesModel Registryを使用してモデルを登録し、プロダクション環境でのステージングやデプロイメントの準備をすることができます。

Hugging Face モデルのチェックポイントをArtifactsにログするには、環境変数WANDB_LOG_MODELendcheckpoint、またはfalseのいずれかに設定します:

  • checkpoint: TrainingArgumentsargs.save_steps ごとにチェックポイントがアップロードされます。
  • end: トレーニングの最後にモデルがアップロードされます。

トレーニングの最後に最適なモデルをアップロードするには、WANDB_LOG_MODELload_best_model_at_endを使用します。

import os

os.environ["WANDB_LOG_MODEL"] = "checkpoint"

今後初期化するすべてのTransformersTrainerは、モデルをW&Bプロジェクトにアップロードします。ログされたモデルのチェックポイントはArtifactsUIで表示でき、完全なモデルリネージを含みます(UIでのモデルチェックポイントの例はこちら)。

備考

デフォルトでは、WANDB_LOG_MODELendに設定されている場合、モデルはmodel-{run_id}という名前で、WANDB_LOG_MODELcheckpointに設定されている場合はcheckpoint-{run_id}という名前でW&B Artifactsに保存されます。 ただし、TrainingArgumentsrun_nameを渡した場合、モデルはmodel-{run_name}またはcheckpoint-{run_name}という名前で保存されます。

W&B Model Registry

チェックポイントがArtifactsにログされた後、Weights & BiasesのModel Registryを使用してチーム全体でモデルを登録し、中心的に管理することができます。ここでは、タスクごとに最適なモデルを整理し、モデルのライフサイクルを管理し、MLライフサイクル全体での追跡と監査を容易にし、自動化された下流のアクションをWebhooksやジョブで実行できます。

Model RegistryにモデルArtifactをリンクする方法については、Model Registryのドキュメントを参照してください。

5) トレーニング中に評価出力を可視化

トレーニングまたは評価中にモデルの出力を可視化することは、モデルのトレーニング状況を正確に理解するために重要です。

Transformers Trainerのコールバックシステムを使用すると、テキスト生成出力やその他の予測をW&B Tablesにログすることができるなど、追加の有用なデータをW&Bにログできます。

トレーニング中に評価出力をログする方法については、以下のカスタムログセクションをご参照ください。ここでは、次のようなW&B Tableに評価サンプルをログする完全ガイドを提供しています。

評価出力を表示するW&amp;Bテーブル

6) W&B Runを終了する(ノートブックのみ)

トレーニングがPythonスクリプト内にカプセル化されている場合、スクリプトが終了するとW&B runも終了します。

JupyterやGoogle Colabノートブックを使用している場合は、トレーニングが完了したことをwandb.finish()を呼び出して知らせる必要があります。

trainer.train()  # トレーニングとW&Bへのログを開始

# トレーニング後の分析、テスト、その他のログコード

wandb.finish()

7) 結果を可視化する

トレーニング結果をログしたら、W&Bダッシュボードで結果を動的に探索できます。数十のRunsを一度に比較したり、興味深い発見をズームインしたりしながら、柔軟でインタラクティブなビジュアライゼーションで複雑なデータからインサイトを引き出すことが簡単です。

高度な機能とFAQ

最適なモデルを保存するには?

Trainerに渡されるTrainingArgumentsload_best_model_at_end=Trueが設定されている場合、W&Bは最適なモデルチェックポイントをArtifactsに保存します。

最適なモデルバージョンをチーム全体で一元管理し、MLタスクごとに整理し、プロダクションステージングのために用意したり、さらに評価のためにブックマークしたり、下流のモデルCI/CDプロセスを開始するには、モデルのチェックポイントをArtifactsに保存してください。Artifactsにログされた後、これらのチェックポイントはModel Registryに昇格できます。

保存されたモデルをロードする

WANDB_LOG_MODELでモデルをW&B Artifactsに保存した場合、追加のトレーニングや推論のためにモデルの重みをダウンロードできます。同じHugging Faceアーキテクチャに重みをロードし直します。

# 新しいrunを作成
with wandb.init(project="amazon_sentiment_analysis") as run:
# Artifactの名前とバージョンを指定
my_model_name = "model-bert-base-high-lr:latest"
my_model_artifact = run.use_artifact(my_model_name)

# モデルの重みをフォルダにダウンロードし、パスを返す
model_dir = my_model_artifact.download()

# 同じモデルクラスを使用して、そのフォルダからHugging Faceモデルをロード
model = AutoModelForSequenceClassification.from_pretrained(
model_dir, num_labels=num_labels
)

# 追加トレーニングまたは推論を行う

チェックポイントからトレーニングを再開する

WANDB_LOG_MODEL='checkpoint'を設定した場合、model_dirTrainingArgumentsmodel_name_or_path引数として使用し、Trainerresume_from_checkpoint=Trueを設定してトレーニングを再開することができます。

last_run_id = "xxxxxxxx"  # あなたのwandbワークスペースからrun_idを取得

# run_idからW&B runを再開
with wandb.init(
project=os.environ["WANDB_PROJECT"],
id=last_run_id,
resume="must",
) as run:
# RunにArtifactを接続
my_checkpoint_name = f"checkpoint-{last_run_id}:latest"
my_checkpoint_artifact = run.use_artifact(my_model_name)

# チェックポイントをフォルダにダウンロードし、パスを返す
checkpoint_dir = my_checkpoint_artifact.download()

# モデルとトレーナーを再初期化
model = AutoModelForSequenceClassification.from_pretrained(
"<model_name>", num_labels=num_labels
)
# あなたの素晴らしいトレーニング引数
training_args = TrainingArguments()

trainer = Trainer(model=model, args=training_args)

# チェックポイントディレクトリを使用してトレーニングを再開
trainer.train(resume_from_checkpoint=checkpoint_dir)

カスタムログ: トレーニング中に評価サンプルをログ・表示

TransformersTrainer経由でWeights & Biasesにログを記録するのは、TransformersライブラリのWandbCallbackによって処理されます。Hugging Faceのログをカスタマイズする必要がある場合は、WandbCallbackをサブクラス化し、Trainerクラスの追加メソッドを活用して機能を追加することでこのコールバックを修正できます。

以下は、新しいコールバックをHF Trainerに追加する一般的なパターンです。さらに下のコード例には、トレーニング中に評価出力をW&B Tableにログする完全な例が示されています。

# 通常通りTrainerをインスタンス化
trainer = Trainer()

# Trainerオブジェクトを渡して、新しいログコールバックをインスタンス化
evals_callback = WandbEvalsCallback(trainer, tokenizer, ...)

# コールバックをTrainerに追加
trainer.add_callback(evals_callback)

# 通常通りTrainerトレーニングを開始
trainer.train()

トレーニング中に評価サンプルを表示

次のセクションでは、WandbCallbackをカスタマイズしてモデル予測を実行し、トレーニング中に評価サンプルをW&B Tableにログする方法を示します。on_evaluateメソッドを使用してeval_stepsごとに評価を行います。

ここでは、tokenizerを使用してモデル出力から予測とラベルをデコードするdecode_predictions関数を作成しました。

次に、予測とラベルからpandas DataFrameを作成し、DataFrameにepoch列を追加します。

最後に、DataFrameからwandb.Tableを作成し、それをwandbにログします。 また、ログの頻度を調整するために、freqエポックごとに予測をログすることができます。

注意: 通常のWandbCallbackとは異なり、このカスタムコールバックはTrainerがインスタンス化された後に追加する必要があります。これは、コールバックの初期化中にTrainerインスタンスがコールバックに渡されるためです。

from transformers.integrations import WandbCallback
import pandas as pd


def decode_predictions(tokenizer, predictions):
labels = tokenizer.batch_decode(predictions.label_ids)
logits = predictions.predictions.argmax(axis=-1)
prediction_text = tokenizer.batch_decode(logits)
return {"labels": labels, "predictions": prediction_text}


class WandbPredictionProgressCallback(WandbCallback):
"""カスタムWandbCallback: トレーニング中のモデル予測をログ.

このコールバックは、トレーニング中の各ログ記録ステップでモデルの予測とラベルをwandb.Tableに記録します。
トレーニングが進むにつれてモデルの予測を可視化できます。

属性:
trainer (Trainer): Hugging Face Trainerインスタンス
tokenizer (AutoTokenizer): モデルに関連付けられたトークナイザー
sample_dataset (Dataset): 予測を生成するための検証データセットのサブセット
num_samples (int, optional): 予測を生成するための検証データセットから選択するサンプル数。デフォルトは100.
freq (int, optional): ログの頻度。デフォルトは2.
"""

def __init__(self, trainer, tokenizer, val_dataset,
num_samples=100, freq=2):
"""WandbPredictionProgressCallbackの初期化

引数:
trainer (Trainer): Hugging Face Trainerインスタンス
tokenizer (AutoTokenizer): モデルに関連付けられたトークナイザー
val_dataset (Dataset): 検証データセット
num_samples (int, optional): 予測を生成するための検証データセットから選択するサンプル数。デフォルトは100.
freq (int, optional): ログの頻度。デフォルトは2.
"""
super().__init__()
self.trainer = trainer
self.tokenizer = tokenizer
self.sample_dataset = val_dataset.select(range(num_samples))
self.freq = freq

def on_evaluate(self, args, state, control, **kwargs):
super().on_evaluate(args, state, control, **kwargs)
# 予測を`freq`エポックごとにログ
if state.epoch % self.freq == 0:
# 予測を生成
predictions = self.trainer.predict(self.sample_dataset)
# 予測とラベルをデコード
predictions = decode_predictions(self.tokenizer, predictions)
# 予測をwandb.Tableに追加
predictions_df = pd.DataFrame(predictions)
predictions_df["epoch"] = state.epoch
records_table = self._wandb.Table(dataframe=predictions_df)
# テーブルをwandbにログ
self._wandb.log({"sample_predictions": records_table})


# まずTrainerをインスタンス化
trainer = Trainer(
model=model,
args=training_args,
train_dataset=lm_datasets["train"],
eval_dataset=lm_datasets["validation"],
)

# WandbPredictionProgressCallbackをインスタンス化
progress_callback = WandbPredictionProgressCallback(
trainer=trainer,
tokenizer=tokenizer,
val_dataset=lm_dataset["validation"],
num_samples=10,
freq=2,
)

# コールバックをTrainerに追加
trainer.add_callback(progress_callback)

詳細な例については、このcolabを参照してください。

追加のW&B設定

Trainerを使用してログされる内容のさらなる設定は、環境変数を設定することで可能です。W&B環境変数の完全なリストはこちらにあります。

環境変数使用方法
WANDB_PROJECTプロジェクトに名前を付けます(デフォルトはhuggingface
WANDB_LOG_MODEL

モデルのチェックポイントをW&B Artifactとしてログする(デフォルトはfalse

  • false(デフォルト): モデルのチェックポイントをログしない
  • checkpoint: args.save_stepsごとにチェックポイントがアップロードされます(TrainerのTrainingArgumentsで設定)。
  • end: トレーニングの最後に最終モデルのチェックポイントがアップロードされます。
WANDB_WATCH

モデルの勾配、パラメーター、またはどちらもログするかどうかを設定します

  • false(デフォルト): 勾配やパラメーターをログしない
  • gradients: 勾配のヒストグラムをログ
  • all: 勾配とパラメーターのヒストグラムをログ
WANDB_DISABLEDtrueに設定するとログを完全に無効化します(デフォルトはfalse
WANDB_SILENTtrueに設定するとwandbから出力される出力をサイレントにします(デフォルトはfalse
WANDB_WATCH=all
WANDB_SILENT=true

wandb.init をカスタマイズ

Trainerが使用するWandbCallbackは、Trainerが初期化されるときに内部でwandb.initを呼び出します。Trainerを初期化する前に手動でwandb.initを呼び出すことで、W&B runの設定を完全にカスタマイズできます。

以下は、initに渡す可能性がある内容の例です。wandb.initの使用方法についての詳細はリファレンスドキュメントを参照してください。

wandb.init(
project="amazon_sentiment_analysis",
name="bert-base-high-lr",
tags=["baseline", "high-lr"],
group="bert",
)

注目の記事

以下は、TransformersとW&Bに関連する記事6選です。

Hugging Face Transformers のハイパーパラメーター最適化
  • Hugging Face Transformers のハイパーパラメーター最適化の三つの戦略 - グリッド検索、ベイズ最適化、Population Based Training が比較されています。
  • Hugging Face transformers の標準的な未ケース BERT モデルを使用し、SuperGLUE ベンチマークの RTE データセットでファインチューンします。
  • 結果は、Population Based Training が Hugging Face transformer モデルのハイパーパラメーター最適化に最も効果的なアプローチであることを示しています。

完全なレポートはこちら

Hugging Tweets: ツイートを生成するモデルをトレーニング
  • 記事では、事前学習済みGPT2 HuggingFace Transformerモデルを使用し、誰でも彼のツイートに対してわずか5分でファインチューンする方法が示されています。
  • モデルは次のパイプラインを使用します:ツイートのダウンロード、データセットの最適化、初期実験、ユーザー間の損失の比較、モデルのファインチューン。

完全なレポートはこちら

Hugging Face BERT と WBを使用した文分類
  • 記事では、最近のNLPのブレークスルーを活用し、転移学習をNLPに応用する文分類器を構築します。
  • 単一文分類用のCoLA(Corpus of Linguistic Acceptability)データセットを使用します。これは、文が文法的に正しいかどうかをラベル付けしたもので、最初は2018年5月に公開されました。
  • GoogleのBERTを使用して、最小限の労力で幅広いNLPタスクに対して高性能なモデルを作成します。

完全なレポートはこちら

Hugging Face モデルのパフォーマンスをトラックするためのステップバイステップガイド
  • Weights & BiasesとHugging Face transformersを使用して、BERTよりも40%小さいがBERTの精度の97%を保つDistilBERTをGLUEベンチマークでトレーニングします。
  • GLUEベンチマークは、NLPモデルのトレーニングのための9つのデータセットとタスクのコレクションです。

完全なレポートはこちら

HuggingFaceでのアーリーストッピング - 例
  • アーリーストッピング正規化を使用してHugging Face Transformerをファインチューンするには、PyTorchまたはTensorFlowでネイティブに行うことができます。
  • TensorFlowでのアーリーストッピングコールバックを使用することは、tf.keras.callbacks.EarlyStoppingコールバックを使用することで簡単です。
  • PyTorchにはオフ・ザ・シェルフのアーリーストッピングメソッドはありませんが、GitHubのGistで動作するアーリーストッピングフックがあります。

完全なレポートはこちら

カスタムデータセットでHugging Face Transformersをファインチューンする方法

カスタムIMDBデータセットでセンチメント分析(二値分類)のためにDistilBERTトランスフォーマーをファインチューンします。

完全なレポートはこちら

問題、質問、フィーチャーリクエスト

Was this page helpful?👍👎