メインコンテンツへスキップ
Hugging Face Transformers ライブラリを使用すると、BERT のような最先端の NLP モデルや、混合精度、gradient checkpointing などのトレーニング手法を簡単に利用できます。W&B インテグレーション を使うと、その使いやすさはそのままに、インタラクティブな一元管理ダッシュボードで、充実した柔軟な実験管理とモデルのバージョン管理を行えます。

数行でできるワンランク上のログする

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

from transformers import TrainingArguments, Trainer

args = TrainingArguments(..., report_to="wandb")  # W&B ログを有効にする
trainer = Trainer(..., args=args)
HuggingFace ダッシュボード
すぐに使えるコードを見たい場合は、こちらのGoogle Colabをご覧ください。

はじめに: 実験を管理する

サインアップしてAPIキーを発行する

APIキーは、お使いのマシンをW&Bに認証するために使用します。APIキーはユーザープロフィールから発行できます。
より手早く行うには、User Settings に直接アクセスしてAPIキーを作成してください。新しく作成したAPIキーはすぐにコピーし、パスワードマネージャーなどの安全な場所に保存してください。
  1. 右上にあるユーザープロフィールアイコンをクリックします。
  2. User Settings を選択し、API Keys セクションまでスクロールします。

wandb ライブラリをインストールしてログインする

wandb ライブラリをローカルにインストールしてログインするには、以下の手順に従います。
  1. WANDB_API_KEY 環境変数に APIキー を設定します。
    export WANDB_API_KEY=<your_api_key>
    
  2. wandb ライブラリをインストールし、ログインします。
    pip install wandb
    
    wandb login
    
W&B を初めて使用する場合は、クイックスタートを確認することをおすすめします。

プロジェクトに名前を付ける

W&B のプロジェクトは、関連する run からログされたすべてのチャート、データ、モデルを保存する場所です。プロジェクトに名前を付けることで、作業を整理しやすくなり、1 つのプロジェクトに関するすべての情報を 1 か所にまとめられます。 run をプロジェクトに追加するには、WANDB_PROJECT 環境変数にプロジェクト名を設定するだけです。WandbCallback はこの環境変数からプロジェクト名を取得し、run の設定時に使用します。
WANDB_PROJECT=amazon_sentiment_analysis
Trainer を初期化する_前に_、必ずプロジェクト名を設定してください。
プロジェクト名を指定しない場合、デフォルトのプロジェクト名は huggingface になります。

トレーニング run を W&B にログする

コード内でもコマンドラインからでも、Trainer のトレーニング引数を定義する際に最も重要なステップは、W&B でログすることを有効にするため、report_to"wandb" に設定することです。 TrainingArgumentslogging_steps 引数では、トレーニング中のメトリクスをどのくらいの頻度で W&B に送信するかを制御します。また、run_name 引数を使って、W&B 上のトレーニング run に名前を付けることもできます。 以上です。これで、モデルはトレーニング中に損失、評価メトリクス、モデルのトポロジー、勾配を W&B にログするようになります。
python run_glue.py \     # Python スクリプトを実行
  --report_to wandb \    # W&amp;B へログすることを有効化
  --run_name bert-base-high-lr \   # W&amp;B の run 名(任意)
  # ここに他のコマンドライン引数を指定
TensorFlow を使っていますか?PyTorch の Trainer を TensorFlow の TFTrainer に置き換えるだけです。

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

Artifacts を使用すると、最大 100GB までのモデルとデータセットを無料で保存でき、さらに W&B の Registry を利用できます。Registry を使用すると、モデルを登録して確認や評価を行ったり、ステージングに向けた準備をしたり、本番環境にデプロイしたりできます。 Hugging Face のモデル チェックポイントを Artifacts にログするには、WANDB_LOG_MODEL 環境変数を次のいずれか 1 つ に設定します。
  • checkpoint: TrainingArgumentsargs.save_steps ごとにチェックポイントをアップロードします。
  • end: load_best_model_at_end も設定されている場合、トレーニング終了時にモデルをアップロードします。
  • false: モデルをアップロードしません。
WANDB_LOG_MODEL="checkpoint"
これ以降に初期化するすべての Transformers Trainer は、モデルを W&B プロジェクトにアップロードします。ログしたモデル チェックポイントは Artifacts の UI で確認でき、完全なモデル リネージが含まれます (UI でのモデル チェックポイントの例はこちらを参照してください) 。
デフォルトでは、WANDB_LOG_MODELend に設定されている場合、モデルは W&B Artifacts に model-{run_id} として保存され、WANDB_LOG_MODELcheckpoint に設定されている場合は checkpoint-{run_id} として保存されます。 ただし、TrainingArgumentsrun_name を渡すと、モデルは model-{run_name} または checkpoint-{run_name} として保存されます。

W&B Registry

チェックポイントをArtifactsにログしたら、Registry を使って最良のモデル チェックポイントを登録し、チーム全体で一元管理できます。Registry を使うと、最良のモデルをタスクごとに整理し、モデルのライフサイクルを管理し、ML ライフサイクル全体をトラッキングおよび監査し、後続のアクションを自動化できます。 モデル Artifact をリンクする方法については、Registry を参照してください。

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

トレーニング中または評価時にモデルの出力を可視化することは、モデルがどのように学習しているかを正しく理解するうえで重要になることがよくあります。 Transformers Trainer のコールバックシステムを使用すると、モデルのテキスト生成結果やその他の予測など、役立つ追加データを W&B 表 にログできます。 トレーニング中に評価出力をログし、このような W&B 表 に記録する方法の詳細なガイドについては、以下のカスタム ログする セクションを参照してください。
評価出力を含む W&B 表 を示しています

W&B Run を終了する (Notebook のみ)

トレーニングを Python スクリプト内で実行している場合、W&B run はスクリプトの終了とともに終了します。 Jupyter または Google Colab のノートブックを使用している場合は、run.finish() を呼び出して、トレーニングの完了を W&B に伝える必要があります。
run = wandb.init()
trainer.train()  # トレーニングを開始し、W&B にログする

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

run.finish()

結果を可視化する

トレーニング結果をログしたら、W&B ダッシュボード で結果をインタラクティブに確認できます。数十件のrunを一度に簡単に比較し、興味深い発見を拡大して詳しく見たり、柔軟でインタラクティブな可視化によって複雑なデータからインサイトを引き出したりできます。

高度な機能とよくある質問

最良のモデルを保存するにはどうすればよいですか

Trainerload_best_model_at_end=True を含む TrainingArguments を渡すと、W&B は最も性能の高いモデル チェックポイントを Artifacts に保存します。 モデル チェックポイントを Artifacts として保存した場合は、Registry に昇格できます。Registry では、次のことができます。
  • ML タスクごとに最良のモデル バージョンを整理する。
  • モデルを一元管理し、チームと共有する。
  • モデルを本番向けにステージングしたり、追加の評価のためにブックマークしたりする。
  • 後続の CI/CD プロセスをトリガーする。

保存したモデルを読み込むにはどうすればよいですか?

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' を設定していた場合は、TrainingArgumentsmodel_dirmodel_name_or_path 引数として使用し、Trainerresume_from_checkpoint=True を渡すことで、トレーニングを再開することもできます。
last_run_id = "xxxxxxxx"  # wandb workspace から run_id を取得する

# run_id から wandb の 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()

    # モデルと trainer を再初期化する
    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)

トレーニング中に評価サンプルをログして表示するにはどうすればよいですか

Transformers の Trainer 経由で W&B にログする処理は、Transformers ライブラリの WandbCallback が担います。Hugging Face のログすることをカスタマイズする必要がある場合は、WandbCallback をサブクラス化し、Trainer クラスの追加の method を活用する機能を加えることで、このコールバックを拡張できます。 以下に、この新しいコールバックを HF Trainer に追加する一般的なパターンを示します。さらに下には、評価出力を W&B の表にログする完全なコード例を掲載しています。
# Trainer を通常通りインスタンス化する
trainer = Trainer()

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

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

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

トレーニング中に評価サンプルを確認する

次のセクションでは、WandbCallback をカスタマイズして、トレーニング中にモデルの予測を実行し、評価サンプルを W&B の 表 にログする方法を示します。これは、Trainer の コールバック の on_evaluate method を使って、eval_steps ごとに実行します。 ここでは、トークナイザーを使用してモデル出力から予測とラベルをデコードする decode_predictions function を作成しています。 次に、予測とラベルから pandas DataFrame を作成し、DataFrame に epoch 列を追加します。 最後に、DataFrame から wandb.Table を作成し、それを wandb にログします。 また、freq エポックごとに予測をログすることで、ログする頻度を制御できます。 : 通常の WandbCallback とは異なり、このカスタム コールバック は、Trainer の初期化時ではなく、Trainer をインスタンス化したに 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 にログします。トレーニングの進行に伴い、モデルの予測を
    可視化することができます。

    Attributes:
        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 インスタンスを初期化します。

        Args:
            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

モデルの gradient、parameter、またはそのどちらもログしないかを設定します

  • false (デフォルト) : gradient や parameter はログしません
  • gradients: gradient のヒストグラムをログします
  • all: gradient と parameter のヒストグラムをログします
WANDB_DISABLEDtrue に設定すると、ログすることを完全に無効にします (デフォルトは false)
WANDB_QUIET.true に設定すると、標準出力にログされるメッセージを重大なもののみに制限します (デフォルトは false)
WANDB_SILENTtrue に設定すると、wandb が出力する内容を表示しないようにします (デフォルトは false)
WANDB_WATCH=all
WANDB_SILENT=true

wandb.init() をカスタマイズするにはどうすればよいですか?

Trainer が使用する WandbCallback は、Trainer の初期化時に内部で wandb.init() を呼び出します。代わりに、Trainer が初期化される前に wandb.init() を呼び出して、run を手動で設定することもできます。これにより、W&B の run 設定を完全に制御できます。 init に渡す内容の例を以下に示します。wandb.init() の詳細については、wandb.init() referenceを参照してください。
wandb.init(
    project="amazon_sentiment_analysis",
    name="bert-base-high-lr",
    tags=["baseline", "high-lr"],
    group="bert",
)

追加リソース

以下は、Transformers と W&B に関連するおすすめの 6 本の記事です

サポートを受ける、または機能を要望する

Hugging Face W&B インテグレーションに関する問題、質問、または機能要望がある場合は、Hugging Face フォーラムのこのスレッドにお気軽に投稿するか、Hugging Face のTransformers GitHub リポジトリで issue を登録してください。