本文由 「AI前线」原创,原文链接: Keras作者力推开源框架Lore:15分钟搞定深度学习模型从配置到部署
作者|Montana Low
译者|Debra
编辑|Emily
AI 前线导读:今天,Keras 的作者 Francois Chollet 转推了一篇文章,教大家基于开源框架 Lore 在 15 分钟内建立深度学习模型,用 Python 配置、构建、部署和维护深度学习模型。真的能在这么短的时间内构建深度学习模型吗?我们来一探究竟。
随着 Instacart 的发展,我们学到了一些知识,但是获取知识的方法却并不简单。我们的开源框架 Lore ,可以让工程师距离机器学习更进一步,而且机器学习研究人员也可以操作。
开源框架 Lore 链接:
机器学习一般给人的印象是这样的:
呃,这张纸并没有告诉我它的工作方式......
常见问题
- 当你在 Python 或 SQL 等高层级编写定制代码时,很容易触及性能瓶颈。
- 代码复杂性增大的原因在于有价值的模型是多次迭代变化的结果,因此随着代码以非结构化方式演变,个人会感觉到力不从心。
- 随着数据和库的依赖关系不断变化,可重复性将受到影响。
- 当我们努力跟上最新的论文、组件、功能和错误的脚步时,信息过载很容易导致错过新的容易实现的目标。对于刚进入该领域的人来说,情况会更加糟糕。
为了解决这些问题,我们正在对 Lore 中的机器学习进行标准化。在 Instacart,我们的三个团队正在使用 Lore 进行机器学习开发,目前已经可以运行十几种 Lore 模型。
TLDR
以下是在没有上下文的情况下进行快速预测的演示,你可以从 github 复制my_app
。如果想了解全程,请跳至大纲。
$ pip3 install lore
$ git clone https://github.com/montanalow/my_app.git
$ cd my_app
$ lore install # caching all dependencies locally takes a few minutes the first time
$ lore server &
$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_name=Banana&department=produce"
复制代码
功能规格
在 15 分钟内将自己的深度学习项目投入生产,你就能充分体会到 Lore 的优势在哪里了。如果你想在编写代码之前查看一下功能规格,请参阅以下简要概述:
- 模型 支持使用数据管道对估算器进行超参数搜索。他们将有效地利用多个 GPU(如果可用)和两种不同的策略,并且因水平可伸缩性可以保存和分发。
- 支持来自多个软件包的 估算器:Keras、XGBoost 和 SciKit Learn。它们都可以通过构建、调试或预测覆盖来进行分类,以完全自定义你的算法和架构,同时还可以从其他很多方面受益。
- 管道 可以避免训练和测试之间的信息泄漏,一条管道可以用许多不同的估算器进行实验。如果机器可用 RAM 空间不够,则可使用基于磁盘的管道。
- 转化器对高级功能编程进行标准化。例如,根据美国人口普查数据将美国名字转换为其统计年龄或性别;从自由格式的电话号码字符串中提取地理区号;pandas 可有效支持常见的日期、时间和字符串操作。
- 编码器 为估算器提供足够的输入,并可以避免常见的缺失和长尾值问题。经过充分测试,它们可以帮助你节省从垃圾中检索信息的精力。
- 对于流行的 (No)SQL 数据库,整个应用程序以标准化的方式配置 IO 连接,对批量数据进行交易管理和读写优化,而不是使用典型的 ORM 操作。除了用于分发模型和数据集的加密 S3 存储桶之外,连接还共享一个可配置的查询缓存。
- 对开发中的每个应用程序进行依赖关系管理,并可以 100%复制到生产环境中。无需手动激活,没有破坏 Python 的环境变量或隐藏的文件。无需 venv、pyenv、pyvenv、virtualenv、virtualenvwrapper、pipenv、conda 相关知识,不用在这种事情上费心。
- 可以在自己的持续集成环境中进行模型 测试,支持代码和训练更新持续部署,而无需增加基础架构团队的工作量。
- 工作流程支持 命令行、Python 控制台、jupyter 笔记本或 IDE。每个环境都可以为生产和开发配置可读的日志和时序语句。
15 分钟构建深度学习框架大纲
只要懂得基本的 Python 知识,就可以开始这个任务了。如果你的机器不能进行学习,就可以用剩下的时间好好探索机器学习的复杂性。
- 创建一个新应用(3 分钟)
- 设计模型(1 分钟)
- 生成框架(2 分钟)
- 管道部署(5 分钟)
- 测试代码(1 分钟)
- 训练模型(1 分钟)
- 投入生产(2 分钟)
创建一个新的应用程序
Lore 独立管理每个项目的依赖关系,以避免与你的系统 Python 或其他项目发生冲突。将 Lore 以标准的 pip 软件包安装:
# On Linux
$ pip install lore
# On OS X use homebrew python 2 or 3
$ brew install python3 && pip3 install lore
复制代码
当你无法创建相同的环境时,就很难重复别人的工作。 Lore 保留你的操作系统 Python 的工作方式,以防止依赖性错误和项目之间发生冲突。每个 Lore 应用程序都有它自己的目录,有自己的 Python 安装,以及把各自需要的依赖关系锁定到 runtime.txt 和 requirements.txt 中的特定版本。这使得分享 Lore 应用程序的效率更高,并使我们的机器学习项目向避免重复性方面迈进了一步。
安装 Lore 后,你就可以创建一个新的深度学习项目应用程序。Lore 默认是模块化的,因此我们需要指定keras
来安装此项目的深度学习依赖项。
$ lore init my_app --python-version=3.6.4 --keras
复制代码
设计模型
我们将演示如何建立一个模型,仅根据名称和所属的分类预测商品在 Instacart 网站上受欢迎的程度。世界各地的制造商都会测试各种类产品的名称,零售商则通过优化产品以最大限度地提高产品的吸引力。我们这个简单的人工智能将提供相同的服务。
机器学习最难的挑战之一就是获取优质数据。幸运的是,Instacart 已经为此任务公开了 300 万份匿名货物订单,并重新进行调整。然后,我们可以将问题创建成一个监督式学习回归模型,该模型根据 2 个特征预测年销售量:产品名称和分类。
请注意,我们将建立的模型仅用于演示,并无没有实际用途。我们给好奇的读者提供了一个很好的模型,仅供练习。
生成框架
$ cd my_app
$ lore generate scaffold product_popularity --keras --regression --holdout
复制代码
每个 Lore 模型包括一个用于加载和编码数据的管道,以及一个部署特定机器学习算法的估算器。这个模型有趣的地方在于类别生成实现过程的细节。
整个过程从左侧的原始数据开始,并将其编码为右侧所需的形式。然后使用编码数据、验证测试提前终止数据对估算器进行训练,并在测试集上进行评估。所有内容都可以在模型存储区进行序列化,然后再次加载数据循环进行训练。
模型工作原理示意图
管道部署
很少有原始数据完全适用于机器学习算法。通常我们从数据库获得原始数据或下载一个 CSV 文件,进行调整以适应算法,然后将其分为为训练集和测试集。 lore.pipelines
中的基类将此逻辑按照标准化流程执行。
lore.pipelines.holdout.Base
将数据分成训练、验证和测试集,并对我们的机器学习算法进行编码。我们的子类将负责定义 3 种方法:get_data
,get_encoders
和get_output_encoder
。
Instacart 公布的数据分布在多个 csv 文件中。
管道的get_data
将下载原始 Instacart 数据,并使用 pandas 将其加入到具有(product_name,department)
和对应的销售总量(sales)
的DataFrame
中:
这是get_data
的部署:
接下来,我们需要为每列指定一个编码器。计算机科学家可能会认为编码器是有效机器学习的一种类型注释形式。有些产品的名字挺好笑,所以我们会选取它们的前 15 个单词。
这就是整个工作流程。我们的初始估算器将作为 lore.estimators.keras.Regression 的一个简单子类,它构建了一个具有合理默认值的经典深度学习框架。
# my_app/estimators/product_popularity.py
import lore.estimators.keras
class Keras(lore.estimators.keras.Regression):
pass
复制代码
最后,我们的模型通过将它们返回估算器,并从构建的框架中提取数据,来实现深度学习架构的高级属性。
测试代码
生成框架时,该模型会自动进行冒烟测试。第一次运行测试需要多花一些时间来下载 200MB 的测试数据集。最好先处理一下./tests/data
中的文件缓存,将其放入 repo 中,以消除网络依赖,加速测试。
$ lore test tests.unit.test_product_popularity
复制代码
训练模型
训练模型的数据将缓存在./data
中,并将工件保存在./models
中。
$ lore fit my_app.models.product_popularity.Keras --test --score
复制代码
按照第二个终端中的日志查看 Lore 的耗时情况。
$ tail -f logs/development.log
复制代码
试着添加更多的隐藏图层,看看是否对模型score
有帮助。你可以编辑模型文件,或直接通过命令行调用属性以适应 --hidden_layers = 5
。缓存数据集可能需要大约 30 秒。
检查模型的功能
你可以在你的 Lore 环境中运行 jupyter 笔记本。Lore 将安装一个自定义 jupyter 内核,并使用你创建的应用程序的虚拟 env,用于lore notebook
和lore console
。
浏览notebooks / product_popularity / features.ipynb
并“全部运行”以查看模型最后一次适配的可视化效果。
“生产”部门被编码为“20”
可以看到,针对特定功能时,该模型的预测值和测试集(金色)吻合程度很高。在这个案例中,有 21 个种类都达到了很好的重叠效果,除了“produce”这个类别,因为模型没有完全计算其有多少异常值。
你还可以看到由/ product_popularity / architecture.ipynb
脚本生成的深度学习框架。
15 个标记名称通过左侧的 LSTM 运行,种类名称放入右侧的嵌入,然后两者均通过隐藏层。
为模型提供服务
Lore 应用程序可以作为一个本地模型 HTTP API。默认情况下,模型将通过 HTTP GET 端点公开他们的“预测”方法。
我的结果表明,将“有机”添加到“香蕉”,"农产品"的销量将提高两倍。 “绿色香蕉”的销量预计会比“布朗香蕉”差。
投入生产
Lore 可以通过所有支持 Heroku buildpack 的基础架构进行部署。 部署容器的runtime.txt
和requirements.txt
中的 Buildpacks 安装有具体规范。如果你想在云端横向扩展,可以按照 heroku 的入门指南进行操作。
你可以查看每次在
./models/my_app.models.product_popularity/Keras/
中进行 lore fit 命令的结果。该目录和./data/
默认位于.gitignore
中,因为你的代码可以随时重建它们。一个简单的部署策略,是插入所要发布的模型版本。
$ git init .
$ git add .
$ git add -f models/my_app.models.product_popularity/Keras/1 # or your preferred fitting number to deploy
$ git commit -m "My first lore app!"
复制代码
Heroku 可以轻松发布应用程序。这是他们的入门指南。
devcenter.heroku.com/articles/ge…
这是 TLDR:
$ heroku login
$ heroku create
$ heroku config:set LORE_PROJECT=my_app
$ heroku config:set LORE_ENV=production
$ git push heroku master
$ heroku open
$ curl “`heroku info -s | grep web_url | cut -d= -f2`product_popularity.Keras/predict.json?product_name=Banana&department=produce”
复制代码
下一步
我们认为这个框架的 0.5 版本为社区一起构建 1.0 版本奠定了坚实的基础。发布修补程序版本可以避免重大改动,但次要版本可能会根据社区需求更改功能,弃用旧版本并进行更新升级。
以下是我们计划在 1.0 版本之前添加的一些功能:
- 带有可视化模型 / 估算器 / 特征分析的 Web UI
- 整合在模型训练和数据处理期间分布式计算支持,即排队问题
- 测试不良数据或框架,而不仅仅是损坏的代码
- 更多文档、估算器、编码器和转换器
- 完整的 Windows 支持
感谢 Jeremy Stanley、Emmanuel Turlay 和 Shrikar Archak 对代码的贡献。
原文链接:
tech.instacart.com/how-to-buil…
更多干货内容,可关注AI前线,ID:ai-front,后台回复「AI」、「TF」、「大数据」可获得《AI前线》系列PDF迷你书和技能图谱。