fbpx

用 Google Colab 免費 GPU 訓練 AI 模型教學

用免費的 Google Colab GPU訓練 AI 模型

最近 GPU Chip 的快速發展帶動了 AI 的加速落地(也或者 AI 帶動 GPU 產業),但是對個人開發者來說,這種高階運算的 GPU 還是很貴的。最近 Google 大神佛心來了,在 Google Colab 中提供了免費的 GPU/TPU 提供給想進行實驗的使用者進行運算,雖然只有一顆 GPU,但用來訓練簡單的類神經網路或者做做實驗還算可以。今天就來教學一下如何用 Keras 內建前人訓練好的 Model 來串接訓練自己的 AI Model,按圖施工保證成功,若不成功不需自宮

使用 Google Colab 服務

Google Colab 其實就是一個 Web 版的 Python Runtime 執行環境,屬於 Google Drive 的一種應用程式,使用者界面跟 Jupyter Notebook 長的差不多,用起來也很相似。開始介紹如何利用 Colab GPU 訓練模型,首先進入 Google Colab 後,選擇「NEW PYTHON 3 NOTEBOOK」建立一個新的 ipynb 檔案,如下:

1-new-python3-notebook

接著第一件事就是設定 GPU Runtime,先到工具列「Runtime > Change runtime type」搶 GPU,如下:

2-colab-change-runtime

在 Hardware accelerator 選擇「GPU」按下「Save」,如下:

3-colab-gpu-runtime

然後在主畫面右上角按下「Connect」,如下:

4-colab-gpu-runtime-connect

到這裡就已經準備好有 GPU 的環境了,有時後會連線失敗,應該是 GPU 超過配置,等一下再使用即可。正確連線以後,會看到綠色的勾勾,滑鼠指標 Hover 會出現硬體資源狀態,如下:

5-colab-gpu-hardware-info

如果開太多視窗使用 Colab GPU 也會出現「Too many sessions」的訊息,手動 Terminate 其他 Session 即可,訊息如下:

5.1-Colab-too-many-sessions

可以看到 Ram 有 12.72 GB, Disk 有 358.27 GB 可以用,感覺很威~到這裡,你是不是也跟我一樣很好奇究竟是配置什麽樣免費的 GPU 呢?在 Notebook 輸入「!nvidia-smi」顯示:

6-colab-nvidia-smi-p100

哇~NVidia Tesla P100 ㄝ,有 16GB 的記憶體,快跟你隔壁的說你有 Tesla 了!雖然不是電動車,但是這張顯卡一片也要 2x 萬台票,有免費的可以用就將就點吧。

用 Google Colab GPU 訓練 Model

有 GPU 以後就可以開始訓練深度學習網路了,這裡會用到 Keras 到套件,現在已經有很多訓練好的 Model 與 Image Net 可以使用,這裡我們先使用 VGG16 (Visual Geometry Group) 來進行 MNIST 手寫辨識模型訓練,MNIST 是一個公開的 Play Dataset,含有 0~9 十種數字的手寫圖片,資料集有 6000 筆 28*28 灰階的資訊,可以用來訓練圖片分類模型,這樣的公開資料與之前的文章「用 Machine Learning 辨識鳶尾花」所使用的 IRIS Play Dataset 是一樣的意思。

開始訓練,在 Code Block 貼上以下程式碼 (檔案同步放上GitHub):

import cv2
import numpy as np
 
from keras.applications.vgg16 import VGG16
from keras.layers import Input
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.models import Model
from keras.utils import np_utils
from keras.datasets import mnist
 
epochs = 10
batch_size = 50
row_col = 48
 
# 原始的 MNIST 是 6000 筆 28*28 灰階
def load_data():
  (X_train, y_train), (X_test, y_test) = mnist.load_data()
  X_train, y_train = X_train[:5000], y_train[:5000]
  X_test, y_test = X_test[5000:6000], y_test[5000:6000]
  X_train = [cv2.cvtColor(cv2.resize(i, (row_col, row_col)), cv2.COLOR_GRAY2RGB)
            for i in X_train]
  X_train = np.concatenate([arr[np.newaxis] for arr in X_train]).astype('float32')
  X_test = [cv2.cvtColor(cv2.resize(i, (row_col, row_col)), cv2.COLOR_GRAY2RGB)
            for i in X_test]
  X_test = np.concatenate([arr[np.newaxis] for arr in X_test]).astype('float32')
 
  X_train = X_train / 255
  X_test = X_test / 255
 
  y_train_ohe = np_utils.to_categorical(y_train, 10)
  y_test_ohe = np_utils.to_categorical(y_test, 10)
 
  return (X_train, y_train_ohe), (X_test, y_test_ohe)
 
 
def load_model():
 
  base_network = VGG16(include_top=False, weights='imagenet', input_shape=(row_col, row_col, 3))
 
  # 凍結預設的參數
  for layer in base_network.layers:
      layer.trainable = False
 
  # 接上自行定義的全連結層
  model = Flatten()(base_network.output)
  model = Dense(4096, activation='relu', name='full_connect_1')(model)
  model = Dense(4096, activation='relu', name='full_connect_2')(model)
  model = Dropout(0.5)(model)
  model = Dense(10, activation='softmax', name='prediction')(model)
  model = Model(base_network.input, model, name='my_model')
 
  return model
  
  
# 載入模型
model = load_model()
model.summary()
 
# 載入訓練資料
(x_train, y_train_ohe), (x_test, y_test_ohe) = load_data()
print('Train Size:', x_train.shape)
print('Test Size:', x_test.shape)
 
#定義 loss function
from keras.optimizers import SGD
sgd = SGD(lr=0.05, decay=1e-5)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
 
# 開始訓練
model.fit(x_train, y_train_ohe, validation_data=(x_test, y_test_ohe), epochs=epochs, batch_size=batch_size)
 
# 輸出結果
print('Train Acc:', model.evaluate(x_train, y_train_ohe)[1])
print('Test Acc:', model.evaluate(x_test, y_test_ohe)[1])

然後按下 Block 左上角的「Play」圖示來執行:

7-colab-mnist-vgg-sample-code

Python 執行的過程會顯示在底下,程式執行流程大致如下:

  • 從網路下載 Keras 提供的 VGG16 Model
  • 凍結 VGG Model 已經訓練好的參數
  • 產生兩層 Full Connection 接在原本 VGG Model 的後面
  • 輸出接上 Dropout 與 Softmax 層
  • 載入 MNIST Dataset 區分 5,000 筆訓練 + 1,000 筆測試
  • 跑 10 次 epochs 取得訓練結果

程式執行到「model.summary()」的時候會在輸出印出 Model 每一層的結構,可以看出 VGG16 與我們新增的 Full Connection Layer,如下:

8-colab-model.summary()

最後 10 個 epochs 跑完後可以看到結果,正確率顯示 0.938,對 MNIST Dataset 來說實在有點低,有空可以試試其他的 Model 或調整參數,像是 MobileNet, DenseNet, ResNet, Inception 都可以玩看看。

9-colab-mnist-model-train

Colab 有時候訓練跑很久會被中斷,詳細會被中斷的邏輯我也不清楚,我只有發現 Browser 在背景是很容易斷的。免費的不能要求太多囉 (笑),基本上 16GB 的 GPU 如果想要訓練太複雜的模型也是會不夠用的,最後也只能 Good Luck 囉,如果訓練成功以後記得按讚分享加訂閱。下次見~