写点什么

容器化的数据科学与工程——第二部分:容器化的数据科学

  • 2016-05-29
  • 本文字数:3626 字

    阅读完需:约 12 分钟

(这是有关容器化世界里的数据科学与工程系列博客文章的第二部分,点看第一部分)。

首先要承认,数据科学家正在设计一些非常有意思(而且或许很有价值的)的模型、优化以及虚拟化等。不幸的是,由于很多模型不能被产业化,它们将永远也不会被使用。事实上,很多工业界正在发生的“数据科学”也同步而孤立的发生在数据科学家的笔记本上。而且,在数据科学的应用被实际部署的场景中,它们经常被部署为 python/R 脚本,上传到 AWS 并作为一个 cron 任务来运行。

正如下面所言,这是数据科学用于工业界的一个非常大的问题和障碍:

“只有一个问题——我所有的工作都是在本地机器的 R 中完成的。人们欣赏我的努力,但是由于它没有被“产品化”且框架不能和本地模型通信,他们不知道如何使用我的模型。非常大的教训!”—— Twitter 的数据科学家 Robert Chang
“数据工程师经常抱怨:数据科学家缩写的代码效率低、风格差;他们很少考虑想法产品化后的维护代价;他们经常要求一些努力很多、受益很小的不切现实的特性。类似的抱怨还有很多,但你已经知道要点在哪了。”——数据平台 Stitchfix 的经理 Jeff Magnusson

但是,请不要担心!有一个更好的方法:容器化你的数据科学应用,以方便部署、可移植以及框架内的集成

数据科学家应该关心 Docker 的原因

该问题的简单回答就是:数据科学家想让他们的模型、仪表盘、优化等等被实际使用。为了让数据科学的应用被使用并带来价值,它们需要走出笔记本电脑,并被实际部署。它们还需要能够与现有的架构兼容,并易于升级和迭代。

一个 Docker 化的数据科学应用是如何提供以下好处的呢?

  • _ 无论应用如何部署、部署在何处,你无需担心依赖问题。_ 部署数据科学的应用的一个难点就是,搞清楚机器上复杂的依赖关系(numpy、scipy、pandas、scikit-learn 和 statsmodels 等)。通过将这些应用容器化,你可以在不管依赖关系、部署机器上的操作系统类型以及现有包 / 库版本的情况下,利用一行命令轻易完成部署。
  • _ 随着公司框架的扩展或你需要扩展你的应用,你可以轻易移植或创建更多实例。_ 大家经常会在没有全面考虑服务最终部署位置、服务能力的实际需求等问题的情况下开发一个模型或应用。但是,当你将数据科学的应用容器化以后,你可以轻易的根据需求将它从 AWS 移植到 Azure。或者,你可以根据负载情况,创建更多的应用实例。
  • _ 你,作为一个数据科学家,可以保持公司的现代化架构。_ 替代在与 4 个不同的数据库直接交互的机器上的 cron 任务,容器化的数据应用可以利用 JSON API 和消息队列来与框架的其他部分进行交互。而且更让工程师觉得开心的是,当架构改变或升级时,应用也可以正常工作。你还可以将数据科学的工作和其他工程团队的 CI/CD 流水线集成在一起。(观众中的数据科学家不要担心:这并不难,而且我们会在下面给出一个例子)。

容器化数据科学应用的一个简单例子

接下来,让我们从一个 python 脚本开始了解容器化的数据科学应用。接下来,我会给出容器化数据科学应用的一个简单例子:

  1. 利用绝大部分数据科学家熟悉的技术( python scikit-learn ).
  2. 被容器化(也就是说,可以被编译为一个 Docker 镜像)。
  3. 通过 JSON API 与 Docker 容器以外的组件进行交互。

一个做预测的简单模型

这里,我们将利用著名的 Iris 数据集来构架一个 k-NN 分类模型(带 scikit-learn ):

复制代码
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
def predict(inputFeatures):
iris = datasets.load_iris()
knn = KNeighborsClassifier()
knn.fit(iris.data, iris.target)
predictInt = knn.predict(inputFeatures)
if predictInt[0] == 0:
predictString = 'setosa'
elif predictInt[0] == 1:
predictString = 'versicolor'
elif predictInt[0] == 2:
predictString = 'virginica'
else:
predictString = 'null'
return predictString

该预测函数将基于输入特征``inputFeatures`(sepal length、sepal width、petal length 和 petal width)返回一种 Iris。在本例中,用于训练模型的数据集是静态的(也就是说,从 scikit-learn 数据集中加载)。然而,你可以很轻易的想到如何从一个数据集或利用消息、API 和数据库交互所聚合的值中动态加载。

传递预测的 JSON API

接下来,我们需要将这些预测传递到其他组件。为此,我将开发自己作为简单 JSON API 的应用。对于很多使用微服务架构的工程团队而言,这种应用只是一种普通的练习。而且它可以使得数据应用与其他现存的服务更好的协同工作。

这里,我们将在 API 中使用flashk-restful,你可以使用 twisted 或其他任何架构:

复制代码
from flask import Flask
from flask_restful import Resource, Api
from flask_restful import reqparse
from utils import makeprediction
app = Flask(__name__)
api = Api(app)
class Prediction(Resource):
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('slength', type=float,
help='slength cannot be converted')
parser.add_argument('swidth', type=float,
help='swidth cannot be converted')
parser.add_argument('plength', type=float,
help='plength cannot be converted')
parser.add_argument('pwidth', type=float,
help='pwidth cannot be converted')
args = parser.parse_args()
prediction = makeprediction.predict([
args['slength'],
args['swidth'],
args['plength'],
args['pwidth']
])
print "THE PREDICTION IS: " + str(prediction)
return {
'slength': args['slength'],
'swidth': args['swidth'],
'plength': args['plength'],
'pwidth': args['pwidth'],
'species': prediction
}
api.add_resource(Prediction, '/prediction')
if __name__ == '__main__':
app.run(debug=False)

那么,我就得到了一个GET端点,使得我们可以利用其来获得针对一个特征集的预测。例如,路径

http://<host>:5000/prediction?slength=1.5&swidth=0.7&plength=1.3&pwidth=0.3将返回:

复制代码
{
"pwidth": 0.3,
"plength": 1.3,
"slength": 1.5,
"species": "setosa",
"swidth": 0.7
}

其中,在响应 JSON 中的species表示基于输入特征预测的种类。

构建 Docker 镜像的 Dockerfile

为了构建一个我们数据科学应用的“Docker 镜像”,我们西药一个Dockerfile。该Dockerfile将呆在 repo 的 root 中,并包含 Docker 镜像中的所有必须的文件和依赖关系。当我们运行 Docker 镜像时,运行我们所选择的一个命令:

复制代码
FROM ubuntu:12.04
# get up pip, vim, etc.
RUN apt-get -y update --fix-missing
RUN apt-get install -y python-pip python-dev libev4 libev-dev gcc libxslt-dev libxml2-dev libffi-dev vim curl
RUN pip install --upgrade pip
# get numpy, scipy, scikit-learn and flask
RUN apt-get install -y python-numpy python-scipy
RUN pip install scikit-learn
RUN pip install flask-restful
# add our project
ADD . /
# expose the port for the API
EXPOSE 5000
# run the API
CMD [ "python", "/api.py" ]

准备完毕,开始部署应用

以上就是构建第一个容器化的数据科学应用所需要的所有步骤(对于 Docker 的安装指令,参看 Docker 网站)。现在,让我们构建应用的“Docker 镜像”:

docker build --force-rm=true -t pythoniris

该命令将构建一个名为pythoniris的 Docker 镜像。我们可以根据需要标记该镜像(例如,pythoniris:latest),或将其和 Docker Hub 上的用户 / 账号(例如,dwhitena/pythoniris)关联起来(Docker Hub 是一个专门存储 Docker 镜像的公开仓库,类似于 Docker 镜像的 Github)。

如果你将镜像上传到 Docker Hub(或一个私有仓库),部署就像运行引用 Docker Hub 或仓库中的用户名 / 镜像名的 Docker 镜像一样容易。然而,假设你想首先在本地进行这些尝试,你可以通过如下命令来运行 Docker 镜像:

复制代码
docker run --net host -d --name myiris pythoniris

该命令将运行 Docker 镜像运行为一个名为myiris的容器、一个守护进程(-d),并使用与本地主机相同的网络接口(--net host)。现在,你的 JOSN API 就可以通过localhost:5000端口进行访问了。

可以看的出来,从 python 脚本到容器化的数据应用只需要一点点的付出。现在,请继续向前——研究数据科学、容器化数据科学和部署你的数据科学吧。

以上代码可以在 Github 中下载。


感谢陈兴璐对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-05-29 17:442232
用户头像

发布了 268 篇内容, 共 128.9 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

Go语言实现策略模式

蓬蒿

策略模式

优秀软件工程师必备的五大技能,快看你还差什么?

飞算JavaAI开发助手

vivo 短视频用户访问体验优化实践

vivo互联网技术

CDN HTTP 优化 DNS 实践

"鸿蒙生态专家面对面"三月专场等你前来!

HarmonyOS开发者

Toast的基本使用

芯动大师

android Adapter toast

如何测试一个AI系统?

陈磊@Criss

AI 测试

PyTorch深度学习实战 | 基于ResNet的人脸关键点检测

TiAmo

深度学习 人脸识别 PyTorch

聊聊「订单」业务的设计与实现

Java 架构 订单管理 订单系统 订单

Nacos心跳机制实现快速上下线

做梦都在改BUG

Java Spring Cloud nacos 心跳机制

李彦宏文心一言发布会 highlight

B Impact

设计模式-策略模式

蓬蒿

设计模式 策略模式

想到哪说到哪的AI

FN0

AIGC

低代码四大典型使用场景,你都知道吗?

飞算JavaAI开发助手

如何应用BI系统运营提效,一起看看瓴羊Quick BI的表现

对不起该用户已成仙‖

MongoDB源码学习:执行创建Collection命令

云里有只猫

mongodb 源码解析

深圳.NET线下技术沙龙倒计时一天

MASA技术团队

.net MASA

使用 Athena (Presto) 分析本地 Oracle 数据库导出的数据

亚马逊云科技 (Amazon Web Services)

Spring Boot中如何优雅地实现异步调用?

JAVA旭阳

Java springboot

100Wqps短链系统,怎么设计?

小小怪下士

Java 程序员 后端 QPS

Capital

Echo_Wish

学习 进步 笔记 资源 本质

在追求卓越的路上,面对压力时,推荐你这二个做法。

叶小鍵

DevData Talks 直播预告 | 微众银行的研发效能实践有哪些经验?

思码逸研发效能

研发效能 DevData Talks

NodeJS 实战系列:模块设计与文件分类

光毅

JavaScript node.js

Matlab常用图像处理命令108例(七)

timerring

图像处理

Next.js 实践:从 SSR 到 CSR 的优雅降级

Crazy Urus

React nextjs SSR

如何快速理解网络IO模型

Dinfan

Netty 事件循环 IO模型 Reactor多线程 网络io模型

百度生成式AI产品文心一言邀请测试,五大场景、五大能力革新生产力工具

飞桨PaddlePaddle

百度 飞桨 文心一言

在 windows 上连接 wsl 和直接打开 ubantu 有什么区别?

玄兴梦影

wsl window

内部开发者门户是什么?

SEAL安全

微服务 企业号 3 月 PK 榜 内部开发者门户 信息碎片化

GPT-4炸圈--多模态大模型

江湖修行

人工智能 大模型 GPT ChatGPT GPT-4

使用价值三角方法来全方位分析产品

产品海豚湾

产品 产品经理 产品设计 产品运营 商业洞察

容器化的数据科学与工程——第二部分:容器化的数据科学_大数据_张天雷_InfoQ精选文章