vLLM
安装
你需要安装 vllm
库来使用 vLLM 集成。请参阅安装部分,了解如何安装适用于 CPU 或 ROCm 的 vLLM。要开始使用,你也可以运行
加载模型
Outlines 支持通过 vLLM 的离线批量推理接口提供的模型。你可以使用以下方式加载模型
或者
import vllm
from outlines import models
llm = vllm.LLM("microsoft/Phi-3-mini-4k-instruct")
model = models.VLLM(llm)
模型从 HuggingFace hub 加载。
设备
vLLM 的默认安装只允许在 GPU 上加载模型。请参阅安装说明以了解如何在 CPU 上运行模型。
你可以传递通常会传递给 vllm.LLM
的任何参数,作为关键字参数
from outlines import models
model = models.vllm(
"microsoft/Phi-3-mini-4k-instruct",
trust_remote_code=True,
gpu_memory_utilization=0.7
)
主要参数
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
tokenizer_mode |
str |
"auto" 会在可用时使用快速分词器,而 "slow" 会始终使用慢速分词器。 | auto |
trust_remote_code |
bool |
下载模型和分词器时信任远程代码。 | False |
tensor_parallel_size |
int |
使用张量并行进行分布式执行时使用的 GPU 数量。 | 1 |
dtype |
str |
模型权重和激活的数据类型。目前,我们支持 float32 、float16 和 bfloat16 。如果为 auto ,我们将使用模型配置文件中指定的 torch_dtype 属性。但是,如果配置中的 torch_dtype 是 float32 ,我们将改用 float16 。 |
auto |
quantization |
Optional[str] |
用于量化模型权重的方法。目前,我们支持 "awq"、"gptq" 和 "squeezellm"。如果为 None,我们首先检查模型配置文件中的 quantization_config 属性。如果该属性为 None,我们假设模型权重未量化,并使用 dtype 来确定权重的 数据类型。 |
None |
revision |
Optional[str] |
要使用的特定模型版本。它可以是分支名称、标签名称或提交 ID。 | None |
tokenizer_revision |
Optional[str] |
要使用的特定分词器版本。它可以是分支名称、标签名称或提交 ID。 | None |
gpu_memory_utilization |
float |
用于模型权重、激活和 KV 缓存的 GPU 内存比例(介于 0 和 1 之间)。更高的值将增加 KV 缓存大小,从而提高模型的吞吐量。但是,如果值过高,可能会导致内存不足 (OOM) 错误。 | 0.9 |
swap_space |
int |
每 GPU 用作交换空间的 CPU 内存大小 (GiB)。当请求的 best_of 采样参数大于 1 时,这可用于临时存储请求的状态。如果所有请求都将 best_of=1 ,则可以安全地将其设置为 0。否则,值过小可能会导致内存不足 (OOM) 错误。 |
4 |
enforce_eager |
bool |
是否强制执行 eager 模式。如果为 True,我们将禁用 CUDA graph 并始终以 eager 模式执行模型。如果为 False,我们将混合使用 CUDA graph 和 eager 执行。 | False |
enable_lora |
bool |
是否启用加载 LoRA 适配器 | False |
请参阅 vLLM 代码,了解所有可用参数的列表。
使用量化模型
vLLM 支持 AWQ、GPTQ 和 SqueezeLLM 量化模型
from outlines import models
model = models.vllm("TheBloke/Llama-2-7B-Chat-AWQ", quantization="awq")
model = models.vllm("TheBloke/Mistral-7B-Instruct-v0.2-GPTQ", quantization="gptq")
model = models.vllm("https://hugging-face.cn/squeeze-ai-lab/sq-llama-30b-w4-s5", quantization="squeezellm")
依赖项
要使用 AWQ 模型,你需要安装 autoawq 库 pip install autoawq
。
要使用 GPTQ 模型,你需要安装 autoGTPQ 和 optimum 库 pip install auto-gptq optimum
。
多 GPU 使用
要使用 vLLM 运行多 GPU 推理,你需要在初始化模型时将 tensor_parallel_size
参数设置为可用 GPU 的数量。例如,要在 2 个 GPU 上运行推理
from outlines import models
model = models.vllm(
"microsoft/Phi-3-mini-4k-instruct"
tensor_parallel_size=2
)
加载 LoRA 适配器
你可以加载 LoRA 适配器并在它们之间动态切换
from outlines import models
model = models.vllm("facebook/opt-350m", enable_lora=True)
model.load_lora("ybelkaa/opt-350m-lora") # Load LoRA adapter
model.load_lora(None) # Unload LoRA adapter
生成文本
除了 文本生成部分中描述的参数之外,你可以通过 sampling_params
关键字参数直接将 SamplingParams
的实例传递给任何生成器
from vllm.sampling_params import SamplingParams
from outlines import models, generate
model = models.vllm("microsoft/Phi-3-mini-4k-instruct")
generator = generate.text(model)
params = SamplingParams(n=2, frequency_penalty=1., min_tokens=2)
answer = generator("A prompt", sampling_params=params)
这也适用于使用 generate.regex
、generate.json
、generate.cfg
、generate.format
和 generate.choice
构建的生成器。
注意
通过 SamplingParams
实例传递的值会覆盖生成器或采样器的其他参数。
SamplingParams
属性
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
n |
int |
给定提示返回的输出序列数量。 | 1 |
best_of |
Optional[int] |
从提示生成的输出序列数量。从这些 best_of 序列中,返回排名前 n 的序列。best_of 必须大于或等于 n 。当 use_beam_search 为 True 时,这被视为束宽。默认情况下,best_of 设置为 n 。 |
None |
presence_penalty |
float |
基于新生成的 token 是否已在生成文本中出现而对其进行惩罚的浮点数。值 > 0 鼓励模型使用新 token,而值 < 0 鼓励模型重复 token。 | 0.0 |
frequency_penalty |
float |
基于新生成的 token 在已生成文本中的频率而对其进行惩罚的浮点数。值 > 0 鼓励模型使用新 token,而值 < 0 鼓励模型重复 token。 | 0.0 |
repetition_penalty |
float |
基于新生成的 token 是否已在提示和已生成文本中出现而对其进行惩罚的浮点数。值 > 1 鼓励模型使用新 token,而值 < 1 鼓励模型重复 token。 | 1.0 |
temperature |
float |
控制采样随机性的浮点数。较低的值使模型更具确定性,而较高的值使模型更具随机性。零表示贪婪采样。 | 1.0 |
top_p |
float |
控制考虑的前面 token 的累积概率的浮点数。必须在 (0, 1] 范围内。设置为 1 表示考虑所有 token。 | 1.0 |
top_k |
int |
控制考虑的前面 token 数量的整数。设置为 -1 表示考虑所有 token。 | -1 |
min_p |
float |
表示要考虑的 token 的最小概率的浮点数,相对于最可能 token 的概率。必须在 [0, 1] 范围内。设置为 0 表示禁用此功能。 | 0.0 |
seed |
Optional[int] |
用于生成的随机种子。 | None |
use_beam_search |
bool |
是否使用束搜索代替采样。 | False |
length_penalty |
float |
基于序列长度对其进行惩罚的浮点数。用于束搜索。 | 1.0 |
early_stopping |
Union[bool, str] |
控制束搜索的停止条件。它接受以下值:True ,当有 best_of 个完整候选时立即停止生成;False ,应用启发式方法,当找到更好候选的可能性非常小时停止生成;"never" ,束搜索过程只有在无法找到更好候选时才停止(经典束搜索算法)。 |
False |
stop |
Optional[Union[str, List[str]]] |
生成时停止生成的字符串列表。返回的输出将不包含停止字符串。 | None |
stop_token_ids |
Optional[List[int]] |
生成时停止生成的 token ID 列表。返回的输出将包含停止 token,除非停止 token 是特殊 token。 | None |
include_stop_str_in_output |
bool |
是否在输出文本中包含停止字符串。默认为 False。 | False |
ignore_eos |
bool |
是否忽略 EOS token 并在生成 EOS token 后继续生成 token。 | False |
max_tokens |
int |
每个输出序列生成的最大 token 数量。 | 16 |
min_tokens |
int |
在生成 EOS 或 stop_token_ids 之前,每个输出序列生成的最小 token 数量 | 0 |
skip_special_tokens |
bool |
是否在输出中跳过特殊 token。 | True |
spaces_between_special_tokens |
bool |
是否在输出中在特殊 token 之间添加空格。默认为 True。 | True |
流式处理
警告
离线 vLLM 集成不支持流式处理。
安装
默认情况下,vLLM 库安装时包含预编译的 C++ 和 CUDA 二进制文件,并且只能在 GPU 上运行
CPU
你的系统需要安装 gcc
编译器。然后你需要从源代码安装 vLLM。首先克隆仓库
安装安装所需的 Python 包
pip install --upgrade pip
pip install wheel packaging ninja setuptools>=49.4.0 numpy
pip install -v -r requirements-cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu
最后运行
请参阅 vLLM 文档,了解更多详细信息、其他安装方法(Docker)和性能提示。
ROCm
你需要从源代码安装 vLLM。首先在 ROCm 上安装 Pytorch
pip install torch==2.2.0.dev20231206+rocm5.7 --index-url https://download.pytorch.org/whl/nightly/rocm5.7 # tested version
然后你需要按照这些说明为 ROCm 安装 flash attention。然后可以安装 xformers=0.0.23
并应用所需的补丁以适配 ROCm 的 Flash Attention。
最后构建 vLLM
cd vllm
pip install -U -r requirements-rocm.txt
python setup.py install # This may take 5-10 minutes.
请参阅 vLLM 文档,了解其他安装方法(Docker)。