2019年7月13日 星期六

貴哥的 colab 初學筆記

Google colaboratory 提供短暫 (數小時) 的免費雲端 GPU 算力, 真是深度學習初學者的福音啊! 前提是你要有 google drive 的帳號, 並且略會操作 Jupyter Notebook。 網路上已有很多入門教學文; 貴哥一看到有 shell 可用, 忍不住就好奇多探索一些, 於是也寫一篇自己的初學筆記。 基於 「站在巨人肩膀上」 的原則, 比較多人介紹的基本操作就只簡單帶過, 細節可參考 台大機械所 Wei-Hsiang Wang 的 Colab 基本操作筆記 (中文) 及 fuat 的 Google Colab Free GPU Tutorial (英文)

一、 試車

從 google drive 裡啟用 colab (2) 從 google drive 裡啟用 colab (1) 我看到的文件都說: 進 google drive、 進入一個任選的目錄、 按右鍵就會出現一個 「(建立) colaboratory (文件)」 的選項。 不知是不是因為我的帳號太老了, 一開始並沒有這個選項, 必須先選 「more」 的 「connect more apps」、 在對話框裡搜尋 colab、 再按 「+Connect」, 之後回到 google drive 底下按右鍵才有 「colaboratory」 選項可用。

  1. 先點 「幫助」=>「查看英文版」, 把介面改成英文。 這樣將來比較方便跟英文教學文對照。
  2. 還不熟悉 Jupyter Notebook 的朋友, 可以先把 快速鍵一覽表 印出來放旁邊參考。 但是, 在 colab 裡面, 可能需要先按 ctrl-m 再按一覽表當中的鍵。 詳情請按 ctrl-m 再按 h 查看 help。
  3. 下幾個 python 指令, 執行一下、 查看結果。
  4. 執行 import sys ; print(sys.version_info) 查看一下 python 版本。
  5. 進入 「Edit」=>「Notebook Settings」, 把 「Runtime type」 底下的 「Python 3」 改成 「Python 2」。 再執行一次上面的指令。 目前 colab 只支援以上兩種 kernels。
  6. 執行 import tensorflow as tf ; tf.test.gpu_device_name() 查看一下 GPU 資訊 (目前沒有 GPU 可用)。
  7. 再點 「Edit」=>「Notebook Settings」, 把 「Hardware accelerator」 底下的 「None」 改成 「GPU」。 再執行一次上面的指令。
  8. 如果偏好黑底亮字的話, 「Tools」=>「Preferences」 的 「Site」 分頁底下的 Theme 選項中, 可以把 light 改成 dark。 不過我的 chromium 本來就採用 High Contrast 外掛, 所以直接看到黑底白字。

有時候改過某些設定之後, 必須重跑所有程式碼。 此時可以先 「Runtime」=>「restart runtime」 然後從頭重跑每一個 cell。

二、 把頭探出窗外看 shell、 看 drive

現在越來越懶了, 不太確定還有沒有力氣學習設計類神經網路; 目前都僅限於撿人家現成的程式來跑。 所以比起在 NB 裡面跑程式, 我更常在 shell 底下做事。 而且不論你有沒有要寫自己的程式, 未來除錯時 (特別是上網問問題時) 幾乎一定需要知道 NB 所立足的那個 container 的系統環境資訊: 我的作業系統是哪個版本? 已安裝了哪些套件? 有多大的記憶體可用? 有沒有 GPU 可用? 掛載了哪些檔案系統?

從 google drive 裡啟用 colab (2) 在 NB 裡面, 可以用驚嘆號執行 shell 指令, 例如 ! ls -l。 不過, 光執行一個指令怎能滿足好其心呢? 於是下: !bash 直接在 NB 裡面探索外面 container 世界的 shell。 Colab 誤把對話框當成密碼輸入對話框, 所以下指令時, 看不見自己打的字, 而且不能用 tab 等等快速鍵, 不過至少指令可以執行沒問題, 太長的指令也可以用剪貼的。 右圖顯示以下指令的結果:

free
df
uname -a
cat /etc/os-release

[11/9 在命令列輸入框上面按右鍵, 叫出 firefox 或 chrome 的開發者面板, 把 type="password" 刪掉, 就可以看到輸入指令了。 但經過幾個指令之後, 好像又會變回密碼。]

再用 pip3 list 查看一下, 發現系統已預先安裝了許多常用套件, 包含 Keras/tensorflow/Theano/torch 等等深度學習框架、 處理圖像的 opencv-python jieba Keras、 自然語言處理的 gensim/nltk、 資料視覺化的 graphviz/plotly 等等。 最後執行 exit 結束 !bash。

想要執行外部 python 程式, 另一件很重要的是就是外部檔案的讀寫: 如何把自己的資料檔餵給程式吃、 如何把程式跑出來的結果下載回來? 最簡單的方法, 就是以自己的 google drive 作為資料進出的平台。

from google.colab import drive
drive.mount('/content/drive/')

這裡的 /content 是系統預建的目錄, container 一建立起來, 底下就預先配置有 sample_data 子目錄 ; mount 那句要求在 /content/ 底下建立空目錄 drive/ , 然後把自己的 google drive 掛載上去。 這麼危險的事, 當然需要經過認證流程。 順著指示剪貼完授權碼之後 (雖然我猜授權碼應該只對這個 NB 有效, 不過還是建議上課的老師們記得暫時先把廣播關掉) 從 container 裡面就可以讀寫自己的 google drive 了。 執行 !df 查看掛載狀況, 以及 !ls '/content/drive/My Drive/' 查看自己的 google drive 最上層目錄。

以下兩個實戰範例彼此獨立, 有些做法稍有不同, 可以任挑一個實作即可。 兩張目錄結構圖當中, 藍框代表手動建立、 紅框代表上傳、 紫框是 git clone。 雙層框是特別提醒的地方。

三、 實戰範例一: 狗狗品種分類 => 狗狗動作分類

準備資料: 上傳兩個目錄到 google drive 這個例子的前半部拿現成的 keras-mobilenet 來分類狗狗品種; 後半部用遷移學習的方式將原先的類神經網路改訓練成狗狗動作分類器。

  1. 在自己的 google drive 根目錄底下, 建立一個 colab 子目錄。
  2. 下載我的範例程式及測試圖片 ckhung/keras-mobilenet、 上傳至 google drive 剛剛建立的 colab 子目錄底下。
  3. [後半部才需要用到] 下載狗狗動作分類訓練資料集 dog_behaviors.zip、 上傳至 google drive 剛剛建立的 colab/keras-mobilenet 子目錄底下。 (註: 訓練資料集的產生方式: google 圖片搜尋批次下載)
  4. 從 google drive 裡面點選 colab/keras-mobilenet/km-transfer.ipynb , 開始逐步執行。

四、 實戰範例二: 黑白相片著色

Automatic-Image-Colorization/ 的目錄樹 另一個簡單的例子: 黑白相片著色

  1. 在自己的 google drive 根目錄底下, 建立一個 colab 子目錄。
  2. 在 colab 底下建一個目錄 img/ , 裡面放一些彩色相片。 可以想像: 動物、 自然風景效果較好; 人造物 (房子、衣服) 很難猜對。
  3. 在 colab 底下, 透過 「右鍵」、「more」、「colaboratory」 建立一個 aic.ipynb 。 設定英文、 GPU。
  4. 在 aic.ipynb 裡面, 掛載 google drive、 用 os.chdir() 進入 colab 目錄。
  5. ! git clone ... 抓回 Automatic-Image-Colorization 。
  6. 下載 vgg16.npy [備份一備份二]、 上傳到 drive 的 colab/Automatic-Image-Colorization/vgg/ 底下。
  7. 下載預先訓練好的權重矩陣 pre_trained.zip [備份一備份二]、 在自己的電腦上解壓縮、 把其中的 summary/ 子目錄上傳到 drive 的 colab/Automatic-Image-Colorization/ 底下。
  8. 用 os.chdir() 進入 Automatic-Image-Colorization/ 、 在裡面建立 summary/test/images 子目錄。
  9. 編輯 config.py , 把 testing_dir = "test2014" 改成 testing_dir = "../img" 。 回存 config.py 。 在 colab 的 NB 裡, 如何編輯/回存 drive 的檔案? 詳見 這個問答
  10. 執行 python3 test.py 結果出現錯誤: ... ValueError: Object arrays cannot be loaded when allow_pickle=False 搜尋到 這個解答
  11. 於是用 pip3 list | grep numpy 檢查, 果然發現 numpy 的版本太新。 再下 pip3 install numpy==1.16.1 降級 numpy。 系統抱怨降級以後, 某些套件就不能用了。 我們在 container 裡面, 哪需要在乎其他套件呢 :-)
  12. 再執行一次 python3 test.py, 等待一兩分鐘, 結束後回 google drive, 在 colab/Automatic-Image-Colorization/summary/test/images/ 裡面即可看到成果 (好幾個 .png 檔)。
  13. 以上細節請參考 我的 ipynb

五、 心得/重點提示

  1. python2 或 python3? pip2 或 pip3? 建議每個指令都把版本寫清楚, 減少混淆。
  2. 驚嘆號後面的 cd 跟 os.chdir() 有什麼不同? 每個驚嘆號代表一個 subprocess (shell) 的誕生與死亡, 也就是說驚嘆號後面的 cd 僅限當句內有效。 以旅遊為例, os.chdir() 像是到一個新的城市入住旅館; 驚嘆號後面的 cd 像是一天之內的行程, 在一天結束之後, 總是會回到目前城市的旅館。
  3. 為什麼要把辛苦 (?) git clone 回來的整個 repo 及花很多時間上傳的權重矩陣放到 google drive 底下而不要放在 container 自己的儲存空間? 如果整部 container 砍掉重練 ("restart runtime"), 那麼 container 自身的檔案就會全部消失。 我們的做法遇到砍掉重練時, 檔案才不需要再重抓一次。 當然, 另一方面來說, 重複執行這個 NB 時, 就要把這些指令註解掉。
  4. colab 的 NB 只要不去動它超過一段時間 (幾十分鐘? 幾小時?) 可能就需要重開機。 ("Runtime Disconnected") 此時 mount 跟 chdir 等等指令就需要重做。
  5. 測試圖片檔放在外層, 可以跟其他 projects 共用。
  6. [7/30] 有時 colab 會掛掉不動。 請先檢查: 是不是你自己在別的 cell 還留了一個忘記 exit (尚未 exit) 的 !bash ? 如果所有 cells 的 !bash 都已 exit, 卻還是當掉, 那就試試 「Runtime」=>「Interrupt execution」。 如果還是沒用的話, 可以試試 「Runtime」=>「Change runtime type」 把 GPU 改成 CPU 或反過來, 這樣就會把目前的 container 丟掉重開一個。 然後再換回原來的 GPU 或 CPU。 詳見 這裡如果還是不行, 則試試 「Runtime」=>「Reset all runtime」。 例如我曾經在某頁 NB 當中想要 drive.mount(), 出現了授權碼之後卻沒有剪貼, 結果之後開其他的新 NB 也無法 drive.mount() (因為兩部 container 同時想要掛載我的 google drive ...) 讀了 這個 issue 之後, reset all runtime 砍掉本人所開的所有 containers 之後, 就恢復正常了。
  7. 當中曾遇過 這個錯誤 找半天才發現原來是因為欠缺測試資料檔。 一開始我放上去的是灰階圖片; 後來仔細讀程式才發現它需要的輸入是彩色圖片 (所以成果並列的三張圖分別是: 灰階、 電腦著色、 ground truth) 它會略過所有的灰階圖片。 總之偶爾還是需要讀一下程式碼啊~
  8. 本來想玩 caffe 版的相片上色程式。 採用 簡單安裝 caffe-gpu 套件 的方法, 最後還是 失敗。 看來目前要在 colab 上面用 caffe 還是有困難。

2 則留言:

  1. 實戰範例很優, 想要跟著執行來了解. 只可惜Colab已不再支援Tensorflow 1, 無法進一步測試. 請問有新版的範例媽? 謝謝

    回覆刪除
  2. 昨日留言, 請忽略. 已經可順利執行, 謝謝

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。