机器学习与Docker容器

126 阅读6分钟
原文链接: click.aliyun.com

 现在,机器学习(ML )和人工智能( AI )是 IT 行业中的热门话题,同样,容器也成为其中的热门话题之一。我们将机器学习和容器都引入到图像中,用实验验证是否会相互协同出色的完成分类任务。我们将使用 Tenserflow 和 Kontena 来详细阐述。

研究目标

在实验中设定目标会使实验更具有针对性。在此,我设定了以下目标:

1. 了解机器学习和 TensorFlow ;

2. 验证机器学习和容器间是否有协同作用;

3. 在 Kontena 上部署正在运行的机器学习方案。

我的最终设想如下,共分为三个部分:

001b14c2109d19fe6f1bae2d2213be7954254c51 

 1. 有一个简单的 API :用户可对 JPG 图像进行分类;

 2. 在多个实例上运行机器学习模型,以便按需扩展;

 3. 遵循微服务( microservice )架构模式。

 完整代码获取请点击这里

TensorFlow简介

 TensorFlow 是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,边表示节点间流动的多维数据矩阵(张量)。   这种灵活的架构允许你在不重写代码的情况下,将计算部署到计算机桌面、服务器或者移动设备的一个或多个 CPU 或 GPU 上。

 非常简单,使用TensorFlow 训练具有一套训练数据的计算机模型。一旦模型被训练,我们就可以用模型分析未知的数据,如我们这里所说的图像分类。一般来说,模型预测的是输入数据与训练模型中的某些 “ 已知 ” 模式的匹配程度。

 在这里,我们不会深入的探索如何训练模型,因为这需要更加深入的学习机器学习的概念,并深入了解TensorFlow 系统。更多相关内容你可以查阅 TensorFlow 的模型培训教程,还可以查阅 HBO 硅谷是如何开发 hotdog or not-dog 这款 app (识别物体是否为热狗)的。

 TensorFlow 模型最大的优点是,一旦模型建立起来,就可以很容易使用,而不需要任何冗杂的后端服务器。正如 hotdog or not-dog 一样,模型本身也是在移动设备上 “ 运行 ” 。

TensorFlow模型和容器

    实验的目标之一是找出机器学习和容器之间是否有协同作用。事实证明,二者之间存在协同作用。

TensorFlow 允许你先导出一个稍后用在其它地方的预先训练好的模型,这允许你甚至可以在一个移动设备上使用 ML 模型查看图片是否包含 hotdog ,这也使容器真正称为传送和运行机器学习模型的绝佳工具。

    使用容器的一个看似不错的方法就是使用Docker 的新的多阶段构建( multi-stage builds )方案。

6f3dcc44dee6da997036274b9293fc44dd5bf6f5 

步骤一:model-builder 下载一个预先训练好的 checkpoint 模型文件,然后输出模型供 TensorFlow Serving 系统使用。

步骤二:将步骤一准备好的模型数据复制到图像上,供TensorFlow Serving 使用。所以,最终输出为一个 Docker 镜像,它包含了预先     打包好的所有东西。因此,我们可以使用一个 docker run… 命令为我们的机器学习模型服务。如果这不是一个好的协同策略,那么它什么都不是。从一个机器学习新手的角度来说,使用单个命令运行机器学习是一个很不错的方法。

    这里,我使用现成的基础镜像,以便节省安装TensorFlow 软件包等复杂工作。资源的下载链为:

        github.com/bitnami/bit…

        github.com/bitnami/bit…

API

 TensorFlow Serving 系统使用 grpc API ,由于一般的机器学习比较复杂, API 也相应较为复杂。至少它并不适合任何随机客户端程序轻松对一张 jpg 图像进行分类。使用 grpc API 就意味着需要编译 protobuf IDL’s 并发出复杂的请求。所以,我认为这个解决方案的确需要一个更为合适的 API ,人们或许可以通过网页发送一张图像,并获取分类结果。

    如上所述,我最重又设立了一个新的目标,学习一点Go 语言。 Go 语言使用 API 进入目标列表,所以,编写一个接收 jpg 图像的 API 并调用 TensorFlow Serving grpc API 进行分类就相当简单了。那么,理论和实践是两回事。 API 本身实际上很容易启动和运行,只有在使用 grpc protocol Buffer 的生成代码时才会遇到困难。似乎在 protocol 到 Go 语言转换中处理多个包时有些问题。由于我在 Go 语言上完全是个新手,最后我用一个快速检查和替换( search-and-replace )来 “ 修复 ” 一些导入到生成代码中的包。

    因此,API 只需要将一个 jpg 文件转换为 TensorFlow Serving 中的一个 grpc 请求,然后在 JSON 中返回给定的分类结果。

运行模型和API

    一旦所有的东西都在容器镜像中,在任何容器业务流程系统上对它进行部署就是一件很简单的事情。因此,我打算用Kontena 做为部署的目标。

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

998f8108f469b1b4a2201dc9c473bac1d2b77cd7 

 这里,我省略了loadbalancer 的配置,查看GitHub库 可获取更为详细的部署。

测试

    在TensorFlow 模型前使用简化的 API ,那么,使用普通的 curl 就可以很容易的测试图像分类:

79799bb890857b1519a40a412cb7eeb4c66581d0 

score 的值越高,分类的精确度越高。实验结果表明,我们的机器学习模型能够很清楚的识别出这张照片是一只熊猫。如下图:

850a1e596f6780d4587d3c48e5e25443146d1589 

    那么它处理这张热狗图像是什么结果呢?

50e924759075411c61186c19d6a69e0a89b7f937 

    测试结果看起来相当不错,我们的机器学习模型对热狗识别的精确度也很高。

总结

    基于容器的TensorFlow 模型确实提供了一个较好的部署方法。实验表明,使用上述架构模式,我们可以很轻松的设置一个可扩展的方案供 TensorFLow 模型使用。但是,使用带有任何客户端软件的模型显然需要某种 API 封装,这样可以降低客户端处理 TensorFLow grpc 的复杂性。

    在许多情况下,使用预先创建好的模型当然很不现实。和任何学习一样,这是一个需要反馈的过程,放大学习并产生更准确的结果。目前,我正在考虑通过建立一个恒定模型训练器来扩展我的方法,这个模型训练器可以反馈结果。用户可以在一些web UI 中选择实例的哪个类是正确的,或者哪个是新发布的类,这会持续的给构建模型提供一些信息。也可以定期导出模型,以便为模型容器触发一个新的模型构建。

以上为译文。

本文由北邮@爱可可-爱生活  老师推荐,阿里云云栖社区组织翻译。

文章原标题《 machine-learning-and-containers ,译者:Mags,审校:袁虎。

文章为简译,更为详细的内容,请查看原文