参考:https://tensorflow.google.cn/serving/serving_inception
本教程演示如何使用在Docker容器中运行的TensorFlow Serving组件来服务TensorFlow初始模型,以及如何使用Kubernetes部署服务集群。
要了解更多关于TensorFlow Serving的信息,我们推荐TensorFlow Serving基本教程和TensorFlow Serving高级教程。
要了解有关TensorFlow初始模型的更多信息,我们推荐在TensorFlow in Inception。
有关构建TensorFlow Serving Docker镜像的详细信息,请参阅通过Docker使用TensorFlow Serving。
我们使用Dockerfile.devel创建一个基于镜像的$ USER / tensorflow-serving-devel。 然后使用构建的图像在本地启动一个容器。
$ docker build --pull -t $USER/tensorflow-serving-devel -f tensorflow_serving/tools/docker/Dockerfile.devel .
# 或
$ docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel .
# 或
$ docker build -t $USER/tensorflow-serving-devel . # 保存成Dockerfile文件
$ docker run --name=inception_container -it $USER/tensorflow-serving-devel
# 或 将Dockerfile.devel中的内容保存成 Dockerfile
docker build -t tensorflow-serving:v1 .
git clone --recurse-submodules https://github.com/tensorflow/serving # serving下载到主机上
docker run -it -v /home/wu/serving:/serving tensorflow-serving:v1 /bin/bash # 使用-v 挂载到容器中
# 或
docker pull registry.cn-hangzhou.aliyuncs.com/781708249/tensorflow-serving:v1 # 已经配置好的tensorflow serving 从阿里镜像拉下来
git clone --recurse-submodules https://github.com/tensorflow/serving # serving下载到主机上
docker run -it -v /home/wu/serving:/serving registry.cn-hangzhou.aliyuncs.com/781708249/tensorflow-serving:v1 /bin/bash # 使用-v 挂载到容器中
注意:下面的所有bazel构建命令都使用标准-c选项标志。 要进一步优化构建,请参阅此处的说明。
在正在运行的容器中,我们克隆,配置和构建TensorFlow服务示例代码。
root@c97d8e820ced:/# git clone --recurse-submodules https://github.com/tensorflow/serving # 从主机中挂载了serving 可以跳过这步
root@c97d8e820ced:/# cd serving/tensorflow
root@c97d8e820ced:/serving/tensorflow# ./configure
root@c97d8e820ced:/serving# cd ..
root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/example/...
接下来,我们可以使用这里的指令安装一个TensorFlow ModelServer和apt-get,或者使用下面的代码构建一个ModelServer二进制文件:
root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/model_servers:tensorflow_model_server
本教程的其余部分假定您在本地编译ModelServer,在这种情况下运行它的命令是bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server
。 但是,如果使用apt-get安装ModelServer,只需用tensorflow_model_server
替换该命令即可。
在正在运行的容器中,我们运行inception_saved_model.py使用发布的Inception模型训练检查点导出初始模型。 而不是从头开始训练,我们使用训练有素的变量的现成检查点来恢复推理图并直接导出。
root@c97d8e820ced:/serving# curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz
root@c97d8e820ced:/serving# tar xzf inception-v3-2016-03-01.tar.gz
root@c97d8e820ced:/serving# ls inception-v3
README.txt checkpoint model.ckpt-157585
root@c97d8e820ced:/serving# bazel-bin/tensorflow_serving/example/inception_saved_model --checkpoint_dir=inception-v3 --output_dir=/tmp/inception-export
Successfully loaded model from inception-v3/model.ckpt-157585 at step=157585.
Successfully exported model to /tmp/inception-export
root@c97d8e820ced:/serving# ls /tmp/inception-export
1
root@c97d8e820ced:/serving# [Ctrl-p] + [Ctrl-q]
请注意,我们在上面的说明结束时从容器中分离出来,而不是终止它,因为我们要commit对用于Kubernetes部署的新镜像$ USER / inception_serving的所有更改。
$ docker commit inception_container $USER/inception_serving
$ docker stop inception_container
我们使用构建的镜像在本地测试服务工作流程。
$ docker run -it $USER/inception_serving
在容器中运行gRPC tensorflow_model_server。
root@f07eec53fd95:/# cd serving
root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=inception --model_base_path=/tmp/inception-export &> inception_log &
[1] 45
使用inception_client.py查询服务器。 客户端通过gRPC向服务器发送由命令行参数指定的图像,以便分类成对于ImageNet类别的人类可读描述。
root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/example/inception_client --server=localhost:9000 --image=/path/to/my_cat_image.jpg
outputs {
key: "classes"
value {
dtype: DT_STRING
tensor_shape {
dim {
size: 1
}
dim {
size: 5
}
}
string_val: "tiger cat"
string_val: "Egyptian cat"
string_val: "tabby, tabby cat"
string_val: "lynx, catamount"
string_val: "Cardigan, Cardigan Welsh corgi"
}
}
outputs {
key: "scores"
value {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 1
}
dim {
size: 5
}
}
float_val: 9.5486907959
float_val: 8.52025032043
float_val: 8.05995368958
float_val: 4.30645561218
float_val: 3.93207240105
}
}
root@f07eec53fd95:/serving# exit
有用! 服务器成功分类你的猫的形象!
在本节中,我们使用第0部分中构建的容器镜像像在Google云端平台中部署带有Kubernetes的服务集群。
在这里,我们假定您已经创建并登录了一个名为tensorflow-serving的gcloud项目。
gcloud auth login --project tensorflow-serving
首先,我们创建一个Google Container Engine集群来进行服务部署。
$ gcloud container clusters create inception-serving-cluster --num-nodes 5
Creating cluster inception-serving-cluster...done.
Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/inception-serving-cluster].
kubeconfig entry generated for inception-serving-cluster.
NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
inception-serving-cluster us-central1-f 1.1.8 104.197.163.119 n1-standard-1 1.1.8 5 RUNNING
设置gcloud容器命令的默认群集并将群集凭据传递给kubectl。
$ gcloud config set container/cluster inception-serving-cluster
$ gcloud container clusters get-credentials inception-serving-cluster
Fetching cluster endpoint and auth data.
kubeconfig entry generated for inception-serving-cluster.
现在让我们将图片推送到Google Container Registry,以便我们可以在Google Cloud Platform上运行它。
首先我们使用Container Registry格式和我们的项目名称来标记$ USER / inception_serving图像,
$ docker tag $USER/inception_serving gcr.io/tensorflow-serving/inception
接下来,我们将图像推送到注册表,
$ gcloud docker -- push gcr.io/tensorflow-serving/inception
部署包含3个由Kubernetes部署控制的inception_inference服务器副本。 Kubernetes Service与External Load Balancer一起向外部复制副本。
我们使用示例Kubernetes config inception_k8s.yaml创建它们。
$ kubectl create -f tensorflow_serving/example/inception_k8s.yaml
deployment "inception-deployment" created
service "inception-service" created
要查看部署和窗格的状态,请执行以下操作:
$ 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 9000/TCP 1m
可能需要一段时间才能启动并运行。
$ 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: 9000/TCP
NodePort: 30334/TCP
Endpoints:
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
服务外部IP地址列在LoadBalancer Ingress旁边。
我们现在可以从本地主机的外部地址查询服务。
$ bazel-bin/tensorflow_serving/example/inception_client --server=104.155.184.157:9000 --image=/path/to/my_cat_image.jpg
outputs {
key: "classes"
value {
dtype: DT_STRING
tensor_shape {
dim {
size: 1
}
dim {
size: 5
}
}
string_val: "tiger cat"
string_val: "Egyptian cat"
string_val: "tabby, tabby cat"
string_val: "lynx, catamount"
string_val: "Cardigan, Cardigan Welsh corgi"
}
}
outputs {
key: "scores"
value {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 1
}
dim {
size: 5
}
}
float_val: 9.5486907959
float_val: 8.52025032043
float_val: 8.05995368958
float_val: 4.30645561218
float_val: 3.93207240105
}
}
您已成功部署在Kubernetes服务的先启模式!