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
cd serving



清除我们的本地模型目录,以防我们已经有一个




rm -rf ./models/inception



导出初始模型

在这里,可以采用不同的方式进行模型导出,主要有bazel和pip两种构建方式,这里以pip为例。

导出Inception模型:




python tensorflow_serving/example/mnist_saved_model.py models/mnist



查看导出模型:




ls models/inception
1


二 上传Docker镜像

首先,我们$USER/inception_serving使用Container Registry格式和项目名称标记镜像


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没有完全启动,执行
  启动服务: systemctl restart haproxy
  检查服务状态:systemctl status haproxy|grep Active
  keepalived操作同上

  ③ 使用的 ~/.kube/config文件不对,需要切换到正确的账户后再执行该命令:

2) docker私有仓库的镜像上传和下载的问题:

由于官方组件下载需要FQ的原因,模型成功导出后,要上传到自己的私有镜像库才能直接在k8s中创建pod并应用,这需要自己的私有镜像库。