> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-sdk-testing-latest.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# チュートリアル: PyTorch モデルをトレーニングする

> このステップバイステップのチュートリアルでは、Serverless Sandbox 環境で PyTorch モデルをトレーニングする方法を学びます。

<Warning>
  Serverless Sandboxes は公開プレビューです。
</Warning>

このチュートリアルでは、Serverless Sandbox 環境で PyTorch モデルをトレーニングします。そのために、適切な環境変数を指定してサンドボックスを起動し、必要な依存関係をインストールして、Python スクリプトを実行します。このスクリプトは、UCI Zoo データセットを使ってニューラルネットワークをトレーニングします。

このチュートリアルを完了すると、トレーニング済みの PyTorch モデルファイルがローカルに保存されます。これにより、ローカルのインフラストラクチャーを構成しなくても、Serverless Sandbox を使用して分離された ML トレーニング ワークロードを実行する方法を確認できます。このチュートリアルは、再現可能なトレーニング ジョブ向けに Serverless Sandboxes を評価したい ML 実務者や開発者を対象としています。

<div id="prerequisites">
  ## 前提条件
</div>

始める前に、以下のセットアップ手順を完了してください。

<div id="install-the-wb-python-sdk">
  ### W\&B Python SDK をインストール
</div>

W\&B Python SDK は、後で Serverless Sandbox を作成して操作する際に使用する `Sandbox` インターフェースを提供します。`pip` を使用してインストールします:

```bash theme={null}
pip install wandb
```

<div id="log-in-and-authenticate-with-wb">
  ### W\&B にログインして認証する
</div>

W\&B Serverless Sandboxes はお使いの W\&B アカウントで実行されるため、作成する前に認証する必要があります。`wandb login` CLI コマンドを実行し、表示される案内に従ってログインします。

```bash theme={null}
wandb login
```

W\&B が認証情報をどのように検索するかについて詳しくは、[`wandb login`](/ja/models/ref/cli/wandb-login) のリファレンスドキュメントを参照してください。

<div id="copy-the-training-script-and-dependencies">
  ## トレーニングスクリプトと依存関係をコピーする
</div>

このチュートリアルに必要な 3 つのファイル (requirements ファイル、ハイパーパラメーター ファイル、トレーニングスクリプト) を用意します。次のドロップダウンを展開し、各コードサンプルをこのチュートリアルと同じディレクトリ内の別々のファイルにコピーしてください。

次のセクションでは、これらのファイルを読み込んで、W\&B Serverless Sandbox で PyTorch モデルをトレーニングするスクリプトを実行します。

<Accordion title="PyTorch トレーニングモデルスクリプト">
  以下のコードを `requirements.txt` という名前のファイルにコピー＆ペーストしてください。このファイルには、トレーニングスクリプトに必要な依存関係が含まれています。

  ```txt title="requirements.txt" theme={null}
  torch
  pandas
  ucimlrepo
  scikit-learn
  pyyaml
  ```

  以下のコードを `hyperparameters.yaml` という名前の YAML ファイルにコピー＆ペーストしてください。このファイルには、トレーニングスクリプトのハイパーパラメーターが含まれています。

  ```yaml title="hyperparameters.yaml" theme={null}
  learning_rate: 0.1
  epochs: 1000
  model_type: Multivariate_neural_network_classifier
  ```

  以下のコードを `train.py` という名前のファイルにコピー＆ペーストしてください。このスクリプトは、UCI Zoo データセットで PyTorch モデルをトレーニングし、トレーニング済みのモデルを `zoo_wandb.pth` という名前のファイルに保存します。

  ```python title="train.py" theme={null}
  import argparse
  import torch
  from torch import nn
  import yaml
  import pandas as pd
  from ucimlrepo import fetch_ucirepo

  from sklearn.model_selection import train_test_split

  class NeuralNetwork(nn.Module):
      def __init__(self):
          super().__init__()
          self.linear_stack = nn.Sequential(
              nn.Linear(in_features=16 , out_features=16),
              nn.Sigmoid(),
              nn.Linear(in_features=16, out_features=7)
          )

      def forward(self, x):
          logits = self.linear_stack(x)
          return logits

  def main(args):
      # 指定された設定ファイルからハイパーパラメーターを読み込む
      with open(args.config, 'r') as f:
          hyperparameter_config = yaml.safe_load(f)

      # データセットを取得
      zoo = fetch_ucirepo(id=111)

      # データ（pandas dataframe として）
      X = zoo.data.features
      y = zoo.data.targets

      print("features: ", X.shape, "type: ", type(X))
      print("labels: ", y.shape, "type: ", type(y))

      ## データを処理
      # データの型はモデルのデータ型と一致している必要があります。nn.Linear のデフォルトの dtype は torch.float32 です
      dataset = torch.tensor(X.values).type(torch.float32)

      # tensor に変換し、インデックスで扱えるようにラベルを 0～6 に変換する
      labels = torch.tensor(y.values)  - 1

      print("dataset: ", dataset.shape, "dtype: ",dataset.dtype)
      print("labels: ", labels.shape, "dtype: ",labels.dtype)

      torch.save(dataset, "zoo_dataset.pt")
      torch.save(labels, "zoo_labels.pt")

      # 後で参照できるようにし、再現性を確保するために、トレーニング用データセットの分割方法を記述する
      config = {
          "random_state" : 42,
          "test_size" : 0.25,
          "shuffle" : True
      }

      # データセットをトレーニング用とテスト用に分割
      X_train, X_test, y_train, y_test = train_test_split(
          dataset,labels,
          random_state=config["random_state"],
          test_size=config["test_size"],
          shuffle=config["shuffle"]
      )

      # ファイルをローカルに保存
      torch.save(X_train, "zoo_dataset_X_train.pt")
      torch.save(y_train, "zoo_labels_y_train.pt")

      torch.save(X_test, "zoo_dataset_X_test.pt")
      torch.save(y_test, "zoo_labels_y_test.pt")


      ## モデルを定義
      model = NeuralNetwork()
      loss_fn = nn.CrossEntropyLoss()
      optimizer = torch.optim.SGD(model.parameters(), lr=hyperparameter_config["learning_rate"])
      print(model)

      # トレーニングループ内で比較するため、初期のダミー損失値を設定
      prev_best_loss = 1e10

      # トレーニングループ
      for e in range(hyperparameter_config["epochs"] + 1):
          pred = model(X_train)
          loss = loss_fn(pred, y_train.squeeze(1))

          loss.backward()
          optimizer.step()
          optimizer.zero_grad()

          # 損失が改善した場合はモデルをチェックポイントとして保存
          if (e % 100 == 0) and (loss <= prev_best_loss):
              print("epoch: ", e, "loss:", loss.item())

              # 新しい最良の損失を保存
              prev_best_loss = loss

      print("Saving model...")
      PATH = 'zoo_wandb.pth'
      torch.save(model.state_dict(), PATH)

  if __name__ == "__main__":
      parser = argparse.ArgumentParser(description="Train a simple neural network on the zoo dataset.")
      parser.add_argument("--config", type=str, required=True, help="Path to the hyperparameter configuration file.")
      args = parser.parse_args()
      main(args)
  ```
</Accordion>

<div id="create-the-sandbox-and-run-the-training-script">
  ## サンドボックスを作成してトレーニングスクリプトを実行する
</div>

トレーニングファイルの準備ができたら、1 つの Python スクリプトから W\&B Serverless Sandbox を作成して管理します。次のコードスニペットでは、サンドボックスを作成し、その中にトレーニングスクリプトと依存関係をコピーし、トレーニングスクリプトを実行して、生成されたモデルファイルをダウンロードする方法を示します。次のセクションでは、このコードを1行ずつ説明します。

次のコードを Python ファイルにコピー＆ペーストして実行してください。前の手順で作成した `train.py`、`requirements.txt`、`hyperparameters.yaml` と同じディレクトリに保存してください。

```python Show lines title="train_in_sandbox.py" theme={null}
from pathlib import Path
from wandb.sandbox import Sandbox, NetworkOptions

# サンドボックスにマウントするファイル。サンドボックス内のパスと
# 各ファイルの内容をバイト列として辞書形式で指定する
mounted_files = [
    {"mount_path": "train.py", "file_content": Path("train.py").read_bytes()},
    {"mount_path": "requirements.txt", "file_content": Path("requirements.txt").read_bytes()},
        ] 

print("Starting sandbox...")
with Sandbox.run(
    mounted_files=mounted_files,
    container_image="python:3.13",
    network=NetworkOptions(egress_mode="internet"),
    max_lifetime_seconds=3600
) as sandbox:
    sandbox.write_file("hyperparameters.yaml", Path("hyperparameters.yaml").read_bytes()).result()

    # 依存関係をインストールする
    print("Installing dependencies...")
    sandbox.exec(["pip", "install", "-r", "requirements.txt"], check=True).result()

    # スクリプトを実行する
    print("Running script...")
    result = sandbox.exec(["python", "train.py", "--config", "hyperparameters.yaml"]).result()
    print(result.stdout)
    print(result.stderr)
    print(f"Exit code: {result.returncode}")

    # 生成されたモデルファイルをローカルに保存する
    print("Downloading zoo_wandb.pth...")
    model_data = sandbox.read_file("zoo_wandb.pth").result()
    Path("zoo_wandb.pth").write_bytes(model_data)
    print("Saved zoo_wandb.pth")
```

前のコードスニペットでは、次の処理を行います。

1. (6〜9行目) サンドボックスにマウントするファイル (`train.py` と `requirements.txt`) を指定します。
2. (12行目) サンドボックスを起動します。サンドボックスは、`python:3.13` コンテナーイメージを使用し、インターネットアクセスを有効にし、最大有効期間を 3600 秒 (1 時間) に設定しています。
3. (18行目) `hyperparameters.yaml` ファイルをサンドボックスに書き込みます。これにより、トレーニングスクリプト (`train.py`) の実行時にハイパーパラメーターへアクセスできるようになります。
4. (22行目) 依存関係をインストールします。サンドボックス内で `pip install -r requirements.txt` コマンドが実行され、トレーニングスクリプトに必要な依存関係がインストールされます。
5. (26行目) トレーニングスクリプトを実行します。サンドボックス内で `python train.py --config hyperparameters.yaml` コマンドが実行され、トレーニングが開始されます。このスクリプトは UCI Zoo データセットで PyTorch モデルをトレーニングし、トレーニング済みのモデルを `zoo_wandb.pth` という名前のファイルに保存します。
6. (27〜29行目) 出力と終了コードを表示します。トレーニングスクリプトの実行完了後、デバッグと検証のために、標準出力、標準エラー出力、終了コードがコンソールに表示されます。
7. (33〜34行目) 生成されたモデルファイルをダウンロードします。`read_file()` メソッドでサンドボックスから `zoo_wandb.pth` を読み取り、スクリプトがそれをローカルに保存します。

スクリプトの実行が完了すると、作業ディレクトリに `zoo_wandb.pth` として保存されたトレーニング済みの PyTorch モデルが作成されます。それを生成したサンドボックスは、必要に応じて作成、使用、破棄されます。
