串流資料的 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。請注意,Cloud Bigtable 能即時產生訓練資料,因此我們也建議您使用 Cloud Bigtable 來強化學習 (RL) 工作負載。

關於模型和資料

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

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

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

事前準備

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

  1. 登入您的 Google 帳戶。

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

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

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

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

    瞭解如何啟用計費功能

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

  5. 安裝 Cloud SDK (包括 gcloud 指令列工具)。

    安裝 Cloud SDK

建立 Cloud Storage 值區

您需要一個 Cloud Storage 值區來儲存查核點,以及訓練模型時產生的加權設定。

  1. 前往 GCP 主控台的 Cloud Storage 頁面。

    前往 Cloud Storage 頁面

  2. 建立新的值區時,請指定以下選項:

    • 自選不重複名稱
    • 預設儲存空間級別:Regional
    • 位置:us-central1

建立 Cloud Bigtable 執行個體

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

  1. 前往 GCP 主控台的「Cloud Bigtable」頁面。

    前往 Cloud Bigtable 頁面

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

    • 執行個體名稱:有助您辨別執行個體的名稱。
    • 執行個體 ID:執行個體的永久識別碼。
    • 執行個體類型:選取 [實際運作] 以獲得最佳效能。
    • 儲存空間類型:選取 [HDD]
    • 叢集 ID:叢集的永久識別碼。
    • 地區:選取地區 (例如 us-central1),請參閱 Cloud TPU 的適用地區和區域指南。
    • 區域:選取區域 (例如 us-central1-b),請參閱 Cloud 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 則是您 Compute Engine 資源的預設地理區域 (預設為 us-central1-b)。請參閱 Cloud 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.13
   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 執行個體。
  • 將特定的 IAM 角色授予您的 Cloud TPU 服務帳戶,確保您的 Cloud TPU 可在 GCP 專案中存取需要的資源。
  • 執行其他檢查作業。
  • 登入新的 Compute Engine VM 執行個體。

您隨時可以執行 ctpu up。舉例來說,假如 SSH 與 Compute Engine VM 執行個體的連線中斷,您只要執行 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
    

準備資料

請允許訓練應用程式存取 Cloud Bigtable 中的訓練資料。本節將說明如何下載 ImageNet 資料,並將資料轉換為 TFRecord 檔案再上傳到 Cloud Bigtable。

請注意,下載並處理 ImageNet 資料集可能需要數個小時的時間才能完成。

或者您可以使用偽資料集,快速測試模型訓練程序。

(選用) 使用偽資料集進行測試

如果只是要進行快速測試,您可以使用隨機產生的偽資料集,不需要下載整個 ImageNet 資料集。不過,偽資料集只能讓您瞭解如何使用 Cloud TPU,以及用來驗證端對端程序;測試結果產生的準確率數字及儲存的模型都不具實際意義,而且訓練程序也無法有效測試從 Cloud Bigtable 的資料串流。

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

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

使用偽資料集:

  1. 設定下列環境變數:

    (vm)$ export TRAINING_DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    
  2. 直接前往「將您的資料複製到 Cloud Bigtable」一節。

查看磁碟空間

以下章節內容是以您想要使用完整的 ImageNet 資料集為前提。

本機電腦或 VM 執行個體需要有 500 GB 的可用空間,才能執行 ImageNet 資料的下載和轉換作業。

如果決定要在 Compute Engine VM 執行個體上處理資料,請按照以下步驟為 VM 執行個體新增磁碟空間:

  • 按照 Compute Engine 指南的步驟為 VM 執行個體新增磁碟
  • 將磁碟大小設為 500 GB 以上。
  • 將「When deleting instance」 (刪除執行個體時) 設為 [Delete disk] (刪除磁碟),確保您移除 VM 執行個體時一併刪除磁碟。
  • 請記下新磁碟的路徑,例如:/mnt/disks/mnt-dir

下載並轉換 ImageNet 資料

下列操作說明以您想在 Compute Engine VM 執行個體上處理資料為前提。

下載 ImageNet 資料並轉換為 TFRecord 格式。

  1. 註冊 ImageNet 帳戶。記下建立帳戶時使用的使用者名稱和密碼。

  2. 設定 TRAINING_DATA_DIR 變數,使其包含 data-download 指令碼建立的資料檔案。這個變數必須指定本機電腦或 Compute Engine VM 執行個體上的一個位置。舉例來說,下列位置假設您已在 Compute Engine VM 執行個體上掛接額外的磁碟空間。

    (vm)$ export TRAINING_DATA_DIR=/mnt/disks/mnt-dir/imagenet-data
    

    或者在您的 $HOME 目錄中設定位置:

    (vm)$ export TRAINING_DATA_DIR=$HOME/imagenet-data
    
  3. 從 GitHub 下載 imagenet_to_gcs.py 指令碼

    (vm)$ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
    
  4. 安裝 Cloud Storage 指令碼工具:

    (vm)$ pip install gcloud google-cloud-storage
    
  5. 按照以下方式執行 imagenet_to_gcs.py 指令碼。使用 --nogcs_upload 選項時請只下載檔案即可,不要用來下載又上傳到 Cloud Storage。

    (vm)$ python imagenet_to_gcs.py \
      --local_scratch_dir=${TRAINING_DATA_DIR} \
      --nogcs_upload \
      --imagenet_username=YOUR-IMAGENET-USERNAME \
      --imagenet_access_key=YOUR-IMAGENET-PASSWORD
    

    注意:下載及處理資料的時間長短取決於您的網路和電腦速度,有可能會需要數個小時。在這段期間,請勿中斷指令碼的執行作業。

    指令碼會產生一個格式如下的目錄,內含訓練及驗證資料的映像檔:

    • 訓練資料:${TRAINING_DATA_DIR}/train/n03062245/n03062245_4620.JPEG
    • 驗證資料:${TRAINING_DATA_DIR}/validation/ILSVRC2012_val_00000001.JPEG
    • 驗證標籤:${TRAINING_DATA_DIR}/synset_labels.txt

將資料複製到 Cloud Bigtable

下列指令碼會將訓練資料從您的本機硬碟或 VM 執行個體複製到 Cloud Bigtable,以便串流資料至您的訓練應用程式。如果您選擇使用偽資料集,則指令碼會直接從 Cloud Storage 將資料複製到 Cloud Bigtable;就像在 TRAINING_DATA_DIR 環境變數中設定一樣。

  1. 從 GitHub 下載 tfrecords_to_bigtable 指令碼

    (vm)$ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/tfrecords_to_bigtable.py
    
  2. 安裝 cbt 工具 (Cloud Bigtable 的指令列介面):

    (vm)$ sudo apt install google-cloud-sdk-cbt
    
  3. 在您的主目錄建立 .cbtrc 檔案,用以儲存 Cloud Bigtable 的預設專案設定:

    (vm)$ echo -e "project = $PROJECT\ninstance = $BIGTABLE_INSTANCE" > ~/.cbtrc
    
  4. 為您的訓練資料建立 Cloud Bigtable 資料表和資料欄系列。以下範例會設定一些環境變數,並建立名稱為 imagenet-data 的 Cloud Bigtable 資料表及名稱為 tfexample 的資料欄系列。

    (vm)$ export TABLE_NAME=imagenet-data
    (vm)$ export FAMILY_NAME=tfexample
    (vm)$ export COLUMN_QUALIFIER=example
    (vm)$ export ROW_PREFIX_TRAIN=train_
    (vm)$ export ROW_PREFIX_EVAL=validation_
    (vm)$ cbt createtable $TABLE_NAME
    (vm)$ cbt createfamily $TABLE_NAME $FAMILY_NAME
    
  5. 執行 tfrecords_to_bigtable.py 指令碼,將「訓練」資料複製到 Cloud Bigtable:

    (vm)$ pip install --upgrade google-cloud-bigtable
    (vm)$ python tfrecords_to_bigtable.py \
      --source_glob=$TRAINING_DATA_DIR/train* \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --column_family=$FAMILY_NAME \
      --column=$COLUMN_QUALIFIER \
      --row_prefix=$ROW_PREFIX_TRAIN
    

    執行指令碼可能需要數分鐘的時間,完成後的輸出結果應該會類似下方格式:

    Found 1024 files (from "gs://cloud-tpu-test-datasets/fake_imagenet/train-00000-of-01024" to "gs://cloud-tpu-test-datasets/fake_imagenet/train-01023-of-01024")
    --project was not set on the command line, attempting to infer it from the metadata service...
    Dataset ops created; about to create the session.
    2018-10-12 21:07:12.585287: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    Starting transfer...
    Complete!
    
  6. 再次執行 tfrecords_to_bigtable.py 指令碼,這次將「評估」資料複製到 Cloud Bigtable:

    (vm)$ python tfrecords_to_bigtable.py \
      --source_glob=$TRAINING_DATA_DIR/validation* \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --column_family=$FAMILY_NAME \
      --column=$COLUMN_QUALIFIER \
      --row_prefix=$ROW_PREFIX_EVAL
    

    輸出範例:

    Found 128 files (from "gs://cloud-tpu-test-datasets/fake_imagenet/validation-00000-of-00128" to "gs://cloud-tpu-test-datasets/fake_imagenet/validation-00127-of-00128")
    --project was not set on the command line, attempting to infer it from the metadata service...
    Dataset ops created; about to create the session.
    2018-10-12 22:21:56.891413: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    Starting transfer...
    Complete!
    

(選用) 設定 TensorBoard

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

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

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

執行 ResNet-50 模型

您現在已準備就緒,可以在 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://...)。您可以重複使用現有目錄來載入目前的查核點資料,以及儲存其他查核點。
    • --bigtable_project 可以為存有您訓練資料的 Cloud Bigtable 執行個體指定 GCP 專案的識別碼。如果您未指定這個值,程式就會假設您的 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
    

後續步驟

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

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

這個網頁
Cloud TPU