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

免责声明:本文内容是基于我对一些机器学习团队的观察结果,而不是对这个行业的一份学术调查。利益相关,我需要先表明自己是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,可让用户选择自己的数据集并自动训练新模型,过程中无需编写代码:

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来编排容器,而且还要在所使用的云平台上配置自动缩放。

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

机器学习基础架构技术栈

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

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

资料来源:Cortex Repo

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

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

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

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

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

作者介绍:

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

原文链接:

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

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/lSxTMpSXaebVpImfHA0H
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券