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

W&Bをコードに追加する

Weights & Biases Python SDKをスクリプトやJupyter Notebookに追加する方法は数多くあります。以下に、W&B Python SDKを自分のコードに統合する「ベストプラクティス」の例を紹介します。

元のトレーニングスクリプト

たとえば、Jupyter NotebookのセルやPythonスクリプトに以下のようなコードがあるとします。mainという関数を定義して、典型的なトレーニングループを模倣しています。各エポックでは、トレーニングデータと検証データセットに対する精度と損失が計算されます。この例では、値はランダムに生成されています。

configという辞書を定義し、ハイパーパラメーターの値を格納しています(15行目)。セルの最後でmain関数を呼び出して、モックトレーニングコードを実行しています。

#train.py
import random
import numpy as np

def train_one_epoch(epoch, lr, bs):
acc = 0.25 + ((epoch/30) + (random.random()/10))
loss = 0.2 + (1 - ((epoch-1)/10 + random.random()/5))
return acc, loss

def evaluate_one_epoch(epoch):
acc = 0.1 + ((epoch/20) + (random.random()/10))
loss = 0.25 + (1 - ((epoch-1)/10 + random.random()/6))
return acc, loss

config = {
'lr' : 0.0001,
'bs' : 16,
'epochs': 5
}

def main():
# `wandb.config`から値を定義することに注意してください。
# ハードな値を定義する代わりに
lr = config['lr']
bs = config['bs']
epochs = config['epochs']

for epoch in np.arange(1, epochs):
train_acc, train_loss = train_one_epoch(epoch, lr, bs)
val_acc, val_loss = evaluate_one_epoch(epoch)

print('epoch: ', epoch)
print('training accuracy:', train_acc,'training loss:', train_loss)
print('validation accuracy:', val_acc,'training loss:', val_loss)

# main関数を呼び出します。
main()

W&B Python SDKを使ったトレーニングスクリプト

次のコード例は、W&B Python SDKをコードに追加する方法を示しています。CLIでW&Bスイープジョブを開始する場合は、CLIタブを参照してください。JupyterノートブックやPythonスクリプト内でW&Bスイープジョブを開始する場合は、Python SDKタブを参照してください。

W&Bスイープを作成するために、コード例に以下の内容を追加しました:
  1. 1行目: Wights & Biases Python SDKをインポートします。
  2. 6行目: キーと値のペアでスイープ構成を定義するディクショナリオブジェクトを作成します。先の例では、バッチサイズ(batch_size)、エポック(epochs)、学習率(lr)のハイパーパラメータが各スイープで変化します。スイープ構成を作成する方法については、スイープ構成の定義を参照してください。
  3. 19行目: スイープ構成のディクショナリをwandb.sweepに渡します。これにより、スイープが初期化されます。これにより、スイープID(sweep_id)が返されます。スイープの初期化方法については、スイープの初期化を参照してください。
  4. 33行目: wandb.init() APIを使用して、データの同期とログを行うバックグラウンドプロセスを生成します。W&B Runとしてデータを同期・ログするためです。
  5. 37-39行目: (オプション)wandb.configからの値を、ハードコーディングされた値を定義する代わりに使用します。
  6. 45行目: wandb.logを使用して、最適化したい指標をログに記録します。設定で定義された指標を記録する必要があります。設定ディクショナリ(この例ではsweep_configuration)で、val_acc値を最大化するようにスイープを定義しました。
  7. 54行目: wandb.agent API呼び出しでスイープを開始します。スイープID(19行目)、スイープが実行する関数の名前(function=main)、試行する最大ラン数を4(count=4)に設定します。W&Bスイープの開始方法については、スイープエージェントの開始を参照してください。
import wandb
import numpy as np
import random

# スイープ構成を定義
sweep_configuration = {
'method': 'random',
'name': 'sweep',
'metric': {'goal': 'maximize', 'name': 'val_acc'},
'parameters':
{
'batch_size': {'values': [16, 32, 64]},
'epochs': {'values': [5, 10, 15]},
'lr': {'max': 0.1, 'min': 0.0001}
}
}```
# スイープを初期化する際に設定を渡します。
# (オプション)プロジェクト名を指定することができます。
sweep_id = wandb.sweep(
sweep=sweep_configuration,
project='my-first-sweep'
)

# `wandb.config`からハイパーパラメーターの値を取得し、それを使用して
# モデルをトレーニングし、メトリックを返すトレーニング関数を定義します。
def train_one_epoch(epoch, lr, bs):
acc = 0.25 + ((epoch/30) + (random.random()/10))
loss = 0.2 + (1 - ((epoch-1)/10 + random.random()/5))
return acc, loss

def evaluate_one_epoch(epoch):
acc = 0.1 + ((epoch/20) + (random.random()/10))
loss = 0.25 + (1 - ((epoch-1)/10 + random.random()/6))
return acc, loss

def main():
run = wandb.init()

# `wandb.config`から値を定義することに注意してください。
# 固定値を定義する代わりに
lr = wandb.config.lr
bs = wandb.config.batch_size
epochs = wandb.config.epochs

for epoch in np.arange(1, epochs):
train_acc, train_loss = train_one_epoch(epoch, lr, bs)
val_acc, val_loss = evaluate_one_epoch(epoch)
wandb.log({
'epoch': エポック,
'train_acc': train_acc,
'train_loss': train_loss,
'val_acc': val_acc,
'val_loss': val_loss
})

# スイープジョブを開始する。
wandb.agent(sweep_id, function=main, count=4)
Was this page helpful?👍👎