如何在 GPU 深度學習雲服務裡,使用自己的資料集?

王樹義發表於2019-03-02
如何在 GPU 深度學習雲服務裡,使用自己的資料集?

本文為你介紹,如何在 GPU 深度學習雲服務裡,上傳和使用自己的資料集。

疑問

如何用雲端 GPU 為你的 Python 深度學習加速?》一文裡,我為你介紹了深度學習環境服務 FloydHub 。

文章釋出後,有讀者在後臺提出來兩個問題:

  1. 我沒有外幣信用卡,免費時長用完後,無法續費。請問有沒有類似的國內服務?
  2. 我想使用自己的資料集進行訓練,該怎麼做?

第一個問題,有讀者替我解答了。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

我看了一下,這裡的 Russell Cloud ,確實是一款跟 FloydHub 類似的 GPU 深度學習雲服務。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

可是感謝之後,我才發現原來他是 Russell Cloud 的開發人員。

於是這幾天,使用中一遇到問題,我就直接找他答疑了。

因為有這種綠色通道,響應一直非常迅速。使用者體驗很好。

這款國內服務的優勢,有以下幾點:

首先是可以支付寶與微信付款,無需 Visa 或者 Mastercard 信用卡,很方便;

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

其次是 Russell Cloud 基於阿里雲,訪問速度比較快,而且連線穩定。在上傳下載較大規模資料的時候,優勢比較明顯。與之相比,FloydHub 上傳500MB左右資料的時候,發生了兩次中斷。

第三是文件全部用中文撰寫,答疑也用中文進行。對英語不好的同學,更友好。

第四是開發團隊做了微創新。例如可以在微信小程式裡面隨時檢視執行結果,以及查詢剩餘時長資訊。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

解決了第一個問題後,我用 Russell Cloud 為你演示,如何上傳你自己的資料集,並且進行深度學習訓練。

註冊

使用之前,請你先到 Russell Cloud 上註冊一個免費賬號。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

因為都是中文介面,具體步驟我就不贅述了。

註冊成功後,你就擁有了1個小時的免費 GPU 使用時長。

如果你用我的邀請連結註冊,可以多獲得4個小時免費 GPU 使用時間。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

我手裡只有這5個可用的邀請連結。你如果需要,可以直接輸入。

看誰手快吧。

註冊之後,進入控制檯,你可以看到自己的相關資訊。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

其中有個 Token 欄目,是你的登入資訊。下面我給你講講怎麼用。

你需要下載命令列工具,方法是進入終端,執行:

pip install -U russell-cli
複製程式碼

然後你需要登入:

russell login
複製程式碼

這時候根據提示,把剛才的 Token 輸入進去,登入就完成了。

與 FloydHub 不同,大多數情況下 Russell Cloud 的身份與專案驗證,用的都是這種 Token 的方式。

如果你對終端命令列操作還不是很熟悉,歡迎參考我的《如何安裝Python執行環境Anaconda?(視訊教程)》,裡面有終端基本功能詳細執行步驟的視訊講解。

環境

下文用到的資料和執行指令碼,我都已經放到了這個 gitlab 連結

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

你可以直接點選這裡下載壓縮包,之後解壓。

解壓後的目錄裡,包含兩個子資料夾。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

cats_dogs_small_vgg16 包含我們的執行指令碼。只有一個檔案。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

它的使用方法,我們後面會介紹。

先說說,你最關心的資料集上傳問題。

資料

解壓後目錄中的另一個資料夾,cats_and_dogs_small,就包含了我們要使用和上傳的資料集。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

如上圖所示,影像資料被分成了3類。

這也是 Keras 預設使用的影像資料分類標準規範。

開啟訓練集合 train ,下面包含兩個目錄,分別是“貓”和“狗”。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

當你使用 Keras 的圖片處理工具時,擁有這樣的目錄結構,你就可以直接呼叫 ImageDataGenerator 下的flow_from_directory 功能,把目錄裡的圖片資料,直接轉化成為模型可以利用的張量(tensor)。

開啟 testvalidation 目錄,你會看到的目錄結構和 train 相同。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

請你先在 Russell Cloud 上建立自己的第一個資料集。

主頁上,點選“控制檯”按鈕。

在“資料集”欄目中選擇“建立資料集”。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

如上圖,填寫資料集名稱為“cats_and_dogs_small”。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

這裡會出現資料集的 ID ,我們需要用它,將雲端的資料集,跟本地目錄連線起來。

回到終端下面,利用 cd 命令進入到解壓後資料夾的 cats_and_dogs_small 目錄下,執行:

russell data init --id 你的資料集ID
russell data upload
複製程式碼

請把上面“你的資料集ID”替換成你真正的資料集ID。

執行這兩條命令,資料就被上傳到了 Russell Cloud。

上傳成功後,回到 Russell Cloud 的資料集頁面,你可以看到“版本”標籤頁下面,出現了1個新生成的版本。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

注意上圖右側,有一個“複製”按鈕,點選它,複製資料集該版本的 Token 。

一定要注意,是從這裡複製資訊,而不是資料集首頁的 ID 那裡。

之前因為搞錯了這個事兒,浪費了我很長時間。

執行

要執行你自己的深度學習程式碼,你需要在 Russell Cloud 上面,新建一個專案。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

你得給專案起個名稱。

可以直接叫做 cats_dog_small_vgg16

其他項保持預設即可,點選“建立專案”。

出現下面這個頁面,就證明專案新建成功。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

同樣,你需要把本地的程式碼資料夾,和剛剛新建的專案連線起來。

方法是這樣的:

複製上圖頁面的 ID 資訊。

回到終端下,利用 cd 命令進入到解壓後資料夾的 cats_dogs_small_vgg16 目錄下,執行:

russell init --id 你剛才複製的ID
複製程式碼

這樣,你在本地的修改,就可以被 Russell Cloud 記錄,並且更新任務執行配置了。

執行下面這條命令,你就可以利用 Russell Cloud 遠端的 GPU ,執行卷積神經網路訓練指令碼了。

russell run "python cats_dogs_small_vgg16_augmentation_freeze_russell.py" --gpu --data 92e239eca8e649928610d95d54bb3602:cats_and_dogs_small --env tensorflow-1.4
複製程式碼

解釋一下這條命令中的引數:

  • run 後面的引號包括部分,是實際執行的命令;
  • gpu 是告訴 Russell Cloud,你選擇 GPU 執行環境,而不是 CPU;
  • data 後面的數字串(冒號之前),是你剛剛生成的資料集版本的對應標識;冒號後面,是你給這個資料集掛載目錄起的名字。假設這裡掛載目錄名字叫“potato”,那麼在程式碼裡面,你的資料集位置就是“/input/potato”;
  • env 是整合深度學習庫環境名稱。我們這裡指定的是 Tensorflow 1.4。更多選項,可以參考文件說明
如何在 GPU 深度學習雲服務裡,使用自己的資料集?

輸入上述命令後, Russell Cloud 就會把你的專案程式碼同步到雲端,然後根據你指定的引數執行程式碼。

你在本地,是看不到執行結果的。

你需要到網頁上,檢視“任務”下“執行日誌”,在系統提供的模擬終端下,檢視執行輸出結果。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

為了把好不容易深度學習獲得的結果儲存下來,你需要用如下語句儲存模型:

saved_model = output_dir / `cats_and_dogs_small_finetune.h5`
model.save(saved_model)
複製程式碼

history.history 物件裡,包含了訓練過程中的一些評估資料,例如準確率(acc)和損失值(loss),也需要儲存。

這裡你可以採用 pickle 來完成:

import pickle
with open(Path(output_dir, `data.pickle`), `wb`) as f:
	pickle.dump(history.history, f)
複製程式碼

細心的你,一定發現了上述程式碼中,出現了一個 output_dir, 它的真實路徑是 output/

它是 Russell Cloud 為我們提供的預設輸出路徑。存在這裡面的資料,在執行結束後,也會在雲端儲存空間中儲存下來。

你可以在“任務記錄”的“輸出”專案下看到儲存的資料。它們已被儲存成為一個壓縮包。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

下載下來並解壓後,你就可以享受雲端 GPU 的勞動果實了。

你可以用 history 儲存的內容繪圖,或者進一步載入訓練好的模型,對新的資料做分類。

如何在 GPU 深度學習雲服務裡,使用自己的資料集?

改進

在實際使用Russell Cloud中,你可能會遇到一些問題。

我這裡把自己遇到的問題列出來,以免你踩進我踩過的坑。

首先,深度學習環境版本更新不夠及時。

本文寫作時 Tensorflow 穩定版本已經是 1.8 版,而 Russell Cloud 最高支援的版本依然只有 1.6。文件裡面的最高版本,更是還停留在 1.4。預設的 Keras,居然用的還是 Python 3.5 + Tensorflow 1.1。

注意千萬別直接用這個預設的 Keras ,否則 Python 3.6 後版本出現的一些優秀特性無法使用。例如你將 PosixPath 路徑(而非字串)作為檔案地址引數,傳入到一些函式中時,會報錯。那不是你程式碼的錯,是執行環境過於老舊。

其次,螢幕輸出內容過多的時候(例如我跑了 100 個 epoch, 每個顯示 100 條訓練進度),“執行日誌”網頁上模擬終端往下拉,就容易出現不響應的情況。變通的方法,是直接下載 log 檔案,閱讀和分析。

第三,Keras 和 Tensorflow 的許多程式碼庫(例如使用預訓練模型),都會自動呼叫下載功能,從 github 下載資料。但是,因為國內的伺服器到 github 之間連線不夠穩定,因此不時會出現無法下載,導致程式超時,異常退出。

上述問題,我都已經反饋給開發者團隊。對方已表示,會盡快加以解決。

如果你看到這篇文章時,上面這些坑都不存在了,那就再好不過了。

小結

本文為你推薦了一款國內 GPU 深度學習雲服務 Russell Cloud 。如果你更喜歡讀中文文件,沒有外幣信用卡,或是訪問 FloydHub 和 Google Colab 不是很順暢,都可以嘗試一下。

通過一個實際的深度學習模型訓練過程,我為你展示瞭如何把自己的資料集上傳到雲環境,並且在訓練過程中掛載和呼叫它。

你可以利用平臺贈送的 GPU 時間,跑一兩個自己的深度學習任務,並對比一下與本地 CPU 執行的差別。

喜歡請點贊。還可以微信關注和置頂我的公眾號“玉樹芝蘭”(nkwangshuyi)

如果你對資料科學感興趣,不妨閱讀我的系列教程索引貼《如何高效入門資料科學?》,裡面還有更多的有趣問題及解法。

相關文章