基於Colab Pro & Google Drive的Kaggle實戰
原文:https://hippocampus-garden.com/kaggle_colab/
原文標題:How to Kaggle with Colab Pro & Google Drive
譯文作者:kbsc13
聯絡方式:
Github:https://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 硬碟上,具體步驟如下所示:
登入到 https://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/
!chmod600~/.kaggle/kaggle.json
(可選)升級 Kaggle API。這個包是預安裝在 Colab 的例項上的,不過在 2021 年 5 月份,Kaggle notebooks 的版本是更新了,兩個版本是有些不一樣的。
!pipinstall-Ukaggle
通過 Kaggle API 下載資料集到 Google 硬碟上,這可能會花點時間完成並且在 Google 硬碟介面上顯示出來也需要幾分鐘。
!mkdir-p./drive/MyDrive/kaggle/<CompetitionID>
!kagglecompetitionsdownload-c<CompetitionID>-p./drive/MyDrive/kaggle/<CompetitionID>
你也可以升級你的 Google 硬碟計劃來獲取更多的儲存空間。
解壓縮檔案到例項上
解壓縮檔案到當前會話中,命令如下所示,這一步也需要花費一些時間:
!mkdir-p<CompetitionID>
!unzip-q./drive/MyDrive/kaggle/<CompetitionID>.zip-d<CompetitionID>
#Youcanspecifytheportionofdatasetforsavingtimeanddiskspace
!unzip-q./drive/MyDrive/kaggle/<CompetitionID>.ziptrain/*-d<CompetitionID>
這就可以開始訓練模型了。完成訓練後,可以將權重檔案匯出到Kaggle資料集,並通過Kaggle API提交預測,對於完整的教程,可以參考 https://github.com/Kaggle/kaggle-api。
速度比較
從Google 硬碟壓縮需要很長的時間,這種方法是真的比直接通過 Kaggle API 或者 gsutil 下載要更快嗎?為了回答這個問題,我準備了房價預測競賽(https://www.kaggle.com/c/house-prices-advanced-regression-techniques/)的資料集,大約是 935KB,並測試這 3 種方法的解壓縮時間,結果如下所示:
上述結果可能會受到例項所在區域而有些影響,但是大部分情況下,從 Google 硬碟上解壓縮還是最快的方法。
注意磁碟大小
Colab Pro 目前提供一個 150GB 大小的磁碟,所以壓縮檔案不能超過 75GB。
是否可以掛載外部儲存器呢?
掛載谷歌雲端儲存桶(Mounting Google Cloud Storage Buckets)
Colab 可以掛載 Google 雲端儲存磁碟,並在不用下載的情況下訪問 Kaggle 的資料集。其操作有幾個步驟,首先,通過下述程式碼授權你的賬戶:
fromgoogle.colabimportauth
auth.authenticate_user()
接著,安裝 gcsfuse
:
!echo"debhttp://packages.cloud.google.com/aptgcsfuse-bionicmain">/etc/apt/sources.list.d/gcsfuse.list
!curlhttps://packages.cloud.google.com/apt/doc/apt-key.gpg|apt-keyadd-
!aptupdate
!aptinstallgcsfuse
然後,開啟一個你喜歡的競賽專案的 Kaggle 的 notebook,然後執行下面的程式碼獲取 GCS (Google Cloud Storage)的路徑:
fromkaggle_datasetsimportKaggleDatasets
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例項的區域資訊:
!curlipinfo.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 來訓練模型。