DeepSpeed-MII:24,000+ 开源 DL 模型的即时加速,推断成本降低高达 40 倍

Text Generation Models

深度学习 (DL) 开源社区在过去几个月里取得了巨大发展。像 Bloom 176B 这样的功能强大的文本生成模型,或像 Stable Diffusion 这样的图像生成模型,现在任何拥有少量甚至单个 GPU 的人都可以通过 Hugging Face 等平台获得。虽然开源使人们能够使用 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 推断的自动张量切片、使用ZeroQuant 的即时量化以及其他一些优化(有关更多详细信息,请参见下文)。
  • 凭借最先进的性能,MII 支持以几行代码的形式在本地和 Azure 上通过 AML 部署这些模型,以实现低成本部署。

MII 如何工作?

Text Generation Models

图 1:MII 架构,展示了 MII 如何在使用 AML 推断在 Microsoft Azure 上部署之前,使用 DS-Inference 自动优化 OSS 模型,并在本地使用 GRPC 部署它们。

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 GitHub 仓库,了解MII 支持的模型和任务的最新列表。

使用 MII 进行推断优化

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

用于 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 图 应用基于编译器的优化,除了上述优化之外,还可以进一步降低延迟并提高吞吐量。

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 架构的相对较小的文本生成模型(最多 70 亿个参数),在单个 GPU 上运行,最高可降低 3 倍(图 3 和 4)。

  4. 对于使用 RoBERTa 和 BERT 基模型进行各种文本表示任务(如填空、文本分类、问答和标记分类),最高可降低 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 模型的延迟对比。在多个任务和 BERT 变体上,MII 的模型延迟比基准低 8.9 倍,端到端延迟比基准低 4.5 倍1

成本敏感场景

MII 可以显著降低像 Bloom、OPT 等非常昂贵的语言模型的推断成本。为了获得最低的成本,我们使用大批次大小,以最大化基准和 MII 的吞吐量。在这里,我们使用两个不同的指标来观察 MII 的成本降低:i) 每秒每 GPU 生成的标记数,以及 ii) 每百万个生成标记的美元成本。

图 7 和 8显示,MII-Public 的吞吐量提高了 10 倍以上,成本降低了 10 倍以上,而 MII-Azure 的吞吐量提高了 30 倍以上,成本降低了 30 倍以上。

tput large models 图 7:每个 A100-80GB GPU 的大型模型吞吐量对比。MII-Public 的吞吐量提高了 15 倍以上,而 MII-Azure 的吞吐量提高了 40 倍以上。

azure cost 图 8:在 Azure 上使用不同模型类型生成 100 万个标记的成本。MII-Azure 将生成成本降低了 40 倍以上。

部署选项

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

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 推理在 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

更新: