22

机器学习本该用起来更简单

 4 years ago
source link: https://www.infoq.cn/article/lSxTMpSXaebVpImfHA0H
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

免责声明:本文内容是基于我对一些机器学习团队的观察结果,而不是对这个行业的一份学术调查。利益相关,我需要先表明自己是 Cortex 项目的贡献者,Cortex 是一个用来在生产中部署模型的开源平台。

为了方便读者理解,我拿软件中无处不在的东西为例,比如数据库。构建一个数据库是什么意思呢?对于 Postgres 的贡献者来说,“创建一个数据库”就是要写一百万行 C 代码。对于 Rails 开发者来说,这就是 rake db:create 的操作。显然,谁都没错,它们只是代表了不同的抽象级别,适用于不同的工程师。

这就是软件构建的方式,为现代应用程序提供支持的基本软件(数据库、Web 服务器、请求路由器、哈希库等)都是因为抽象层的存在让非专业人士也可以轻松使用它们。

机器学习历来缺少这样的抽象层,这就限制了该技术的普及。但是,情况正在发生变化。新兴起的一批项目的关注重点就是让机器学习的应用变得更容易。

模型需要对开发人员友好的界面

为了在生产中使用机器学习技术,你需要:

  • 了解模型的专业知识
  • 足够的数据和资金来训练模型
  • 清楚机器学习基础架构知识以部署模型

于是,任何动用机器学习的项目都需要多名专家参与,这是客观存在的瓶颈。但是,开发人员所希望的是即便缺乏机器学习背景,也能在生产中使用该技术,就像没有密码学背景的开发人员仍然可以应用哈希库来保护用户数据一样。

幸运的是,这一天终于要到来了。

填补机器学习的抽象层鸿沟

为了让机器学习的应用广泛普及,开发人员必须对机器学习有一个高级层面的理解(什么是模型、微调、推断等),并使用可用的抽象来构建应用。

许多必要的抽象已经在研究中了,总结起来可归结为以下重点领域:

需要更简单的方法来训练模型

其实,对于许多应用机器学习技术的用例而言,我们并不需要从头开始训练新的模型。

例如,如果你正在开发会话代理,则几乎可以肯定谷歌 Meena 的表现要优于其他。如果正在开发文本生成器,则可能使用 OpenAI 的 GPT-2,而不是从头开始构建文本生成器。对于对象检测用例,YOLOv3 之类的模型可能是不错的选择。

得益于迁移学习技术,开发人员可以使用相对少量的数据,将这些开源模型微调以用于任务中。

例如,使用 gpt-2-simple 之类的新库时,可以使用简单的命令行界面微调 GPT-2:

复制代码

$ gpt_2_simple finetune your_custom_data.txt

有了这一抽象层,开发人员就不需要深度的机器学习专业知识,他们只需要知道什么是微调即可。而且,gpt-2-simple 不是唯一可用的抽象。谷歌的 CloudAutoML 为用户提供了一个 GUI,可让用户选择自己的数据集并自动训练新模型,过程中无需编写代码:

vY77VjU.png!web

Sundar Pichai 在撰写关于 AutoML 的文章 时说:“我们希望 AutoML 具备当下很少几位 PhD 才拥有的能力,并在未来三到五年内,让成千上万的开发人员能够为他们的特定需求设计新的神经网络。”

从模型生成预测的过程必须简单

读到这里,我们可以发现为特定任务获取经过训练的模型已经容易多了。接下来的问题是如何根据模型来生成预测?

有一大把项目提供了模型服务(model serving)功能,其中许多都对接了流行的 ML 框架。例如,TensorFlow 具有 TF 服务,而 ONNX 具有 ONNX 运行时。

除了科技巨头提供的项目外,许多独立的开源项目正在解决这个问题。例如,Bert Extractive Summarizer 是一个可以轻松使用谷歌 BERT 提取文本摘要的项目。以下是其文档中的 示例

复制代码

from summarizer import Summarizer

body = 'Text body that you want to summarize with BERT'
body2 = 'Something else you want to summarize with BERT'
model = Summarizer()
model(body)
model(body2)

使用这个库来生成预测非常简单,只需导入语句并调用 Summarizer() 即可。这样的项目数量越来越多,开发人员无需深入挖掘模型本身的细节,也能更轻松地从模型生成预测。

部署模型必须简单

最后的瓶颈是基础架构。

为应用程序提供预测很简单,但是当应用程序需要扩展时,事情就会变得很复杂。以 GPT-2 为例:

  • GPT-2 占用的空间大于 5GB 。你需要一台更大的服务器(这也意味着价格会更高)来托管这么大的模型。
  • GPT-2 非常消耗计算资源 。就为了提供单个预测,GPT-2 就能以 100%的占用率吃掉 CPU 几分钟的计算资源。即便使用一颗 GPU,单个预测也可能需要几秒钟才能完成。相比之下,Web 应用可以通过一个 CPU 为数百个并发用户提供服务。
  • GPT-2 非常消耗内存 。除了巨大的磁盘空间和计算资源需求之外,GPT-2 还需要大量内存才能正常运行而不会崩溃。

哪怕是只应对少量用户,基础架构也需要扩展应用程序的很多副本,这意味着要使用 Docker 对模型容器化,使用 Kubernetes 来编排容器,而且还要在所使用的云平台上配置自动缩放。

构建一个用于处理机器学习部署的基础架构需要学习一整套工具,对于大多数缺乏专业背景的开发人员来说,相关知识有很多都是很陌生的:

eMFneef.png!web

机器学习基础架构技术栈

为了让开发人员可以使用机器学习技术,还需要抽象机器学习的基础架构。这就是诸如 Cortex 之类的项目(利益相关:我是一位贡献者)的用武之地。

Cortex 通过配置文件和 CLI 抽象了模型部署的底层开发运维工作:

MV7fmmq.png!web

资料来源:Cortex Repo

像 Cortex 这样的项目的目标很简单:输入一个经过训练的模型,并将其转变为任何开发人员都可以使用的预测 API。

让机器学习应用起来更加轻松

让我澄清一点,机器学习背后的基础数学永远都很困难。没有人仅仅因为自己可以调用一个 predict() 函数就能变身机器学习专家。关键在于,开发人员并不必成为机器学习专家(或开发运维专家),也可以在他们的应用程序中使用机器学习技术。

机器学习生态系统终于开始将重心放在简化机器学习的应用难度上了。开发人员只需少量知识就可以微调一个最前沿模型,将其包装在一个 API 中,并使用开源且直观的抽象将其部署在可伸缩的基础架构上。

这样一来,机器学习应用将变得更加容易。进一步说,几乎所有开发人员都可以使用这种技术。

作者介绍:

Caleb Kaiser,Cortex Lab 创始团队成员,曾在 AngelList 工作,最初在 Cadillac 供职。

原文链接:

https://towardsdatascience.com/machine-learning-is-still-too-hard-to-use-e344773725af


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK