🏁 目的
この記事の目的は、WandBとは何かを知り、基本的な使い方をマスターすることです。
この記事を参照するメリットは以下の点があります。
- WandBの基本的な使い方を押さえられる
- 普段のコードにWandBを導入できる
では早速、WandBを学んでいきましょう!
🤔WandBとは
WandBは機械学習のプラットフォームです。
そして、正式名称はWeights & Biasesと言います。
✨ WandBでできること
WandBでは、以下のようなことができます。
- モデルの学習記録
- モデル・データセットのバージョン管理
- モデルの性能評価
- 可視化
可視化では、Web上で次のようなダッシュボードを作成できます。
とてもカッコいいですね!
🔧WandBのセットアップ
WandBを使うためのセットアップについて、説明していきます。
WandBへの登録とAPIキーの取得
まずはWandBを使うために、https://wandb.ai/site で無料アカウントの登録をし、ログインしていきましょう。
次にAPIキーを設定画面で取得しましょう。
Danger Zone > API keys > New keyで作成できました。
素早いAPIキーの確認
APIキーの作成後は、https://wandb.ai/authorize でもAPIキーをコピーできます。
WandBのインストール
pipで自身の環境にWandBをインストールしましょう。
ノートブックの方
!pip install wandb
コマンドラインの方
pip install wandb
WandBへのログイン
WandBへログインしましょう。
ログインの際にはAPIキーを求められるので、先ほど作成したAPIキーを入力してください。
ノートブックの方
import wandb
wandb.login()
コマンドラインの方
wandb login
💻 WandBの使い方
準備が整ったので、WandBの基本的な使い方を説明します。
初期化
wandb.init
で、WandBの実行を初期化し、記録を開始します。
import wandb
wandb.init(project="my-project")
プロジェクト名(my-project)は、好きな名前にしてください。
このプロジェクト名のもとに、記録が行われていきます。
ハイパーパラメータの保存
wandb.config
で、保存したいハイパーパラメータを指定します。
wandb.config.epochs = 10
後の条件の比較に役立ちます。
学習時の評価値を記録
wandb.log
で、正解率や損失のような、評価値を追跡・記録させます。
記録をわかりやすくするために、仮のループと値を入力します。
import random
offset = random.random() / 5
for epoch in range(2, wandb.config.epochs): # 保存したハイパーパラメータを使用
accuracy = 1 - 2 ** -epoch - random.random() / epoch + offset
loss = 2 ** -epoch + random.random() / epoch - offset
# WandBへの記録
wandb.log({"accuracy": accuracy, "loss": loss})
# WandBへ実行の終了を知らせる
wandb.finish()
また、wandb.finish()
で、実行の終了を知らせています。
これによりノートブック形式では、学習の経過記録や概要を知らせてくれます。
WandBのダッシュボードを確認してみましょう。
これらたったの5行を追加しただけで、次のような記録ができています!
📣 通知の送信
WandBでは、メールやSlackに通知を送ることができます。
通知のタイミング
学習が完了したときや止まってしまった時、また自身でカスタマイズして、通知を送信できます。
設定
まず設定画面 > Alertsで通知の設定を行います。
今回はwandb.alert()
のEmailをオンにして、自身で通知のタイミングを指定してみましょう。
送信の実行
wandb.alert()
を使って、通知の送信を行いましょう。
タイトルや本文を送ることができます。
import wandb
wandb.init(project="sample-alert")
accuracy = 0.9
# 通知の送信
wandb.alert(
title="WandBからの通知",
text=f"今の正解率は {accuracy} です。"
)
wandb.finish()
メールボックスを確認してみましょう。
以下のような通知が届いていました!
注意
wandb.alert()
だけの実行では、うまく動作しなかったです...。
🎉 まとめ
最後に、これまでのコードを踏まえ、まとめて実行していきましょう。
少し書き方を変えている部分もあるので、新しい書き方として、参考にしていただければ幸いです。
import wandb
import random
total_runs = 5
# 5回実行する
for run in range(total_runs):
# 初期化
wandb.init(
# プロジェクト名を設定
project="total-project",
# 実行名をつける(これまでのように、指定しない場合は、自動で作成してくれます)
name=f"run_{run}",
# ハイパーパラメータ等の情報を保存
config={
"learning_rate": 0.02,
"architecture": "CNN",
"dataset": "CIFAR-100",
"epochs": 10,
})
# 学習ループ
epochs = 10
offset = random.random() / 5
for epoch in range(2, epochs):
accuracy = 1 - 2 ** -epoch - random.random() / epoch - offset
loss = 2 ** -epoch + random.random() / epoch + offset
# 評価値の記録
wandb.log({"accuracy": accuracy, "loss": loss})
# 通知の送信
if run >= 4:
wandb.alert(
title='学習が完了しました。',
text=f'5回目の正解率は {accuracy} でした。',
)
# 実行の終了を伝える
wandb.finish()
WandBは数行加えるだけで、簡単に可視化できる便利なツールですね!
これを機に、ぜひ使ってみて下さい!
参考文献
読んでいただき、ありがとうございました!