docker-機器學習/深度學習模型部署的容器化方案

目前,使用docker部署機器學習或深度學習模型正在成爲企業大規模部署的一種常規操作。基於目前工作的情況,剛好可以使用現成的模型嘗試使用docker進行部署。主要有以下

1. 什麼是docker
2. 個性化環境的定製開發-Dockerfile的製作
3. docker常用命令
4. 模型部署

什麼是docker

Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
它有以下幾點優勢:

  1. 更快速的交付和部署 ;Docker在整個開發週期都可以完美的輔助你實現快速交付。Docker允許開發者在裝有應用和服務本地容器做開發。可以直接集成到可持續開發流程中。例如:開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
  2. 高效的部署和擴容;Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。Docker的兼容性和輕量特性可以很輕鬆的實現負載的動態管理。你可以快速擴容或方便的下線的你的應用和服務,這種速度趨近實時。
  3. 更高的資源利用率;Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啓動 10 個隔離的應用即可。
  4. 更簡單的管理;使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。

個性化環境的定製開發-Dockerfile的製作

針對常見業務場景,每個人電腦開發的開發環境都不一樣,要不就是python版本不一樣,要不就是TensorFlow版本不一樣,避免出現我的代碼只能在自己機器上跑的尷尬局面出現,因此建立一個統一的開發部署環境就成爲必然。Dockerfile正是爲此而誕生。Dockerfile的常用命令有以下幾種

  1. FROM,獲取基礎鏡像
  2. COPY,複製本機文件到docker容器的指定目錄中
  3. ADD,複製(並解壓)文件到docker容器的指定目錄中
  4. RUN,運行linux命令,用於創建必要的開發環境
  5. WORKDIR,設置工作目錄
  6. ENV,
  7. USER

其他的一些如EXPOSE,LABEL,STOPSIGNAL,VOLUME等命令在現階段還沒用上。
目前自己的定製化Dockerfile如下

# base image
FROM ubuntu:18.04
# MAINTAINER

# 安裝相應依賴
RUN apt-get update \
    && apt-get install wget curl vim gcc zlib1g-dev bzip2 -y \
    && apt-get install zlib1g.dev \
    # 安裝libssl1.0-dev解決pip安裝時md5模塊無法導入問題
    && apt-get install openssl libssl1.0-dev -y \
    && apt-get install g++ build-essential -y \
    # && apt-get install python-tk -y \
    # && apt-get install tk-dev -y \
    && mkdir /usr/local/source \
# 設置工作目錄
WORKDIR /usr/local/source

RUN wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz \
    && tar xvf Python-2.7.12.tgz && cd Python-2.7.12 \
    && ./configure --prefix=/usr/local/python27 && make && make altinstall \
    # 備份舊版本
    && mv /usr/bin/python /usr/bin/python27_old \
    # 配置默認python
    && ln -s /usr/local/python27/bin/python /usr/bin/python \
    && ln -s /usr/local/python27/bin/python-config /usr/bin/python-config \
    # 下載安裝pip
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python get-pip.py \
    # 備份舊pip
    # && mv /usr/bin/pip /usr/bin/pip_old 
    # 建立連接
    && ln -s /usr/local/python27/bin/pip  /usr/bin/pip \
    # 安裝包
    && cd /usr/local/source \ 
    && pip install Cython==0.29.7 \
    && pip install pyyaml==5.1 \
    && pip install numpy==1.16.3 \
    && pip install pandas==0.23.2 \
    && pip install scipy==1.2.1 \
    && pip install scikit-learn==0.20.3 \
    && pip install matplotlib==2.1.0 \
    && pip install lightgbm==2.2.2 \
    && pip install catboost==0.13.1 \
    && pip install grpcio==1.20.1 \
    && pip install grpcio-tools==1.20.1 \

docker常用命令

Dockerfile製作完成後,就可以使用以下命令創建一個docker鏡像

sudo docker build -it mydocker:v1 .  /bin/bash

請記住末尾有個 .(空格+.),後面/bin/bash的目的是鏡像創建後直接開啓一個並進入容器,進入命令行模式。
我們可以從主機複製東西到容器中,或者從容器複製東西到主機中,使用下列命令

sudo docker cp 主機文件路徑 容器ID:容器路徑     ## 從主機複製文件到容器
docker cp 容器ID:要拷貝的文件在容器裏面的路徑       要拷貝到宿主機的相應路徑 

其他常用命令

docker images    ## 查看本機鏡像
docker image ls  ## 查看本機鏡像
docker ps -a     ## 查看本機創建的所有容器
docker rmi 鏡像ID(或鏡像名稱標籤)   ## 刪除鏡像
docker rm 容器ID  ## 刪除容器

先這些,想到再加,不懂的google或看官網文檔

模型部署

既然容器環境已經創建好了,那就需要把模型文件拷貝進容器,爲了部署方便,創建Dockerfile的時候也可以直接把模型複製進去(導致的後果就是鏡像過大,佔用過多的空間)。爲了調用模型,除了基本的調用API接口外,還需要額外包裝一層通信網絡層,基本過程就是外部或其他容器發送請求數據給模型容器,模型容器接受到數據後,進行基本的特徵工程和預測服務後,返回給發送端預測結果。本人在項目中,先後調研並測試過現成的rpc框架,分別是以下三種

  1. zerorpc,Python第三方開源庫,安裝簡單,使用方便,缺點是速度慢,對於性能要求不高的可以嘗試
  2. Thrift,Facebook開源RPC框架,使用稍微複雜,支持跨語言傳輸,速度快,在測試過程中發現數據的傳輸不是隨着數據量的遞增呈線性增長,而是指數增長,適用於單次數據量較少的情況
  3. grpc,Google開源RPC框架,使用方法和難度和Thrift一樣,速度比Thrift慢,也支持跨多種語言傳輸,因爲TensorFlow生態支持grpc,所以最後在性能滿足要求的情況下,選擇了grpc

上訴兩種大公司的開源RPC框架都需要自定義傳輸數據格式,並使用其特定的編譯器生成接口文件,調用這些接口函數即可,並以此創建自己的API接口,完成數據預處理、特徵工程、模型預測服務。所有這些注意性能的變化。
關於Thriftgrpc框架的使用後期再來做個總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章