机器学习和容器

机器学习(ML)和人工智能(AI)现在是IT行业中的热门话题。和容器一样。在这个博客中,我尝试将两者绘制在同一张图片中,看看是否有任何协同作用。

目标

虽然纯粹的实验总是很有趣,但是当至少某种类型的目标设定时,它可能会更加集中。对于我的实验,我设定了以下目标:

  • 了解ML是什么和TensorFlow一般
  • 看看ML和容器之间是否存在任何协同作用
  • Kontena上部署正在运行的ML解决方案

在旅程中,我添加了一个额外的“伸展”目标,以学习一点Go。稍后会详细介绍。 我设想的最终目标是这样的:

最重要的想法有三个:

  1. 有一个简单易用的API,用户可以发送jpg图片进行分类
  2. 在多个实例上运行ML模型,以便我们可以根据需要扩展处理
  3. 遵循微服务模式

所以旅程开始......

所有代码都可以在https://github.com/jnummelin/tensorflow-inception-example上找到。

TensorFlow

TensorFlow是一个使用数据流图进行数值计算的开源软件库。图形节点表示数学运算,而图形边缘表示在它们之间流动的多维数据阵列(张量)。这种灵活的架构允许您将计算部署到桌面,服务器或移动设备上的一个或多个CPU或GPU,而无需重写代码。

非常简化,您使用TensorFlow训练具有一组训练数据的计算机模型。一旦模型被训练,它可以用于分析尚未知的数据。分析可以是例如图像分类,就像我在这里的冒险一样。通常,模型可以预测输入数据与训练模型中的某些“已知”模式匹配的程度。

在这篇博客中,我不会深入研究如何训练模型,因为这需要更深入地理解机器学习的概念以及对TensorFlow的深入了解。TensorFlow的人们准备了一个关于模型训练的好教程,你一定要检查出来。我还建议查看一篇关于HBO硅谷如何构建他们着名的是不是热狗移动应用的更长篇幅的介绍。这既热闹又富有教育意义。

TensorFlow模型的一个很酷的事情是,一旦构建模型,它可以非常容易地使用,而不需要任何繁重的后端服务器。因为他们已经与是不是热狗应用程序显示。在这种情况下,模型本身在移动设备上“运行”。

TensorFlow模型和容器

实验的目标之一是找出机器学习和容器之间是否存在任何协同作用。事实证明,实际上至少从我的角度来看。

TensorFlow允许导出预先训练的模型,以便稍后在其他地方使用。这允许人们甚至在移动设备上使用ML模型来查看图片是否包含热狗。这也使容器真正成为运输和运行机器学习模型的理想工具。

使用容器的一种看似好的方法是使用Docker的新多阶段构建。

FROM bitnami/tensorflow-inception:latest as model-builder  
RUN mkdir -p /model-data/ && \  
    curl -o '/model-data/inception-v3-2016-03-01.tar.gz' 'http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz' && \
    cd /model-data && tar zxf inception-v3-2016-03-01.tar.gz
RUN inception_saved_model --checkpoint_dir=/model-data/inception-v3 --output_dir=/model-data/inception-export
FROM bitnami/tensorflow-serving:latest  
COPY --from=model-builder /model-data/inception-export/* /bitnami/model-data/1

第一步,命名model-builder下载预先训练的模型检查点。然后它将导出模型以供TensorFlow服务系统使用。

第二步将准备好的模型数据从步骤1复制到TensorFlow Serving服务的图像。因此最终输出是一个Docker镜像,其中包含预先打包的所有内容,因此我们可以使用单个docker run ...命令来提供机器学习模型。如果这不是一个好的协同作用,那么什么都没有。从机器学习新手的角度来看,能够通过单个命令运行机器学习听起来非常棒。

我正在使用现成的基本映像作为起点,以节省安装TensorFlow软件包的工作量。这些资源可以在https://github.com/bitnami/bitnami-docker-tensorflow-servinghttps://github.com/bitnami/bitnami-docker-tensorflow-inception获得。

API

TensorFlow Serving使用grpc API为模型提供服务。由于机器学习的复杂性,一般来说,API也有些复杂。至少它不适合任何随机客户端程序轻松发送jpg图像进行分类。使用grpc API意味着编译protobuf IDL并发出复杂的请求。所以我认为解决方案确实需要一个更合适的API,其中一个可以只是POST一个图像,可能通过一个网页,并获得分类结果。

如上所述,在我的旅程中,我最终添加了一个新目标:学习一点Go。Go进入了API的目标列表,因为编写一个接收jpg图像的API并调用TensorFlow Serving grpc API来对其进行分类似乎相当简单。嗯,和往常一样,理论和实践是两回事。API本身实际上很容易启动并运行。只有生成的grpc协议缓冲区代码才会遇到困难。协议似乎存在一些问题 - >针对多个包进行转换处理。因为我真的是所有事情的新手Go我最终通过快速搜索和替换“修复”生成的代码中的一些包导入。一个人不应该真的修改生成的代码,但我只是不想被困在这上面。

因此,基本上API 接受一个jpg文件,将其转换为TensorFlow服务的grpc请求,并以JSON回复给定的分类结果。

运行模型和API

一旦所有内容都在容器映像中,将它全部部署到任何容器编排系统上当然都是微不足道的。令人惊讶的是,我将使用Kontena作为部署目标。

解决方案中最复杂的部分是机器学习模型,但现在即使它作为一个独立的容器运行,事情变得非常简单:

stack: jnummelin/tensorflow  
version: 1.3.0  
description: Tensorflow inception service  
services:  
  api:
    image: jnummelin/tensor-inception:latest
    environment:
      TF_ADDRESS: "serving:9000"
    ports:
      - "8080:8080"
  serving:
    # Model pre-imported into the image
    image: jnummelin/tensorflow-serving-inception:latest

我在这个例子中省略了loadbalancer配置。有关更详细的部署,请参阅GitHub存储库

测试

现在使用TensorFlow模型前面的简化API,可以很容易地使用plaincurl测试图像分类:

$ curl -s -XPOST -F "file=@/Users/jussi/Downloads/cropped_panda.jpg" image-classifier.kontena.works/classify | jq .
[
  {
    "Class": "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca",
    "Score": 9.546637
  },
  {
    "Class": "indri, indris, Indri indri, Indri brevicaudatus",
    "Score": 6.6261067
  },
  {
    "Class": "gibbon, Hylobates lar",
    "Score": 4.3301826
  },
  {
    "Class": "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens",
    "Score": 4.0944114
  },
  {
    "Class": "titi, titi monkey",
    "Score": 2.8160584
  }
]

得分越高越好。所以是的,我们的ML模型能够弄清楚这张照片是关于熊猫的。供参考,这是张贴的图片:

想知道这个设置如何应对热狗图像?

$ curl -s -XPOST -F "file=@/Users/jussi/Downloads/hot-dog-with-mustard.jpg" image-classifier.kontena.works/classify | jq --tab .
[
{
  "Class": "hotdog, hot dog, red hot",
  "Score": 11.738452
},
{
  "Class": "bell pepper",
  "Score": 3.9924777
},
{
  "Class": "great grey owl, great gray owl, Strix nebulosa",
  "Score": 3.7373521
},
{
  "Class": "chiton, coat-of-mail shell, sea cradle, polyplacophore",
  "Score": 2.9231932
},
{
  "Class": "balance beam, beam",
  "Score": 2.4462078
}
]

看起来相当不错,热狗课程与其他任何类别相比都获得了不错的成绩。

总结

将TensorFlow模型与容器一起使用确实提供了一种非常好的方式来部署它们。通过使用示例中显示的体系结构模式,设置可扩展的解决方案以基本上为任何TensorFlow模型提供服务非常容易。但是使用任何客户端软件的模型显然需要某种API包装器,使每个客户端处理TensorFlow gRPC复杂性是我至少不想做的事情。

接下来是什么?

在许多情况下,使用预先创建的模型当然不是现实。与任何学习一样,这是一个需要反馈的过程,可以放大学习并产生越来越准确的结果。我想通过建立一个可以推迟结果的恒定模型训练器来扩展我的方法。用户可以在某些Web UI中选择哪个类是正确的类,或者甚至发布新类。这会将信息提供给不断构建模型的东西。该东西还可以定期导出模型,从而触发模型容器的新构建。这将是相当简单的,在麻烦之前臭名昭着的最后一句话,建立全面自动化,使新ML模型在他们越来越多地学习时使用。让我知道你的想法。

原文标题《Machine Learning and Containers》

作者:Jussi Nummelin

译者:February

不代表云加社区观点,更多详情请查看原文链接

原文链接:https://dzone.com/articles/machine-learning-and-containers

原文作者:Jussi Nummelin

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

TensorFlow的安装与初步了解

今天终于有时间一探滕三福了,TensorFlow(腾三福)是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tenso...

3536
来自专栏磐创AI技术团队的专栏

TensorFlow + Keras 实战 YOLO v3 目标检测图文并茂教程(文末有惊喜)

3203
来自专栏ATYUN订阅号

使用OpenCV,Python和深度学习进行人脸识别

在这篇文章中,你将学会如何使用OpenCV、Python和深度学习在图像和视频流中执行人脸识别。我们今天将在这里使用的基于深度学习的面部嵌入,既高度准确又能够实...

3.3K5
来自专栏AI研习社

可应用的目标检测代码来了,一秒锁定你

计算机视觉是人工智能的一个重要领域。计算机视觉是一门关于计算机和软件系统的科学,可以让计算机对图像及场景进行识别和理解。计算机视觉还包括图像识别、目标检测、图像...

941

bigML中提升树模型的6个步骤

BigML将提升树模型(Boosted Trees)带入我们日益增长的监督式学习技术套件中。Boosting是一个变体,旨在减少偏见,可能会导致比Bagging...

4090
来自专栏CVer

开源 | 深度学习网络模型(model)可视化开源软件Netron

前两天,Amusi分享了一篇 经典卷积神经网络(CNN)结构可视化工具,该工具可用于可视化各种经典的卷积神经网络结构。如AlexNet、VGG-16、ResNe...

8433
来自专栏企鹅号快讯

基于Python的文本情感分类

前言 在上一期《【干货】--手把手教你完成文本情感分类》中我们使用了R语言对酒店评论数据做了情感分类,基于网友的需求,这里再使用Python做一下复现。关于步骤...

2695
来自专栏AI研习社

想要训练专属人脸识别模型?先掌握构建人脸数据集的三种绝招

雷锋网 AI 研习社按,随着深度学习的发展,很多技术已经落地,成为我们每天都能接触到的产品,人脸识别就是其中之一。人脸识别的应用范围很广,涉及上下班打卡、门禁、...

1962
来自专栏吉浦迅科技

TensorRT

作为Inference(推理)端的SDK的工具,TensorRT是可编程的处理加速器,主要是用来部署神经网络到Inference端之前,对于网络进行优化加速,来...

73411
来自专栏玉树芝兰

如何用Python和深度神经网络寻找近似图片?

给你10万张图片,让你从中找出与某张图片最为近似的10张,你会怎么做?不要轻言放弃,也不用一张张浏览。使用Python,你也可以轻松搞定这个任务。

1491

扫码关注云+社区

领取腾讯云代金券