使用 Cloud Bigtable 串流資料

Cloud Bigtable 是一項低延遲、可擴充的寬列架構儲存系統,能為您的機器學習模型儲存並提供訓練資料。使用 Cloud Bigtable 可以讓您超高速串流處理訓練資料,有效率地使用 Cloud TPU。

本教學課程將說明如何在 Cloud TPU 上訓練 TensorFlow ResNet-50 模型,並使用 Cloud Bigtable 託管您的訓練資料。這個程序會使用 TensorFlow 與 Cloud Bigtable 整合這項功能。

免責聲明

本教學課程使用的是第三方資料集,Google 不對此資料集的有效性或任何其他方面提供任何聲明、擔保或其他保證。

需求條件和限制

定義設定時請注意下列事項:

  • 您必須使用 TensorFlow 1.11 或更新版本,這些版本才提供 Cloud Bigtable 支援。
  • 如要對大量資料進行高效能的訓練工作 (Pod 規模),建議您使用 Cloud Bigtable;這個資料庫能以每秒數十到數百 GB 的單位處理數百 GB、甚至數百 TB 的資料。而對於不符合以上描述的工作負載,我們建議您使用 Cloud Storage。請注意,我們也建議針對即時產生訓練資料的強化學習 (RL) 工作負載使用 Cloud Bigtable。

關於模型和資料

本教學課程中的模型是以《圖像識別的深度殘差學習》為基礎,這篇論文提出了殘差網路 (ResNet) 架構的概念。本教學課程使用這個網路的 50 層變體,即 ResNet-50。

訓練資料集則是使用經常用來訓練圖像辨識系統的 ImageNet

教學課程使用 TPUEstimator 來訓練模型。TPUEstimator 是以高階 TensorFlow API tf.estimator 為基礎,建議在 Cloud TPU 上建構和執行機器學習模型的加以使用。這個 API 會隱藏大部分的低階實作作業來簡化模型開發程序,讓您可以更輕鬆地在 Cloud TPU 和 GPU 或 CPU 等其他平台之間切換。

事前準備

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

  1. 登入您的 Google 帳戶。

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

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

    前往專案選取器頁面

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

  4. 本逐步操作說明使用 GCP 的計費元件,請參閱 Cloud TPU 定價頁面來估算費用,並在完成所有程序後,按照指示清除使用的資源。

  5. 安裝包含 gcloud 指令列工具的 Cloud SDK。

    安裝 Cloud SDK

此外,如要進行本教學課程,您必須已在 Cloud Bigtable 中儲存資料。有關如何使用 Cloud Bigtable 的詳細資訊,請參閱 Cloud Bigtable 說明文件

建立 Cloud Bigtable 執行個體

建立 Cloud Bigtable 執行個體來串流您的訓練資料:

  1. 前往 GCP Console 的 Cloud Bigtable 頁面。

    前往 Cloud Bigtable 頁面

  2. 建立執行個體並指定下列選項:

    • 「Instance name」(執行個體名稱):有助您辨別執行個體的名稱。
    • 執行個體 ID:執行個體的永久識別碼。
    • 執行個體類型:選取 [實際運作] 以獲得最佳效能。
    • 儲存空間類型:選取 [HDD]。
    • 「Cluster ID」(叢集 ID):叢集的永久 ID。
    • 「Region」(地區):請選取地區。例如,us-central1。最佳做法是選取與您打算建立 TPU 節點相同的地區。如要瞭解各種 TPU 類型的可用地區/區域,請參閱 TPU 類型和區域頁面。
    • 「Zone」(區域):請選取區域。例如,us-central1-b。最佳做法是選取與您打算建立 TPU 節點相同的區域。如要瞭解各種 TPU 類型的可用地區/區域,請參閱 TPU 類型和區域頁面。

    您可以讓其他值保留原來的預設設定。詳情請參閱建立 Cloud Bigtable 執行個體的指南。

下載並設定 ctpu 工具

本指南使用的是 Cloud TPU 佈建公用程式 (ctpu),這套簡便的工具可以協助您設定及管理 Cloud TPU。本指南也假設您想在本機執行 ctpu 和 Cloud SDK,而不是使用 Cloud Shell。Cloud Shell 環境不適合執行冗長的程序 (例如下載 ImageNet 資料),因為 Cloud Shell 在閒置一段時間後就會逾時。

  1. 按照 ctpu 指南操作來下載、安裝及設定 ctpu

  2. gcloud 工具的環境設定專案、區域和地區,並將 YOUR-PROJECT-ID 替換為您的 GCP 專案 ID

    $ gcloud config set project YOUR-PROJECT-ID
    $ gcloud config set compute/region us-central1
    $ gcloud config set compute/zone us-central1-b
    
  3. 在 Cloud Shell 中輸入以下指令來檢查 ctpu 設定:

    $ ctpu print-config
    

    畫面上應會顯示與以下內容類似的訊息:

    2018/04/29 05:23:03 WARNING: Setting zone to "us-central1-b"
    ctpu configuration:
            name: [your TPU's name]
            project: [your-project-id]
            zone: us-central1-b
    If you would like to change the configuration for a single command invocation, please use the command line flags.
    If you would like to change the configuration generally, see `gcloud config configurations`.
    

    在輸出訊息中,「name」是 Cloud TPU 的名稱 (預設值為您的使用者名稱),「zone」是 TPU 節點的預設地理區域 (預設值為 us-central1-b)。如要瞭解各種類型的 TPU 於何處提供,請參閱 TPU 類型和區域頁面。執行 ctpu up 時,您可以變更名稱、區域和其他屬性,如下方所述。

設定 Cloud TPU 的存取權限

請為 Cloud TPU 服務帳戶設定以下存取權限:

  1. 授予權限讓 Cloud TPU 能針對您的 GCP 專案存取 Cloud Bigtable。(請注意,ctpu 根據預設已套用某些存取權限,但不包括這項。)

    $ ctpu auth add-bigtable
    

    您可以執行以下這個指令來查看 Cloud TPU 權限:

    $ ctpu auth list
    
  2. (選擇性操作) 更新 Cloud Storage 權限。ctpu up 指令會為 Cloud Storage 設定預設權限。如果您想要更精細地設定權限,請查看並更新存取層級權限

建立 Compute Engine VM 和 Cloud TPU

執行以下指令來設定 Compute Engine 虛擬機器 (VM) 和具備相關服務的 Cloud TPU。這種資源與服務組合稱為「Cloud TPU 群」

$ ctpu up [optional: --name --zone]

畫面上應會顯示類似以下格式的訊息:

ctpu will use the following configuration:

   Name: [your TPU's name]
   Zone: [your project's zone]
   GCP Project: [your project's name]
   TensorFlow Version: 1.14
   VM:
     Machine Type: [your machine type]
     Disk Size: [your disk size]
     Preemptible: [true or false]
   Cloud TPU:
     Size: [your TPU size]
     Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

輸入 y 並按下 Enter 鍵,即可建立 Cloud TPU 資源。

ctpu up 指令會執行以下工作:

  • 啟用 Compute Engine 和 Cloud TPU 服務。
  • 建立 Compute Engine VM 執行個體並預先安裝最新的穩定版 TensorFlow。
  • 使用相應版本的 TensorFlow 建立 Cloud TPU,並將 Cloud TPU 的名稱以環境變數 (TPU_NAME) 的形式傳送給 Compute Engine VM 執行個體。
  • 將特定的身分與存取權管理角色授予您的 Cloud TPU 服務帳戶,確保您的 Cloud TPU 可從 GCP 專案中存取需要的資源。
  • 執行其他檢查作業。
  • 登入新的 Compute Engine VM 執行個體。

您可以隨時執行 ctpu up。舉例來說,假如連至 Compute Engine VM 執行個體的 SSH 連線中斷,可執行 ctpu up 來恢復連線。(如果您變更了 --name--zone 的預設值,每次執行 ctpu up 時,都必須再重新指定一次。) 詳情請參閱 ctpu 說明文件

確認您已登入 VM 執行個體

ctpu up 指令執行完畢後,請確認您的殼層提示已從 username@project 變更為 username@tpuname。此變更代表您現在已登入 Compute Engine VM 執行個體。

設定一些實用的變數

在下列步驟中,只要看到指令前有 (vm)$ 前置字串,即表示該指令應在 Cloud TPU 群中的 Compute Engine VM 執行個體中執行:

接下來請設定一些環境變數,簡化本教學課程中的指令:

  1. 設定 PROJECT 變數,並將 YOUR-PROJECT-ID 替換為您的 GCP 專案 ID

    (vm)$ export PROJECT=YOUR-PROJECT-ID
    
  2. 設定 STORAGE_BUCKET 變數,並將 YOUR-BUCKET-NAME 替換為您的 Cloud Storage 值區名稱:

    (vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
    
  3. 設定 BIGTABLE_INSTANCE 變數,並將 YOUR-INSTANCE-ID 替換為您先前建立之 Cloud Bigtable 執行個體的 ID:

    (vm)$ export BIGTABLE_INSTANCE=YOUR-INSTANCE-ID
    

準備資料

將資料上傳至 Bigtable。訓練應用程式應該要能存取 Cloud Bigtable 中的訓練資料。如需如何將資料上傳到 Bigtable 的操作說明,請參閱 tensorflow_io/bigtable/README.md

(選擇性操作) 設定 TensorBoard

TensorBoard 提供一套專為以視覺化方式呈現 TensorFlow 資料而設計的工具。用這套工具進行監控時,有助於您找出處理過程中遇到的瓶頸,並為您提供改善效能的建議做法。

如果您目前不需監控模型的輸出結果,可以略過 TensorBoard 設定步驟。

如果您想要監控模型的輸出及效能,請按照設定 TensorBoard 的指南操作。

執行 ResNet-50 模型

如果資料已位於 Bigtable 資料庫,表示您現在可以開始在 Cloud TPU 上訓練和評估 ResNet-50 模型,並從 Cloud Bigtable 串流訓練資料。訓練應用程式會將已訓練的模型和中繼查核點寫入 Cloud Storage。

在您的 Compute Engine VM 執行個體上執行下列指令:

  1. 新增頂層 /models 資料夾到 Python 路徑:

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. 前往 Compute Engine VM 執行個體上預先安裝 ResNet-50 模型的目錄:

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

    (vm)$ python resnet_main.py \
      --tpu=$TPU_NAME \
      --model_dir=${STORAGE_BUCKET}/resnet \
      --bigtable_project=$PROJECT \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --bigtable_column_family=$FAMILY_NAME \
      --bigtable_column_qualifier=$COLUMN_QUALIFIER \
      --bigtable_train_prefix=$ROW_PREFIX_TRAIN \
      --bigtable_eval_prefix=$ROW_PREFIX_EVAL
    
    • --tpu 會指定 Cloud TPU 的名稱。提醒您,ctpu 會將此名稱以環境變數 (TPU_NAME) 的形式傳遞給 Compute Engine VM 執行個體。
    • --model_dir 會指定模型訓練期間用於儲存查核點和匯總的目錄。如果沒有資料夾,程式會自行建立一個資料夾。使用 Cloud TPU 時,model_dir 必須是 Cloud Storage 路徑 (gs://...)。您可以重複使用現有的資料夾來載入目前的查核點資料,並儲存其他的查核點,但前提是先前的查核點必須是使用相同大小和 TensorFlow 版本的 TPU 所建立。
    • --bigtable_project 會指定用於存放訓練資料之 Cloud Bigtable 執行個體的 GCP 專案 ID。如果您未指定這個值,程式就會假設您的 Cloud TPU 和 Cloud Bigtable 執行個體位於同一個 GCP 專案。
    • --bigtable_instance 會指定用於存放訓練資料之 Cloud Bigtable 執行個體的 ID。
    • --bigtable_table 會指定用於存放訓練資料的 Cloud Bigtable 資料表名稱。
    • --bigtable_column_family 會指定 Cloud Bigtable 系列的名稱。
    • --bigtable_column_qualifier 會指定 Cloud Bigtable 資料欄限定詞的名稱。如需儲存模型說明,請參閱 Cloud Bigtable 總覽

預期結果

上述程序會完成 90 個訓練週期的 ResNet-50 模型訓練,且每 1,251 步就進行一次模型評估。如需模型使用的預設值及您用來變更預設值的標記相關資訊,請參閱 TensorFlow ResNet-50 模型的程式碼和 README。如果使用預設標記,模型在訓練後應能達到 76% 以上的準確度。

在我們的測試中,Cloud Bigtable 對於 ImageNet 訓練這類的工作負載能展現極高的總處理量效能,每個節點每秒能支援數百 MB 的掃描總處理量。

清除所用資源

如要避免系統向您的 GCP 帳戶收取您在這個主題中所用資源的相關費用,請按照下列指示操作:

  1. 中斷 Compute Engine VM 連線:

    (vm)$ exit
    

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

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

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

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

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    
  1. 不再需要 Cloud Bigtable 上的訓練資料時,請在 Cloud Shell 執行下列指令,將您的 Cloud Bigtable 執行個體刪除。(BIGTABLE_INSTANCE 變數應代表您先前使用的 Cloud Bigtable 執行個體 ID)。

    $ cbt deleteinstance $BIGTABLE_INSTANCE
    

後續步驟