- [2024/01] DeepSpeed-FastGen:引入 Mixtral、Phi-2 和 Falcon 支持,并提供主要性能和功能增强。
- [2023/11] DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 为法学硕士生成高通量文本
- [2022/11] 1秒内稳定的扩散图像生成。 DeepSpeed MII
- [2022/10]宣布用于推理的 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 发布博客。
- 我们于 2022 年首次发布 MII,涵盖 v0.0.9 之前的所有先前版本。除了语言模型之外,我们还支持加速text2image 模型,例如 Stable Diffusion。有关我们以前版本的更多详细信息,请参阅我们的旧版 API。
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 旧版 API 支持超过 50,000 种不同的模型,包括 BERT、RoBERTa、Stable Diffusion 以及 Bloom、GPT-J 等其他文本生成模型。有关完整列表,请参阅我们的旧版支持模型表。
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_tokens
或max_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: str
HuggingFace模型的名称或本地路径。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_tokens
或max_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)
为了获得最大性能,在模型并行性和模型副本之间进行选择将取决于硬件、模型和工作负载的性质。例如,对于小型模型,用户可能会发现模型副本为请求提供最低的平均延迟。同时,仅使用模型并行性时,大型模型可能会实现更大的总体吞吐量。
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_api
True
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 赞助。对第三方商标或徽标的任何使用均须遵守这些第三方的政策。