Skip to content

在 DeepSpeed 的支持下,MII 使低延迟和高吞吐量推理成为可能。

License

Notifications You must be signed in to change notification settings

yuanxiaoming8899/DeepSpeed-MII

 
 

Repository files navigation

格式化 NV-V100-旧版 NV-A6000-fastgen 许可证 Apache 2.0 PyPI版本

最新消息

内容

DeepSpeed 推理模型实现 (MII)

隆重推出 MII,这是由 DeepSpeed 设计的开源 Python 库,旨在实现强大的模型推理大众化,重点关注高吞吐量、低延迟和成本效益。

  • MII 功能包括阻塞 KV 缓存、连续批处理、动态 SplitFuse、张量并行性和高性能 CUDA 内核,以支持 Llama-2-70B、Mixtral (MoE) 8x7B 和 Phi- 等 LLM 的快速高吞吐量文本生成2. v0.2 的最新更新添加了新的模型系列、性能优化和功能增强。与 vLLM 等领先系统相比,MII 现在的有效吞吐量提高了 2.5 倍。有关详细的性能结果,请参阅我们最新的 DeepSpeed-FastGen 博客DeepSpeed-FastGen 发布博客

关键技术

用于高通量文本生成的 MII

MII 通过使用四项关键技术来提供加速文本生成推理:

  • 阻塞的KV缓存
  • 连续配料
  • 动态分体保险丝
  • 高性能 CUDA 内核

要更深入地了解这些功能,请参阅我们的博客,其中还包括详细的性能分析。

信息产业部遗产

过去,信息产业部针对低时延服务场景推出了多项关键性能优化:

  • 适用于变形金刚的 DeepFusion
  • 使用张量切片进行多 GPU 推理
  • 适用于资源受限系统的 ZeRO 推理
  • 编译器优化

信息产业部如何运作?

图 1:MII 架构,显示 MII 如何在部署 OSS 模型之前使用 DS-Inference 自动优化它们。图中的 DeepSpeed-FastGen 优化已发布在我们的博文中。

MII 的底层由DeepSpeed-Inference提供支持。根据模型架构、模型大小、批量大小和可用硬件资源,MII 自动应用适当的系统优化集,以最小化延迟并最大化吞吐量。

支持型号

MII 目前支持八种流行模型架构中的 20,000 多个模型。我们计划在短期内添加其他模型,如果您希望支持特定的模型架构,请提出问题并告知我们。当前所有模型都利用后端的 Hugging Face 来提供模型权重和模型相应的标记器。对于我们当前的版本,我们支持以下模型架构:

模范家庭 尺寸范围 ~型号数
7B - 180B 300
骆驼 7B - 65B 19,000
骆驼-2 7B - 70B 900
米斯塔拉尔 7B 6,000
混合(教育部) 8x7B 1,100
选择 0.1B - 66B 1,300
phi-2 2.7B 200
曲文 7B - 72B 200

MII 旧模型支持

MII 旧版 API 支持超过 50,000 种不同的模型,包括 BERT、RoBERTa、Stable Diffusion 以及 Bloom、GPT-J 等其他文本生成模型。有关完整列表,请参阅我们的旧版支持模型表

MII 入门

DeepSpeed-MII 允许用户只需几行代码即可为支持的模型创建非持久和持久部署。

安装

最快的入门方法是使用我们的PyPI 版本的 DeepSpeed-MII,这意味着您可以通过以下方式在几分钟内开始使用:

pip install deepspeed-mii

为了易于使用并显着减少许多项目在此领域所需的冗长编译时间,我们通过一个名为DeepSpeed-Kernels的新库分发了一个预编译的 python 轮,涵盖了我们的大多数自定义内核。我们发现该库在具有计算能力 8.0+ (Ampere+)、CUDA 11.6+ 和 Ubuntu 20+ 的 NVIDIA GPU 的环境中非常便携。在大多数情况下,您甚至不需要知道该库的存在,因为它是 DeepSpeed-MII 的依赖项,并将随其一起安装。但是,如果出于某种原因您需要手动编译我们的内核,请参阅我们的高级安装文档

非持久管道

非持久管道是尝试 DeepSpeed-MII 的好方法。非持久管道仅在您运行的 python 脚本期间存在。运行非持久管道部署的完整示例只有 4 行。试一试!

import mii
pipe = mii.pipeline("mistralai/Mistral-7B-v0.1")
response = pipe(["DeepSpeed is", "Seattle is"], max_new_tokens=128)
print(response)

返回的response是对象列表Response。我们可以访问有关该生成的几个详细信息(例如,response[0].prompt_length):

  • generated_text: str模型生成的文本。
  • prompt_length: int原始提示中的标记数。
  • generated_length: int生成的代币数量。
  • finish_reason: str停止生成的原因。stop表示 EOS 代币已生成,length表示代币达到max_new_tokensmax_length

如果要释放设备内存并销毁管道,请使用以下destroy方法:

pipe.destroy()

张量并行性

通过 MII,可以轻松利用多 GPU 系统来提高性能。当使用启动器运行时deepspeed,张量并行度由标志自动控制--num_gpus

# Run on a single GPU
deepspeed --num_gpus 1 mii-example.py

# Run on multiple GPUs deepspeed --num_gpus 2 mii-example.py

  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>

管道选项

虽然仅需要模型名称或路径即可支持非持久管道部署,但我们为用户提供自定义选项:

mii.pipeline()选项

  • model_name_or_path: strHuggingFace模型的名称或本地路径。
  • max_length: int设置提示 + 响应的默认最大令牌长度。
  • all_rank_output: bool启用后,所有排名都会返回生成的文本。默认情况下,只有排名 0 才会返回文本。

pipe()用户还可以使用以下选项控制各个提示的生成特征(即,调用时):

  • max_length: int设置提示 + 响应的每个提示的最大标记长度。
  • min_new_tokens: int设置响应中生成的最小令牌数。max_length将优先于此设置。
  • max_new_tokens: int设置响应中生成的令牌的最大数量。
  • ignore_eos: bool(默认为False)设置为True防止遇到 EOS 代币时结束生成。
  • top_p: float(默认为0.9)当设置如下时1.0,过滤标记并仅保留最可能的标记,其中标记概率总和为 ≥ top_p
  • top_k: int(默认为None)当 时None,top-k 过滤功能被禁用。设置后,要保留的最高概率令牌的数量。
  • temperature: float(默认为None) 当 时None,温度禁用。设置后,调整令牌概率。
  • do_sample: bool(默认为True)当 时True,样本输出 logits。当 时False,使用贪婪采样。
  • return_full_text: bool(默认为False)当 时True,将输入提示添加到返回的文本中

持久部署

持久部署非常适合长时间运行的生产应用程序。持久模型使用轻量级 GRPC 服务器,可以同时被多个客户端查询。运行持久模型的完整示例只有 5 行。试一试!

import mii
client = mii.serve("mistralai/Mistral-7B-v0.1")
response = client.generate(["Deepspeed is", "Seattle is"], max_new_tokens=128)
print(response)

返回的response是对象列表Response。我们可以访问有关该生成的几个详细信息(例如,response[0].prompt_length):

  • generated_text: str模型生成的文本。
  • prompt_length: int原始提示中的标记数。
  • generated_length: int生成的代币数量。
  • finish_reason: str停止生成的原因。stop表示 EOS 代币已生成,length表示代币达到max_new_tokensmax_length

如果我们想从其他进程生成文本,我们也可以这样做:

client = mii.client("mistralai/Mistral-7B-v0.1")
response = client.generate("Deepspeed is", max_new_tokens=128)

当我们不再需要持久部署时,我们可以从任何客户端关闭服务器:

client.terminate_server()

模型并行性

通过持久部署,利用多 GPU 系统来实现更好的延迟和吞吐量也很容易。模型并行性由tensor_parallel以下输入控制mii.serve

client = mii.serve("mistralai/Mistral-7B-v0.1", tensor_parallel=2)

最终的部署会将模型拆分到 2 个 GPU 上,以提供比单个 GPU 更快的推理速度和更高的吞吐量。

模型复制品

我们还可以通过设置多个模型副本并利用 DeepSpeed-MII 提供的负载平衡来利用多 GPU(和多节点)系统:

client = mii.serve("mistralai/Mistral-7B-v0.1", replica_num=2)

最终的部署将加载 2 个模型副本(每个 GPU 一个)并在 2 个模型实例之间对传入请求进行负载平衡。

模型并行性和副本也可以结合起来,以利用具有更多 GPU 的系统。在下面的示例中,我们运行 2 个模型副本,每个副本在具有 4 个 GPU 的系统上分布在 2 个 GPU 上:

client = mii.serve("mistralai/Mistral-7B-v0.1", tensor_parallel=2, replica_num=2)

为了获得最大性能,在模型并行性和模型副本之间进行选择将取决于硬件、模型和工作负载的性质。例如,对于小型模型,用户可能会发现模型副本为请求提供最低的平均延迟。同时,仅使用模型并行性时,大型模型可能会实现更大的总体吞吐量。

RESTful API

enable_restful_api=True通过在创建持久 MII 部署时进行设置,MII 可以轻松地通过 RESTful API 设置和运行模型推理。 RESTful API 可以接收位于 的请求http://{HOST}:{RESTFUL_API_PORT}/mii/{DEPLOYMENT_NAME}。下面提供了完整的示例:

client = mii.serve(
    "mistralai/Mistral-7B-v0.1",
    deployment_name="mistral-deployment",
    enable_restful_api=True,
    restful_api_port=28080,
)

📌注意:虽然提供 adeployment_name不是必需的(MII 将为您自动生成一个),但提供 a 是一种很好的做法,deployment_name这样您就可以确保与正确的 RESTful API 进行交互。


然后,您可以使用任何 HTTP 客户端向 RESTful 网关发送提示,例如curl

curl --header "Content-Type: application/json" --request POST  -d '{"prompts": ["DeepSpeed is", "Seattle is"], "max_length": 128}' http://localhost:28080/mii/mistral-deployment

或者python

import json
import requests
url = f"http://localhost:28080/mii/mistral-deployment"
params = {"prompts": ["DeepSpeed is", "Seattle is"], "max_length": 128}
json_params = json.dumps(params)
output = requests.post(
    url, data=json_params, headers={"Content-Type": "application/json"}
)

持久部署选项

虽然只需要模型名称或路径即可进行持久部署,但我们为用户提供自定义选项。

mii.serve()选项

  • model_name_or_path: str(必需) HuggingFace模型的名称或本地路径。
  • max_length: int(默认为模型配置中的最大序列长度)设置提示+响应的默认最大标记长度。
  • deployment_name: str(默认为f"{model_name_or_path}-mii-deployment")持久模型的唯一标识字符串。如果提供,则应使用 检索客户端对象client = mii.client(deployment_name)
  • tensor_parallel: int(默认为1)用于分割模型的 GPU 数量。
  • replica_num: int(默认为1)要建立的模型副本数。
  • enable_restful_api: bool(默认为False)启用后,将启动 RESTful API 网关进程,可以在 处进行查询http://{host}:{restful_api_port}/mii/{deployment_name}。有关更多详细信息,请参阅有关 RESTful API 的部分。
  • restful_api_port: int(默认为)设置为28080时用于与 RESTful API 交互的端口号。enable_restful_apiTrue

mii.client()选项

  • model_or_deployment_name: str模型名称或deployment_name传递给mii.serve()

client.generate()用户还可以使用以下选项控制各个提示的生成特征(即,调用时):

  • max_length: int设置提示 + 响应的每个提示的最大标记长度。
  • min_new_tokens: int设置响应中生成的最小令牌数。max_length将优先于此设置。
  • max_new_tokens: int设置响应中生成的令牌的最大数量。
  • ignore_eos: bool(默认为False)设置为True防止遇到 EOS 代币时结束生成。
  • top_p: float(默认为0.9)当设置如下时1.0,过滤标记并仅保留最可能的标记,其中标记概率总和为 ≥ top_p
  • top_k: int(默认为None)当 时None,top-k 过滤功能被禁用。设置后,要保留的最高概率令牌的数量。
  • temperature: float(默认为None) 当 时None,温度禁用。设置后,调整令牌概率。
  • do_sample: bool(默认为True)当 时True,样本输出 logits。当 时False,使用贪婪采样。
  • return_full_text: bool(默认为False)当 时True,将输入提示添加到返回的文本中

贡献

该项目欢迎贡献和建议。大多数贡献都要求您同意贡献者许可协议 (CLA),声明您有权并且实际上授予我们使用您的贡献的权利。有关详细信息,请访问https://cla.opensource.microsoft.com

当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA 并适当地修饰 PR(例如,状态检查、评论)。只需按照机器人提供的说明进行操作即可。您只需使用我们的 CLA 在所有存储库中执行一次此操作。

该项目采用了微软开源行为准则。有关详细信息,请参阅行为准则常见问题解答或联系[email protected]提出任何其他问题或意见。

商标

该项目可能包含项目、产品或服务的商标或徽标。 Microsoft 商标或徽标的授权使用须遵守且必须遵循 Microsoft 的商标和品牌指南。在此项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 赞助。对第三方商标或徽标的任何使用均须遵守这些第三方的政策。

About

在 DeepSpeed 的支持下,MII 使低延迟和高吞吐量推理成为可能。

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 99.5%
  • Shell 0.5%