1. 程式人生 > >利用阿里雲容器服務打通TensorFlow持續訓練鏈路

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

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

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

隨著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容器叢集。

機器學習生產線的搭建

前期準備

  1. 建立阿里雲容器服務,參考https://yq.aliyun.com/articles/3054
  2. 建立OSS資料卷,這個具體步驟可以參考文章https://yq.aliyun.com/articles/7581
  3. 建立阿里雲日誌服務,具體步驟可以參考https://yq.aliyun.com/articles/9068

有了這些服務,我們就可以在阿里雲容器服務上和機器學習愉快的玩耍了,我們使用的例子是機器學習界的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叢集管理的機器學習解決方案,在雲端提升機器學習的效能。

想了解更多容器服務內容,請訪問https://www.aliyun.com/product/containerservice

 


本文作者:必嘫

原文連結

本文為雲棲社群原創內容,未經