使用 Kubernetes 和 Kubeflow 扩展对象检测

介绍

        对象检测是计算机视觉中的一项关键任务,涉及对图像或视频中的对象(例如行人或汽车)进行定位和分类。机器学习的进步导致对象检测应用取得重大突破,从流行社交网络中的人脸检测到自动驾驶汽车的感知。过去,大规模训练和部署这些模型需要大量的手动工作和手动滚动解决方案。然而,随着 Kubernetes* 和 Kubeflow 等云平台和协调器的兴起,机器学习模型的训练、服务和扩展过程变得不那么复杂,而且更具声明性。

Kubernetes 和 Kubeflow

         Kubernetes 是一个容器编排云平台,旨在简化容器化应用程序的大规模部署和管理。

         Kubeflow 是一个运行在 Kubernetes 之上的机器学习工具包。它的使命是通过提供可在不同环境中运行的可扩展和可扩展的服务堆栈来简化机器学习工作流的部署。

        我们将完成准备数据、执行分布式对象检测训练作业以及基于 TensorFlow* Pets 教程为模型提供服务的步骤,以检测各种品种的猫和狗。

先决条件

          启用了动态卷配置的 Kubernetes 集群
          访问可用的 kubectl (Kubernetes CLI)
           Ksonnet CLI:ks

第 1 步:设置 Kubeflow

          有关如何在 kubernetes 集群上设置 Kubeflow 的说明,请参阅入门指南。 具体来说,请查看有关部署 Kubeflow 的快速入门指南。 在这个例子中,我们将使用 Kubeflow 版本 v0.2.2 和 ksonnet 默认环境。 如果您打算使用云 ksonnet 环境,请确保按照 Kubeflow 入门指南中的正确说明进行操作。

           完成 Kubeflow 用户指南中的步骤后,您将获得以下信息:

名为 kubeflow_ks_app 的 ksonnet 应用程序目录
K8s 集群中名为 kubeflow 的新命名空间
kubeflow 命名空间下的 kubernetes 集群中的以下 pod
kubectl -n kubeflow get pods
NAME                              READY     STATUS    RESTARTS   AGE
ambassador-7987df44b9-4pht8       2/2       Running   0          1m
ambassador-7987df44b9-dh5h6       2/2       Running   0          1m
ambassador-7987df44b9-qrgsm       2/2       Running   0          1m
tf-hub-0                          1/1       Running   0          1m
tf-job-operator-v1alpha2-75bcb7f5f7-wvpdd            1/1       Running             0          6d

第 2 步:准备训练数据集

          这一步的核心是使用 Kubernetes 作业创建持久卷,并将数据复制到该卷。 但是我们将使用之前从 kubeflow/examples 存储库中的以下 ksonnet 应用程序创建的组件:示例

          首先,我们需要克隆 kubeflow/examples 存储库:

git clone https://github.com/kubeflow/examples.git
cd examples/object_detection/ks-app

         在 ks-app 目录中,您将找到一个 components 目录,其中包含一组先前创建的 ksonnet 组件,您可以根据需要对其进行自定义。 这些组件有一组预配置的参数,可以在 components/params.libsonnet 文件中找到。

         现在让我们设置我们的环境并创建持久卷,用于存储训练管道的数据集和配置:

ENV=default
ks param set pets-pvc accessMode "ReadWriteMany"
ks param set pets-pvc storage "20Gi"
ks apply ${ENV} -c pets-pvc

         创建我们的持久卷声明后,下一步是获取我们的训练数据集、注释、管道配置文件和预训练模型检查点,以免从头开始训练。

#The name of the pvc we just created
PVC="pets-pvc" 

#The root mount path that will be used by the containers 
MOUNT_PATH="/pets_data"

#The remote URL of the dataset we will be using
DATASET_URL="http://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz"

#The remote URL of the dataset annotations 
ANNOTATIONS_URL=http://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz

#The remote URL to the pre-trained model we will be using as training start point
MODEL_URL="http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_2018_01_28.tar.gz"

#The remote url to the training pipeline config file 
PIPELINE_CONFIG_URL="https://raw.githubusercontent.com/kubeflow/examples/master/object_detection/conf/faster_rcnn_resnet101_pets.config"

# Setting up the arguments for our get-data-job component
ks param set get-data-job mounthPath ${MOUNT_PATH}
ks param set get-data-job pvc ${PVC}
ks param set get-data-job urlData ${DATASET_URL}
ks param set get-data-job urlAnnotations ${ANNOTATIONS_URL}
ks param set get-data-job urlModel ${MODEL_URL}
ks param set get-data-job urlPipelineConfig ${PIPELINE_CONFIG_URL}

#Applying the component to the K8s cluster
ks apply ${ENV} -c get-data-job

         get-data-job 组件将创建四个 Kubernetes 批处理作业,这些作业将从 Internet 下载数据并将其存储在 pets-pvc 卷中。 在进入下一步之前,所有这些工作都需要完成。 要确保作业完成运行:

kubectl -n kubeflow get pods | grep get-data-job

         并确保所有列出的名称以“get-data-job”开头的 pod 都处于“已完成”状态。

        我们刚刚执行的作业下载了一些压缩文件,下一步是解压缩这些文件/目录,以便它们可以正常使用。 为此,我们将在 ks-app 中使用 decompress-data-job 组件。

ANNOTATIONS_PATH="${MOUNT_PATH}/annotations.tar.gz"
DATASET_PATH="${MOUNT_PATH}/images.tar.gz"
PRE_TRAINED_MODEL_PATH = "${MOUNT_PATH}/faster_rcnn_resnet101_coco_2018_01_28.tar.gz"

ks param set decompress-data-job mountPath ${MOUNT_PATH}
ks param set decompress-data-job pvc ${PVC}
ks param set decompress-data-job pathToAnnotations ${ANNOTATIONS_PATH}
ks param set decompress-data-job pathToDataset ${DATASET_PATH}
ks param set decompress-data-job pathToModel ${PRE_TRAINED_MODEL_PATH}

ks apply ${ENV} -c decompress-data-job

       上面的命令将创建一个批处理作业来创建 pet TF 记录,并将创建的记录转储到我们在教程开头定义的 $ MOUNT_PATH 中。

       现在我们完成了数据准备,现在让我们启动训练工作。

第 3 步:启动分布式对象检测训练作业

        分布式训练通过跨多台机器划分工作来加速大型机器学习模型的训练。在分布式训练期间,TensorFlow 使用 worker 来执行大量计算,使用参数服务器来存储模型参数,并使用 master 来协调训练过程。训练期间资源分配的一个经验法则是为每个 CPU 插槽分配两个工人。此处提供了有关提高英特尔® 至强® 训练性能的更多信息。

       要启动分布式训练作业,我们首先在 ksonnet 应用程序中配置 tf-training-job 组件。在这个例子中,我们将使用一个工人和一个参数服务器。为了扩展您的工作,您可以轻松更改工作人员和/或参数服务器的数量:

#This is the path to our training pipeline configuration file. Which is in the pets-pvc
PIPELINE_CONFIG_PATH="${MOUNT_PATH}/faster_rcnn_resnet101_pets.config"

#The Directory where our training job will be saving the training checkpoints
TRAINING_DIR="${MOUNT_PATH}/train"

ks param set tf-training-job image ${OBJ_DETECTION_IMAGE}
ks param set tf-training-job mountPath ${MOUNT_PATH}
ks param set tf-training-job pvc ${PVC}
ks param set tf-training-job numPs 1
ks param set tf-training-job numWorkers 1
ks param set tf-training-job pipelineConfigPath ${PIPELINE_CONFIG_PATH}
ks param set tf-training-job trainDir ${TRAINING_DIR}

#Submit the training job
ks apply ${ENV} -c tf-training-job

         有了这个,我们刚刚提交了对象检测训练作业。 现在您可以开始监控它。

第 4 步:监控您的工作

         要查看您的 tf-job 状态,请执行:

kubectl -n kubeflow describe tfjobs tf-training-job

         要查看每个 Pod 的单独日志,请执行:

kubectl -n kubeflow get pods -a
kubectl -n kubeflow logs <name_of_master_pod>

          当作业仍在运行时,您应该看到:

INFO:tensorflow:Saving checkpoint to path /pets_data/train/model.ckpt
INFO:tensorflow:Recording summary at step 819.
INFO:tensorflow:global step 819: loss = 0.8603 (19.898 sec/step)
INFO:tensorflow:global step 822: loss = 1.9421 (18.507 sec/step)
INFO:tensorflow:global step 825: loss = 0.7147 (17.088 sec/step)
INFO:tensorflow:global step 828: loss = 1.7722 (18.033 sec/step)
INFO:tensorflow:global step 831: loss = 1.3933 (17.739 sec/step)
INFO:tensorflow:global step 834: loss = 0.2307 (16.493 sec/step)
INFO:tensorflow:Recording summary at step 839

         一旦工作完成,你应该看到:

INFO:tensorflow:Starting Session.
INFO:tensorflow:Saving checkpoint to path /pets_data/train/model.ckpt
INFO:tensorflow:Starting Queues.
INFO:tensorflow:global_step/sec: 0
INFO:tensorflow:Recording summary at step 200006.
INFO:tensorflow:global step 200006: loss = 0.0091 (9.854 sec/step)
INFO:tensorflow:Stopping Training.
INFO:tensorflow:Finished training! Saving model to disk.

        现在你有了一个训练有素的模型。 在持久卷 pets-data-claim 内的 /pets_data/train 中找到它

步骤 5:导出 TensorFlow 图

          在提供模型和导出图之前,我们首先需要在 ${MOUNT_PATH}/train 目录下的 pets-pvc 持久卷中识别检查点候选者。

           要查看 ${MOUNT_PATH}/train 中保存的内容,您可以使用:

kubectl -n kubeflow exec -it tf-training-job-master-r1hv-0-i6k7c sh

          注意:上述命令仅在作业仍在运行时才有效。

         这将为您的容器打开一个交互式 shell,现在您可以执行: ls /pets_data/train 并查找检查点候选。

        确定检查点后,下一步是在 export-tf-graph-job 组件中配置检查点并应用它:

#The path to the checkpoint candidate (replace <numeber> with your checkpoint number.
CHECKPOINT="${TRAINING_DIR}/model.ckpt-<number>" 

#The model input type
INPUT_TYPE="image_tensor"

#The directory where our exported model graph will be stored
EXPORT_OUTPUT_DIR="${MOUNT_PATH}/exported_graphs"

ks param set export-tf-graph-job mountPath ${MOUNT_PATH}
ks param set export-tf-graph-job pvc ${PVC}
ks param set export-tf-graph-job image ${OBJ_DETECTION_IMAGE}
ks param set export-tf-graph-job pipelineConfigPath ${PIPELINE_CONFIG_PATH}
ks param set export-tf-graph-job trainedCheckpoint ${CHECKPOINT}
ks param set export-tf-graph-job outputDir ${EXPORT_OUTPUT_DIR}
ks param set export-tf-graph-job inputType ${INPUT_TYPE}

        现在让我们申请这个工作:

ks apply ${ENV} -c export-tf-graph-job

        作业完成后,将在 pets-pvc 持久卷中的 /pets_data 下创建一个名为 export_graphs 的新目录,其中包含模型和冻结图。

         在为模型提供服务之前,我们需要执行快速破解,因为对象检测导出 Python* API 不会为保存的模型生成“版本”文件夹。 这个 hack 涉及创建一个目录,并将一些文件移动到该目录中。

        一种方法是访问一个正在运行的容器中的交互式 shell 并通过以下方式自己移动数据:

kubectl -n kubeflow exec -it pets-training-master-r1hv-0-i6k7c sh  
mkdir /pets_data/exported_graphs/saved_model/1  
cp /pets_data/exported_graphs/saved_model/* /pets_data/exported_graphs/saved_model/1

第 6 步:使用 TensorFlow 服务为您的模型提供服务

        在我们的 ksonnet 应用程序中配置和应用 pets-model 组件:

MODEL_PATH=/mnt/exported_graphs/saved_model
MODEL_STORAGE_TYPE=nfs
NFS_PVC_NAME=pets-pvc

ks param set pets-model modelPath ${MODEL_PATH}
ks param set pets-model modelStorageType ${MODEL_STORAGE_TYPE}
ks param set pets-model nfsPVC ${NFS_PVC_NAME}

ks apply ${ENV} -c pets-model

          应用 pets-model 组件后,您应该能够看到“pets-model” pod:

kubectl -n kubeflow get pods | grep pets-model

        这将输出:

pets-model-v1-57674c8f76-4qrqp 1/1 Running 0 4h

        查看 pod 日志:

kubectl -n kubeflow logs pets-model-v1-57674c8f76-4qrqp

        输出如下:

2018-06-21 19:20:32.325406: I tensorflow_serving/core/loader_harness.cc:86] Successfully loaded servable version {name: pets-model version: 1}  
E0621 19:20:34.134165172       7 ev_epoll1_linux.c:1051]     grpc epoll fd: 3  
2018-06-21 19:20:34.135354: I tensorflow_serving/model_servers/main.cc:288] Running ModelServer at 0.0.0.0:9000 ...  

第 7 步:使用您的模型运行推理

        我们将使用 tensorFlow 服务 api 和对象检测 Python* 客户端来使用我们训练的模型运行推理。

         首先,我们需要安装依赖项(Ubuntu* 16.04)

sudo apt-get install protobuf-compiler python-pil python-lxml python-tk
pip install tensorflow
pip install matplotlib
pip install tensorflow-serving-api
pip install numpy
pip install grpcio

        安装依赖项后,我们需要克隆 TensorFlow 模型存储库。 我们将从那里使用一些对象检测模块。

#From your $HOME directory
git clone https://github.com/tensorflow/models.git
cd models/research

          TensorFlow Object Detection API 使用 Protobufs 来配置模型和训练参数。 在使用框架之前,必须先编译 Protobuf 库。 这应该通过从 TensorFlow 模型/研究目录运行以下命令来完成。

# from models/research/
protoc object_detection/protos/*.proto --python_out=.

         将 TensorFlow 模型和通用对象检测添加到 PYTHONPATH。

export PYTHONPATH=:${HOME}:${HOME}/models/research:${HOME}/models/research/slim

        现在我们需要在不同的终端会话中将端口转发到模型服务器:

kubectl -n kubeflow port-forward pets-model-v1-57674c8f76-4qrqp 9000:9000

           最后一步是运行对象检测客户端,我们准备了一个 python 客户端脚本,你可以在这个 gist 中找到。 将 object_detection_client.py 文件和 utils.py 文件下载到您的 $HOME 目录并像这样运行客户端:

python object_detection_client.py \
--server=localhost:9000 \
--input_image=data/path/to/some/pet/image.jpg \
--output_directory=. \
--label_map=models/research/object_detection/data/mscoco_label_map.pbtxt \ 
--model_name=pets-model \
--input_type=image_tensor

          之后,您应该会在 $HOME 目录中看到带有推理结果的图像文件。

概括

        在本文中,我们学习了如何利用当前基于云的平台和工具来准备数据集、训练和服务对象检测模型以及在服务模型上运行推理。可以复制这些步骤来训练任何其他模型并运行更多实验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值