基於Colab Pro & Google Drive的Kaggle實戰
原文://hippocampus-garden.com/kaggle_colab/
原文標題:How to Kaggle with Colab Pro & Google Drive
譯文作者:kbsc13
聯繫方式:
Github://github.com/ccc013/AI_algorithm_notes
知乎專欄:機器學習與計算機視覺,AI 論文筆記
微信公眾號:AI 算法筆記

前言
Colab Pro(目前僅在美國、加拿大、日本、巴西、德國、法國、印度、英國和泰國可用)提供了隨時可用和加速但是維護起來既昂貴又繁瑣的雲計算資源。和其免費版不同,Colab Pro 允許用戶使用 TPUs 和高端的 GPUs,比如 V100 和 P100 等等,可以訪問高內存的實例,並且保持 notebooks 運行的時間最長可以達到 24 小時,費用是每個月 10 美元。
Colab Pro可以滿足 Kaggle 競賽中大部分比賽的資源要求。但是這裡存在一個問題,每個會話只能保持 24 小時。每次都需要準備數據集,根據準備的方式,這需要一些時間。在下面的表格中,從初始化加載和磁盤讀寫的時間來對比 5 種準備 Kaggle 數據集的方法:

不幸的是,根據上述表格並沒有看到兩個方式都很快速的方法。考慮到我們更想要的是在數據集上通過多次迭代的訓練模型,快速的磁盤讀寫的速度是更加重要。在目前的狀況下,我會選擇第三個方法:首先通過 Kaggle API 下載數據集,並以 zip 壓縮包形式保存在 Google 硬盤上,當開始會話的時候,解壓縮並存放到實例的磁盤上。這個操作過程將在下一節中一步步的解釋。
Kaggle on Colab Pro
下載數據集到 Google 硬盤上
首先,需要通過 Kaggle API 下載數據集,並以 zip 壓縮包形式保存在 Google 硬盤上,具體步驟如下所示:
-
登錄到 //www.kaggle.com/<YourKaggleID>/account
,然後下載kaggle.json

-
在Google 硬盤上創建一個名字為 kaggle
的文件夾,然後上傳kaggle.json
-
開始一個 Colab 的會話 -
通過點擊右上角的圖標來掛載 Google 硬盤,如下圖所示

-
從 Google 硬盤裡複製 kaggle.json
到當前會話,並修改文件的權限,命令如下所示:
! mkdir -p ~/.kaggle
! cp ./drive/MyDrive/kaggle/kaggle.json ~/.kaggle/
! chmod 600 ~/.kaggle/kaggle.json
-
(可選)升級 Kaggle API。這個包是預安裝在 Colab 的實例上的,不過在 2021 年 5 月份,Kaggle notebooks 的版本是更新了,兩個版本是有些不一樣的。
! pip install -U kaggle
-
通過 Kaggle API 下載數據集到 Google 硬盤上,這可能會花點時間完成並且在 Google 硬盤界面上顯示出來也需要幾分鐘。
! mkdir -p ./drive/MyDrive/kaggle/<CompetitionID>
! kaggle competitions download -c <CompetitionID> -p ./drive/MyDrive/kaggle/<CompetitionID>
你也可以升級你的 Google 硬盤計劃來獲取更多的存儲空間。
解壓縮文件到實例上
解壓縮文件到當前會話中,命令如下所示,這一步也需要花費一些時間:
! mkdir -p <CompetitionID>
! unzip -q ./drive/MyDrive/kaggle/<CompetitionID>.zip -d <CompetitionID>
# You can specify the portion of dataset for saving time and disk space
! unzip -q ./drive/MyDrive/kaggle/<CompetitionID>.zip train/* -d <CompetitionID>
這就可以開始訓練模型了。完成訓練後,可以將權重文件導出到Kaggle數據集,並通過Kaggle API提交預測,對於完整的教程,可以參考 //github.com/Kaggle/kaggle-api。
速度比較
從Google 硬盤壓縮需要很長的時間,這種方法是真的比直接通過 Kaggle API 或者 gsutil 下載要更快嗎?為了回答這個問題,我準備了房價預測競賽(//www.kaggle.com/c/house-prices-advanced-regression-techniques/)的數據集,大約是 935KB,並測試這 3 種方法的解壓縮時間,結果如下所示:

上述結果可能會受到實例所在區域而有些影響,但是大部分情況下,從 Google 硬盤上解壓縮還是最快的方法。
注意磁盤大小
Colab Pro 目前提供一個 150GB 大小的磁盤,所以壓縮文件不能超過 75GB。
是否可以掛載外部存儲器呢?
掛載谷歌雲存儲桶(Mounting Google Cloud Storage Buckets)
Colab 可以掛載 Google 雲存儲磁盤,並在不用下載的情況下訪問 Kaggle 的數據集。其操作有幾個步驟,首先,通過下述代碼授權你的賬戶:
from google.colab import auth
auth.authenticate_user()
接着,安裝 gcsfuse
:
! echo "deb //packages.cloud.google.com/apt gcsfuse-bionic main" > /etc/apt/sources.list.d/gcsfuse.list
! curl //packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
! apt update
! apt install gcsfuse
然後,打開一個你喜歡的競賽項目的 Kaggle 的 notebook,然後運行下面的代碼獲取 GCS (Google Cloud Storage)的路徑:
from kaggle_datasets import KaggleDatasets
print(KaggleDatasets().get_gcs_path())
比如房價預測競賽House Prices – Advanced Regression Techniques,其得到的結果如下:
gs://kds-ecc57ad1aae587b0e86e3b9422baab9785fc1220431f0b88e5327ea5
現在就可以通過 gcsfuse
來掛載 GCS:
! mkdir -p <CompetitionID>
! gcsfuse --implicit-dirs --limit-bytes-per-sec -1 --limit-ops-per-sec -1 <GCSPath without gs://> <CompetitionID>
通過上述命令進行掛載,1s 內即可完成。但當你開始嘗試在數據集上進行迭代操作的時候,你會發現磁盤訪問速度是非常的慢。訪問速度是依賴於 Colab 實例和 GCS 桶 所在的區域,但一般來說,應該避免這種掛載操作。
可以通過以下方式獲取Colab實例的區域信息:
! curl ipinfo.io
GCS 桶的區域信息本來是可以通過下述命令獲取的,但是我這邊提示 AccessDeniedException
異常錯誤,並且無法解決。
! gsutil ls -Lb gs://kds-ecc57ad1aae587b0e86e3b9422baab9785fc1220431f0b88e5327ea5
掛載 Google D磁盤
這種方法的磁盤訪問速度太慢了!
總結
使用 Colab Pro 是能夠用到更好的顯卡,比如 TPU,或者 P100,V100 這個級別的 GPU,當然這是一個付費版本,每個月需要花費 10 美元,而且每次會話運行時間最長只有 24 小時,所以如果訓練模型時間太久,就需要多次運行會話,這就導致需要重新加載數據集和讀取上次訓練保存的權重文件。
因此為了最大化利用 Colab Pro 的時間,當然就希望減少加載數據集的時間,本文作者基於這個思路,對比了 5 種方法,最後是根據實際情況,即主要是訓練模型,對磁盤讀取速度要求更高,所以選擇了在 Google 磁盤上解壓縮文件到 Kaggle 實例上的方法,並給出了操作流程,然後還研究了是否可以通過掛載外部存儲器,但磁盤訪問速度太慢,並不建議這種操作。
另外,Colab Pro 提供的磁盤空間僅有 150GB,對於壓縮文件大小是不能超過 75GB,因此,這種方法對於大數據集,參數量很大的網絡模型都是不太合適的,但對於數據量不大,不用太大的網絡模型的比賽,還是可以用 Colab Pro 來訓練模型。