1 TPU分類和收費標准
1.1 分類和計費說明
地區 | 搶占式TPU | Cloud TPU |
---|---|---|
美國 | $1.35/hour | $4.5/hour |
歐洲 | $1.485/hour | $4.95/hour |
亞太區地區 | $1.566/hour | $5.22/hour |
- 搶占式 TPU 是 Cloud TPU 在需要將資源分配給另一項任務時,可以隨時終止(搶占)的 TPU。搶占式 TPU 的費用要比普通 TPU 低廉得多。
- TPU 以 1 秒鍾為增量單位進行計費。
為了連接到 TPU,我們必須配置一台虛擬機(單獨結算)。要注意的是虛擬機和TPU是分別計費的。
也就是說僅在啟動 TPU 之后,Cloud TPU 的計費才會開始;在停止或刪除 TPU 之后,計費隨即停止。運行 ctpu pause
或 gcloud compute tpus stop
即可停止 TPU。同樣,只有在虛擬機激活之后,我們才會向您收取虛擬機費用。
如果虛擬機已停止,而 Cloud TPU 未停止,您需要繼續為 Cloud TPU 付費。如果 Cloud TPU已停止或刪除,而虛擬機未停止,則您需要繼續為虛擬機付費。
1.2 實用查詢鏈接
1.3 價格計算實例
以下示例解釋了如何計算一項訓練作業的總費用,該作業使用美國區域的 TPU 資源和 Compute Engine 實例。
一家機器學習研究機構通過創建 Compute Engine 實例預配了一台虛擬機,他們選擇的是 n1-standard-2 機器類型。他們還創建了一項 TPU 資源,其 Compute Engine 實例和 TPU 資源的累計使用時間都是 10 小時。為了計算該訓練作業的總費用,這家機器學習研究機構必須將以下幾項相加在一起:
- 所有 Compute Engine 實例的總費用
- 所有 Cloud TPU 資源的總費用
資源 | 每小時每台機器的價格(美元 | ) 機器數量 | 計費小時數 | 各資源總費用 | 訓練作業總費用 |
---|---|---|---|---|---|
Compute Engine n1-standard-2 實例 | $0.095 | 1 | 10 | $0.95 | _ |
Cloud TPU 資源 | $4.50 | 1 | 10 | $45.00 | _ |
$45.95 |
使用搶占式 TPU 的價格示例
在以下示例中,使用的資源和時長與上例相同,但這一次該研究機構決定使用搶占式 TPU 來節省成本。搶占式 TPU 的費用是每小時 $1.35,而非普通 TPU 的每小時 $4.50。
資源 | 每小時每台機器的價格(美元 | ) 機器數量 | 計費小時數 | 各資源總費用 | 訓練作業總費用 |
---|---|---|---|---|---|
Compute Engine n1-standard-2 實例 | $0.095 | 1 | 10 | $0.95 | - |
搶占式 TPU | $1.35 | 1 | 10 | $13.50 | - |
$14.45 |
2 使用步驟
2.1 創建GCP project
點擊鏈接Google Cloud Platform之后會進入這樣一個界面:
點擊創建項目,輸入項目名,等一會項目就會創建成功,有時可能需要刷新一下網頁項目才會出現。

2.2 創建Cloud Storage bucket
Cloud Storage 簡單來說就是用來存儲模型訓練數據和訓練結果的。官方的解釋是它是適用於非結構化對象的一種功能強大且經濟有效的存儲解決方案,非常適合托管實時網頁內容、存儲用於分析的數據、歸檔和備份等各種服務。
注意:要想使用Cloud Storage,需要啟用結算功能。
2.2.1 創建存儲分區
存儲分區用於保存您要在 Cloud Storage中存儲的對象(任何類型的文件)。
- 首先在控制台左側選擇 【存儲】(如下圖示(中英文))就能進入Cloud Storage頁面了,


- 之后點擊 【創建存儲分區】

- 輸入storage名即可創建完成,注意名稱需要是unique的,否則無法創建成功。

2.2.2 上傳和共享對象
要開始使用您的存儲分區,只需上傳對象並開放其訪問權限即可。
2.2.3 清理
在最后一步中,您將刪除之前為本教程創建的存儲分區和對象。
2.3 打開Cloud Shell,使用ctpu工具
Shell在控制台右上角,如下圖示:

輸入ctpu print-config
可以查看配置信息。我的輸入結果是這樣的:
ctpu configuration:
name: hkbuautoml
project: test01-219602
zone: us-central1-b
If you would like to change the configuration for a single command invocation, please use the command line flags.

2.3.1 創建Computer Engine VM和TPU
命令為:ctpu up [optional: --name --zone]
注意: name只能用小寫字母和數字組成,大寫字母或者其他字符都會報錯。
這里我創建了一個名為tputest
的tpu。輸入y確認創建。

上面的ctpu up
命令主要做了如下幾件事:
- 開啟Computer Engine和Cloud TPU服務
- 創建預裝有最新穩定版本TensorFlow的Computer Engine VM。其中默認的Zone是
us-central1-b
。 - 使用TensorFlow的相應版本創建Cloud TPU,並將Cloud TPU的名稱作為環境變量(
TPU _ NAME
)傳遞給Computer Engine VM。 - 通過向Cloud TPU服務帳戶授予特定的IAM角色(見下圖),確保您的Cloud TPU可以從GCP項目中獲得所需的資源。
- 執行其他的檢查。
- 將您登錄到新的Compute Engine VM。
2.3.2 檢查是否登錄成功
當成功登錄VM后,我們可以看到shell prompt已經由username@project
轉變成username@tpuname
。

2.3.3 運行一個TensorFlow程序
- 創建代碼文件
pico cloud-tpu.py
示例代碼如下
import os
import tensorflow as tf
from tensorflow.contrib import tpu
from tensorflow.contrib.cluster_resolver import TPUClusterResolver
def axy_computation(a, x, y):
return a * x + y
inputs = [
3.0,
tf.ones([3, 3], tf.float32),
tf.ones([3, 3], tf.float32),
]
tpu_computation = tpu.rewrite(axy_computation, inputs)
tpu_grpc_url = TPUClusterResolver(
tpu=[os.environ['TPU_NAME']]).get_master()
with tf.Session(tpu_grpc_url) as sess:
sess.run(tpu.initialize_system())
sess.run(tf.global_variables_initializer())
output = sess.run(tpu_computation)
print(output)
sess.run(tpu.shutdown_system())
print('Done!')
運行代碼,結果如下:
[array([[4., 4., 4.],
[4., 4., 4.],
[4., 4., 4.]], dtype=float32)]
Done!
2.3.4 釋放資源
代碼跑完后切記要釋放資源,否則系統會繼續計費。釋放資源方法如下:
1. 斷開與Computer Engine VM的連接:
(vm)$ exit
成功斷開之后shell prompt會變成項目名而不是VM名。
2. 刪除Computer Engine VM和Cloud TPU
$ ctpu delete
!!!特別注意:如果在創建VM的時候指定了name,name在刪除的時候同業也要指定name。我在刪除的時候沒有加name,雖然命令行結果顯示刪除成功,但是后面我在控制台查看資源使用情況,發現VM實例依舊存在。所以最保險的辦法是命令輸完后,去控制台看看實例是否還存在。
![]()

3. 刪除Storage
命令為:gsutil rm -r gs://Your-storage-name

通過Colab使用TPU
該方法可以免費使用TPU,但是磁盤空間有限,最多50G,而且默認已使用24G, 所以對於要訓練大數據集或者要保存模型的可能還是得使用Google Cloud。
Colab使用方法很簡單,只需要使用自己的谷歌賬號在Colab上新建一個Jupyter-notebook,在創建好之后將修改>筆記本設置>硬件加速器設置成TPU即可使用。另外可以通過在命令行中輸入如下命令(需要加感嘆號 !)來查看TPU的ip:
!echo $TPU_NAME
我的輸出是
grpc://10.75.136.130:8470
3. AutoML Demo
本次使用的AutoML demo是Google官方提供的代碼,即AmoebaNet。Google也有提供如何在TPU上運行該代碼的教程:Training AmoebaNet-D on Cloud TPU
3.1 在Colab上運行結果
為檢驗代碼是否可以正常運行,采用的是Google提供的偽造的ImageNet數據集:gs://cloud-tpu-test-datasets/fake_imagenet
。代碼是在Colab上運行,環境如下:
- python 2.7
- tensorflow 1.13
最后無法正常運行,報錯信息顯示是由於保存checkpoints有問題。
3.2 在Google Cloud上運行結果
3.2.1 配置環境
按照如上操作配置好VM,TPU和STORAGE BUCKET后,還需要命令行中配置如下信息:
- TPU_NAME
我的TPU信息如下:
所以TPU_NAME即為對應ip和端口號(8470)
export TPU_NAME=grpc://10.240.1.10:8470
- STORAGE BUCKET
這個的作用是用來保存checkpoints和模型參數,輸入如下命令進行配置:
export STORAGE_BUCKET=gs://STORAGE_BUCKET_NAME
STORAGE_BUCKET_NAME需要替換成你自己定義的Name,例如我的是skin100.
最后保存的信息大致如下
3.2.2 代碼結構
下面先介紹一下代碼的結構,我們所使用的AmoebaNet的代碼是在tensorflow庫下的一個tpu子庫中,即:
tpu
|__benchmarks
|__tools
|__models
|__...
|__common
|__official
|__amoabanet
|__amoebanet.py
|__...
直接運行amoebanet.py會報錯,因為其中的代碼需要用到common目錄下的代碼,所以可以把common文件夾復制到amobanet目錄下:
cd tpu
cp -r ./models/common ./models/official/amoebanet
之后就可以直接運行代碼了,運行環境需要是python2,另外tensorflow的環境已經默認配置好。
cd tpu/models/official/amoebanet
python amoeba_net.py \
--tpu=$TPU_NAME \
--data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
--model_dir=$STORAGE_BUCKET
- tpu: 注意這里不是輸入tpu的名稱,而是需要輸入tpu的ip和port,上面已經介紹了。
- data_dir使用的是google官方提供的fake ImageNet路徑,使用這個可以更快查看代碼能否跑通。並且代碼中使用的數據集需要是tfrecord格式,具體如何設置可以參照官方教程prepare your dataset
- model_dir: 用來保存模型參數和checkpoints的路徑,上面已經介紹了。
3.2.3 運行結果
下面將一些重要的輸出結果記錄如下:
- Number of flops: 4.7GFLOPS(Forward)
- number of trainable params: 84812042 ≈ 323M
- global_step/sec: 1.85615
- examples/sec: 475.1735
3.3 環境配置問題
參考:https://askubuntu.com/questions/916711/how-can-i-install-cudnn-on-ubuntu-14-04
在Google Cloud上能正常運行TPU代碼,但是GPU卻不行。而Colab是反過來的。如果是想在本地的GPU上跑的話,環境配置(以v100為例)如下:
- tensorflow-gpu 1.13
- cuda10
- cudnn 7.4.2
cuda10可以通過anaconda一鍵安裝(可搜索"conda cloud cuda"), cuDNN可能會麻煩一點,因為anaconda cloud上提供的最新cuDNN版本是7.3.1,而tensorflow 1.13需要7.4.2版本,所以你可以在cuDNN官網下載。
下載之后的詳細步驟如下:
- 首先需要將下載的后綴名為solitairetheme8的文件修改后綴,改成 .ga.tgz,然后用如下命令解壓縮
tar -zxvf cudnn_***.ga.tgz
- 解壓之后可以得到一個名為cuda的文件夾,里面有兩個文件夾(include和lib64)以及一個文件(NVIDIA_SLA_cuDNN_Support.txt)。我的cuda文件夾的路徑是
/home/xinhe/cuda
- 進入bashrc文件里配置環境
export CUDNN_HOME=~/cuda
export LD_LIBRARY_PATH=${CUDNN_HOME}/lib64:${LD_LIBRARY_PATH}
export CPLUS_INCLUDE=${CUDNN_HOME}/include:$CPLUS_INCLUDE
source ~/.bashrc
大功告成,只需要輸入如下命令即可開始在gpu上運行AmoebaNet代碼
python2 amoebe_net.py \
--use_tpu=False \
--data_dir=./dataset/fake_imagenet \
--model_dir=./model_gpu \ # 你可以自己創建這個目錄
--image_size=224 \
--train_batch_size=32 \
--val_batch_size=32
3.4 fake ImageNet
其實上面AmoebaNet要在本地GPU上成功地跑起來,還需要用到tfrecord格式的數據,你可以通過使用谷歌雲提供的gsutil
工具來下載這些數據(大約70G)。
gsutil的安裝教程參考官網:https://cloud.google.com/storage/docs/gsutil_install?hl=zh-cn
gsutil
安裝好之后,只需要運行一行代碼即可把數據集下載下來:
cd your_project_path
mkdir dataset
gsutil cp -r gs://cloud-tpu-test-datasets/fake_imagenet ./dataset
最后你就可以得到一個名為fake_imagenet的文件夾了,這里面有tfrecord格式的數據。
4. Transformer
4.1 生成訓練數據集
在用戶的個人VM上,
添加如下環境變量:
export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
export DATA_DIR=$STORAGE_BUCKET/data
export TMP_DIR=YOUR-TMP-DIRECTORY
其中,
- YOUR-BUCKET-NAME 是用戶的 Cloud Storage bucket。
- DATA_DIR 是數據集儲存的位置。
- YOUR-TMP_DIRECTORY 是用於存儲臨時數據的位置。
如果用戶向計算引擎VM添加了新磁盤,需要在添加的磁盤上創建一個臨時目錄。
mkdir /mnt/disks/mnt-dir/t2t_tmp
下載tensor2tensor模型
pip install tensor2tensor
添加tensor2tensor環境變量
export PATH=.local/bin:$PATH
生成WMT14數據集
t2t-datagen --problem=translate_ende_wmt32k_packed --data_dir=$DATA_DIR --tmp_dir=$TMP_DIR
4.2 在單個雲TPU上訓練英德翻譯模型
OUT_DIR=$STORAGE_BUCKET/training/transformer_ende_1
t2t-trainer \
--model=transformer \
--hparams_set=transformer_tpu \
--problem=translate_ende_wmt32k_packed \
--train_steps=10 \
--eval_steps=3 \
--data_dir=$DATA_DIR \
--output_dir=$OUT_DIR \
--use_tpu=True \
--cloud_tpu_name=$TPU_NAME
上面的命令運行10個訓練步驟,然后執行3個評估步驟。用戶可以(並且應該)通過調整--train_steps
標志來增加訓練步驟的數量。在大約40k步之后,翻譯通常開始合理。該模型通常在約250k步后收斂到其最高質量。
4.3 退出並刪除環境
與VM斷開連接
exit
刪除VM
ctpu delete [optional: --zone]
檢查VM是否已經刪除
2019/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
No instances currently exist.
Compute Engine VM: --
Cloud TPU: --
刪除BUCKET
gsutil rm -r gs://YOUR-BUCKET-NAME
4.4 運行結果
結果記錄如下:
- Training Cost: 33TFLOPs/Step
- number of trainable params: 61277184*4 ≈ 245M
- global_step/sec: 9.31
- examples/sec: 595.92
更詳細的資料可參考官方文檔。