使用 GPU 在雲端訓練模型

圖形處理器 (GPU) 可顯著加速許多深度學習模型的訓練程序。訓練模型用來進行像是影像分類、視訊分析,及自然語言處理等工作,包含了需要密集運算的矩陣乘法,以及其他利用 GPU 這種大型平行架構的操作。

訓練深度學習模型時,如果需要在極大型的資料集上執行密集運算工作,使用單一處理器可能需要幾天的執行時間。但如果您將程式設計為卸載工作至一或多個 GPU,則可將訓練時間從幾天縮短為幾小時。

事前準備

AI Platform 允許您在 GPU 就緒的機器上執行任何 TensorFlow 訓練應用程式。請閱讀 TensorFlow 使用 GPU 指南以下有關分配運算給 GPU 的章節,以確保應用程式使用的是可用的 GPU。

在 GPU 上執行某些模型並不具備優勢,我們建議您將 GPU 用在需要進行許多數學運算的大型複雜模型上。但即使這樣,您仍應透過訓練執行一小部分資料範例,測試 GPU 支援的優勢。

要求 GPU 就緒的機器

如要在雲端使用 GPU,可使用下列三種方式之一,設定訓練工作以存取 GPU 就緒的機器:使用 BASIC_GPU 資源調度層級、使用 GPU 就緒的 AI Platform 機器類型,或是使用可附加 GPU 的 Compute Engine 機器類型。

GPU 就緒機器基本型

如果您正在學習如何使用 AI Platform 或嘗試使用 GPU 就緒的機器,則可將資源調度層級設為 BASIC_GPU,以取得採用一個 NVIDIA Tesla K80 GPU 的單一工作站執行個體。

備有 GPU 的機器類型

欲自行定義 GPU 的使用方式,以 GPU 就緒的機器類型設定訓練工作:

  • 將資源調度層級設為 CUSTOM
  • 根據工作需要的 GPU 數量和加速器類型,設定每項工作 (主要執行個體、工作站或參數伺服器) 使用的支援 GPU 機器類型,如下:
    • standard_gpu:一個 NVIDIA Tesla K80 GPU
    • complex_model_m_gpu:四個 NVIDIA Tesla K80 GPU
    • complex_model_l_gpu:八個 NVIDIA Tesla K80 GPU
    • standard_p100:一個 NVIDIA Tesla P100 GPU
    • complex_model_m_p100:四個 NVIDIA Tesla P100 GPU
    • standard_v100:一個 NVIDIA Tesla V100 GPU
    • large_model_v100:一個 NVIDIA Tesla V100 GPU
    • complex_model_m_v100:四個 NVIDIA Tesla V100 GPU
    • complex_model_l_v100:八個 NVIDIA Tesla V100 GPU

以下內容是使用 gcloud 指令對 GPU 就緒機器類型交付工作的範例。

詳情請參閱比較機器類型

可附加 GPU 的 Compute Engine 機器類型

或是,如果預設以無 GPU 的 Compute Engine 機器類型來設定訓練工作的話,也可以透過附加自定數量的 GPU 加速工作進行。

  • 將資源調度層級設為 CUSTOM
  • 設定每個工作站的類型 (主要執行個體、工作站或參數伺服器) 以使用有效的 Compute Engine 機器類型。
  • 以您將設置的 masterConfigworkerConfigparameterServerConfig GPU 類型及數量,新增到 acceleratorConfig 欄位,可依據欲進行加速的虛擬機器而定。以下是可以使用的 GPU 類型:
    • NVIDIA_TESLA_K80
    • NVIDIA_TESLA_P4 (「Beta 版」)
    • NVIDIA_TESLA_P100
    • NVIDIA_TESLA_V100

欲建立合法的 acceleratorConfig,首先需認知到有幾項限制:

  1. 只能在設定中使用特定數量的 GPU,比如,您可以附加 2 個或 4 個 NVIDIA Tesla K80,但不能附加 3 個。請參閱下列相容性列表,來查看每種 GPU 類型可使用的合法數量。

  2. 必需確認每個 GPU 設定對您預計附加的機器類型上,提供充足的虛擬 CPU 及記憶體。舉例來說,若您使用 n1-standard-32 作為工作站,那每個工作站具有 32 個虛擬 CPU 及 120 GB 的記憶體。由於每個 NVIDIA Tesla V100 可提供最多 8 個虛擬 CPU 及 52 GB 記憶體,那麼每個 n1-standard-32 工作站則至少需附加 4 個這樣的 GPU,以滿足其需求。

    查看機器類型規格表,以及 GPU 的運算工作負載比較來決定相容性,或是參考下列相容性表格

    注意,以下是使用 AI Platform 的特殊情形,會對 GPU 資源產生的額外限制:

    • 在「所有」地區及區域,8 個 NVIDIA Tesla K80 GPU 的設定最多只提供 208 GB 的記憶體。
    • 在「所有」地區及區域,4 個 NVIDIA Tesla P100 GPU 的設定僅提供最多 64 個虛擬 CPU 及 208 GB 記憶體。
  3. 只能對支援您 GPU 設定的地區交付訓練工作。參閱下列支援地區。

以下快速比較表列出了每種 Compute Engine 機器類型,可附加的各種加速器數量:

各機器類型合法的 GPU 數量
機器類型 NVIDIA® Tesla® K80: NVIDIA Tesla P4 (測試版) NVIDIA Tesla P100 NVIDIA Tesla V100
n1-standard-4 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-standard-8 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-standard-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-standard-32 4、8 2、4 2、4 4、8
n1-standard-64 4 8
n1-standard-96 4 8
n1-highmem-2 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-highmem-4 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-highmem-8 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-highmem-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-highmem-32 4、8 2、4 2、4 4、8
n1-highmem-64 4 8
n1-highmem-96 4 8
n1-highcpu-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-highcpu-32 4、8 2、4 2、4 4、8
n1-highcpu-64 8 4 4 8
n1-highcpu-96 4 8

以下內容是使用已附加 GPU 的 Compute Engine 機器類型交付工作的範例。

支援 GPU 的地區

僅能在支援 GPU 的地區內執行工作。目前可存取 GPU 的地區如下:

  • us-east1
  • us-central1
  • us-west1
  • asia-east1
  • europe-west1
  • europe-west4

此外,某些地區只提供存取特定類型的 GPU。如要徹底瞭解 AI Platform 服務 (包括模型訓練以及線上/批次預測) 的可用地區,請閱讀地區指南

如果訓練工作中使用多種 GPU 類型,這些類型必須在您所在地區中的單一區域內皆為可用。舉例來說,不能在 us-central1 裡使用 NVIDIA Tesla V100 GPU 的主工作站、使用 NVIDIA Tesla K80 GPU 的參數伺服器,以及使用 NVIDIA Tesla P100 GPU 的工作站執行工作。雖然 us-central1 內所有的 GPU 都可用來進行訓練工作,但該地區中沒有任何一個區域同時提供這三種 GPU。如要進一步瞭解有關 GPU 的合法區域,請參閱 GPU 的運算工作負載比較

提交訓練工作

您可以使用 gcloud ml-engine jobs submit training 指令提交訓練工作。

  1. 定義 config.yaml 檔案以說明所需的 GPU 選項。YAML 檔案的結構代表工作資源。以下是兩個 config.yaml 檔案的範例。

    第一個範例呈現了使用 AI Platform 機器類型進行訓練工作的設定檔,其中有些含有 GPU:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: complex_model_m_gpu
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: complex_model_m_gpu
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: large_model
    

    接下來的範例所呈現的工作設定檔與上一個相似,但這個設定使用的是已附加 GPU 的 Compute Engine 機器類型。這類設定還在測試階段:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: n1-highcpu-16
      masterConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: n1-highcpu-16
      workerConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: n1-highmem-8
    
  2. 使用 gcloud 指令提交工作,包括指向 config.yaml 檔案的 --config 引數。下列範例假設您已為某些引數值設定環境變數 (以 $ 符號加上大寫字母表示):

    gcloud ml-engine jobs submit training $JOB_NAME \
            --package-path $APP_PACKAGE_PATH \
            --module-name $MAIN_APP_MODULE \
            --job-dir $JOB_DIR \
            --region us-central1 \
            --config config.yaml \
            -- \
            --user_arg_1 value_1 \
             ...
            --user_arg_n value_n
    

另一種方法則是若您安裝 gcloud beta 元件,就可以利用指令列標記指定叢集設定詳細資料,而不是在設定檔進行。進一步瞭解如何使用這些標記。如要安裝或更新 gcloud beta 元件,請執行 gcloud components install beta

以下範例,呈現與上述範例相同的設定來交付工作 (使用已附加 GPU 的 Compute Engine 機器類型),但未使用 config.yaml 檔:

gcloud beta ml-engine jobs submit training $JOB_NAME \
        --package-path $APP_PACKAGE_PATH \
        --module-name $MAIN_APP_MODULE \
        --job-dir $JOB_DIR \
        --region us-central1 \
        --scale-tier custom \
        --master-machine-type n1-highcpu-16 \
        --master-accelerator count=4,type=nvidia-tesla-k80 \
        --worker-server-count 9 \
        --worker-machine-type n1-highcpu-16 \
        --worker-accelerator count=4,type=nvidia-tesla-k80 \
        --parameter-server-count 3 \
        --parameter-server-machine-type n1-highmem-8 \
        -- \
        --user_arg_1 value_1 \
         ...
        --user_arg_n value_n

附註:

  • 如果您在設定檔 (config.yaml) 中指定選項,同時也以指令列標記指定選項,則指令列上的值會覆寫設定檔中的值。
  • 空白的 -- 標記用以標示 gcloud 特定標記的結尾,以及您要傳送到應用程式的 USER_ARGS 開頭。
  • AI Platform 的特定標記,例如 --module-name--runtime-version--job-dir,必須放在空白的 -- 標記之前。AI Platform 服務會解讀這些標記。
  • 由於 AI Platform 會使用 --job-dir 來驗證路徑,因此 --job-dir 標記 (如有指定) 必須放在空白的 -- 標記之前。
  • 您的應用程式也必須處理 --job-dir 標記 (如有指定)。即使標記位於空白的 -- 之前,--job-dir 也會做為指令列標記傳送到應用程式。
  • 您可以定義所需的 USER_ARGS 數量。AI Platform 會將 --user_first_arg--user_second_arg 等標記傳送到您的應用程式。

如要進一步瞭解工作提交選項,請參閱啟動訓練工作指南。

指派作業給 GPU

如要在機器上使用 GPU,請適當地修改 TensorFlow 訓練應用程式:

  • 高階 Estimator API:只要 ClusterSpec 的設定正確,就不需要變更程式碼。如果叢集混用 CPU 和 GPU,請將 ps 工作名稱對應到 CPU,將 worker 工作名稱對應到 GPU。

  • 核心 Tensorflow API:您必須指派要在支援 GPU 的機器上執行的作業。此程序和在本機使用 GPU 搭配 TensorFlow 相同。您可以使用 tf.train.replica_device_setter 指派作業給裝置。

當您將 GPU 就緒的機器指派給 AI Platform 程序時,程序就擁有該機器 GPU 的專屬存取權;您無法在多個程序之間共用叢集中某個機器的 GPU。程序對應到叢集規格中的分散式 TensorFlow 作業。如需叢集規格和工作的說明,請參閱分散式 TensorFlow 說明文件

GPU 裝置字串

系統會將 standard_gpu 機器的單一 GPU 識別為 "/gpu:0"。具有多個 GPU 的機器則會依序使用開頭是 "/gpu:0""/gpu:1" 等以此類推的識別碼。比方說,系統會將具有四個 GPU 的 complex_model_m_gpu 機器識別為 "/gpu:0""/gpu:3"

支援 GPU 的機器上的 Python 套件

支援 GPU 的機器會預先安裝 tensorflow-gpu,這個 TensorFlow Python 套件提供 GPU 支援。如需所有預先安裝套件的清單,請參閱 Cloud ML 執行階段版本清單

維護事件

如果您在訓練工作中使用 GPU 機器,請注意基礎虛擬機器偶爾得配合 Compute Engine 主機維護作業。用於訓練工作的 GPU 就緒虛擬機器,已被設定為在維護工作完成後自動重啟,但您可能尚需執行額外作業,才能確保工作不受停機影響。設定您的訓練應用程式定期儲存模型查核點 (通常跟您以 --job-dir 參數對 gcloud ml-engine jobs submit training 設定的 Cloud Storage 路徑一樣),並在查核點已存在的情況下還原至最新的查核點。

TensorFlow Estimator API 會為您執行此功能,因此如果模型已納入 Estimator 中,您就不用擔心要如何進行 GPU 工作站維護作業。

如果您無法將模型納入 TensorFlow Estimator 中,但又希望支援 GPU 的訓練工作能從維護事件中恢復運作,您必須將查核點儲存及還原功能手動寫入模組。針對這類作業,TensorFlow 在 tf.train 模組中提供了幾項有用的資源,其中 tf.train.checkpoint_existstf.train.latest_checkpoint 特別實用。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
TensorFlow 的 AI Platform