在 Cloud TPU 上訓練 ResNet

本教學課程中的模型是以圖像識別的深度殘差學習為基礎,該論文首度提出殘差網路 (ResNet) 架構的概念。此教學課程使用含 50 層的變體 (ResNet-50),並說明如何使用 TPUEstimator 訓練模型。

目標

  • 建立 Cloud Storage 值區以保存資料集和模型輸出結果。
  • 準備 ImageNet 資料集的測試版本,這個版本也稱為「fake_imagenet」資料集。
  • 執行訓練工作。
  • 驗證輸出結果。

費用

本教學課程使用的 Google Cloud Platform 收費元件包括:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

您可以使用 Pricing Calculator 來依據預測用量估算費用。初次使用 GCP 的使用者可能符合申請免費試用的資格。

事前準備

開始本教學課程前,請先檢查您的 Google Cloud Platform 專案設定是否正確。

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 在 GCP Console 的專案選擇器頁面中,選取或建立 GCP 專案。

    前往專案選取器頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。瞭解如何確認您已啟用專案的計費功能

  4. 本次逐步操作教學課程中使用的 Google Cloud Platform 元件會產生費用,請參閱 Cloud TPU 定價頁面來估算費用。使用完畢後,請務必清除您建立的資源,以避免產生不必要的費用。

設定資源

本節說明為教學課程設定 Cloud Storage 儲存空間、VM 和 Cloud TPU 資源的資訊。

  1. 開啟 Cloud Shell 視窗。

    開啟 Cloud Shell

  2. 為專案名稱建立變數。

    export PROJECT_NAME=project_name
    
  3. 設定 gcloud 指令列工具,以便使用您要在當中建立 Cloud TPU 的專案。

    gcloud config set project ${PROJECT_NAME}
    
  4. 請使用下列指令來建立 Cloud Storage 值區:

    gsutil mb -p ${PROJECT_NAME} -c standard -l europe-west4 -b on gs://bucket-name/
    

    這個 Cloud Storage 值區會儲存訓練模型所用的資料和訓練結果。這個教學課程中使用的 ctpu up 工具會為 Cloud TPU 服務帳戶設定預設權限。如要設定更精細的權限,請查看存取層級權限

    值區所在的地區必須與虛擬機器 (VM) 和 TPU 節點相同。VM 和 TPU 節點位於特定區域 (某個地區中的子地區)。

  5. 使用 ctpu up 指令來啟動這個教學課程所需的 Compute Engine 和 Cloud TPU 資源。

    ctpu up --zone=europe-west4-a \
    --vm-only \
    --disk-size-gb=300 \
    --machine-type=n1-standard-8 \
    --tf-version=1.14 \
    --name=resnet-tutorial

    如要進一步瞭解 ctpu 公用程式,請參閱 ctpu 參考資料一文。

  6. 如果系統顯示提示訊息,請按下 y 來建立 Cloud TPU 資源。

ctpu up 指令執行完畢之後,請確認您的殼層提示已從 username@project 變更為 username@tpuname。提示改變代表您現在已登入 Compute Engine VM。如果您未連結至 Compute Engine 執行個體,請執行下列指令:

gcloud compute ssh resnet-tutorial --zone=europe-west4-a

從這裡開始,(vm)$ 前置字串代表您應該在 Compute Engine VM 執行個體中執行指令。

準備資料

設定下列環境變數,並將 bucket-name 替換為您的 Cloud Storage 值區名稱:

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_BUCKET=${STORAGE_BUCKET}/resnet

訓練應用程式應能存取 Cloud Storage 中的訓練資料,它還會在訓練期間使用您的 Cloud Storage 值區來儲存查核點。

使用 fake_imagenet 訓練及評估 ResNet 模型

ImageNet 是圖片資料庫。這個資料庫中的圖片是以階層來分類的,階層中每個節點都代表千百張圖片。

本教學課程使用完整 ImageNet 資料集的示範版本,它也稱為「fake_imagenet」。這個範例版本不僅可以讓您在教學課程中進行測試,也能減少您通常在運用完整的 ImageNet 資料庫執行模型時所需的儲存空間和時間。

fake_imagenet 資料集位於 Cloud Storage 中的以下位置:

gs://cloud-tpu-test-datasets/fake_imagenet

fake_imagenet 資料集只適合用來瞭解 Cloud TPU 的使用方式及驗證端對端成效,其準確率數據和儲存的模型沒有任何實用價值。

如要瞭解如何下載及處理完整的 ImageNet 資料集,請參閱下載、預先處理及上傳 ImageNet 資料集一文。

  1. 使用 ctpu 公用程式啟動 Cloud TPU 資源。

    (vm)$ ctpu up --tpu-only --tpu-size=v2-8 --name=resnet-tutorial
    
  2. 使用下列指令將頂層 /models 資料夾新增至 Python 路徑

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    

    ResNet-50 模型已預先安裝在 Compute Engine VM 上。

  3. 請前往以下目錄:

    (vm)$ cd /usr/share/tpu/models/official/resnet/
    
  4. 執行訓練指令碼。

    (vm)$ python resnet_main.py \
     --tpu=resnet-tutorial \
     --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
     --model_dir=${MODEL_BUCKET} \
     --config_file=configs/cloud/v2-8.yaml
    
    參數 說明
    tpu 指定 Cloud TPU 的名稱。提醒您,ctpu 會將這個名稱當做環境變數 (TPU_NAME) 並傳送至 Compute Engine VM。
    data_dir 指定訓練輸入內容的 Cloud Storage 路徑。在這個範例中,這項元素是設為 fake_imagenet 資料集的路徑。
    model_dir 指定模型訓練期間用來儲存查核點和摘要的目錄。如果資料夾遺失,程式會自行建立一個資料夾。您在使用 Cloud TPU 時,model_dir 必須是 Cloud Storage 路徑 (「gs://...」)。您可以重複使用現有的資料夾來載入目前的查核點資料及儲存其他查核點,不過前提是這些查核點必須以大小和 TensorFlow 版本均相同的 TPU 建立。
    config_file 指定要在訓練期間使用的 YAML 設定檔。這個檔案的名稱會對應使用的 TPU 類型。例如:v2-8.yaml

針對單一 Cloud TPU 裝置,這套程序會完成 90 個訓練週期的 ResNet-50 模型訓練,並針對固定數量的步驟進行評估。 如果您使用指定的旗標,模型應該會在大約 10 小時內完成訓練。

由於訓練和評估是利用「fake_imagenet」資料集來完成的,因此輸出內容無法正確反映出利用真實的資料集來訓練和評估時所得的實際輸出內容。

此時,您可以結束本教學課程,並清除所用的 GCP 資源。或者,您可以進一步探索在 Cloud TPU Pod 上執行模型。

使用 Cloud TPU Pod 來調整模型規模

您可以使用 Cloud TPU Pod 來調整模型規模,在更短時間內獲得結果。完整支援的 ResNet-50 模型可與下列 Pod 配量搭配使用:

  • v2-32
  • v2-128
  • v2-256
  • v2-512
  • v3-32
  • v3-128
  • v3-256
  • v3-512
  • v3-1024
  • v3-2048

使用 Cloud TPU Pod 時,您必須先使用 Pod 來訓練模型,再透過單一 Cloud TPU 裝置評估模型。

使用 Cloud TPU Pod 進行訓練

  1. 刪除您為了在單一裝置上訓練模型而建立的 Cloud TPU 資源。

    (vm)$ ctpu delete --tpu-only --name=resnet-tutorial
  2. 執行 ctpu up 指令,並使用 tpu-size 參數來指定您要使用的 Pod 配量。舉例來說,下列指令會使用 v2-32 Pod 配量。

    (vm) $ctpu up --tpu-only --tpu-size=v2-32 --name=resnet-pod
    
  3. 更新 MODEL_BUCKET 目錄來儲存訓練資料。

    (vm) $ export MODEL_BUCKET=${STORAGE_BUCKET}/resnet-pod
    
  4. 訓練模型並更新 config_file 參數,藉此使用與所需 Pod 配量相對應的設定檔。舉例來說,下列指令碼會使用 v2-32.yaml 設定檔。

    (vm)$ python resnet_main.py \
      --tpu=resnet-pod \
      --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
      --model_dir=${MODEL_BUCKET} \
      --config_file=configs/cloud/v2-32.yaml
    

此程序會針對 fake_imagnet 資料集執行 35 個訓練週期的模型訓練。這項訓練針對 v3-128 Cloud TPU 約需 90 分鐘。

評估模型

您會在這個步驟中使用 Cloud TPU,以 fake_imagenet 驗證資料集評估上述的已訓練模型。

  1. 刪除您為了訓練模型而建立的 Cloud TPU 資源。

    (vm)$ ctpu delete --tpu-only --name=resnet-pod
  2. 啟動 v2-8 Cloud TPU。

    (vm)$ ctpu up --tpu-only --name=resnet-pod-eval
    
  3. 執行模型評估作業,不過這次請加上 mode 旗標並設為 eval

    (vm)$ python resnet_main.py \
     --tpu=resnet-pod-eval \
     --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
     --model_dir=${MODEL_BUCKET} \
     --mode=eval
     --config_file=configs/cloud/v2-8.yaml
    

這會產生類似以下內容的輸出結果:

Eval results: {'loss': 8.255788, 'top_1_accuracy': 0.0009969076, 'global_step': 0, 'top_5_accuracy': 0.005126953}. Elapsed seconds: 76

由於訓練和評估是利用「fake_imagenet」資料集來完成的,因此輸出內容無法正確反映出利用真實的資料集來訓練和評估時所得的實際輸出內容。

清除所用資源

如要避免系統向您的 Google Cloud Platform 帳戶收取在本教學課程中使用資源的相關費用:

  1. 如果您尚未中斷與 Compute Engine 執行個體之間的連線,請中斷連線:

    (vm)$ exit
    

    系統現在顯示的提示訊息應為 user@projectname,代表您位於 Cloud Shell。

  2. 在 Cloud Shell 中執行 ctpu delete 並輸入您在設定 Cloud TPU 時使用的 --zone 旗標,藉此刪除 Compute Engine VM 和 Cloud TPU:

    $ ctpu delete --zone=europe-west4-a
    
  3. 執行 ctpu status,確保 TPU 上沒有已分配的執行個體,以免產生不必要的 TPU 使用費用。刪除作業需要幾分鐘的時間才能完成。如果畫面顯示類似下方的回應,即代表沒有其他分配到的執行個體:

    2018/04/28 16:16:23 WARNING: Setting zone to "europe-west4-a"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 執行下列 gsutil 指令,但要將 YOUR-BUCKET-NAME 替換成您為本教學課程建立的 Cloud Storage 值區名稱:

    $ gsutil rm -r gs://bucket-name
    

後續步驟

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

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

這個網頁
Cloud TPU
需要協助嗎?請前往我們的支援網頁