

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

# 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)