机器学习模型越来越大,开发者应该如何部署?

时间:2024-03-22 22:28:56

2020-02-24 18:38:00

导读:对于机器学习,乐观的人认为其可以完成所有人类可做的任务,比如开车、接电话、预约会议、回复邮件等。但现实是机器学习只不过解决了狭窄范围内的问题,比如视频推荐、商品推荐和估算到达时间。然而,当 OpenAI 发布 GPT-2 时,这一差距好像缩小了。

对于 OpenAI 构建的通用语言模型 GPT-2,该领域的开发者都不陌生。通过简单增加模型大小,GPT-2 有 15 亿个参数,是 ELMo 的 10 倍以上,而以前最好的 Transformer 模型只有 9360 万个参数。

在这之后,模型是越来越大,各大公司就好像达成了共识一般,以致于开发者很难部署。

在 GPT-2 发布后不久,Salesforce 即发布了 CTRL,这是一个拥有 16 亿参数的语言模型。

NVIDIA 也打造了一个拥有 80 亿参数的 Transformer 模型 Megatron。

最近,谷歌发布了新的会话模型 Meena,它拥有 26 亿个参数。

即使在计算机视觉领域,要获得更好性能的途径也是通过更大的模型来实现的。此前,谷歌发布了 NASNet,这是一个打破纪录的图像分类模型,拥有 8890 万个参数,比当时其他任何主要的图像分类模型都要大,能够识别图像中的物体。

趋势很明显。为了实现人类对机器学习驱动未来的美好愿景,这些“超级模型”将会变得越来越大。如此一来,只有一个问题:

模型实在太大,无法在生产环境中使用。

模型太大,部署困难

随着模型规模不断扩大,将其部署到生产中变得越来越棘手。以 GPT-2 为例:

  • GPT-2 大小超过 5GB。在这种规模的情况下,根本无法将模型以本地形式嵌入到应用程序中(而这是移动软件通常使用机器学习的方式)。
  • GPT-2 需要大量算力。为了服务于单个预测,GPT-2 会以 100% 的利用率占用 CPU 长达数分钟。就算有 GPU 的加持,单个预测仍然也需要数秒钟的时间。与此相比,Web 应用可以在一个 GPU 上为数百个并发用户提供服务。
  • GPT-2 需要大量内存。除了可观的磁盘空间和算力需求之外,GPT-2 还需要大量内存才能在不崩溃的情况下运行。

换言之,GPT-2 就是一个庞大的、资源密集型的、速度缓慢的系统。将它投入生产就已经是一个挑战了,再对其进行扩展就更加困难了。这些问题还不是 GPT-2 独有的,所有超级模型都存在这些问题。而且,随着模型变得更大,情况只会变得更糟,不会变得更好。幸运的是,在机器学习生态系统中,有一些项目正在努力克服这一障碍。

解决超级模型部署难题

虽说目前尚处起步阶段,但还是为解决问题提供了可行的思路。

1. 缩小模型

如果模型太大,为什么不压缩它们?要做到这一点,一种方法是通过“知识蒸馏”(knowledge distillation)。这一想法是,一个小型模型可以通过学习来模仿大型模型(即父模型)的性能。

译注:知识蒸馏(knowledge distillation)是一种模型压缩常见方法,用于模型压缩指的是在 teacher-student 框架中,将复杂、学习能力强的网络学到的特征表示“知识”蒸馏出来,传递给参数量小、学习能力弱的网络。

换句话说,训练 GPT-2 需要向其馈入高达 40GB 的文本,这相当于大约 27118520 页的文本文件。然而,训练一个蒸馏过的 GPT-2 模型只需向其馈入 GPT-2 的输出即可。

著名的 Transformer NLP 库背后的 HuggingFace 公司就是这样做的,创建了 DistilGPT2 。虽然与完整的 GPT-2 模型相比,DistilGPT2 在一些质量基准上的得分要低一些,但它比完整的 GPT-2 模型小了 33%,速度快了一倍。

速度能提高两倍,可不是一件小事。对自动驾驶汽车来说,安全刹车和轻微碰撞之间的区别就在于此。对于一个会话智能体来说,这就是自然谈话和令人恼火的机器人电话之间的区别。

2. 将模型部署到云端

就算用了知识蒸馏,模型仍然可能很庞大。超过 25GB 的模型(NVIDIA 的 Megatron 是 GPT-2 的 5.6 倍)尽管缩小了 33%,但仍然很庞大。

在这种规模下,我们用来消费机器学习生成内容的设备,我们的手机、电视,甚至电脑,都无法承载这些模型,它们根本就不合适。

一种解决方案是将模型作为微服务部署到云端,我们的设备就可以根据需要进行查询。这称为“实时推理”(Realtime inference),是在生产中部署大型模型的标准方法。

然而,在云端部署也有自身的问题,尤其是在规模方面。举个例子,我们可以看看 AI Dungeon,这是一款流行的基于 GPT-2 的冒险游戏。

由于 GPT-2 的大小和算力需求所限,AI Dungeon 只能为单个部署模型中的几个用户提供服务。为了应对流量的增加,AI Dungeon 需要具备自动扩展的能力。

水平扩展 GPT-2 部署是一件非常棘手的事。它需要:

  • 确保每个部署都是相同的。例如,使用 Docker 对模型进行容器化,并使用 Kubernetes 对容器进行编排。
  • 自动扩展部署。例如,通过配置云供应商的自动扩展程序,根据流量自动向上或向下旋转实例。
  • 优化资源。这意味着需要在不牺牲性能的情况下,找到并运行最便宜的实例类型和资源分配。

如果做错了,你可能很容易会得到一笔巨大的云计算账单:部署 200 个 g4dn.2xlarge 的成本每小时高达 150.40 美元,或者你发现自己的预测服务 API 经常崩溃。

换句话说,要为大型模型提供服务,目前需要对 DevOps 有相当多的了解,而且还要求大多数数据科学家不能同时是基础设施工程师。

幸运的是,有一些项目正在努力消除这一瓶颈,类似 Cortex 这样的开源项目,即 AI Dungeon 基础设施背后的项目,作为自动化部署大型模型所需的 DevOps 工作的工具,已经吸引了开发者的关注:

机器学习模型越来越大,开发者应该如何部署?

 

3. 加速硬件服务模式

最后一项使大型模型变得更容易的努力,与模型本身并没有任何关系。相反,它必须与改进硬件有关。

更大的模型在更好的硬件上,性能更优。事实上,GPU 对模型服务很重要,为 GPT-2 提供自动更正低延迟服务的唯一方法是使用 GPU:

如果你在 CPU 上运行,每次请求耗时 925 毫秒。如果使用 GPU,在每次请求 199 毫秒的情况下,可以在大约 100 毫秒的空间时间内预测消息的其余部分,当你考虑到他们的浏览器仍然需要呈现你的预测时,这就非常有用了。

然而,随着模型变得越来越大,我们需要更多的处理能力。

解决该问题的一些努力涉及构建全新的硬件。例如,谷歌发布了 TPU,这是专门为与 TensorFlow 接口而设计的 ASIC,最新的 TPU 打破了模型服务基准的可扩展性和性能的记录。

其他努力还包括加速和优化现有硬件。NVIDIA 发布了 TensorRT,这是一个用于优化 NVIDIA GPU 在推理服务中利用率的 SDK。NVIDIA 已经证明,与在 GPU 上使用 TensorRT,比只使用 CPU 推理相比,性能提高了 40 倍。

结束语

在许多方面,机器学习给公众的感觉就像是荒野西部。类似 GPT-2 这样的超级模型才刚出现不久,机器学习刚刚被工程师广泛使用,而不仅仅局限在大公司。而且,模型架构方面的新突破也指日可待。

我们已经目睹了机器学习与每一个垂直领域的结合,包括媒体、金融、零售等。随着机器学习成为软件的标准组成部分,在生产中部署大型模型将不再是挑战。