天天看點

以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成

4月份跟同學在天池做了一個 FashionAi的比賽,由于沒有自己的伺服器,隻能去隔壁實驗室借用伺服器,在每天晚上簡單跑一跑訓練,測試模型的機會都不多,更不要提調參。最終比賽也是不了了之。

當時也有考慮租用伺服器,但是價格有點高,不是我輩屌絲能夠承受,是以也沒有多了解。前不久偶然發現google cloud platform 可以免費試用,ML engine 更是可以免費适用,簡直是我輩福音,于是試用了一下,感覺還不錯。在學習使用的過程中,查找到的資料很有限,官方文檔寫的十分詳細,但是感覺有些繁瑣;火山岩上的小紅花的部落格寫的十分詳細,尤其在gcp的配置和訓練任務的送出方面。是以本次就不再就gcp配置上進行贅述,而是就訓練任務的送出上以案例——mnist手寫數字識别——為例進行描述,幫助剛入坑的小白進行了解,同時解決了兩個常見的問題。

前言

在使用之前首先要確定:

1. 完成了谷歌雲項目的配置。

2. 付款賬号的建立和綁定和費用支付

3. ML Engine API的設定和啟用

4. 憑據的設定

5. cloud sdk的下載下傳和初始化

等一系列的gcp的配置和初始化操作,詳細步驟可以參考火山岩上的小紅花的部落格,裡面寫的非常細緻。

在此項目中,我們主要調用了gcp的兩個服務,一個是谷歌雲提供的雲儲存服務,用于儲存訓練資料,網絡模型及參數,預測資料和預測結果等檔案。另一個是Machine Learning Machine 用于對送出的訓練任務進行訓練。

建立用于存儲資料和模型的bucket

每個使用者都可以建立多個項目,每個項目中均可以建立多個存儲分區,即bucket,在bucket中可以存放用于讀寫的各類檔案。

首先在首頁中點選左上角的導航菜單,選擇:存儲——浏覽器,在打開的浏覽器界面中可以看到你現在所有的所有bucket,點選建立存儲分區。

以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成

為bucket命名為mnist_mine,在regional中選擇us-east1,因為這個區域的價格較低而且還可以使用gpu。是以我們在google platform 上就擁有了一個存儲空間:gs://mnist_mine 用于存儲mnist訓練過程中需要的訓練資料和訓練出的結果和模型。

以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成

這時我們可以通過shell 或者sdk使用指令gsutil 系列指令對該bucket進行操作例如:

gsutil cp filename gs://mnist_mine           

訓練資料的擷取

由于在keras的資料庫中有mnist的包,我們可以直接調用,在雲端下載下傳,無需手動導入訓練資料。

from keras.dataset import mnist           

如想導入自己的資料,方法與下面将待測資料導入bucket的方法相同

待預測資料導入bucket

測試的資料全部在test.csv檔案中,如果我們想使用ML Engine進行模型的訓練和預測,可以将所需的資料全部導入到之前建立的bucket中,在ML Engine任務中對bucket中的資料進行讀取。

在我們之前建立好的bucket(mnist_mine)中建立檔案夾result将test.csv檔案導入,導入方法有兩種:

1、在已經安裝了gcp的sdk的主機上,可以直接使用gsutil指令進行複制。使用指令行cd到test.csv所在的目錄下,輸入指令:

gsutil cp test.csv gs://mnist_mine/result           

2、直接使用gcp網頁中的可視化操作。來到result目錄下,上傳檔案,按照提示進行操作即可。

訓練任務檔案打包

按照官方指導文檔建立如下所示檔案目錄結構:

以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成

其中,init.py檔案是初始化檔案,是一個空檔案。task.py檔案是訓練任務主函數檔案。setup.py檔案是用于配置ML engine中訓練任務所需的環境。在目錄trainer下還需要添加config.yaml檔案用于配置ML engine中調用gpu的參數。

需要注意的是,使用setup.py按照圖中方式進行任務環境配置時,采用的是pip install的方式,如果pip的庫裡面沒有的包是無法使用的,需要用别的方式進行配置,配置方法可看下我的另一篇部落格。

該項目中,我使用的是keras架構,是以需要在ML Engine中配置keras架構(其實作在最新版本的TensorFlow已經内置了keras,我用的不是太習慣。。。)。

在本次mnist項目中,任務的目錄及檔案可以在我的github中找到。

訓練任務送出

在送出任務時,需要同時送出任務的各種參數:

gcloud ml-engine jobs submit training JOB --module-name=MODULE_NAME \
[--config=CONFIG] [--job-dir=JOB_DIR] [--labels=[KEY=VALUE,…]] \
[--package-path=PACKAGE_PATH] [--packages=[PACKAGE,…]] \
[--python-version=PYTHON_VERSION] [--region=REGION] \
[--runtime-version=RUNTIME_VERSION] [--scale-tier=SCALE_TIER] \
[--staging-bucket=STAGING_BUCKET] [--async     | --stream-logs] \
[GCLOUD_WIDE_FLAG …] [-- USER_ARGS …]           

常用的參數有:

JOB:任務名稱;

–module-name=MODULE_NAME:需要運作的檔案(子產品);

–job-dir=JOB_DIR:任務輸出目錄;

–runtime-version=RUNTIME_VERSION:預設調用版本為1.0,不支援python3,但是最新版本為1.6,可以支援Python3.5

–python-version=PYTHON_VERSION:調用python版本,預設為python2。

其他的參數詳見官方文檔。

任務的送出可以從gcp shell中進行,也可以在本地通過sdk進行。在本項目中,cd到上述檔案結構中的trainer所在的目錄下,運作以下代碼即可:

gcloud ml-engine jobs submit training mnisttest --module-name trainer.task\
 --staging-bucket gs://mnist_mine --package-path trainer \
 --python-version=3.5 --runtime-version=1.6 --config trainer/config.yaml           

如送出成功可以看到:

以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成

同時,在作業中(導航菜單-機器學習引擎-作業)可以看到正在運作的任務:

以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成

也可以通過“view logs”檢視任務的詳細日志。

任務完成

等任務完成後,可以看到正在運作的任務已完成,同時也可以在bucket中看到任務的輸出。

以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成
以Mnist手寫體識别為例,使用Google ML Engine 訓練神經網絡前言建立用于存儲資料和模型的bucket訓練資料的擷取待預測資料導入bucket訓練任務檔案打包訓練任務送出任務完成

訓練好的模型以及預測的結果都乖乖的躺在bucket裡,直接導出來就可以用了~

繼續閱讀