利用阿里雲容器服務打通TensorFlow持續訓練鏈路

本系列將利用Docker和阿里雲容器服務,幫助您上手TensorFlow的機器學習方案python

本文是該系列中的第三篇文章, 將爲您介紹如何利用阿里雲的服務快速搭建TensorFlow從訓練到服務的交付平臺。docker

隨着google開源TensorFlow的腳步愈來愈迅猛,機器學習已經漸漸由昔日王謝堂前燕,飛入尋常百姓家。如何把機器學習的成果,迅速轉化成服務大衆的產品。以TensorFlow爲例,一個典型的交付流程,就是TensorFlow根據輸入數據進行模型訓練,待訓練結束和驗證肯定後,模型會被髮布到TensorFlow Serving,就能夠爲大衆服務了。若是能像流水線生產一輛汽車同樣來實現機器學習的產品化,聽起來是否是讓人激動不已?服務器

可是理想很豐滿,現實很骨感,一個完整可用的機器學習生產線並非只有TensorFlow和TensorFlow Serving就夠用的,若是但願這個過程更加高效和自動化,它還須要在一些基礎架構層面的支持,好比:架構

  1. 機器學習過程當中從系統到應用的監控,其中包括併發

    1. 總體計算資源特別是GPU的使用狀況:使用率,內存,溫度
    2. 每一個機器學習應用的具體使用資源狀況
    3. 機器學習過程的可視化
  2. 快速高效的問題診斷 
    經過集中化日誌的管理控制檯進行輕鬆的一站式問題診斷
  3. 一鍵式的失敗恢復運維

    1. 從失敗節點調度到可用節點
    2. 分佈式存儲保存計算中的checkpoint,能夠隨時在其它節點繼續學習任務
  4. 模型的持續改進和發佈機器學習

    1. 利用分佈式存儲將模型無縫遷入生產環境
    2. 藍綠髮布
    3. 模型回滾

下面咱們就展現一下利用阿里雲容器服務快速的搭建一套從模型學習到發佈的過程,這會是個逐步迭代不斷優化的方案.咱們後面的文章會不斷迭代優化這一方案,但願容器服務在應用交付和運維方面的經驗幫助數據科學家們專一於機器學習價值自己,進而提供最大的價值。目前咱們的方案運行在CPU機器上,將來待HPC與容器服務的集成完成後,這個方案很是容易遷移到HPC容器集羣。分佈式

機器學習生產線的搭建

咱們能夠在阿里雲容器服務上和機器學習愉快的玩耍了,咱們使用的例子是機器學習界的Helloworld --- MNIST性能

MNIST是一個入門級的計算機視覺數據集,它包含各類手寫數字圖片: 學習

它也包含每一張圖片對應的標籤,說明這個是數字幾。好比,上面這四張圖片的標籤分別是5,0,4,1

  1. 首先確認OSS數據卷mnist_model被建立出來了, 而且要在mnist_model建立Minst_data文件夾,並下載所需的訓練集與測試集數據
文件 內容
train-images-idx3-ubyte.gz 訓練集圖片 - 55000 張 訓練圖片, 5000 張 驗證圖片
train-labels-idx1-ubyte.gz 訓練集圖片對應的數字標籤
t10k-images-idx3-ubyte.gz 測試集圖片 - 10000 張 圖片
t10k-labels-idx1-ubyte.gz 測試集圖片對應的數字標籤

2. 用以下的docker-compose模板在阿里雲上一鍵部署TensorFlow Learning的環境,

version: '2'
services:
  tensor:
    image: registry-vpc.cn-hangzhou.aliyuncs.com/cheyang/mnist-export
    command:
       - "python" 
       - "/mnist_export.py"
       - "--training_iteration=${TRAIN_STEPS}"
       - "--export_version=${VERSION}"
       - "--work_dir=/mnist_export/Minst_data"
       - "/mnist_export/mnist_model"
    volumes:
       - mnist_model:/mnist_export
    labels:
       - aliyun.log_store_mnist=stdout
    environment:
      - CUDA_VISIBLE_DEVICES=-1

注:

aliyun.log_store_mnist 指示會把日誌導入到阿里雲的日誌服務中,在這裏默認是從stdout導入

Volumes使用的就是容器服務的OSS數據卷

因爲咱們的測試環境是搭建在VPC環境,因此使用的docker image都是須要訪問阿里雲的vpc registry

在阿里容器服務中建立應用時,就會彈出對話框,裏面須要輸入的是模型版本訓練參數,咱們輸入的模型版本爲1和訓練參數爲100

有了aliyun.log_store_mnist,就能夠在阿里雲的日誌服務中看到整個學習過程, 方便問題的分析和診斷 

當學習任務完成後,能夠登陸到服務器上看到學習出來的模型

sh-4.2# cd /mnist/model/
sh-4.2# ls
00000001

3. 如今須要作的事情就是啓動一個TensorFlow Serving把學習出來的模型發佈到生產環境,這裏提供以下的docker-compose模板

version: '2'
services:
  serving:
    image: registry-vpc.cn-hangzhou.aliyuncs.com/denverdino/tensorFlow-serving
    command:
       - "/serving/bazel-bin/tensorFlow_serving/model_servers/tensorFlow_model_server"
       - "--enable_batching"
       - "--port=9000"
       - "--model_name=mnist"
       - "--model_base_path=/mnist_model"
    volumes:
       - mnist_model:/mnist_model
    labels:
       - aliyun.log_store_serving=stdout
    ports:
      - "9000:9000"
    environment:
      - CUDA_VISIBLE_DEVICES=-1

注:

這裏TensorFlow Serving和TensorFlow Learning經過分佈式存儲共享學習模型(這裏用的是OSS,其實更換成NAS數據卷也是很是容易的)

4. 能夠在日誌服務中直接查看一下TensorFlow Serving的日誌,發現版本1的模型已經加載到了serving中了

同時須要查看一下該服務的Endpoint,在這裏TensorFlow Serving的Endpoint是10.24.2.11:9000。固然咱們還能夠將服務發佈到SLB上,這在文章利用Docker和阿里雲容器服務輕鬆搭建TensorFlow Serving集羣中已經有了比較詳細的描述,就不在本文中贅述了。

5. 爲了驗證TensorFlow Serving,須要部署一個測試的客戶端,下面是測試客戶端的docker-compose模板

version: '2'
services:
  tensor:
    image: registry-vpc.cn-hangzhou.aliyuncs.com/denverdino/tensorFlow-serving
    command:
      - "/serving/bazel-bin/tensorFlow_serving/example/mnist_client"
      - "--num_tests=${NUM_TESTS}"
      - "--server=${SERVER}"
      - "--concurrency=${CONCURRENCY}"

建立應用的時候就會須要輸入測試次數NUM_TESTS,TensorFlow Serving的EndpointSERVER,以及併發訪問量CONCURRENCY

當應用建立完成後,能夠看到運行結果以下,咱們發現這時候的錯誤率是13.5

serving-client_tensor_1 | 2016-10-11T12:46:59.314358735Z D1011 12:46:59.314217522       5 ev_posix.c:101]             Using polling engine: poll
serving-client_tensor_1 | 2016-10-11T12:47:03.324604352Z ('Extracting', '/tmp/train-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:03.324652816Z ('Extracting', '/tmp/train-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:03.324658399Z ('Extracting', '/tmp/t10k-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:03.324661869Z ('Extracting', '/tmp/t10k-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:04.326217612Z ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
serving-client_tensor_1 | 2016-10-11T12:47:04.326256766Z Inference error rate: 13.5%
serving-client_tensor_1 | 2016-10-11T12:47:04.326549709Z E1011 12:47:04.326484533      69 chttp2_transport.c:1810]    close_transport: {"created":"@1476190024.326451541","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}

6. 爲了提高識別效果,就須要調整參數從新運行一次TensorFlow Learning應用從新發起一次訓練.能夠直接在容器雲服務的頁面點擊變動配置

這時會彈出對話框,裏面須要輸入的是模型版本訓練參數,咱們輸入的模型版本爲2和訓練參數爲2000

當學習完成後,再次查看NAS服務器,發現多了一個新的模型

sh-4.2# pwd
/mnist/model/
sh-4.2# ls
00000001  00000002

而這個時候查看TensorFlow Serving的日誌,就會發現模型已經更新到了版本2

此時從新運行測試客戶端,能夠發現錯誤率下降到8.5%,看到新的模型在識別能力上有必定的提高

serving-client_tensor_1 | 2016-10-11T16:54:34.926822231Z D1011 16:54:34.926731204       5 ev_posix.c:101]             Using polling engine: poll
serving-client_tensor_1 | 2016-10-11T16:54:37.984891512Z ('Extracting', '/tmp/train-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:37.984925589Z ('Extracting', '/tmp/train-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:37.984930097Z ('Extracting', '/tmp/t10k-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:37.984933659Z ('Extracting', '/tmp/t10k-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:39.038214498Z ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
serving-client_tensor_1 | 2016-10-11T16:54:39.038254350Z Inference error rate: 8.5%
serving-client_tensor_1 | 2016-10-11T16:54:39.038533016Z E1011 16:54:39.038481361      68 chttp2_transport.c:1810]    close_transport: {"created":"@1476204879.038447737","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}

PS:整個工做流程中,咱們並無SSH登陸到任何主機上,徹底是在容器服務管理平臺上操做的。

總結

這僅僅是一個開始,TensorFlow和TensorFlow Serving也僅僅是一個描述阿里雲容器服務對於高性能計算支持的一個例子,在本節中,咱們經過OSS實現了從把學習出的模型交付到對外服務,而且實現了模型的迭代,同時又利用日誌服務一站式查看容器工做日誌。這種方式只是實現了最基本的持續學習持續改善的概念,在生產環境還須要更加嚴格的驗證和發佈流程,咱們將在將來文章中,介紹咱們的方法和實踐。

阿里雲容器服務還會和高性能計算(HPC)團隊一塊兒配合,以後在阿里雲上提供結合GPU加速和Docker集羣管理的機器學習解決方案,在雲端提高機器學習的效能。


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索