使用 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-pvcks 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 目录中看到带有推理结果的图像文件。
概括
在本文中,我们学习了如何利用当前基于云的平台和工具来准备数据集、训练和服务对象检测模型以及在服务模型上运行推理。可以复制这些步骤来训练任何其他模型并运行更多实验。
使用 Kubernetes 和 Kubeflow 扩展对象检测相关推荐
- 深度学习之对象检测_深度学习时代您应该阅读的12篇文章,以了解对象检测
深度学习之对象检测 前言 (Foreword) As the second article in the "Papers You Should Read" series, we a ...
- 对象检测工具包mmdetection简介、安装及测试代码
mmdetection是商汤和港中文大学联合开源的基于PyTorch的对象检测工具包,属于香港中文大学多媒体实验室open-mmlab项目的一部分.该工具包提供了已公开发表的多种流行的检测组件,通过这 ...
- 几行代码构建全功能的对象检测模型,他是如何做到的?
作者 | Alan Bi 译者 | 武明利,责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 如今,机器学习和计算机视觉已成为一种热潮.我们都看过关于自动驾驶汽车和面部识别的 ...
- 使用OpenCV进行对象检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目标检测是图像处理的重要组成部分.自动驾驶汽车必须检测车道,路面, ...
- TensorFlow中的对象检测教程:实时对象检测
导言 创建能够在单个图像中识别和定位多个对象的精确机器学习模型仍然是计算机视觉中的核心挑战.但随着最近深度学习的进步,对象检测应用程序比以往更容易开发.TensorFlow的对象检测API是一个构建与 ...
- 实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器
TensorFlow对象检测API是一个建立在TensorFlow之上的开源框架,可以轻松构建,训练和部署对象检测模型. 到目前为止,API的性能给我留下了深刻的印象.在这篇文章中,我将API的对象设 ...
- 详解计算机视觉五大技术:图像分类、对象检测、目标跟踪、语义分割和实例分割
https://www.tinymind.cn/articles/120 [ 导读]目前,计算机视觉是深度学习领域最热门的研究领域之一.计算机视觉实际上是一个跨领域的交叉学科,包括计算机科学(图形.算 ...
- 对象检测目标小用什么模型好_[目标检测] YOLO4论文中文版
点击上方 蓝字 关注我呀! [目标检测] YOLO4论文中文版 文章目录 YOLO4论文中文版 摘要 1.介绍 2.相关工作 2.1.目标检测模型 2.2.Bag of freebies 2.3.Ba ...
- 深度学习和目标检测系列教程 1-300:什么是对象检测和常见的8 种基础目标检测算法
@Author:Runsen 由于毕业入了CV的坑,在内卷的条件下,我只好把别人卷走. 对象检测 对象检测是一种计算机视觉技术,用于定位图像或视频中的对象实例.对象检测算法通常利用机器学习或深度学习来 ...
- 检测和语义分割_分割和对象检测-第2部分
检测和语义分割 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's YouT ...
最新文章
- PL/SQL两种case语句写法
- Hibernate4多对多关系映射
- 局部变量-不同函数内的同名局部变量
- C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove
- Spring—集成Junit
- typora 公式对齐_都0202年了还不会用 Typora——看Typora使用教程这篇就够了
- 别再用硬编码写业务流程了,试试这款轻量级流程编排框架
- 【Java从0到架构师】MyBatis - 连接池、分页_PageHelper
- Dell’Oro 5年期数据中心报告预测25G/100G端口速率市场快速上升
- Codeforces 15C Industrial Nim 简单的游戏
- Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性 应该内置到语言里面
- Java程序怎么运行?
- 非线性控制3.0——自适应模糊控制
- WinAPI设置RGB背景色以及前景色
- codevs 5960 信使
- 赛码网刷题记录acmcoder
- java自定义类加载器并观察类卸载过程
- 精益软件度量之读书笔记(一)度量和组织目标
- 关于actor模型的优缺点分析
- Linux基础----文件管理、用户管理、用户权限
热门文章
- DUBBO服务启动过程
- JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
- k邻近算法应用实例(一) 改进约会网站的配对效果
- 对通用查询组件初始化组织过滤条件
- JavaMail简单接收邮件
- 【wikioi】1014 装箱问题
- 【转】一步一步学Linq to sql(十):分层构架的例子
- JBoss JBPM 实践系列(一)--- 安装配置(Tomcat 6.0 + MySQL 5.1)
- 第1章 Spark SQL概述
- Tomcat中Pipeline