在 Compute Engine 上執行分散式 TensorFlow

本教學課程示範如何在多個 Compute Engine 執行個體上使用 TensorFlow 的分散式設定,利用 MNIST 資料集來訓練卷積類神經網路模型。MNIST 資料集促成手寫數字辨識功能,在機器學習中普遍用做圖片辨識的訓鍊資料集。

TensorFlow 是 Google 機器學習的開放原始碼程式庫,由 Google 機器智能機構 (Google 其中一個研究單位) 的研究人員和工程師所開發。TensorFlow 的設計主旨是在多台電腦上執行以分散訓練工作負載。在本教學課程中,您將在多個 Compute Engine 虛擬機器執行個體上執行 TensorFlow 來訓練模型。您可以改用 Cloud Machine Learning Engine 管理資源分配工作及託管訓練模型。除非您有不想使用的具體原因,否則建議您使用 Cloud ML Engine。詳情請參閱使用 Cloud ML Engine 和 Cloud Datalab 的這一版教學課程

下圖說明的架構在 Compute Engine 上執行 TensorFlow 的分散式設定,以及將 Cloud ML Engine 與 Cloud Datalab 搭配使用以透過訓練過的模型執行預測。

圖片

本教學課程將示範如何設定及使用這個架構,並在過程中提供某些概念的說明。

目標

  • 設定 Compute Engine 以建立要執行 TensorFlow 的虛擬機器 (VM) 叢集。
  • 瞭解如何在 Compute Engine 叢集上執行分散式 TensorFlow 程式碼範例以訓練模型。程式碼範例會使用最新 TensorFlow 程式庫和模式,這樣您就能在設計自己的訓練程式碼時用來當做參考。
  • 將經過訓練的模型部署至 Cloud ML Engine 以建立用於預測的自訂 API,然後使用 Cloud Datalab 筆記本執行預測。

費用

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

事前準備

  1. 登入您的 Google 帳戶。

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

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

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

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

    瞭解如何啟用計費功能

  4. 啟用Compute Engine and Cloud Machine Learning API。

    啟用 API

建立範本執行個體

本教學課程使用 Cloud Shell,這是可在 Google Cloud Platform 主控台正常使用的 Linux shell。

  1. 前往 Cloud Shell。

    開啟 Cloud Shell

  2. 設定預設 Compute Engine 區域及預設專案:

    gcloud config set compute/zone us-east1-c
    gcloud config set project [YOUR_PROJECT_ID]
  3. 複製 GitHub 存放區:

    git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
    cd cloudml-dist-mnist-example
  4. 從 Ubuntu Wily 映像檔中建立初始 VM 執行個體:

    gcloud compute instances create template-instance \
    --image-project ubuntu-os-cloud \
    --image-family ubuntu-1604-lts \
    --boot-disk-size 10GB \
    --machine-type n1-standard-1
  5. 使用 SSH 連線至 VM:

    gcloud compute ssh template-instance
  6. 安裝 pip

    sudo apt-get update
    sudo apt-get -y upgrade \
    && sudo apt-get install -y python-pip python-dev
  7. 安裝 TensorFlow:

    sudo pip install tensorflow
    
  8. (選用) 按照相關步驟驗證安裝

  9. 輸入 exit 以返回 Cloud Shell。

  10. 檢查 Cloud Shell 執行個體中執行的 TensorFlow 版本:

    sudo python -c 'import tensorflow as tf; print(tf.__version__)'
  11. 如果版本低於 1.2.1,請使用 pip 進行升級:

    sudo pip install --upgrade tensorflow

建立 Cloud Storage 值區

接下來,建立 Cloud Storage 值區以儲存 MNIST 檔案。請按照下列步驟操作:

  1. 建立地區 Cloud Storage 值區,以保存要在工作站執行個體間共用的 MNIST 資料檔案:

    MNIST_BUCKET="mnist-$RANDOM"
    gsutil mb -c regional -l us-east1 gs://${MNIST_BUCKET}
  2. 使用下列指令碼,下載 MNIST 資料檔案並複製到值區:

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

建立範本映像檔及訓練執行個體

如要建立工作站執行個體、主要執行個體及參數伺服器執行個體,請將範本執行個體轉換為映像檔,然後使用該映像檔建立各個新的執行個體。

  1. template-instance VM 關閉 auto-delete,這會在刪除 VM 時保留磁碟:

    gcloud compute instances set-disk-auto-delete template-instance \
    --disk template-instance --no-auto-delete
  2. 刪除 template-instance

    gcloud compute instances delete template-instance
  3. template-instance 磁碟建立映像檔 template-image

    gcloud compute images create template-image \
    --source-disk template-instance
  4. 建立其他執行個體。請針對本教學課程建立四個執行個體,並命名為 master-0worker-0worker-1ps-0storage-rw 範圍可讓執行個體存取 Cloud Storage 值區。請務必使用空格來區隔這些執行個體名稱,如下所示:

    gcloud compute instances create \
    master-0 worker-0 worker-1 ps-0 \
    --image template-image \
    --machine-type n1-standard-4 \
    --scopes=default,storage-rw

叢集可以開始執行分散式 TensorFlow 了。

執行分散式 TensorFlow 程式碼

在本節中您將執行指令碼,指示所有 VM 執行個體執行 TensorFlow 程式碼來訓練模型。

在 Cloud Shell 中,從 cloudml-dist-mnist-example 目錄執行下列指令:

./scripts/start-training.sh gs://${MNIST_BUCKET}

名為 start-training.sh 的指令碼會將程式碼推送至每個 VM,並傳送必要的參數,在每個機器上啟動 TensorFlow 程序來建立分散式叢集。Cloud Shell 中的輸出串流會顯示測試資料集的損失及準確率值。

終端機中的準確率值

訓練完成後,指令碼會列出新產生模型檔案的位置:

Trained model is stored in gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/

複製值區路徑的位置,以供稍後的步驟使用。

發佈模型以執行預測作業

您已成功產生可用來執行預測作業的新模型。訓練更精密的模型需要使用更複雜的 TensorFlow 程式碼,但運算與儲存空間資源的設定是類似的。

訓練模型只算是完成一半的工作。您必須將模型整合至應用程式中,或透過驗證在模型中納入 API 服務,最後再進行整個模型的資源調度。您還必須進行比較大量的工程工作,才能讓模型變得實用。

Cloud ML Engine 可協助您進行其中一部分的工作。Cloud ML Engine 是在 Cloud Platform 上執行的 TensorFlow 全代管版本。Cloud ML Engine 提供您所有強大的 TensorFlow 功能,無須設定任何額外的基礎架構或安裝任何軟體。您可以自動調度分散式訓練的資源以使用數千個 CPU 或 GPU,而且只需針對使用的內容付費。

由於 Cloud ML Engine 是在後端執行 TensorFlow,所有工作在任何環境中都可使用,而且不必受制於專屬工具。

請嘗試透過使用分散式 TensorFlow 和 Cloud Datalab 教學課程,運用相同的程式碼範例,透過 Cloud ML Engine 訓練您的模型。

您也可以設定 Cloud ML Engine 來託管模型以執行預測工作。請使用下列步驟,將模型發佈至 Cloud ML Engine。託管模型有助於讓您能夠快速執行測試並大規模地套用模型,以及享有預期可從 Google 代管服務獲得的所有安全性與可靠性功能。

下列步驟使用上述 start-training.sh 指令碼在前面輸出的模型值區路徑。

  1. 輸入您的 Cloud Storage 值區及產生的模型的輸出路徑,格式如下,其中 [JOB_ID] 為工作 ID。您會在下一個步驟中使用這個路徑:

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]
  2. 使用 gcloud 指令列工具,定義新的 v1 版本模型,並將它指向值區中的模型檔案。下列指令可能需要幾分鐘的時間才能完成。將 [YOUR_BUCKET_PATH] 替換為上一步的輸出路徑。路徑的開頭為 gs://

    MODEL="MNIST"
    MODEL_BUCKET=[YOUR_BUCKET_PATH]
    gcloud ml-engine models create ${MODEL} --regions us-east1
    gcloud ml-engine versions create \
     --origin=${MODEL_BUCKET} --model=${MODEL} v1
  3. 將模型的預設版本設為「v1」:

    gcloud ml-engine versions set-default --model=${MODEL} v1

模型現可透過 Cloud ML 執行,而且能夠處理預測作業。在下一節中,您將使用 Cloud Datalab 執行並以視覺化方式呈現預測結果。

使用 Cloud Datalab 執行預測作業

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

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

    datalab create mnist-datalab
    
  2. 在 Cloud Shell 中,按一下 Cloud Shell 的 [Web preview] (網頁預覽) (右上角的方形圖示),以啟動 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. 預測的輸出為長度 10 的陣列,其中每個索引 (0-9) 都含有對應至該數字的數值。數值愈接近 1,這個索引與輸入數字相符的可能性就愈高。您可以看到清單中醒目顯示的數字 3 運算值非常接近 1,因此符合該數字的機率很高。

    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]

筆記本中的最後一個儲存格會顯示一張長條圖,清楚顯示它預測的數字 (在本例中為 3)。

長條圖顯示已選取數字 3。

清理

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

  1. 刪除模型的版本:

    gcloud ml-engine versions delete v1 --model=MNIST
  2. 刪除模型:

    gcloud ml-engine models delete MNIST
  3. 刪除 Cloud Storage 值區:

    gsutil rm -r gs://${MNIST_BUCKET}
  4. 刪除虛擬機器,包括 Cloud Datalab:

    gcloud compute instances delete master-0 worker-0 worker-1 ps-0 mnist-datalab
  5. 刪除 VM 範本映像檔:

    gcloud compute images delete template-image
  6. 刪除 Cloud Datalab 永久磁碟:

    gcloud compute disks delete mnist-datalab-pd --zone us-east1-c

後續步驟

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

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

這個網頁
解決方案