1. 程式人生 > >如何在 GPU 深度學習雲服務裡,使用自己的資料集?

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

640?wx_fmt=jpeg

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

(由於微信公眾號外部連結的限制,文中的部分連結可能無法正確開啟。如有需要,請點選文末的“閱讀原文”按鈕,訪問可以正常顯示外鏈的版本。)

疑問

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

  1. 我沒有外幣信用卡,免費時長用完後,無法續費。請問有沒有類似的國內服務?

  2. 我想使用自己的資料集進行訓練,該怎麼做?

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

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

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

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

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=png

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

註冊

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

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg

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

看誰手快吧。

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

640?wx_fmt=png

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

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

pip install -U russell-cli

然後你需要登入:

russell login

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

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

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

環境

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

640?wx_fmt=jpeg

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

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

資料

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

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg

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

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

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

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

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

russell data init --id 你的資料集ID
russell data upload

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

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

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

640?wx_fmt=jpeg

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

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

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

執行

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

640?wx_fmt=jpeg

你得給專案起個名稱。

可以直接叫做 cats_dog_small_vgg16

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

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

640?wx_fmt=png

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

方法是這樣的:

複製上圖頁面的 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。更多選項,可以參考文件說明。

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg

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

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 為我們提供的預設輸出路徑。存在這裡面的資料,在執行結束後,也會在雲端儲存空間中儲存下來。

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

640?wx_fmt=jpeg

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

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

640?wx_fmt=jpeg

改進

在實際使用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)。

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