DeepSpeed-MII:在24,000+开源DL模型上实现即时加速,推理成本降低高达40倍

Text Generation Models

深度学习 (DL) 开源社区在过去几个月里取得了巨大的发展。诸如 Bloom 176B 这样极其强大的文本生成模型,或 Stable Diffusion 这样的图像生成模型,现在通过 Hugging Face 等平台,任何拥有少量甚至单个 GPU 的人都可以使用。虽然开源使 AI 能力的获取变得民主化,但其应用仍受到两个关键因素的限制:1) 推理延迟和 2) 成本。

在 DL 模型推理的系统优化方面取得了显著进展,可以大幅降低延迟和成本,但这些优化并不容易获取。造成这种可访问性受限的主要原因是 DL 模型推理领域的多样性,模型在大小、架构、系统性能特征、硬件要求等方面各不相同。识别适用于给定模型的适当系统优化集并正确应用它们,往往超出了大多数数据科学家的能力范围,使得低延迟和低成本推理在很大程度上难以实现。

DeepSpeed 模型推理实现 (MII) 是 DeepSpeed 发布的一个新的开源 Python 库,旨在使强大模型的低延迟、低成本推理不仅可行,而且易于获取。

  • MII 提供了对数千个广泛使用的 DL 模型的高度优化实现的访问。
  • 与原始实现相比,MII 支持的模型实现了显著更低的延迟和成本。
    • MII 将 Big-Science Bloom 176B 模型的延迟降低了 5.7 倍,同时将成本降低了 40 倍以上,如图 2 (左) 和图 8 所示
    • MII 将部署 Stable Diffusion 的延迟和成本降低了 1.9 倍,如图 2 (右) 所示
  • 为了实现低延迟/成本推理,MII 利用了 DeepSpeed-Inference 的大量优化,例如用于 Transformer 的 deepfusion、用于多 GPU 推理的自动化 tensor-slicing、使用 ZeroQuant 进行即时量化,以及其他多项优化(详情请见下文)。
  • 凭借最先进的性能,MII 仅需几行代码即可在本地和通过 AML 在 Azure 上低成本部署这些模型。

MII 如何工作?

Text Generation Models

图 1:MII 架构图,展示了 MII 如何自动使用 DS-Inference 优化 OSS 模型,然后通过 GRPC 部署到本地,或通过 AML Inference 部署到 Microsoft Azure。

MII 的底层由 DeepSpeed-Inference 提供支持。根据模型类型、模型大小、批处理大小和可用硬件资源,MII 会自动应用 DeepSpeed-Inference 中适当的系统优化集,以最小化延迟并最大化吞吐量。它通过使用众多预设模型注入策略之一来实现这一点,该策略允许 MII 和 DeepSpeed-Inference 识别底层 PyTorch 模型架构并将其替换为优化实现(参见图 1)。通过这样做,MII 使 DeepSpeed-Inference 中广泛的优化自动可用于其支持的数千个流行模型。

支持的模型和任务

MII 支持越来越多的任务,例如文本生成、问答、文本分类等,涵盖通过 Hugging Face、FairSeq、EluetherAI 等多个开源模型仓库提供的数千种 Transformer 模型。它支持基于 BERT、RoBERTa、GPT、OPT 和 BLOOM 架构的密集模型,其大小从数亿参数到数百亿参数不等。同时,它还支持最新的图像生成模型,例如 Stable Diffusion。

有关 MII 支持的模型和任务的最新列表,请参阅 MII GitHub 仓库。

使用 MII 进行推理优化

这里我们总结了通过 MII 提供的 DeepSpeed-inference 的广泛优化集。有关更多详细信息,请参阅 [1, 2]

Transformer 的 DeepFusion: 对于基于 Transformer 的模型,如 Bert、Roberta、GPT-2 和 GPT-J,MII 利用 DeepSpeed-Inference 中的 Transformer 内核,这些内核经过优化,可在小批处理大小下实现低延迟,在大批处理大小下使用 DeepFusion 实现高吞吐量。

使用张量切片的多 GPU 推理: 对于像 Bloom 176B 这样的大型模型,MII 会自动启用节点内的张量并行,以利用多个 GPU 的聚合内存带宽和计算能力,从而实现比目前任何其他可用方案更低的延迟和更高的吞吐量。

使用 ZeroQuant 的 INT8 推理: 对于具有数百亿或数千亿参数的大型模型,MII 支持使用 ZeroQuant 的 INT8 推理。使用此功能不仅可以减少内存占用和推理所需的 GPU 数量,还可以通过支持更大的批处理大小和使用 INT8 计算来提高推理吞吐量,从而与 FP16 相比降低成本。

针对资源受限系统的 ZeRO-Inference: 像 Bloom 176B 这样的模型,即使有 INT8 支持,也需要超过 176 GB 的内存才能容纳模型本身。在缺乏部署此类模型所需的多个 GPU 的聚合 GPU 内存的情况下,MII 启用了 ZeRO-Inference,该功能可以利用系统 CPU 内存,仅用一个内存有限的 GPU 来部署这些大型模型。

编译器优化: 在适用情况下,除了上述优化之外,MII 还会自动通过 TorchScriptnvFuserCUDA graph 应用基于编译器的优化,以进一步降低延迟并提高吞吐量。

MII-Public 和 MII-Azure

MII 可以与 DeepSpeed-Inference 的两种变体协同工作。第一种,称为 ds-public,包含上述大多数优化,也可通过我们的开源 DeepSpeed 库获取。第二种,称为 ds-azure,与 Azure 集成更紧密,并通过 MII 提供给所有 Microsoft Azure 客户。我们将运行这两种 DeepSpeed-Inference 变体的 MII 分别称为 MII-Public 和 MII-Azure。

与开源 PyTorch 实现 (基线) 相比,MII-Public 和 MII-Azure 都提供了显著的延迟和成本降低。然而,对于某些生成式工作负载,它们可能具有差异化的性能:MII-Azure 提供了超越 MII-Public 的进一步改进。我们将在下一节中量化这两种变体的延迟和成本降低。

量化延迟和成本降低

推理工作负载可以是延迟敏感型,其主要目标是最小化延迟;也可以是成本敏感型,其主要目标是最小化成本。在本节中,我们量化了在延迟敏感型和成本敏感型场景中使用 MII 的好处。

延迟关键场景

对于通常使用小批处理大小(1)的延迟敏感场景,MII 可以将各种开源模型在多个任务上的延迟降低多达 6 倍。更具体地说,我们展示了模型延迟降低情况1

  1. 对于使用大型模型(如 Big Science Bloom、Facebook OPT 和 EluetherAI NeoX)进行文本生成的多 GPU 推理,速度提升高达 5.7 倍(图 2 (左)

  2. 使用 Stable Diffusion 进行图像生成任务时,速度提升高达 1.9 倍(图 2 (右)

  3. 对于基于 OPT、BLOOM 和 GPT 架构的相对较小的文本生成模型(多达 7B 参数),在单个 GPU 上运行时,速度提升高达 3 倍(图 3 和图 4

  4. 使用基于 RoBERTa 和 BERT 的模型进行各种文本表示任务(如完形填空、文本分类、问答和 token 分类)时,速度提升高达 9 倍(图 5 和图 6)。

multi gpu latency 图 2:(左)大型模型的最佳可实现延迟。MII-Azure (int8) 比基线对于 Bloom-176B 提供 5.7 倍的更低延迟。(右)Stable Diffusion 文本到图像生成延迟比较。

OPT and BLOOM Models 图 3:OPT 和 BLOOM 模型的延迟比较。MII-Azure 比基线快 2.8 倍。

GPT Models 图 4:GPT 模型的延迟比较。MII-Azure 比基线快 3 倍。

Roberta Models 图 5:RoBERTa 模型的延迟比较。在多个任务和 RoBERTa 变体上,MII 提供了高达 9 倍的模型延迟降低和高达 3 倍的端到端延迟降低1

Bert Models 图 6:BERT 模型的延迟比较。MII 在多个任务和 BERT 变体上提供了高达 8.9 倍的模型延迟降低和高达 4.5 倍的端到端延迟降低1

成本敏感场景

MII 可以显著降低 Bloom、OPT 等非常昂贵的语言模型的推理成本。为了获得最低成本,我们使用较大的批处理大小,以最大化基线和 MII 的吞吐量。这里我们使用两种不同的指标来衡量 MII 的成本降低:i) 每 GPU 每秒生成的 token 数,和 ii) 每百万 token 生成的美元成本。

图 7 和图 8 显示,与基线相比,MII-Public 的吞吐量分别提高了 10 倍以上,成本也降低了 10 倍以上。此外,MII-Azure 的吞吐量和成本比基线提高了 30 倍以上。

tput large models 图 7:大型模型每 A100-80GB GPU 的吞吐量比较。MII-Public 提供了超过 15 倍的吞吐量提升,而 MII-Azure 提供了超过 40 倍的吞吐量提升。

azure cost 图 8:在 Azure 上生成 100 万个 token 的成本(针对不同模型类型)。MII-Azure 将生成成本降低了 40 倍以上。

部署选项

MII 支持的模型可以通过两种不同的方式部署,如图 1 所示,只需几行代码。

MII-Public 部署

MII-Public 可以部署在本地或任何云产品上。MII 创建一个轻量级的 GRPC 服务器来支持这种部署形式,并提供一个 GRPC 推理端点用于查询。以下代码展示了如何使用 MII-Public 部署受支持的模型。

import mii
mii.deploy(task="text-to-image",
           model="CompVis/stable-diffusion-v1-4",
           deployment_name="sd-deployment")

MII-Azure 部署

MII 支持通过 AML Inference 在 Azure 上部署。为此,MII 为给定模型生成 AML 部署资产,这些资产可以使用 Azure-CLI 进行部署,如以下代码所示。此外,在 Azure 上部署允许 MII 利用 DeepSpeed-Azure 作为其优化后端,这比 DeepSpeed-Public 提供了更好的延迟和成本降低。

import mii
mii.deploy(task="text-to-image",
           model="CompVis/stable-diffusion-v1-4",
           deployment_name="sd-deployment",
           deployment_type=DeploymentType.AML)

要了解有关这些部署选项的更多信息并开始使用 MII,请参阅 MII 入门指南

总结

我们非常高兴能与社区分享 MII,并期待根据您的反馈进行改进。我们将继续在 MII 中增加对更多模型的支持,并增强 MII-Public 和 MII-Azure,以服务于本地和 Azure 用户。我们希望,尽管开源已经使强大的 AI 能力被许多人所获取,MII 将通过即时降低推理延迟和成本,使这些能力更广泛地融入到各种应用和产品中。

附录

下表显示了图 3、4、5 和 6 中使用的模型别名与实际模型名称之间的映射。

别名 模型名称
text-gen-m1 sberbank-ai/rugpt3large_based_on_gpt2
text-gen-m2 skt/kogpt2-base-v2
text-gen-m3 geralt/MechDistilGPT2
text-gen-m4 mrm8488/distilgpt2-finetuned-wsb-tweets
text-gen-m5 Norod78/hebrew-bad_wiki-gpt_neo-tiny
text-gen-m6 shibing624/code-autocomplete-distilgpt2-python
text-gen-m7 mrm8488/diltilgpt2-finetuned-bookcopus-10
bert-q&a-m1 bert-large-uncased-whole-word-masking-finetuned-squad
bert-q&a-m2 deepset/bert-large-uncased-whole-word-masking-squad2
bert-q&a-m3 nyust-eb210/braslab-bert-drcd-384
bert-q&a-m4 deepset/minilm-uncased-squad2
bert-token-class-m1 dslim/bert-large-NER
bert-token-class-m2 dbmdz/bert-large-cased-finetuned-conll03-english
bert-token-class-m3 dslim/bert-base-NER
bert-token-class-m4 CAMeL-Lab/bert-base-arabic-camelbert-mix-ner
bert-fill-mask-m1 bert-base-multilingual-cased
bert-fill-mask-m2 bert-base-multilingual-uncased
bert-fill-mask-m3 wietsedv/bert-base-dutch-cased
bert-fill-mask-m4 nlpaueb/bert-base-greek-uncased-v1
bert-fill-mask-m5 dbmdz/bert-base-italian-xxl-cased
bert-fill-mask-m6 aubmindlab/bert-base-arabertv02
bert-fill-mask-m7 dccuchile/bert-base-spanish-wwm-uncased
bert-fill-mask-m8 bert-base-german-cased
bert-fill-mask-m9 bert-base-uncased
bert-fill-mask-m10 dbmdz/bert-base-german-cased
bert-fill-mask-m11 nlpaueb/legal-bert-base-uncased
bert-fill-mask-m12 KB/bert-base-swedish-cased
bert-fill-mask-m13 indolem/indobertweet-base-uncased
bert-fill-mask-m14 emilyalsentzer/Bio_ClinicalBERT
bert-fill-mask-m15 asafaya/bert-mini-arabic
bert-text-class-m1 DTAI-KULeuven/mbert-corona-tweets-belgium-topics
bert-text-class-m2 avichr/heBERT_sentiment_analysis
bert-text-class-m3 finiteautomata/beto-sentiment-analysis
bert-text-class-m4 ProsusAI/finbert
bert-text-class-m5 cross-encoder/ms-marco-MiniLM-L-12-v2
bert-text-class-m6 nlptown/bert-base-multilingual-uncased-sentiment
bert-text-class-m7 microsoft/xtremedistil-l6-h256-uncased
bert-text-class-m8 cross-encoder/ms-marco-MiniLM-L-6-v2
fill-mask-m1 vinai/bertweet-large
fill-mask-m2 klue/roberta-large
fill-mask-m3 sberbank-ai/ruRoberta-large
q&a-m1 deepset/roberta-large-squad2
token-class-m1 Jean-Baptiste/roberta-large-ner-english
text-class-m1 cross-encoder/stsb-roberta-large
text-class-m2 siebert/sentiment-roberta-large-english
text-class-m3 roberta-large-mnli
fill-mask-m4 vinai/bertweet-base
fill-mask-m5 vinai/phobert-base
fill-mask-m6 microsoft/graphcodebert-base
fill-mask-m7 vinai/bertweet-covid19-base-uncased
fill-mask-m8 uklfr/gottbert-base
fill-mask-m9 cardiffnlp/twitter-roberta-base
fill-mask-m10 microsoft/codebert-base-mlm
fill-mask-m11 pdelobelle/robbert-v2-dutch-base
fill-mask-m12 ufal/robeczech-base
q&a-m2 Rakib/roberta-base-on-cuad
q&a-m3 thatdramebaazguy/roberta-base-squad
text-class-m4 roberta-base-openai-detector
text-class-m5 pysentimiento/robertuito-emotion-analysis
text-class-m6 cardiffnlp/twitter-roberta-base-sentiment
text-class-m7 cardiffnlp/twitter-roberta-base-sentiment-latest
q&a-m4 deepset/roberta-base-squad2
text-class-m8 textattack/roberta-base-SST-2
text-class-m9 cardiffnlp/twitter-roberta-base-emotion
text-class-m10 pysentimiento/robertuito-sentiment-analysis
text-class-m11 finiteautomata/bertweet-base-sentiment-analysis
fill-mask-m13 huggingface/CodeBERTa-small-v1
q&a-m5 deepset/tinyroberta-squad2
text-class-m12 j-hartmann/emotion-english-distilroberta-base
  1. 推理工作负载的端到端延迟由两个部分组成:i) 实际模型执行,和 ii) 模型执行前后的预处理/后处理。MII 优化了实际模型执行,但将预处理/后处理流水线留待未来的优化。我们注意到文本表示任务具有显著的预处理/后处理开销(图 G 和 H)。我们计划在未来的更新中解决这些问题。  2 3

更新日期: