FloydHub 初體驗

寫在前面

在深度學習大熱的當下,很多公司都推出了有關深度學習的一系列服務。大家相對熟悉的可能是 Amazon 的 AWS (Amazon Web Service),在 AWS 上我們可以創建常式,然後用 Amazon 提供的雲計算伺服器跑我們自己的深度學習演算法。

但是,在使用 AWS 訓練過幾次自己的模型之後就發現…… AWS 真的挺貴的(吃土少年的日常)。同時,如果我們創建了常式,跑完了程序,但是忘記關閉那個常式,那我們的錢就悄無聲息的灰飛湮滅了(別問我怎麼知道的……)。

當然,AWS 提供的服務不止於為深度學習訓練模型提供計算能力,但是最近就有一家公司瞄準了深度學習算力需求這一片市場,也就是我們馬上要介紹的 FloydHub。

FloydHub 簡介

先放上一幅他們官網 (FloydHub - Deep Learning Platform - Cloud GPU) 截圖以示敬意。

FloydHub 作為一個專註於深度學習的雲計算平台可以說還是比較良心的。至少從他們的宗旨來看,大概就是讓我們專心搞我們的科研,其他的不管是環境配置啊、部署問題啊、硬體啊、版本控制啊之類的,就一律不用操心啦!

我們先來看一下他們提供的服務怎麼樣。

  • 環境

看起來他們支持的環境確實還是很多的,TF啊、Keras啊、PyTorch啊、theano啊(聽說不再更新了?)都有,基本可以保證大部分群眾的需求了,感覺還是很良心的。

  • 硬體

硬體上支持 CPU 和 GPU 兩種配置。我們更關心的 GPU 使用的是 K80,和 AWS 使用的硬體貌似是一樣的,但是看起來價格要便宜不少。既然這樣,我們就再看看價格。

  • 價格

FloydHub 給我們提供了以上三大類總共五種套餐可以選擇(官網傳送門),作為一個吃土少年我只關心最便宜的套餐。免費套餐給我們提供單線程算力,每個月有 20 個小時免費使用他們的 CPU 進行運算,雲存儲空間為 10GB。看起來只有付費才可以使用他們的多線程服務和 GPU 進行運算。

不過我看到下面有寫 Start Free Trial,難道可以免費體驗聽說只要是第一次使用 FloydHub ,我們就可以有 100 個小時的免費使用時間。所以他們真的這麼好么?我決定親自體驗一下。

開始使用

1) 註冊

首先,我們要先在官網註冊。註冊過程很簡單:

所以大家盡情的去他們的官網 SIGN UP FOR FREE 吧!

2) 安裝 Floyd CLI

Floyd CLI 是基於 Python 的命令行工具,能夠讓我們通過終端訪問 FloydHub 。我們需要用 pip 來安裝這個工具,如果沒有 pip 的話可以看一下這個鏈接。通過一句簡單的命令行就可以成功安裝啦:

$ pip install -U floyd-cli

如果有其他需求,可以參見安裝官方文檔。

安裝完之後可以通過 --help 的方式獲取幫助。

$ floyd --helpUsage: floyd [OPTIONS] COMMAND [ARGS]... Floyd CLI interacts with Floyd server and executes your commands. More help is available under each command listed below....

3) 登錄

登錄的方法也很簡單,在命令行中執行以下操作:

$ floyd loginAuthentication token page will now open in your browser. Continue? [Y/n]: yPlease copy and paste the authentication token.This is an invisible field. Paste token and press ENTER:

然後,會自動打開一個網頁鏈接,顯示出你的登錄令牌 (Authentication Token):

把登錄令牌粘貼到終端之後就登錄成功了!

Login Successful

同樣,貼出登錄命令官方文檔以便大家查閱。

4) 創建項目

這裡所說的項目 (project) 其實和 GitHub 裡面的 Repository 比較像,我們在創建新項目時只需要給出一個項目名稱就可以創建一個新的項目了。

類似 GitHub,我們也可以在這個項目下加一個 README 文件,只要創建一個 .md 為擴展名的文件就可以了。詳見創建項目官方文檔。

實驗

對 FlyodHub 有了初步的了解之後,我打算做兩個實驗,一個是直接運行 python 代碼,第二個是運行 jupyter notebook 文件。為了簡單起見,我們就用 MNIST 的數據來做數字分類這個任務吧。

  • 實驗一

每個人一開始都會有一個自己的叫做 quick-start 的項目,我們可以用這個項目來做第一個實驗。FloydHub 官方提供了一個用於大家體驗 FloydHub 的 Repository,所以我們先 clone 以下。

$ git clone https://github.com/floydhub/quick-start.gitCloning into quick-start......$ cd quick-start$ lseval.py LICENSE mnist_cnn.ipynb README.md train_and_eval.py train.py

在這個實驗里,我們要用到 train.py 來訓練 CNN 進行數字分類。

首先,我們要在這個文件所在的路徑初始化我們的項目:

$ floyd init quick-startProject "quick-start" initialized in the current directory

初始化之後,我們就要開始考慮怎麼搞到數據了。我們實驗中所要用到的數據 MNIST 存儲在這個地方,這裡我們可以了解以下 FloydHub 的數據集特徵。

數據是 FloydHub 的一個針對深度學習比較人性的設計。在 FloydHub 上,官方提供了很多常用數據集給我們使用,同時我們還可以上傳自己的數據集和別人共享(上傳數據集的方法可以查看數據集上傳官方文檔)。如果我們想搞一些數據自己玩的話,還可以在 Explore 頁面下搜索類似 data 等欄位,就可以找到很多有意思的資源了。

現在有了數據有了模型,我們就可以開始訓練了!

嘗試一下下面的代碼:

$ floyd run --gpu --data mckay/datasets/mnist/1:/mnist --env tensorflow-1.3 "python train.py"

然後…… 我就得到了這樣的結果……

Error: You do not have enough credits to run this job. Please upgrade your plan or buy a powerup to continue running jobs

所以,傳說中 100 個小時的免費試用什麼的都是騙人的…… ([2017.11.05 更新] 感謝 @暖豆 評論區提醒,現在註冊會提供兩個小時的免費GPU服務!)

既然這樣,吃土少年只能給大家做基於 CPU 的實驗演示了。(如果以後有錢了再來補上 GPU 的體驗)

$ floyd run --data mckay/datasets/mnist/1:/mnist --env tensorflow-1.3 "python train.py"Creating project run. Total upload size: 30.8KiBSyncing code ...[================================] 33261/33261 - 00:00:02JOB NAME----------------------alice/projects/mnisteric_yaoj/projects/quick-start/2To view logs enter: floyd logs eric_yaoj/projects/quick-start/2

這樣一來我們就通過免費的 CPU 運行了第一個項目。

在這個 floyd run 的背後,有一系列進程在運行:

  • 將我們的代碼同步到 FloydHub 的伺服器
  • 在雲端為我們提供一個 CPU 常式 (如果我們用了 --gpu 則會為我們提供 GPU )
  • 在雲端配置深度學習環境,安裝 TensorFlow 1.3 (因為我們設置了 --env tensorflow-1.3)
  • 在環境中運行命令行 python train.py
  • 存儲輸出日誌並生成輸出數據
  • 一旦命令終止執行,自動終結 CPU 常式

讓我們再仔細看一看我們剛才的命令行:

$ floyd run --gpu --data mckay/datasets/mnist/1:/mnist --env tensorflow-1.3 "python train.py"

  • --gpu

這句命令聲明了我們將要使用 GPU 作為計算機硬體,如果去掉這行,就像我後來做的,那麼就默認使用 CPU 作為計算機硬體。

  • --data mckay/datasets/mnist/1:/mnist

這一行聲明了我們要用什麼樣的數據集進行計算。--data 後面的這部分我們可以利用中間的冒號 : 拆分為兩部分

  1. mckay/datasets/mnist/1
  2. /mnist

第一部分聲明了我們要用到的數據集的名稱:floydhub.com/mckay/data,點開這個鏈接之後,我們會發現:

紅框中的這個文件名,就是我們需要的數據集的名稱。

第二部分聲明了在雲端伺服器上我們將數據存儲的地址,在這裡就是 mnist。

這兩部分中間,我們用 : 間隔開。

最終組合起來就成功聲明了我們運算時要用的數據集。這裡只對最基本的數據集使用方法進行了介紹,更多有關使用數據的信息可以參見數據集調用官方文檔。

  • --env tensorflow-1.3

這部分聲明了我們將要在伺服器上安裝 TensorFlow 1.3 來為我們的代碼配置環境。更多有關環境配置的信息可以參見環境配置官方文檔。

  • "python train.py"

這部分聲明了在伺服器上要運行的命令行,從而運行我們的代碼。更多有關命令行的信息可以參見命令行官方文檔。

我們的程序在 FloydHub 上運行的時候,我們可以查看當前線程的工作狀態:

$ floyd statusJOB NAME CREATED STATUS DURATION(s) INSTANCE DESCRIPTION------------------- --------- -------- ----------- --------- -----------alice/quick-start:1 just now running 15 gpu

同時,我們還可以查看線程日誌來實時查看程序運行情況:

$ floyd logs -t alice/quick-start/1...2017-07-12 16:00:07,446 INFO - Starting attempt 1 at 2017-07-12 16:00:07.4363492017-07-12 16:00:09,088 INFO - Starting container...2017-07-12 16:00:09,297 INFO -...##############################################################################2017-07-12 16:00:09,297 INFO - Run Output:2017-07-12 16:01:46,154 INFO - Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.2017-07-12 16:01:46,158 INFO - Iter 1280, Minibatch Loss= 39855.289062, Training Accuracy= 0.179692017-07-12 16:01:46,159 INFO - Iter 2560, Minibatch Loss= 14964.132812, Training Accuracy= 0.42969...##############################################################################...

當然,我們也可以通過網頁(floydhub.com/<username>/projects/quick-start/<job_number>)來實時監控:

在訓練完我們的模型之後,我們當然希望能夠把訓練好的模型儲存起來以便下一次使用。這部分代碼在 train.py 中的第 108 行實現了:

builder = tf.saved_model.builder.SavedModelBuilder("/output/cnn_model")

習慣性上我們把模型存儲在了 /output 地址下,以便以後使用。更多有關存儲結果的細節可以參考存儲結果官方文檔。

為了實踐一下,我們現在可以用 eval.py 來衡量一下我們的模型。方法很簡單,只要在剛才命令行的基礎上加一行:

--data alice/projects/quick-start/1/output:/model

這裡我們設置 /model 為我們讀取數據的地址是因為在 eval.py 中,我們將要從這個地址調取我們儲存好的模型文件。

$ floyd run --gpu --env tensorflow-1.3 --data mckay/datasets/mnist/1:/mnist --data ericyaoj/projects/quick-start/2/output:/model "python eval.py"Creating project run. Total upload size: 26.3KiBSyncing code ...[================================] 28620/28620 - 00:00:01JOB NAME---------------------------ericyaoj/projects/quick-start/5To view logs enter: floyd logs ericyaoj/projects/quick-start/5

全部運行之後,我們就可以得到類似這樣的結果,在常式日誌中,我們可以看到我們剛剛訓練的模型的準確度:

2017-10-01 03:22:21,871 INFO - Pulling Docker image: floydhub/tensorflow:1.3.0-py3_aws.122017-10-01 03:22:23,099 INFO - Starting container...2017-10-01 03:22:23,591 INFO - ################################################################################2017-10-01 03:22:23,592 INFO - Run Output:2017-10-01 03:22:54,529 INFO - Extracting /mnist/train-images-idx3-ubyte.gz2017-10-01 03:22:54,820 INFO - Extracting /mnist/train-labels-idx1-ubyte.gz2017-10-01 03:22:54,883 INFO - Extracting /mnist/t10k-images-idx3-ubyte.gz2017-10-01 03:22:54,951 INFO - Extracting /mnist/t10k-labels-idx1-ubyte.gz2017-10-01 03:22:57,295 INFO - Testing Accuracy: 0.9843752017-10-01 03:22:57,563 INFO - ################################################################################...

類似這樣,我們可以循環往複的運行我們的深度學習代碼啦!

我們所有的線程運行都會記錄在我們的 Dashboard 中:

他們的成功與否、使用的硬體、環境配置、運行時間等等信息都會列在這裡。

  • 實驗二

相信大部分同學在用 jupyter notebook 跑自己的深度學習代碼,那麼我們再來嘗試一下在 FloydHub 上面做第二個實驗,跑我們的 notebook。

和剛才類似,我們新建立一個項目,名字就叫 mnist-pytorch吧:

同樣是 MNIST 數據,但這次我們用 pytorch 來實現。示例代碼可以從 FloydHub 提供的 Repository 下載:

$ git clone https://github.com/floydhub/quick-start-pytorch.gitCloning into quick-start-pytorch...$ cd quick-start-pytorch$ lsREADME.md mnist.ipynb

這次試驗我們要用到的是 mnist.ipynb .

類似上一次我們的操作,先在對應的文件路徑中初始化:

$ floyd init mnist-pytorchProject "mnist-pytorch" initialized in the current directory

然後我們在 run 命令行中要使用 --mode jupyter 來聲明我們想要使用 notebook 來運行。

$ floyd run --mode jupyter --gpu --env pytorch-0.2Creating project run. Total upload size: 21.9KiBSyncing code ...[================================] 23333/23333 - 00:00:00NAME--------------------saip/projects/mnist-pytorch/3Setting up your instance and waiting for Jupyter notebook to become available ..............Path to jupyter notebook: https://www.floydhub.com/notebooks/pCoPyzZtYeo6mE9PpSWsmY

和上一次實驗相比,這一次初始化的時間更長(有可能是因為我在歐洲,所以沒有本地伺服器的問題?)。但在這段時間裡,Floyd 在後台為我們:

  • 將本地代碼同步到 FloydHub 的伺服器上
  • 在雲端為我們提供一個 CPU 常式 (這裡我用了 --gpu 假裝是富人)
  • 在雲端配置深度學習環境,安裝 PyTorch(因為我們設置了 --env pytorch)
  • 在雲端開啟一個 Jupyter 伺服器,在我們的瀏覽器中打開 url 地址

我們可以像平常一樣,在 Jupyter Notebook 里進行操作和計算。

類似的,通過 status 命令,我們可以查看當前線程運行狀態(假裝 GPU 大佬):

$ floyd status ericyaoj/mnist-pytorch/projects/1JOB NAME CREATED STATUS DURATION(s) INSTANCE DESCRIPTION---------------------- -------------- -------- ------------- ---------- -------------ericyaoj/mnist-pytorch/projects/1 16 minutes ago running 0 gpu

同樣,我們可以在網頁上查看運行狀態:

最後要說的就是如何關掉這個常式,也就是怎麼省錢了:

首先,點擊紅圈裡的 Cancel :

然後點擊 Confirm :

到此為止,我們就成功的關掉了我們的線程。

實驗總結

到了這裡,我們就基本通過兩個實驗一步步示範了如何使用 FloydHub 來進行深度學習模型的訓練了。

如果想要查看我們賬戶的使用情況,也就是我們還有多長時間的 CPU 和 GPU 資源可以使用,可以在 Usage 網頁 查看:


小結

FloydHub 總體來說,更加面向深度學習領域的用戶,用戶體驗還是很不錯的!但是本人作為一個小白,希望能在日後的學習過程中有更多的體會。希望這篇文章能夠對大家有所幫助,也歡迎大家一起交流學習!

參考資料

[1] FloydHub - Core Concept

[2] FloydHub - Getting Started Tutorial

[3] FloydHub - Getting Started Tutorial - Jupyter Notebook

[4] FloydHub - Commands

[5] FloydHub - Environments

[6] FloydHub - Mounting Data


推薦閱讀:

TAG:雲計算平台 | 深度學習DeepLearning | GPU通用計算 |