vLLM使用方式
离线推理
vLLM 推理主要需涉及两个类:模型 LLM,采样参数 SamplingParams。
# 载入 LLM 和 SamplingParams
from vllm import LLM, SamplingParams
# 推理数据以List[str]格式组织
prompts = [
"Hello, my name is",
"The president of the United States is",
"The capital of France is",
"The future of AI is",
]
# 设置采样参数
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
# 加载模型
llm = LLM(model="facebook/opt-125m")
# 执行推理
outputs = llm.generate(prompts, sampling_params)
# 输出推理结果
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
LLM加载参数
model: HuggingFace Transformers 模型的名称或路径,用于指定要加载的预训练语言模型。
tokenizer: HuggingFace Transformers 分词器的名称或路径,用于处理输入的文本数据,将其转换为模型可接受的格式。
tokenizer_mode: 分词器模式,“auto” 会使用快速分词器(如果可用),而 “slow” 总是使用慢速分词器。
trust_remote_code: 当从 HuggingFace 下载模型和分词器时,是否信任远程代码,特别适用于自定义模型。
tensor_parallel_size: 使用的 GPU 数量,用于分布式执行中的张量并行性(Tensor Parallelism),这有助于在多个 GPU 之间分配计算。
dtype: 模型权重和激活的浮点数据类型,支持 float32、float16 和 bfloat16。如果设置为 auto,会根据模型配置文件中的 torch_dtype 属性确定类型,但如果该属性为 float32,则会使用 float16 代替。
quantization: 模型权重的量化方法,支持 “awq”、“gptq” 和 “squeezellm”。如果未设置,会首先检查模型配置文件中的 quantization_config 属性,若无配置则使用 dtype 确定权重数据类型。
revision: 模型的具体版本,可以是分支名称、标签名称或提交 ID,用户可以选择特定的版本。
tokenizer_revision: 分词器的具体版本,同样可以是分支、标签或者提交 ID。
seed: 用于采样的随机数生成器的种子,保证生成结果的可重复性。
gpu_memory_utilization: 用于指定 GPU 内存的使用比例(0 到 1 之间),用于模型权重、激活以及 KV 缓存。更高的值会提高 KV 缓存的大小,从而提升模型吞吐量,但过高的值可能会导致内存不足(OOM)错误。
swap_space: 每个 GPU 分配的 CPU 内存交换空间大小(以 GiB 计)。当某些请求的 best_of 参数大于 1 时,临时存储其状态。若所有请求 best_of=1,则可安全地将此值设为 0;否则,值过小可能导致内存不足错误。
enforce_eager: 是否强制使用 eager 执行模式。如果为 True,将禁用 CUDA 图并始终在 eager 模式下执行模型;若为 False,则在 CUDA 图和 eager 模式之间混合执行。
max_context_len_to_capture: CUDA 图能够捕获的最大上下文长度。当序列的上下文长度超过此值时,模型将回退到 eager 模式。
disable_custom_all_reduce: 与并行配置相关的参数,控制是否禁用自定义的 all-reduce 操作。
llm = LLM(
model="gpt2",
tokenizer="gpt2-tokenizer",
tokenizer_mode="auto",
trust_remote_code=True,
tensor_parallel_size=2,
dtype="float16",
quantization=None,
revision="v1.0",
seed=42,
gpu_memory_utilization=0.8,
swap_space=4,
enforce_eager=False,
max_context_len_to_capture=512,
disable_custom_all_reduce=False
)
SamplingParams参数列表
n: 返回的输出序列数量(如 3 表示返回 3 个序列)。
best_of: 从提示生成的输出序列数量,从中选择 n 个最佳序列。必须大于或等于 n(如 5 表示生成 5 个序列,并从中选出 3 个)。
presence_penalty: 对新 token 进行惩罚的浮动值,鼓励新 token 的使用(如 1.0 增加新词的出现,-1.0 则鼓励重复)。
frequency_penalty: 根据新 token 在生成文本中出现的频率进行惩罚(如 0.5 表示鼓励新词出现)。
repetition_penalty: 对新 token 的惩罚值,基于其在提示和生成文本中的出现(如 1.2 表示鼓励使用新词)。
temperature: 控制采样的随机性(如 0.7 使模型更随机,0 表示贪婪采样)。
top_p: 控制考虑的前 top token 的累积概率(如 0.9 表示考虑累积概率前 90% 的 token)。
top_k: 控制考虑的前 top token 的数量(如 50 表示考虑前 50 个 token)。
min_p: token 被考虑的最小概率(如 0.1 表示最小概率为 10%)。
seed: 用于生成的随机种子(如 42)。
use_beam_search: 是否使用束搜索(True 或 False)。
length_penalty: 根据序列长度进行惩罚(如 1.0 表示不惩罚,值小于 1 的惩罚较长序列)。
early_stopping: 控制束搜索的停止条件(如 True 表示完成最佳序列后立即停止)。
stop: 生成时停止的字符串列表(如 [“END”])。
stop_token_ids: 生成时停止的 token 列表(如 [50256])。
include_stop_str_in_output: 是否将停止字符串包含在输出文本中(如 False)。
ignore_eos: 是否忽略结束符并继续生成(如 True)。
max_tokens: 每个输出序列生成的最大 token 数(如 50)。
logprobs: 每个输出 token 返回的对数概率数量(如 5 表示返回 5 个最可能的 token 的对数概率)。
prompt_logprobs: 每个提示 token 返回的对数概率数量(如 3)。
skip_special_tokens: 是否在输出中跳过特殊 token(如 True)。
spaces_between_special_tokens: 是否在输出中特殊 token 之间添加空格(如 True)。
logits_processors: 根据之前生成的 token 修改 logits 的函数列表(如 [] 表示不使用)。
sampling_params = SamplingParams(
n=3,
best_of=5,
presence_penalty=0.5,
frequency_penalty=0.5,
repetition_penalty=1.2,
temperature=0.7,
top_p=0.9,
top_k=50,
min_p=0.1,
seed=42,
use_beam_search=True,
length_penalty=1.0,
early_stopping=True,
stop=["END"],
stop_token_ids=[50256],
include_stop_str_in_output=False,
ignore_eos=True,
max_tokens=50,
logprobs=5,
prompt_logprobs=3,
skip_special_tokens=True,
spaces_between_special_tokens=True,
logits_processors=[]
)
使用注意事项:
- GPU使用率问题。LLM加载时有一个参数:gpu_memory_utilization。该参数是用来控制 vLLM 推理时占用多大的显存,如果加载完模型还有余下的则会被占用为 kv_cache,可以通过调整该参数来进行更灵活的显存控制
- prefix-cache 特性和输出的 logprob 不能同时使用。Error when prompt_logprobs + enable_prefix_caching
- 多卡推理有时并不会比单卡推理更快。