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

ファイルの保存と復元

このガイドではまず、wandb.saveを使ってクラウドにファイルを保存する方法を紹介し、次にwandb.restoreを使って、それらをローカルに再作成する方法を紹介します。

ファイルの保存

場合によっては、数値やメディアの一部を記録するのではなく、ファイル全体を記録したいことがあります。例えば、モデルの重みや、他のログソフトウェアの出力、ソースコードなどです。

W&Bにファイルを関連付けてアップロードする方法は2つあります。

  1. wandb.save(filename) を使う。
  2. wandb runディレクトリーにファイルを置くと、runの終了時にアップロードされます。
備考

再開するrunであれば、wandb.restore(filename)を呼び出すことでファイルを復元できます。

書き込まれているファイルを同期する場合は、wandb.saveでファイル名やglobを指定できます。

wandb.saveの例

完全な動作例は、こちらのレポートをご覧ください。

# 現在のディレクトリからモデルファイルを保存する
wandb.save('model.h5')

# サブストリング "ckpt" を含むすべてのファイルを保存する
wandb.save('../logs/*ckpt*')

# "checkpoint"で始まるファイルを書き込み時に保存する
wandb.save(os.path.join(wandb.run.dir, "checkpoint*"))
備考

W&Bのローカルランディレクトリはデフォルトでスクリプトに関連する./wandbディレクトリ内にありますが、パスはrun-20171023_105053-3o4933r0のようになります。ここで20171023_105053はタイムスタンプで3o4933r0はランのIDです。WANDB_DIR環境変数を設定するか、wandb.initdirキーワード引数に絶対パスを設定することで、代わりにそのディレクトリ内にファイルが書き込まれるようになります。

保存ポリシーと相対パス

wandb.savepolicy引数も受け付け、デフォルトで"live"に設定されています。利用可能なポリシーは以下の通りです。

  • live (デフォルト) - このファイルをすぐにwandbサーバーに同期し、変更があれば再同期する
  • now - このファイルをすぐにwandbサーバーに同期し、変更があっても再同期しない
  • end - ランが終了したときにのみファイルを同期する

また、wandb.savebase_path引数を指定することもできます。これによりディレクトリ階層を維持することができます。例えば:

wandb.save(
path="./results/eval/*",
base_path="./results",
policy="now"
)

すべてのファイルがパターンに一致すると、ルートの代わりにevalフォルダに保存されます。

備考

wandb.saveが呼び出されると、指定されたパスに存在するすべてのファイルを一覧表示し、runディレクトリー(wandb.run.dir)にシンボリックリンクを作成します。wandb.saveを呼び出した後に同じパスに新しいファイルを作成する場合、それらのファイルは同期されません。ファイルは直接wandb.run.dirに書き込むか、新しいファイルが作成されるたびにwandb.saveを呼び出す必要があります。

wandbの実行ディレクトリにファイルを保存する例

ファイルmodel.h5wandb.run.dirに保存され、トレーニングの終了時にアップロードされます。

import wandb
wandb.init()

model.fit(X_train, y_train, validation_data=(X_test, y_test),
callbacks=[wandb.keras.WandbCallback()])
model.save(os.path.join(wandb.run.dir, "model.h5"))

こちらが公開されている例のページです。ファイルタブでmodel-best.h5が表示されています。これはKerasの統合によってデフォルトで自動的に保存されますが、チェックポイントを手動で保存することもでき、runに関連付けて保存します。

ライブ例を見る →

ファイルの復元

wandb.restore(filename) を呼び出すと、ローカルのrunディレクトリーにファイルが復元されます。通常、filenameは、以前の実験runで生成され、wandb.saveを使用してクラウドにアップロードされたファイルを指します。この呼び出しにより、ファイルのローカルコピーが作成され、読み取り用に開かれたローカルファイルストリームが返されます。

一般的なユースケース: 過去のrunsで生成されたモデルアーキテクチャや重みを復元する(より複雑なバージョン管理のユースケースについては、Artifactsを参照してください)。

  • エラーが発生した場合、最後のチェックポイントからトレーニングを再開する(再開のセクションを参照してください)。

wandb.restore の例

完全な動作例については、こちらのレポート をご覧ください。

# ユーザー "vanpelt" が "my-project" で実行した特定の run からモデルファイルを復元する
best_model = wandb.restore(
'model-best.h5', run_path="vanpelt/my-project/a1b2c3d")

# チェックポイントから重みファイルを復元する
# (注意:run_pathが提供されていない場合、再開が設定されている必要があります)
weights_file = wandb.restore('weights.h5')
# フレームワークがファイル名を期待している場合、
# 返されたオブジェクトの "name" 属性を使ってください。
# 例:Keras では
my_predefined_model.load_weights(weights_file.name)

run_pathを指定しない場合、run の再開を設定する必要があります。トレーニング外でファイルにプログラムでアクセスしたい場合は、Run APIを使用してください。

一般的な質問

どのようにしてファイルを無視するのか?

wandb/settings ファイルを編集して、ignore_globsglobs 形式のカンマ区切りのリストに設定することができます。また、WANDB_IGNORE_GLOBS 環境変数を設定することもできます。一般的なユースケースとしては、自動的に作成される git パッチのアップロードを防ぐために、WANDB_IGNORE_GLOBS=*.patch と設定します。

ランが終了する前にファイルを同期する方法は?

長いrunがある場合は、runの終了前に、モデルのチェックポイントなどのファイルをクラウドにアップロードしたいことがあるでしょう。デフォルトでは、ほとんどのファイルのアップロードはrunの終了まで待っています。スクリプトにwandb.save('*.pth')wandb.save('latest.pth')を追加することで、ファイルが作成されたり更新されたりするたびに上記のファイルをアップロードできます。

ファイルを保存するディレクトリを変更する

AWS S3やGoogle Cloud Storageにデフォルトでファイルを保存する場合、以下のエラーが発生することがあります:events.out.tfevents.1581193870.gpt-tpu-finetune-8jzqk-2033426287 is a cloud storage url, can't save file to wandb.

TensorBoardのイベントファイルや同期させたい他のファイルのログディレクトリを変更するには、ファイルをwandb.run.dirに保存して、クラウドに同期させるようにします。

ランの名前を取得する方法は?

スクリプト内でランの名前を使用したい場合は、wandb.run.nameを使用して、例えば "blissful-waterfall-2" のようなランの名前を取得できます。

表示名にアクセスする前に、runでsaveを呼び出す必要があります。

run = wandb.init(...)
run.save()
print(run.name)

ローカルからすべての保存されたファイルをプッシュする方法は?

wandb.initの後にスクリプトの先頭で一度wandb.save("*.pt")を呼び出すと、そのパターンに一致するすべてのファイルが、wandb.run.dirに書き込まれるとすぐに保存されます。

すでにクラウドストレージに同期されたローカルファイルを削除することはできますか?

ローカルのファイルをすでにクラウドストレージに同期した後に削除するためのコマンドwandb sync --cleanがあります。使用方法の詳細は wandb sync --helpで見ることができます。

コードの状態を復元したい場合はどうすればいいですか?

restoreコマンドを使って、特定のrunが実行された時のコードの状態に戻ります。コマンドラインツールを参照してください。

# ブランチを作成し、コードの状態を復元します
# run $RUN_IDが実行された時の状態に
wandb restore $RUN_ID

wandbはコードの状態をどのようにキャプチャしますか?

スクリプトからwandb.initが呼び出されると、コードがgitリポジトリにある場合は最後のgitコミットへのリンクが保存されます。また、未コミットの変更やリモートと同期されていない変更がある場合は、diffパッチも作成されます。

Was this page helpful?👍👎