5行でカッコいい可視化を「WandB」入門

# 🏁 目的

この記事の目的は、**WandBとは何かを知り、基本的な使い方をマスターすること**です。


この記事を参照するメリットは以下の点があります。
* WandBの基本的な使い方を押さえられる
* 普段のコードにWandBを導入できる

では早速、WandBを学んでいきましょう!


# 🤔WandBとは
WandBは**機械学習のプラットフォーム**です。

そして、正式名称はWeights & Biasesと言います。

# ✨ WandBでできること
WandBでは、以下のようなことができます。
* モデルの学習記録
* モデル・データセットのバージョン管理
* モデルの性能評価
* 可視化

可視化では、Web上で[次](https://wandb.ai/wandb/wandb_example)のようなダッシュボードを作成できます。
![スクリーンショット 2022-12-08 17.01.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/de56e19a-e183-a421-c204-938bb5d1d576.png)
とてもカッコいいですね！

# 🔧WandBのセットアップ
WandBを使うためのセットアップについて、説明していきます。

### WandBへの登録とAPIキーの取得
まずはWandBを使うために、https://wandb.ai/site で無料アカウントの登録をし、ログインしていきましょう。


次にAPIキーを[設定画面](https://wandb.ai/settings)で取得しましょう。
Danger Zone > API keys > New keyで作成できました。

:::note info
素早いAPIキーの確認
APIキーの作成後は、https://wandb.ai/authorize でもAPIキーをコピーできます。
:::
### WandBのインストール
pipで自身の環境にWandBをインストールしましょう。

:::note info
<a href="https://colab.research.google.com/github/Mochi-Moch1/wandb-introduction/blob/main/%E5%85%A5%E9%96%80Weights_%26_Biases.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>
手軽に試したい方は、Google Colabノートブックをご利用ください。

:::
ノートブックの方

```
!pip install wandb
```
コマンドラインの方
```
pip install wandb
```

### WandBへのログイン
WandBへログインしましょう。

ログインの際にはAPIキーを求められるので、先ほど作成したAPIキーを入力してください。


ノートブックの方
```
import wandb
wandb.login()
```

コマンドラインの方
```
wandb login
```



# 💻 WandBの使い方
準備が整ったので、WandBの基本的な使い方を説明します。

### 初期化
`wandb.init`で、WandBの実行を初期化し、記録を開始します。
```python
import wandb
wandb.init(project="my-project")
```
プロジェクト名(my-project)は、好きな名前にしてください。

このプロジェクト名のもとに、記録が行われていきます。

### ハイパーパラメータの保存
`wandb.config`で、保存したいハイパーパラメータを指定します。

```python
wandb.config.epochs = 10
```
後の条件の比較に役立ちます。

### 学習時の評価値を記録
`wandb.log`で、正解率や損失のような、評価値を追跡・記録させます。

記録をわかりやすくするために、仮のループと値を入力します。

```python
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()`で、実行の終了を知らせています。


これによりノートブック形式では、学習の経過記録や概要を知らせてくれます。
![スクリーンショット 2022-12-09 20.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/ce16cad3-64e0-c240-98bd-85f698124b8e.png)

WandBのダッシュボードを確認してみましょう。
これらたったの5行を追加しただけで、次のような記録ができています！
![スクリーンショット 2022-12-09 19.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/f9e099e2-bf8f-a416-9904-7a5125cae0af.png)


## 📣 通知の送信
WandBでは、メールやSlackに通知を送ることができます。

:::note info
通知のタイミング
学習が完了したときや止まってしまった時、また自身でカスタマイズして、通知を送信できます。
:::

### 設定
まず[設定画面](https://wandb.ai/settings) > Alertsで通知の設定を行います。

今回は`wandb.alert()`のEmailをオンにして、自身で通知のタイミングを指定してみましょう。
![スクリーンショット 2022-12-09 20.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/e023b9c9-86e3-3a2f-6990-6000c1e75d7d.png)

### 送信の実行
`wandb.alert()`を使って、通知の送信を行いましょう。
タイトルや本文を送ることができます。

```python
import wandb
wandb.init(project="sample-alert")

accuracy = 0.9
# 通知の送信
wandb.alert(
    title="WandBからの通知", 
    text=f"今の正解率は {accuracy} です。"
)

wandb.finish()
```
メールボックスを確認してみましょう。
以下のような通知が届いていました！
![スクリーンショット 2022-12-10 11.27.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/8b31b519-8e02-c4bb-62fd-d4a52e1c7e30.png)

:::note warn
注意
`wandb.alert()`だけの実行では、うまく動作しなかったです...。
:::

# 🎉 まとめ
最後に、これまでのコードを踏まえ、まとめて実行していきましょう。
少し書き方を変えている部分もあるので、新しい書き方として、参考にしていただければ幸いです。
```python
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によって、次のような可視化が確認できます！
![スクリーンショット 2022-12-10 14.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900476/550b555f-d205-a591-eea1-78ce71d18dfd.png)



WandBは数行加えるだけで、簡単に可視化できる便利なツールですね！
これを機に、ぜひ使ってみて下さい!


# 参考文献
* [Weights & Biases](https://docs.wandb.ai/?_gl=1*145wjwy*_ga*NzQ0MTcwNzMyLjE2NzA0MTY0Nzc.*_ga_JH1SJHJQXJ*MTY3MDQxNjQ3Ny4xLjEuMTY3MDQxNjUyMC4xNy4wLjA.)
* [Quickstart](https://docs.wandb.ai/quickstart)
* [Send Alerts with wandb.alert](https://docs.wandb.ai/guides/track/alert)
* [W&Bを使ってみる](https://qiita.com/daikiclimate/items/96bd784170582651651b)
* [Wandbの使い方まとめ](https://qiita.com/hina0002/items/7e9328229b13b3c5b3fd)

読んでいただき、ありがとうございました！