如何使用 Python、Plotly Dash 和 Google Sheets API 创建您的第一个 web 应用程序
The final product from this step-by-step guide to developing web dashboards using Plotly Dash, Python and Google Sheets API
更新 09/21/2018: 下面教程第一部分创建的 app 现在在这个 Github 仓库中可用。虽然在功能方面进行了简化,但是将那里的代码与这里的教程结合起来,应该可以让您立即开始使用 Dash。
— — — — — — — —
我最近写了几个简短的教程,讲述如何使用 Plotly 的人提供的令人敬畏的“Dash”Python 库来创建 web 应用程序。该库对于数据科学项目(或任何项目)的快速原型开发的力量是不可低估的。
然而,默认情况下,Dash 应用程序只能在本地机器上运行。显然,任何 web 应用程序的主要好处是能够与受众分享。幸运的是,Dash 库是建立在非常流行的“Flask”库之上的,Dash 应用程序可以部署为以同样的方式提供内容。我们将利用通过使用 Heroku 获得的简单部署过程,而不是从头开始配置服务器。一旦我们有了一些在 Heroku 上运行的示例代码,我们将更新应用程序,通过 Python API 从 Google Docs 电子表格中访问数据。
步骤 1:创建和设置虚拟环境
使用您最喜欢的虚拟环境,创建一个新的环境来存放应用程序。使用 Anaconda,我们只需输入:
$ conda create --name <your env name> python=3.6
创建环境后,在命令提示符下激活它(根据您的操作系统,您可能不需要在前面加上“source”),然后创建一个文件夹,我们将在后续步骤中使用它来存放所有各种应用程序文件。
$ source activate <your env name>
$ mkdir venv
$ cd venv
现在,安装应用程序所需的依赖项。
$ pip install dash
$ pip install dash-renderer
$ pip install dash-core-components
$ pip install dash-html-components
$ pip install plotly
$ pip install dash-table-experiments
$ pip install numpy
$ pip install pandas
$ pip install gunicorn
$ pip install --upgrade google-api-python-client$ pip install numpy
$ pip install pandas
$ pip install gunicorn
验证您是否在先前为项目创建的“venv”目录中。在此初始化一个空的 git 存储库。
$ git init
步骤 2:创建文件结构和初始 app 文件
与简单地在本地机器上运行相比,在 Heroku 上部署一个网站需要一些额外的文件和文件夹。为了确保事情顺利进行,我们需要根据以下结构创建几个文件:
venv/
app.py
.gitignore
.Procfile
.requirements.txt
credentials/
__init__.py
Credentials.py
在之前创建的“venv”文件夹中,创建一个名为“app.py”的新文件。我们可以使用这里的代码(链接到原始源代码)进行初始测试。
现在,创建一个“credentials”文件夹,并在该文件夹中创建两个文件,“init”。py”和“Credentials.py”。init 文件只是让 Python 知道我们希望这个文件夹是一个可导入的模块——我们可以将文件本身留空。第二个文件是我们用来存储访问 Google 工作表数据的 Google API 键的地方,但是我们稍后会更新这些键。
***重要提示:**在将代码上传到任何公共 Git 存储库之前,请确保更新 gitignore 文件以排除 credentials 文件夹!
在“venv”文件夹中,创建。gitignore 文件(我喜欢用 gitignore.io 作为启动模板)。
# At a minimum, make sure .gitignore file contains these items
*.pyc
.DS_Store
.env
接下来,同样在“venv”文件夹中,创建一个名为“Procfile”的文件,其内容如下:
web: gunicorn app:server
最后,我们需要在“requirements.txt”文件中创建一个项目依赖关系列表。只需在提示符下键入以下命令,即可轻松生成该列表:
$ pip freeze > requirements.txt
第三步:将测试应用部署到 Heroku
对于这一步,您需要在您的机器上安装一个 Heroku 帐户和命令行提示符(参见 Heroku 帐户设置的链接)。
$ heroku create lava-vino # replace "lava-vino" with your-app-name
$ git add .
$ git commit -m "Initial commit"
$ git push heroku master
$ heroku ps:scale web=1
验证该应用程序在https://lava-vino.herokuapp.com/(或您的应用程序的等效名称)上可见。
The test app shows up in the browser — Success!
第五步:更新应用程序,从 Google API 中提取数据,并将数据可视化
在之前的教程中,我解释了如何使用 Google 的 Python API 访问 Google 工作表数据。为了可视化该教程中提到的火山葡萄酒数据集,我们需要更新我们的应用程序,并提供适当的 Google API 凭证。稍微修改一下该教程中描述的步骤,将“client_secret.json”文件复制到我们在上一步中创建的“credentials”文件夹中。此外,您需要用您的地图框 ID 令牌更新“Credentials.py”文件。
**重要提示:**在将代码上传到任何公共 Git 存储库之前,一定要更新 gitignore 文件,以排除 credentials 文件夹!
接下来,用下面的代码更新‘app . py’文件(确保包含您自己的 Mapbox ID 标记,和/或更新 Google 工作表名称、ID 和数据解析方法以适应您自己的数据集)。
我们几乎准备好将更新的应用程序部署到 Heroku,但是首先,我们需要在本地机器上运行应用程序,以便生成 Google API 凭证文件。继续在本地计算机上运行“app.py”文件;您应该会收到一条警告,提示您访问一个链接,以使用您的 Google 帐户验证您的应用程序。单击链接进行身份验证—如果成功,您现在应该在 credentials 文件夹中有一个新的“credentials.json”文件。
After running the app on your local machine, click the link to authenticate access request for the Google API
生成凭证文件后,您就可以使用以下命令将更新后的应用程序部署到 Heroku 了:
$ git status # view the changes
$ git add . # add all the changes
$ git commit -m "Updated app"
$ git push heroku master
关键时刻……导航到https://lava-vino.herokuapp.com/(或者你的应用程序名称的网址,祈祷成功吧!我们的 web 应用程序已成功部署到世界各地!
如您所见,创建 Dash 应用程序并通过 Heroku 进行部署相对简单,而且所有这些都无需编写任何 HTML、Javascript 或 CSS 代码。显然,这个应用程序还有很多工作要做——交叉引用葡萄酒名称数据、可视化数据、创建友好的用户界面等。我们将在以后的教程中讨论这些内容。我还将尝试上传一个项目的精简版本到它自己的 Git 存储库中,这样它就可以很容易地被克隆为一个模板。与此同时,希望这能让你开始运行自己的 Dash 应用程序!
如何为您的业务数据集策划一个基本事实
如果你是一名实践数据科学家,总是给你一个精确标记的数据集来应用先进的机器学习算法,这篇文章不适合你。这是为我们公司世界中的其他人准备的,他们必须争取有用的数据集来解决我们团队面临的业务问题!
很有可能你已经在虹膜数据集上运行了实验,用于演示基本的机器学习模型。对于教育目的来说,这是一个很好的数据集,但我经常看到有抱负的数据科学家在试图将这些技能应用于现实世界的问题时感到沮丧。为什么学术界的项目与现实世界中的项目如此不同?
你也可以将同样的故事情节扩展到“Kaggle Cowboys”,他们非常擅长在精心策划的问题陈述和数据集上优化机器学习算法,但在处理现实世界的商业问题时,往往很难捕捉到同样的吸引力。同样,在比赛中运用你的技能和在公司项目中运用你的技能有什么区别?
我对这种差异的观察集中在数据注释的艺术/科学上,或者简单地给你的观察加上一个标签!业务问题通常会提交给数据科学团队,他们的意图是好的,但缺乏关键数据点,这使得训练任何有监督的机器学习算法都不可能。对于那些不在业务领域的人,回想一下 Iris 数据集。它类似于只包含原始属性的数据集,没有最终的类来识别正在测量的虹膜类型。或者与此相反,只捕获最终的类,而不捕获有助于做出最终分类决策的属性。
不幸的是,对于一些遗留的业务流程来说,制定决策的决策因素没有被数字化地捕获。解决这些差异的正确方法是与流程工程师和应用程序开发人员合作,告诉他们我们需要收集的数据点,以便在未来应用机器学习算法。然后提出变更请求,以在生产系统上实现这些特性,并可能在流程中重新培训工人。然后我们可以开始考虑在未来的某一天应用机器学习。然而,您的业务发展速度可能会要求您还需要找到一个针对所有历史数据的解决方案,并在本财政季度内展示一个机器学习概念验证!
当数据缺少关键信息时,我们如何弥合这一差距,以利用可用的历史数据来展示机器学习的潜力?
答案出人意料地简单,却很难掌握。利用调查设计中的原则,用人类智慧简单地增加你的历史数据。注释原始数据集的学科通常不与机器学习算法一起教授,但应该这样。如果你看看发表在知名期刊和学术界的文章,就会发现有一整套关于他们如何从主题专家(SME)那里获取实验数据的实践。让我们花点时间来探索这一规律,以及如何将它引入我们的业务数据集。
谷歌巧妙地将数据注释实践掌握到一项名为 reCAPTCHA 的“免费”服务中。reCAPTCHA 可用于任何网站,并为他们提供抵御机器人的高级安全性,同时引导人类访问者的精神能量解决数字化文本或注释图像的低技能“验证码”。他们利用多人的智慧来构建这个带注释的数据集。这有助于解释任何单个人的偏见,并开发一个“真理”数据集,该数据集是关于被标记的观察结果的普遍接受的“真理”。当然,这里的问题是,任何利用 reCAPTCHA 的网站都在将数据注释任务反馈给 Google 的专有数据集!
整个流程是平滑无缝的,允许一大群人用标签来增加先前未标注的数据集。这为先进的机器学习算法打开了闸门,以解决有趣的商业问题!随着数十亿人访问数十亿个网站,其中一些参与了 reCAPTCHA,谷歌成为人工智能行业的领先公司有什么好奇怪的?企业应该如何利用这群互联网工作者来注释他们自己的专有数据集?我们能为我们的业务数据集复制这个工作流吗?
亚马逊也看到了这一潜力,但他们没有让一群匿名的互联网工作者注释自己的专有数据集,而是将其作为一个名为 Mechanical Turk 的 API 服务公开。这项服务提供了一个惊人的平台,将任何拥有未注释数据集的人与一群愿意以最低报酬注释数据集的工作者联系起来。就数据注释而言,我认为 MTurk 是每个数据注释平台都应该追求的“黄金标准”,这主要是因为可用劳动力的规模可以转化为对数据集进行注释的速度。在实践中,当员工完成交给他们的任务时,你通常会给他们每分钟 0.12 到 0.25 美元的报酬(大约每小时 8 到 15 美元)。
就我们所处理的商业问题的规模而言,你可以在 MTurk 上以非常便宜的价格获得你的数据集注释!对于给定数据集中的数万个观测值,您通常可以期望 MTurk 上的一大群工作人员在几个小时内完成任务,而费用仅为几百美元!但是这里有一个大陷阱…
一般来说,任何互联网用户一般都有资格完成低技能的注释任务,如数字化文本或注释图像。然而,当手头的注记任务需要具有专业知识的高素质工人时,愿意为低工资的数据集进行注记的人数开始显著下降。对于这些类型的数据集,目前的策略是通过“面试”确定哪些员工可以参与,并提高每项任务的报酬。
在商业中,你不太可能有一个足够简单的数据集,只需要 MTurk 工人的低技能工作。除了数据集的复杂性之外,更大的挑战很可能是你的数据集是你的企业专有的,你的信息安全团队将规定你不能将它暴露给互联网上的任何匿名工作者。那么这是否意味着众包你的数据标注任务是不合适的呢?
Figure Figure Figure(原名 CrowdFlower)提供了许多与 MTurk 相同的功能,但增加了让工人在 NDA 下操作的承诺。当然,我们不断添加到工人人才库来注释我们的数据的请求越多,我们的人才库就越小,报酬就越高。
当您深入研究您的数据集以定义您要求 NDA 手下的这些工人执行的任务时,您可能会得出这样的结论:数据集的复杂性如此错综复杂,以至于需要非常具体的知识才能正确地进行注释。在某些情况下,这种知识可能在你的业务中根深蒂固,以至于指望公司以外的任何人都能正确回答是不合理的。这就引出了一个问题,为什么我们不能让我们内部的主题专家(SME)来为我们做注释工作呢?如果我们要求内部员工注释我们的数据,为什么我们需要第三方服务?
要求内部 SME 注释数据的挑战通常集中在一致性、规模、优先级、相关性和紧迫性上。通常,你需要帮助注释数据集的 SME 在他们的职业生涯中已经超越了对单调乏味工作的兴趣。这些挑战大多可以通过良好的领导、沟通和适当的激励来解决。然而,对于剩下的技术挑战,请查看 PyBOSSA 。PyBOSSA 是一个开源的众包应用程序,源自 BOSSA ,构建于 Python、Redis 和 PostgreSQL 之上。
使用 PyBOSSA,我们可以公开 reCAPTCHA、MTurk 或 Figure Figure 8 的相同功能,以帮助注释我们的数据集。该解决方案的美妙之处在于,您拥有整个基础设施,并且可以对其进行定制,以满足您的确切的业务需求。这意味着您可以在内部部署它,在特定身份认证要求的保护下满足您的信息安全和法律团队的要求。以及将每个活动的现成 RESTful API 路由到 SME 的现有工作流中,以最小化注释数据的摩擦(类似于 reCAPTCHA)。它还包括基本的活动指标和基本的 web 界面,供您起草任何 HTML DOM 和 JavaScript 来处理任何类型的注释任务。
不管你选择哪个众包平台来注释你的数据集,仍然有一个关于注释质量的问题,以及我们能在多大程度上信任这些工作者??
为了回答这些问题,在以后的文章中,我们将介绍一些业务数据集的 数据注释最佳实践 。
如何自定义 JupyterLab 键盘快捷键
我经常发现自己想要重新启动并运行所有单元格,所以我想制作一个键盘快捷键。我制作这个教程是为了帮助其他人,因为它不是一个点击选择的东西
JupyterLab 就像合成代谢类固醇的 Jupyter notebook 没有增加的癌症风险和其他负面副作用。JupyterLab 被宣传为 Jupyter 项目的下一代 UI。2018 年初 beta 发布。
有趣的事实是,Jupyter 人把 JupyterLab 写成一个单词,而 Jupyter notebook 写成两个单词😃。
这感觉就像使用您熟悉的 Jupyter 笔记本电脑,并增加了导航标签等功能。这是未来——它就在眼前。
如果你和我一样,你可能看过巨蟒之灾中的 JupyterLab,但却一直保存着你的 Jupyter 笔记本。试试看。它可以帮助你提高工作效率。说到生产力,我们来做一个键盘快捷键。🚀
正在做
用conda install -c conda-forge jupyterlab
或pip install jupyterlab
安装。然后在终端中用jupyterlab
运行 JupyterLab,或者在 Anaconda Navigator 中选择应用程序图标。
JupterLab 打开后,点击设置下拉菜单。选择高级设置编辑器。
选择键盘快捷键。
您将在系统默认设置面板中看到每个选项的字典。有一大堆选项,所以你可能想用Command+F(Windows 上的 Ctrl + F 来找到你想要的那个。复制您想要覆盖的代码。
这里是重启并运行全部的部分。
{
"command": "runmenu:restart-and-run-all",
"keys": [
""
],
"selector": "[data-jp-code-runner]"
},
将此代码粘贴到用户首选项面板中。在键列表中,输入您想要成为快捷键的键的名称。我在下面加了 Ctrl 和 Shift 和 R 。
更新 2020 年 6 月 24 日,沙希达在评论中指出,JupyterLab 更改了用于更改键盘快捷键的 API。下面的代码已更新。谢谢沙希达!
{"shortcuts":
[
{
"command": "runmenu:restart-and-run-all",
"keys": [
"Ctrl Shift R"
],
"selector": "[data-jp-code-runner]"
}
]
}
我建议通过在系统默认面板中搜索您的新组合键来确保您没有覆盖另一个 JupyterLab 键盘快捷键。
现在你知道了。按下Command+S(Windows 上为 Ctrl + S )保存,打开笔记本文件,试用你的新键盘快捷键!
全部运行!
真见鬼。
您刚刚学习了如何通过在 JupyterLab 中制作键盘快捷键来节省时间。请注意,这将在 Jupyter 实验室的编辑模式或命令模式下运行。
有些命令不会出现在系统默认设置面板中。这里列出了可以绑定的命令。
尝试和享受!
包装
我希望这篇自定义 JupyterLab 快捷方式的指南对你有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。😀
我写关于 Python 、 SQL 和其他技术主题的文章。如果你对这些感兴趣,请注册我的邮件列表,那里有很棒的数据科学资源,点击这里阅读更多帮助你提高技能的内容。👍
没有学位如何学习数据科学
一位数据科学家的想法和建议
Me at GoDaddy office
简介
你好。
我想向你展示如何成为一名没有学位(或免费)的数据科学家。具有讽刺意味的是,我有一个学位——甚至是为数据科学而设的学位(西北大学的分析学硕士)。但是给你一点背景,我以前是德勤的会计。这不是很疯狂吗?我远离数据科学或任何技术。由于我来自一个非技术背景的家庭,我不得不在工作之余,甚至在我的硕士课程期间,自己在网上学习很多东西,以赶上我的同龄人的水平。亲身经历过,我可以告诉你,学历很有帮助,但不是必须的。因为我一直站在获得学位和在线学习的两边,我想我可以给你一个独特的视角。获得数据科学硕士学位是进入该领域的一种可靠而快速的方式,但幸运的是,如果你不想花 6-9 万美元的学费,你不必这样做。不过,这需要你高度的自律。
如果有朋友问我如何进入数据科学领域,这篇文章就是为他们准备的。我希望你能发现我的建议是有价值的和相关的,因为我自己也经历过这个过程,并且发现这些资源是有用的。在我们进入细节之前,让我们先了解一下数据科学是什么。
作为一名数据科学家,您从事什么工作?
如果你已经知道这一点,请跳过这一部分。
嗯,根据我在 GoDaddy,HERE 和 GoGo 等几家公司担任数据科学家的经验,数据科学家通过对大数据应用机器学习来解决问题。一些例子是:预测客户取消订阅的概率,识别数据异常,计算千兆字节或兆兆字节数据的即席分析,将客户分组为有意义的组,文本分析以在客户聊天记录中找到主题,计算收入预测,并且列表不会结束。
作为一名数据科学家,你会遇到许多不同类型的问题。要想胜任,你需要有扎实的数学、统计和编程基础。您需要知道何时根据问题和数据使用特定的技术和算法。最后,您通常需要将结果和技术展示给高管和不太懂技术的观众。
此外,作为一名数据科学家,你需要继续学习和适应。因为这个领域变化很快,所以跟上时代和学习新技术很重要。即使是今天,我也花很多时间学习。
成为数据科学家需要什么(免费)
Free online resources
数据科学家的工作听起来让你兴奋吗?太好了。这是一个活着免费学习的好时机。我试图专注于免费或便宜的选择,因为谁不喜欢免费的东西?它只需要你的承诺和毅力。我将分三个阶段描述这个过程。
请记住,除了下面提到的,还有其他很好的资源。但这些恰好是我拍的,觉得有用。
第一阶段:婴儿期
为了擅长数据科学,你需要有良好的编程、统计和数学基础。至少,我建议您学习以下内容:
- 大学水平的介绍计算机科学课程(对我来说是 C++)。
- 大学级别的低年级数学课程,如多变量微积分、微分方程、线性代数。这将直接影响你对深度学习底层数学的理解,比如反向传播和矩阵运算。
- 大学水平的统计介绍和概率教你 r
好消息是他们不必在大学里参加。要在线学习我上面提到的技能,我推荐这些:
- 数学:多变量微积分、微分方程、 线性代数 出自 可汗学院 。
- 统计学:R 中的统计学与数据科学导论: 约翰霍普金斯大学 Coursera 上的数据科学专业 。
- Python:**CodeAcademy.com为 Python 中的一般编程。**
要查看数据科学可以做什么的示例,请查看 Kaggle.com 的,在那里人们学习和竞争数据科学项目。另外,看看 DataCamp.com 的,它提供了用 R 和 Python 编写的各种数据科学主题的实践教程。****
到第 1 阶段结束时,您应该能够熟练地在 R 或 Python 上执行简单的机器学习技术,如逻辑/线性回归和决策树。另外,我建议同时学习 R 和 Python。尽管我最近主要使用 Python,但根据您试图解决的问题,了解这两者是很有用的。
第二阶段:青春期
现在,您应该对数据科学和统计方法有了更好的了解。在第二阶段,你想更深入,专注于机器学习。我发现像 Coursera 这样的在线资源通常不会涵盖大学水平的课程。谢天谢地, 斯坦福的人工智能实验室 免费在线提供令人惊叹的课程。所以你可以免费观看世界一流的讲座、课堂笔记和许多其他课程材料。所以如果可以的话,我建议你参加 Coursera 课程,同时观看斯坦福大学的讲座。例如,Coursera 上的deep learning . ai向你展示了深度学习非常好和实用的一面,而斯坦福的cs 231n 计算机视觉课程要深入得多。****
在此阶段,采取以下措施:
- 机器学习:吴恩达在 Coursera 上的机器学习课程 。我参加了这次考试,但没有支付认证费用,因为我的作业没有使用 python 或 r。但这对理解机器学习的基础仍然非常有用。
- 机器学习: 斯坦福 CS229 机器学习课程 。这些是吴恩达的旧演讲视频,但仍然很好。
- 文本分析: 在 Coursera 上应用 Python 中的文本挖掘。我没有上过这个课程,但是文本分析和自然语言处理(NLP)是一个数据科学家非常普遍和需要的技能。
- PySpark: DataCamp 的 PySpark 课程简介 。Pyspark 是 spark 分布式计算框架的 python 版本。简单地说,它允许你在非常大的数据上使用 python。我每周都用它。
- **深度学习:吴恩达 Coursera 上的 deep Learning . ai**。我付费认证是因为这门课的作业很好。因为它很实惠,所以我建议你付钱。
- 计算机视觉: 斯坦福 CS231n 卷积神经网络视觉识别教程 。
- 自然语言处理:斯坦福 CS224n 自然语言处理与深度学习课程 。
- (2019–10–01 更新) PyTorch 与实用深度学习:fast . ai。我听说了很多关于这个免费课程的好消息,PyTorch 也越来越受欢迎。我打算亲自去看看这门课。****
同样,还有其他资源,如 DataCamp、Udacity、edX 和 fast.ai,您可以查看以了解各种主题。
第三阶段:独立
在这个阶段,你应该为面试做准备,并继续学习新的和更深入的话题。如果你已经掌握了材料,直到第二阶段,我认为你应该有足够的知识来申请一份入门级的工作。然而,还有几件事对你通过面试很关键。
第一,个人项目。如果你在一个数据科学项目中,大多数课程都会让你完成机器学习项目,这对练习你的技能和向雇主展示你所做的事情非常好。所以我真的建议你尝试一些个人项目,最简单的就是 Kaggle。另外,尽管没有必要,我还是建议你在 Github 上放一些你已经完成的示例代码和项目,给未来的雇主看看。
第二,你很可能会被面试 SQL。当我开始在 GoDaddy 工作时,我并不太了解 SQL。当我在面试的时候,我只是通过谷歌 SQL 面试问题了解了一点关于 W3Schools.com 的知识。即使要看公司,SQL 也没有你的机器学习和编程技能重要。在工作中学习相对容易。去 Leetcode.com看看,练习你的 SQL 和编程技能。
最后,到这个阶段,你应该有足够的知识来探索不同的机器学习主题,并进行更深入的学习。你可以关注任何你感兴趣的话题,无论是 RNN、CNN、NLP 还是其他。我呢,这几天在努力学习强化学习。
结论
这是我的第一篇文章,我真的希望你会觉得有用。我试图把重点放在你应该学习的特定课程上,而不是你需要学习的特定工具或 Python/R 包,因为这些课程会教你这些东西。
如果你想看机器学习的示例代码,请查看我的 Github 知识库,我会不断更新我学到的新东西。我计划分享更多我正在做的不同项目或任何其他关于媒体的想法!如果你有任何问题,或者希望我在未来报道任何具体的事情,请在下面的评论中提问。
感谢您的阅读!
你可以看看我的其他文章和项目!
- 和我聊天:https://calendly.com/jasjung/30min
- 中型:为什么有这么多不同类型的数据科学家? 机器学习工程师 vs 数据科学家(数据科学结束了吗?)
- 中:好奇成为数据科学家后会发生什么?查看我的新文章, 如何作为一名数据/研究科学家保持最新状态 。
- 项目:我最新的项目 www。薪.忍者 及对应文章 欢迎来到薪忍者 。
- Youtube:我的程序( AlphaBlitz )使用深度学习击败了脸书的文字游戏。喜欢并订阅!😃
- Medium : 我如何在 5 周内用 Django 构建并部署我的第一个 Web 应用 。
- 中型: 我如何用我的前四篇中型文章 赚了 2000 多美元。
- 中等: 四年内做过软件工程师、机器学习工程师、数据科学家。这些是我的主要收获。
如何进行数据实验:针对大型数据集运行笔记本电脑
将大数据传输到本地计算环境既缓慢又昂贵。在这一集的人工智能冒险中,我们将看到如何将您的笔记本环境应用到您的数据中!
唯一比交互式 Python 笔记本更好的是什么?当然,这是一个具有快速简单的数据连接的交互式 Python 笔记本!
上一集我们看了 Jupyter 笔记本有多有用。这一次,我们将看到如何通过在云中运行它来实现更多的额外好处!
数据,但更大
随着您在云中处理越来越大的数据集,使用您的本地机器与它进行交互变得越来越困难。下载具有统计代表性的数据样本来测试你的代码会变得很困难,而在本地传输数据进行训练依赖于稳定的连接。那么,数据科学家应该做些什么呢?
如果您无法将数据带到您的电脑上,请将您的电脑带到您的数据上!让我们看看如何在云中运行笔记本环境,靠近您的数据集!
Google Cloud Datalab 建立在我们熟悉的 Jupyter 笔记本之上,增加了一些功能,包括轻松验证 BigQuery 数据集、快速操作 Google 云存储以及 SQL-query 支持!这个工具包在 GitHub 上也是开源的,所以你可以在你自己的环境中运行它。
让我们创建一个数据实验室环境,并为在云中运行我们的笔记本电脑做好准备。
使用gcloud components install datalab
安装 datalab 组件。然后您将拥有一个名为datalab
的新命令行工具。
Installing Datalab is a one-command operation
启动 Datalab 是一行命令:datalab create
Datalab still connects to localhost!
该命令启动您将用于分析的虚拟机,配置网络,并安装我们将使用的必要库,包括 TensorFlow、pandas、numpy 等等。
一旦 Datalab 启动,它将打开一个笔记本环境,看起来与我们在 Jupyter 笔记本中看到的非常相似。然而,这不是在本地运行,而是在云中的虚拟机上运行。Datalab 默认安装了一些示例,这是一个开始探索的好地方。让我们看看“你好,世界”笔记本,在“文档”文件夹中。
在这里,我们可以立即开始使用笔记本,运行细胞并进行实验。这非常方便,因为不需要管理和配置不同的 python 库。
让我们来看看几个内置的附加工具。在右上角的帐户图标上,有一些需要注意的数字设置和有用信息。
首先,请注意笔记本是作为服务帐户运行的。服务帐户已经使用我们所在项目的资产进行了身份验证,但是如果我们想要从另一个项目访问资源,我们需要授予服务帐户访问权限,而不是用户帐户。
由于运行笔记本的虚拟机对于能够访问项目的任何人都是可访问的,所以我们不想在 datalab 笔记本中暴露我们自己的帐户凭证。
继续向下,我们看到我们正在从一个名为 ai-adventures 的 Google Compute Engine 虚拟机运行笔记本,我们可以随时通过单击该按钮关闭虚拟机。
默认情况下,一旦虚拟机空闲 90 分钟,Datalab 就会关闭它。您可以通过单击消息来切换此功能。
超时也可以设置为自定义值。让我们去设置看看如何做到这一点。我们在此设置的值将在虚拟机重新启动后保持不变,如果设置为零,将不会发生自动关闭。
这也是我们可以选择亮或暗的主题的地方。
现在,我们已经设置好了 datalab 笔记本电脑,并熟悉了我们的环境,让我们看看可以用 datalab 做些什么吧!
Datalab 运行中的一个示例
今天我将通过一个例子来描述 Github 上使用的编程语言之间的相关性。也就是,“如果你用语言 A 编程,你有多大可能也用语言 B 编程?”笔记本在 docs 下的 samples 目录中。你也可以在 GitHub 上查看一下。
该分析仅使用了更大的 GitHub 公共数据集的一小部分样本。如果你想使用完整的 Github 提交历史,你可以点击查看数据集,点击查看随附指南。
结论和后续步骤
Datalab 是一种在靠近数据的地方运行云连接笔记本的好方法,它可以方便地连接到 BigQuery 等工具,并且可以轻松地在云中验证数据集。
去试试 Datalab,看看它是不是适合你的选择!
感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注媒体上的me或订阅 YouTube 频道的来观看未来的剧集。更多剧集即将推出!
营销组合建模中的数字变量(MMM)
Source: Pixabay
传统的 MMM 有助于理解电视、户外、印刷广告、店内促销和折扣等营销投入的影响。
随着数字技术的破坏,营销人员现在正在寻找一套新的营销投入,以了解他们的营销组合。MMM 中使用的一些数字变量是:脸书花费和印象、Instagram 花费和印象、有机会话、网站访问/流量、横幅花费、付费搜索花费和在线视频/内容花费。
那么,问题是如何处理 MMM 中的数字变量呢?
- 线性与非线性影响:
Source: https://www.bearfoxmarketing.com/marketing/difference-traditional-marketing-vs-digital-marketing/
在 MMM 中,TV 被视为非线性变量。非线性意味着电视支出/GRP 的每一个单位增长都不会产生单位销售回报。电视广告的效果开始随着时间而衰减。(详情请参考我在 MMM 上的第一篇文章:https://towardsdatascience . com/market-mix-modeling-MMM-101-3d 094 df 976 f 9)
另一方面,对许多品牌来说,数字媒体是一种相当新的投资媒介。因此,许多企业将数字视为线性变量。换句话说,随着数字支出/印象的增加,销售额也会增加。将数字花费/印象视为线性的另一个原因是,与传统的广告媒体(如电视、印刷和网络)相比,数字是相对便宜的媒体。因此,营销人员有足够的钱来增加对数字空间的投资,以获得更好的投资回报。
然而,并非所有品牌都是如此。例外情况可能包括那些可能没有开展有效的数字活动或在数字媒体上投资很少的品牌。随着时间的推移,脸书或 Youtube 广告的效果会减弱,从而使曲线变得非线性。
2。印象与花费(哪个更相关):
Source: Pixabay
通常,相同营销投入的印象和花费可能彼此具有非常高的相关性。因此,将模型中的两个变量放在一起考虑是不准确的。选择其中任何一个时,应考虑以下事项:
一、做 MMM 的目的是什么?目标是了解每项投入的投资回报率和资金投向,还是仅仅了解推动销售的因素?在前者的情况下,支出应被明确视为投入。
二。在后一种情况下,应检查整体模型统计和稳健性,并选择两个变量中的任何一个。
3。变量间多重共线性高:
Source: Asce Library
通常,数字变量以它们之间非常高多重共线性为特征。在构建模型时,最好进行几次迭代,并在模型中使用这些数字变量的不同组合。这应该由领域知识和模型的统计意义来支持。
4。投资回报影响:
Source: http://stephenlnelson.com/articles/quicken-annual-return/
如果在数字媒体上花费了大量资金,数字投资回报率通常会高于电视投资回报率。然而,如果在电视上投入大量资金,电视投资回报率将超过数字投资回报率。这不应该被认为是一个需要担心的问题,因为通常如果数字媒体的花费少了,就有机会在数字媒体上投入更多的钱(由于它的线性性质)
这是一个关于如何处理 MMM 中的数字变量的简介。
敬请关注更多文章!!
你也可以看我在 MMM 上的其他文章- 这里、这里、这里和这里。
更多详情,请联系:
版权所有 2018www.ridhimakumar.com版权所有。
如何在遗传算法中定义一个适应度函数?
在我的上一篇文章中,我已经解释了关于遗传算法的基础知识。这篇文章发表后,我收到了许多关于适应度函数和评估策略的讨论请求。在本文中,我们将讨论适应度函数,以及如何针对给定的问题提出适应度函数。
什么是健身功能?
适应度函数(也称为评估函数)评估给定解决方案与期望问题的最优解决方案的接近程度。它决定了解决方案的适合程度。
我们为什么使用健身功能?
在遗传算法中,每个解一般被表示为一串二进制数,称为一个染色体。我们必须测试这些解决方案,并拿出最佳的解决方案来解决给定的问题。因此,需要给每个解决方案打分,以表明它与期望的解决方案的总体规格有多接近。该分数通过将适应度函数应用于测试或从测试解决方案获得的结果而生成。
适应度函数的一般要求
任何适应度函数都应满足以下要求。
- 应该清楚地定义适应度函数。读者应该能够清楚地理解健身分数是如何计算的。
- 应该有效地实现适应度函数。如果适应度函数成为算法的瓶颈,那么遗传算法的整体效率就会降低。
- 适应度函数应该定量地衡量给定的解决方案在解决问题时的适合程度。
- 适应度函数应该产生直观的结果。最佳/最差候选人应具有最佳/最差分值。
如何针对给定的问题想出一个适应度函数?
每个问题都有自己的适应度函数。应该使用的适应度函数取决于给定的问题。当使用遗传算法来公式化一个问题时,为给定的问题提出一个适应度函数是最难的部分。
没有硬性规定,特定的函数应该用于特定的问题。然而,对于某些类型的问题,数据科学家已经采用了某些函数。
通常,对于使用监督学习的分类任务,诸如欧几里德距离 e 和曼哈顿距离之类的误差度量已经被广泛用作适应度函数。
对于优化问题,诸如与问题域相关的一组计算参数之和的基本函数可以用作适应度函数。
我们来看几个例题和它们相关的适应度函数。
示例 1—生成序列
考虑下面给出的例子。我使用这个简单的例子主要是为了便于理解。
给定一组 5 个基因,它们可以保存二进制值 0 和 1 中的一个,我们必须得到全为 1 的序列。所以我们必须尽可能地增加 1 的数量。这可以认为是一个优化问题。因此,适应度函数被认为是基因组 中存在的 个 1。如果有五个 1,那么它有最大的适应性,解决了我们的问题。如果没有 1,那么 If 具有最小适应度。
下面给出的代码显示了如何实现适应度函数来计算适应度分数。
示例 2—时间表安排
Timetable for a week
可以使用遗传算法的一个非常著名的场景是制作时间表或时间表安排的过程。
假设您正试图为某一特定批次的大学课程制定一份每周时间表。我们必须安排课程,制定时间表,这样课程之间就不会有冲突。在这里,我们的任务是寻找最佳的时间表安排。
既然班级之间不应该有冲突,我们应该尽量减少有班级冲突的学生人数。你可以把适应度函数公式化为 有班级冲突的学生人数 的倒数。有班级冲突的学生人数越少,班级越适合。
示例 3-寻找满足给定约束的一组变量的值
考虑三个变量 x,y 和 z。问题是找到 x,y 和 z 的最佳值集合,使得它们的总值等于值 t。
x + y + z = t
我们必须减少 x+y+z 之和偏离 t,即|x + y + z — t|应该为零。因此,适应度函数可以被认为是|x + y + z - t| 的 逆。
Fitness function = 1/|x + y + z - t|
这些是应用遗传算法的几个例子,以及如何得出它们的适应度函数。为了便于理解,我使用了这些简单的例子。在对复杂的现实世界问题建模时,我们可能得不到如此简单的适应度函数。
最终注释
适应度函数必须能够衡量你的解决方案有多好。特别是,它应该能够处理生成的任何可用的解决方案,并且必须显示出改进它们的正确方法。
例如,除非答案是正确的,否则为零的适应度函数是不好的,因为它不能帮助您了解解决方案与正确答案有多接近。此外,随着解决方案变得更好而增加,但不识别最佳解决方案的适应度函数也不是那么好,因为您的群体将提高到某个点,然后停滞不前。
你必须处理这个问题,从不同的角度考虑,并考虑可以用什么样的函数来检验你的解决方案有多好。你想要一个函数,它对坏解给出低值,对好解给出高值。通过练习,你最终会更好地为给定的问题定义一个适应度函数。
希望你对如何为一个给定的使用遗传算法解决的问题定义一个适应度函数有了一个基本的概念。
感谢阅读…
如何在 AWS Lambda 上部署机器学习模型
在本教程中,我将带您在 AWS Lambda 上部署一个机器学习模型。我们的模型也可以通过使用 Amazon API Gateway 的 API 进行访问。最终,我们将得到一个真正无服务器系统的完美配方。让我们直入主题吧。
将你的模型上传到亚马逊 S3
第一步是将你的模型上传到亚马逊 S3。如果你不熟悉亚马逊 S3,请访问此链接开始:http://docs . AWS . Amazon . com/amazons 3/latest/UG/uploadingobjectsintoamazons 3 . html
创建虚拟环境
当部署到 AWS Lambda 时,您需要上传一个包含代码和依赖项的虚拟环境。在项目文件夹中,编写以下几行。为了避免冲突,你应该而不是将你的虚拟环境命名为你的项目文件夹。
pip install virtualenv
virtualenv your_virtual_environment_name
要启动您的虚拟环境:
source your_virtual_environment_name/bin/activate
创建烧瓶 API
我们需要一个基本的 Flask 应用程序来处理我们的请求。该应用程序将从亚马逊 S3 加载我们的模型,并返回预测。首先创建一个名为 predictions.py 的文件,然后添加下面的代码。确保在进入下一步之前修改 BUCKET_NAME 和 MODEL_FILE_NAME 。
从亚马逊 S3 加载我们的模型
使用 Boto 库,我们加载之前保存在亚马逊 S3 上的模型,并保存到磁盘以备后用。
创建预测
最后但并非最不重要的是,我们准备得到一些预测。predict 方法接收发送给 API 的数据作为参数。您将需要添加一些代码来处理数据,以匹配您的模型。
最终文件应该是这样的
测试 API
- 要运行您的应用程序,您必须创建一个环境变量来告诉 Flask 要执行哪些文件:
export FLASK_APP=predictions.py
在将代码部署到 AWS 之前,您应该确保代码在本地工作。
安装烧瓶,然后运行第二个命令来启动你的应用程序:
pip install Flask
flask run
打开终端,测试你的预测:
curl -d '{"payload": "Insert the data needed for your model to make predictions"}' http://127.0.0.1:5000/
当一切正常时,你可以进入下一步。
部署到 AWS Lambda
我们将使用一个名为 Zappa 的库,而不是手动创建和配置 AWS Lambda 和 API 网关。
Zappa 使在 AWS Lambda + API Gateway 上构建和部署所有 Python WSGI 应用程序变得非常容易。
重要提示:在部署之前,确保配置您的 AWS 凭证。更多信息请访问:http://docs . AWS . Amazon . com/CLI/latest/user guide/CLI-chap-getting-started . html
在您的虚拟环境中,安装所需的软件包:
pip install zappa sklearn boto numpy scipy
然后,初始化 Zappa 。当被问及 app 函数名时,写下 predictions.app. (或者,你的 Flask app +的名字。app)
zappa init
AWS Lambda 要求您的环境最大大小为 50mb,但我们的打包环境大约为 100mb。幸运的是,Lambda 可以从亚马逊 S3 加载代码,而不会有太大的性能损失(只有几毫秒)。
要激活此功能,您必须在 zappa_settings.json 中添加一个新行
"slim_handler": true
您现在可以开始部署了。在初始化 Zappa 时,使用带有您选择的环境名称的 deploy 命令。
zappa deploy your-environment-name
完成后,您将在最后一条消息中看到您的 API URL。它将看起来像“https://abcdefg . execute-API . us-east-1 . Amazon AWS . com/your-env-name”
您可以使用 cURL 测试您的部署:
curl -d '{"payload": "Insert the data needed for your model to make predictions"}' https://your-api-url.com/your-env
恭喜你!您已经在无服务器基础设施上部署了您的模型。
如果你喜欢这篇文章,请一定留下你的关注。我也有一些关于机器学习的很棒的文章即将发表,敬请关注!
你也可以在推特上联系到我。
如何使用 Docker 部署 MongoDB 副本集
文章已更新
我写了一篇关于如何使用 DevOps 时尚风格部署 mongodb 集群的新文章,在这篇文章中,我使用了 Terraform、Ansible、Packer 和更多很酷的技术,我强烈建议您阅读它。
[## 以 DevOps 方式部署 MongoDB 副本集(作为代码的基础架构)
介绍
medium.com](https://medium.com/@cramirez92/deploy-a-mongodb-replica-set-in-a-devops-fashion-style-infrastructre-as-code-f631d7a0ad80)
本文将介绍如何使用 docker 设置带身份验证的 MongoDB 副本集。
本文中我们将使用的是:
- MongoDB 3.4.1
- Mac docker 1 . 12 . 6
副本集的体系结构
MongoDB Replica Set
用 docker 构建我们的副本集
Servers Distribution using Docker
在上图中,我们看到了用 docker 设置的复制结果。
#先决条件
- 码头工人的基础知识
- 对接机和对接机安装完毕
- mongoDB 中的基础知识
- bash 脚本的基础知识
如果你在 Mac 或 Windows 上,考虑使用虚拟机。我将在 MacOS Sierra 上使用 VirtualBox 来运行我们的 mongoDB 实例。
#步骤 1 —创建我们的 3 台对接机
要创建 docker 机器,我们需要在终端中发出下一条命令:
$ docker-machine create -d virtualbox manager1
这个命令将创建一个名为 manager1 的机器,使用 virtualbox 作为我们的虚拟化提供者。
现在让我们创建两个左docker-machine
$ docker-machine create -d virtualbox worker1$ docker-machine create -d virtualbox worker2
要验证我们的机器是否已创建,让我们运行以下命令:
$ docker-machine ls// the result will be
NAME ACTIVE DRIVER STATE URL
manager1 - virtualbox Running tcp://192.168.99.100:2376
worker1 - virtualbox Running tcp://192.168.99.101:2376
worker2 - virtualbox Running tcp://192.168.99.102:2376
#步骤 MongoDB 主节点的配置
现在我们有了三台机器,让我们将它放在第一台机器上,开始 mongodb 配置,让我们运行下一个命令:
$ eval `docker-machine env manager1`
在创建我们的 mongoDB 容器之前,有一个非常重要的主题已经在 docker 容器中围绕数据库持久性讨论了很久,为了实现这个挑战,我们将要做的是创建一个 docker 卷。
$ docker volume create --name mongo_storage
现在让我们附加我们创建的卷来启动我们的第一个 mongo 容器并设置配置。
$ docker run --name mongoNode1 \
-v mongo_storage:/data \
-d mongo \
--smallfiles
接下来我们需要创建密钥文件。
密钥文件的内容作为副本集成员的共享密码。对于副本集的所有成员,密钥文件的内容必须相同。
$ openssl rand -base64 741 > mongo-keyfile
$ chmod 600 mongo-keyfile
接下来,让我们创建文件夹,用于保存 mongo_storage 卷中的数据、密钥文件和配置:
$ docker exec mongoNode1 bash -c 'mkdir /data/keyfile /data/admin'
下一步是创建一些管理员用户,让我们创建一个 admin.js 和一个 replica.js 文件,如下所示:
// admin.jsadmin = db.getSiblingDB("admin")// creation of the admin user
admin.createUser(
{
user: "cristian",
pwd: "cristianPassword2017",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)// let's authenticate to create the other user
db.getSiblingDB("admin").auth("cristian", "cristianPassword2017" )// creation of the replica set admin user
db.getSiblingDB("admin").createUser(
{
"user" : "replicaAdmin",
"pwd" : "replicaAdminPassword2017",
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)
//replica.jsrs.initiate({
_id: 'rs1',
members: [{
_id: 0, host: 'manager1:27017'
}]
})
重要
密码应该是随机的、长的和复杂的,以确保系统安全并防止或延迟恶意访问。参见数据库用户角色了解内置角色以及与数据库管理操作相关的完整列表。
我们所做的直到知道:
- 创建了 mongo_storage ,docker 卷。
- 创建了 mongo-keyfile ,openssl 密钥生成。
- 创建了 admin.js 文件,管理 mongoDB 的用户。
- 创建了 replica.js 文件,以初始化副本集。
好了,让我们继续将文件传递到容器中。
$ docker cp admin.js mongoNode1:/data/admin/$ docker cp replica.js mongoNode1:/data/admin/$ docker cp mongo-keyfile mongoNode1:/data/keyfile/
// change folder owner to the user container$ docker exec mongoNode1 bash -c 'chown -R mongodb:mongodb /data'
我们所做的是将需要的文件传递给容器,然后将****/数据文件夹所有者** 更改为容器用户,因为容器用户是需要访问该文件夹和文件的用户。**
现在一切都已经设置好了,我们准备用副本集配置重新启动 mongod 实例。
在我们开始验证 mongo 容器之前,让我们创建一个env
文件来设置我们的用户和密码。
MONGO_USER_ADMIN=cristian
MONGO_PASS_ADMIN=cristianPassword2017MONGO_REPLICA_ADMIN=replicaAdmin
MONGO_PASS_REPLICA=replicaAdminPassword2017
现在我们需要移除容器并开始一个新的。为什么?,因为我们需要提供副本集和身份验证参数,为此我们需要运行以下命令:
// first let's remove our container$ docker rm -f mongoNode1// now lets start our container with authentication $ docker run --name mongoNode1 --hostname mongoNode1 \
-v mongo_storage:/data \
--env-file env \
--add-host manager1:192.168.99.100 \
--add-host worker1:192.168.99.101 \
--add-host worker2:192.168.99.102 \
-p 27017:27017 \
-d mongo --smallfiles \
--keyFile /data/keyfile/mongo-keyfile \
--replSet 'rs1' \
--storageEngine wiredTiger \
--port 27017
这是怎么回事…🤔这似乎是对旗帜的滥用。
让我分两部分向你解释:
码头标志:
--env-file
读取一个 env 文件并在容器中设置environment
变量。--add-host
标志将条目添加到 docker 容器的/etc/hosts
文件中,这样我们就可以使用主机名而不是 IP 地址。这里,我们正在映射我们之前创建的 3 台 docker-machine。
要更深入地理解 docker 运行命令、请阅读 docker 的文档。
蒙哥旗帜:
为了设置 mongo 副本集,我们需要各种 mongo 标志
--keyFile
这个标志是用来告诉 mongo】在哪里--replSet
该标志用于设置副本集的名称。--storageEngine
该标志用于设置 mongoDB 的引擎,不是必需的,因为 mongoDB 3.4.1 的默认引擎是 wiredTiger。
为了更深入地了解 mongo 副本集,阅读 MongoDB 文档,我也推荐mongou 大学的课程来学习关于这个主题的更多内容。
mongoNode1 容器的最后一步是启动副本集,我们将通过运行以下命令来完成这一步:
$ docker exec mongoNode1 bash -c 'mongo < /data/admin/replica.js'
您应该会看到类似这样的内容:
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
{ "ok" : 1 }
bye
现在,让我们使用以下命令创建管理员用户:
$ docker exec mongoNode1 bash -c 'mongo < /data/admin/admin.js'
您应该会看到类似这样的内容:
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
admin
Successfully added user: {
"user" : "cristian",
...
Successfully added user: {
"user" : "replicaAdmin",
...
bye
现在,要进入复制副本,请运行以下命令:
$ docker exec -it mongoNode1 bash -c 'mongo -u $MONGO_REPLICA_ADMIN -p $MONGO_PASS_REPLICA --eval "rs.status()" --authenticationDatabase "admin"'
你应该准备好看到这样的东西:
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
{
"set" : "rs1",
...
"members" : [
{
"_id" : 0,
"name" : "manager1:27017",
...
"ok" : 1
}
#步骤 3——再添加 2 个 mongo 节点容器
现在一切都准备好了,让我们再启动两个节点,并将它们加入副本集。
要添加第一个节点,让我们切换到 worker1 docker 机器,如果您使用的是本地计算机,请运行以下命令:
eval `docker-machine env worker1`
如果你没有在本地运行,只要把你的终端指向下一个服务器。
现在,因为我们要重复我们为 mongoNode1 所做的几乎所有步骤,所以让我们编写一个脚本来运行我们所有的命令。
让我们创建一个名为 create-replica-set.sh 的文件,看看如何组成 main 函数:
function main {
init_mongo_primary
init_mongo_secondaries
add_replicas manager1 mongoNode1
check_status manager1 mongoNode1
}main
现在让我向您展示这个函数是如何组成:
初始化 MONGO 主函数
function init_mongo_primary {
# [@params](http://twitter.com/params) name-of-keyfile
createKeyFile mongo-keyfile
# [@params](http://twitter.com/params) server container volume
createMongoDBNode manager1 mongoNode1 mongo_storage
# [@params](http://twitter.com/params) container
init_replica_set mongoNode1
}
这个函数内部也有函数调用,没有新的功能,我们之前已经看到了所有的功能,让我来描述一下它的功能:
- 为副本集验证创建密钥文件。****
- 创建一个 mongodb 容器,并接收 2 个参数:a)将要定位的服务器,b)容器的名称,docker 卷的名称,所有这些功能我们以前都见过。
- 最后,它将以与我们之前完全相同的步骤启动复制副本。
初始化 MONGO 辅助功能
function init_mongo_secondaries {
# [@Params](http://twitter.com/Params) server container volume
createMongoDBNode worker1 mongoNode1 mongo_storage
createMongoDBNode worker2 mongoNode2 mongo_storage
}
这个函数的作用是为副本集创建另外两个 mongo 容器,并执行与 mongoNode1 相同的步骤,但这里我们不包括副本集实例化和管理员用户创建,因为这些都不是必需的,因为副本集将与副本集的所有节点共享数据库配置,稍后它们将被添加到主数据库。
添加副本功能
# [@params](http://twitter.com/params) server container
function add_replicas {
echo '·· adding replicas >>>> '$1' ··' switchToServer $1
for server in worker1 worker2
do
rs="rs.add('$server:27017')"
add='mongo --eval "'$rs'" -u $MONGO_REPLICA_ADMIN
-p $MONGO_PASS_REPLICA --authenticationDatabase="admin"'
sleep 2
wait_for_databases $server
docker exec -i $2 bash -c "$add"
done
}
在这里,我们正在做的是,最后将另外 2 个 mongo 容器添加到副本集配置上的主数据库中,首先,我们循环通过剩余的机器来添加容器,在循环中,我们准备配置,然后我们检查容器是否准备好,我们通过调用函数wait_for_databases
来完成,我们将机器作为参数传递给 check,然后我们在主数据库中执行配置,我们应该看到这样的消息:
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
{ "ok" : 1 }
这意味着 mongo 容器被成功地添加到了副本中。
最后,我们用 main 中的最后一个函数检查副本集的状态:
# [@params](http://twitter.com/params) server container
function check_status {
switchToServer $1
cmd='mongo -u $MONGO_REPLICA_ADMIN -p $MONGO_PASS_REPLICA
--eval "rs.status()" --authenticationDatabase "admin"'
docker exec -i $2 bash -c "$cmd"
}
既然我们已经看到了我们的自动化脚本的功能,并且我们知道将要这样做,那么是时候执行自动化 bash 脚本了,如下所示:
注意如果你已经完成了上面的所有步骤,你需要重置我们已经实现的所有东西,以避免任何冲突名称问题,重置配置在 github 存储库中有一个 reset.sh 文件
# and this how we can execute the script that will configure
# everything for us.**$ bash < create-replica-set.sh**
如果一切设置正确,我们应该会看到来自 mongodb 的如下消息:
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
{
"set" : "rs1",
...
},
"members" : [
{
"_id" : 0,
"name" : "manager1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
...
},
{
"_id" : 1,
"name" : "worker1:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
...
},
{
"_id" : 2,
"name" : "worker2:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
...
}
],
"ok" : 1
}
正如您所看到的,每个容器现在都配置良好,需要注意的是,我们像以前一样使用 docker 中的--add-host
标志,这将这些条目添加到 Docker 容器的/etc/hosts 文件中,因此我们可以使用主机名而不是 IP 地址。
两个节点从 mongoNode1 完成同步可能需要一分钟时间。
您可以通过查看日志来查看每个 mongo Docker 容器中发生了什么。您可以通过在任何 docker-machine 服务器上运行该命令来实现这一点。
$ docker logs -ft mongoContainerName
现在我们已经有了一个 MongoDB 副本集服务,让我们修改我们的用户,或者您可以创建另一个用户,并授予一些权限来对数据库进行 crud 操作,因此,仅出于说明的目的,这是一个不好的做法,让我为我们的 admin 用户添加一个超级角色。
# we are going to assign the root role to our admin user**# we enter to the container**
$ docker exec -it mongoNode1 bash -c 'mongo -u $MONGO_USER_ADMIN -p $MONGO_PASS_ADMIN --authenticationDatabase "admin"'**# Then we execute the following in the mongo shell**
# Mongo 3.4.1 shell
> use admin
> db.grantRolesToUser( "cristian", [ "root" , { role: "root", db: "admin" } ] )
>
现在他有了一个可以做任何东西的超级用户,所以让我们创建一个数据库并插入一些数据。
$ docker exec -it mongoNode1 bash -c 'mongo -u $MONGO_USER_ADMIN -p $MONGO_PASS_ADMIN --authenticationDatabase "admin"'# Mongo 3.4.1 shell
> use movies
> db.movies.insertMany([{
id: '1',
title: 'Assasins Creed',
runtime: 115,
format: 'IMAX',
plot: 'Lorem ipsum dolor sit amet',
releaseYear: 2017,
releaseMonth: 1,
releaseDay: 6
}, {
id: '2',
title: 'Aliados',
runtime: 124,
format: 'IMAX',
plot: 'Lorem ipsum dolor sit amet',
releaseYear: 2017,
releaseMonth: 1,
releaseDay: 13
}, {
id: '3',
title: 'xXx: Reactivado',
runtime: 107,
format: 'IMAX',
plot: 'Lorem ipsum dolor sit amet',
releaseYear: 2017,
releaseMonth: 1,
releaseDay: 20
}, {
id: '4',
title: 'Resident Evil: Capitulo Final',
runtime: 107,
format: 'IMAX',
plot: 'Lorem ipsum dolor sit amet',
releaseYear: 2017,
releaseMonth: 1,
releaseDay: 27
}, {
id: '5',
title: 'Moana: Un Mar de Aventuras',
runtime: 114,
format: 'IMAX',
plot: 'Lorem ipsum dolor sit amet',
releaseYear: 2016,
releaseMonth: 12,
releaseDay: 2
}])# inserted 5 documents
>
现在我们有了一个电影数据库,其中的电影集合包含 5 部电影:d。
#是时候回顾一下了
我们所做的…
我们使用带有自动化脚本的 Docker、配置并启动带有认证的 MongoDB 副本集。
在安全性方面,我们创建了:
- 2 类用户,即管理数据库和集群管理数据库。****
- 我们创建一个密钥文件**,并在启用**身份验证的情况下启动副本。****
如果为数据库正确配置了访问控制,攻击者应该无法访问您的数据。查看我们的安全清单以帮助发现潜在的弱点。— @MongoDB Docs
如果我们想给我们的架构增加更多的安全性,我们可以用我们的 docker-machines 创建一个 Swarm 集群、,docker swarm 可以很好地处理网络通信,我们还可以在我们的容器中创建非根用户,我们可以在 mongoDB 中启用加密数据,但是这个主题不在本文的讨论范围之内。
#结论
现在我们有了一个工作的 MongoDB 副本集。您可以随时向该副本集添加节点。您甚至可以停止一个 mongo 容器或主 mongoNode1,并观察另一个 mongoNode 作为新的主 mongoNode。由于数据写入 docker 卷中,重启这些节点不成问题。数据将继续存在并完好无损地重新加入副本集。
对我们来说,一个好处是我们看到了如何用 bash 文件来自动化整个过程。
您面临的一个挑战是修改 bash 脚本并使其更加动态,因为该脚本非常依赖于本文规范,另一个挑战是向架构添加一个任意的 Mongo 节点。****
Github 知识库
要获得文章的完整脚本文件,您可以在下面的 repo 中查看。
**** [## GitHub-Crizstian/mongo-Replica-with-docker:如何使用 Docker 部署 MongoDB 副本集
如何使用 docker 部署一个 MongoDB 副本集
github.com](https://github.com/Crizstian/mongo-replica-with-docker)
进一步阅读
- 部署带有密钥文件访问控制的副本集 — MongoDB Docs。
- 向副本集添加成员 — MongoDB Docs。
- MongoDB Docker Hub—Docker Docs。
- 如何避免勒索您数据的恶意攻击
- 如何在 ubuntu 16.04 上设置安全的 mongoDB 3.4 服务器****
我希望你喜欢这篇文章,我目前仍在探索 MongoDB 世界,所以我愿意接受反馈或贡献,如果你喜欢它,推荐给朋友,分享或再次阅读。
你可以在推特@ crami rez _ 92【https://twitter.com/cramirez_92】T3
关注我
直到下次😁👨🏼🎨👨🏻💻
如何将 Jupyter 笔记本部署为 Kubeflow ML 管道的组件(第 2 部分)
在 Kubernetes 集群上运行 Jupyter 笔记本的简单方法
在第 1 部分中,我向您展示了如何使用 Docker 组件创建和部署 Kubeflow ML 管道。在第 2 部分中,我将向您展示如何让 Jupyter 笔记本成为 Kubeflow ML 管道的一个组件。Docker 组件是为操作机器学习模型的人准备的,能够在任意硬件上运行 Jupyter 笔记本更适合数据科学家。
In this article, I show you an easy way to run your Jupyter notebook as a container in Kubernetes. (Photo by Cameron Venti on Unsplash)
我将假设您已经有了一个 Kubeflow 管道集群,并按照上一篇文章中的解释运行。通常,“ML 平台团队”(IT 部门的一部分)将管理供数据科学家团队使用的集群。
第一步。启动 JupyterHub
注意:当我写这篇文章时,您必须在集群本身上运行笔记本。不过,现在更好的方法是使用人工智能平台笔记本,并远程向集群提交代码。遵循本自述文件中的说明,确保启动 TensorFlow 1.10 笔记本电脑虚拟机。跳过这一步,从第 2 步开始。
从 Kubeflow pipelines 用户界面(http://localhost:8085/pipeline,如果您遵循了上一篇文章中的说明),单击笔记本的链接:
Click on the notebooks link from Kubeflow pipelines to start JupyterHub on the cluster and start working with notebooks
如果这是第一次,这将提示您启动 JupyterHub。使用您的 GCP 用户名/密码登录。然后,选择所需的 Tensorflow 版本:
Choose the version of TensorFlow
我在一个 cpu 上选择了 TensorFlow v1.10。
第二步。克隆 git repo
然后,打开一个终端窗口,git 克隆我的 repo:
git clone https://github.com/GoogleCloudPlatform/data-science-on-gcp
切换回 Jupyter 笔记本列表,导航到 data-science-on-GCP/updates/cloud ml,打开 flights_model.ipynb 。
第三步。用张量流预测航班延误
实际的 TensorFlow 代码(参见这里的完整笔记本: flights_model.ipynb )并不重要,但是我希望您注意一些事情。一个是,我开发这款笔记本电脑时,大部分时间都是在急切模式下进行的,以便于调试:
if EAGER_MODE:
dataset = load_dataset(TRAIN_DATA_PATTERN)
for n, data in enumerate(dataset):
numpy_data = {k: v.numpy() for k, v in data.items()} # .numpy() works only in eager mode
print(numpy_data)
if n>3: break
然后,我对模型进行了几个步骤的训练,并指定了更多的步骤(如果“不在开发模式中”:
num_steps = 10 if DEVELOP_MODE else (1000000 // train_batch_size)
最后,我将其作为 web 服务部署到 Cloud ML Engine:
gcloud ml-engine versions create ${MODEL_VERSION} --model ${MODEL_NAME} --origin ${MODEL_LOCATION} --runtime-version 1.10
并确保我可以将 JSON 发送到已部署的模型:
{"dep_delay": 14.0, "taxiout": 13.0, "distance": 319.0, "avg_dep_delay": 25.863039, "avg_arr_delay": 27.0, "carrier": "WN", "dep_lat": 32.84722, "dep_lon": -96.85167, "arr_lat": 31.9425, "arr_lon": -102.20194, "origin": "DAL", "dest": "MAF"}
{"dep_delay": -9.0, "taxiout": 21.0, "distance": 301.0, "avg_dep_delay": 41.050808, "avg_arr_delay": -7.0, "carrier": "EV", "dep_lat": 29.984444, "dep_lon": -95.34139, "arr_lat": 27.544167, "arr_lon": -99.46167, "origin": "IAH", "dest": "LRD"}
为了返回,对于每个实例,航班将晚点的概率。
第四步。将笔记本电脑部署为组件
所以,我有一个完全成熟的笔记本电脑,可以完成一些 ML 工作流程。我能把它作为 Kubeflow 管道的一部分来执行吗?回想一下 第 1 部分 中的内容,一个组件所需要的只是一个自包含的容器,它接受几个参数并将输出写到文件中,或者在 Kubeflow 集群上,或者在云存储上。
为了将 flights_model 笔记本部署为一个组件:
- 我的笔记本顶部有一个单元格,它的标签是“参数”。在这个单元格中,我定义了我想要用来重新执行笔记本的任何变量。特别是,我设置了一个名为 DEVELOP_MODE 的变量。在开发模式下,我将读取小数据集;在非开发模式下,我将在完整数据集上进行训练。因为我希望您能够轻松地更改它们,所以我还将 PROJECT(要计费)和 BUCKET(要存储输出)作为参数。
- 然后,我构建一个能够执行我的笔记本的 Docker 映像。为了执行一个笔记本,我将使用 Python 包 papermill。我的笔记本用的是 Python3,gcloud,tensorflow。所以我的 docker 文件捕获了docker 文件中的所有依赖项
FROM **google/cloud**-sdk:latestRUN apt-get update -y && apt-get install --no-install-recommends -y -q ca-certificates **python3-dev** python3-setuptools python3-pipRUN python3 -m pip install **tensorflow==1.10 jupyter papermill**COPY run_notebook.sh ./ENTRYPOINT ["bash", "./run_notebook.sh"]
- Docker 映像的入口点是 run_notebook.sh ,它使用 papermill 来执行笔记本:
gsutil cp $IN_NB_GCS input.ipynb
gsutil cp $PARAMS_GCS params.yaml
**papermill input.ipynb output.ipynb -f params.yaml --log-output**
gsutil cp output.ipynb $OUT_NB_GCS
- 实际上,该脚本将要运行的笔记本从 Google 云存储复制到 Kubeflow pod,用 papermill 运行笔记本,并将结果输出复制回 Google 云存储。
- 但是 params.yaml?params.yaml 是什么?这些是笔记本电脑的可配置参数。例如,它可以是:
---
BUCKET: cloud-training-demos-ml
PROJECT: cloud-training-demos
DEVELOP_MODE: False
- 就是这样!当这个 Docker 映像运行时,它将执行提供的笔记本并复制输出笔记本(标绘了图形,训练了模型等)。)到 GCS。
第五步。作为管道的一部分启动笔记本组件
将笔记本作为管道中的一个步骤来运行的意义在于,它可以在其他管道中进行编排和重用。但是,为了向您展示如何做到这一点,您应该这样创建一个仅执行该笔记本的管道:
import kfp.components as comp
import kfp.dsl as dsl# a single-op pipeline that runs the flights pipeline on the pod
[@dsl](http://twitter.com/dsl).pipeline(
name='FlightsPipeline',
description='Trains, deploys flights model'
)
def flights_pipeline(
inputnb=dsl.PipelineParam('inputnb'),
outputnb=dsl.PipelineParam('outputnb'),
params=dsl.PipelineParam('params')
):
notebookop = dsl.ContainerOp(
name='flightsmodel',
image='gcr.io/cloud-training-demos/**submitnotebook**:latest',
arguments=[
**inputnb,
outputnb,
params**
]
)
没什么特别的——我正在创建一个容器,告诉它使用我的图像,它有 TensorFlow、papermill 等。并给它输入和输出笔记本和参数。随着管道的运行,日志流传输到管道日志,并将显示在 Stackdriver 中:
As the pipeline executes, the notebook cells’ outputs get streamed to Stackdriver
在我的 GitHub repo 中,创建和部署管道显示在 launcher.ipynb 中。
尝试一下
如果您还没有这样做,请阅读并浏览如何使用 Docker 映像 创建和部署 Kubeflow ML 管道的第 1 部分 。
尝试这篇关于如何在 Kubeflow 管道中部署 Jupyter 笔记本作为组件的文章:
- 按照第 1 部分中的说明启动一个集群
- 在集群上,打开 flights_model.ipynb ,将项目和 BUCKET 更改为您自己的东西,并运行笔记本,确保它可以工作。
- 打开 launcher.ipynb 并完成运行 flights_model.ipynb 和作为 Kubeflow 管道组件的步骤。
启动器笔记本还包括在深度学习虚拟机上启动 flights_model 笔记本的能力,但现在忽略它——我将在本系列的第 3 部分中介绍它。
笔记本可以是可组合性和可重用性的一个单元——但是为了实现这一点,你必须小心编写小的、单一用途的笔记本。我在这篇文章中所做的——一个巨大的单片笔记本——并不是一个好主意。权衡的结果是,如果您使用较小的笔记本,依赖性跟踪会变得困难。
什么时候用什么
- 如果你是一个小团队,并且没有人为你维护像 Kubeflow clusters 这样的 ML 基础设施,那么使用深度学习 VM 进行开发和自动化。我将在本系列的第 3 部分中讨论这个问题。
- 如果您在一个大型组织中工作,其中有一个独立的 ML 平台团队管理您的 ML 基础设施(即 Kubeflow 集群),本文(第 2 部分)将向您展示如何在 Jupyter 笔记本中开发并部署到 Kubeflow 管道。(如果您向 IT 团队展示这篇文章,他们可能会帮助您完成 Docker 部分)。
- 虽然笔记本会帮助你变得敏捷,但是你也会积累大量的技术债务。单体笔记本很难重用,单一用途的笔记本很难跟踪依赖性。第二,即使你的日志会转到 GCP 的日志平台(Stackdriver),它们也可能是非结构化的单元输出。这使得很难监控管道和对故障做出反应。因此,计划将成熟的代码和模型从笔记本转移到单独的管道组件中,每个组件都是一个容器。这是我在 第一部 里给你看的。
换句话说,对小团队使用深度学习 VM,对实验工作使用 Jupyter 组件,对成熟模型使用容器操作
如何用 TensorFlow 部署机器学习模型?第 1 部分—准备好您的模型以供使用。
在完成 Udacity 的深度学习基础课程后,我有一个大问题——我如何部署训练好的模型并对新的数据样本进行预测?幸运的是,TensorFlow 是为生产开发的,它为模型部署提供了解决方案— TensorFlow 服务。基本上,有三个步骤——导出你的服务模型,用你的模型创建一个 Docker 容器,并用 Kubernetes 将其部署到云平台,即谷歌云或亚马逊 AWS。在本文中,我主要关注第一部分——导出服务模型。
动机和工具
在 Udacity 的课程中,我总是问自己——我有我的模型,我可以在 Jupyter 笔记本上运行它并看到结果,但我能用它做什么呢?其他人如何使用它?
作为一名软件工程师,我对管道感兴趣:创建模型->在本地测试它->创建 web 服务来服务客户端请求->创建包含我的 web 服务的部署容器->测试容器->将其投入生产。我的问题的答案是:
- 用于模型创建的 TensorFlow
- 集装箱码头工人
- 为模型托管服务的 TensorFlow
- 用于生产部署的 Kubernetes
张量流
TensorFlow 是一个开源库,用于开发机器学习,尤其是深度学习模型。它是由 Google 创建和支持的,不仅面向学术界,也面向产品开发。
码头工人
Docker 是一个非常流行的容器化引擎,它提供了一种便捷的方式来将所有依赖项打包在一起,以便部署在本地或云中。文档非常全面,我鼓励你查看它的细节。
张量流服务
TensorFlow Serving,顾名思义,托管模型并提供对它的远程访问。TensorFlow Serving 有关于其架构的良好文档和有用的教程。不幸的是,他们使用准备好的例子,并得到一点解释,你需要做什么来为你自己的模型服务。
库伯内特斯
Kubernetes 是一个开源软件,也是由谷歌开发的,它提供容器编排,允许你自动水平扩展、服务发现、负载平衡等等。简而言之,它自动化了云中 web 服务的管理。
目的
作为一个例子,我采用了一个用于半监督学习的 GAN 模型,它在 Udacity 深度学习基础课程中讲授。我的意图是:
- 在街景门牌号数据集上训练 GAN 模型进行半监督学习
- 使用 GAN 鉴别器进行门牌号预测。作为输出,我希望有 10 个分数,对应于从 0 到 9 的数字。
- 让 TensorFlow 在 Docker 容器中为我的模型提供服务
- 创建一个客户端来请求数字图像的分数
- 将模型部署到云中
模型准备
基于 Jupyter 笔记本,我将功能放入独立的 Python 文件中,测试保存的模型,实现模型导出和服务请求的客户端。一般来说,基本代码保持不变。你可以在我的 GitHub 库中找到实现细节。
主要步骤是:
对于使用 TensorFlow 创建深度学习模型的任何人来说,前两步都非常容易,我不想在这里详细介绍。但是最后两步对我来说很新,我花了一些时间来理解它是如何工作的以及需要什么。
TensorFlow 服务。这是什么?
TensorFlow Serving 实现了一个运行机器学习模型的服务器,并提供对它们的远程访问。常见的任务是对提供的数据(例如图像)进行预测和分类。
几个技术亮点:
- 服务器实现了一个 gRPC 接口,所以您不能从浏览器发出请求。相反,我们需要创建一个客户机,它可以通过 gRPC 进行通信
- TensorFlow Serving 已经提供了对存储为 Protobuf 的模型的操作
- 您可以创建自己的实现来处理以其他格式存储的模型
我没有创建自己的实现,所以我需要将我的模型导出到 Protobuf 中。
原蟾蜍
协议缓冲区(或 Protobuf)允许高效的数据序列化。它是一个开源软件,是由谷歌开发的
将模型导出到 Protobuf 中
TensorFlow Serving 提供了 SavedModelBuild 类将模型保存为 Protobuf。这里描述的还不错。
我的 GAN 模型接受形状为*【batch _ num,width,height,channels】*的图像张量,其中批次数量为 1(您一次只能预测一个图像),宽度和高度为 32 像素,图像通道数量为 3。输入图像必须缩放,以使每个像素在[-1,1]的范围内,而不是在[0,255]的范围内。
另一方面,被服务的模型必须接受 JPEG 图像作为输入,因此为了服务,我需要注入层来将 JPEG 转换成所需的图像张量。
首先,我实现了图像转换。对我来说有点棘手。
serialized_tf_example = tf.placeholder(
tf.string, name=’input_image’) feature_configs = { ‘image/encoded’: tf.FixedLenFeature(
shape=[],
dtype=tf.string), } tf_example = tf.parse_example(serialized_tf_example, feature_configs) jpegs = tf_example[‘image/encoded’] images = tf.map_fn(preprocess_image, jpegs, dtype=tf.float32) images = tf.squeeze(images, [0])
# now the image shape is (1, ?, ?, 3)
基本上,您需要一个序列化传入图像的占位符、一个特性配置(字典名称到特性)和特性类型,其中您列出了预期的输入(在我的例子中是 JPEG 的图像/编码的)。然后解析序列化的示例并从中提取 JPEG。最后一步是将 JPEG 转换成所需的图像张量。实现细节见 myGitHub(预处理 _ 图像方法)。
然后,我可以使用该图像张量作为我的 GAN 模型的输入,创建一个会话对象并加载保存的检查点。
......
net = GAN(images, z_size, learning_rate, drop_rate=0.)
......saver = tf.train.Saver() with tf.Session() as sess:
# Restore the model from last checkpoints
ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
saver.restore(sess, ckpt.model_checkpoint_path)
......
对我来说,下一个挑战是理解如何用提供的 SavedModelBuilder 将恢复的模型转换成 Protobuf。
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
你必须创建一个所谓的带有输入、输出和方法名的签名(例如分类或预测)。TensorFlow 提供了一个方法TF . saved _ model . utils . build _ tensor _ info来创建张量信息。我用它来定义输入和输出(在我的例子中是分数)。
predict_tensor_inputs_info = \
tf.saved_model.utils.build_tensor_info(jpegs) predict_tensor_scores_info = \
tf.saved_model.utils.build_tensor_info(net.discriminator_out)
现在我准备好创建签名了。
prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={‘images’: predict_tensor_inputs_info},
outputs={‘scores’: predict_tensor_scores_info},
method_name=\
tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
*【图像】和【分数】*是预定义的名称,您必须在输入和输出词典中使用它们。
在教程中,TensorFlow 团队创建了两个签名——一个用于分类,一个用于预测。我不想要任何分类结果,所以预测签名对我来说就足够了。
最后一步—保存模型。
legacy_init_op = tf.group(tf.tables_initializer(),
name=’legacy_init_op’) builder.add_meta_graph_and_variables(
sess,
[tf.saved_model.tag_constants.SERVING],
signature_def_map={ ‘predict_images’: prediction_signature },
legacy_init_op=legacy_init_op) builder.save()
这非常简单,现在您已经将模型存储为 Protobuf。导出文件夹的结构应该类似于:
- variables 文件夹,带有variables . data-XXX-of-yyy和 variables.index
- saved_model.pb 文件
第一部分工作已经完成——模型被成功导出为 Protobuf。
把它们放在一起
环境
我在以下环境中进行了开发和测试:
- 基于 GPU 的电脑(英伟达 GeForce GTX 1060 6 GB)
- Ubuntu 16.04
- 蟒蛇
- Python 3.5
- 张量流 1.8
你自己试试
下面是您自己尝试时需要执行的步骤。
- 克隆源
cd ~git clone [https://github.com/Vetal1977/tf_serving_example.git](https://github.com/Vetal1977/tf_serving_example.git)cd tf_serving_example
- 训练模型
python svnh_semi_supervised_model_train.py
下载列车和测试街景门牌号码数据集和另一个 ca 大约需要 5-10 分钟。20 分钟训练模型(在我的环境下)。
- 检查您是否保存了模型
ls ./checkpoints
您应该会看到数据、索引和元数据文件。
- 将模型导出到 Protobuf,由 TensorFlow 提供服务
python svnh_semi_supervised_model_saved.py --checkpoint-dir=./checkpoints --output_dir=./gan-export --model-version=1
应该打印出以下内容
Successfully exported GAN model version '1' into './gan-export'
如果你打字
ls ./gan-export/1
你应该得到变量文件夹和 saved_model.pb 文件。
而不是结论
可能这听起来很简单,但我需要几个小时来理解 TensorFlow 如何为模型服务。我有什么输入和输出。我如何注册他们让 TensorFlow 知道,什么和如何服务。
在下一部分中,我将创建一个 Docker 容器,将我的模型放入其中,并创建一个客户端来发出请求。
如何用 TensorFlow 部署机器学习模型?第 2 部分—容器化!
如第 1 部分所述,我想将我的深度学习模型部署到生产中。我已经展示了如何为 TensorFlow 服务准备模型。我们将 GAN 模型作为 Protobuf 导出,现在它已经可以托管了。
可部署人工制品的步骤
TensorFlow 服务实现了一个处理传入请求并将其转发给模型的服务器。这个服务器可能运行在某个地方,很可能是在你的云提供商(比如 Amazon AWS,Google Cloud Platform,Microsoft Azure)那里,对全世界开放。
如今,将这样的服务器及其所有依赖项打包到一个包中,并作为一个整体进行配置和部署是很常见的。
为此,您可以创建一个虚拟机映像,但是它非常笨重,我不建议将其用于服务部署。(尽管预配置的虚拟机对于为开发人员提供工作环境非常有用)。
通常我们使用容器来创建可部署的工件。然后我们可以在任何地方部署它们——本地、内部网、云中。这样的容器将包括您的服务及其所有依赖项。你只需要在操作系统上安装一个运行你的容器的薄层。
最流行的容器平台是 Docker 。我们需要创建一个 Docker 映像,在该映像上创建一个容器并运行它。首先—在我们的本地操作系统中。
与我们的情况相对应——我们应该测试容器是否运行,TensorFlow 提供的服务器是否成功启动,接受对我们模型的请求并对它们做出响应。
在本地获取码头工人
在本地,我们应该安装 Docker 来运行我们的容器。我参考官方文档,因为我无法更好地描述安装程序。
提示:如果你在 Ubuntu 下,很可能你必须对每个 Docker 命令使用 sudo 。我强烈建议采取以下措施来避免这种情况:
- 如果 docker 组不存在,添加该组
- 将连接的用户 $USER 添加到 docker 组
sudo groupadd docker
sudo usermod -aG docker $USER
- 重启你的电脑
现在你应该可以不用 T21 就能执行 Docker 命令了。例如
docker version
应该显示系统和版本信息,而没有任何关于缺少权限的错误。
为 TensorFlow 服务创建 Docker 映像并运行容器
TensorFlow 服务提供 Docker 映像,因此我们可以克隆存储库并使用它们。
获取 TensorFlow 服务
这非常简单——只需克隆存储库:
cd ~git clone https://github.com/tensorflow/serving.git
构建 Docker 映像并运行容器
Docker 映像的配置是通过 Docker 文件定义的。TensorFlow 服务提供了其中的两种—一种用于 CPU 构建,一种用于 GPU 构建。两者都可以在serving/tensor flow _ serving/tools/docker下找到:
- 用于 CPU 构建的 Dockerfile.devel
- 用于 gpu 构建的 Dockerfile.devel-gpu
英伟达 Docker
如果你的机器上有 NVidia GPU 并安装了 CUDA 和 cuDNN 库,我强烈建议创建一个支持 GPU 的 Docker 容器。之前要安装 nvidia-docker 才能正常工作。这里的简单明了,描述得很好。在我的例子中,我使用了以下命令序列:
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -distribution=$(. /etc/os-release;echo $ID$VERSION_ID)curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.listsudo apt-get update
sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd
提示:由于我使用了 GPU Dockerfile,所以在接下来的步骤中我会参考它。使用 CPU Dockerfile,您可以以同样的方式工作。唯一的区别是,你不需要通过运行容器 nvidia-docker 和 runtime=nvidia 标志。
让我们创建我们的 Docker 图像:
cd serving
docker build --pull -t $USER/tensorflow-serving-devel-gpu -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu .
下载依赖项和构建映像大约需要一个小时或更长时间…现在我们可以运行 Docker 容器:
docker run --runtime=nvidia --name=tf_container_gpu -it $USER/tensorflow-serving-devel-gpu
如果一切正常,恭喜你!您现在位于 TensorFlow 服务 Docker 容器的外壳中。
提示:当您用退出命令离开集装箱外壳时,集装箱停止。要再次启动它,请执行:
docker start -i tf_container_gpu
不要移除容器!否则,您所做的更改将会消失。另外,请注意,我们在这里不需要 runtime=nvidia 参数。
Docker 容器中包含所有必要的组件,如 Python、Bazel 等。已安装,TensorFlow 服务器已准备就绪。如果我们执行
tensorflow_model_server
在 Shell 内部运行 Docker 容器,我们应该看到使用信息。
部署模型
首先,让我们创建一个工作目录。在运行容器的外壳中执行:
mkdir serving
接下来,我们将导出的模型(参见第 1 部分)复制到 TensorFlow 容器中。从您的 PC 上的 Shell:
cd <path to GAN project>
docker cp ./gan-export tf_container_gpu:/serving
您应该将导出的模型文件夹放在容器中。从它的外壳来看:
cd /serving
ls ./gan-export/1
你应该看到变量文件夹和 saved_model.pb 文件。
开始上菜
万岁!我们已经准备好通过 TensorFlow 托管我们的模型:-)
tensorflow_model_server --port=9000 --model_name=gan --model_base_path=/serving/gan-export &> gan_log &
如果你检查日志…
cat gan_log
…您应该在最后一个字符串中看到类似这样的内容:
I tensorflow_serving/model_servers/main.cc:298] Running ModelServer at 0.0.0.0:9000 …
断点
我们走了很多步,但都很简单明了。他们需要大量的时间,因为要从源代码下载和构建。
所以我们在 Docker 容器中开始我们的模型,它在本地运行。但是我们可以保存容器和我们的更改,并在以后部署它,例如,部署到云中。在此之前,我们希望确保我们的模型接受请求和对请求的响应。我们的模型需要一个客户!
创建客户端
TensorFlow 服务基于 gRPC 协议,因此您确实需要创建一个能够通过它进行“对话”的客户端。在教程中,他们使用了一个构建在 Docker 容器中的示例客户端。但是我想要一个在我的 PC 上运行的客户端,它可以向 TensorFlow 容器中托管的模型发出请求。
**提示:**我们在 PC 上执行的所有后续步骤(不在 Docker 容器中!).请记住,我们已经克隆了 TensorFlow 服务存储库。
其他 Python 库
首先,我们需要 Python 环境中的 gRPC 库。我从 PyPI 安装了它们:
pip install grpcio grpcio-tools
张量流预测服务
对于我们的客户,我们需要 TensorFlow 服务 API。问题— API 是以 Protobuf 的形式提供的(可以在*serving/tensor flow _ serving/APIs)*下找到)。如果我们想在客户机中使用它们,我们需要从这些 Protobuf 中生成 Python 文件。我这样做了,并将生成的文件放入我的存储库。如果你愿意,你可以自己做(虽然有点棘手):
# 1
cd <tensorflow serving source folder># 2
git clone [https://github.com/tensorflow/tensorflow.git](https://github.com/tensorflow/tensorflow.git)# 3
python -m grpc.tools.protoc ./tensorflow_serving/apis/*.proto --python_out=<path to GAN project> --grpc_python_out=<path to GAN project> --proto_path=.
步骤的简短说明:
- 更改到包含 TensorFlow 服务源的文件夹
- TensorFlow Serving 使用核心框架 Protobuf 的(Serving/tensor flow/tensor flow/core/framework)。获得它们最简单的方法是从 Git 存储库中克隆 TensorFlow 框架
- 这里我们从 Protobuf 为我们的客户生成 Python 文件
客户
我已经实现了客户端,这比上面所有准备工作都要简单:-)这里您只需使用 gRPC 和 TensorFlow 服务 API 来发出请求。最有趣的部分是:
# Send request
with open(FLAGS.image, ‘rb’) as f:
# 1
data = f.read() # 2
request = predict_pb2.PredictRequest() # 3
request.model_spec.name = 'gan'
request.model_spec.signature_name = 'predict_images'
request.inputs['images'].CopyFrom(
tf.contrib.util.make_tensor_proto(
data, shape=[1])) # 4
result = stub.Predict(request, 60.0)
- 打开(JPEG)文件
- 创建预测请求对象
- 初始化对我们的 GAN 模型的预测请求。在这里,我们指定:模型的名称(它必须与我们启动 tensorflow_model_server 时的 model_name 参数相匹配)、签名名称(我们只有 predict_images 和数据(在我们的例子中是 JPEG 图像)
- 服务器上的呼叫预测。
呼叫预测
现在我们可以调用运行在 Docker 容器中的模型。获取容器 IP 地址:
docker network inspect bridge | grep IPv4Address
我的情况是 172.17.0.2。
接下来,我们需要测试图像——我从街景门牌号码测试集中提取了几张图像(以 MATLAB 格式提供),并将它们放在这里处。现在—发出客户端请求:
cd <path to GAN project>
python svnh_semi_supervised_client.py --server=172.17.0.2:9000 --image=./svnh_test_images/image_3.jpg
提示:有时候,Docker 容器的 IP 地址不起作用。在这种情况下,我们可以使用0 . 0 . 0或 localhost 。如果你有问题,试试这些。例如:
python svnh_semi_supervised_client.py --server=localhost:9000 ...
您应该会看到类似这样的内容:
outputs {
key: “scores”
value {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 1
}
dim {
size: 10
}
}
float_val: 8.630897802584857e-17
float_val: 1.219293777054986e-09
float_val: 6.613714575998131e-10
float_val: 1.5203355241411032e-09
**float_val: 0.9999998807907104**
float_val: 9.070973139291283e-12
float_val: 1.5690838628401593e-09
float_val: 9.12262028080068e-17
float_val: 1.0587883991775016e-07
float_val: 1.0302327879685436e-08
}
}
我用粗体标记了最高分,它实际上对应于样本图像中的“4”(数字从 0 到 9) :-)我的 GAN 模型相对简单,精确度约为 68%。
而不是结论
在第二部分中,我们创建了 TensorFlow 服务容器,将 GAN 模型复制到其中,并启动公开我们模型的服务器。为了进行测试,我们创建了 gRPC 客户端,可以在 PC 上本地运行,并向我们的模型发出请求。
在下一部中,我们将把我们的模型公之于众!
如何用 TensorFlow 部署机器学习模型?第 3 部分—进入云!
在第 1 部分和第 2 部分中,我们创建了一个 GAN 模型来预测街景门牌号码,并在 Docker 容器中使用 TensorFlow 本地服务来托管它。现在是将它引入云的时候了!
动机
当您实现一个 web 服务(比如预测服务)并希望其他人使用它时,您可以在云托管提供商处发布它。通常,您不想关心诸如服务的可用性、可伸缩性之类的事情;你想专注于开发你的模型和算法。
如今,你有大量的云平台提供商可供选择。最突出的是亚马逊 AWS、微软 Azure、谷歌云平台、IBM Bluemix。一旦服务被部署到他们的服务器上,他们就提供资源并负责服务的可用性。
第二个重要任务是自动化。您希望自动部署、扩展和管理您的服务。就我个人而言,我希望每次单击鼠标或运行一个简单的脚本就能部署,我希望我的服务在收到更多请求时能自动扩展,我希望在崩溃时无需手动干预就能恢复,等等。这里一个工具 Kubernetes 开始发挥作用。
Kubernetes 是一个开源系统,用于自动化部署、扩展和管理容器化的应用程序。
Kubernetes 是由 Google 开发和支持的。所以你绝对可以依赖它。上面列出的云提供商有内置的 it 支持。因此,我们可以相对容易地将部署设置到云中。
云提供商选择
对于这篇文章,我使用微软 Azure。主要是因为一个原因——他们提供 30 天的试用期和 200 美元的信用额度。
我也看了其他供应商。在 AWS,我没有找到免费获得小型 Kubernetes 集群的可能性。在谷歌你可以免费测试他们的云平台,但是他们用“账户类型=业务”吓到我了(我只是想给自己一个小的测试环境)。IBM Bluemix 不是很直观。
所以我选择了微软 Azure,他们也有很好的用户界面:-)
准备 Docker 图像
在我们进入 Kubernetes 之前,我们需要保存 Docker 容器以及我们所做的所有更改,作为一个图像。首先,我们需要容器 ID:
docker ps --all
您将获得所有 Docker 容器的列表——选择您已经创建的容器。例如:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
**35027f92f2f8** <your user name>/tensorflow-serving-devel "/bin/bash" 4 days ago Exited (0) 4 days ago tf_container_cpu
我用粗体字标出了我们需要的 ID。
提示:由于我不想在云中使用昂贵的 GPU 驱动的虚拟机,我选择了 TensorFlow 服务 CPU Docker 容器。
现在我们可以从容器中创建 Docker 图像:
docker commit **35027f92f2f8** $USER/tensorflow-serving-gan:v1.0
如果你查看图片列表( docker images 命令),你应该会发现一个新创建的图片 <你的用户名> /tensorflow-serving-gan 标签为 v1.0 。图像是近似的。比原来的大 5 倍,因为我们下载并制作了很多新东西。
库伯内特。重要概念简介
我鼓励你查看 Kubernetes 的文档,了解它的功能、概念和教程。在这里,我只是给了一个非常粗略的想法,如何与它合作。
我们将 Docker 映像部署到 Kubernetes 集群中。Kubernetes 集群至少由一个主节点和一个或多个工作节点组成。
结节
节点是 Kubernetes 集群中的一个工作机(虚拟机或裸机)。它由主组件管理,拥有运行 Pods 的所有服务。这些服务包括,例如,Docker,这对我们很重要。
我们将创建一个主节点和一个工作节点。主节点不运行任何 Pod,它的职责是集群管理。
Pod
Pod 是由一个或多个容器、这些容器的共享存储以及关于如何运行容器的选项组成的组。所以 Pod 是逻辑相关容器的逻辑主机。
在我们的 Pod 中,我们只有一个 Docker 容器,即我们的 TensorFlow GAN 服务。我们将创建两个 pod,尽管它们将在同一个节点上运行。
服务
豆荚是会死的。他们出生和死亡。特别是复制控制器动态地创建和销毁 pod。虽然每个 Pod 都有自己的 IP 地址,但是这些 IP 地址并不可靠。因此,如果我们有需要相互通信的 pod(例如前端到后端),或者我们想要从外部访问一些 pod(在我们的例子中),那么我们就有问题了。
Kubernetes 服务解决。这是一个抽象概念,它定义了一组逻辑单元和访问它们的策略。在我们的例子中,我们将创建一个抽象两个 pod 的服务。
在 Microsoft Azure 上设置 Kubernetes 群集
Microsoft Azure 提供了一种设置和操作 Kubernetes 集群的便捷方式。首先你需要 Azure 账号。
进入 Microsoft Azure
- 在https://azure.microsoft.com/free/获得 Azure 免费试用账户。如果你已经有微软帐号,你可以使用它。
- 微软提供 200 美元的信用额度来启动 Azure。这对我们的目的来说已经足够了。
- 去 Azure 门户,检查你是否有完全访问权限。
- 在你的电脑上本地安装 Azure 命令行界面。在 64 位 Ubuntu 中,您可以从终端完成:
echo "deb [arch=amd64] [https://packages.microsoft.com/repos/azure-cli/](https://packages.microsoft.com/repos/azure-cli/) wheezy main" | \
sudo tee /etc/apt/sources.list.d/azure-cli.listsudo apt-key adv --keyserver packages.microsoft.com --recv-keys 417A0893sudo apt-get install apt-transport-httpssudo apt-get update && sudo apt-get install azure-cli
然后使用以下命令检查安装的版本:
az --version
它应该等于或大于 2.0.x。
创建 Kubernetes 集群
您需要通过简单的步骤来创建一个 Kubernetes 集群。
登录 Azure
az login
并遵循终端和浏览器中的指示。最后,您应该会看到一个带有云信息的 JSON 文档。
创建资源组
资源组是一个逻辑组,您可以在其中部署资源(例如虚拟机)并管理它们。
az group create --name ganRG --location eastus
您应该会看到一个包含资源组信息的 JSON 文档。
创建集群
现在是时候创建 Kubernetes 集群了。在 Azure 免费试用版中,我们最多可以使用 4 个内核,因此我们只能创建一个主内核和一个工作内核;它们每个都有两个内核。主节点是自动创建的, agent-count 指定工作(或代理)节点的数量。
az acs create --orchestrator-type=kubernetes \
--resource-group ganRG \
--name=ganK8sCluster \
--agent-count=1 \
--generate-ssh-keys
提示:不要使用很长的名称,我在创建 Kubernetes 服务时遇到了一个错误,它抱怨名称太长(Azure 给集群名称添加了相当长的后缀)。
如果 SSH 密钥不存在,您还会在默认位置收到生成的 SSH 密钥。稍等几分钟…如果一切正常,那么您应该会看到包含集群信息的相当长且详细的 JSON 文档。确信您的资源组中已经创建了一个集群
{
.........
"resourceGroup": "ganRG"
}
您还可以在 Azure Portal 中检查我们在资源组 ganRG 中有两个虚拟机—k8s-master—…和k8s-agent—…。
注意事项
如果您不使用虚拟机,请注意停止或取消分配虚拟机,以避免额外成本:
az vm [stop|deallocate] — resource-group=ganRG — name=k8s-agent-…
az vm [stop|deallocate] — resource-group=ganRG — name=k8s-master-…
您可以使用以下命令重新启动它们:
az vm start — resource-group=ganRG — name=k8s-agent-…
az vm start — resource-group=ganRG — name=k8s-master-…
将 Docker 图像上传到 Azure
现在我和 Kubernetes 做一个短暂的休息,把我们的 Docker 图片上传到 Azure 容器注册中心。它是我们在云中的 Docker 私有注册表。我们需要这个注册中心将 Docker 映像放入我们的 Kubernetes 集群。
创建容器注册表
az acr create --name=ganEcr --resource-group=ganRG --sku=Basic
创建一个私有注册表 ganEcr 。作为响应,您应该得到一个包含注册表信息的 JSON 文档。有趣的领域有:
{
"adminUserEnabled": false,
.........
"loginServer": "ganecr.azurecr.io",
.........
}
第一个告诉您,注册表没有管理员,第二个告诉您资源组中服务器的名称。为了上传 Docker 图像,我们需要一名管理员,我们必须让他:
az acr update -n ganEcr --admin-enabled true
上传 Docker 图像
首先,我们必须提供上传凭证:
az acr credential show --name=ganEcr
您应该会收到类似以下内容的响应:
{
"passwords": [
{
"name": "password",
"value": "=bh5wXWOUSrJtKPHReTAgi/bijQCkjsq"
},
{
"name": "password2",
"value": "OV0Va1QXv=GPL+sGm9ZossmvgIoYBdif"
}
],
"username": "ganEcr"
}
您使用一个用户名和一个密码从 Docker:
docker login ganecr.azurecr.io -u=ganEcr -p=<password value from credentials>
然后以这种方式标记 GAN Docker 图像:
docker tag $USER/tensorflow-serving-gan:v1.0 ganecr.azurecr.io/tensorflow-serving-gan
现在你可以把它推到 Azure 容器注册!
docker push ganecr.azurecr.io/tensorflow-serving-gan
耐心点,这需要一段时间:-)记住,这个操作将 Docker 镜像从你的 PC 上传到微软服务器。
在 Kubernetes 集群上运行
回到库伯内特。对于集群上的操作,我们需要一个名为 kubectl 的工具。它是一个命令行界面,用于对 Kubernetes 集群运行命令。
我建议您查看 kubectl 文档中的可用命令列表。我在这里使用:
kubectl get [nodes|pods|services]
分别获取关于 Kubernetes 节点、pod 和服务的信息
kubectl create ...
用于从配置文件创建 pod 和服务。
用 kubectl 连接到 Azure
首先从 Azure 获取凭据:
az acs kubernetes get-credentials --resource-group=ganRG --name=ganK8sCluster
这个命令从 Azure 获取凭证并将它们本地保存到 ~/。kube/config 。所以你不需要以后再问他们。
现在,使用 kubectl 验证到集群的连接:
kubectl get nodes
您应该会看到主节点和工作节点:
NAME STATUS AGE VERSION
k8s-agent-bb8987c3-0 Ready 7m v1.6.6
k8s-master-bb8987c3-0 Ready,SchedulingDisabled 7m v1.6.6
部署配置
我已经为部署到 Kubernetes 集群创建了一个配置文件 (YAML 格式)。在那里,我定义了一个部署控制器和一个服务。我鼓励您阅读 Kubernetes 文档以获取详细信息。
这里只是一个解释,我所做的。实际上,您可以使用 kubectl 命令来部署 pod 和服务,但是将所需的部署配置一次性写入这样的 YAML 文件并在以后使用它要方便得多。
在我们的例子中,它定义了一个部署和一个服务:
......
kind: Deployment
metadata:
name: gan-deployment
......
---
kind: Service
metadata:
labels:
run: gan-service
name: gan-service
部署
我想将我的 Docker 映像部署到两个单元中:
spec:
replicas: 2
并从我的 Azure 容器注册表中提取它:
spec:
containers:
- name: gan-container
image: ganecr.azurecr.io/tensorflow-serving-gan
部署后,Pod 应该启动 Shell 并启动 TensorFlow,在 Docker 容器中为 GAN 模型提供服务:
command:
- /bin/sh
- -c
args:
- /serving/bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=gan --model_base_path=/serving/gan-export
在端口 9000 上:
ports:
- containerPort: 9000
服务
服务必须在端口 9000 上接受外部请求,并将它们转发到 Pod 中的容器端口 9000:
ports:
- port: 9000
targetPort: 9000
并在两个底层 pod 之间提供负载平衡:
type: LoadBalancer
部署到 Kubernetes 集群中
现在部署 Docker 映像,让 Kubernetes 来管理它!
cd <path to GAN project>
kubectl create -f gan_k8s.yaml
您应该看到:
deployment "gan-deployment" created
service "gan-service" created
现在检查 pod 是否正在运行:
kubectl get podsNAME READY STATUS RESTARTS AGE
gan-deployment-3500298660-3gmkj 1/1 Running 0 24m
gan-deployment-3500298660-h9g3q 1/1 Running 0 24m
提示:状态变为运行需要一段时间。只有这样你才能确定豆荚已经准备好了。
服务准备就绪:
kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gan-service 10.0.134.234 40.87.62.198 9000:30694/TCP 24m
kubernetes 10.0.0.1 <none> 443/TCP 7h
提示:gan 服务的外部 IP 必须是有效的 IP(不是*<>*或 <节点> )。否则,该服务不可操作。
检查它是否工作
所以现在我们可以检查我们的努力是值得的!
cd <path to GAN project>
python svnh_semi_supervised_client.py --server=40.87.62.198:9000 --image=./svnh_test_images/image_3.jpg
您应该看到:
outputs {
key: "scores"
value {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 1
}
dim {
size: 10
}
}
float_val: 8.630897802584857e-17
float_val: 1.219293777054986e-09
float_val: 6.613714575998131e-10
float_val: 1.5203355241411032e-09
**float_val: 0.9999998807907104** float_val: 9.070973139291283e-12
float_val: 1.5690838628401593e-09
float_val: 9.12262028080068e-17
float_val: 1.0587883991775016e-07
float_val: 1.0302327879685436e-08
}
}
如果你得到这个结果,恭喜你!您在 Kubernetes 集群的云中部署了 GAN 模型。Kubernetes 以可靠的方式扩展、负载平衡和管理 GAN 模型。
结论
在第 1 部分和第 2 部分中,我们创建了一个 GAN 模型,准备好供 TensorFlow 使用,并将其放入 Docker 容器中。工作量很大,但我们都是在当地生产的。
现在我们把它公之于众,并使用最先进的技术,以可靠和可扩展的方式做到了这一点。
当然,这个模型非常简单,并且以用户不友好的形式给出结果。自动化潜力很大,我做了很多手动步骤来解释其中的机制。所有步骤都可以打包到脚本中进行“一键式”部署,或者成为持续集成/持续部署管道的一部分。
我希望你喜欢这个教程,并发现它很有用。如有任何疑问或问题,请随时与我联系。
更新 12。2017 年 11 月
我用指令扩展了一个教程,如何为模型创建 REST API,由 TensorFlow Serving 托管。
如何设计人工智能系统?
概念开发、解决方案发现和资源评估,为您的第一个人工智能系统产品做好准备。
要开始设计一个智力模型,你需要制定目标。例如,学习洞察力,开发实验和知识,执行预测或训练系统来解决问题。
为了让这篇文章的阅读起作用,把你的项目记在心里,并把想法写下来。我向你保证,做完这个练习后,你对构建智能系统和所需资源规划的理解将会更加清晰。
在地上
我们都来自不同背景的人工智能,这种想法可能看起来模糊。让我们定义一些概念:
- AI 是一套数学方法,让程序机器有意识地运转。这意味着机器有动机和能力设定任务并解决它。
- 一个智能系统是狭义人工智能的同义词。它研究代理和机器,这些代理和机器使用基于相关领域知识的统计和机器学习算法来执行明确定义的任务的自动化。
- 机器学习是一类算法,它通过吸收数据统计信息来学习执行一项任务并增强性能结果,而无需改进算法本身。
形成一个概念
技能:叙事讲故事,同情心
你打算解决什么问题?最好的答案是从为什么开始,而不是从如何或什么开始。为什么会有这个问题呢?你为什么想找到解决办法?“如何”这个问题回答了你将应用什么技术;什么描述了你想要产生的结果。为什么你坚持这个问题。你必须感受到问题的痛苦。当你理解其背后的动机时,你会看到多个解决方案,并能够选择一个满足项目约束的方案。
谁将从该解决方案中受益?没有目标受众的问题是不存在的。避免一概而论——将观众分成清晰的部分。这些人是谁?他们有什么共同点:有什么鲜明的特点吗?
进行研究
技能:批判性思维、数据分析
研究首先要了解以前的解决方案是如何解决这个问题的。参考资料使研究可靠,也让你与该领域的专家联系起来。在竞争分析之上的人工智能相关项目中,人们研究学术解决方案。一个全面的出版物将包括实验设计,数据选择的标准,模型描述,模型的优点和缺点,以及改进的想法。不需要重现一个实验,你所关心的只是算法如何解决问题,性能基准,以及引用源如数据集和开源代码。
我使用谷歌学术来研究最相关和被引用的解决类似问题的文章和模型。它可能包括算法伪代码,但最有可能链接到开源库,如 GitHub 。此外,大量记录良好的现成 ML 框架和工具集给出了最新方法的评论(例如, Azure 机器学习、 Amazon Sage Maker 、 PyTorch 1.0 、 TensorFlow )。不要忘记提到你选择使用或修改的模型或代码的版权——透明和交流是人工智能社区的主要驱动力。
最初的研究有助于创建你的假设,因此你准备好收集历史数据和在线观察。起初,你可能想积累更多的信息。然后,在数据探索之后,只有必要的体积将保留在研究中。但是,提问时不要提出答案,因为你不想用确认偏见影响结果,并保持批判性,包括可能与你的假设相矛盾的特征。
研究状态的关键是了解解决问题的成本。在业务建模中,这个过程被称为客户开发。您将需要这个答案来在同事、客户、赠款发放者中推广解决方案,以将项目推进到下一步。
拆分问题
技能:创意分析
对于流程阶段,一个事件从另一个事件开始。对于其余的,发现变量之间的关系:如果改变一个变量导致另一个变量的变化,那么后者是可靠的;如果没有—独立。反之亦然,以确定相互依赖。
在复杂的系统中,有更多的标准来划分阶段。例如,过程阶段的演化条件、不同的数据和知识来源、目标行动的约束以及相关的环境动态。形成独立的步骤和组件后,确保您有所有需要完成的部分。
作为一个例子,为了建立一个智能系统,该系统能够应用 R-CNN 对象检测模型来识别视频流中的事件,组件是:流输入源、相关条件、传递知识、预处理图像、为对象建议区域、计算 CNN 特征、对区域分类、标记对象。作为输出,智能模型可以捕捉视频流中的事件。
Example of criteria to split the stages and conditions for a complex system
地图和草图,例如绘制统一建模语言图和以产品为中心的流程图,对于看到完整的图片和进一步交流信息是有价值的。在你觉得舒服的任何程序中做插图。我使用 Keynote 构建简单的图表,使用 Cacoo 应用思维导图、ER 和 Azure/AWS 模板。
提出假设
技巧:提问
下一步是准备假设。如果一个假设有可能产生至少一个你可以用实验证明的精确预测,那么这个假设就是正确的。假设的结构因你所做的项目类型而异。为了研究——如果我们这样做,我们会发现。对于企业来说,如果我们这样做,我们将会赢得。
尽管如此,总体结构仍然是相似的:在选定的数据集上进行的实验显示了自变量是否如预期的那样变化,而因变量以特定的模式做出响应。为了使调查可靠,提及与代表偏见的主要结果或见解相矛盾的已知来源。
创建计划
技能:战略思维
当谈到在计划中执行解决方案的愿景时,我发现一些有用的草图,比如包含正面和负面场景的决策树。一个被拒绝的假设不会将整个项目置于定义明确的战略的不确定性风险中。相反,它支持一个有意识的决定,考虑剩下的时间和资源。大计划保持敏捷和灵活,因此行动响应即将到来的信息和见解。
估计资源
技能:正念
一切都可以用原来的公制或者至少从 0 到 5 来衡量。用数字定义成功和失败的计划意味着敏感性——理解表演阶段和状态的能力。此外,这种估计有助于推导出让你和利益相关者了解情况的影响概率。
在评估技术准备程度时,考虑您团队的独特优势和知识。如果你能反思以前的经验,也从中估计;如果没有,不要担心——寻求专家的建议或在这个过程中指导你。
资源测量通过减少一次做很多事情的欲望,保护你远离模糊的概念,并向太多的方向发展。资产和资源来源于团队的知识和技能、时间、金钱、情感和身体健康。因此,保持计划简单,不要对未来几年提出太精确的建议:专注——一次一步。
当日成绩
首先,祝贺你,你做得很好:你澄清了概念,并制定了可测试和可测量的假设。现在,您已经准备好交流已知和未知的信息,以填补缺失的信息并获取项目资源。我很高兴听到你的故事和问题——在推特上丰富我,让我们保持联系。
关于作者:
我是一名从事复杂系统建模和数据科学的应用数学家。我在计算神经科学领域进行数据翻译研究,并与各种客户一起解释业务数据源,以获得洞察力并创造产品。
如何开发成功的医疗保健分析产品
分析和数据科学是医疗保健的重要工具。不仅仅是因为他们能够预测某人何时会心脏病发作。良好的数据科学和分析是重要的工具,因为它们有助于在医疗保健支出和减少低效方面做出更好的决策。能够降低医疗服务提供者的医疗保健成本将反过来允许他们允许更多的人获得医疗保健。
当看着所有其他长期使用分析和算法的行业(如金融/银行和电子商务)时,医疗保健的诱惑是试图全面解决医疗保健中的所有数据问题。这反过来导致对数据团队、数据湖和其他以数据为中心的计划的大量投资,这些投资并不总是成功的。类似于 DC 电影未能像马福 l 一样吸引观众注意力的原因之一。他们匆忙尝试创造类似于漫威用三分之一的时间用十年创造的东西。同样,许多医疗保健公司试图建立数据科学商店,并试图在几年内复制谷歌、亚马逊和其他一些大型科技公司已经做了十多年的事情。
在这种熟练水平上建立分析团队和数据系统需要时间(让我们甚至不要开始数据标记)。而不是试图在一年内创建一个完整的数据分析和算法世界。我们已经取得了成功,从一两个问题开始(像在网上卖书,但在医疗保健行业),选择一个观点来解决问题,然后讲一个简单的故事。如果你的数据团队能够做到这一点并取得成功,那么你就离成功更近了,并且已经开始获得支持者和经理的支持。医疗保健是复杂的,所以在向一个大团队投资数百万美元之前,先从关注几个问题和有限的视角开始。
挑一个问题拿一个
当谈到医疗保健分析(或任何分析)时,重要的是选择一个特定的问题,然后将该问题分成更小的部分。例如,如果你试图开发一个检测欺诈的算法。设计一个模型、算法或系统来将欺诈的概念作为一个整体抽象成一个单一的数学表达式可能非常困难。尤其是当医疗保健互动很少被归类为欺诈或非欺诈时。
这并不妨碍你进行分析或预测建模。它只是改变了你的方法。与其开发复杂的数据科学模型,不如先关注那些有良好投资回报的东西。一个基本系统可以帮助首先减少分析师不得不为欺诈而费力处理的索赔数量,或者在更高的级别指出更大的系统性问题,可以帮助知道首先将精力集中在哪里。此外,他们可以通过互动来标记和记录模式。
在花一些时间查看这些案例后,您的分析团队将会对问题有进一步的了解,并会有许多优秀的最佳实践和标签数据。最后,这可能看起来很慢,但慢总比失败好。
专注于一个角度
当开发任何类型的分析时,你可以采取许多不同的角度和观点。例如,在医疗保健领域,您可以关注医疗保健提供商(医院、急诊室等)、患者或手术类型。你的团队可能没有足够的资源来开发一个工具、仪表盘或算法来立刻处理所有这些不同的角度。因此,当承担一个像“预测病人再入院”这样的新项目时,选择一个对你的团队最有益的类别。通常,首先关注提供商是更好的选择之一。这是因为与患者行为相比,改变提供者行为要容易得多。当你改变一个提供者的行为时,其影响比改变一个病人的行为要大得多。这也是为什么首先关注提供商层面的分析会有所帮助的两个原因。此外,就像上面讨论的那样,它可以帮助关注和查明患者层面的一些更具体的问题。
你的最终作品应该有一个清晰的故事
一旦你开发出了产品的最终数据点,这个产品就需要能够讲述一个故事。老实说,这对我来说仍然是一个困难的部分。然而,这是一个非常重要的概念。即使你是一个了不起的程序员、数据工程师或算法开发人员,如果你的产品没有向你的最终用户描绘一个清晰的故事,那么它可能会被忽略或误解。通常,我所看到的成功的报告流程是对问题有一个高层次的了解,如果适用的话,可能包括问题的成本。这让每个人都在同一页面上,也吸引了他们的注意力。如果你能说明问题有多大,花费了他们多少钱,最终用户就会被吸引过来。
然后你可以进一步深入问题,把它分解成子集,然后进入下一步。
接下来的步骤不一定是直接的解决方案。这可能是一个有问题的程序列表,导致大量的再入院或欺诈。这导致了下一个可能的项目是分析为什么。一旦你找到了可能的原因和解决方案,你就可以回头看看报告,看看事情是否有所改变。
Caption: Taking a quick detour, lets look at a few dashboards from actual companies. The dashboard above is from Health Catalyst. The top portion is attempting to state whether or not the cohort is currently meeting the target for various readmissions. This kind of states if there is a problem or not. It is pretty typical for medical analytics to do a comparison approach. The middle section is a little bit of a disconnect for me. It doesn’t really flow with the story they are trying to tell. It talks about interventions, but this doesn’t really connect with the first set of graphs. However, the last section that is a bar graph melded with a line chart makes sense because it tells you the history. So maybe you’re not hitting your target readmission numbers, but you are improving
总的来说,你处理医疗保健分析或开发算法来预测患者再入院等事件的方式与任何其他行业没有什么不同。试图解决整个问题,比如欺诈,或者将病人重新入院作为一个整体,这是很有诱惑力的。医疗保健行业的海量数据和复杂的交易并不容易。为了管理这种复杂性,分解问题并决定你计划采取的观点将有助于增加你的成功和结果率。
您的团队在开发医疗保健分析方面需要帮助吗?也许你正在寻找衡量供应商质量或分析患者模式。如果是这样,那么今天就联系我们的团队 y!我们有一个医疗保健分析专家团队,可以帮助您创建所需的工具。
我们已经致力于开发产品来帮助管理患者再入院、资源滥用、检测不必要的程序、慢性病预防和欺诈检测。
如果您想了解更多关于数据科学或分析的信息,请查看以下文章:
Men ’ s wear house 如何使用数据科学
如何使用 R 开发预测模型
使用 Google Sheets 进行网页抓取
什么是决策树 算法如何变得不道德和有偏见
如何开发健壮的算法
4 数据科学家必须具备的技能