

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Neptune ML でのカスタムモデル開発
<a name="machine-learning-custom-model-development"></a>

カスタムモデルの開発を開始する良い方法は、以下を実行することです。[Neptune ML ツールキットの例](https://github.com/awslabs/neptuneml-toolkit/tree/main/examples/custom-models/introduction)に従ってトレーニングモジュールを構造化して記述します。Neptune ML ツールキットは、モジュール化されたグラフ ML モデルコンポーネントをスタックしてカスタムモデルを作成するために使用できる[モデルズー](https://github.com/awslabs/neptuneml-toolkit/tree/main/src/neptuneml_toolkit/modelzoo)に実装します。

さらに、ツールキットには、モデルトレーニングおよびモデル変換時に必要なアーティファクトを生成するのに役立つユーティリティ関数が用意されています。この Python パッケージは、カスタム実装にインポートできます。ツールキットで提供されている関数またはモジュールは、Neptune ML トレーニング環境でも使用できます。

Python モジュールに外部依存関係が追加されている場合は、モジュールのディレクトリにある `requirements.txt` ファイルを指定してこれらの追加依存関係を含めることができます。`requirements.txt` ファイルに一覧表示されているこのパッケージは、トレーニングスクリプトが実行される前にインストールされます。

少なくとも、カスタムモデルを実装する Python モジュールには、次のものが含まれている必要があります。
+ トレーニングスクリプトのエントリポイント
+ トランスフォームスクリプトのエントリポイント
+ `model-hpo-configuration.json` ファイル

## Neptune ML でのカスタムモデルトレーニングスクリプト開発
<a name="machine-learning-custom-model-training-script"></a>

カスタムモデルトレーニングスクリプトは、Neptune ML ツールキット [https://github.com/awslabs/neptuneml-toolkit/blob/main/examples/custom-models/introduction/movie-lens-rgcn/node-class/src/train.py](https://github.com/awslabs/neptuneml-toolkit/blob/main/examples/custom-models/introduction/movie-lens-rgcn/node-class/src/train.py) の例のような実行可能な Python スクリプトである必要があります。ハイパーパラメータの名前と値をコマンドライン引数として受け入れる必要があります。モデルトレーニング中、ハイパーパラメータ名は `model-hpo-configuration.json` ファイルから取得します。ハイパーパラメータの値は、ハイパーパラメータが調整可能な場合は有効なハイパーパラメータの範囲内に入るか、調整可能でない場合はデフォルトのハイパーパラメータ値を使用します。

トレーニングスクリプトは、次のような構文を使用して SageMaker AI トレーニングインスタンスで実行されます。

```
python3 (script entry point) --(1st parameter) (1st value) --(2nd parameter) (2nd value) (...)
```

すべてのタスクについて、Neptune ML AutoTrainer は、指定したハイパーパラメータに加えて、いくつかの必須パラメータをトレーニングスクリプトに送信しますが、適切に動作させるには、スクリプトがこれらの追加パラメータを処理できる必要があります。

これらの追加必須パラメータは、タスクによって多少異なります。

**ノード分類またはノードリグレッションの場合**
+ ** `task`** —Neptune ML によって内部的に使用されるタスクタイプ。ノード分類の場合、これは `node_class` であり、ノードリグレッションについては `node_regression` です。
+ **`model`** — Neptune ML によって内部的に使用されるモデル名。この場合、`custom` です。
+ **`name`** — Neptune ML によって内部的に使用されるタスクの名前。この場合、ノード分類の場合 `node_class-custom` で、ノードリグレッションの場合 `node_regression-custom` です。
+ ** `target_ntype`** — 分類またはリグレッションのノードタイプの名前。
+ ** `property`** — 分類またはリグレッションのノードプロパティの名前。

**リンク予測の場合**
+ ** `task`** —Neptune ML によって内部的に使用されるタスクタイプ。リンク予測の場合、これは `link_predict` です。
+ **`model`** — Neptune ML によって内部的に使用されるモデル名。この場合、`custom` です。
+ **`name`** — Neptune ML によって内部的に使用されるタスク名。この場合、`link_predict-custom` です。

**エッジ分類またはエッジリグレッションの場合**
+ ** `task`** —Neptune ML によって内部的に使用されるタスクタイプ。エッジ分類の場合、これは `edge_class` であり、エッジリグレッションについては `edge_regression` です。
+ **`model`** — Neptune ML によって内部的に使用されるモデル名。この場合、`custom` です。
+ **`name`** — Neptune ML によって内部的に使用されるタスクの名前。この場合、エッジ分類の場合 `edge_class-custom` で、エッジリグレッションの場合 `edge_regression-custom` です。
+ ** `target_etype`** — 分類またはリグレッションのエッジタイプの名前。
+ ** `property`** — 分類またはリグレッションのエッジプロパティの名前。

スクリプトは、モデルのパラメータと、トレーニングの終了時に必要となるその他のアーティファクトを保存する必要があります。

Neptune ML Toolkit ユーティリティ関数を使用して、処理されたグラフデータの場所、モデルパラメータを保存する場所、およびトレーニングインスタンスで使用可能な GPU デバイスを決定できます。フレームワークの使用の詳細については、これらのユーティリティ関数の使用方法の例を示す [train.py](https://github.com/awslabs/neptuneml-toolkit/blob/main/examples/custom-models/introduction/movie-lens-rgcn/node-class/src/train.py) サンプルトレーニングスクリプトを参照してください。

## Neptune ML でのカスタムモデル変換スクリプト開発
<a name="machine-learning-custom-model-transform-script"></a>

モデルの再トレーニングを行わずに進化するグラフのモデル推論のための Neptune ML [増分ワークフロー](machine-learning-overview-evolving-data-incremental.md#machine-learning-overview-incremental)を利用するには、トランスフォームスクリプトが必要です。モデルのデプロイに必要なすべてのアーティファクトがトレーニングスクリプトによって生成された場合でも、モデルを再トレーニングせずに更新されたモデルを生成する場合は、変換スクリプトを提供する必要があります。

**注記**  
[リアルタイムの帰納的推論](machine-learning-overview-evolving-data.md#inductive-vs-transductive-inference)は、現在、カスタムモデルではサポートされていません。

カスタムモデルトレーニングスクリプトは、Neptune ML ツールキット [transform.py](https://github.com/awslabs/neptuneml-toolkit/blob/main/examples/custom-models/introduction/movie-lens-rgcn/node-class/src/transform.py) の例スクリプトのような実行可能な Python スクリプトである必要があります。このスクリプトは、コマンドライン引数なしでモデルトレーニング中に呼び出されるため、スクリプトが受け入れるコマンドライン引数はデフォルトである必要があります。

このスクリプトは、次のような構文で SageMaker AI トレーニングインスタンスで実行されます。

```
python3 (your transform script entry point)
```

トランスフォームスクリプトには、次のようなさまざまな情報が必要です。
+ 処理されたグラフデータの場所。
+ モデルパラメータが保存され、新しいモデルアーティファクトが保存される場所。
+ そのインスタンスで使用可能なデバイス。
+ 最適なモデルを生成したハイパーパラメータ。

これらの入力は、スクリプトが呼び出すことができる Neptune ML ユーティリティ関数を使用して取得されます。その方法の例としてツールキットのサンプル [transform.py](https://github.com/awslabs/neptuneml-toolkit/blob/main/examples/custom-models/introduction/movie-lens-rgcn/node-class/src/transform.py) スクリプトを参照してください。

スクリプトは、ノード埋め込み、ノード ID マッピング、および各タスクのモデル展開に必要なその他のアーティファクトを保存する必要があります。さまざまな Neptune ML タスクに必要なモデルアーティファクトの詳細については、[モデルアーティファクトのドキュメント](machine-learning-model-artifacts.md)を参照してください。

## Neptune MLのカスタム `model-hpo-configuration.json` ファイル
<a name="machine-learning-custom-model-hpo-configuration-file"></a>

`model-hpo-configuration.json` ファイルは、カスタムモデルのハイパーパラメータを定義します。それは Neptune ML 組み込みモデルで使用される `model-hpo-configuration.json` ファイルと同じ[フォーマット](machine-learning-customizing-hyperparams.md)で、Neptune ML によって自動生成され、処理されたデータの場所にアップロードされるバージョンよりも優先されます。

新しいハイパーパラメータをモデルに追加するときは、ハイパーパラメータがトレーニングスクリプトに渡されるように、このファイルにハイパーパラメータのエントリを追加する必要があります。

ハイパーパラメータを調整できるようにするには、ハイパーパラメータの範囲を指定し、`tier-1`、`tier-2` または `tier-3` param に設定します。ハイパーパラメータは、構成されたトレーニングジョブの総数で、階層内のハイパーパラメータの調整ができる場合に調整されます。調整不可能なパラメータの場合は、デフォルト値を指定し、ハイパーパラメータをファイルの `fixed-param` セクションに追加します。その方法の例についてはツールキットのサンプル[サンプル `model-hpo-configuration.json` ファイル](https://github.com/awslabs/neptuneml-toolkit/blob/main/examples/custom-models/introduction/movie-lens-rgcn/node-class/src/model-hpo-configuration.json)を参照してください。

また、SageMaker AI ハイパーパラメータ最適化ジョブがトレーニングした候補モデルの評価に使用するメトリクス定義も指定する必要があります。これを行うには、次のように `eval_metric` JSON オブジェクトを `model-hpo-configuration.json` ファイルに追加します。

```
"eval_metric": {
  "tuning_objective": {
      "MetricName": "(metric_name)",
      "Type": "Maximize"
  },
  "metric_definitions": [
    {
      "Name": "(metric_name)",
      "Regex": "(metric regular expression)"
    }
  ]
},
```

`eval_metric` オブジェクトの `metric_definitions` 配列は、SageMaker AI がトレーニングインスタンスから抽出する各指標のメトリクス定義オブジェクトを一覧表示します。各メトリクス定義オブジェクトには、メトリクスの名前 (「精度」、「f1」など) を指定できる `Name` キーがあります。`Regex` キーを使用すると、特定のメトリックがトレーニングログに出力される方法に一致する正規表現文字列を指定できます。メトリクスの定義方法の詳細については、[SageMaker AI ハイパーパラメータチューニングのページ](https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning-define-metrics.html)を参照してください。

`eval_metric` の `tuning_objective` オブジェクトでは、`metric_definitions` のどのメトリクスをハイパーパラメータ最適化の目標指標として機能する評価メトリクスとして使用するかを指定できます。`MetricName` の値は、`metric_definitions` の定義の 1 つである `Name` の値と一致する必要があります。メトリクスが greater-is-better (「精度」など) または less-is-better (「平均二乗誤差」など) のどちらで解釈されるべきかに応じて、`Type` の値は「最大化」または「最小化」のいずれかになります。

`model-hpo-configuration.json` ファイルのこのセクションのエラーは、SageMaker AI ハイパーパラメータチューニングジョブが最適なモデルを選択できないため、Neptune ML モデルトレーニング API ジョブが失敗する可能性があります。

## Neptune ML でのカスタムモデル実装のローカルテスト
<a name="machine-learning-custom-model-testing"></a>

Neptune ML ツールキット Conda 環境を使用して、モデルをテストおよび検証するために、コードをローカルで実行できます。Neptune ノートブックインスタンスで開発している場合、この Conda 環境は Neptune Notebook インスタンスにプレインストールされます。別のインスタンスで開発する場合は、Neptune ML ツールキットの[ローカルセットアップ手順](https://github.com/awslabs/neptuneml-toolkit#local-installation)に入っています。

Conda 環境は、[モデルトレーニング API](machine-learning-api-modeltraining.md) を呼び出す際にモデルが実行する環境を正確に再現します。トレーニングスクリプトと変換スクリプトの例はすべて、簡単にデバッグできるように、ローカル環境でスクリプトを実行するコマンドライン `--local` フラグを渡すことができます。これは、モデルの実装を対話的かつ反復的にテストできるので、独自のモデルを開発する際には良い方法です。Neptune ML プロダクショントレーニング環境でのモデルトレーニング中は、このパラメータは省略されます。