前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习和容器

机器学习和容器

作者头像
February
修改2018-11-28 10:50:55
8010
修改2018-11-28 10:50:55
举报
文章被收录于专栏:技术翻译

机器学习(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的新多阶段构建。

代码语言:javascript
复制
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作为部署目标。

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

代码语言:javascript
复制
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测试图像分类:

代码语言:javascript
复制
$ 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模型能够弄清楚这张照片是关于熊猫的。供参考,这是张贴的图片:

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

代码语言:javascript
复制
$ 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

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

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目标
  • TensorFlow
    • TensorFlow模型和容器
      • API
      • 运行模型和API
      • 测试
      • 总结
      • 接下来是什么?
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档