跳到内容

vLLM

安装

你需要安装 vllm 库来使用 vLLM 集成。请参阅安装部分,了解如何安装适用于 CPU 或 ROCm 的 vLLM。要开始使用,你也可以运行

pip install "outlines[vllm]"

加载模型

Outlines 支持通过 vLLM 的离线批量推理接口提供的模型。你可以使用以下方式加载模型

from outlines import models

model = models.vllm("microsoft/Phi-3-mini-4k-instruct")

或者

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 模型权重和激活的数据类型。目前,我们支持 float32float16bfloat16。如果为 auto,我们将使用模型配置文件中指定的 torch_dtype 属性。但是,如果配置中的 torch_dtypefloat32,我们将改用 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.regexgenerate.jsongenerate.cfggenerate.formatgenerate.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 上运行

pip install vllm

CPU

你的系统需要安装 gcc 编译器。然后你需要从源代码安装 vLLM。首先克隆仓库

git clone https://github.com/vllm-project/vllm.git
cd 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_TARGET_DEVICE=cpu python setup.py install

请参阅 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。

pip install xformers==0.0.23 --no-deps
bash patch_xformers.rocm.sh

最后构建 vLLM

cd vllm
pip install -U -r requirements-rocm.txt
python setup.py install # This may take 5-10 minutes.

请参阅 vLLM 文档,了解其他安装方法(Docker)。