机器学习(ML)和人工智能(AI)现在是IT行业中的热门话题。和容器一样。在这个博客中,我尝试将两者绘制在同一张图片中,看看是否有任何协同作用。
虽然纯粹的实验总是很有趣,但是当至少某种类型的目标设定时,它可能会更加集中。对于我的实验,我设定了以下目标:
在旅程中,我添加了一个额外的“伸展”目标,以学习一点Go。稍后会详细介绍。 我设想的最终目标是这样的:
最重要的想法有三个:
所以旅程开始......
所有代码都可以在https://github.com/jnummelin/tensorflow-inception-example上找到。
TensorFlow是一个使用数据流图进行数值计算的开源软件库。图形节点表示数学运算,而图形边缘表示在它们之间流动的多维数据阵列(张量)。这种灵活的架构允许您将计算部署到桌面,服务器或移动设备上的一个或多个CPU或GPU,而无需重写代码。
非常简化,您使用TensorFlow训练具有一组训练数据的计算机模型。一旦模型被训练,它可以用于分析尚未知的数据。分析可以是例如图像分类,就像我在这里的冒险一样。通常,模型可以预测输入数据与训练模型中的某些“已知”模式匹配的程度。
在这篇博客中,我不会深入研究如何训练模型,因为这需要更深入地理解机器学习的概念以及对TensorFlow的深入了解。TensorFlow的人们准备了一个关于模型训练的好教程,你一定要检查出来。我还建议查看一篇关于HBO硅谷如何构建他们着名的是不是热狗移动应用的更长篇幅的介绍。这既热闹又富有教育意义。
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-serving和https://github.com/bitnami/bitnami-docker-tensorflow-inception获得。
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回复给定的分类结果。
一旦所有内容都在容器映像中,将它全部部署到任何容器编排系统上当然都是微不足道的。令人惊讶的是,我将使用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》
译者:February
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。