使用分散式 TensorFlow 搭配 Cloud ML Engine 和 Cloud Datalab

本教學課程示範如何在 Google Cloud Machine Learning Engine 上使用以 Python 撰寫的 TensorFlow 程式碼的分散式設定,利用 MNIST 資料集訓練卷積類神經網路模型。您可以使用 TensorBoard 以視覺化方式呈現訓練程序和 Google Cloud Datalab 以測試預測。

TensorFlow 是 Google 機器學習的開放原始碼程式庫,由 Google 機器智能機構 (Google 其中一個研究單位) 的研究人員和工程師所開發。TensorFlow 的設計主旨是在多台電腦上執行以分散訓練工作負載,且 Cloud Machine Learning Engine 提供的代管服務可讓您使用服務 API 以分散方式執行 TensorFlow 程式碼。

在本教學課程中,「節點」一詞是指訓練期間執行平行運算的應用程式容器。

關於資料

MNIST 資料集促成手寫數字辨識功能,在機器學習中普遍用做圖片辨識的訓鍊資料集。

這個資料集含有大量 0 到 9 範圍內的手寫數字圖片,以及識別每張圖片內數字的標籤。

這個教學課程會訓練機器學習模型依據 MNIST 資料集建立圖片分類。訓練後,模型會依據從 MNIST 資料集學到的手寫圖片資訊,將收到的圖片分成 10 個類別 (0 到 9)。然後,您可以向模型傳送之前未曾看過的圖片,模型會依據在訓練期間學到的知識來識別圖片中的數字。

MNIST 資料集分成三個部分:

  • 55,000 個訓練資料範例
  • 10,000 個測試資料範例
  • 5,000 個驗證資料範例

如需進一步瞭解資料集,請瀏覽 MNIST 資料集網站

瞭解類神經網路

在電腦程式設計中,人類會使用許多行的程式碼來指定每個步驟,進而指示電腦如何解決問題。有了機器學習和類神經網路,您可以讓電腦改為透過範例解決問題。

類神經網路是一種數學函式,可以從訓練資料集學習指定輸入的預期輸出。下圖說明類神經網路經過訓練可以從貓的圖片輸出「貓」的文字。

類神經網路模型是一種可以透過範例加以訓練的函式。

您可以看到類神經網路模型是由多層計算單元組成,其中的每一層都含有可設定的參數。訓練模型的目的是將參數最佳化,以取得準確率最高的結果。訓練演算法會在透過模型分批處理訓練資料集時進行調整。如果您將訓練程序分散到多個運算節點,則必須有辦法追蹤所有節點共用的參數變化。

分散式訓練的架構

使用多個節點訓練模型有三種基本策略:

  • 採用同步更新的資料平行訓練。
  • 採用非同步更新的資料平行訓練。
  • 模型平行訓練。

本教學課程中的程式碼範例在 Cloud ML Engine 上使用「非同步更新」的「資料平行訓練」。在此案例中,訓練工作是以下列類型的節點執行:

  • 參數伺服器節點。使用工作站及主要工作站節點的梯度向量更新參數。
  • 工作站節點。根據訓練資料集計算梯度向量。
  • 主要工作站節點。除了用做其中一個工作站節點外,還負責協調多個工作站的作業。

因為不論在哪一種模型結構中,您都可以使用資料平行策略,因此將分散式訓練方法套用於自訂模型是很好的起點。在資料平行訓練中,整個模型會與所有工作站節點一起共用。每個節點會各自依據部分訓練資料集單獨計算梯度向量,採用的方式與小批處理的方式相同。系統會將計算好的梯度向量收集到參數伺服器節點,並以梯度向量的總和來更新模型參數。如果您在 10 個工作站節點中分配 10,000 個批次,則每個節點大約處理 1,000 個批次。

資料平行訓練可以透過同步或非同步更新執行。使用非同步更新時,參數伺服器會在接收其中一個工作站節點的梯度向量後,立即個別套用每個梯度向量,如下圖所示。

採用非同步更新的資料平行訓練。

在一般部署中,會有一些參數伺服器節點、一個主要工作站節點和數個工作站節點。透過服務 API 提交訓練工作時,這些節點會自動部署在您的專案中。

下圖說明在 Cloud ML Engine 上執行分散式訓練工作及使用 Cloud Datalab 透過訓練過的模型執行預測的架構。

教學課程使用的架構。

目標

  • 在 Cloud ML Engine 上執行分散式 TensorFlow 程式碼範例。
  • 將訓練過的模型部署到 Cloud ML Engine 以建立用於預測的自訂 API。
  • 使用 TensorBoard 以視覺化方式呈現訓練程序。
  • 使用 Cloud Datalab 測試預測。

費用

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

  • Cloud ML Engine
  • Google Cloud Storage
  • Google Compute Engine
  • Compute Engine Persistent Disk

假設您一整天使用每一種資源,並以這個 Pricing Calculator 為準,執行本教學課程的預估費用約為 $1.20 美元。

事前準備

  1. 登入您的 Google 帳戶。

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

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

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

    瞭解如何啟用計費功能

  4. 啟用AI Platform ("Cloud Machine Learning Engine") and Compute Engine API。

    啟用 API

驗證 Google Cloud SDK 元件

  1. 前往 Cloud Shell。

    開啟 Cloud Shell

  2. 列出模型,以確認指令是否傳回空白清單:

    gcloud ai-platform models list
    

    確認指令傳回空白清單:

    Listed 0 items.

如果您已經使用過 Cloud ML Engine,則會顯示與您的帳戶相關的所有模型清單。

下載範例檔案

下載範例檔案並設定目前的目錄。

git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
cd cloudml-dist-mnist-example

建立 MNIST 檔案使用的 Cloud Storage 值區

  1. 建立 regional Cloud Storage 值區,以保存用來訓練模型的 MNIST 資料檔案。

    PROJECT_ID=$(gcloud config list project --format "value(core.project)")
    BUCKET="${PROJECT_ID}-ml"
    gsutil mb -c regional -l us-central1 gs://${BUCKET}
    
  2. 使用下列指令碼,下載 MNIST 資料檔案並複製到值區。

    ./scripts/create_records.py
    gsutil cp /tmp/data/train.tfrecords gs://${BUCKET}/data/
    gsutil cp /tmp/data/test.tfrecords gs://${BUCKET}/data/
    

在 Cloud Machine Learning Engine 中訓練模型

  1. 向 Cloud ML Engine 提交訓練工作。

    JOB_NAME="job_$(date +%Y%m%d_%H%M%S)"
    gcloud ai-platform jobs submit training ${JOB_NAME} \
        --package-path trainer \
        --module-name trainer.task \
        --staging-bucket gs://${BUCKET} \
        --job-dir gs://${BUCKET}/${JOB_NAME} \
        --runtime-version 1.2 \
        --region us-central1 \
        --config config/config.yaml \
        -- \
        --data_dir gs://${BUCKET}/data \
        --output_dir gs://${BUCKET}/${JOB_NAME} \
        --train_steps 10000
    

    --train_steps 選項指定訓練批次總數。

    您可以在設定檔 config/config.yaml 中指定資源調度層級,以控制分配給訓練工作的資源數量。工作開始在多個節點上執行時,即會將 --package-path 參數指定的訓練程式目錄中的相同 Python 程式碼部署在所有節點上。下表列出訓練程式目錄中的檔案及相關功能:

    檔案 說明
    'setup.py' 設定指令碼以在節點上安裝其他模組。
    'model.py' 定義卷積類神經網路模型的 TensorFlow 程式碼。
    'task.py' 執行訓練工作的 TensorFlow 程式碼。在此範例中,使用 Experiment API 以分散方式執行訓練迴圈。
  2. 在 Google Cloud Platform 主控台開啟「ML Engine」頁面以尋找正在執行的工作。

    開啟 CLOUD ML ENGINE

  3. 按一下工作 ID 以尋找記錄檢視器的連結。程式碼範例顯示訓練期間的記錄進度。例如,每個工作站節點會按某些間隔顯示訓練損失值,表示單一訓練批次中資料集的總損失值。此外,主要工作站節點也會顯示測試集的損失和準確率。訓練結束時,將顯示測試集的最終評估。在此範例中,測試集的訓練達到 99.3% 的準確率。

    Saving dict for global step 10008: accuracy = 0.9931, global_step = 10008, loss = 0.0315906
  4. 訓練之後,會將訓練過的模型匯出至儲存空間值區。您可以使用下列指令,找出模型二進位檔所在目錄的儲存空間路徑。

    gsutil ls gs://${BUCKET}/${JOB_NAME}/export/Servo | tail -1

    輸出應如下所示:

    gs://${BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/

使用 TensorBoard 以視覺化方式呈現訓練程序

訓練後,摘要資料都儲存在 gs://${BUCKET}/${JOB_NAME},您可以使用 TensorBoard 以視覺化方式呈現這些資料。

  1. 在 Cloud Shell 中執行下列指令以啟動 TensorBoard。

    tensorboard --port 8080 --logdir gs://${BUCKET}/${JOB_NAME}
  2. 如要開啟新的瀏覽器視窗,請從 Cloud Shell 工具列右上角的 [Web preview] (網頁預覽) 選單中選取 [Preview on port 8080] (在通訊埠 8080 上預覽)

  3. 在新的視窗中,您可以使用 TensorBoard 來查看訓練摘要及視覺化的網路圖。在 Cloud Shell 中按下「Control+C」以停止 TensorBoard。

    TensorBoard 顯示訓練摘要和網路圖。

部署訓練過的模型以執行預測作業

使用模型二進位檔部署訓練過的模型以執行預測作業。

  1. 部署模型並設定預設版本。

    MODEL_NAME=MNIST
    gcloud ai-platform models create --regions us-central1 ${MODEL_NAME}
    VERSION_NAME=v1
    ORIGIN=$(gsutil ls gs://${BUCKET}/${JOB_NAME}/export/Servo | tail -1)
    gcloud ai-platform versions create \
        --origin ${ORIGIN} \
        --model ${MODEL_NAME} \
        ${VERSION_NAME}
    gcloud ai-platform versions set-default --model ${MODEL_NAME} ${VERSION_NAME}
    

    MODEL_NAMEVERSION_NAME 可以是任意值,但您不能重複使用相同名稱。第一個版本不需要最後一個指令,因為它會自動變成預設版本。但明確設定預設版本是不錯的做法。

    部署的模型需要幾分鐘的時間才能準備就緒。模型在準備就緒之前,如果收到要求,則會傳回 HTTP 503 錯誤。

  2. 使用範例要求檔案測試 Prediction API。

    ./scripts/make_request.py

    這個指令碼會建立名稱為 request.json 的 JSON 檔案,其中含有 10 個用來執行預測的測試圖片。

  3. 提交線上預測要求。

    gcloud ai-platform predict --model ${MODEL_NAME} --json-instances request.json

    您應該會收到類似下面的回應:

    CLASSES  PROBABILITIES
    7        [3.437006127094938e-21, 5.562060376991084e-16, 2.5538862785511466e-19, 7.567420805782991e-17, 2.891652426709158e-16, 2.2750016241705544e-20, 1.837758172149778e-24, 1.0, 6.893573298530907e-19, 8.065571390565747e-15]
    2        [1.2471907477623206e-23, 2.291396136267388e-25, 1.0, 1.294716955176118e-32, 3.952643278911311e-25, 3.526924652059716e-36, 3.607279481567486e-25, 1.8093850397574458e-30, 7.008172489249426e-26, 2.6986217649454554e-29]
    ...
    9        [5.124952379488745e-22, 1.917571388490136e-20, 2.02434602684524e-21, 2.1246177460406675e-18, 1.8790316524963657e-11, 2.7904309518969085e-14, 7.973171243464317e-26, 6.233734909559877e-14, 9.224547341257772e-12, 1.0]
    

CLASSES 是指定圖片中最可能的數字,而 PROBABILITIES 則顯示每個數字的機率。

使用 Cloud Datalab 執行預測

如要測試預測,請建立 Cloud Datalab 執行個體,這個樣本使用互動式 Jupyter Notebook 執行程式碼。

  1. 在 Cloud Shell 中,輸入下列指令以建立 Cloud Datalab 執行個體。

    datalab create mnist-datalab --zone us-central1-a
  2. 您可以在 Cloud Shell 中按一下 [Cloud Shell Web preview] (Cloud Shell 網頁預覽) (右上角的方形圖示),以開啟 Cloud Datalab 筆記本清單頁面。

  3. 選取 [Change port] (變更通訊埠) 並選取 [Port 8081] (通訊埠 8081),在瀏覽器中開啟新的分頁。

  4. 在 Datalab 應用程式中,按一下左上角的「+Notebook」圖示以建立新的筆記本。

  5. 將下列文字貼到新筆記本的第一個儲存格。

    %%bash
    wget https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-dist-mnist-example/master/notebooks/Online%20prediction%20example.ipynb
    cat Online\ prediction\ example.ipynb > Untitled\ Notebook.ipynb
    
  6. 按一下頁面頂端的 [Run] (執行) 指令,下載「Online prediction example.ipynb」筆記本,然後將內容複製到當前的筆記本。

  7. 重新整理瀏覽器頁面以載入新的筆記本內容。接著選取含有 JavaScript 程式碼的第一個儲存格,按一下 [Run] (執行) 指令以執行程式碼。

  8. 向下捲動頁面,直到您看到數字繪圖面板,然後用游標繪製一個數字。

    手工繪製的數字 3。

  9. 按一下下一個儲存格以啟動它,然後按一下頂端 [Run] (執行) 按鈕旁的向下箭號,並選取 [Run from this Cell] (從這個儲存格執行)

  10. 預測的輸出會傳回一個類別標籤和一份機率清單。類別標籤指出輸入數字的預測結果。在機率清單中,從 0 到 9 的每個索引都含有一個數字。數字愈接近 1,這個索引與輸入數字相符的可能性就愈高。在以下範例中,您可以看到清單中醒目顯示的數字 3 運算值非常接近 1。因此,預測結果是 3。

    CLASSES
    3
    PROBABILITIES
    [4.181503356903704e-07,
    7.12400151314796e-07,
    0.00017898145597428083,
    0.9955494403839111,
    5.323939553103507e-11,
    0.004269002005457878,
    7.927398321116996e-11,
    1.2688398953741853e-07,
    1.0825967819982907e-06,
    2.2037748692582682e-07]
    
  11. 筆記本中的最後一個儲存格會繪製一張長條圖,讓您可以查看它預測的數字。

    長條圖在數字 3 顯示長條。

清除

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

刪除所有資源的最簡單方式,就是刪除您為本教學課程建立的專案。

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

後續步驟

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

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

這個網頁
TensorFlow 適用的 AI Platform