并获得增强的文档体验
开始使用
生成
每个框架都在其各自的 GenerationMixin 类中实现了一个用于文本生成的 generate 方法
- PyTorch 的 generate() 是在 GenerationMixin 中实现的。
你可以使用 GenerationConfig 类实例对 generate 方法进行参数化。请参阅该类以获取生成参数的完整列表,这些参数控制生成方法的行为。
要了解如何检查模型的生成配置、默认值是什么、如何即时更改参数以及如何创建并保存自定义生成配置,请参考 文本生成策略指南。该指南还解释了如何使用相关功能,例如标记流(token streaming)。
GenerationConfig
class transformers.GenerationConfig
< 源码 >( **kwargs )
控制输出长度的参数
- max_length (
int, 可选) — 推荐使用max_new_tokens来控制模型生成的标记数量。保留max_length是为了向后兼容。 - max_new_tokens (
int, 可选) — 要生成的最大标记数量,忽略提示词(prompt)中的标记数量。 - min_length (
int, 可选) — 要生成的序列的最小长度。对应于输入提示词的长度 +min_new_tokens。如果也设置了min_new_tokens,则其效果将被覆盖。 - min_new_tokens (
int, 可选) — 要生成的最小标记数量,忽略提示词中的标记数量。 - early_stopping (
bool或str, 可选) — 控制基于束(beam)的方法(如束搜索)的停止条件。它接受以下值:True,一旦有num_beams个完整的候选序列,生成就会停止;False,应用启发式方法,当极不可能找到更好的候选序列时停止生成;"never",束搜索过程只有在不可能有更好的候选序列时才会停止(规范束搜索算法)。 - max_time (
float, 可选) — 允许计算运行的最长时间(以秒为单位)。在分配的时间过后,生成仍将完成当前的一轮计算。 - stop_strings (
str 或 list[str], 可选) — 如果模型输出了这些字符串或字符串列表中的内容,则应终止生成。
控制所使用的生成策略的参数
- do_sample (
bool) — 是否使用采样;否则使用贪婪解码(greedy decoding)。 - num_beams (
int, 可选) — 束搜索(beam search)的束数。1 表示不进行束搜索。
控制缓存的参数
- use_cache (
bool) — 模型是否应使用过去的键/值注意力(如果适用于模型)来加速解码。 - cache_implementation (
str, 可选) — 将在generate中实例化的缓存类名称,用于更快的解码。可能的值包括:"dynamic": DynamicCache"static": StaticCache"offloaded":DynamicCache(offloaded=True)"offloaded_static":StaticCache(offloaded=True)"quantized": QuantizedCache
如果未指定,我们将使用模型的默认缓存(通常是 DynamicCache)。有关更多信息,请参阅我们的 缓存文档。
- cache_config (
dict, 可选, 默认为None) — 在键值缓存类中使用的参数可以在cache_config中传递。
用于操作模型输出 logits 的参数
- temperature (
float, 可选) — 用于调制下一个标记概率的值。此值在模型的generation_config.json文件中设置。如果未设置,默认值为 1.0。 - top_k (
int, 可选) — top-k 过滤保留的最高概率词汇标记的数量。此值在模型的generation_config.json文件中设置。如果未设置,默认值为 50。 - top_p (
float, 可选) — 如果设置为小于 1 的浮点数,则仅保留概率累计达到top_p或更高的最小标记集用于生成。此值在模型的generation_config.json文件中设置。如果未设置,默认值为 1.0。 - min_p (
float, 可选) — 最小标记概率,将按最可能标记的概率进行缩放。它必须是 0 到 1 之间的值。典型值在 0.01-0.2 范围内,其选择性与将top_p设置在 0.99-0.8 范围内相当(使用与普通top_p相反的值)。 - top_h (
float, 可选) — 熵预算(entropy budget)缩放因子,控制采样时保留分布中多少熵。必须是 0 到 1 之间的值。在每一步,标记按概率排序,并保留最小的标记前缀,这些标记的重新归一化熵小于或等于top_h乘以全分布熵。较小的值(例如 0.2–0.5)会导致更集中、更确定性的输出,而接近 1.0 的值允许更多的随机性和多样性。典型值在 0.3–0.6 范围内。 - typical_p (
float, 可选) — 局部典型性衡量的是,在给定已生成的部分文本的情况下,预测下一个目标标记的条件概率与预测下一个随机标记的预期条件概率的相似程度。如果设置为小于 1 的浮点数,则仅保留概率累计达到typical_p或更高的一组局部最典型标记用于生成。有关更多详细信息,请参见此论文。 - epsilon_cutoff (
float, 可选) — 如果设置为严格介于 0 和 1 之间的浮点数,则仅对条件概率大于epsilon_cutoff的标记进行采样。在论文中,建议值范围为 3e-4 到 9e-4,具体取决于模型的大小。有关更多详细信息,请参见 Truncation Sampling as Language Model Desmoothing。 - eta_cutoff (
float, 可选) — Eta 采样是局部典型采样和 epsilon 采样的混合体。如果设置为严格介于 0 和 1 之间的浮点数,则仅当标记大于eta_cutoff或sqrt(eta_cutoff) * exp(-entropy(softmax(next_token_logits)))时才考虑该标记。后一项直观上是预期的下一个标记概率,由sqrt(eta_cutoff)缩放。在论文中,建议值范围为 3e-4 到 2e-3,具体取决于模型的大小。有关更多详细信息,请参见 Truncation Sampling as Language Model Desmoothing。 - repetition_penalty (
float, 可选) — 重复惩罚参数。1.0 表示没有惩罚。有关更多详细信息,请参见此论文。 - encoder_repetition_penalty (
float, 可选) — encoder_repetition_penalty 参数。对不在原始输入中的序列进行指数惩罚。1.0 表示没有惩罚。 - length_penalty (
float, 可选) — 用于基于束生成的长度指数惩罚。它作为序列长度的指数应用,反过来又用于除以序列的得分。由于得分是序列的对数似然(即负数),length_penalty> 0.0 会促进生成更长的序列,而length_penalty< 0.0 会鼓励生成更短的序列。 - no_repeat_ngram_size (
int, 可选) — 如果设置为大于 0 的整数,则该大小的所有 n-gram 只能出现一次。 - bad_words_ids (
list[list[int]], 可选) — 不允许生成的标记 ID 列表。查看 NoBadWordsLogitsProcessor 获取更多文档和示例。 - renormalize_logits (
bool) — 在应用所有 logits 处理器(包括自定义处理器)后,是否重新归一化 logits。强烈建议将此标志设置为True,因为搜索算法假设得分 logits 是归一化的,但某些 logit 处理器会破坏归一化。 - forced_bos_token_id (
int, 可选, 默认为model.config.forced_bos_token_id) — 强制作为decoder_start_token_id之后生成的第一个标记的 ID。对于像 mBART 这样的多语言模型很有用,其中第一个生成的标记需要是目标语言标记。 - forced_eos_token_id (
int或list[int], 可选, 默认为model.config.forced_eos_token_id) — 当达到max_length时,强制作为最后一个生成的标记的 ID。可选地,使用列表设置多个序列结束标记。 - remove_invalid_values (
bool) — 是否移除模型可能输出的 nan 和 inf,以防止生成方法崩溃。请注意,使用remove_invalid_values可能会减慢生成速度。 - exponential_decay_length_penalty (
tuple(int, float), 可选) — 此元组在生成一定数量的标记后添加呈指数级增加的长度惩罚。该元组应包含:(start_index, decay_factor),其中start_index指示惩罚开始的位置,decay_factor表示指数衰减的因子。 - suppress_tokens (
list[int], 可选) — 生成时将被抑制的标记列表。SuppressTokenslogit 处理器会将它们的对数概率设置为-inf,以便它们不会被采样。 - begin_suppress_tokens (
list[int], 可选) — 生成开始时将被抑制的标记列表。SuppressBeginTokenslogit 处理器会将它们的对数概率设置为-inf,以便它们不会被采样。 - sequence_bias (
dict[tuple[int], float], 可选) — 将标记序列映射到其偏置项(bias term)的字典。正偏置会增加选择该序列的几率,而负偏置则相反。查看 SequenceBiasLogitsProcessor 获取更多文档和示例。 - token_healing (
bool) — 通过将提示词末尾的标记替换为其适当的扩展形式来“修复(Heal)”它们。这增强了受贪婪分词偏置影响的提示词的补全质量。 - guidance_scale (
float, 可选) — 无分类器引导(CFG)的引导比例。通过设置guidance_scale > 1启用 CFG。较高的引导比例会鼓励模型生成与输入提示词联系更紧密的样本,通常以降低质量为代价。 - watermarking_config (
BaseWatermarkingConfig或dict, 可选) — 用于通过为随机选择的“绿色”标记集添加小偏差来对模型输出加水印的参数。有关更多详细信息,请参阅 SynthIDTextWatermarkingConfig 和 WatermarkingConfig 的文档。如果作为Dict传递,它将在内部转换为WatermarkingConfig。
定义 generate 输出变量的参数
- num_return_sequences (
int, 可选) — batch 中每个元素独立计算并返回的序列数量。 - output_attentions (
bool) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions。 - output_hidden_states (
bool) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states。 - output_scores (
bool) — 是否返回预测得分。有关更多详细信息,请参阅返回张量下的scores。 - output_logits (
bool) — 是否返回未经处理的预测 logit 得分。有关更多详细信息,请参阅返回张量下的logits。 - return_dict_in_generate (
bool) — 是否返回 ModelOutput,而不是仅返回生成的序列。要返回生成缓存(当use_cache为True时)或可选输出(请参见以output_开头的标志),必须将此标志设置为True。
可在生成时使用的特殊标记
- pad_token_id (
int, 可选) — 填充(padding)标记的 ID。 - bos_token_id (
int, 可选) — 序列开始(beginning-of-sequence)标记的 ID。 - eos_token_id (
Union[int, list[int]], 可选) — 序列结束(end-of-sequence)标记的 ID。可选地,使用列表设置多个序列结束标记。
编码器-解码器模型特有的生成参数
- encoder_no_repeat_ngram_size (
int, 可选) — 如果设置为大于 0 的整数,则encoder_input_ids中出现的所有该大小的 n-gram 都不能在decoder_input_ids中出现。 - decoder_start_token_id (
int或list[int], 可选) — 如果编码器-解码器模型以不同于 bos 的标记开始解码,则为该标记的 ID 或长度为batch_size的列表。使用列表可以为 batch 中的每个元素指定不同的起始 ID(例如,一个 batch 中具有不同目标语言的多语言模型)。
辅助生成(assistant generation)特有的生成参数
- is_assistant (
bool) — 模型是否为辅助(草稿)模型。 - num_assistant_tokens (
int, 可选) — 定义在每次迭代中由目标模型检查之前,由辅助模型生成的投机标记(speculative tokens)数量。num_assistant_tokens的值越高,生成就越具有投机性:如果辅助模型性能良好,可以获得更大的加速;如果辅助模型需要大量修正,加速则较小。 - num_assistant_tokens_schedule (
str, 可选) — 定义推理期间最大辅助标记更改的调度方式。"heuristic": 当所有投机标记都正确时,将num_assistant_tokens增加 2,否则减少 1。在使用相同辅助模型的多次生成调用中,num_assistant_tokens的值是持久的。"heuristic_transient": 与"heuristic"相同,但每次生成调用后num_assistant_tokens会重置为其初始值。"constant":num_assistant_tokens在生成期间保持不变。
- assistant_confidence_threshold (
float, 可选) — 辅助模型的置信度阈值。如果辅助模型对当前标记预测的置信度低于此阈值,辅助模型将停止当前标记生成迭代,即使尚未达到投机标记数(由num_assistant_tokens定义)。辅助模型的置信度阈值在整个投机迭代中进行调整,以减少不必要的草稿和目标前向传播次数,并偏向于避免假阴性。在使用相同辅助模型的多次生成调用中,assistant_confidence_threshold的值是持久的。它是来自《Dynamic Speculation Lookahead Accelerates Speculative Decoding of Large Language Models》https://huggingface.co/papers/2405.04304 的动态投机前瞻(dynamic speculation lookahead)的无监督版本。 - prompt_lookup_num_tokens (
int, 可选) — 作为候选标记输出的标记数量。 - max_matching_ngram_size (
int, 可选) — 在提示词中考虑匹配的最大 n-gram 大小。如果未提供,默认值为 2。 - assistant_early_exit(
int, 可选) — 如果设置为正整数,模型的早退(early exit)将作为助手使用。仅适用于支持早退的模型(即中间层的 logits 可以被 LM head 解释的模型)。 - assistant_lookbehind(
int, 可选) — 如果设置为正整数,重新编码过程将额外考虑最后assistant_lookbehind个助手 token,以正确对齐 token。仅在投机解码(speculative decoding)中使用不同分词器时使用。详见此 博客。 - target_lookbehind(
int, 可选) — 如果设置为正整数,重新编码过程将额外考虑最后target_lookbehind个目标 token,以正确对齐 token。仅在投机解码中使用不同分词器时使用。详见此 博客。
与性能和编译相关的参数
用于保存生成任务配置的类。generate 调用支持以下针对文本解码、文本到文本、语音到文本和视觉到文本模型的生成方法:
- 贪婪解码(greedy decoding),如果
num_beams=1且do_sample=False - 多项式采样(multinomial sampling),如果
num_beams=1且do_sample=True - 束搜索解码(beam-search decoding),如果
num_beams>1且do_sample=False - 束搜索多项式采样(beam-search multinomial sampling),如果
num_beams>1且do_sample=True - 辅助解码(assisted decoding),如果将
assistant_model或prompt_lookup_num_tokens传递给.generate()
要了解更多关于解码策略的信息,请参阅 文本生成策略指南。
大量此类标志控制着生成的 logits 或停止标准。请务必查看 生成相关的类 以获取可能操作的完整描述以及使用示例。
注意:在生成循环期间,仍为 None 的配置字段将被 GenerationConfig._get_default_generation_params() 覆盖。如果您想为这些字段使用不同的值,请确保在生成配置中显式设置它们。
from_pretrained
< 源码 >( pretrained_model_name: str | os.PathLike config_file_name: str | os.PathLike | None = None cache_dir: str | os.PathLike | None = None force_download: bool = False local_files_only: bool = False token: str | bool | None = None revision: str = 'main' **kwargs ) → GenerationConfig
参数
- pretrained_model_name (
str或os.PathLike) — 可是以下之一:- 一个字符串,即托管在 huggingface.co 模型库中的预训练模型配置的 model id。
- 包含使用 save_pretrained() 方法保存的配置文件的 目录 路径,例如
./my_model_directory/。
- config_file_name (
str或os.PathLike,可选,默认为"generation_config.json") — 要从pretrained_model_name加载的生成配置 JSON 文件的名称。 - cache_dir (
str或os.PathLike,可选) — 如果不使用标准缓存,下载的预训练模型配置应缓存到的目录路径。 - force_download (
bool,可选,默认为False) — 是否强制(重新)下载配置文件并覆盖已存在的缓存版本(如果存在)。 - proxies (
dict[str, str],可选) — 按协议或端点使用的代理服务器字典,例如{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}。代理将用于每个请求。 - token (
str或bool,可选) — 用作远程文件 HTTP Bearer 身份验证的令牌。如果为True或未指定,将使用运行hf auth login时生成的令牌(存储在~/.huggingface中)。 - revision (
str,可选,默认为"main") — 要使用的特定模型版本。它可以是分支名称、标签名称或提交 id。由于我们使用基于 git 的系统在 huggingface.co 上存储模型和其他构件,因此revision可以是 git 允许的任何标识符。要测试您在 Hub 上提交的拉取请求(pull request),可以传递
revision="refs/pr/<pr_number>"。 - return_unused_kwargs (
bool,可选,默认为False) — 如果为False,此函数仅返回最终的配置对象。如果为
True,此函数将返回一个Tuple(config, unused_kwargs),其中 unused_kwargs 是一个包含不属于配置属性的键值对的字典:即kwargs中未用于更新config且被忽略的部分。 - subfolder (
str,可选,默认为"") — 如果相关文件位于 huggingface.co 模型仓库的子文件夹中,可以在此处指定文件夹名称。 - kwargs (
dict[str, Any],可选) —kwargs中任何属于配置属性的键值对将用于覆盖加载的值。对于不属于配置属性的键值对,其处理行为由return_unused_kwargs关键字参数控制。
从此预训练模型实例化的配置对象。
从生成配置文件实例化一个 GenerationConfig。
示例
>>> from transformers import GenerationConfig
>>> # Download configuration from huggingface.co and cache.
>>> generation_config = GenerationConfig.from_pretrained("openai-community/gpt2")
>>> # E.g. config was saved using *save_pretrained('./test/saved_model/')*
>>> generation_config.save_pretrained("./test/saved_model/")
>>> generation_config = GenerationConfig.from_pretrained("./test/saved_model/")
>>> # You can also specify configuration names to your generation configuration file
>>> generation_config.save_pretrained("./test/saved_model/", config_file_name="my_configuration.json")
>>> generation_config = GenerationConfig.from_pretrained("./test/saved_model/", "my_configuration.json")
>>> # If you'd like to try a minor variation to an existing configuration, you can also pass generation
>>> # arguments to `.from_pretrained()`. Be mindful that typos and unused arguments will be ignored
>>> generation_config, unused_kwargs = GenerationConfig.from_pretrained(
... "openai-community/gpt2", top_k=1, foo=False, do_sample=True, return_unused_kwargs=True
... )
>>> generation_config.top_k
1
>>> unused_kwargs
{'foo': False}from_model_config
< 源码 >( model_config: typing.Union[ForwardRef('PreTrainedConfig'), dict] ) → GenerationConfig
从 PreTrainedConfig 实例化一个 GenerationConfig。此函数对于将可能包含生成参数的旧版 PreTrainedConfig 对象转换为独立的 GenerationConfig 非常有用。
save_pretrained
< 源码 >( save_directory: str | os.PathLike config_file_name: str | os.PathLike | None = None push_to_hub: bool = False **kwargs )
参数
- save_directory (
str或os.PathLike) — 配置文件 JSON 将被保存到的目录(如果不存在将创建)。 - config_file_name (
str或os.PathLike,可选,默认为"generation_config.json") — 要保存到save_directory中的生成配置 JSON 文件的名称。 - push_to_hub (
bool,可选,默认为False) — 保存后是否将您的模型推送到 Hugging Face 模型中心。您可以使用repo_id指定要推送到的存储库(默认为您的命名空间中save_directory的名称)。 - kwargs (
dict[str, Any],可选) — 传递给 push_to_hub() 方法的其他关键字参数。
将生成配置对象保存到目录 save_directory,以便可以使用 from_pretrained() 类方法重新加载。
update
< 源码 >( defaults_only = False allow_custom_entries = False **kwargs ) → dict[str, Any]
如果 kwargs 中的属性与现有属性匹配,则使用其更新此类实例的属性,并返回所有未使用的 kwargs。
validate
< 源码 >( strict = False user_set_attributes: set[str] | None = None )
验证 GenerationConfig 实例的属性值。如果存在仅通过配置实例即可检测为错误的参数化,则抛出异常。
请注意,此处未验证的一些参数最好在生成运行时进行验证,因为它们可能取决于其他输入和/或模型,例如与生成长度相关的参数。
get_generation_mode
< 源码 >( assistant_model: typing.Optional[ForwardRef('PreTrainedModel')] = None ) → GenerationMode
返回由 GenerationConfig 实例触发的生成模式。
GenerationMixin
一个包含所有自回归文本生成功能的类,用作模型类中的 mixin。继承此类会使模型具有特殊的生成相关行为,例如在初始化时加载 GenerationConfig,或确保在 transformers CI 中运行与 generate 相关的测试。
模型类应继承自 GenerationMixin 以启用对 generate 等方法的调用,或者当它定义了直接或间接依赖于 GenerationMixin 且与 generate 等公共方法具有大致相同接口的自定义 generate 方法时。以下是三个示例:
LlamaForCausalLM应继承自GenerationMixin以启用对generate以及 mixin 中其他公共方法的调用;BlipForQuestionAnswering具有一个自定义generate方法,该方法与GenerationMixin.generate具有大致相同的接口(它有一些额外的参数,且输出相同)。该函数还通过内部模型间接调用GenerationMixin.generate。因此,BlipForQuestionAnswering应继承自GenerationMixin,以受益于我们代码库中所有与生成相关的自动化功能;BarkModel具有自定义generate方法,且其内部模型之一调用了GenerationMixin.generate。但是,其generate不与GenerationMixin.generate共享相同的接口。在这种情况下,BarkModel不应继承自GenerationMixin,因为它破坏了generate接口。
该类公开了 generate(),可用于:
- 贪婪解码(greedy decoding),如果
num_beams=1且do_sample=False - 多项式采样(multinomial sampling),如果
num_beams=1且do_sample=True - 束搜索解码(beam-search decoding),如果
num_beams>1且do_sample=False - 束搜索多项式采样(beam-search multinomial sampling),如果
num_beams>1且do_sample=True - 辅助解码(assisted decoding),如果将
assistant_model或prompt_lookup_num_tokens传递给.generate()
要了解更多关于解码策略的信息,请参阅 文本生成策略指南。
生成
< 源码 >( inputs: torch.Tensor | None = None generation_config: transformers.generation.configuration_utils.GenerationConfig | None = None logits_processor: transformers.generation.logits_process.LogitsProcessorList | None = None stopping_criteria: transformers.generation.stopping_criteria.StoppingCriteriaList | None = None prefix_allowed_tokens_fn: collections.abc.Callable[[int, torch.Tensor], list[int]] | None = None synced_gpus: bool | None = None assistant_model: typing.Optional[ForwardRef('PreTrainedModel')] = None streamer: typing.Optional[ForwardRef('BaseStreamer')] = None negative_prompt_ids: torch.Tensor | None = None negative_prompt_attention_mask: torch.Tensor | None = None custom_generate: str | collections.abc.Callable | None = None **kwargs ) → ModelOutput 或 torch.LongTensor
参数
- inputs (形状随模态变化的
torch.Tensor,可选) — 用作生成提示或编码器模型输入的序列。如果为None,该方法将使用bos_token_id初始化它,batch size 为 1。对于 decoder-only 模型,inputs的格式应为input_ids。对于 encoder-decoder 模型,inputs 可以代表input_ids、input_values、input_features或pixel_values中的任何一种。 - generation_config (GenerationConfig,可选) — 用作生成调用基础参数化的生成配置。传递给
generate且与generation_config属性匹配的**kwargs将覆盖它们。如果未提供generation_config,将使用默认配置,其加载优先级如下:1) 来自generation_config.json模型文件(如果存在);2) 来自模型配置。请注意,未指定的参数将继承 GenerationConfig 的默认值,应查阅其文档以对生成进行参数化。 - logits_processor (
LogitsProcessorList,可选) — 补充从参数和生成配置构建的默认 logits 处理器的自定义 logits 处理器。如果传递了已使用参数或生成配置创建的 logit 处理器,则会抛出错误。此功能适用于高级用户。 - stopping_criteria (
StoppingCriteriaList,可选) — 补充从参数和生成配置构建的默认停止标准的自定义停止标准。如果传递了已使用参数或生成配置创建的停止标准,则会抛出错误。如果您的停止标准取决于scores输入,请确保将return_dict_in_generate=True, output_scores=True传递给generate。此功能适用于高级用户。 - prefix_allowed_tokens_fn (
Callable[[int, torch.Tensor], list[int]],可选) — 如果提供,此函数在每一步将束搜索限制为仅允许的 token。如果未提供,则不应用约束。此函数接受 2 个参数:batch IDbatch_id和input_ids。它必须返回一个列表,其中包含在以batch_id和之前生成的 tokeninputs_ids为条件时,下一个生成步骤允许的 token。此参数对于以特定前缀为条件的约束生成非常有用,详见 自回归实体检索(Autoregressive Entity Retrieval)。 - synced_gpus (
bool,可选) — 是否继续运行 while 循环直到达到 max_length。除非被覆盖,否则在使用FullyShardedDataParallel或具有多个 GPU 的 DeepSpeed ZeRO Stage 3 时,此标志将设置为True,以避免在一个 GPU 比其他 GPU 先完成生成时发生死锁。否则,默认为False。 - assistant_model (
PreTrainedModel,可选) — 可用于加速生成的助手模型。助手模型必须具有完全相同的分词器。当使用助手模型预测候选 token 比在当前模型上运行生成快得多时,即可实现加速。因此,助手模型应该小得多。 - streamer (
BaseStreamer,可选) — 将用于流式传输生成序列的 Streamer 对象。生成的 token 将通过streamer.put(token_ids)传递,由 streamer 负责任何后续处理。 - negative_prompt_ids (形状为
(batch_size, sequence_length)的torch.LongTensor,可选) — 某些处理器(如 CFG)所需的负面提示词。batch size 必须与输入 batch size 匹配。这是一个实验性功能,将来可能会有破坏性的 API 更改。 - negative_prompt_attention_mask (形状为
(batch_size, sequence_length)的torch.LongTensor,可选) —negative_prompt_ids的注意力掩码(attention_mask)。 - custom_generate (
str或Callable,可选) — 可是以下之一:str(Hugging Face Hub 仓库名称):运行在该仓库custom_generate/generate.py中定义的自定义generate函数,而不是标准generate方法。该仓库将完全替换生成逻辑,且返回类型可能不同。str(本地仓库路径):同上,但来自本地路径,不需要trust_remote_code。Callable:generate将执行通常的输入准备步骤,然后调用提供的可调用对象来运行解码循环。更多信息请参见 文档。
- kwargs (
dict[str, Any],可选) —generation_config的即时参数化和/或将转发给模型forward函数的其他模型特定关键字参数。如果模型是 encoder-decoder 模型,则编码器特定的关键字参数不应加前缀,而解码器特定的关键字参数应加 decoder_ 前缀。
返回
ModelOutput 或 torch.LongTensor
一个 ModelOutput(如果 return_dict_in_generate=True 或 config.return_dict_in_generate=True)或一个 torch.LongTensor。
如果模型*不是*编码器-解码器模型(model.config.is_encoder_decoder=False),可能的 ModelOutput 类型为
如果模型是编码器-解码器模型(model.config.is_encoder_decoder=True),可能的 ModelOutput 类型为
为具有语言建模头的模型生成词元 ID 序列。
大多数生成控制参数在
generation_config中设置,如果未传递generation_config,则将设置为模型的默认生成配置。您可以通过将相应的参数传递给 generate() 来覆盖任何generation_config,例如.generate(inputs, num_beams=4, do_sample=True)。有关生成策略和代码示例的概述,请查阅以下指南。
compute_transition_scores
< source >( sequences: Tensor scores: tuple beam_indices: torch.Tensor | None = None normalize_logits: bool = False ) → torch.Tensor
参数
- sequences (
torch.LongTensor) — 生成的序列。第二维(sequence_length)要么等于max_length,要么由于所有批次因eos_token_id而提前结束而更短。 - scores (
tuple(torch.FloatTensor)) — 每个生成步骤中每个词表 token 的转移分数。束转移分数由基于该束中先前生成的 token 的 log softmax 条件下的 token 对数概率组成。torch.FloatTensor元组,最多包含max_new_tokens个元素(每个生成的 token 一个元素),每个张量的形状为(batch_size*num_beams, config.vocab_size)。 - beam_indices (
torch.LongTensor, 可选) — 每个生成步骤中生成的 token ID 的束索引。形状为(batch_size*num_return_sequences, sequence_length)的torch.LongTensor。仅在生成时num_beams>1时需要。 - normalize_logits (
bool, 可选,默认为False) — 是否对 logits 进行归一化(由于遗留原因,logits 可能未经过归一化)。
返回
torch.Tensor
一个形状为 (batch_size*num_return_sequences, sequence_length) 的 torch.Tensor,包含转移分数 (logits)
根据生成分数(以及如果使用了束搜索,则包括束索引)计算序列的转移分数。这是一种在生成时快速获取所选 token 分数的便捷方法。
示例
>>> from transformers import GPT2Tokenizer, AutoModelForCausalLM
>>> import numpy as np
>>> tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer.pad_token_id = tokenizer.eos_token_id
>>> inputs = tokenizer(["Today is"], return_tensors="pt")
>>> # Example 1: Print the scores for each token generated with Greedy Search
>>> outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True)
>>> transition_scores = model.compute_transition_scores(
... outputs.sequences, outputs.scores, normalize_logits=True
... )
>>> # input_length is the length of the input prompt for decoder-only models, like the GPT family, and 1 for
>>> # encoder-decoder models, like BART or T5.
>>> input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1]
>>> generated_tokens = outputs.sequences[:, input_length:]
>>> for tok, score in zip(generated_tokens[0], transition_scores[0]):
... # | token | token string | log probability | probability
... print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}")
| 262 | the | -1.414 | 24.33%
| 1110 | day | -2.609 | 7.36%
| 618 | when | -2.010 | 13.40%
| 356 | we | -1.859 | 15.58%
| 460 | can | -2.508 | 8.14%
>>> # Example 2: Reconstruct the sequence scores from Beam Search
>>> outputs = model.generate(
... **inputs,
... max_new_tokens=5,
... num_beams=4,
... num_return_sequences=4,
... return_dict_in_generate=True,
... output_scores=True,
... )
>>> transition_scores = model.compute_transition_scores(
... outputs.sequences, outputs.scores, outputs.beam_indices, normalize_logits=False
... )
>>> # If you sum the generated tokens' scores and apply the length penalty, you'll get the sequence scores.
>>> # Tip 1: recomputing the scores is only guaranteed to match with `normalize_logits=False`. Depending on the
>>> # use case, you might want to recompute it with `normalize_logits=True`.
>>> # Tip 2: the output length does NOT include the input length
>>> output_length = np.sum(transition_scores.numpy() < 0, axis=1)
>>> length_penalty = model.generation_config.length_penalty
>>> reconstructed_scores = transition_scores.sum(axis=1) / (output_length**length_penalty)
>>> print(np.allclose(outputs.sequences_scores, reconstructed_scores))
TrueContinuousMixin
为模型添加连续批处理(continuous batching)功能的 Mixin 类。连续批处理有三个入口点
init_continuous_batching,它是连续批处理的实际入口点continuous_batching_context_manager,它本身是init_continuous_batching的一个封装generate_batch,它实际上是continuous_batching_context_manager的一个封装
它们按此顺序定义。对这三个入口点中的任何一个所做的更改都应反映在另外两个中。
continuous_batching_context_manager
< source >( generation_config: transformers.generation.configuration_utils.GenerationConfig | None = None block: bool = True timeout: float | None = None continuous_batching_config: transformers.generation.configuration_utils.ContinuousBatchingConfig | None = None persistent_manager: bool = False warmup: bool = True workload_hints: transformers.generation.continuous_batching.utils.WorkloadHints | None = None )
安全使用连续批处理管理器的上下文管理器。参数与 init_continuous_batching 的参数相似,除了
- block: 停止管理器时是否阻塞线程。默认为 True。
- timeout: 等待线程停止的最大时间。默认为 None(无超时)。
- warmup: 是否在运行前预捕获最大尺寸的 CUDA 图。默认为 True。
销毁缓存的连续批处理管理器并释放 GPU 资源。
generate_batch
< source >( inputs: list generation_config: transformers.generation.configuration_utils.GenerationConfig | None = None continuous_batching_config: transformers.generation.configuration_utils.ContinuousBatchingConfig | None = None record_timestamps: bool = False progress_bar: bool = True persistent_manager: bool = False warmup: bool = True **kwargs ) → dict[str, GenerationOutput]
参数
- inputs — 输入 token 序列列表(提示词)
- generation_config — 可选生成配置
- continuous_batching_config — 可选连续批处理配置
- record_timestamps — 如果设置为 true,请求将包含每个生成的 token 的时间戳
- progress_bar — 如果设置为 true,将显示进度条
- persistent_manager — 生成完成后是否持久化管理器。默认为 False。
- warmup — 是否在处理请求之前预捕获 CUDA 图。默认为 True。
返回
dict[str, GenerationOutput]
一个请求 ID 到 GenerationOutput 对象的字典
使用连续批处理为一批提示词生成序列。
init_continuous_batching
< source >( generation_config: transformers.generation.configuration_utils.GenerationConfig | None = None continuous_batching_config: transformers.generation.configuration_utils.ContinuousBatchingConfig | None = None workload_hints: transformers.generation.continuous_batching.utils.WorkloadHints | None = None ) → ContinuousBatchingManager
初始化一个用于连续批处理推理的管理器。
ContinuousBatchingManager
class transformers.ContinuousBatchingManager
< source >( model: ProtoPretrainedModel generation_config: GenerationConfig continuous_batching_config: ContinuousBatchingConfig workload_hints: transformers.generation.continuous_batching.utils.WorkloadHints | None = None )
用于处理生成请求连续批处理的管理器。它提供了一个用户界面,用于提交生成请求、检索结果以及管理后台生成线程。此类不应直接创建,而应通过以下入口点之一创建(均为 ContinuousMixin mixin 的方法)
init_continuous_batchingcontinuous_batching_context_managergenerate_batch
add_request
< source >( input_ids: list request_id: str | None = None max_new_tokens: int | None = None streaming: bool = False record_timestamps: bool = False eos_token_id: int | list[int] | None = None **logit_processor_kwargs: typing.Any ) → str | None
参数
- input_ids — 用作提示词的输入 token ID
- request_id — 可选的自定义请求 ID(如果为 None 则自动生成)
- max_new_tokens — 要生成的最大新 token 数量
- streaming — 是否在生成 token 时进行流式传输
- record_timestamps — 是否为每个生成的 token 记录时间戳
- eos_token_id — 序列结束 token ID
- logit_processor_kwargs — logits 处理器的关键字参数。
返回
str | None
如果进程是 TP 驱动程序,则返回请求 ID,否则返回 None。
将新的生成请求添加到队列。如果进程不是 TP 驱动程序,则此操作不执行任何操作。
add_requests
< source >( inputs: list max_new_tokens: int | None = None streaming: bool = False record_timestamps: bool = False **logit_processor_kwargs: typing.Any )
批量执行 add_request 并返回其 ID 的实用函数。详情请查看其文档。
按 ID 取消请求。如果是从非 TP 驱动程序的进程调用的,则不执行任何操作:只有 TP 驱动程序进程会与管理器交互。
终止管理器并释放分布式资源。可以安全地多次调用。调用此方法后,管理器无法重新启动。
从输出队列中检索一个结果。如果提供了 ID,则返回第一个匹配的请求。如果提供了超时时间,则在超时(以秒为单位)后返回 None。
如果后台生成线程已启动且仍处于存活状态,则返回 True。
等待后台线程完成。可以使用 timeout 参数(以秒为单位)限制等待时间。
register_result_handler
< source >( request_id: str callback: Callable )
注册一个用于结果交付的回调(流式或非流式)。
每当为该请求产生结果时,都会通过 call_soon_threadsafe 在事件循环上调用该回调。对于流式请求,这发生在每个 token 上;对于非流式请求,仅在完成时发生。处理程序在请求结束时会自动清理。
迭代匹配特定请求 ID 的结果(阻塞)。
通过重新排队的方式使用共享输出队列。对于高并发服务,请改用 register_result_handler。
启动后台生成线程。
stop
< source >( block: bool = True timeout: float | None = None keep_for_next_session: bool = False hard_stop: bool = False )
停止后台生成线程。如果 block 标志设置为 True,则此方法将等待线程停止,最长时间为 timeout 秒(None 表示无超时)。如果 keep_for_next_session 标志设置为 True,则管理器将缓存到模型上以供将来使用。如果设置了 hard_stop 标志,后台生成线程将立即停止,未完成的请求将失败。
切换到 paged 版本的注意力实现。如果注意力已经是 paged,则不执行任何操作。
通过运行虚拟批次预捕获可变长度(varlen)和解码路径的 CUDA 图。如果尚未完成,则初始化批处理器。
Scheduler
连续批处理器中调度请求的抽象基类。调度器管理请求从被添加到等待队列到被调度进行处理的整个生命周期。不同的调度器实现了不同的策略来确定请求的优先级和进行批处理。
将请求添加到等待列表。
从活动队列和等待队列中移除所有已取消的请求。
完成请求的处理并释放其分配的缓存块。当请求完成生成或遇到错误时会调用此方法。
获取活动请求已生成的 token。
检查是否有准备好处理的请求。
移除并返回一个被选为“驱逐牺牲者”的活动请求,用于缓存压力卸载或软重置。当 block_new_requests 被设置时选取最新的活动请求,否则选取最旧的。
检查请求是否已被取消或移除。
为新的生成循环重置调度器状态。
根据可用的 token 预算和缓存预算调度下一批请求。此方法会综合考虑预算和调度器的优先级规则,选择当前批次中应处理的请求。token_budget 是批次中可处理的最大 token 数量,cache_budget 是批次中可读取的最大 KV 缓存条目数。返回以 “FutureRequestState” 形式呈现的已调度请求列表、一个指示是否可以使用解码快速路径的布尔值、查询 token 的总数以及读取的 KV token 的最大数量。
标记待取消的请求。
FIFOScheduler
class transformers.generation.FIFOScheduler
< source >( cache: PagedAttentionCache safety_margin: float = 0.2 )
该调度器按请求到达的顺序进行处理,这意味着解码(decoding)请求的优先级高于预填充(prefilling)请求。此外,它包含一个安全余量机制以防止缓存耗尽。默认情况下,当 80% 的缓存已满时,将不再调度新请求,以便优先处理活动请求的解码。
PrefillFirstScheduler
优先处理拆分预填充(split prefill)请求而非解码请求的调度器。该调度器确保在处理新的解码请求之前,先完成拆分预填充请求(即部分处理过的提示词的延续)。