如何成功将 API 客户的 transformer 模型推理速度加快 100 倍
Transformers 已成为世界各地数据科学家用以探索最先进 NLP 模型、构建新 NLP 模块的默认库。它拥有超过 5000 个预训练和微调的模型,支持 250 多种语言,任君取用。无论你使用哪种框架,都能用得上它。
虽然在 Transformers 中试验模型很容易,但以最高性能将这些大模型部署到生产中,并将它们用可扩展的架构管理起来,对于任何机器学习工程师来说都是一个 艰巨的工程挑战。
100 倍性能提升及内置可扩展性是用户选择在我们托管的 Accelerated Inference API 基础上构建自己的 NLP 模块的原因。尤其是为了实现 最后那 10 倍性能 提升,我们需要进行底层的、特定于模型且特定于目标硬件的优化。
本文分享了我们为用户充分榨干每一滴计算资源所使用的一些方法。
获取首个 10 倍加速
优化之旅的第一站相对来讲是最容易的,主要涉及到 Hugging Face 库 提供的所有平台无关的优化技术。
我们在 Hugging Face 模型的 流水线 (pipeline ) 中集成了能有效减少每次前向传播计算量的最佳方法。这些方法因模型架构和目标任务不同而不同,例如,对基于 GPT 架构的模型的文本生成任务,我们通过缓存过去时刻的注意力矩阵,而仅计算每一轮中最后一个新词元的注意力,来减小参与计算的注意力矩阵的维度:
| - | 原始版 | 优化版 |
|---|---|---|
| - | ![]() |
![]() |
分词常常成为推理效率的瓶颈。我们在 Tokenizers 库中实现了高效的算法,用 Rust 来实现模型分词器并与智能缓存技术相结合,获得了高达 10 倍的端到端延迟加速。
利用 Hugging Face 库的最新功能,在相同的模型及硬件上,与开箱即用的部署相比,我们稳定达到了 10 倍加速。由于 Transformer 和 Tokenizer 通常每月都会发版,因此我们的 API 客户无需不断适配新的优化,即可让自己的模型越跑越快。
为了胜利而编译: 10 倍加速硬核技术
现在到真正棘手的地方了。为了获得最佳性能,我们需要修改模型并针对特定硬件进行编译以优化推理速度。选择什么硬件取决于模型 (内存大小) 和需求情况 (对请求进行组批)。即使是使用相同的模型来进行预测,一些 API 客户可能会更受益于 CPU 推理加速,而其他客户可能会更受益于 GPU 推理加速,而每种硬件会涉及不同的优化技术以及库。
一旦为针对应用场景选定计算平台,我们就可以开始工作了。以下是一些可应用于静态图的针对 CPU 的优化技术:
- 图优化 (删除无用节点和边)
- 层融合 (使用特定的 CPU 算子)
- 量化
使用开源库中的开箱即用功能 (例如 Transformers 结合 ONNX Runtime) 很难得到最佳的结果,或者会有明显的准确率损失,特别是在使用量化方法时。没有什么灵丹妙药,每个模型架构的最佳优化方案都不同。但深入研究 Transformers 代码和 ONNX Runtime 文档,星图即会显现,我们就能够组合出适合目标模型和硬件的额外的 10 倍加速方案。
不公平的优势
从 NLP 起家的 Transformer 架构是机器学习性能的决定性转折点,在过去 3 年中,自然语言理解和生成的进展急剧加快,同时水涨船高的是模型的平均大小,从 BERT 的 110M 参数到现在 GPT-3 的 175B 参数。
这种趋势给机器学习工程师将最新模型部署到生产中带来了严峻的挑战。虽然 100 倍加速是一个很高的标准,但惟有这样才能满足消费级应用对实时性的需求。
为了达到这个标准,作为 Hugging Face 的机器学习工程师,我们与 Transformers 和 Tokenizers 维护人员 相邻而坐,相对其他机器学习工程师而言当然拥有不公平的优势。更幸运的是,通过与英特尔、英伟达、高通、亚马逊和微软等硬件及云供应商的开源合作建立起的广泛合作伙伴关系,我们还能够使用最新的硬件优化技术来优化我们的模型及基础设施。
如果你想感受我们基础设施的速度,可以 免费试用 一下,我们也会与你联系。
如果你想在自己的基础设施实施我们的推理优化,请加入我们的 专家加速计划。
英文原文: https://hf.co/blog/accelerated-inference
原文作者: Hugging Face
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。
审校/排版: zhongdongy (阿东)
如何成功将 API 客户的 transformer 模型推理速度加快 100 倍的更多相关文章
- Tensorflow object detection API 搭建物体识别模型(四)
四.模型测试 1)下载文件 在已经阅读并且实践过前3篇文章的情况下,读者会有一些文件夹.因为每个读者的实际操作不同,则文件夹中的内容不同.为了保持本篇文章的独立性,制作了可以独立运行的文件夹目标检测. ...
- Tensorflow object detection API 搭建物体识别模型(一)
一.开发环境 1)python3.5 2)tensorflow1.12.0 3)Tensorflow object detection API :https://github.com/tensorfl ...
- Tensorflow object detection API 搭建物体识别模型(二)
二.数据准备 1)下载图片 图片来源于ImageNet中的鲤鱼分类,下载地址:https://pan.baidu.com/s/1Ry0ywIXVInGxeHi3uu608g 提取码: wib3 在桌面 ...
- Transformer模型总结
Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行. 它是由编码组件.解码组件和它们之间的连接组成. 编码组件部分由一堆编码器(6个 enco ...
- 大规模 Transformer 模型 8 比特矩阵乘简介 - 基于 Hugging Face Transformers、Accelerate 以及 bitsandbytes
引言 语言模型一直在变大.截至撰写本文时,PaLM 有 5400 亿参数,OPT.GPT-3 和 BLOOM 有大约 1760 亿参数,而且我们仍在继续朝着更大的模型发展.下图总结了最近的一些语言模型 ...
- 细说 Web API参数绑定和模型绑定
今天跟大家分享下在Asp.NET Web API中Controller是如何解析从客户端传递过来的数据,然后赋值给Controller的参数的,也就是参数绑定和模型绑定. Web API参数绑定就是简 ...
- 文本分类实战(八)—— Transformer模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- 详解Transformer模型(Atention is all you need)
1 概述 在介绍Transformer模型之前,先来回顾Encoder-Decoder中的Attention.其实质上就是Encoder中隐层输出的加权和,公式如下: 将Attention机制从Enc ...
- Tensorflow object detection API 搭建物体识别模型(三)
三.模型训练 1)错误一: 在桌面的目标检测文件夹中打开cmd,即在路径中输入cmd后按Enter键运行.在cmd中运行命令: python /your_path/models-master/rese ...
- 客户续费模型 逻辑回归 分类器 AdaBoost
客户续费模型 逻辑回归 分类器 AdaBoost
随机推荐
- day09-SpringCloud Sleuth+Zipkin-链路追踪
SpringCloud Sleuth+Zipkin-链路追踪 官网:spring-cloud/spring-cloud-sleuth: Distributed tracing for spring c ...
- mysql和neo4j集成多数据源和事务
在微服务大行其道的今天,按理说不应该有多数据源这种问题(嗯,主从库算是一个多数据源的很常见的场景.),但是也没人规定不能这样做. 就算有人规定的,曾经被奉为圭臬的数据库三大范式现在被宽表冲得七零八落, ...
- 使用TensorFlow进行自动化测试与部署
目录 标题:<使用 TensorFlow 进行自动化测试与部署> 背景介绍: 随着人工智能和机器学习技术的快速发展,TensorFlow 成为了一个广泛应用的深度学习框架,被广泛用于构建神 ...
- 2023-06-29:redis中什么是热点Key?该如何解决?
2023-06-29:redis中什么是热点Key?该如何解决? 答案2023-06-29: 在Redis中,经常被访问的key被称为热点key. 产生原因和危害 原因 热点key问题产生的原因可以归 ...
- JavaScript 整理的基础的方法
innerHTML //innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML. innertext//innerText 属性返回文本值 没有结构信息 $("#test& ...
- 一次oracle行级锁导致的问题
分析问题:我在plsql/developer是用的system用户连接的数据库,而在crt用 sqlplus / as sysdba 连接数据库,是sys用户.现在在plsql/developer ...
- C++面试八股文:如何实现一个strncpy函数?
某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官:strcpy函数使用过吧? 二师兄:用过. 面试官:这个函数有什么作用? 二师兄:主要用做字符串复制,将于字符从一个位置复制到另一 ...
- 使用C#编写.NET分析器(三)
译者注 这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断).IDE.诊断 ...
- Java开发大型互联网-架构师必须掌握的分布式技术
Java开发大型互联网-架构师必须掌握的分布式技术 摘要:在当今互联网行业,随着用户量和业务的不断增长,大型互联网系统的设计和开发已经成为了一项头等重要的任务.作为架构师,要能够应对这样的挑战,就必须 ...
- 2023ccpc大学生程序设计竞赛-zzh
比赛开始没有开到签到题,看了一会别的题才开始跟榜.A题我写的,不过没有考虑到S长度为1的情况,wa了一次.然后lhy和zx把F题做了出来.接着他俩去看H,我去看B.他俩把H过了,B我想出了一个n*根n ...

