

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

# チュートリアル
<a name="tutorials"></a>

Deep Learning AMI with Conda のソフトウェアの使用方法のチュートリアルを以下に示します。

**Topics**
+ [

# フレームワークのアクティブ化
](activating.md)
+ [

# Elastic Fabric Adapter を使用した分散トレーニング
](tutorial-efa.md)
+ [

# GPU のモニタリングおよび最適化
](tutorial-gpu.md)
+ [

# DLAMI を使用した AWS Inferentia チップ
](tutorial-inferentia.md)
+ [

# ARM64 DLAMI
](tutorial-arm64.md)
+ [

# 推測
](tutorial-inference.md)
+ [

# モデル提供
](model-serving.md)

# フレームワークのアクティブ化
<a name="activating"></a>

以下に示しているのは、Deep Learning AMI with Conda にインストールされている深層学習フレームワークです。フレームワークをクリックすると、そのフレームワークをアクティブ化する方法を参照できます。

**Topics**
+ [

# PyTorch
](tutorial-pytorch.md)
+ [

# TensorFlow 2
](tutorial-tensorflow-2.md)

# PyTorch
<a name="tutorial-pytorch"></a>

## PyTorch の有効化
<a name="tutorial-pytorch-overview"></a>

フレームワークの安定版 Conda パッケージがリリースされると、DLAMI でテストされ事前にインストールされます。テストされていない最新のナイトリービルドを実行する場合は、手動で「[PyTorch のナイトリービルド (実験段階) をインストールする](#tutorial-pytorch-install)」ことができます。

現在インストールされているフレームワークをアクティブ化するには、使用する Deep Learning AMI with Conda に関する以下の手順に従います。

Python 3 ベースの PyTorch を CUDA と MKL-DNN で使用する場合は、以下のコマンドを実行します。

```
$ source activate pytorch_p310
```

iPython ターミナルを起動します。

```
(pytorch_p310)$ ipython
```

クイック PyTorch プログラムを実行します。

```
import torch
x = torch.rand(5, 3)
print(x)
print(x.size())
y = torch.rand(5, 3)
print(torch.add(x, y))
```

最初のランダムな配列が出力された後、そのサイズが出力され、次に別のランダムな配列が追加で出力されます。

## PyTorch のナイトリービルド (実験段階) をインストールする
<a name="tutorial-pytorch-install"></a>

**ナイトリービルドから PyTorch をインストールする方法**

最新の PyTorch ビルドを Deep Learning AMI with Conda の PyTorch Conda 環境のいずれかまたは両方にインストールできます。

1. 
   + (Python 3 用オプション) - Python 3 PyTorch 環境を有効化します。

     ```
     $ source activate pytorch_p310
     ```

1. 残りの手順は、`pytorch_p310` 環境を使用していることを前提としています。現在インストールされている PyTorch を削除します。

   ```
   (pytorch_p310)$ pip uninstall torch
   ```

1. 
   + (GPU インスタンス用オプション) - PyTorch と CUDA.0 の最新ナイトリービルドをインストールします:

     ```
     (pytorch_p310)$ pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cu100/torch_nightly.html
     ```
   + (CPU インスタンス用オプション) - GPU を持たないインスタンスの場合は PyTorch の最新ナイトリービルドをインストールします:

     ```
     (pytorch_p310)$ pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html
     ```

1. 最新のナイトリービルドが正常にインストールされたことを確認するには、IPython ターミナルを起動して PyTorch のバージョンを確認します。

   ```
   (pytorch_p310)$ ipython
   ```

   ```
   import torch
   print (torch.__version__)
   ```

   出力は `1.0.0.dev20180922` のように表示されます。

1. PyTorch ナイトリービルドが MNIST のサンプルで正常に機能することを確認するには、PyTorch のサンプルリポジトリからテストスクリプトを実行します。

   ```
   (pytorch_p310)$ cd ~
   (pytorch_p310)$ git clone https://github.com/pytorch/examples.git pytorch_examples
   (pytorch_p310)$ cd pytorch_examples/mnist
   (pytorch_p310)$ python main.py || exit 1
   ```

## 他のチュートリアル
<a name="tutorial-pytorch-more"></a>

他のチュートリアルおよび例については、フレームワークの公式ドキュメントである [PyTorch ドキュメント](http://pytorch.org/docs/master/)と [PyTorch](http://pytorch.org) のウェブサイトを参照してください。

# TensorFlow 2
<a name="tutorial-tensorflow-2"></a>

このチュートリアルでは、Deep Learning AMI with Conda (DLAMI on Conda) を実行しているインスタンスで TensorFlow 2 を有効化し、TensorFlow 2 プログラムを実行する方法を示します。

フレームワークの安定版 Conda パッケージがリリースされると、DLAMI でテストされ事前にインストールされます。

## TensorFlow 2 のアクティブ化
<a name="tutorial-tensorflow-2-overview"></a>

**Conda の DLAMI 上で TensorFlow を実行するには**

1. TensorFlow 2 を有効化するには、DLAMI with Conda の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを開きます。

1. Python 3 ベースの TensorFlow 2 および Keras 2 を CUDA 10.1 および MKL-DNN で使用する場合は、以下のコマンドを実行します。

   ```
   $ source activate tensorflow2_p310
   ```

1. iPython ターミナルを起動します。

   ```
   (tensorflow2_p310)$ ipython
   ```

1. TensorFlow 2 プログラムを実行して、正常に作動していることを確認します。

   ```
   import tensorflow as tf
   hello = tf.constant('Hello, TensorFlow!')
   tf.print(hello)
   ```

   `Hello, TensorFlow!` が画面に表示される必要があります。

## 他のチュートリアル
<a name="tutorial-tensorflow-2-more"></a>

その他のチュートリアルや例については、[TensorFlow Python API](https://www.tensorflow.org/api_docs/python/) の TensorFlow ドキュメントを参照するか、[TensorFlow](https://www.tensorflow.org) ウェブサイトを参照してください。

# Elastic Fabric Adapter を使用した分散トレーニング
<a name="tutorial-efa"></a>

[Elastic Fabric Adapter](https://aws.amazon.com/hpc/efa/) (EFA) は、ハイパフォーマンスコンピューティング (HPC) アプリケーションを高速化するために DLAMI インスタンスにアタッチできるネットワークデバイスです。EFA を使用すると、 AWS クラウドが提供するスケーラビリティ、柔軟性、伸縮性で、オンプレミス HPC クラスターのアプリケーションパフォーマンスを実現できます。

以下のトピックでは、EFA と DLAMI の使用を開始する方法について説明します。

**注記**  
この [Base GPU DLAMI リスト](appendix-ami-release-notes.md#appendix-ami-release-notes-base)からお使いの DLAMI を選択してください。

**Topics**
+ [

# EFA を使用した AWS Deep Learning AMIs インスタンスの起動
](tutorial-efa-launching.md)
+ [

# DLAMI での EFA の使用
](tutorial-efa-using.md)

# EFA を使用した AWS Deep Learning AMIs インスタンスの起動
<a name="tutorial-efa-launching"></a>

最新版 Base DLAMI は EFA と共に使用する準備ができており、GPU インスタンス用の必要なドライバー、カーネルモジュール、Libfabric、OpenMPI および [NCCL OFI プラグイン](https://github.com/aws/aws-ofi-nccl/tree/aws)が付属しています。

サポートされている Base DLAMI の CUDA バージョンは、[リリースノート](appendix-ami-release-notes.md#appendix-ami-release-notes-base)で確認できます。

注記:
+ EFA 上の `mpirun` を使用して NCCL アプリケーションを実行する際、EFA がサポートされているインストレーションへの完全なパスを以下のように指定する必要があります。

  ```
  /opt/amazon/openmpi/bin/mpirun <command>  
  ```
+ アプリケーションで EFA を使用するには、[DLAMI での EFA の使用](tutorial-efa-using.md) に示すように、`mpirun` コマンドに `FI_PROVIDER="efa"` を追加します。

**Topics**
+ [

## EFA 対応のセキュリティグループを準備する
](#tutorial-efa-security-group)
+ [

## インスタンスの起動
](#tutorial-efa-launch)
+ [

## EFA 添付ファイルの確認
](#tutorial-efa-verify-attachment)

## EFA 対応のセキュリティグループを準備する
<a name="tutorial-efa-security-group"></a>

EFA には、セキュリティグループ自体とのインバウンドおよびアウトバウンドのトラフィックをすべて許可するセキュリティグループが必要です。詳細については、「[EFA のドキュメント](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)」を参照してください。

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで [**セキュリティグループ**] を選択して、[**セキュリティグループの作成**] を選択します。

1. [**セキュリティグループの作成**] ウィンドウで、以下を行います。
   + [**セキュリティグループ名**] に、`EFA-enabled security group` のような、分かりやすいセキュリティグループ名を入力してください。
   + (オプション) [**説明**] に、セキュリティグループの簡単な説明を入力してください。
   + [**VPC**] で、EFA 対応のインスタンスを起動する VPC を選択します。
   + **[作成]** を選択します。

1. 作成したセキュリティグループを選択し、[**説明**] タブで [**グループ ID**] をコピーします。

1. **[Inbound]** (インバウンド) タブおよび **[Outbound]** (アウトバウンド) タブで、次の手順を実行します。
   + **[編集]** を選択します。
   + [**Type**] で、[**All traffic**] を選択します。
   + **[ソース]** で **[カスタム]** を選択します。
   + コピーしたセキュリティグループ ID をフィールドに貼り付けます。
   + **[保存]** を選択します。

1. 「[Linux インスタンスのインバウンドトラフィックの承認](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html)」を参照するインバウンドトラフィックを有効にします。このステップを抜かすと、DLAMI インスタンスと通信できなくなります。

## インスタンスの起動
<a name="tutorial-efa-launch"></a>

の EFA AWS Deep Learning AMIs は現在、次のインスタンスタイプとオペレーティングシステムでサポートされています。
+  P3dn: Amazon Linux 2、Ubuntu 20.04
+  P4d、P4de: Amazon Linux 2、Amazon Linux 2023、Ubuntu 20.04、Ubuntu 22.04
+  P5、P5e、P5en: Amazon Linux 2、Amazon Linux 2023、Ubuntu 20.04、Ubuntu 22.04

以下のセクションでは、EFA 対応の DLAMI インスタンスを起動する方法について説明します。EFA 対応のインスタンスの起動の詳細については、[クラスタープレイスメントグループで EFA 対応のインスタンスを起動する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-instances)を参照してください。

1. Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)) を開きます。

1. [**インスタンスの作成**] を選択してください。

1. **AMI を選択**ページで、[DLAMI リリースノートページ](https://docs.aws.amazon.com/dlami/latest/devguide/appendix-ami-release-notes)にある、サポートされている DLAMI を選択します。

1. **[Choose an Instance Type]** (インスタンスタイプの選択) ページで、次のいずれかのサポート対象のインスタンスタイプを選択し、**[Next: Configure Instance Details]** (次の手順: インスタンスの詳細の設定) を選択します。サポートされているインスタンスのリストについては、[EFA と MPI の開始方法](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html)のリンクを参照してください。

1. [**Configure Instance Details**] ページで以下の操作を実行します。
   + [**インスタンス数**] に、起動する EFA 対応のインスタンスの数を入力します。
   + [**ネットワーク**] および [**サブネット**] で、インスタンスを起動する VPC およびサブネットを選択します。
   + [オプション] **[プレイスメントグループ]** で、**[プレイスメントグループにインスタンスを追加]** を選択します。最適なパフォーマンスを得るには、プレイスメントグループ内でインスタンスを起動します。
   + [オプション] **[プレイスメントグループ名]** で、**[新しいプレイスメントグループに追加]** を選択し、プレイスメントグループの分かりやすい名前を入力して、**[プレイスメントグループ戦略]** で **[クラスター]** を選択します。
   + 必ず、このページで **[Elastic Fabric Adapter]** を有効にしてください。このオプションが無効になっている場合は、選択したインスタンスタイプに対応するサブネットに変更します。
   + [**ネットワークインターフェイス**] セクションの [**eth0**] で、[**新しいネットワークインターフェイス**] を選択してください。必要に応じて、プライマリ IPv4 アドレスと 1 つ以上のセカンダリ IPv4 アドレスを指定できます。関連付けられている IPv6 CIDR ブロックを持つサブネットにインスタンスを起動する場合は、必要に応じて、プライマリ IPv6 アドレスと 1 つ以上のセカンダリ IPv6 アドレスを指定することができます。
   + [**次の手順: ストレージの追加**] を選択します。

1. [**ストレージの追加**] ページで、AMI で指定されたボリュームに加えてインスタンスにアタッチするボリューム (例: ルートデバイスのボリューム) を指定し、[**Next: Add Tags (次へ: タグの追加)**] を選択します。

1. [**Add Tags**] ページで、ユーザーフレンドリーな名前などを使ってインスタンスのタグを指定し、[**Next: Configure Security Group**] を選択します。

1. **[セキュリティグループの設定]** ページの **[セキュリティグループの割り当て]** で、**[既存のセキュリティグループを選択する]** を選択し、前に作成したセキュリティグループを選択します**。**

1. [**Review and Launch**] を選択してください。

1. [**インスタンス作成の確認**] ページで設定を確認し、[**起動**] を選択してキーペアを選択し、インスタンスを起動します。

## EFA 添付ファイルの確認
<a name="tutorial-efa-verify-attachment"></a>

### コンソールから
<a name="tutorial-efa-verify-attachment-console"></a>

インスタンスを起動したら、 AWS コンソールでインスタンスの詳細を確認します。これを行うには、EC2 コンソールでインスタンスを選択し、ページ下のペインにある [Description (説明)] タブを確認します。[Network Interfaces: eth0 (ネットワークインターフェイス: eth0)] というパラメータを探し、eth0 をクリックするとポップアップが開きます。[Elastic Fabric Adapter] が有効になっていることを確認します。

EFA が有効になっていない場合は、次のいずれかの方法でこれを修正できます。
+ EC2 インスタンスを終了し、同じ手順で新しいインスタンスを起動します。EFA が添付されていることを確認します。
+ 既存のインスタンスに EFA を添付します。

  1. EC2 コンソールで、[Network Interfaces (ネットワークインターフェイス)] に移動します。

  1. [Create a Network Interface (ネットワークインターフェイスを作成)] をクリックします。

  1. インスタンスが入っている同じサブネットを選択します。

  1. 必ず、[Elastic Fabric Adapter] を有効にし、[Create] (作成) をクリックします。

  1. [EC2 Instances (EC2 インスタンス)] タブに戻り、インスタンスを選択します。

  1. [Actions: Instance State] (アクション: インスタンスの状態) に移動し、EFA にアタッチする前にインスタンスを停止します。

  1. [Actions (アクション)] から、[Networking: Attach Network Interface (ネットワーキング: ネットワークインタフェイスの接続)] を選択します。

  1. 先ほど作成したインターフェイスを選択し、[Attach (接続)] をクリックします。

  1. インスタンスを再起動します。

### インスタンスから
<a name="tutorial-efa-verify-attachment-instance"></a>

DLAMI にすでに、次のテストスクリプトが存在します。これを実行して、カーネルモジュールが正しくロードされていることを確認します。

```
$ fi_info -p efa
```

出力は以下のようになります。

```
provider: efa
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-rdm
    version: 2.0
    type: FI_EP_RDM
    protocol: FI_PROTO_EFA
provider: efa
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-dgrm
    version: 2.0
    type: FI_EP_DGRAM
    protocol: FI_PROTO_EFA
provider: efa;ofi_rxd
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-dgrm
    version: 1.0
    type: FI_EP_RDM
    protocol: FI_PROTO_RXD
```

### セキュリティグループ構成の確認
<a name="tutorial-efa-verify-attachment-security"></a>

DLAMI にすでに、次のテストスクリプトが存在します。これを実行して、作成したセキュリティグループが正しく設定されていることを確認します。

```
$ cd /opt/amazon/efa/test/ 
$ ./efa_test.sh
```

出力は以下のようになります。

```
Starting server...
Starting client...
bytes   #sent   #ack     total       time     MB/sec    usec/xfer   Mxfers/sec
64      10      =10      1.2k        0.02s      0.06    1123.55       0.00
256     10      =10      5k          0.00s     17.66      14.50       0.07
1k      10      =10      20k         0.00s     67.81      15.10       0.07
4k      10      =10      80k         0.00s    237.45      17.25       0.06
64k     10      =10      1.2m        0.00s    921.10      71.15       0.01
1m      10      =10      20m         0.01s   2122.41     494.05       0.00
```

応答しなかったり完了しない場合は、セキュリティグループに正しいインバウンド/アウトバウンドルールが設定されていることを確認します。

# DLAMI での EFA の使用
<a name="tutorial-efa-using"></a>

次の項では、EFA を使用して、 AWS Deep Learning AMIsでマルチノードアプリケーションを実行する方法について説明します。

## EFA でマルチノードアプリケーションを実行
<a name="tutorial-efa-using-multi-node"></a>

ノードのクラスター全体でアプリケーションを実行するには、次の構成が必要です。

**Topics**
+ [

### パスワードレス SSH の有効化
](#tutorial-efa-using-multi-node-ssh)
+ [

### Hosts ファイルの作成
](#tutorial-efa-using-multi-node-hosts)
+ [

### NCCL テスト
](#tutorial-efa-using-2node)

### パスワードレス SSH の有効化
<a name="tutorial-efa-using-multi-node-ssh"></a>

クラスター内の 1 つのノードをリーダーノードとして選択します。残りのノードはメンバーノードと呼ばれます。

1. リーダーノードで、RSA キーペアを生成します。

   ```
   ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
   ```

1. リーダーノードのプライベートキーの許可を変更します。

   ```
   chmod 600 ~/.ssh/id_rsa
   ```

1. パブリックキー `~/.ssh/id_rsa.pub` をコピーし、クラスター内のメンバーノードの `~/.ssh/authorized_keys` に追加します。

1. これで、プライベート IP を使用して、リーダーノードからメンバーノードに直接ログインできるようになります。

   ```
   ssh <member private ip>
   ```

1. strictHostKeyChecking を無効にし、リーダーノードの \$1/.ssh/config ファイルに以下を追加することで、リーダーノードでエージェント転送を有効化します。

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. Amazon Linux 2 インスタンスでは、リーダーノードで次のコマンドを実行して、設定ファイルへの正しいアクセス許可を付与します。

   ```
   chmod 600 ~/.ssh/config
   ```

### Hosts ファイルの作成
<a name="tutorial-efa-using-multi-node-hosts"></a>

リーダーノードで、クラスター内のノードを識別する Hosts ファイルを作成します。Hosts ファイルには、クラスター内の各ノードのエントリが必要です。〜/hosts ファイルを作成し、次のようにプライベート IP を使用して各ノードを追加します。

```
localhost slots=8
<private ip of node 1> slots=8
<private ip of node 2> slots=8
```

### NCCL テスト
<a name="tutorial-efa-using-2node"></a>

**注記**  
これらのテストは、EFA のバージョン 1.38.0 および OFI NCCL プラグイン 1.13.2 を使用して実行されています。

 以下は、複数のコンピューティングノードで機能とパフォーマンスの両方をテストするために Nvidia が提供する NCCL テストのサブセットです 

 **サポートされているインスタンス: P3dn、P4、P5、P5e、P5en** 

#### パフォーマンステスト
<a name="tutorial-efa-using-multinode"></a>

##### P4d.24xlarge でのマルチノード NCCL パフォーマンステスト
<a name="tutorial-efa-using-multi-node-performance"></a>

EFA で NCCL パフォーマンステストを確認するには、公式の [NCCL-Tests Repo](https://github.com/NVIDIA/nccl-tests.git) で実施可能な標準 NCCL パフォーマンステストを実施します。DLAMI には、CUDA XX.X 用に構築されたこのテストが付属しています。EFA を使用して独自のスクリプトを実行することもできます。

独自のスクリプトを作成する場合は、次のガイダンスを参照してください。
+ EFA で NCCL アプリケーションを実行中に、例に示すように、mpirun への完全なパスを使用します。
+ クラスター内のインスタンスの数と GPU の数に基づいて、パラメータ np と N を変更します。
+ NCCL\$1DEBUG=INFO フラグを追加し、ログの EFA使用状況が、[Selected Provider is EFA] になっていることを確認します。
+  検証用に解析するトレーニングログの場所を設定します。

  ```
  TRAINING_LOG="testEFA_$(date +"%N").log"
  ```

いずれかのメンバーノードでコマンド `watch nvidia-smi` を使用し、GPU の使用状況を監視します。次の `watch nvidia-smi` コマンドは汎用 CUDA xx.x バージョン用のコマンドで、インスタンスのオペレーティングシステムによって異なります。スクリプト内の CUDA バージョンを置き換えることで、Amazon EC2 インスタンスで使用可能な任意の CUDA バージョンに対するコマンドを実行できます。
+ Amazon Linux 2、Amazon Linux 2023:

  ```
   $ /opt/amazon/openmpi/bin/mpirun -n 16 -N 8 \
  -x NCCL_DEBUG=INFO --mca pml ^cm \
  -x LD_LIBRARY_PATH=/usr/local/cuda-xx.x/efa/lib:/usr/local/cuda-xx.x/lib:/usr/local/cuda-xx.x/lib64:/usr/local/cuda-xx.x:/opt/amazon/efa/lib64:/opt/amazon/openmpi/lib64:$LD_LIBRARY_PATH \
  --hostfile hosts --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
  /usr/local/cuda-xx.x/efa/test-cuda-xx.x/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100 | tee ${TRAINING_LOG}
  ```
+ Ubuntu 20.04、Ubuntu 20.04:

  ```
  $ /opt/amazon/openmpi/bin/mpirun -n 16 -N 8 \
  -x NCCL_DEBUG=INFO --mca pml ^cm \
  -x LD_LIBRARY_PATH=/usr/local/cuda-xx.x/efa/lib:/usr/local/cuda-xx.x/lib:/usr/local/cuda-xx.x/lib64:/usr/local/cuda-xx.x:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:$LD_LIBRARY_PATH \
  --hostfile hosts --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
  /usr/local/cuda-xx.x/efa/test-cuda-xx.x/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100 | tee ${TRAINING_LOG}
  ```

出力は次のようになります。

```
# nThread 1 nGpus 1 minBytes 8 maxBytes 1073741824 step: 2(factor) warmup iters: 5 iters: 100 agg iters: 1 validation: 1 graph: 0
#
# Using devices
#  Rank  0 Group  0 Pid  33378 on ip-172-31-42-25 device  0 [0x10] NVIDIA A100-SXM4-40GB
#  Rank  1 Group  0 Pid  33379 on ip-172-31-42-25 device  1 [0x10] NVIDIA A100-SXM4-40GB
#  Rank  2 Group  0 Pid  33380 on ip-172-31-42-25 device  2 [0x20] NVIDIA A100-SXM4-40GB
#  Rank  3 Group  0 Pid  33381 on ip-172-31-42-25 device  3 [0x20] NVIDIA A100-SXM4-40GB
#  Rank  4 Group  0 Pid  33382 on ip-172-31-42-25 device  4 [0x90] NVIDIA A100-SXM4-40GB
#  Rank  5 Group  0 Pid  33383 on ip-172-31-42-25 device  5 [0x90] NVIDIA A100-SXM4-40GB
#  Rank  6 Group  0 Pid  33384 on ip-172-31-42-25 device  6 [0xa0] NVIDIA A100-SXM4-40GB
#  Rank  7 Group  0 Pid  33385 on ip-172-31-42-25 device  7 [0xa0] NVIDIA A100-SXM4-40GB
#  Rank  8 Group  0 Pid  30378 on ip-172-31-43-8 device  0 [0x10] NVIDIA A100-SXM4-40GB
#  Rank  9 Group  0 Pid  30379 on ip-172-31-43-8 device  1 [0x10] NVIDIA A100-SXM4-40GB
#  Rank 10 Group  0 Pid  30380 on ip-172-31-43-8 device  2 [0x20] NVIDIA A100-SXM4-40GB
#  Rank 11 Group  0 Pid  30381 on ip-172-31-43-8 device  3 [0x20] NVIDIA A100-SXM4-40GB
#  Rank 12 Group  0 Pid  30382 on ip-172-31-43-8 device  4 [0x90] NVIDIA A100-SXM4-40GB
#  Rank 13 Group  0 Pid  30383 on ip-172-31-43-8 device  5 [0x90] NVIDIA A100-SXM4-40GB
#  Rank 14 Group  0 Pid  30384 on ip-172-31-43-8 device  6 [0xa0] NVIDIA A100-SXM4-40GB
#  Rank 15 Group  0 Pid  30385 on ip-172-31-43-8 device  7 [0xa0] NVIDIA A100-SXM4-40GB
ip-172-31-42-25:33385:33385 [7] NCCL INFO cudaDriverVersion 12060
ip-172-31-43-8:30383:30383 [5] NCCL INFO Bootstrap : Using ens32:172.31.43.8
ip-172-31-43-8:30383:30383 [5] NCCL INFO NCCL version 2.23.4+cuda12.5
...
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Initializing aws-ofi-nccl 1.13.2-aws
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Using Libfabric version 1.22
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Using CUDA driver version 12060 with runtime 12050
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Configuring AWS-specific options
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting provider_filter to efa
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting FI_EFA_FORK_SAFE environment variable to 1
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting NCCL_NVLSTREE_MAX_CHUNKSIZE to 512KiB
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting NCCL_NVLS_CHUNKSIZE to 512KiB
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Running on p4d.24xlarge platform, Setting NCCL_TOPO_FILE environment variable to /opt/amazon/ofi-nccl/share/aws-ofi-nccl/xml/p4d-24xl-topo.xml
...
-----------------------------some output truncated-----------------------------------
#                                                              out-of-place                       in-place          
#       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
#        (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)       
           8             2     float     sum      -1    180.3    0.00    0.00      0    179.3    0.00    0.00      0
          16             4     float     sum      -1    178.1    0.00    0.00      0    177.6    0.00    0.00      0
          32             8     float     sum      -1    178.5    0.00    0.00      0    177.9    0.00    0.00      0
          64            16     float     sum      -1    178.8    0.00    0.00      0    178.7    0.00    0.00      0
         128            32     float     sum      -1    178.2    0.00    0.00      0    177.8    0.00    0.00      0
         256            64     float     sum      -1    178.6    0.00    0.00      0    178.8    0.00    0.00      0
         512           128     float     sum      -1    177.2    0.00    0.01      0    177.1    0.00    0.01      0
        1024           256     float     sum      -1    179.2    0.01    0.01      0    179.3    0.01    0.01      0
        2048           512     float     sum      -1    181.3    0.01    0.02      0    181.2    0.01    0.02      0
        4096          1024     float     sum      -1    184.2    0.02    0.04      0    183.9    0.02    0.04      0
        8192          2048     float     sum      -1    191.2    0.04    0.08      0    190.6    0.04    0.08      0
       16384          4096     float     sum      -1    202.5    0.08    0.15      0    202.3    0.08    0.15      0
       32768          8192     float     sum      -1    233.0    0.14    0.26      0    232.1    0.14    0.26      0
       65536         16384     float     sum      -1    238.6    0.27    0.51      0    235.1    0.28    0.52      0
      131072         32768     float     sum      -1    237.2    0.55    1.04      0    236.8    0.55    1.04      0
      262144         65536     float     sum      -1    248.3    1.06    1.98      0    247.0    1.06    1.99      0
      524288        131072     float     sum      -1    309.2    1.70    3.18      0    307.7    1.70    3.20      0
     1048576        262144     float     sum      -1    408.7    2.57    4.81      0    404.3    2.59    4.86      0
     2097152        524288     float     sum      -1    613.5    3.42    6.41      0    607.9    3.45    6.47      0
     4194304       1048576     float     sum      -1    924.5    4.54    8.51      0    914.8    4.58    8.60      0
     8388608       2097152     float     sum      -1   1059.5    7.92   14.85      0   1054.3    7.96   14.92      0
    16777216       4194304     float     sum      -1   1269.9   13.21   24.77      0   1272.0   13.19   24.73      0
    33554432       8388608     float     sum      -1   1642.7   20.43   38.30      0   1636.7   20.50   38.44      0
    67108864      16777216     float     sum      -1   2446.7   27.43   51.43      0   2445.8   27.44   51.45      0
   134217728      33554432     float     sum      -1   4143.6   32.39   60.73      0   4142.4   32.40   60.75      0
   268435456      67108864     float     sum      -1   7351.9   36.51   68.46      0   7346.7   36.54   68.51      0
   536870912     134217728     float     sum      -1    13717   39.14   73.39      0    13703   39.18   73.46      0
  1073741824     268435456     float     sum      -1    26416   40.65   76.21      0    26420   40.64   76.20      0
...
# Out of bounds values : 0 OK
# Avg bus bandwidth    : 15.5514
```

#### 検証テスト
<a name="tutorial-efa-validation"></a>

EFA テストが有効な結果を返したことを検証するには、次のテストを使用して確認します。
+ EC2 インスタンスメタデータを使用してインスタンスタイプを取得します。

  ```
  TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
  INSTANCE_TYPE=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/instance-type)
  ```
+ [パフォーマンステスト](#tutorial-efa-using-multinode) を実行します。
+  以下のパラメータを設定します。

  ```
  CUDA_VERSION
  CUDA_RUNTIME_VERSION
  NCCL_VERSION
  ```
+  結果を次のように検証します。

  ```
  RETURN_VAL=`echo $?`
  if [ ${RETURN_VAL} -eq 0 ]; then
  
      # [0] NCCL INFO NET/OFI Initializing aws-ofi-nccl 1.13.2-aws
      # [0] NCCL INFO NET/OFI Using CUDA driver version 12060 with runtime 12010
  
      # cudaDriverVersion 12060  --> This is max supported cuda version by nvidia driver
      # NCCL version 2.23.4+cuda12.5 --> This is NCCL version compiled with cuda version
  
      # Validation of logs
      grep "NET/OFI Configuring AWS-specific options" ${TRAINING_LOG} || { echo "AWS-specific options text not found"; exit 1; } 
      grep "busbw" ${TRAINING_LOG} || { echo "busbw text not found"; exit 1; } 
      grep "Avg bus bandwidth " ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; } 
      grep "NCCL version $NCCL_VERSION" ${TRAINING_LOG} || { echo "Text not found: NCCL version $NCCL_VERSION"; exit 1; }
      if [[ ${INSTANCE_TYPE} == "p4d.24xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Text not found: NET/Libfabric/0/GDRDMA"; exit 1; }  
          grep "NET/OFI Selected Provider is efa (found 4 nics)" ${TRAINING_LOG} || { echo "Selected Provider is efa text not found"; exit 1; }   
      elif [[ ${INSTANCE_TYPE} == "p4de.24xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 4 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
      elif [[ ${INSTANCE_TYPE} == "p5.48xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 32 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; } 
      elif [[ ${INSTANCE_TYPE} == "p5e.48xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 32 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
      elif [[ ${INSTANCE_TYPE} == "p5en.48xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 16 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
      elif [[ ${INSTANCE_TYPE} == "p3dn.24xlarge" ]]; then
          grep "NET/OFI Selected Provider is efa (found 4 nics)" ${TRAINING_LOG} || { echo "Selected Provider is efa text not found"; exit 1; }  
      fi
      echo "***************************** check_efa_nccl_all_reduce passed for cuda version ${CUDA_VERSION} *****************************"
  else
      echo "***************************** check_efa_nccl_all_reduce failed for cuda version ${CUDA_VERSION} *****************************"
  fi
  ```
+ ベンチマークデータにアクセスするには、マルチノード all\$1reduce テストからテーブル出力の最終行を解析します。

  ```
  benchmark=$(sudo cat ${TRAINING_LOG} | grep '1073741824' | tail -n1 | awk -F " " '{{print $12}}' | sed 's/ //' | sed  's/  5e-07//')
  if [[ -z "${benchmark}" ]]; then
    echo "benchmark variable is empty"
    exit 1
  fi
  
  echo "Benchmark throughput: ${benchmark}"
  ```

# GPU のモニタリングおよび最適化
<a name="tutorial-gpu"></a>

次のセクションでは、GPU の最適化とモニタリングオプションについて説明します。このセクションは、モニタリング、監督、事前処理、トレーニングが伴う一般的なワークフローと同様に編成されています。
+ [モニタリング](tutorial-gpu-monitoring.md)
  + [CloudWatch を使用して GPU をモニタリングする](tutorial-gpu-monitoring-gpumon.md)
+ [最適化](tutorial-gpu-opt.md)
  + [前処理](tutorial-gpu-opt-preprocessing.md)
  + [トレーニング](tutorial-gpu-opt-training.md)

# モニタリング
<a name="tutorial-gpu-monitoring"></a>

DLAMI には、いくつかの GPU モニタリングツールがプリインストールされています。このガイドでは、ダウンロードしてインストールするために利用できるツールについても言及されています。
+ [CloudWatch を使用して GPU をモニタリングする](tutorial-gpu-monitoring-gpumon.md) - Amazon CloudWatch で GPU 使用状況統計を報告するプリインストールされたユーティリティ。
+ [nvidia-smi CLI](https://developer.nvidia.com/nvidia-system-management-interface) - 全体的な GPU コンピューティングおよびメモリ使用率をモニタリングするユーティリティ。これは ( AWS Deep Learning AMIs DLAMI) にプリインストールされています。
+ [NVML C ライブラリ](https://developer.nvidia.com/nvidia-management-library-nvml) - GPU モニタリングおよび管理機能に直接アクセスできる C ベースの API。これは、内部の nvidia-smi CLI によって使用され、DLAMI にプリインストールされています。また、それらの言語での開発を容易にするため、Python および Perl がバインドされています。DLAMI にプリインストールされた gpumon.py ユーティリティは、[nvidia-ml-py](https://pypi.org/project/nvidia-ml-py/) の pynvml パッケージを使用しています。
+ [NVIDIA DCGM](https://developer.nvidia.com/data-center-gpu-manager-dcgm) - クラスター管理ツール。開発者ページにアクセスし、このツールをインストールして設定する方法を確認してください。

**ヒント**  
NVIDIA の開発者ブログで、DLAMI にインストールされている CUDA ツールの使用方法に関する最新情報を確認してください。  
(「[Monitoring TensorCore utilization using Nsight IDE and nvprof](https://devblogs.nvidia.com/using-nsight-compute-nvprof-mixed-precision-deep-learning-models/)」)。

# CloudWatch を使用して GPU をモニタリングする
<a name="tutorial-gpu-monitoring-gpumon"></a>

GPU で DLAMI を使用すると、トレーニングや推論中にその使用状況を追跡する方法が必要になることがあります。これは、データパイプラインの最適化や深層学習ネットワークのチューニングに役立ちます。

CloudWatch を使用して GPU メトリクスを設定するには、次の 2 つの方法があります。
+ [AWS CloudWatch エージェントを使用してメトリクスを設定する (推奨)](#tutorial-gpu-monitoring-gpumon-cloudwatch-agent-guide)
+ [プリインストールされた `gpumon.py` スクリプトを使用してメトリクスを設定する](#tutorial-gpu-monitoring-gpumon-script)

## AWS CloudWatch エージェントを使用してメトリクスを設定する (推奨)
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-guide"></a>

DLAMI を[統合 CloudWatch エージェント](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)と統合して GPU メトリクスを設定し、Amazon EC2 高速インスタンスの GPU コプロセスの使用状況をモニタリングします。

DLAMI で [GPU メトリクス](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-NVIDIA-GPU.html)を設定するには、次の 4 つの方法があります。
+ [最小限の GPU メトリクスを設定する](#tutorial-gpu-monitoring-gpumon-cloudwatch-agent-minimal)
+ [部分的な GPU メトリクスを設定する](#tutorial-gpu-monitoring-gpumon-cloudwatch-agent-partial)
+ [使用可能なすべての GPU メトリクスを設定する](#tutorial-gpu-monitoring-gpumon-cloudwatch-agent-all)
+ [カスタム GPU メトリクスを設定する](#tutorial-gpu-monitoring-gpumon-cloudwatch-agent-custom)

更新とセキュリティパッチの詳細については、「[AWS CloudWatch エージェントのセキュリティパッチ適用](#tutorial-gpu-monitoring-gpumon-cloudwatch-agent-security)」を参照してください。

### 前提条件
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-prerequisites"></a>

開始するには、Amazon EC2 インスタンスの IAM 許可を設定して、インスタンスが CloudWatch にメトリクスをプッシュできるようにする必要があります。詳しい手順については、「[CloudWatch エージェントで使用する IAM ロールとユーザーを作成する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html)」を参照してください。

### 最小限の GPU メトリクスを設定する
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-minimal"></a>

`dlami-cloudwatch-agent@minimal` `systemd` サービスを使用して最小限の GPU メトリクスを設定します。このサービスは以下のメトリクスを設定します。
+ `utilization_gpu`
+ `utilization_memory`

事前設定済みの最小限の GPU メトリクス向けの `systemd` サービスは以下の場所にあります。

```
/opt/aws/amazon-cloudwatch-agent/etc/dlami-amazon-cloudwatch-agent-minimal.json
```

以下のコマンドで `systemd` サービスを有効にして起動します。

```
sudo systemctl enable dlami-cloudwatch-agent@minimal
sudo systemctl start dlami-cloudwatch-agent@minimal
```

### 部分的な GPU メトリクスを設定する
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-partial"></a>

`dlami-cloudwatch-agent@partial` `systemd` サービスを使用して部分的な GPU メトリクスを設定します。このサービスは以下のメトリクスを設定します。
+ `utilization_gpu`
+ `utilization_memory`
+ `memory_total`
+ `memory_used`
+ `memory_free`

事前設定済みの部分的な GPU メトリクス向けの `systemd` サービスは以下の場所にあります。

```
/opt/aws/amazon-cloudwatch-agent/etc/dlami-amazon-cloudwatch-agent-partial.json
```

以下のコマンドで `systemd` サービスを有効にして起動します。

```
sudo systemctl enable dlami-cloudwatch-agent@partial
sudo systemctl start dlami-cloudwatch-agent@partial
```

### 使用可能なすべての GPU メトリクスを設定する
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-all"></a>

`dlami-cloudwatch-agent@all` `systemd` サービスを使用して使用可能なすべての GPU メトリクスを設定します。このサービスは以下のメトリクスを設定します。
+ `utilization_gpu`
+ `utilization_memory`
+ `memory_total`
+ `memory_used`
+ `memory_free`
+ `temperature_gpu`
+ `power_draw`
+ `fan_speed`
+ `pcie_link_gen_current`
+ `pcie_link_width_current`
+ `encoder_stats_session_count`
+ `encoder_stats_average_fps`
+ `encoder_stats_average_latency`
+ `clocks_current_graphics`
+ `clocks_current_sm`
+ `clocks_current_memory`
+ `clocks_current_video`

事前設定済みの使用可能なすべての GPU メトリクス向けの `systemd` サービスは以下の場所にあります。

```
/opt/aws/amazon-cloudwatch-agent/etc/dlami-amazon-cloudwatch-agent-all.json
```

以下のコマンドで `systemd` サービスを有効にして起動します。

```
sudo systemctl enable dlami-cloudwatch-agent@all
sudo systemctl start dlami-cloudwatch-agent@all
```

### カスタム GPU メトリクスを設定する
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-custom"></a>

事前設定済みのメトリクスが要件を満たさない場合は、カスタム CloudWatch エージェント設定ファイルを作成できます。

#### カスタム設定を作成する
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-custom-create"></a>

カスタム設定ファイルを作成するには、「[CloudWatch エージェント設定ファイルを手動で作成または編集する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html)」の詳細手順を参照してください。

この例では、スキーマ定義が `/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json` にあると仮定します。

#### カスタムファイルを使用してメトリクスを設定する
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-custom-configure"></a>

以下のコマンドを実行して、カスタムファイルに従って CloudWatch エージェントを設定します。

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config -m ec2 -s -c \
file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
```

### AWS CloudWatch エージェントのセキュリティパッチ適用
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-security"></a>

新しくリリースされた DLAMIsは、利用可能な最新の AWS CloudWatch エージェントセキュリティパッチで設定されます。以下のセクションを参照して、お使いのオペレーティングシステムに応じて、現在の DLAMI を最新のセキュリティパッチで更新してください。

#### Amazon Linux 2
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-security-al2"></a>

を使用して`yum`、Amazon Linux 2 DLAMI の最新の AWS CloudWatch エージェントセキュリティパッチを取得します。

```
 sudo yum update
```

#### Ubuntu
<a name="tutorial-gpu-monitoring-gpumon-cloudwatch-agent-security-ubuntu"></a>

Ubuntu で DLAMI の最新の AWS CloudWatch セキュリティパッチを取得するには、Amazon S3 ダウンロードリンクを使用して AWS CloudWatch エージェントを再インストールする必要があります。

```
wget https://s3.region.amazonaws.com/amazoncloudwatch-agent-region/ubuntu/arm64/latest/amazon-cloudwatch-agent.deb
```

Amazon S3 ダウンロードリンクを使用して AWS CloudWatch エージェントをインストールする方法の詳細については、[「サーバーでの CloudWatch エージェントのインストールと実行](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)」を参照してください。

## プリインストールされた `gpumon.py` スクリプトを使用してメトリクスを設定する
<a name="tutorial-gpu-monitoring-gpumon-script"></a>

gpumon.py というユーティリティは、DLAMI にプリインストールされています。これは、CloudWatch と統合されており、GPU ごとの使用状況 (GPU メモリ、GPU 温度、GPU 電源) のモニタリングをサポートしています。このスクリプトは、モニタリングしたデータを CloudWatch に定期的に送信します。スクリプトでいくつかの設定を変更することで、CloudWatch に送信されるデータの詳細度レベルを設定できます。ただし、スクリプトを開始する前に、CloudWatch がメトリクスを受け取るように設定する必要があります。

**CloudWatch を使用した GPU モニタリングを設定して実行する方法**

1. IAM ユーザーを作成するか、既存のユーザーを変更し、メトリクスを CloudWatch に発行するためのポリシーを追加します。新しいユーザーを作成する場合、認証情報をメモしてください。次のステップで必要になります。

   検索する IAM ポリシーは「cloudwatch:PutMetricData」です。追加されるポリシーは次のようになります。

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
           {
               "Action": [
                   "cloudwatch:PutMetricData"
                ],
                "Effect": "Allow",
                "Resource": "*"
           }
      ]
   }
   ```

------
**ヒント**  
IAM ユーザーの作成と CloudWatch のポリシーの追加の詳細については、[ CloudWatch のドキュメント](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html)を参照してください。

1. DLAMI で、[AWS 構成](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration)を実行し、IAM ユーザー認証情報を指定します。

   ```
   $ aws configure
   ```

1. 実行する前に、gpumon ユーティリティにいくつかの変更が必要になる場合があります。gpumon ユーティリティと README は次のコードブロックに定義された場所にあります。`gpumon.py` スクリプトの詳細については、[スクリプトの Amazon S3 の場所](https://s3.amazonaws.com/aws-bigdata-blog/artifacts/GPUMonitoring/gpumon.py)を参照してください。

   ```
   Folder: ~/tools/GPUCloudWatchMonitor
   Files: 	~/tools/GPUCloudWatchMonitor/gpumon.py
         	~/tools/GPUCloudWatchMonitor/README
   ```

   オプション:
   + インスタンスが us-east-1 でない場合、gpumon.py でリージョンを変更します。
   + CloudWatch `namespace` や、`store_reso` によるレポートの期間などの他のパラメータを変更します。

1. 現在、スクリプトでは Python 3 のみがサポートされています。希望するフレームワークの Python 3 環境を有効化するか、DLAMI の一般的な Python 3 環境を有効化します。

   ```
   $ source activate python3
   ```

1. gpumon ユーティリティをバックグラウンドで実行します。

   ```
   (python3)$ python gpumon.py &
   ```

1. ブラウザを開いて [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) にアクセスし、メトリクスを選択します。名前空間は「DeepLearningTrain」になります。
**ヒント**  
gpumon.py を変更することで名前空間を変更できます。`store_reso` を調整することで、レポートの間隔を調整することもできます。

次に示すのは、p2.8xlarge インスタンス上のトレーニングジョブをモニタリングする gpumon.py の実行について報告する CloudWatch グラフの例です。

![\[CloudWatch での GPU モニタリング\]](http://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/images/gpumon.png)


必要に応じて、GPU モニタリングおよび最適化に関する他のトピックも参照できます。
+ [モニタリング](tutorial-gpu-monitoring.md)
  + [CloudWatch を使用して GPU をモニタリングする](#tutorial-gpu-monitoring-gpumon)
+ [最適化](tutorial-gpu-opt.md)
  + [前処理](tutorial-gpu-opt-preprocessing.md)
  + [トレーニング](tutorial-gpu-opt-training.md)

# 最適化
<a name="tutorial-gpu-opt"></a>

GPU を最大限に活用するため、データパイプラインを最適化し、深層学習ネットワークをチューニングできます。次の図が示すように、ニューラルネットワークのネイティブまたは基本実装では、GPU が一貫性なく使用され、潜在能力が十分に引き出されない可能性があります。事前処理とデータのロードを最適化すると、CPU から GPU へのボトルネックを減らすことができます。ハイブリダイゼーションを使用し (フレームワークでサポートされている場合)、バッチサイズを調整してコールを同期することで、ニューラルネットワーク自体を調整することができます。ほとんどのフレームワークでは、多精度 (float16 または int8) トレーニングを使用することもできます。スループットの向上に劇的な効果が及ぶ可能性があります。

以下の図は、さまざまな最適化を適用した場合の累積的なパフォーマンス向上を示しています。結果は、処理するデータと最適化するネットワークによって異なります。

![\[GPU のパフォーマンス向上\]](http://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/images/performance-enhancements.png)


次のガイドでは、DLAMI を使用し、GPU パフォーマンスの向上に役立つオプションについて紹介します。

**Topics**
+ [

# 前処理
](tutorial-gpu-opt-preprocessing.md)
+ [

# トレーニング
](tutorial-gpu-opt-training.md)

# 前処理
<a name="tutorial-gpu-opt-preprocessing"></a>

トランスフォーメーションやオーグメンテーションによるデータの事前処理は、多くの場合、CPU バウンド処理であり、パイプライン全体でボトルネックになる可能性があります。フレームワークには、画像処理用の組み込み演算子がありますが、DALI (データオーグメンテーションライブラリ) はフレームワークの組み込みオプションよりパフォーマンスが上回ることを実証しています。
+ NVIDIA データオーグメンテーションライブラリ (DALI): DALI は、データオーグメンテーションを GPU にオフロードします。DLAMI にはプリインストールされていませんが、DLAMI や他の Amazon Elastic Compute Cloud インスタンスに DALI をインストールするか、サポートされているフレームワークコンテナをロードすることにより、DALI にアクセスできます。詳細については、NVIDIA ウェブサイトの [DALI プロジェクトページ](https://docs.nvidia.com/deeplearning/sdk/dali-install-guide/index.html)を参照してください。ユースケースの例とコードサンプルのダウンロードについては、[SageMaker 前処理トレーニングパフォーマンス](https://github.com/aws-samples/sagemaker-cv-preprocessing-training-performance)のサンプルを参照してください。
+ nvJPEG: C プログラマー向け GPU 加速 JPEG デコーダーライブラリ。1 つのイメージまたはバッチのデコードに加えて、深層学習に共通する後続のトランスフォーメーション操作もサポートされています。nvJPEG には DALI が組み込まれています。または、[NVIDIA ウェブサイトの nvjpeg ページ](https://developer.nvidia.com/nvjpeg)からダウンロードし、別個に使用することもできます。

必要に応じて、GPU モニタリングおよび最適化に関する他のトピックも参照できます。
+ [モニタリング](tutorial-gpu-monitoring.md)
  + [CloudWatch を使用して GPU をモニタリングする](tutorial-gpu-monitoring-gpumon.md)
+ [最適化](tutorial-gpu-opt.md)
  + [前処理](#tutorial-gpu-opt-preprocessing)
  + [トレーニング](tutorial-gpu-opt-training.md)

# トレーニング
<a name="tutorial-gpu-opt-training"></a>

混合精度トレーニングでは、メモリの量が同じでより大規模なネットワークをデプロイしたり、単精度または倍精度ネットワークと比較してメモリの使用量を減らしたりすることができます。これにより、コンピューティングパフォーマンスが向上します。また、複数ノードに分散したトレーニングでは重要な要素である、少量かつ高速なデータ転送というメリットも得られます。混合精度トレーニングを利用するには、データキャスティングと損失スケーリングを調整する必要があります。混合精度をサポートするフレームワークでこれを行う方法について説明しているガイドを以下に示します。
+ [NVIDIA Deep Learning SDK](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/) - MXNet、PyTorch、および TensorFlow の混合精度実装について説明している NVIDIA ウェブサイト上のドキュメント。

**ヒント**  
必ず、ウェブサイトで選択したフレームワークを確認し、「混合精度」または「fp16」を検索して最新の最適化手法を参照してください。以下の混合精度ガイドが役に立つ可能性があります。  
[Mixed-precision training with TensorFlow (ビデオ)](https://devblogs.nvidia.com/mixed-precision-resnet-50-tensor-cores/) - NVIDIA ブログサイト上。
[Mixed-precision training using float16 with MXNet](https://mxnet.apache.org/api/faq/float16) - MXNet ウェブサイト上のよくある質問記事。
[NVIDIA Apex: a tool for easy mixed-precision training with PyTorch](https://devblogs.nvidia.com/apex-pytorch-easy-mixed-precision-training/) - NVIDIA ウェブサイトのブログ記事。

必要に応じて、GPU モニタリングおよび最適化に関する他のトピックも参照できます。
+ [モニタリング](tutorial-gpu-monitoring.md)
  + [CloudWatch を使用して GPU をモニタリングする](tutorial-gpu-monitoring-gpumon.md)
+ [最適化](tutorial-gpu-opt.md)
  + [前処理](tutorial-gpu-opt-preprocessing.md)
  + [トレーニング](#tutorial-gpu-opt-training)

# DLAMI を使用した AWS Inferentia チップ
<a name="tutorial-inferentia"></a>

AWS Inferentia は、 によって設計されたカスタム機械学習チップ AWS で、高性能な推論予測に使用できます。このチップを使用するには、Amazon Elastic Compute Cloud インスタンスをセットアップし、 AWS Neuron Software Development Kit (SDK) を使用して Inferentia チップを呼び出します。お客様に最高の Inferentia エクスペリエンスを提供するために、Neuron が AWS Deep Learning AMIs (DLAMI) に組み込まれています。

以下のトピックでは、Inferentia と DLAMI の使用を開始する方法について説明します。

**Topics**
+ [

# AWS Neuron を使用した DLAMI インスタンスの起動
](tutorial-inferentia-launching.md)
+ [

# AWS Neuron での DLAMI の使用
](tutorial-inferentia-using.md)

# AWS Neuron を使用した DLAMI インスタンスの起動
<a name="tutorial-inferentia-launching"></a>

 最新の DLAMI は Inferentia AWS で使用できるようになり、 AWS Neuron API パッケージが付属しています。DLAMI インスタンスを起動するには、[DLAMI の起動と設定](https://docs.aws.amazon.com/dlami/latest/devguide/launch-config.html)を参照してください。DLAMI を作成したら、以下のステップを使用して、 AWS Inferentia チップと AWS Neuron リソースがアクティブであることを確認します。

**Topics**
+ [

## インスタンスの確認
](#tutorial-inferentia-launching-verify)
+ [

## AWS Inferentia デバイスの識別
](#tutorial-inferentia-launching-identify)
+ [

## リソースの使用状況の表示
](#tutorial-inferentia-launching-resource-usage)
+ [

## Neuron Monitor (neuron-monitor) の使用
](#tutorial-inferentia-launching-neuron-monitor)
+ [

## Neuron ソフトウェアのアップグレード
](#tutorial-inferentia-launching-upgrade)

## インスタンスの確認
<a name="tutorial-inferentia-launching-verify"></a>

 インスタンスを使用する前に、インスタンスが正しくセットアップされ、Neuron で設定されていることを確認します。

## AWS Inferentia デバイスの識別
<a name="tutorial-inferentia-launching-identify"></a>

 インスタンス上の Inferentia デバイスの数を確認するには、次のコマンドを使用します。

```
neuron-ls
```

 インスタンスに Inferentia デバイスがアタッチされている場合、出力は次のようになります。

```
+--------+--------+--------+-----------+--------------+
| NEURON | NEURON | NEURON | CONNECTED |     PCI      |
| DEVICE | CORES  | MEMORY |  DEVICES  |     BDF      |
+--------+--------+--------+-----------+--------------+
| 0      | 4      | 8 GB   | 1         | 0000:00:1c.0 |
| 1      | 4      | 8 GB   | 2, 0      | 0000:00:1d.0 |
| 2      | 4      | 8 GB   | 3, 1      | 0000:00:1e.0 |
| 3      | 4      | 8 GB   | 2         | 0000:00:1f.0 |
+--------+--------+--------+-----------+--------------+
```

 示されている出力は Inf1.6xLarge インスタンスから取得されたものであり、次の列が含まれています。
+ NEURON DEVICE: NeuronDevice に割り当てられた論理 ID。この ID は、異なる NeuronDevice を使用するように複数のランタイムを設定する場合に使用されます。
+ NEURON CORES: NeuronDevice に存在する NeuronCore の数。
+ NEURON MEMORY: NeuronDevice 内の DRAM メモリの量。
+ CONNECTED DEVICES: NeuronDevice に接続されている他の NeuronDevice。
+ PCI BDF: NeuronDevice の PCI バスデバイス機能 (BDF) ID。

## リソースの使用状況の表示
<a name="tutorial-inferentia-launching-resource-usage"></a>

 `neuron-top` コマンドを使用して、NeuronCore と vCPU の使用率、メモリ使用率、ロードされたモデル、Neuron アプリケーションに関する有用な情報を表示します。引数を指定せずに `neuron-top` を起動すると、NeuronCore を使用するすべての機械学習アプリケーションのデータが表示されます。

```
neuron-top
```

 アプリケーションが 4 つの NeuronCore を使用している場合、出力は以下の画像のようになります。

![\[neuron-top コマンドの出力。4 つの NeuronCore のうちの 1 つの情報が強調表示されています。\]](http://docs.aws.amazon.com/ja_jp/dlami/latest/devguide/images/neuron-top-output.png)


Neuron ベースの推論アプリケーションを監視および最適化するためのリソースの詳細については、[Neuron Tools](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-tools/index.html) を参照してください。

## Neuron Monitor (neuron-monitor) の使用
<a name="tutorial-inferentia-launching-neuron-monitor"></a>

Neuron Monitor は、システムで実行されている Neuron ランタイムからメトリクスを収集し、収集したデータを JSON 形式で標準出力にストリーミングします。これらのメトリクスは、設定ファイルを指定して設定するメトリクスグループに編成されます。Neuron Monitor の詳細については、[Neuron Monitor User Guide](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-tools/neuron-monitor-user-guide.html) を参照してください。

## Neuron ソフトウェアのアップグレード
<a name="tutorial-inferentia-launching-upgrade"></a>

DLAMI 内で Neuron SDK ソフトウェアを更新する方法については、 AWS 「 Neuron [セットアップガイド](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-intro/neuron-install-guide.html)」を参照してください。

**次のステップ**  
[AWS Neuron での DLAMI の使用](tutorial-inferentia-using.md)

# AWS Neuron での DLAMI の使用
<a name="tutorial-inferentia-using"></a>

 AWS Neuron SDK の一般的なワークフローは、以前にトレーニングされた機械学習モデルをコンパイルサーバーでコンパイルすることです。その後、実行のためにアーティファクトを Inf1 インスタンスに配布します。 AWS Deep Learning AMIs (DLAMI) には、Inferentia を使用する Inf1 インスタンスで推論をコンパイルして実行するために必要なものがすべてプリインストールされています。

 以下のセクションでは、Inferentia とともに DLAMI を使用する方法について説明します。

**Topics**
+ [

# TensorFlow-Neuron と AWS Neuron Compiler の使用
](tutorial-inferentia-tf-neuron.md)
+ [

# AWS Neuron TensorFlow Serving の使用
](tutorial-inferentia-tf-neuron-serving.md)
+ [

# MXNet-Neuron と AWS Neuron Compiler の使用
](tutorial-inferentia-mxnet-neuron.md)
+ [

# MXNet-Neuron モデルサービングの使用
](tutorial-inferentia-mxnet-neuron-serving.md)
+ [

# PyTorch-Neuron と AWS Neuron Compiler の使用
](tutorial-inferentia-pytorch-neuron.md)

# TensorFlow-Neuron と AWS Neuron Compiler の使用
<a name="tutorial-inferentia-tf-neuron"></a>

 このチュートリアルでは、 AWS Neuron コンパイラを使用して Keras ResNet-50 モデルをコンパイルし、保存済みモデルとして SavedModel 形式でエクスポートする方法を示します。このフォーマットは、一般的な TensorFlow モデル交換可能な形式です。また、入力例を使用して Inf1 インスタンスで推論を実行する方法も学習します。  

 Neuron SDK の詳細については、[AWS Neuron SDK のドキュメント](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/tensorflow-neuron/index.html)を参照してください。

**Topics**
+ [

## 前提条件
](#tutorial-inferentia-tf-neuron-prerequisites)
+ [

## Conda 環境のアクティブ化
](#tutorial-inferentia-tf-neuron-activate)
+ [

## Resnet50 コンパイル
](#tutorial-inferentia-tf-neuron-compilation)
+ [

## ResNet50 推論
](#tutorial-inferentia-tf-neuron-inference)

## 前提条件
<a name="tutorial-inferentia-tf-neuron-prerequisites"></a>

 このチュートリアルを使用する前に、[AWS Neuron を使用した DLAMI インスタンスの起動](tutorial-inferentia-launching.md) の設定ステップを完了しておく必要があります。また、深層学習および DLAMI の使用にも精通している必要があります。

## Conda 環境のアクティブ化
<a name="tutorial-inferentia-tf-neuron-activate"></a>

 次のコマンドを使用して、TensorFlow-Neuron Conda 環境をアクティブにします。

```
source activate aws_neuron_tensorflow_p36
```

 現在の Conda 環境を終了するには、次のコマンドを実行します。

```
source deactivate
```

## Resnet50 コンパイル
<a name="tutorial-inferentia-tf-neuron-compilation"></a>

次の内容を含む **tensorflow\$1compile\$1resnet50.py** という Python スクリプトを作成します。この Python スクリプトは、Keras ResNet50 モデルをコンパイルし、保存されたモデルとしてエクスポートします。

```
import os
import time
import shutil
import tensorflow as tf
import tensorflow.neuron as tfn
import tensorflow.compat.v1.keras as keras
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input

# Create a workspace
WORKSPACE = './ws_resnet50'
os.makedirs(WORKSPACE, exist_ok=True)

# Prepare export directory (old one removed)
model_dir = os.path.join(WORKSPACE, 'resnet50')
compiled_model_dir = os.path.join(WORKSPACE, 'resnet50_neuron')
shutil.rmtree(model_dir, ignore_errors=True)
shutil.rmtree(compiled_model_dir, ignore_errors=True)

# Instantiate Keras ResNet50 model
keras.backend.set_learning_phase(0)
model = ResNet50(weights='imagenet')

# Export SavedModel
tf.saved_model.simple_save(
 session            = keras.backend.get_session(),
 export_dir         = model_dir,
 inputs             = {'input': model.inputs[0]},
 outputs            = {'output': model.outputs[0]})

# Compile using Neuron
tfn.saved_model.compile(model_dir, compiled_model_dir)

# Prepare SavedModel for uploading to Inf1 instance
shutil.make_archive(compiled_model_dir, 'zip', WORKSPACE, 'resnet50_neuron')
```

 次のコマンドを使用してモデルをコンパイルします。

```
python tensorflow_compile_resnet50.py
```

コンパイル処理には数分かかります。完了すると、出力は次のようになります。

```
...
INFO:tensorflow:fusing subgraph neuron_op_d6f098c01c780733 with neuron-cc
INFO:tensorflow:Number of operations in TensorFlow session: 4638
INFO:tensorflow:Number of operations after tf.neuron optimizations: 556
INFO:tensorflow:Number of operations placed on Neuron runtime: 554
INFO:tensorflow:Successfully converted ./ws_resnet50/resnet50 to ./ws_resnet50/resnet50_neuron
...
```

 ​ 

 コンパイル後、保存されたモデルは **ws\$1resnet50/resnet50\$1neuron.zip** に圧縮されます。以下のコマンドを使用して、モデルを解凍し、推論用のサンプルイメージをダウンロードします。

```
unzip ws_resnet50/resnet50_neuron.zip -d .
curl -O https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg
```

## ResNet50 推論
<a name="tutorial-inferentia-tf-neuron-inference"></a>

次の内容を含む **tensorflow\$1infer\$1resnet50.py** という Python スクリプトを作成します。このスクリプトは、以前にコンパイルされた推論モデルを使用して、ダウンロードしたモデルに対して推論を実行します。

```
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications import resnet50

# Create input from image
img_sgl = image.load_img('kitten_small.jpg', target_size=(224, 224))
img_arr = image.img_to_array(img_sgl)
img_arr2 = np.expand_dims(img_arr, axis=0)
img_arr3 = resnet50.preprocess_input(img_arr2)
# Load model
COMPILED_MODEL_DIR = './ws_resnet50/resnet50_neuron/'
predictor_inferentia = tf.contrib.predictor.from_saved_model(COMPILED_MODEL_DIR)
# Run inference
model_feed_dict={'input': img_arr3}
infa_rslts = predictor_inferentia(model_feed_dict);
# Display results
print(resnet50.decode_predictions(infa_rslts["output"], top=5)[0])
```

 次のコマンドを使用して、モデルに対して推論を実行します。

```
python tensorflow_infer_resnet50.py
```

 出力は次のようになります。

```
...
[('n02123045', 'tabby', 0.6918919), ('n02127052', 'lynx', 0.12770271), ('n02123159', 'tiger_cat', 0.08277027), ('n02124075', 'Egyptian_cat', 0.06418919), ('n02128757', 'snow_leopard', 0.009290541)]
```

**次のステップ**  
[AWS Neuron TensorFlow Serving の使用](tutorial-inferentia-tf-neuron-serving.md)

# AWS Neuron TensorFlow Serving の使用
<a name="tutorial-inferentia-tf-neuron-serving"></a>

このチュートリアルでは、TensorFlow Serving で使用する保存済みモデルをエクスポートする前に、グラフを作成し、 AWS Neuron コンパイルステップを追加する方法を示します。TensorFlow Serving は、ネットワーク全体で推論をスケールアップすることを可能にする提供システムです。Neuron TensorFlow Serving は通常の TensorFlow Serving と同じ API を使用します。唯一の違いは、保存されたモデルを Inferentia AWS 用にコンパイルする必要があり、エントリポイントは という名前の別のバイナリであることです `tensorflow_model_server_neuron`。バイナリは、`/usr/local/bin/tensorflow_model_server_neuron` にあり、DLAMI にあらかじめインストールされています。

 Neuron SDK の詳細については、[AWS Neuron SDK のドキュメント](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/tensorflow-neuron/index.html)を参照してください。

**Topics**
+ [

## 前提条件
](#tutorial-inferentia-tf-neuron--serving-prerequisites)
+ [

## Conda 環境のアクティブ化
](#tutorial-inferentia-tf-neuron-serving-activate)
+ [

## 保存したモデルのコンパイルとエクスポート
](#tutorial-inferentia-tf-neuron-serving-compile)
+ [

## 保存したモデルの提供
](#tutorial-inferentia-tf-neuron-serving-serving)
+ [

## モデルサーバーへの推論リクエストを生成する
](#tutorial-inferentia-tf-neuron-serving-inference)

## 前提条件
<a name="tutorial-inferentia-tf-neuron--serving-prerequisites"></a>

このチュートリアルを使用する前に、[AWS Neuron を使用した DLAMI インスタンスの起動](tutorial-inferentia-launching.md) の設定ステップを完了しておく必要があります。また、深層学習および DLAMI の使用にも精通している必要があります。

## Conda 環境のアクティブ化
<a name="tutorial-inferentia-tf-neuron-serving-activate"></a>

 次のコマンドを使用して、TensorFlow-Neuron Conda 環境をアクティブにします。

```
source activate aws_neuron_tensorflow_p36
```

 現在の Conda 環境を終了する必要がある場合は、次のコマンドを実行します。

```
source deactivate
```

## 保存したモデルのコンパイルとエクスポート
<a name="tutorial-inferentia-tf-neuron-serving-compile"></a>

以下の内容が含まれた Python スクリプト `tensorflow-model-server-compile.py` を作成します。このスクリプトは、Neuron を使用してグラフを作成し、コンパイルします。次に、コンパイルされたグラフを保存されたモデルとしてエクスポートします。  

```
import tensorflow as tf
import tensorflow.neuron
import os

tf.keras.backend.set_learning_phase(0)
model = tf.keras.applications.ResNet50(weights='imagenet')
sess = tf.keras.backend.get_session()
inputs = {'input': model.inputs[0]}
outputs = {'output': model.outputs[0]}

# save the model using tf.saved_model.simple_save
modeldir = "./resnet50/1"
tf.saved_model.simple_save(sess, modeldir, inputs, outputs)

# compile the model for Inferentia
neuron_modeldir = os.path.join(os.path.expanduser('~'), 'resnet50_inf1', '1')
tf.neuron.saved_model.compile(modeldir, neuron_modeldir, batch_size=1)
```

 次のコマンドを使用してモデルをコンパイルします。

```
python tensorflow-model-server-compile.py
```

 出力は次のようになります。

```
...
INFO:tensorflow:fusing subgraph neuron_op_d6f098c01c780733 with neuron-cc
INFO:tensorflow:Number of operations in TensorFlow session: 4638
INFO:tensorflow:Number of operations after tf.neuron optimizations: 556
INFO:tensorflow:Number of operations placed on Neuron runtime: 554
INFO:tensorflow:Successfully converted ./resnet50/1 to /home/ubuntu/resnet50_inf1/1
```

## 保存したモデルの提供
<a name="tutorial-inferentia-tf-neuron-serving-serving"></a>

モデルをコンパイルしたら、次のコマンドを使用して、保存したモデルに tensorflow\$1model\$1server\$1neuron バイナリを提供できます。

```
tensorflow_model_server_neuron --model_name=resnet50_inf1 \
    --model_base_path=$HOME/resnet50_inf1/ --port=8500 &
```

 出力は次のようになります。コンパイルされたモデルは、推論の準備のためにサーバーによって Inferentia デバイスの DRAM にステージングされます。

```
...
2019-11-22 01:20:32.075856: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:311] SavedModel load for tags { serve }; Status: success. Took 40764 microseconds.
2019-11-22 01:20:32.075888: I tensorflow_serving/servables/tensorflow/saved_model_warmup.cc:105] No warmup data file found at /home/ubuntu/resnet50_inf1/1/assets.extra/tf_serving_warmup_requests
2019-11-22 01:20:32.075950: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: resnet50_inf1 version: 1}
2019-11-22 01:20:32.077859: I tensorflow_serving/model_servers/server.cc:353] Running gRPC ModelServer at 0.0.0.0:8500 ...
```

## モデルサーバーへの推論リクエストを生成する
<a name="tutorial-inferentia-tf-neuron-serving-inference"></a>

次の内容で `tensorflow-model-server-infer.py` という Python スクリプトを作成します。このスクリプトはサービスフレームワークである gRPC を介して推論を実行してください。

```
import numpy as np
import grpc
import tensorflow as tf
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
from tensorflow.keras.applications.resnet50 import decode_predictions

if __name__ == '__main__':
    channel = grpc.insecure_channel('localhost:8500')
    stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
    img_file = tf.keras.utils.get_file(
        "./kitten_small.jpg",
        "https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg")
    img = image.load_img(img_file, target_size=(224, 224))
    img_array = preprocess_input(image.img_to_array(img)[None, ...])
    request = predict_pb2.PredictRequest()
    request.model_spec.name = 'resnet50_inf1'
    request.inputs['input'].CopyFrom(
        tf.contrib.util.make_tensor_proto(img_array, shape=img_array.shape))
    result = stub.Predict(request)
    prediction = tf.make_ndarray(result.outputs['output'])
    print(decode_predictions(prediction))
```

 次のコマンドで gRPC を使用して、モデルの推論を実行します。

```
python tensorflow-model-server-infer.py
```

 出力は次のようになります。

```
[[('n02123045', 'tabby', 0.6918919), ('n02127052', 'lynx', 0.12770271), ('n02123159', 'tiger_cat', 0.08277027), ('n02124075', 'Egyptian_cat', 0.06418919), ('n02128757', 'snow_leopard', 0.009290541)]]
```

# MXNet-Neuron と AWS Neuron Compiler の使用
<a name="tutorial-inferentia-mxnet-neuron"></a>

MXNet-Neuron コンパイル API は、 AWS Inferentia デバイスで実行できるモデルグラフをコンパイルする方法を提供します。

 この例では、API を使用して ResNet-50 モデルをコンパイルし、それを使用して推論を実行します。

 Neuron SDK の詳細については、[AWS Neuron SDK のドキュメント](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/mxnet-neuron/index.html)を参照してください。

**Topics**
+ [

## 前提条件
](#tutorial-inferentia-mxnet-neuron-prerequisites)
+ [

## Conda 環境のアクティブ化
](#tutorial-inferentia-mxnet-neuron-activate)
+ [

## Resnet50 コンパイル
](#tutorial-inferentia-mxnet-neuron-compilation)
+ [

## ResNet50 推論
](#tutorial-inferentia-mxnet-neuron-inference)

## 前提条件
<a name="tutorial-inferentia-mxnet-neuron-prerequisites"></a>

 このチュートリアルを使用する前に、[AWS Neuron を使用した DLAMI インスタンスの起動](tutorial-inferentia-launching.md) の設定ステップを完了しておく必要があります。また、深層学習および DLAMI の使用にも精通している必要があります。

## Conda 環境のアクティブ化
<a name="tutorial-inferentia-mxnet-neuron-activate"></a>

 次のコマンドを使用して、MXNet-Neuron Conda 環境をアクティブにします。

```
source activate aws_neuron_mxnet_p36
```

現在の Conda 環境を終了するには、次のコマンドを実行します。

```
source deactivate
```

## Resnet50 コンパイル
<a name="tutorial-inferentia-mxnet-neuron-compilation"></a>

次の内容で **mxnet\$1compile\$1resnet50.py** という Python スクリプトを作成します。このスクリプトは、MXNet-Neuron コンパイル Python API を使用して、ResNet-50 モデルをコンパイルします。

```
import mxnet as mx
import numpy as np

print("downloading...")
path='http://data.mxnet.io/models/imagenet/'
mx.test_utils.download(path+'resnet/50-layers/resnet-50-0000.params')
mx.test_utils.download(path+'resnet/50-layers/resnet-50-symbol.json')
print("download finished.")

sym, args, aux = mx.model.load_checkpoint('resnet-50', 0)

print("compile for inferentia using neuron... this will take a few minutes...")
inputs = { "data" : mx.nd.ones([1,3,224,224], name='data', dtype='float32') }

sym, args, aux = mx.contrib.neuron.compile(sym, args, aux, inputs)

print("save compiled model...")
mx.model.save_checkpoint("compiled_resnet50", 0, sym, args, aux)
```

 次のコマンドを使用してモデルをコンパイルします。

```
python mxnet_compile_resnet50.py
```

 コンパイルには数分かかります。コンパイルが終了すると、次のファイルが現在のディレクトリに表示されます。

```
resnet-50-0000.params
resnet-50-symbol.json
compiled_resnet50-0000.params
compiled_resnet50-symbol.json
```

## ResNet50 推論
<a name="tutorial-inferentia-mxnet-neuron-inference"></a>

次の内容で **mxnet\$1infer\$1resnet50.py** という Python スクリプトを作成します。このスクリプトは、サンプルイメージをダウンロードし、それを使用して、コンパイルされたモデルを持つ推論を実行します。

```
import mxnet as mx
import numpy as np

path='http://data.mxnet.io/models/imagenet/'
mx.test_utils.download(path+'synset.txt')

fname = mx.test_utils.download('https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg')
img = mx.image.imread(fname)

# convert into format (batch, RGB, width, height)
img = mx.image.imresize(img, 224, 224) 
# resize
img = img.transpose((2, 0, 1)) 
# Channel first
img = img.expand_dims(axis=0) 
# batchify
img = img.astype(dtype='float32')

sym, args, aux = mx.model.load_checkpoint('compiled_resnet50', 0)
softmax = mx.nd.random_normal(shape=(1,))
args['softmax_label'] = softmax
args['data'] = img
# Inferentia context
ctx = mx.neuron()

exe = sym.bind(ctx=ctx, args=args, aux_states=aux, grad_req='null')
with open('synset.txt', 'r') as f:
    labels = [l.rstrip() for l in f]

exe.forward(data=img)
prob = exe.outputs[0].asnumpy()
# print the top-5
prob = np.squeeze(prob)
a = np.argsort(prob)[::-1] 
for i in a[0:5]:
    print('probability=%f, class=%s' %(prob[i], labels[i]))
```

 次のコマンドを使用して、コンパイルされたモデルで推論を実行します。

```
python mxnet_infer_resnet50.py
```

 出力は次のようになります。

```
probability=0.642454, class=n02123045 tabby, tabby cat
probability=0.189407, class=n02123159 tiger cat
probability=0.100798, class=n02124075 Egyptian cat
probability=0.030649, class=n02127052 lynx, catamount
probability=0.016278, class=n02129604 tiger, Panthera tigris
```

**次のステップ**  
[MXNet-Neuron モデルサービングの使用](tutorial-inferentia-mxnet-neuron-serving.md)

# MXNet-Neuron モデルサービングの使用
<a name="tutorial-inferentia-mxnet-neuron-serving"></a>

このチュートリアルでは、事前にトレーニングされた MXNet モデルを使用して、マルチモデルサーバー (MMS) でリアルタイムのイメージ分類を実行する方法を学習します。MMS は、Machine Learning や深層学習フレームワークを使用してトレーニングされた深層学習モデルを提供するための、柔軟で使いやすいツールです。このチュートリアルには、 AWS Neuron を使用したコンパイルステップと、MXNet を使用した MMS の実装が含まれています。

 Neuron SDK の詳細については、[AWS Neuron SDK のドキュメント](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/mxnet-neuron/index.html)を参照してください。

**Topics**
+ [

## 前提条件
](#tutorial-inferentia-mxnet-neuron-serving-prerequisites)
+ [

## Conda 環境のアクティブ化
](#tutorial-inferentia-mxnet-neuron-serving-activate)
+ [

## コード例のダウンロード
](#tutorial-inferentia-mxnet-neuron-serving-download)
+ [

## モデルのコンパイル
](#tutorial-inferentia-mxnet-neuron-serving-compile)
+ [

## 推論の実行
](#tutorial-inferentia-mxnet-neuron-serving-inference)

## 前提条件
<a name="tutorial-inferentia-mxnet-neuron-serving-prerequisites"></a>

 このチュートリアルを使用する前に、[AWS Neuron を使用した DLAMI インスタンスの起動](tutorial-inferentia-launching.md) の設定ステップを完了しておく必要があります。また、深層学習および DLAMI の使用にも精通している必要があります。

## Conda 環境のアクティブ化
<a name="tutorial-inferentia-mxnet-neuron-serving-activate"></a>

 次のコマンドを使用して、MXNet-Neuron Conda 環境をアクティブにします。

```
source activate aws_neuron_mxnet_p36
```

 現在の Conda 環境を終了するには、次のコマンドを実行します。

```
source deactivate
```

## コード例のダウンロード
<a name="tutorial-inferentia-mxnet-neuron-serving-download"></a>

 この例を実行するには、次のコマンドを使用してコード例をダウンロードします。

```
git clone https://github.com/awslabs/multi-model-server
cd multi-model-server/examples/mxnet_vision
```

## モデルのコンパイル
<a name="tutorial-inferentia-mxnet-neuron-serving-compile"></a>

次の内容で `multi-model-server-compile.py` という Python スクリプトを作成します。このスクリプトは、ResNet50 モデルを Inferentia デバイスターゲットにコンパイルします。

```
import mxnet as mx
from mxnet.contrib import neuron
import numpy as np

path='http://data.mxnet.io/models/imagenet/'
mx.test_utils.download(path+'resnet/50-layers/resnet-50-0000.params')
mx.test_utils.download(path+'resnet/50-layers/resnet-50-symbol.json')
mx.test_utils.download(path+'synset.txt')

nn_name = "resnet-50"

#Load a model
sym, args, auxs = mx.model.load_checkpoint(nn_name, 0)

#Define compilation parameters#  - input shape and dtype
inputs = {'data' : mx.nd.zeros([1,3,224,224], dtype='float32') }

# compile graph to inferentia target
csym, cargs, cauxs = neuron.compile(sym, args, auxs, inputs)

# save compiled model
mx.model.save_checkpoint(nn_name + "_compiled", 0, csym, cargs, cauxs)
```

 モデルをコンパイルするには、次のコマンドを使用します。

```
python multi-model-server-compile.py
```

 出力は次のようになります。

```
...
[21:18:40] src/nnvm/legacy_json_util.cc:209: Loading symbol saved by previous version v0.8.0. Attempting to upgrade...
[21:18:40] src/nnvm/legacy_json_util.cc:217: Symbol successfully upgraded!
[21:19:00] src/operator/subgraph/build_subgraph.cc:698: start to execute partition graph.
[21:19:00] src/nnvm/legacy_json_util.cc:209: Loading symbol saved by previous version v0.8.0. Attempting to upgrade...
[21:19:00] src/nnvm/legacy_json_util.cc:217: Symbol successfully upgraded!
```

 次の内容を含むと `signature.json` いう名前のファイルを作成し、入力名と形状を設定します。

```
{
  "inputs": [
    {
      "data_name": "data",
      "data_shape": [
        1,
        3,
        224,
        224
      ]
    }
  ]
}
```

次のコマンドを使用して `synset.txt` ファイルを呼び出すことができます。このファイルは、ImageNet 予測クラスの名前の一覧です。

```
curl -O https://s3.amazonaws.com/model-server/model_archive_1.0/examples/squeezenet_v1.1/synset.txt
```

`model_server_template` フォルダ内のテンプレートに続くカスタムサービスクラスを作成します。次のコマンドを使用して、テンプレートを現在の作業ディレクトリにコピーします。

```
cp -r ../model_service_template/* .
```

 次のように `mxnet_model_service.py` モジュールを編集して、`mx.cpu()` コンテキストを `mx.neuron()` コンテキストに置き換えます。MXNet-Neuron は NDArray および Gluon API をサポートしていないため、`model_input` の不要なデータコピーをコメントアウトする必要があります。

```
...
self.mxnet_ctx = mx.neuron() if gpu_id is None else mx.gpu(gpu_id)
...
#model_input = [item.as_in_context(self.mxnet_ctx) for item in model_input]
```

 次のコマンドを使用して、モデルアーカイバでモデルをパッケージ化します。

```
cd ~/multi-model-server/examples
model-archiver --force --model-name resnet-50_compiled --model-path mxnet_vision --handler mxnet_vision_service:handle
```

## 推論の実行
<a name="tutorial-inferentia-mxnet-neuron-serving-inference"></a>

マルチモデルサーバーを起動し、次のコマンドを使用して RESTful API を使用するモデルをロードします。**neuron-rtd** がデフォルト設定で実行されていることを確認します。

```
cd ~/multi-model-server/
multi-model-server --start --model-store examples > /dev/null # Pipe to log file if you want to keep a log of MMS
curl -v -X POST "http://localhost:8081/models?initial_workers=1&max_workers=4&synchronous=true&url=resnet-50_compiled.mar"
sleep 10 # allow sufficient time to load model
```

 以下のコマンドでサンプルイメージを使用して推論を実行します。

```
curl -O https://raw.githubusercontent.com/awslabs/multi-model-server/master/docs/images/kitten_small.jpg
curl -X POST http://127.0.0.1:8080/predictions/resnet-50_compiled -T kitten_small.jpg
```

 出力は次のようになります。

```
[
  {
    "probability": 0.6388034820556641,
    "class": "n02123045 tabby, tabby cat"
  },
  {
    "probability": 0.16900072991847992,
    "class": "n02123159 tiger cat"
  },
  {
    "probability": 0.12221276015043259,
    "class": "n02124075 Egyptian cat"
  },
  {
    "probability": 0.028706775978207588,
    "class": "n02127052 lynx, catamount"
  },
  {
    "probability": 0.01915954425930977,
    "class": "n02129604 tiger, Panthera tigris"
  }
]
```

 テスト後にクリーンアップするには、RESTful API を使用して削除コマンドを発行し、次のコマンドを使用してモデルサーバーを停止します。

```
curl -X DELETE http://127.0.0.1:8081/models/resnet-50_compiled

multi-model-server --stop
```

 以下の出力が表示されます。

```
{
  "status": "Model \"resnet-50_compiled\" unregistered"
}
Model server stopped.
Found 1 models and 1 NCGs.
Unloading 10001 (MODEL_STATUS_STARTED) :: success
Destroying NCG 1 :: success
```

# PyTorch-Neuron と AWS Neuron Compiler の使用
<a name="tutorial-inferentia-pytorch-neuron"></a>

PyTorch-Neuron コンパイル API は、 AWS Inferentia デバイスで実行できるモデルグラフをコンパイルする方法を提供します。

トレーニング済みモデルは、Inf1 インスタンスにデプロイする前に、Inferentia ターゲットにコンパイルする必要があります。以下のチュートリアルでは、torchvision ResNet50 モデルをコンパイルし、保存された TorchScript モジュールとしてエクスポートします。このモデルは、推論を実行するために使用されます。

便宜上、このチュートリアルではコンパイルと推論の両方に Inf1 インスタンスを使用します。実際には、c5 インスタンスファミリーなどの別のインスタンスタイプを使用してモデルをコンパイルできます。その後、コンパイルされたモデルを Inf1 推論サーバーにデプロイする必要があります。詳細については、[AWS Neuron PyTorch SDK のドキュメント](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/pytorch-neuron/index.html)を参照してください。

**Topics**
+ [

## 前提条件
](#tutorial-inferentia-pytorch-neuron-prerequisites)
+ [

## Conda 環境のアクティブ化
](#tutorial-inferentia-pytorch-neuron-activate)
+ [

## Resnet50 コンパイル
](#tutorial-inferentia-pytorch-neuron-compilation)
+ [

## ResNet50 推論
](#tutorial-inferentia-pytorch-neuron-inference)

## 前提条件
<a name="tutorial-inferentia-pytorch-neuron-prerequisites"></a>

このチュートリアルを使用する前に、[AWS Neuron を使用した DLAMI インスタンスの起動](tutorial-inferentia-launching.md) の設定ステップを完了しておく必要があります。また、深層学習および DLAMI の使用にも精通している必要があります。

## Conda 環境のアクティブ化
<a name="tutorial-inferentia-pytorch-neuron-activate"></a>

次のコマンドを使用して、PyTorch-Neuron Conda 環境をアクティブにします。

```
source activate aws_neuron_pytorch_p36
```

現在の Conda 環境を終了するには、次のコマンドを実行します。

```
source deactivate
```

## Resnet50 コンパイル
<a name="tutorial-inferentia-pytorch-neuron-compilation"></a>

次の内容で **pytorch\$1trace\$1resnet50.py** という Python スクリプトを作成します。このスクリプトは、PyTorch-Neuron コンパイル Python API を使用して、ResNet-50 モデルをコンパイルします。

**注記**  
torchvision と torch パッケージのバージョン間には、torchvision モデルのコンパイル時に注意すべき依存関係があります。これらの依存関係ルールは、pip を介して管理できます。torchvision==0.6.1 は torch==1.5.1 リリースと対応し、torchvision==0.8.2 は torch==1.7.1 リリースに対応しています。

```
import torch
import numpy as np
import os
import torch_neuron
from torchvision import models

image = torch.zeros([1, 3, 224, 224], dtype=torch.float32)

## Load a pretrained ResNet50 model
model = models.resnet50(pretrained=True)

## Tell the model we are using it for evaluation (not training)
model.eval()
model_neuron = torch.neuron.trace(model, example_inputs=[image])

## Export to saved model
model_neuron.save("resnet50_neuron.pt")
```

コンパイルスクリプトを実行します。

```
python pytorch_trace_resnet50.py
```

コンパイルには数分かかります。コンパイルが完了すると、コンパイルされたモデルは `resnet50_neuron.pt` としてローカルディレクトリに保存されます。

## ResNet50 推論
<a name="tutorial-inferentia-pytorch-neuron-inference"></a>

次の内容で **pytorch\$1infer\$1resnet50.py** という Python スクリプトを作成します。このスクリプトは、サンプルイメージをダウンロードし、それを使用して、コンパイルされたモデルを持つ推論を実行します。

```
import os
import time
import torch
import torch_neuron
import json
import numpy as np

from urllib import request

from torchvision import models, transforms, datasets

## Create an image directory containing a small kitten
os.makedirs("./torch_neuron_test/images", exist_ok=True)
request.urlretrieve("https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg",
                    "./torch_neuron_test/images/kitten_small.jpg")


## Fetch labels to output the top classifications
request.urlretrieve("https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json","imagenet_class_index.json")
idx2label = []

with open("imagenet_class_index.json", "r") as read_file:
    class_idx = json.load(read_file)
    idx2label = [class_idx[str(k)][1] for k in range(len(class_idx))]

## Import a sample image and normalize it into a tensor
normalize = transforms.Normalize(
    mean=[0.485, 0.456, 0.406],
    std=[0.229, 0.224, 0.225])

eval_dataset = datasets.ImageFolder(
    os.path.dirname("./torch_neuron_test/"),
    transforms.Compose([
    transforms.Resize([224, 224]),
    transforms.ToTensor(),
    normalize,
    ])
)

image, _ = eval_dataset[0]
image = torch.tensor(image.numpy()[np.newaxis, ...])

## Load model
model_neuron = torch.jit.load( 'resnet50_neuron.pt' )

## Predict
results = model_neuron( image )

# Get the top 5 results
top5_idx = results[0].sort()[1][-5:]

# Lookup and print the top 5 labels
top5_labels = [idx2label[idx] for idx in top5_idx]

print("Top 5 labels:\n {}".format(top5_labels) )
```

次のコマンドを使用して、コンパイルされたモデルで推論を実行します。

```
python pytorch_infer_resnet50.py
```

出力は次のようになります。

```
Top 5 labels:
 ['tiger', 'lynx', 'tiger_cat', 'Egyptian_cat', 'tabby']
```

# ARM64 DLAMI
<a name="tutorial-arm64"></a>

AWS ARM64 GPU DLAMIsは、深層学習ワークロードに高いパフォーマンスとコスト効率を提供するように設計されています。具体的には、G5g インスタンスタイプには Arm64-based [AWS Graviton2 プロセッサ](https://aws.amazon.com/ec2/graviton/)が搭載されています。これは、 によってゼロから構築 AWS され、お客様がクラウドでワークロードを実行する方法に最適化されています。 AWS ARM64 GPU DLAMIs は、Docker、NVIDIA Docker、NVIDIA ドライバー、CUDA、CuDNN、NCCL、および TensorFlow や PyTorch などの一般的な機械学習フレームワークで事前設定されています。

G5g インスタンスタイプでは、Graviton2 の価格およびパフォーマンスの利点を活用することで、GPU アクセラレーション機能を備えた x86 ベースのインスタンスと比較して、GPU アクセラレーションを利用した深層学習モデルを大幅に低いコストでデプロイできます。

## ARM64 DLAMI を選択する
<a name="tutorial-arm64-select-dlami"></a>

選択した ARM64 DLAMI を備えた [G5g インスタンス](https://aws.amazon.com/ec2/instance-types/g5g/)を起動します。

DLAMI を起動するステップバイステップの手順については、[DLAMI を起動および設定する](https://docs.aws.amazon.com/dlami/latest/devguide/launch-config.html)を参照してください。

最新の ARM64 DLAMI のリストについては、[DLAMI のリリースノート](https://docs.aws.amazon.com/dlami/latest/devguide/appendix-ami-release-notes.html)を参照してください。

## 使用を開始する
<a name="tutorial-arm64-get-started"></a>

以下のトピックでは、ARM64 DLAMI の使用を開始する方法について説明します。

**Topics**
+ [

## ARM64 DLAMI を選択する
](#tutorial-arm64-select-dlami)
+ [

## 使用を開始する
](#tutorial-arm64-get-started)
+ [

# ARM64 GPU PyTorch DLAMI の使用
](tutorial-arm64-pytorch.md)

# ARM64 GPU PyTorch DLAMI の使用
<a name="tutorial-arm64-pytorch"></a>

 AWS Deep Learning AMIs は Arm64 プロセッサベースの GPUs で使用できるようになり、PyTorch 用に最適化されています。ARM64 GPU PyTorch DLAMI には、深層学習のトレーニングと推論のユースケース用に [PyTorch](https://aws.amazon.com/pytorch)、[TorchVision](https://pytorch.org/vision/stable/index.html)、および[TorchServe](https://pytorch.org/serve/) で事前設定された Python 環境が含まれています。

**Topics**
+ [

## PyTorch Python 環境を確認する
](#tutorial-arm64-pytorch-environment)
+ [

## PyTorch でトレーニングサンプルを実行する
](#tutorial-arm64-pytorch-training)
+ [

## PyTorch で推論サンプルを実行する
](#tutorial-arm64-pytorch-inference)

## PyTorch Python 環境を確認する
<a name="tutorial-arm64-pytorch-environment"></a>

G5g インスタンスに接続し、次のコマンドを使用して Base Conda 環境を有効化します。

```
source activate base
```

コマンドプロンプトは、PyTorch、TorchVision、およびその他のライブラリが含まれた Base Conda 環境で作業していることが示されます。

```
(base) $
```

PyTorch 環境のデフォルトのツールパスを確認します。

```
(base) $ which python
(base) $ which pip
(base) $ which conda
(base) $ which mamba
>>> import torch, torchvision
>>> torch.__version__
>>> torchvision.__version__
>>> v = torch.autograd.Variable(torch.randn(10, 3, 224, 224))
>>> v = torch.autograd.Variable(torch.randn(10, 3, 224, 224)).cuda()
>>> assert isinstance(v, torch.Tensor)
```

## PyTorch でトレーニングサンプルを実行する
<a name="tutorial-arm64-pytorch-training"></a>

サンプル MNIST トレーニングジョブを実行します。

```
git clone https://github.com/pytorch/examples.git
cd examples/mnist
python main.py
```

出力は以下のようになります。

```
...
Train Epoch: 14 [56320/60000 (94%)]    Loss: 0.021424
Train Epoch: 14 [56960/60000 (95%)]    Loss: 0.023695
Train Epoch: 14 [57600/60000 (96%)]    Loss: 0.001973
Train Epoch: 14 [58240/60000 (97%)]    Loss: 0.007121
Train Epoch: 14 [58880/60000 (98%)]    Loss: 0.003717
Train Epoch: 14 [59520/60000 (99%)]    Loss: 0.001729
Test set: Average loss: 0.0275, Accuracy: 9916/10000 (99%)
```

## PyTorch で推論サンプルを実行する
<a name="tutorial-arm64-pytorch-inference"></a>

次のコマンドを使用して、事前トレーニング済みの densenet161 モデルをダウンロードし、TorchServe を使用して推論を実行します。

```
# Set up TorchServe
cd $HOME
git clone https://github.com/pytorch/serve.git
mkdir -p serve/model_store
cd serve

# Download a pre-trained densenet161 model
wget https://download.pytorch.org/models/densenet161-8d451a50.pth >/dev/null

# Save the model using torch-model-archiver
torch-model-archiver --model-name densenet161 \
    --version 1.0 \
    --model-file examples/image_classifier/densenet_161/model.py \
    --serialized-file densenet161-8d451a50.pth \
    --handler image_classifier \
    --extra-files examples/image_classifier/index_to_name.json  \
    --export-path model_store 

# Start the model server
torchserve --start --no-config-snapshots \
    --model-store model_store \
    --models densenet161=densenet161.mar &> torchserve.log

# Wait for the model server to start
sleep 30

# Run a prediction request
curl http://127.0.0.1:8080/predictions/densenet161 -T examples/image_classifier/kitten.jpg
```

出力は以下のようになります。

```
{
  "tiger_cat": 0.4693363308906555,
  "tabby": 0.4633873701095581,
  "Egyptian_cat": 0.06456123292446136,
  "lynx": 0.0012828150065615773,
  "plastic_bag": 0.00023322898778133094
}
```

次のコマンドを使用して densenet161 モデルの登録を解除し、サーバーを停止します。

```
curl -X DELETE http://localhost:8081/models/densenet161/1.0
torchserve --stop
```

出力は以下のようになります。

```
{
  "status": "Model \"densenet161\" unregistered"
}
TorchServe has stopped.
```

# 推測
<a name="tutorial-inference"></a>

このセクションでは、DLAMI のフレームワークとツールを使用して推論を実行する方法についてチュートリアルを提供します。

## 推論ツール
<a name="tutorial-inference-tools"></a>
+ [TensorFlow Serving](tutorial-tfserving.md)

# モデル提供
<a name="model-serving"></a>

Deep Learning AMI with Conda にインストールされているモデル提供のオプションを以下に示します。いずれかのオプションをクリックして、使用方法をご覧ください。

**Topics**
+ [

# TensorFlow Serving
](tutorial-tfserving.md)
+ [

# TorchServe
](tutorial-torchserve.md)

# TensorFlow Serving
<a name="tutorial-tfserving"></a>

[TensorFlow Serving は、機械学習モデル向けの柔軟で高パフォーマンスの処理システムです。](https://www.tensorflow.org/tfx/guide/serving)

`tensorflow-serving-api` には、シングルフレームワーク DLAMI が事前にインストールされています。Tensorflow Serving を使用するには、まず TensorFlow 環境をアクティブ化します。

```
$ source /opt/tensorflow/bin/activate
```

次に、任意のテキストエディタを使用して、以下の内容のスクリプトを作成します。このスクリプトに `test_train_mnist.py` という名前を付けます。このスクリプトは [TensorFlow](https://github.com/tensorflow/docs/blob/master/site/en/tutorials/quickstart/beginner.ipynb) チュートリアルを参照しており、イメージを分類するニューラルネットワーク機械学習モデルを学習および評価します。

```
import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
```

サーバーの場所、ポート、ハスキーの写真のファイル名をパラメータとして渡してスクリプトを実行します。

```
$ /opt/tensorflow/bin/python3 test_train_mnist.py
```

 このスクリプトは出力に時間がかかることがあるため、少し待ちます。トレーニングが完了すると、以下の内容が表示されます。

```
I0000 00:00:1739482012.389276    4284 device_compiler.h:188] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.
1875/1875 [==============================] - 24s 2ms/step - loss: 0.2973 - accuracy: 0.9134 
Epoch 2/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.1422 - accuracy: 0.9582
Epoch 3/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.1076 - accuracy: 0.9687
Epoch 4/5
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0872 - accuracy: 0.9731
Epoch 5/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.0731 - accuracy: 0.9771
313/313 [==============================] - 0s 1ms/step - loss: 0.0749 - accuracy: 0.9780
```

## その他の機能と例
<a name="tutorial-tfserving-project"></a>

TensorFlow Serving について詳しくお知りになりたい場合は、[TensorFlow ウェブサイト](https://www.tensorflow.org/serving/)を参照してください。

# TorchServe
<a name="tutorial-torchserve"></a>

TorchServe は、PyTorch からエクスポートされた深層学習モデルを供給するための柔軟なツールです。TorchServe には、Deep Learning AMI with Conda がプリインストールされています。

TorchServe の使用方法の詳細については、[Model Server for PyTorch のドキュメント](https://github.com/pytorch/serve/blob/master/docs/README.md)を参照してください。

 **トピック** 

## TorchServe でイメージ分類モデルを供給する
<a name="tutorial-torchserve-serving"></a>

このチュートリアルでは、TorchServe でイメージ分類モデルを供給する方法を説明します。PyTorch で提供されている Densenet-161 モデルを使用します。サーバーが実行されると、予測リクエストをリッスンします。イメージをアップロードすると (この例では猫の画像)、サーバーはモデルがトレーニングされたクラスから最適な 5 つの一致するクラスの予測を返します。

**TorchServe でイメージ分類モデル例を供給するには**

1. Deep Learning AMI with Conda v34 以降の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに接続します。

1. `pytorch_p310` 環境をアクティブ化します。

   ```
   source activate pytorch_p310
   ```

1. TorchServe リポジトリをクローンし、モデルを保存するディレクトリを作成します。  

   ```
   git clone https://github.com/pytorch/serve.git
   mkdir model_store
   ```

1. モデルアーカイバを使用してモデルをアーカイブします。`extra-files` パラメータは、`TorchServe` リポジトリからのファイルを使用するので、必要に応じてパスを更新します。モデルアーカイバの詳細については、[Torch Model archiver for TorchServe](https://github.com/pytorch/serve/blob/master/model-archiver/README.md) を参照してください。

   ```
   wget https://download.pytorch.org/models/densenet161-8d451a50.pth
   torch-model-archiver --model-name densenet161 --version 1.0 --model-file ./serve/examples/image_classifier/densenet_161/model.py --serialized-file densenet161-8d451a50.pth --export-path model_store --extra-files ./serve/examples/image_classifier/index_to_name.json --handler image_classifier
   ```

1. TorchServe を実行してエンドポイントを開始します。`> /dev/null` を追加すると、ログ出力が抑止されます。

   ```
   torchserve --start --ncs --model-store model_store --models densenet161.mar > /dev/null
   ```

1. 猫の画像をダウンロードして TorchServe 予測エンドポイントに送信します。

   ```
   curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
   curl http://127.0.0.1:8080/predictions/densenet161 -T kitten.jpg
   ```

   予測エンドポイントは次のような上位 5 つの予測に類似する予測を JSON で返します。ここでは、エジプシャンマウが含まれている可能性が 47%、続いてトラネコが含まれている可能性が 46% となっています。

   ```
   {
    "tiger_cat": 0.46933576464653015,
    "tabby": 0.463387668132782,
    "Egyptian_cat": 0.0645613968372345,
    "lynx": 0.0012828196631744504,
    "plastic_bag": 0.00023323058849200606
   }
   ```

1. テストが完了したら、以下のようにサーバーを停止します。

   ```
   torchserve --stop
   ```

 **その他の例** 

TorchServe には、DLAMI インスタンスで実行できるさまざまな例があります。それらの例は [TorchServe プロジェクトリポジトリの例のページ](https://github.com/pytorch/serve/tree/master/examples)で見つかります。

 **詳細情報** 

 Docker で TorchServe を設定する方法や、最新の TorchServe 機能など、TorchServe のその他のドキュメントについては、GitHub で [TorchServe プロジェクトページ](https://github.com/pytorch/serve)を参照してください。