

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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) - 預先安裝的公用程式，可將 GPU 用量統計資料報告給 Amazon CloudWatch。
+ [nvidia-smi CLI](https://developer.nvidia.com/nvidia-system-management-interface) - 用於監控整體 GPU 運算和記憶體使用率的公用程式。這已預先安裝在您的 AWS 深度學習 AMIs (DLAMI) 上。
+ [NVML C 程式庫](https://developer.nvidia.com/nvidia-management-library-nvml) – 以 C 為基礎的 API，可直接存取 GPU 監控和管理功能。這是由 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) - 叢集管理工具。造訪開發人員頁面，了解如何安裝和設定這個工具。

**提示**  
如需使用已安裝 DLAMI 之 CUDA 工具的最新資訊，請參閱 NVIDIA 的開發人員部落格：  
[使用 Nsight IDE 和 nvprof 監控 TensorCore 使用率](https://devblogs.nvidia.com/using-nsight-compute-nvprof-mixed-precision-deep-learning-models/)。

# 使用 CloudWatch 監控 GPU
<a name="tutorial-gpu-monitoring-gpumon"></a>

當您使用 DLAMI 搭配 GPU 時，您可能會發現您在培訓或推論期間設法追蹤其使用狀況。這在最佳化資料管道和調校深度學習網路時可能有很用。

使用 CloudWatch 設定 GPU 指標的方法有兩種：
+ [使用 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)有四種方式：
+ [設定最小 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>

若要開始使用，您必須設定允許執行個體將指標推送至 CloudWatch 的 Amazon EC2 執行個體 IAM 許可。如需詳細步驟，請參閱[建立 IAM 角色和使用者以搭配 CloudWatch 代理程式使用](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 使用者，或修改現有的 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` 來修改報告間隔。

以下是範例 CloudWatch 圖表報告，顯示執行 gpumon.py 來監控 p2.8xlarge 執行個體上的培訓任務。

![\[CloudWatch 上的 GPU 監控\]](http://docs.aws.amazon.com/zh_tw/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/zh_tw/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 (Data Augmentation Library) 展現比架構的內建選項更好的效能。
+ NVIDIA Data Augmentation Library (DALI)：DALI 將資料擴增卸載到 GPU。它不會預先安裝在 DLAMI 上，但您可以透過在 DLAMI 或其他 Amazon Elastic Compute Cloud 執行個體上安裝或載入支援的架構容器來存取它。如需詳細資訊，請參閱 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 解碼器程式庫。它支援解碼單一映像或批次，以及深度學習中常見的後續轉換操作。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 深度學習軟體開發套件](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/) - NVIDIA 網站上的文件，描述適用於 MXNet、PyTorch 和 TensorFlow 的混合精度實作。

**提示**  
請務必到網站上查看您選擇的架構，並搜尋「混合精度」或 "fp16" 以取得最新的最佳化技術。以下是您可能覺得很有用的一些混合精度指南：  
[以 TensorFlow 進行混合精度培訓 (影片)](https://devblogs.nvidia.com/mixed-precision-resnet-50-tensor-cores/) - 在 NVIDIA 部落格網站。
[使用 float16 搭配 MXNet 進行混合精度培訓](https://mxnet.apache.org/api/faq/float16) - MXNet 網站上的常見問答集文章。
[NVIDIA Apex：以 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)