Tensorflow Serving介紹及部署安裝
TensorFlow Serving 是一個用於機器學習模型 serving 的高性能開源庫。它可以將訓練好的機器學習模型部署到線上,使用 gRPC 作為接口接受外部調用。更加讓人眼前一亮的是,它支持模型熱更新與自動模型版本管理。這意味著一旦部署 TensorFlow Serving 後,你再也不需要為線上服務操心,只需要關心你的線下模型訓練。
TensorFlow Serving的典型的流程如下:學習者(Learner,比如TensorFlow)根據輸入數據進行模型訓練。等模型訓練完成、驗證之後,模型會被發布到TensorFlow Serving系統服務器端。客戶端提交請求,由服務端返回預測結果。客戶端和服務端之間的通信采用的是RPC協議。
安裝方式:
1)使用Docker安裝 使用TensorFlow服務的最簡單,最直接的方法是通過 Docker鏡像。 提示:這也是讓TensorFlow服務支持GPU的最簡單方法 2)使用APT安裝 TensorFlow服務模型服務器二進制文件有兩種變體: tensorflow-model-server:完全優化的服務器,使用一些特定於平臺的編譯器優化,如SSE4和AVX指令。這應該是大多數用戶的首選選項,但可能不適用於某些舊機器。 tensorflow-model-server-universal:使用基本優化編譯,但不包括特定於平臺的指令集 apt-get remove tensorflow-model-server 可以使用以下命令升級到tensorflow-model-server的較新版本: apt-get upgrade tensorflow-model-server 3)從源頭構建 從源代碼構建的推薦方法是使用Docker。TensorFlow服務Docker開發映像封裝了構建自己的TensorFlow服務版本所需的所有依賴項。 |
安裝過程(在Kubernetes中部署):
一 導出Inception模型:
克隆Tensorflow服務 克隆TensorFlow服務源到本地計算機: git clone https://github.com/tensorflow/serving 清除我們的本地模型目錄,以防我們已經有一個 rm -rf ./models/inception 導出初始模型 在這裏,可以采用不同的方式進行模型導出,主要有bazel和pip兩種構建方式,這裏以pip為例。 導出Inception模型: python tensorflow_serving/example/mnist_saved_model.py models/mnist 查看導出模型: $ ls models/inception |
二 上傳Docker鏡像
首先,我們 docker tag $USER/inception_serving /library/inception_serving:v2.0 接下來我們將鏡像推送到docker私有倉庫 docker push /library/inception_serving:v2.0 |
三 創建Kubernetes部署和服務
部署由Kubernetes部署inception_inference控制的3個服務器 副本組成。副本由Kubernetes服務外部暴露 。
我們使用示例Kubernetes config inception_k8s.yaml創建它們 。
inception_k8s.yaml文件如下:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: inception-deployment spec: replicas: 3 template: metadata: labels: app: inception-server spec: containers: - name: inception-container image: ***/library/inception_serving:v2.0 ports: - containerPort: 8500 --- apiVersion: v1 kind: Service metadata: labels: run: inception-service name: inception-service spec: ports: - port: 8500 targetPort: 8500 selector: app: inception-server type: NodePort |
kubectl create -f tensorflow_serving/example/inception_k8s.yaml
安裝完成後輸出:
deployment "inception-deployment" created service "inception-service" created
要查看部署和pod的狀態,請執行以下操作:
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
inception-deployment 3 3 3 3 5s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
inception-deployment-bbcbc 1/1 Running 0 10s
inception-deployment-cj6l2 1/1 Running 0 10s
inception-deployment-t1uep 1/1 Running 0 10s
要查看服務的狀態:
$ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE inception-service 10.239.240.227 104.155.184.157 8500/TCP 1
一切都可能需要一段時間才能啟動和運行。
$ kubectl describe service inception-service Name: inception-service Namespace: default Labels: run=inception-service Selector: run=inception-service Type: LoadBalancer IP: 10.239.240.227 LoadBalancer Ingress: 104.155.184.157 Port: <unset> 8500/TCP NodePort: <unset> 30334/TCP Endpoints: <none> Session Affinity: None Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 1m 1m 1 {service-controller } Normal CreatedLoadBalancer Created load balancer
四 查詢模型
我們現在可以從本地主機的外部地址查詢服務。
已成功部署Inception模型作為Kubernetes中的服務!
五 主要問題和註意事項:
安裝的過程中典型的問題如下:
1) K8s安裝中出現的問題: The connection to the server 192.168.170.132:8080 was refused - did you specify the right host or port? 問題產生的原因主要集中在: ① 在該安裝過程中需要FQ,有些組件由於網絡問題安裝的不完整,導致出現此類錯誤,同時,這樣的問題是最難排查的,已經安裝的組件顯示是正常的,由於安裝的的組件較多,新手一時間難以排查出沒有成功啟動的組件。 ② 已經成功安裝的組件由於某種操作導致服務關閉,安裝過程中遇到了此類問題,短時間內很難解決,當時haproxy和keepalived沒有完全啟動,執行 ③ 使用的 ~/.kube/config文件不對,需要切換到正確的賬戶後再執行該命令: 2) docker私有倉庫的鏡像上傳和下載的問題: 由於官方組件下載需要FQ的原因,模型成功導出後,要上傳到自己的私有鏡像庫才能直接在k8s中創建pod並應用,這需要自己的私有鏡像庫。 |
Tensorflow Serving介紹及部署安裝