案例研究:使用 Hugging Face Infinity 和现代 CPU 实现毫秒级延迟
我们的开源优化库,🤗 Optimum Intel 和 🤗 Optimum ONNX Runtime,可实现训练和运行推理模型的最高效率。
Hugging Face
,一项商业服务,Hugging Face 专家将直接与您的团队合作,加速您的机器学习路线图和模型。
引言
迁移学习通过在自然语言处理 (NLP) 到音频和计算机视觉任务中达到新的准确性水平,改变了机器学习。在 Hugging Face,我们努力使这些新的复杂模型和大型检查点尽可能易于访问和使用。但是,尽管研究人员和数据科学家已经转向了 Transformers 的新世界,但很少有公司能够大规模部署这些大型、复杂的模型用于生产。
主要瓶颈是预测延迟,这会使大型部署的运行成本高昂,并使实时用例不切实际。解决这个问题对任何机器学习工程团队来说都是一个困难的工程挑战,并且需要使用先进的技术来优化模型,直至硬件级别。
通过 Hugging Face Infinity,我们提供了一个容器化解决方案,可以轻松部署适用于最流行的 Transformer 模型的低延迟、高吞吐量、硬件加速的推理管道。公司可以同时获得 Transformer 的准确性和大规模部署所需的效率,所有这些都封装在一个易于使用的包中。在这篇博客文章中,我们希望分享 Infinity 在最新一代 Intel Xeon CPU 上运行的详细性能结果,以实现 Transformer 部署的最佳成本、效率和延迟。
什么是 Hugging Face Infinity
Hugging Face Infinity 是一种容器化解决方案,供客户在任何基础设施上部署最先进 Transformer 模型的端到端优化推理管道。
Hugging Face Infinity 由 2 个主要服务组成
- Infinity Container 是一种硬件优化的推理解决方案,作为 Docker 容器提供。
- Infinity Multiverse 是一种模型优化服务,通过它,Hugging Face Transformer 模型针对目标硬件进行优化。Infinity Multiverse 与 Infinity Container 兼容。
Infinity Container 专为在目标硬件架构上运行而构建,并公开 HTTP /predict 端点以运行推理。
一个 Infinity Container 设计用于服务 1 个模型和 1 个任务。任务对应于 Transformers Pipelines 文档中定义的机器学习任务。截至本文撰写之时,支持的任务包括特征提取/文档嵌入、排序、序列分类和令牌分类。
您可以在 hf.co/infinity 上找到有关 Hugging Face Infinity 的更多信息,如果您有兴趣亲自测试,可以在 hf.co/infinity-trial 注册免费试用。
基准测试
推理性能基准测试通常只衡量模型的执行。在这篇博客文章中,以及在讨论 Infinity 的性能时,我们总是衡量包括预处理、预测和后处理在内的端到端管道。在将这些结果与其他延迟测量进行比较时,请记住这一点。
环境
作为基准测试环境,我们将使用 Amazon EC2 C6i 实例,这些是计算优化实例,由第三代 Intel Xeon Scalable 处理器提供支持。这些新的基于 Intel 的实例使用 Ice-lake 处理器技术,并支持 Intel AVX-512、Intel Turbo Boost 和 Intel Deep Learning Boost。
除了在机器学习工作负载方面具有卓越性能外,Intel Ice Lake C6i 实例还具有出色的成本性能,是我们建议在 Amazon Web Services 上部署 Infinity 的最佳选择。要了解更多信息,请访问 EC2 C6i 实例页面。
方法
在对类 BERT 模型进行基准测试时,最常采用两个指标
- 延迟:模型单次预测所需的时间(预处理、预测、后处理)
- 吞吐量:在固定时间内为一种基准测试配置执行的次数,同时考虑物理 CPU 核心数、序列长度和批大小
这两个指标将用于在不同设置下对 Hugging Face Infinity 进行基准测试,以了解本博客文章中的优势和权衡。
结果
为了运行基准测试,我们为 EC2 C6i 实例(Ice-lake)创建了一个 infinity 容器,并使用 Infinity Multiverse 优化了一个用于序列分类的 DistilBERT 模型。
这个针对 Ice-lake 优化的 Infinity 容器比现有基于 Cascade-lake 的实例可实现高达 34% 的延迟和吞吐量提升,并且比在 Ice-lake 上运行的普通 Transformer 可实现高达 800% 的延迟和吞吐量提升。
我们创建的基准测试包含 192 种不同的实验和配置。我们对以下内容进行了实验:
- 物理 CPU 核心数:1、2、4、8
- 序列长度:8、16、32、64、128、256、384、512
- 批处理大小:1、2、4、8、16、32
在每个实验中,我们收集以下数据:
- 吞吐量(每秒请求数)
- 延迟(最小值、最大值、平均值、P90、P95、P99)
您可以在此 Google 表格中找到基准测试的完整数据:🤗 Infinity:CPU Ice-Lake 基准测试。
在这篇博客文章中,我们将重点介绍基准测试的一些结果,包括最佳延迟和吞吐量配置。
除此之外,我们还将在两个物理核心上部署了我们用于基准测试的 DistilBERT 模型作为 API 端点。您可以测试它并感受一下 Infinity 的性能。下面您将找到如何向托管端点发送请求的 curl
命令。API 返回一个 x-compute-time
HTTP 头部,其中包含端到端管道的持续时间。
curl --request POST `-i` \
--url https://infinity.huggingface.co/cpu/distilbert-base-uncased-emotion \
--header 'Content-Type: application/json' \
--data '{"inputs":"I like you. I love you"}'
吞吐量
下面您将看到在 2 个物理核心上以批量大小 1 运行 Infinity 与普通 Transformer 的吞吐量比较。
序列长度 | 无限 | 变压器 | 改进 |
---|---|---|---|
8 | 248 请求/秒 | 49 请求/秒 | +506% |
16 | 212 请求/秒 | 50 请求/秒 | +424% |
32 | 150 请求/秒 | 40 请求/秒 | +375% |
64 | 97 请求/秒 | 28 请求/秒 | +346% |
128 | 55 请求/秒 | 18 请求/秒 | +305% |
256 | 27 请求/秒 | 9 请求/秒 | +300% |
384 | 17 请求/秒 | 5 请求/秒 | +340% |
512 | 12 请求/秒 | 4 请求/秒 | +300% |
延迟
下面是 Hugging Face Infinity 在 2 个物理核心上以批量大小 1 运行的实验的延迟结果。Infinity 的鲁棒性和稳定性令人瞩目,p95、p99 或 p100(最大延迟)的偏差极小。这一结果也在基准测试中的其他实验中得到证实。
结论
在这篇文章中,我们展示了 Hugging Face Infinity 在新型 Intel Ice Lake Xeon CPU 上的表现。我们创建了一个包含 190 多种不同配置的详细基准测试,分享了在使用 Hugging Face Infinity on CPU 时可以预期的结果,以及优化您的 Infinity Container 以获得最佳延迟和最大化吞吐量的最佳配置。
与普通的 Transformer 相比,Hugging Face Infinity 可以提供高达 800% 的吞吐量提升,并且对于最长 64 个令牌的序列长度,延迟可低至 1-4 毫秒。
Transformer 模型在吞吐量、延迟或两者兼顾方面的灵活优化能力,使企业能够为相同的工作负载减少基础设施成本,或者实现以前不可能实现的实时用例。
如果您有兴趣试用 Hugging Face Infinity,请在 hf.co/infinity-trial 注册免费试用。