NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 2020-02-24
  • 本文字数:2820 字

    阅读完需:约 9 分钟

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

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


本文最初发布在 TowardsDataScience 博客,经原作者 Caleb Kaise r 授权,InfoQ 中文站翻译并分享。


对于 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 这样的超级模型才刚出现不久,机器学习刚刚被工程师广泛使用,而不仅仅局限在大公司。而且,模型架构方面的新突破也指日可待。


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


作者介绍:


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


原文链接:《Too big to deploy: How GPT-2 is breaking servers》


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-02-24 13:304071
用户头像
赵钰莹 InfoQ 主编

发布了 875 篇内容, 共 605.3 次阅读, 收获喜欢 2671 次。

关注

评论

发布
暂无评论
发现更多内容

使用 Python 和 SudachiPy 进行日语分词

Roc

Python 日语 分词

OBS推流学习笔记

IT蜗壳-Tango

直播 OBS 推流 B站直播

一个前端的 Windows10 开发环境

Gadzan

大前端 windows Windows Terminal 环境安装 开发工具

企业也有中年危机?探讨数字化与永续经营

FinClip

数字化转型 小程序生态

平台化服务的基石:用户认证模型设计

孤岛旭日

企业架构 模型 用户权限

ansible-playbook中when结合tags使用,实现变量控制执行

唯爱

redis数据结构介绍四-第四部分 压缩表

Nick

redis 源码 数据结构 源码分析 算法

ARTS-weekly-31

落英坠露

ARTS 打卡计划

JUC整理笔记三之测试工具jcstress

JFound

Java

Kubernetes in action 笔记

FeiLong

Kubernetes 容器

Java 异步编程:从 Future 到 Loom

理帆

Java 并发编程 kotlin Netty

Git数据传输模型及常用命令整理

王坤祥

git git flow

2020全球首创币期权DAPP智能合约强势来袭,闪耀数字经济

极客编

ARTS week 1

时之虫

ARTS 打卡计划

KubeFATE 部署多集群联邦学习平台 FATE

亨利笔记

学习 Kubernetes FATE KUBEFATE

redis数据结构介绍六 快表

Nick

redis 源码 数据结构 源码分析 算法

使用 Python 分析 Google Calender 日程

Roc

Python 总结 日历

教师节H5案例制作思路分享

喵喵侠

大前端 H5游戏

使用 Markdown 制作五线谱

Roc

GitHub markdown 五线谱

财富的大门给我开了一条缝

YoungZY

读书笔记 读书

阅读对写作的好处

董一凡

写作

微信推文无缝滚动是这样炼成的

喵喵侠

微信 大前端 微信公众号 微信推文 图文混排

Windows10 如何正确修改本地用户的名称及目录

喵喵侠

windows Windows 10 电脑故障 Windows技巧

在 Go 中使用并发编程 - 第二部分

TuringTuring

并发编程 协程 线程模型 Go 语言

写给产品经理的信(4):你一定要做产品经理么?

punkboy

生涯规划 产品 程序人生 产品经理 职业规划

数据与广告系列三:合约广告与与衍生的第三方广告数据监控

黄崇远@数据虫巢

数据挖掘 互联网 广告 移动互联网

学慢点儿,想深点儿

熊斌

学习

【译】并不存在的普通用户(面向极端用户的设计)

Yukun

设计思维 可用性

redis数据结构介绍五-第五部分 对象

Nick

redis 源码 数据结构 源码分析 算法

RocketMQ - 如何实现顺序消息

Java收录阁

RocketMQ

[JVM] String#intern 面试必会

猴哥一一 cium

Java JVM string pool string Java 25 周年

机器学习模型越来越大,开发者应该如何部署?_AI&大模型_Caleb Kaiser_InfoQ精选文章