生成实用工具
此页面列出了 generate() 使用的所有实用函数。
生成输出
generate() 的输出是 ModelOutput 子类的实例。该输出是一个数据结构,包含 generate() 返回的所有信息,同时也可作为元组或字典使用。
以下是一个示例:
from transformers import GPT2Tokenizer, GPT2LMHeadModel
tokenizer = GPT2Tokenizer.from_pretrained("openai-community/gpt2")
model = GPT2LMHeadModel.from_pretrained("openai-community/gpt2")
inputs = tokenizer("Hello, my dog is cute and ", return_tensors="pt")
generation_output = model.generate(**inputs, return_dict_in_generate=True, output_scores=True)generation_output 对象是一个 GenerateDecoderOnlyOutput,如下方该类的文档所示,它包含以下属性:
sequences:生成的 token 序列scores(可选):语言建模头在每个生成步骤中的预测分数hidden_states(可选):模型在每个生成步骤中的隐藏状态attentions(可选):模型在每个生成步骤中的注意力权重
由于我们传入了 output_scores=True,因此这里会有 scores;但由于我们没有传入 output_hidden_states=True 或 output_attentions=True,所以没有 hidden_states 和 attentions。
您可以像往常一样访问每个属性,如果该属性未被模型返回,您将获得 None。例如,generation_output.scores 是语言建模头的所有生成预测分数,而 generation_output.attentions 为 None。
当我们将 generation_output 对象作为元组使用时,它仅保留那些值不为 None 的属性。
例如,这里它有两个元素,先是 loss,然后是 logits,因此
generation_output[:2]例如,将返回元组 (generation_output.sequences, generation_output.scores)。
将我们的 generation_output 对象作为字典使用时,它仅保留值不为 None 的属性。例如,这里它有两个键,分别是 sequences 和 scores。
我们在此处记录了所有输出类型。
class transformers.generation.GenerateDecoderOnlyOutput
< source >( sequences: LongTensorscores: tuple[torch.Tensor] | None = Nonelogits: tuple[torch.Tensor] | None = Noneattentions: tuple[tuple[torch.Tensor]] | None = Nonehidden_states: tuple[tuple[torch.Tensor]] | None = Nonepast_key_values: transformers.cache_utils.Cache | None = None )
参数
- sequences(形状为
(batch_size, sequence_length)的torch.LongTensor)— 生成的序列。第二个维度(sequence_length)等于max_length,或者更短(如果所有批次都因eos_token_id而提前结束)。 - scores (
tuple(torch.Tensor)可选,当output_scores=True时返回) — 语言建模头在每一步生成时的处理后的预测分数(SoftMax 之前每个词汇表 token 的分数)。 一个torch.Tensor元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素), 每个张量的形状为(batch_size, config.vocab_size)。 - logits (
tuple(torch.Tensor)可选,当output_logits=True时返回) — 语言建模头在每个生成步骤的未处理预测分数(SoftMax 之前每个词汇表 token 的分数)。torch.Tensor的元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素),每个张量的形状为(batch_size, config.vocab_size)。 - attentions (
tuple(tuple(torch.Tensor)),可选,当output_attentions=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素又是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size, num_heads, generated_length, sequence_length)的torch.Tensor。 - hidden_states (
tuple(tuple(torch.Tensor)),可选,当output_hidden_states=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size, generated_length, hidden_size)的torch.Tensor。 - past_key_values (
Cache,可选,当use_cache=True时返回) — 返回模型缓存,用于加速解码。不同模型的缓存格式不同,请参阅相应模型的文档。通常是一个 Cache 实例。
在使用非束搜索方法时,仅解码器生成模型的输出。
类 transformers.generation.GenerateEncoderDecoderOutput
< source >( sequences: LongTensorscores: tuple[torch.Tensor] | None = Nonelogits: tuple[torch.Tensor] | None = Noneencoder_attentions: tuple[torch.Tensor] | None = Noneencoder_hidden_states: tuple[torch.Tensor] | None = Nonedecoder_attentions: tuple[tuple[torch.Tensor]] | None = Nonecross_attentions: tuple[tuple[torch.Tensor]] | None = Nonedecoder_hidden_states: tuple[tuple[torch.Tensor]] | None = Nonepast_key_values: transformers.cache_utils.Cache | None = None )
参数
- sequences(形状为
(batch_size*num_return_sequences, sequence_length)的torch.LongTensor)— 生成的序列。第二个维度(sequence_length)等于max_length,或者更短(如果所有批次都因eos_token_id而提前结束)。 - scores (
tuple(torch.Tensor)可选,当output_scores=True时返回) — 语言建模头在每一步生成时的处理后的预测分数(SoftMax 之前每个词汇表 token 的分数)。 一个torch.Tensor元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素), 每个张量的形状为(batch_size, config.vocab_size)。 - logits (
tuple(torch.Tensor)可选,当output_logits=True时返回) — 语言建模头在每个生成步骤的未处理预测分数(SoftMax 之前每个词汇表 token 的分数)。torch.Tensor的元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素),每个张量的形状为(batch_size, config.vocab_size)。 - encoder_attentions (
tuple(torch.Tensor),可选,当output_attentions=True时返回) —torch.Tensor的元组(解码器的每一层对应一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。 - encoder_hidden_states (
tuple(torch.Tensor),可选,当output_hidden_states=True时返回) —torch.Tensor的元组(包含嵌入层的输出以及每一层的输出),形状为(batch_size, sequence_length, hidden_size)。 - decoder_attentions (
tuple(tuple(torch.Tensor)),可选,当output_attentions=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size, num_heads, generated_length, sequence_length)的torch.Tensor。 - cross_attentions (
tuple(tuple(torch.Tensor)),可选,当output_attentions=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size, num_heads, generated_length, sequence_length)的torch.Tensor。 - decoder_hidden_states (
tuple(tuple(torch.Tensor)),可选,当output_hidden_states=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size, generated_length, hidden_size)的torch.Tensor。 - past_key_values (
Cache,可选,当use_cache=True时返回) — 返回模型缓存,用于加速解码。不同模型的缓存格式不同,请参阅相应模型的文档。通常是一个 Cache 实例。
在使用非束搜索方法时,编码器-解码器生成模型的输出。
类 transformers.generation.GenerateBeamDecoderOnlyOutput
< source >( sequences: LongTensorsequences_scores: typing.Optional[torch.Tensor] = Nonescores: tuple[torch.Tensor] | None = Nonelogits: tuple[torch.Tensor] | None = Nonebeam_indices: typing.Optional[torch.LongTensor] = Noneattentions: tuple[tuple[torch.Tensor]] | None = Nonehidden_states: tuple[tuple[torch.Tensor]] | None = Nonepast_key_values: transformers.cache_utils.Cache | None = None )
参数
- sequences(形状为
(batch_size*num_return_sequences, sequence_length)的torch.LongTensor)— 生成的序列。第二个维度(sequence_length)等于max_length,或者更短(如果所有批次都因eos_token_id而提前结束)。 - sequences_scores(形状为
(batch_size*num_return_sequences)的torch.Tensor,可选,当output_scores=True时返回) — 生成的sequences的最终束搜索分数。 - scores (
tuple(torch.Tensor)可选,当output_scores=True时返回) — 每个生成步骤中每个词汇表 token 的 beam 转移分数。Beam 转移分数由 token 的对数概率组成,这些概率以该 beam 中先前生成的 token 的 log softmax 为条件。torch.Tensor的元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素),每个张量的形状为(batch_size*num_beams, config.vocab_size)。 - logits (
tuple(torch.Tensor)可选,当output_logits=True时返回) — 语言建模头在每个生成步骤的未处理预测分数(SoftMax 之前每个词汇表 token 的分数)。torch.Tensor的元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素), 每个张量的形状为(batch_size*num_beams, config.vocab_size)。 - beam_indices (
torch.LongTensor,可选,当output_scores=True时返回) — 生成过程中每个生成步骤中生成 token id 的 beam 索引。torch.LongTensor,形状为(batch_size*num_return_sequences, sequence_length)。 - attentions (
tuple(tuple(torch.Tensor)),可选,当output_attentions=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素又是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size*num_beams, num_heads, generated_length, sequence_length)的torch.Tensor。 - hidden_states (
tuple(tuple(torch.Tensor)),可选,当output_hidden_states=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size*num_beams*num_return_sequences, generated_length, hidden_size)的torch.Tensor。 - past_key_values (
Cache,可选,当use_cache=True时返回) — 返回模型缓存,用于加速解码。不同模型的缓存格式不同,请参阅相应模型的文档。通常是一个 Cache 实例。
在使用束搜索方法时,仅解码器生成模型的输出。
类 transformers.generation.GenerateBeamEncoderDecoderOutput
< source >( sequences: LongTensorsequences_scores: typing.Optional[torch.Tensor] = Nonescores: tuple[torch.Tensor] | None = Nonelogits: tuple[torch.Tensor] | None = Nonebeam_indices: typing.Optional[torch.LongTensor] = Noneencoder_attentions: tuple[torch.Tensor] | None = Noneencoder_hidden_states: tuple[torch.Tensor] | None = Nonedecoder_attentions: tuple[tuple[torch.Tensor]] | None = Nonecross_attentions: tuple[tuple[torch.Tensor]] | None = Nonedecoder_hidden_states: tuple[tuple[torch.Tensor]] | None = Nonepast_key_values: transformers.cache_utils.Cache | None = None )
参数
- sequences(形状为
(batch_size*num_return_sequences, sequence_length)的torch.LongTensor)— 生成的序列。第二个维度(sequence_length)等于max_length,或者更短(如果所有批次都因eos_token_id而提前结束)。 - sequences_scores(形状为
(batch_size*num_return_sequences)的torch.Tensor,可选,当output_scores=True时返回) — 生成的sequences的最终束搜索分数。 - scores (
tuple(torch.Tensor)可选,当output_scores=True时返回) — 每个生成步骤中每个词汇表 token 的 beam 转移分数。Beam 转移分数由 token 的对数概率组成,这些概率以该 beam 中先前生成的 token 的 log softmax 为条件。torch.Tensor的元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素),每个张量的形状为(batch_size*num_beams, config.vocab_size)。 - logits (
tuple(torch.Tensor)可选,当output_logits=True时返回) — 语言建模头在每个生成步骤的未处理预测分数(SoftMax 之前每个词汇表 token 的分数)。torch.Tensor的元组,最多包含max_new_tokens个元素(每个生成的 token 对应一个元素), 每个张量的形状为(batch_size*num_beams, config.vocab_size)。 - beam_indices (
torch.LongTensor,可选,当output_scores=True时返回) — 生成过程中每个生成步骤中生成 token id 的 beam 索引。torch.LongTensor,形状为(batch_size*num_return_sequences, sequence_length)。 - encoder_attentions (
tuple(torch.Tensor),可选,当output_attentions=True时返回) —torch.Tensor的元组(解码器的每一层对应一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。 - encoder_hidden_states (
tuple(torch.Tensor),可选,当output_hidden_states=True时返回) —torch.Tensor的元组(包含嵌入层的输出以及每一层的输出),形状为(batch_size*num_beams*num_return_sequences, sequence_length, hidden_size)。 - decoder_attentions (
tuple(tuple(torch.Tensor)),可选,当output_attentions=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size*num_beams*num_return_sequences, num_heads, generated_length, sequence_length)的torch.Tensor。 - cross_attentions (
tuple(tuple(torch.Tensor)),可选,当output_attentions=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size, num_heads, generated_length, sequence_length)的torch.Tensor。 - decoder_hidden_states (
tuple(tuple(torch.Tensor)),可选,当output_hidden_states=True时返回) — 元组(每个生成的 token 对应一个元素),其中每个元素是一个元组(解码器的每一层对应一个元素),包含形状为(batch_size*num_beams*num_return_sequences, generated_length, hidden_size)的torch.Tensor。 - past_key_values (
Cache,可选,当use_cache=True时返回) — 返回模型缓存,用于加速解码。不同模型的缓存格式不同,请参阅相应模型的文档。通常是一个 Cache 实例。
在使用束搜索方法时,编码器-解码器生成模型的输出。
LogitsProcessor
LogitsProcessor 可用于修改语言模型头在生成过程中的预测分数。
class transformers.AlternatingCodebooksLogitsProcessor
< source >( input_start_len: intsemantic_vocab_size: intcodebook_size: int )
用于强制 Bark 的两个码本之间交替生成的 LogitsProcessor。
此 logits 处理器仅与 Bark 的细粒度子模型兼容。请参阅模型文档以获取示例。
class transformers.ClassifierFreeGuidanceLogitsProcessor
< source >( guidance_scale )
用于分类器自由引导(CFG)的 LogitsProcessor。分数沿批次维度进行拆分,其中前半部分对应条件 logits(由输入提示预测得出),后半部分对应无条件 logits(由空提示或“null”提示预测得出)。该处理器根据 guidance_scale 参数,计算条件 logits 与无条件 logits 的加权平均值。
有关更多信息,请参阅该论文。
此 logits 处理器仅与 MusicGen 兼容
示例:
>>> from transformers import AutoProcessor, MusicgenForConditionalGeneration
>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
>>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
>>> inputs = processor(
... text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
... padding=True,
... return_tensors="pt",
... )
>>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.EncoderNoRepeatNGramLogitsProcessor
< source >( encoder_ngram_size: intencoder_input_ids: LongTensor )
LogitsProcessor 的工作方式与 NoRepeatNGramLogitsProcessor 类似,但仅用于防止提示词中已存在的 n-gram 重复出现。
它旨在通过阻止生成先前对话轮次中已存在的 n-gram,来促进语言模型的对话性。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("bigscience/bloomz-560m")
>>> tokenizer = AutoTokenizer.from_pretrained("bigscience/bloomz-560m")
>>> inputs = tokenizer("Alice: I love cats. What do you love?\nBob:", return_tensors="pt")
>>> # With greedy decoding, we see Bob repeating Alice's opinion. If Bob was a chatbot, it would be a poor one.
>>> outputs = model.generate(**inputs)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
Alice: I love cats. What do you love?
Bob: I love cats. What do you
>>> # With this logits processor, we can prevent Bob from repeating Alice's opinion.
>>> outputs = model.generate(**inputs, encoder_no_repeat_ngram_size=2)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
Alice: I love cats. What do you love?
Bob: My cats are very cute.__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.EncoderRepetitionPenaltyLogitsProcessor
< source >( penalty: floatencoder_input_ids: LongTensor )
LogitsProcessor 的工作方式与 RepetitionPenaltyLogitsProcessor 类似,但会对提示词中已存在的 token 施加一个 反向 惩罚。换句话说,大于 1.0 的惩罚值会提高选中提示词中已存在 token 的概率。
它旨在避免在基于输入的任务(如摘要生成)中出现幻觉。尽管最初是为编码器-解码器模型设计的,但它也可以用于 LLM 等仅解码器模型。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("bigscience/bloomz-560m")
>>> model = AutoModelForCausalLM.from_pretrained("bigscience/bloomz-560m")
>>> inputs = tokenizer(["Alice and Bob. The third member's name was"], return_tensors="pt")
>>> gen_out = model.generate(**inputs)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
Alice and Bob. The third member's name was not mentioned.
>>> # With the `encoder_repetition_penalty` argument we can trigger this logits processor in `generate`, which can
>>> # promote the use of prompt tokens ("Bob" in this example)
>>> gen_out = model.generate(**inputs, encoder_repetition_penalty=1.2)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
Alice and Bob. The third member's name was Bob. The third member's name was Bob.__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.EpsilonLogitsWarper
< source >( epsilon: floatfilter_value: float = -infmin_tokens_to_keep: int = 1 )
执行 epsilon 采样的 LogitsProcessor,即仅保留满足 prob >= epsilon 的 token。如果没有 token 满足该约束,则保留概率最高的 min_tokens_to_keep 个 token。更多信息请参阅 Truncation Sampling as Language Model Desmoothing。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> set_seed(1)
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer("A sequence: 1, 2", return_tensors="pt")
>>> # With sampling, the output is unexpected -- sometimes too unexpected.
>>> outputs = model.generate(**inputs, do_sample=True)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3 | < 4 (left-hand pointer) ;
<BLANKLINE>
<BLANKLINE>
>>> # With epsilon sampling, the output gets restricted to high-probability tokens. Note that this is similar to
>>> # Top P sampling, which restricts tokens based on their cumulative probability.
>>> # Pro tip: The paper recommends using `epsilon_cutoff` values between 3e-4 and 9e-4
>>> outputs = model.generate(**inputs, do_sample=True, epsilon_cutoff=0.1)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.EtaLogitsWarper
< source >( epsilon: floatfilter_value: float = -infmin_tokens_to_keep: int = 1device: str = 'cpu' )
参数
- epsilon (
float) — 取值范围为 (0, 1) 的浮点数值。用于计算动态截断值eta的超参数。根据模型大小,论文中建议的取值范围在 3e-4 到 4e-3 之间。 - filter_value (
float, 可选,默认为 -inf) — 所有低于动态截断值eta的值都会被设置为该浮点数值。当需要修改极低概率 token 的 logits,以将其完全排除在生成过程之外时,此参数非常有用。 - min_tokens_to_keep (
int,可选,默认为 1) — 指定生成时必须保留的最小 token 数量,无论其概率如何。 例如,如果将min_tokens_to_keep设置为 1,则无论所有 token 的概率是否都低于截断值eta,生成时始终至少会保留一个 token。 - device (
str,可选,默认为"cpu") — 用于分配张量的设备。
执行 eta 采样的 LogitsProcessor,这是一种用于过滤掉概率低于动态阈值 eta 的 token 的技术。该阈值基于超参数 epsilon 与 token 概率熵的组合计算得出,即 eta := min(epsilon, sqrt(epsilon * e^-entropy(probabilities)))。如果没有 token 满足此约束,则保留最大的 min_tokens_to_keep 个 token。它解决了由神经语言模型生成的长文本样本质量不佳的问题,从而生成更连贯、更流畅的文本。更多信息请参阅 Truncation Sampling as Language Model Desmoothing。注意:要使此 LogitsProcessor 正常工作,必须将 do_sample 设置为 True。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> set_seed(1)
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer("A sequence: 1, 2", return_tensors="pt")
>>> # With sampling, the output is unexpected -- sometimes too unexpected.
>>> outputs = model.generate(**inputs, do_sample=True)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3 | < 4 (left-hand pointer) ;
<BLANKLINE>
<BLANKLINE>
>>> # With eta sampling, the output gets restricted to high-probability tokens. You can see it as a dynamic form of
>>> # epsilon sampling that adapts its cutoff probability based on the entropy (high entropy = lower cutoff).
>>> # Pro tip: The paper recommends using `eta_cutoff` values between 3e-4 to 4e-3
>>> outputs = model.generate(**inputs, do_sample=True, eta_cutoff=0.1)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.ExponentialDecayLengthPenalty
< source >( exponential_decay_length_penalty: tuple[int, float]eos_token_id: typing.Union[int, list[int], torch.Tensor]input_ids_seq_length: int )
LogitsProcessor 在达到 start_index 后,会指数级地提高 eos_token_id 的得分。这使得生成的序列更短,而无需硬性截断,从而让 eos_token 能够在有意义的位置被预测出来。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> text = "Just wanted to let you know, I"
>>> inputs = tokenizer(text, return_tensors="pt")
>>> # Let's consider that we want short sentences, so we limit `max_length=30`. However, we observe that the answer
>>> # tends to end abruptly.
>>> set_seed(1)
>>> outputs = model.generate(**inputs, do_sample=True, temperature=0.9, max_length=30, pad_token_id=50256)
>>> print(tokenizer.batch_decode(outputs)[0])
Just wanted to let you know, I received a link to an ebook, the book How To Start A Social Network which was
published in 2010. Although
>>> # To promote the appearance of the EOS token at the right time, we add the `exponential_decay_length_penalty =
>>> # (start_index, decay_factor)`. Instead of cutting at max_tokens, the output comes to an end before and usually
>>> # with more meaning. What happens is that starting from `start_index` the EOS token score will be increased
>>> # by `decay_factor` exponentially. However, if you set a high decay factor, you may also end up with abruptly
>>> # ending sequences.
>>> set_seed(1)
>>> outputs = model.generate(
... **inputs,
... do_sample=True,
... temperature=0.9,
... max_length=30,
... pad_token_id=50256,
... exponential_decay_length_penalty=(15, 1.6),
... )
>>> print(tokenizer.batch_decode(outputs)[0])
Just wanted to let you know, I received a link to an ebook, the book How To Start A Social Network
which<|endoftext|>
>>> # With a small decay factor, you will have a higher chance of getting a meaningful sequence.
>>> set_seed(1)
>>> outputs = model.generate(
... **inputs,
... do_sample=True,
... temperature=0.9,
... max_length=30,
... pad_token_id=50256,
... exponential_decay_length_penalty=(15, 1.01),
... )
>>> print(tokenizer.batch_decode(outputs)[0])
Just wanted to let you know, I received a link to an ebook, the book How To Start A Social Network which was
published in 2010.<|endoftext|>__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.ForcedBOSTokenLogitsProcessor
< source >( bos_token_id: int )
LogitsProcessor,用于强制将指定 token 作为生成的第一个 token。与编码器-解码器模型配合使用。
示例:
>>> from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
>>> model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-small")
>>> tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-small")
>>> inputs = tokenizer("Translate from English to German: I love cats.", return_tensors="pt")
>>> # By default, it continues generating according to the model's logits
>>> outputs = model.generate(**inputs, max_new_tokens=10)
>>> print(tokenizer.batch_decode(outputs)[0])
<pad> Ich liebe Kitty.</s>
>>> # We can use `forced_bos_token_id` to force the start of generation with an encoder-decoder model
>>> # (including forcing it to end straight away with an EOS token)
>>> outputs = model.generate(**inputs, max_new_tokens=10, forced_bos_token_id=tokenizer.eos_token_id)
>>> print(tokenizer.batch_decode(outputs)[0])
<pad></s>__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.ForcedEOSTokenLogitsProcessor
< source >( max_length: inteos_token_id: typing.Union[int, list[int], torch.Tensor]device: str = 'cpu' )
LogitsProcessor,当达到 max_length 时,强制将指定 token 作为最后一个生成的 token。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer("A sequence: 1, 2, 3", return_tensors="pt")
>>> # By default, it continues generating according to the model's logits
>>> outputs = model.generate(**inputs, max_new_tokens=10)
>>> print(tokenizer.batch_decode(outputs)[0])
A sequence: 1, 2, 3, 4, 5, 6, 7, 8
>>> # `forced_eos_token_id` ensures the generation ends with a EOS token
>>> outputs = model.generate(**inputs, max_new_tokens=10, forced_eos_token_id=tokenizer.eos_token_id)
>>> print(tokenizer.batch_decode(outputs)[0])
A sequence: 1, 2, 3, 4, 5, 6, 7,<|endoftext|>__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
LogitsProcessor 会移除所有 nan 和 inf 值,以避免生成方法失败。请注意,仅在必要时才应使用 logits 处理器,因为它可能会降低生成方法的速度。
此 logits 处理器没有 generate 示例,因为不存在能够证明其使用合理性的正确标志组合。
__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
LogitsProcessor 用于使用 log-softmax 对分数进行归一化。在应用 logits 处理器或变换器之后,对分数进行归一化非常重要,因为本库中使用的搜索算法不会执行此操作(它只在之前执行,但可能需要重新归一化),但在比较假设时,它仍然假定分数已经过归一化。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> import torch
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer("A sequence: 1, 2, 3", return_tensors="pt")
>>> # By default, the scores are not normalized -- the sum of their exponentials is NOT a normalized probability
>>> # distribution, summing to 1
>>> outputs = model.generate(**inputs, return_dict_in_generate=True, output_scores=True)
>>> print(torch.allclose(torch.sum(torch.exp(outputs.scores[-1])), torch.Tensor((1.000,)), rtol=1e-4))
False
>>> # Normalizing them may have a positive impact on beam methods, or when using the scores on your application
>>> outputs = model.generate(**inputs, renormalize_logits=True, return_dict_in_generate=True, output_scores=True)
>>> print(torch.allclose(torch.sum(torch.exp(outputs.scores[-1])), torch.Tensor((1.000,)), rtol=1e-4))
True__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
所有可在生成过程中应用的 logit 处理器的抽象基类。
__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
此类可用于创建一个 LogitsProcessor 列表,以随后处理 scores 输入张量。
此类继承自 list,并添加了一个特定的 call 方法,将每个 LogitsProcessor 应用于输入。
__call__
< source >( input_ids: LongTensorscores: Tensor**kwargs ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。当不使用束搜索时,这些分数是词汇表中每个词的 logits;当使用束搜索时,这些分数是词汇表中每个 token 的 log softmax。 - kwargs (
dict[str, Any],可选) — 特定于 logits 处理器的额外 kwargs。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.MinLengthLogitsProcessor
< source >( min_length: inteos_token_id: typing.Union[int, list[int], torch.Tensor]device: str = 'cpu' )
LogitsProcessor 通过将 EOS 概率设为 0 来强制最小长度。请注意,对于大多数 LLM 等仅解码器模型,长度包含提示词。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("bigscience/bloomz-560m")
>>> model = AutoModelForCausalLM.from_pretrained("bigscience/bloomz-560m")
>>> inputs = tokenizer("A number:", return_tensors="pt")
>>> gen_out = model.generate(**inputs)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
A number: one
>>> # setting `min_length` to a value smaller than the uncontrolled output length has no impact
>>> gen_out = model.generate(**inputs, min_length=3)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
A number: one
>>> # setting a larger `min_length` will force the model to generate beyond its natural ending point, which is not
>>> # necessarily incorrect
>>> gen_out = model.generate(**inputs, min_length=10)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
A number: one thousand, nine hundred and ninety-four__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.MinNewTokensLengthLogitsProcessor
< source >( prompt_length_to_skip: intmin_new_tokens: inteos_token_id: typing.Union[int, list[int], torch.Tensor]device: str = 'cpu' )
LogitsProcessor 通过将 EOS(序列结束)token 的概率设为 0 来强制要求新生成 token 的最小长度。 与 MinLengthLogitsProcessor 相反,该处理器会忽略 prompt。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("bigscience/bloomz-560m")
>>> model = AutoModelForCausalLM.from_pretrained("bigscience/bloomz-560m")
>>> inputs = tokenizer(["A number:"], return_tensors="pt")
>>> gen_out = model.generate(**inputs)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
A number: one
>>> # setting `min_new_tokens` will force the model to generate beyond its natural ending point, which is not
>>> # necessarily incorrect
>>> gen_out = model.generate(**inputs, min_new_tokens=2)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
A number: one thousand__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.MinPLogitsWarper
< source >( min_p: floatfilter_value: float = -infmin_tokens_to_keep: int = 1 )
执行 min-p 的 LogitsProcessor,即保留所有概率高于最小概率阈值的 token,该阈值由最可能 token 的概率进行缩放。因此,当存在高概率 token 时,该过滤器会变得更加严格,这表明输出具有较高置信度,我们不应偏离该结果。
通常与 TemperatureLogitsWarper 一起使用。作为 TopPLogitsWarper 和 TopKLogitsWarper 的替代方案。
由 @menhguin 和 @kalomaze(GitHub 用户名)创建。代码改编自 此外部 PR
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> set_seed(1)
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer("A sequence: 1, 2", return_tensors="pt")
>>> # With sampling, the output is unexpected -- sometimes too unexpected.
>>> outputs = model.generate(**inputs, do_sample=True)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3 | < 4 (left-hand pointer) ;
<BLANKLINE>
<BLANKLINE>
>>> # With `min_p` sampling, the output gets restricted to high-probability tokens.
>>> # Pro tip: In practice, LLMs use `min_p` in the 0.01-0.2 range.
>>> outputs = model.generate(**inputs, do_sample=True, min_p=0.1)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9class transformers.NoBadWordsLogitsProcessor
< source >( bad_words_ids: list[list[int]]eos_token_id: typing.Union[int, list[int], torch.Tensor, NoneType] = None )
LogitsProcessor,用于强制确保指定的序列永远不会被选中。
为了获取不应出现在生成文本中的单词的 token id,请确保在初始化 tokenizer 时设置
add_prefix_space=True,并使用tokenizer(bad_words, add_special_tokens=False).input_ids。add_prefix_space参数仅适用于某些 slow tokenizer,因为 fast tokenizer 的前缀行为来自pre tokenizers。更多信息请参见此处。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> inputs = tokenizer(["In a word, the cake is a"], return_tensors="pt")
>>> output_ids = model.generate(inputs["input_ids"], max_new_tokens=5, pad_token_id=tokenizer.eos_token_id)
>>> print(tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0])
In a word, the cake is a bit of a mess.
>>> # Now let's take the bad words out. Please note that the tokenizer is initialized differently
>>> tokenizer_with_prefix_space = AutoTokenizer.from_pretrained("openai-community/gpt2", add_prefix_space=True)
>>> def get_tokens_as_list(word_list):
... "Converts a sequence of words into a list of tokens"
... tokens_list = []
... for word in word_list:
... tokenized_word = tokenizer_with_prefix_space([word], add_special_tokens=False).input_ids[0]
... tokens_list.append(tokenized_word)
... return tokens_list
>>> bad_words_ids = get_tokens_as_list(word_list=["mess"])
>>> output_ids = model.generate(
... inputs["input_ids"], max_new_tokens=5, bad_words_ids=bad_words_ids, pad_token_id=tokenizer.eos_token_id
... )
>>> print(tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0])
In a word, the cake is a bit of a surprise.__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.NoRepeatNGramLogitsProcessor
< source >( ngram_size: int )
N-gram 是从文本序列中取出的由 “n” 个连续单词、字符或 token 组成的组。给定句子:“She runs fast”,其二元组(n=2)为(“she”,“runs”)和(“runs”,“fast”)。在文本生成中,避免重复单词序列可以提供更多样的输出。此 LogitsProcessor 通过将禁止 token 的分数设置为负无穷来强制不重复 n-gram,从而在进一步处理分数时将这些 token 排除在考虑范围之外。请注意,对于仅解码器模型(如大多数 LLM),提示也会被纳入以获取 n-gram。Fairseq。
请谨慎使用 n-gram 惩罚。例如,在一篇关于纽约市的文章中惩罚 2-gram(bigram),可能会导致不理想的后果,即城市名称在整个文本中仅出现一次。参考
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer(["Today I"], return_tensors="pt")
>>> output = model.generate(**inputs)
>>> print(tokenizer.decode(output[0], skip_special_tokens=True))
Today I'm not sure if I'm going to be able to do it.
>>> # Now let's add ngram size using `no_repeat_ngram_size`. This stops the repetitions ("I'm") in the output.
>>> output = model.generate(**inputs, no_repeat_ngram_size=2)
>>> print(tokenizer.decode(output[0], skip_special_tokens=True))
Today I'm not sure if I can get a better understanding of the nature of this issue__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.PrefixConstrainedLogitsProcessor
< source >( prefix_allowed_tokens_fn: collections.abc.Callable[[int, torch.Tensor], list[int]]num_beams: int )
LogitsProcessor 用于强制执行约束生成,适用于基于前缀的约束生成。有关更多信息,请参阅 Autoregressive Entity Retrieval。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("bigscience/bloomz-560m")
>>> tokenizer = AutoTokenizer.from_pretrained("bigscience/bloomz-560m")
>>> inputs = tokenizer("Alice and Bob", return_tensors="pt")
>>> # By default, it continues generating according to the model's logits
>>> outputs = model.generate(**inputs, max_new_tokens=5)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
Alice and Bob are friends
>>> # We can constrain it with `prefix_allowed_tokens_fn` to force a certain behavior based on a prefix.
>>> # For instance, we can force an entire entity to be generated when its beginning is detected.
>>> entity = tokenizer(" Bob Marley", return_tensors="pt").input_ids[0] # 3 tokens
>>> def prefix_allowed_tokens_fn(batch_id, input_ids):
... '''
... Attempts to generate 'Bob Marley' when 'Bob' is detected.
... In this case, `batch_id` is not used, but you can set rules for each batch member.
... '''
... if input_ids[-1] == entity[0]:
... return [entity[1].item()]
... elif input_ids[-2] == entity[0] and input_ids[-1] == entity[1]:
... return [entity[2].item()]
... return list(range(tokenizer.vocab_size)) # If no match, allow all tokens
>>> outputs = model.generate(**inputs, max_new_tokens=5, prefix_allowed_tokens_fn=prefix_allowed_tokens_fn)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
Alice and Bob Marley__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.RepetitionPenaltyLogitsProcessor
< source >( penalty: floatprompt_ignore_length: typing.Union[int, torch.Tensor, NoneType] = None )
LogitsProcessor 通过惩罚机制来防止重复生成之前的 token。该惩罚对每个 token 最多应用一次。请注意,对于大多数 LLM 等仅解码器模型,默认情况下所考虑的 token 包括提示词。
在原始的 论文 中,作者建议使用大约 1.2 的惩罚值,以在真实生成和避免重复之间取得良好的平衡。为了惩罚并减少重复,请使用大于 1.0 的 penalty 值,值越高,惩罚力度越强。为了奖励并鼓励重复,请使用 0.0 到 1.0 之间的 penalty 值,值越低,奖励力度越强。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, RepetitionPenaltyLogitsProcessor
>>> # Initializing the model and tokenizer for it
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer(["I'm not going to"], return_tensors="pt")
>>> # This shows a normal generate without any specific parameters
>>> summary_ids = model.generate(**inputs)
>>> print(tokenizer.batch_decode(summary_ids, skip_special_tokens=True)[0])
I'm not going to be able to do that. I'm going to be able to do that
>>> # This generates a penalty for repeated tokens
>>> penalized_ids = model.generate(**inputs, repetition_penalty=1.1)
>>> print(tokenizer.batch_decode(penalized_ids, skip_special_tokens=True)[0])
I'm not going to be able to do that. I'll just have to go out and play
>>> # We can also exclude the input prompt by creating an instance of this class
>>> # with a `prompt_ignore_length` and passing it as a custom logit processor
>>> rep_pen_processor = RepetitionPenaltyLogitsProcessor(
... penalty=1.1,
... prompt_ignore_length=inputs["input_ids"].shape[-1]
... )
>>> penalized_ids = model.generate(**inputs, logits_processor=[rep_pen_processor])
>>> print(tokenizer.batch_decode(penalized_ids, skip_special_tokens=True)[0])
I'm not going to be able to do that. I'm going to have to go through a lot of things, and__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.SequenceBiasLogitsProcessor
< source >( sequence_bias: list[list[list[int] | float]] )
LogitsProcessor 用于对序列施加加性偏置。当下一个生成的 token 能够补全某个序列时,该偏置会作用于该序列的最后一个 token。因此,为了充分利用对长度超过一个 token 的序列施加的偏置,建议结合使用 beam 方法(以妥善处理具有负偏置的部分补全序列),并将偏置应用于这些序列的前缀(以确保偏置更早地生效)。
在 token 级别,偏置一个单词与偏置一个前面带空格的单词是不同的。如果你想在句子中间偏置 “foo”,通常应该添加前导空格,转而偏置 ” foo”。请参阅我们 NLP 课程中的分词器部分以了解原因:https://huggingface.co/learn/nlp-course/chapter2/4?fw=pt
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
>>> tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
>>> inputs = tokenizer(["The full name of Donald is Donald"], return_tensors="pt")
>>> summary_ids = model.generate(inputs["input_ids"], max_new_tokens=4, do_sample=False)
>>> print(tokenizer.batch_decode(summary_ids, skip_special_tokens=True)[0])
The full name of Donald is Donald John Trump Sr.
>>> def get_tokens(word):
... return tokenizer([word], add_special_tokens=False).input_ids[0]
>>> # IMPORTANT: Remember our tip about adding spaces before words to bias them correctly.
>>> sequence_bias = [[get_tokens("Trump"), -10.0],] # will fail to apply bias
>>> biased_ids = model.generate(
... inputs["input_ids"], max_new_tokens=4, do_sample=False, sequence_bias=sequence_bias
... )
>>> print(tokenizer.batch_decode(biased_ids, skip_special_tokens=True)[0])
The full name of Donald is Donald John Trump Sr.
>>> sequence_bias = [[get_tokens(" Trump"), -10.0],] # will work
>>> biased_ids = model.generate(
... inputs["input_ids"], max_new_tokens=4, do_sample=False, sequence_bias=sequence_bias
... )
>>> print(tokenizer.batch_decode(biased_ids, skip_special_tokens=True)[0])
The full name of Donald is Donald John Harper. He
>>> # We can also add a positive bias to nudge the model towards specific tokens or continuations. This technique
>>> # is also more effective when paired up with beam search.
>>> sequence_bias = [[get_tokens(" Donald Duck"), 10.0],]
>>> biased_ids = model.generate(
... inputs["input_ids"], max_new_tokens=4, num_beams=4, do_sample=False, sequence_bias=sequence_bias
... )
>>> print(tokenizer.batch_decode(biased_ids, skip_special_tokens=True)[0])
The full name of Donald is Donald Duck. He is__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.SuppressTokensAtBeginLogitsProcessor
< source >( begin_suppress_tokensbegin_indexdevice: str = 'cpu' )
SuppressTokensAtBeginLogitsProcessor 在 generate 函数开始生成时,立即抑制 begin_index 个 token。这应确保由 begin_suppress_tokens 定义的 token 不会在开头被生成。最初为 Whisper 创建。
示例:
>>> from transformers import AutoProcessor, WhisperForConditionalGeneration
>>> from datasets import load_dataset
>>> processor = AutoProcessor.from_pretrained("openai/whisper-tiny.en")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-tiny.en")
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> inputs = processor(ds[0]["audio"]["array"], return_tensors="pt")
>>> # Whisper has `begin_suppress_tokens` set by default (= `[220, 50256]`). 50256 is the EOS token, so this means
>>> # it can't generate and EOS token in the first iteration, but it can in the others.
>>> outputs = model.generate(**inputs, return_dict_in_generate=True, output_scores=True)
>>> print(outputs.scores[0][0, 50256])
tensor(-inf)
>>> print(outputs.scores[-1][0, 50256]) # in other places we can see some probability mass for EOS
tensor(29.9010)
>>> # If we disable `begin_suppress_tokens`, we can generate EOS in the first iteration.
>>> outputs = model.generate(
... **inputs, return_dict_in_generate=True, output_scores=True, begin_suppress_tokens=None
... )
>>> print(outputs.scores[0][0, 50256])
tensor(11.2027)__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
该处理器可用于屏蔽一组 token。处理器会将它们的 log probs 设置为 -inf,从而阻止其被生成。最初为 Whisper 创建。
示例:
>>> from transformers import AutoProcessor, WhisperForConditionalGeneration
>>> from datasets import load_dataset
>>> processor = AutoProcessor.from_pretrained("openai/whisper-tiny.en")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-tiny.en")
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> inputs = processor(ds[0]["audio"]["array"], return_tensors="pt")
>>> # Whisper has a long list of suppressed tokens. For instance, in this case, the token 1 is suppressed by default.
>>> outputs = model.generate(**inputs, return_dict_in_generate=True, output_scores=True)
>>> print(outputs.scores[1][0, 1]) # 1 (and not 0) is the first freely generated token
tensor(-inf)
>>> # If we disable `suppress_tokens`, we can generate it.
>>> outputs = model.generate(**inputs, return_dict_in_generate=True, output_scores=True, suppress_tokens=None)
>>> print(outputs.scores[1][0, 1])
tensor(6.0678)__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.SynthIDTextWatermarkLogitsProcessor
< source >( ngram_len: intkeys: list[int]sampling_table_size: intsampling_table_seed: intcontext_history_size: intdevice: deviceskip_first_ngram_calls: bool = Falsedebug_mode: bool = False )
参数
- ngram_len (
int) — Ngram 长度。 - keys (
list[int]) — 水印密钥序列,每个深度对应一个。 - sampling_table_size (
int) — 采样表的大小。 - sampling_table_seed (
int) — 用于生成采样表的随机种子。 - context_history_size (
int) — 用于跟踪已查看上下文的张量大小。 - device (
torch.device) — 要使用的设备。 - skip_first_ngram_calls (
bool,可选,默认为False) — 是否跳过前 ngram 次调用。 - debug_mode (
bool,可选,默认为False) — 在应用水印修改之前,Logits 会被修改为均匀分布。此参数用于测试实现。
实现文本生成模型水印技术的 Logits 处理器。 该类支持应用 SynthID 文本水印,这是一种将不可感知的信号嵌入生成文本中,以辅助检测合成内容的方法。它通过在文本生成过程中微妙地调整 token 选择的概率来工作,这种调整方式可以在后续可靠地恢复,用于验证。
主要功能:
状态管理:维护内部状态以跟踪 token 序列,并动态生成水印密钥。
密钥生成:基于令牌序列和水印参数计算哈希值,为每个位置生成唯一的密钥。
G 值采样:使用预计算的采样表,根据生成的密钥对水印值(g 值)进行采样。
分数调整:在生成过程中应用计算出的 g 值来修改 token 概率,从而嵌入水印。
上下文重复处理:引入逻辑以避免对重复上下文中的 token 添加水印,从而保持自然性。
EOS Token 掩码:支持对句末 token 进行掩码,以防止其被纳入水印计算。
实用函数:提供用于直接计算 g 值、检查上下文重复、创建 EOS 令牌掩码以及估计 g 值期望均值的函数。
有关此内容的更多详细信息,请参阅论文:https://www.nature.com/articles/s41586-024-08025-4。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer, SynthIDTextWatermarkingConfig
>>> tokenizer = AutoTokenizer.from_pretrained('google/gemma-2-2b', padding_side="left")
>>> model = AutoModelForCausalLM.from_pretrained('google/gemma-2-2b')
>>> # SynthID Text configuration
>>> watermarking_config = SynthIDTextWatermarkingConfig(
... keys=[654, 400, 836, 123, 340, 443, 597, 160, 57],
... ngram_len=5,
... )
>>> # Generation with watermarking
>>> tokenized_prompts = tokenizer(["Once upon a time, "], return_tensors="pt", padding=True)
>>> output_sequences = model.generate(
... **tokenized_prompts, watermarking_config=watermarking_config, do_sample=True, max_new_tokens=10
... )
>>> watermarked_text = tokenizer.batch_decode(output_sequences, skip_special_tokens=True)__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.TemperatureLogitsWarper
< source >( temperature: float )
用于温度(指数缩放输出概率分布)的 LogitsProcessor,这实际上意味着它可以控制预测 token 的随机性。通常与 TopPLogitsWarper 和 TopKLogitsWarper 一起使用。
请确保在
generate参数中包含do_sample=True,否则 temperature 值将不会生效。
示例:
>>> import torch
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> set_seed(0) # for reproducibility
>>> tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> model.config.pad_token_id = model.config.eos_token_id
>>> inputs = tokenizer(["Hugging Face Company is"], return_tensors="pt")
>>> # With temperature=1.0, the default, we consistently get random outputs due to random sampling.
>>> generate_kwargs = {"max_new_tokens": 10, "do_sample": True, "temperature": 1.0, "num_return_sequences": 2}
>>> outputs = model.generate(**inputs, **generate_kwargs)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True))
['Hugging Face Company is one of these companies that is going to take a',
"Hugging Face Company is a brand created by Brian A. O'Neil"]
>>> # However, with temperature close to 0, it approximates greedy decoding strategies (invariant)
>>> generate_kwargs["temperature"] = 0.0001
>>> outputs = model.generate(**inputs, **generate_kwargs)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True))
['Hugging Face Company is a company that has been around for over 20 years',
'Hugging Face Company is a company that has been around for over 20 years']__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.TopHLogitsWarper
< source >( top_h: floatfilter_value: float = -inf )
LogitsProcessor,实现了 Top-H 采样,这是一种解码方法,它根据熵和累积概率约束自适应地选择高概率 token 的子集。
该方法通过分析所选分布的熵差,动态确定需要保留的 token 数量,从而在探索与利用之间取得平衡。它确保生成的文本兼具多样性和连贯性。
参考: 有关详细信息,请参阅 Top-H 解码:在文本生成中通过有界熵适应创造力和连贯性(NeurIPS 2025):https://arxiv.org/abs/2509.02510
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")
>>> tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")
>>> inputs = tokenizer("A sequence: 1, 2", return_tensors="pt")
>>> outputs = model.generate(**inputs, do_sample=True, top_h=0.4)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, vocab_size)
使用 Top-H 采样对 logits 进行过滤。
class transformers.TopKLogitsWarper
< source >( top_k: intfilter_value: float = -infmin_tokens_to_keep: int = 1 )
执行 top-k 的 LogitsProcessor,即限制为概率最高的 k 个元素。通常与 TemperatureLogitsWarper 和 TopPLogitsWarper 一起使用。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> set_seed(1)
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer("A sequence: A, B, C, D", return_tensors="pt")
>>> # With sampling, the output is unexpected -- sometimes too unexpected.
>>> outputs = model.generate(**inputs, do_sample=True)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: A, B, C, D, E — S — O, P — R
>>> # With `top_k` sampling, the output gets restricted the k most likely tokens.
>>> # Pro tip: In practice, LLMs use `top_k` in the 5-50 range.
>>> outputs = model.generate(**inputs, do_sample=True, top_k=2)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: A, B, C, D, E, F, G, H, I__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.TopPLogitsWarper
< source >( top_p: floatfilter_value: float = -infmin_tokens_to_keep: int = 1 )
执行 top-p 的 LogitsProcessor,即限制为概率总和 prob_cut_off <= prob_cut_off 的 top 个 token。 通常与 TemperatureLogitsWarper 和 TopKLogitsWarper 一起使用。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> set_seed(1)
>>> model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
>>> inputs = tokenizer("A sequence: 1, 2", return_tensors="pt")
>>> # With sampling, the output is unexpected -- sometimes too unexpected.
>>> outputs = model.generate(**inputs, do_sample=True)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3 | < 4 (left-hand pointer) ;
<BLANKLINE>
<BLANKLINE>
>>> # With `top_p` sampling, the output gets restricted to high-probability tokens.
>>> # Pro tip: In practice, LLMs use `top_p` in the 0.9-0.95 range.
>>> outputs = model.generate(**inputs, do_sample=True, top_p=0.1)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
A sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.TypicalLogitsWarper
< source >( mass: float = 0.9filter_value: float = -infmin_tokens_to_keep: int = 1 )
执行典型解码的 LogitsProcessor。受人类语言使用方式的启发,它优先选择对数概率接近 token 概率分布熵的 token。这意味着最可能的 token 可能会在此过程中被舍弃。
有关更多信息,请参阅 用于自然语言生成的典型解码。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed
>>> model = AutoModelForCausalLM.from_pretrained("bigscience/bloomz-560m")
>>> tokenizer = AutoTokenizer.from_pretrained("bigscience/bloomz-560m")
>>> inputs = tokenizer("1, 2, 3", return_tensors="pt")
>>> # We can see that greedy decoding produces a sequence of numbers
>>> outputs = model.generate(**inputs)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
>>> # For this particular seed, we can see that sampling produces nearly the same low-information (= low entropy)
>>> # sequence
>>> set_seed(18)
>>> outputs = model.generate(**inputs, do_sample=True)
>>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
1, 2, 3, 4, 5, 6, 7, 8, 9 and 10
>>> # With `typical_p` set, the most obvious sequence is no longer produced, which may be good for your problem
>>> set_seed(18)
>>> outputs = model.generate(
... **inputs, do_sample=True, typical_p=0.1, return_dict_in_generate=True, output_scores=True
... )
>>> print(tokenizer.batch_decode(outputs.sequences, skip_special_tokens=True)[0])
1, 2, 3 and 5
>>> # We can see that the token corresponding to "4" (token 934) in the second position, the most likely token
>>> # as seen with greedy decoding, was entirely blocked out
>>> print(outputs.scores[1][0, 934])
tensor(-inf)__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.UnbatchedClassifierFreeGuidanceLogitsProcessor
< source >( guidance_scale: floatmodelunconditional_ids: typing.Optional[torch.LongTensor] = Noneunconditional_attention_mask: typing.Optional[torch.LongTensor] = Noneuse_cache: bool = True )
参数
- guidance_scale (
float) — 无分类器引导(CFG)的引导尺度。通过设置guidance_scale != 1来启用 CFG。 较高的引导尺度会促使模型生成与输入提示更紧密相关的样本,通常以牺牲质量为代价。小于 1 的值则产生相反的效果,同时使通过 negative_prompt_ids 提供的负向提示(如果存在)起到正向提示的作用。 - model (
PreTrainedModel) — 用于计算无条件得分的模型。理论上应与计算条件得分的模型相同。两个模型必须使用相同的分词器。 - unconditional_ids(形状为
(batch_size, sequence_length)的torch.LongTensor,可选) — 无条件分支中输入序列 token 在词汇表中的索引。如果未设置,则默认为提示的最后一个 token。 - unconditional_attention_mask (
torch.LongTensor,形状为(batch_size, sequence_length),可选) — unconditional_ids 的注意力掩码。 - use_cache (
bool,可选,默认为True) — 是否在负向提示词的前向传播过程中缓存键/值。
用于 Classifier-Free Guidance (CFG) 的 Logits 处理器。该处理器根据 guidance_scale 参数,计算提示词条件分数与提示词无条件(或负向)分数之间的加权平均值。无条件分数通过在内部使用 unconditional_ids 分支来提示 model 进行计算。
有关更多信息,请参阅该论文。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> inputs = tokenizer(["Today, a dragon flew over Paris, France,"], return_tensors="pt")
>>> out = model.generate(inputs["input_ids"], guidance_scale=1.5)
>>> tokenizer.batch_decode(out, skip_special_tokens=True)[0]
'Today, a dragon flew over Paris, France, killing at least 50 people and injuring more than 100'
>>> # with a negative prompt
>>> neg_inputs = tokenizer(["A very happy event happened,"], return_tensors="pt")
>>> out = model.generate(inputs["input_ids"], guidance_scale=2, negative_prompt_ids=neg_inputs["input_ids"])
>>> tokenizer.batch_decode(out, skip_special_tokens=True)[0]
'Today, a dragon flew over Paris, France, killing at least 130 people. French media reported that'
>>> # with a positive prompt
>>> neg_inputs = tokenizer(["A very happy event happened,"], return_tensors="pt")
>>> out = model.generate(inputs["input_ids"], guidance_scale=0, negative_prompt_ids=neg_inputs["input_ids"])
>>> tokenizer.batch_decode(out, skip_special_tokens=True)[0]
"Today, a dragon flew over Paris, France, and I'm very happy to be here. I"class transformers.WhisperTimeStampLogitsProcessor
< source >( generate_config: GenerationConfigbegin_index: int_detect_timestamp_from_logprob: bool | None = None )
参数
- generate_config (
GenerateConfig) — 用于生成输出的 generate config。以下参数为必需: eos_token_id (int,可选,默认为 50257): 序列结束 token 的 id。 no_timestamps_token_id (int,可选,默认为 50363):"<|notimestamps|>"token 的 id。 max_initial_timestamp_index (int,可选,默认为 1): 用于设置初始时间戳的最大值。这可以防止模型预测过于遥远的时间戳。 - begin_index (
int) — 模型生成的第一个 token 的索引。 - _detect_timestamp_from_logprob (
bool, 可选) — 是否可以根据所有时间戳的 logprobs 预测时间戳。
LogitsProcessor 用于修改转录中时间戳生成时的 logits。当输入 token 达到特定阈值时,该处理器会将分数设置为负无穷大。该处理器通过屏蔽会破坏此配对模式的 logits,确保时间戳 token 成对出现,以维持生成时间戳的一致性和结构。此外,当采样任意时间戳 token 的预测概率大于任何单个非时间戳 token 时,会将这些非时间戳的 logits 设置为负无穷大,以确保优先生成时间戳而非其他潜在 token。
有关更多信息,请参阅该论文。
示例:
>>> import torch
>>> from transformers import AutoProcessor, WhisperForConditionalGeneration, GenerationConfig
>>> from datasets import load_dataset
>>> processor = AutoProcessor.from_pretrained("openai/whisper-tiny.en")
>>> model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-tiny.en")
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> inputs = processor(ds[3]["audio"]["array"], return_tensors="pt")
>>> input_features = inputs.input_features
>>> #Displaying timestamps
>>> generated_ids = model.generate(inputs=input_features, return_timestamps=True)
>>> transcription = processor.batch_decode(generated_ids, decode_with_timestamps=True)[0]
>>> print("Transcription:", transcription)
Transcription: <|startoftranscript|><|0.00|> He has grave doubts whether Sir Frederick Layton's work is really Greek after all, and can<|6.44|><|6.44|> discover in it but little of rocky Ithaca.<|9.44|><|endoftext|>
>>> #No timestamps & change EOS:
>>> #This allows the user to select a specific token to terminate the sequence on, in this case it's the word "can"(460)
>>> model.generation_config.eos_token_id = 460
>>> generated_ids = model.generate(inputs=input_features,return_timestamps=False)
>>> transcription = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
>>> print("Transcription:", transcription)
Transcription: He has grave doubts whether Sir Frederick Layton's work is really Greek after all and can__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
class transformers.WatermarkLogitsProcessor
< source >( vocab_sizedevicegreenlist_ratio: float = 0.25bias: float = 2.0hashing_key: int = 15485863seeding_scheme: str = 'lefthash'context_width: int = 1 )
参数
- vocab_size (
int) — 模型分词器的 vocab_size。用于计算“绿色”token 的比例。 - device (
str) — 模型分配所在的设备。 - greenlist_ratio (
float,可选,optional,默认值为 0.25) — “绿色”标记数量与词表大小的比例。默认值为 0.25。 - bias (
float,可选,optional,默认值为 2.0) — 添加到所选“绿色” token 的 logits 上的偏置。如果文本生成质量下降,请考虑降低bias的值。推荐值范围为 [0.5, 2.0]。默认值为 2.0。 - hashing_key (
int,可选,optional,默认为 15485863) — 用于哈希的密钥。如果您部署此水印,我们建议使用另一个私有密钥。 默认为 15485863(第一百万个质数)。 - seeding_scheme (
str, 可选, 可选, 默认为"lefthash") — 用于选择“绿色”令牌的播种方案。可接受的值:- “lefthash”(默认值):“green” token 的选择取决于最后一个 token(论文中的算法 2)
- “selfhash”:对“green” token 的选择取决于当前 token 本身(论文中的算法 3)。 该方案的缺点是它会考虑所有可能的下一个 token,因此可能比“lefthash”更慢。 用于播种的先前 token 的上下文长度。上下文长度越高,水印的鲁棒性越强。
- context_width (
int,可选,默认为 1) — 设置随机种子时使用的先前 token 数量。
用于对生成文本进行水印的 Logits 处理器。该处理器在生成下一个 token 之前,通过向随机选择的“绿色” token 集合添加一个小偏置来修改模型输出分数。“绿色” token 的选择过程取决于所使用的 seeding_scheme。该代码基于 原始仓库。
此 LogitsProcessor 生成的文本可以使用 WatermarkDetector 进行检测。有关详细信息,请参阅 call(),
有关更多信息,请参阅该论文。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, WatermarkingConfig
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> inputs = tokenizer(["Alice and Bob are"], return_tensors="pt")
>>> # normal generation
>>> out = model.generate(inputs["input_ids"], max_length=20, do_sample=False)
>>> tokenizer.batch_decode(out, skip_special_tokens=True)[0]
'Alice and Bob are both in the same room.\n\n"I\'m not sure if you\'re'
>>> # watermarked generation
>>> watermarking_config = WatermarkingConfig(bias=2.5, context_width=2, seeding_scheme="selfhash")
>>> out = model.generate(inputs["input_ids"], watermarking_config=watermarking_config, max_length=20, do_sample=False)
>>> tokenizer.batch_decode(out, skip_special_tokens=True)[0]
'Alice and Bob are both still alive and well and the story is pretty much a one-hour adventure'
>>> # to detect watermarked text use the WatermarkDetector class
>>> from transformers import WatermarkDetector
>>> detector = WatermarkDetector(model_config=model.config, device="cpu", watermarking_config= watermarking_config)
>>> detection_preds = detector(out)
>>> detection_preds
array([ True])__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
参数
- input_ids(形状为
(batch_size, sequence_length)的torch.LongTensor)— 输入序列中各 token 在词汇表中的索引。什么是 input IDs? - scores(形状为
(batch_size, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数。在未使用束搜索时,这些分数是词汇表中每个词的 logits;在使用束搜索时,则是每个词汇 token 的 log softmax。
返回值
形状为 (batch_size, config.vocab_size) 的 torch.Tensor
处理后的预测分数。
StoppingCriteria
可以使用 StoppingCriteria 来更改生成停止的时机(除了 EOS token 之外)。请注意,此功能仅适用于我们的 PyTorch 实现。
所有可在生成过程中应用的停止条件的抽象基类。
如果停止条件依赖于 scores 输入,请确保向 generate 传入 return_dict_in_generate=True, output_scores=True。
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- scores (
tuple(torch.Tensor)) — 语言建模头的预测分数,表示为一个元组,其中每个生成步骤对应一个张量,每个张量的形状为(batch_size, config.vocab_size)。这些分数可以是 SoftMax 之前每个词汇表 token 的分数,也可以是 SoftMax 之后每个词汇表 token 的分数。如果此停止条件依赖于scores输入,请确保向generate传递return_dict_in_generate=True, output_scores=True,否则将传入None。 - kwargs (
dict[str, Any],可选) — 特定于额外停止条件的关键字参数。
返回值
torch.BoolTensor。(形状为 (batch_size, 1) 的 torch.BoolTensor)
True 表示我们停止特定行的生成。
False 表示我们应该继续。
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- scores (
tuple(torch.Tensor)) — 语言建模头的预测分数,表示为一个元组,其中每个生成步骤对应一个张量,每个张量的形状为(batch_size, config.vocab_size)。这些分数可以是 SoftMax 之前每个词汇表 token 的分数,也可以是 SoftMax 之后每个词汇表 token 的分数。如果此停止条件依赖于scores输入,请确保向generate传递return_dict_in_generate=True, output_scores=True,否则将传入None。 - kwargs (
dict[str, Any],可选) — 特定于额外停止条件的关键字参数。
返回值
torch.BoolTensor。(形状为 (batch_size, 1) 的 torch.BoolTensor)
True 表示我们停止特定行的生成。
False 表示我们应该继续。
class transformers.MaxLengthCriteria
< source >( max_length: intmax_position_embeddings: int | None = None )
此类可用于在生成的完整 token 数量超过 max_length 时停止生成。请注意,对于仅解码器类型的 Transformers,这将包括初始提示 token。
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- scores (
tuple(torch.Tensor)) — 语言建模头的预测分数,表示为一个元组,其中每个生成步骤对应一个张量,每个张量的形状为(batch_size, config.vocab_size)。这些分数可以是 SoftMax 之前每个词汇表 token 的分数,也可以是 SoftMax 之后每个词汇表 token 的分数。如果此停止条件依赖于scores输入,请确保向generate传递return_dict_in_generate=True, output_scores=True,否则将传入None。 - kwargs (
dict[str, Any],可选) — 特定于额外停止条件的关键字参数。
返回值
torch.BoolTensor。(形状为 (batch_size, 1) 的 torch.BoolTensor)
True 表示我们停止特定行的生成。
False 表示我们应该继续。
class transformers.MaxTimeCriteria
< source >( max_time: floatinitial_timestamp: float | None = None )
此类可用于在完整生成过程超过一定时长时停止生成。默认情况下,计时会在初始化此函数时开始。您可以通过传入 initial_timestamp 来覆盖此行为。
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- scores (
tuple(torch.Tensor)) — 语言建模头的预测分数,表示为一个元组,其中每个生成步骤对应一个张量,每个张量的形状为(batch_size, config.vocab_size)。这些分数可以是 SoftMax 之前每个词汇表 token 的分数,也可以是 SoftMax 之后每个词汇表 token 的分数。如果此停止条件依赖于scores输入,请确保向generate传递return_dict_in_generate=True, output_scores=True,否则将传入None。 - kwargs (
dict[str, Any],可选) — 特定于额外停止条件的关键字参数。
返回值
torch.BoolTensor。(形状为 (batch_size, 1) 的 torch.BoolTensor)
True 表示我们停止特定行的生成。
False 表示我们应该继续。
class transformers.StopStringCriteria
< source >( tokenizer: PreTrainedTokenizerBasestop_strings: str | list[str] )
此类可用于在生成特定字符串序列时停止生成。它会结合分词器词表对字符串进行预处理,以找到令牌可以合法完成停止字符串的位置。
一旦生成了能够补全任意停止字符串的 token,生成过程就会立即停止。 我们希望捕获所有停止字符串出现在解码输出中的情况,这意味着 我们还必须捕获在字符串一端或两端存在“悬空”字符的情况。为了更具体地说明,对于停止字符串 “stop”,以下任何 token 序列都会触发匹配:
- [“st”,“op”]
- [“stop”]
- [“st”,“opera”]
- [“sto”, “pper”]
- [“las”, “topper”]
- [“s”,“to”,“pped”]
请注意,只有当停止字符串位于生成序列的末尾时,才会触发匹配。换句话说,以下序列不会触发匹配:
- [“stop”, “at”]
- [“st”,“op”,“at”]
- [“st”, “opera”, “tion”]
这些停止条件不匹配的原因是,停止字符串与最后一个 token 没有重叠。如果你可以从序列末尾移除一个或多个 token 而不破坏停止字符串,那么该条件就不会匹配该停止字符串。这是有意为之的设计;由于此检查在每次生成一个 token 后运行,如果生成了有效的停止字符串,我们不会遗漏它,但我们不希望仅仅因为停止字符串存在于过去的 input_ids 中就停止生成。
那么,匹配究竟是如何执行的?我们的实现方式相当令人困惑,因为我们希望整个匹配过程能够被 Torch 或 XLA 编译,这意味着我们不能使用标准的字符串方法。不过,通过一些努力,我们可以使用纯张量操作来实现字符串匹配。我们将首先描述使用标准字符串操作的算法,然后在最后解释如何将其转换为纯张量操作。
该算法的关键在于一个观察:由于停止字符串必须与 token 序列的末尾重叠,我们可以从序列末尾开始向前回溯。具体而言,我们检查最后一个 token 的开头与 stop_string 的末尾是否存在重叠,换言之,即存在某个 i > 0,使得 stop_string[-i:] == token[:i]。如果你查看上文中的正例,会发现它们中最后一个 token 均满足这一性质:
- [“st”,“op”](重叠部分为“op”,重叠长度 == 2)
- [“stop”] (重叠为 “stop”,重叠长度 == 4)
- [“st”,“opera”](重叠部分为“op”,重叠长度 == 2)
- [“sto”, “pper”](重叠部分为“p”,重叠长度 == 1)
- [“las”,“topper”](重叠部分为“top”,重叠长度 == 3)
- [“s”,“to”,“pped”](重叠部分为“p”,重叠长度 == 1)
不可能构造出一个不具备此属性的匹配序列(你可以自行验证)。然而,尽管最终 token 的开头与停止字符串的结尾之间的这种重叠是匹配所必需的,但仅凭这一点并不充分。我们还需要检查 token 序列的其余部分是否与停止字符串保持一致。
How do we do that? Let’s use [“s”, “to”, “pped”] as an example. We know that the final token, “pped”, has an overlap of 1 with the stop string, “stop”. We then go back to the previous token, “to”. Since we have already matched 1 character from the stop string, the remainder to check is “sto”. We check that the next token “to” matches the end of the remainder, which it does. We have now matched 3 characters from the stop string, and the remainder to match is “s”. We go back to the previous token again, which is also “s”. This is a match, and so we have matched the entire stop string.
那么,当 token 超出停止字符串的起始位置时,它是如何工作的?让我们以 ["las", "topper"] 为例。最后一个 token "topper" 与停止字符串 "stop" 有 3 个字符的重叠。因此,需要匹配的剩余停止字符串为 "s"。我们回到前一个 token "las"。由于需要匹配的剩余部分仅为 "s",长度为 1,我们只考虑该 token 的最后 1 个字符,即 "s"。这与停止字符串匹配,因此整个字符串匹配成功。
那么,我们如何用张量运算来计算这些匹配呢?很简单:我们为所有 token 高效地预计算所需的信息!对于每个 token,我们计算:
- 其与停止字符串末尾的重叠部分(如果存在)
- 停止字符串中令牌匹配的位置,包括从起始位置开始匹配的匹配项。
- token 的总长度
例如,对于标记“pped”,我们会计算出一个末尾重叠度为 1,没有内部匹配位置,长度为 4。对于标记“to”,我们会计算出没有末尾重叠,一个内部匹配位置为 1(从末尾开始计数),长度为 2。对于标记“s”,我们会计算出没有末尾重叠,一个内部匹配位置为 3(同样从末尾开始计数),长度为 1。
只要拥有这些信息,我们就能执行上述算法,而无需进行任何字符串比较操作。我们只需执行以下步骤:
- 检查最后一个 token 是否与起始字符串存在末尾重叠
- 继续向前回溯,同时记录到目前为止已匹配的停止字符串的长度
- 在每个位置,检查下一个 token 是否将当前位置作为其有效位置之一
- 持续进行,直到某个匹配失败,或者我们完全匹配了整个停止字符串
Again, consider [“s”, “to”, “pped”] as an example. “pped” has an end overlap of 1, so we can begin a match. We have matched 1 character so far, so we check that the next token “to”, has 1 as a valid position (again, counting from the end). It does, so we add the length of “to” to our position tracker. We have now matched 3 characters, so we check that the next token “s” has 3 as a valid position. It does, so we add its length to the position tracker. The position tracker is now 4, which is the length of the stop string. We have matched the entire stop string.
在第二种情况中,[“las”, “topper”] 里,“topper” 的末尾重叠长度为 3,因此我们可以开始匹配。目前我们已经匹配了 3 个字符,所以检查下一个 token “las” 是否以 3 作为有效位置。它是有效的,因为我们允许 token 匹配到超出停止字符串起始位置的位置。我们将它的长度累加到位置跟踪器中。此时位置跟踪器的值为 6,大于停止字符串的长度!不过别担心——这也算作对停止字符串的一次匹配。我们已经匹配了完整的停止字符串。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("microsoft/phi-2")
>>> model = AutoModelForCausalLM.from_pretrained("microsoft/phi-2")
>>> inputs = tokenizer("The biggest states in the USA by land area:", return_tensors="pt")
>>> gen_out = model.generate(**inputs)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
The biggest states in the USA by land area:
- Alaska
- Texas
- California
>>> # Passing one or more stop strings will halt generation after those strings are emitted
>>> # Note that generating with stop strings requires you to pass the tokenizer too
>>> gen_out = model.generate(**inputs, stop_strings=["Texas"], tokenizer=tokenizer)
>>> print(tokenizer.batch_decode(gen_out, skip_special_tokens=True)[0])
The biggest states in the USA by land area:
- Alaska
- Texas__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- scores (
tuple(torch.Tensor)) — 语言建模头的预测分数,表示为一个元组,其中每个生成步骤对应一个张量,每个张量的形状为(batch_size, config.vocab_size)。这些分数可以是 SoftMax 之前每个词汇表 token 的分数,也可以是 SoftMax 之后每个词汇表 token 的分数。如果此停止条件依赖于scores输入,请确保向generate传递return_dict_in_generate=True, output_scores=True,否则将传入None。 - kwargs (
dict[str, Any],可选) — 特定于额外停止条件的关键字参数。
返回值
torch.BoolTensor。(形状为 (batch_size, 1) 的 torch.BoolTensor)
True 表示我们停止特定行的生成。
False 表示我们应该继续。
class transformers.EosTokenCriteria
< source >( eos_token_id: typing.Union[int, list[int], torch.Tensor] )
此类可用于在生成“序列结束”(end-of-sequence)标记时停止生成。
默认情况下,它使用 model.generation_config.eos_token_id。
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | Nonenew_token_length: int = 1**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length)) — 输入序列中各 token 在词汇表中的索引。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- scores (
tuple(torch.Tensor)) — 语言建模头的预测分数,表示为一个元组,其中每个生成步骤对应一个张量,每个张量的形状为(batch_size, config.vocab_size)。这些分数可以是 SoftMax 之前每个词汇表 token 的分数,也可以是 SoftMax 之后每个词汇表 token 的分数。如果此停止条件依赖于scores输入,请确保向generate传递return_dict_in_generate=True, output_scores=True,否则将传入None。 - new_token_length (
int,可选,默认为1) — 用于检查条件的 token 数量。将检查每个批次项中最新的new_token_length个 token。 - kwargs (
dict[str, Any],可选) — 特定于额外停止条件的关键字参数。
返回值
torch.BoolTensor。(形状为 (batch_size, 1) 的 torch.BoolTensor)
True 表示我们停止特定行的生成。
False 表示我们应该继续。
流
class transformers.TextStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = False**decode_kwargs: Any )
一个简单的文本流式输出器,在完整单词形成后立即将 token 打印到标准输出。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
>>> tok = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> inputs = tok(["An increasing sequence: one,"], return_tensors="pt")
>>> streamer = TextStreamer(tok)
>>> # Despite returning the usual output, the streamer will also print the generated text to stdout.
>>> _ = model.generate(**inputs, streamer=streamer, max_new_tokens=20)
An increasing sequence: one, two, three, four, five, six, seven, eight, nine, ten, eleven,刷新剩余的缓存,并向标准输出打印一个换行符。
将新文本打印到标准输出。如果流已结束,还会打印一个换行符。
接收 token,对其进行解码,并在其组成完整单词时立即将其打印到标准输出。
class transformers.TextIteratorStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = Falsetimeout: float | None = None**decode_kwargs: Any )
一个将可打印文本存储在队列中的 Streamer,供下游应用程序作为迭代器使用。这对于以非阻塞方式访问生成文本的应用程序非常有用(例如在交互式 Gradio 演示中)。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
>>> from threading import Thread
>>> tok = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> inputs = tok(["An increasing sequence: one,"], return_tensors="pt")
>>> streamer = TextIteratorStreamer(tok)
>>> # Run the generation in a separate thread, so that we can fetch the generated text in a non-blocking way.
>>> generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=20)
>>> thread = Thread(target=model.generate, kwargs=generation_kwargs)
>>> thread.start()
>>> generated_text = ""
>>> for new_text in streamer:
... generated_text += new_text
>>> generated_text
'An increasing sequence: one, two, three, four, five, six, seven, eight, nine, ten, eleven,'将新文本放入队列。如果流即将结束,还需在队列中放入一个停止信号。
class transformers.AsyncTextIteratorStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = Falsetimeout: float | None = None**decode_kwargs: Any )
参数
- tokenizer(
AutoTokenizer)— 用于解码 token 的分词器。 - skip_prompt (
bool,可选,默认为False) — 是否跳过传递给.generate()的提示词。例如,对于聊天机器人很有用。 - timeout (
float, 可选) — 文本队列的超时时间。如果为None,队列将无限期阻塞。在.generate()于独立线程中调用时,可用于处理异常。 - decode_kwargs (
dict, 可选) — 传递给分词器decode方法的额外关键字参数。
引发
TimeoutError
TimeoutError— 如果令牌生成时间超过了超时值。
一个将可打印文本存储在队列中的 Streamer,供下游应用作为异步迭代器使用。 这对于需要异步访问生成文本的应用程序非常有用(例如在交互式 Gradio 演示中)。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer, AsyncTextIteratorStreamer
>>> from threading import Thread
>>> import asyncio
>>> tok = AutoTokenizer.from_pretrained("openai-community/gpt2")
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> inputs = tok(["An increasing sequence: one,"], return_tensors="pt")
>>> # Run the generation in a separate thread, so that we can fetch the generated text in a non-blocking way.
>>> async def main():
... # Important: AsyncTextIteratorStreamer must be initialized inside a coroutine!
... streamer = AsyncTextIteratorStreamer(tok)
... generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=20)
... thread = Thread(target=model.generate, kwargs=generation_kwargs)
... thread.start()
... generated_text = ""
... async for new_text in streamer:
... generated_text += new_text
>>> print(generated_text)
>>> asyncio.run(main())
An increasing sequence: one, two, three, four, five, six, seven, eight, nine, ten, eleven,将新文本放入队列。如果流即将结束,还需在队列中放入一个停止信号。
class transformers.TextDiffusionStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = Falsesleep_time: float | None = None**decode_kwargs: Any )
用于打印文本扩散输出的 Streamer。中间扩散步骤(草稿)是临时的,会被后续草稿覆盖,并在确认文本打印后移除。
如果您在 tmux 等环境中运行,草稿文本可能无法覆盖自身。
示例:
>>> from transformers import DiffusionGemmaForBlockDiffusion, AutoProcessor, TextDiffusionStreamer
>>> model = DiffusionGemmaForBlockDiffusion.from_pretrained(
... "google/diffusiongemma-26B-A4B-it", device_map="auto",
... )
>>> processor = AutoProcessor.from_pretrained("google/diffusiongemma-26B-A4B-it")
>>> chat = [{"role": "user", "content": "Why is the sky blue?"},]
>>> input_ids = processor.apply_chat_template(
... chat, tokenize=True, return_tensors="pt", add_generation_prompt=True
... )
>>> streamer = TextDiffusionStreamer(tokenizer=processor.tokenizer)
>>> model.generate(input_ids.to(model.device), max_new_tokens=512, streamer=streamer)刷新剩余的缓存并打印一个换行符。
接收已确认的 token,清除草稿,并将其永久打印。
接收完整的草稿 token 序列,对其进行解码,并以黄色打印输出。 覆盖之前的草稿。
缓存
单个层缓存的基类,抽象类。
返回该层可容纳的最大序列长度。-1 表示没有最大值,或最大值未定义,例如无限增长的动态注意力层,或没有序列长度维度的线性注意力层。
在保留对象的同时重置缓存值
重新排列此层的缓存以用于束搜索。
一个会随着生成更多 token 而动态增长的缓存层。这是生成式模型的默认设置。
它以形状为 [batch_size, num_heads, seq_len, head_dim] 的张量形式存储键(key)和值(value)状态。
更新
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
就地更新键和值缓存,并返回所需的键和值状态。
从当前缓存层中移除 tokens_to_remove 个 token。
在批次维度上重复缓存 repeats 次。
仅保留缓存中批次维度的 indices。
class transformers.StaticLayer
< source >( max_cache_len: int**kwargs )
一个静态缓存层,将键和值状态存储为形状为 [batch_size, num_heads, max_cache_len, head_dim] 的静态张量。
它会延迟分配完整的底层张量,然后对其进行原地修改。专为支持 torch.compile 而构建。
更新
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
就地更新键和值缓存,并返回所需的键和值状态。
对键(keys)和值(values)张量进行延迟初始化。这使得可以在运行时直接获取所有属性(dtype、device,在 TP 情况下还包括 num_heads 等……),这非常实用,因为它避免了在每次 update 时都需要移动设备、更改 dtype 等(这也可能会破坏静态 dynamo 地址)。
如果不需要此行为,可以直接在 Cache 上调用 early_initialization(...),该调用会提前执行此函数(例如,torch.export 就要求这样做)。此外,当 prefill 本身位于编译区域内时(例如使用分块 prefill 时),也必须执行此操作。
class transformers.StaticSlidingWindowLayer
< source >( max_cache_len: intsliding_window: int**kwargs )
一个静态缓存层,将键和值状态存储为形状为 [batch_size, num_heads, min(max_cache_len, sliding_window), head_dim] 的静态张量。它会延迟分配其完整的底层张量,然后对其进行原地修改。专为支持 torch.compile 而构建。
更新
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
就地更新键和值缓存,并返回所需的键和值状态。
对键(keys)和值(values)张量进行延迟初始化。这使得可以在运行时直接获取所有属性(dtype、device,在 TP 情况下还包括 num_heads 等……),这非常实用,因为它避免了在每次 update 时都需要移动设备、更改 dtype 等(这也可能会破坏静态 dynamo 地址)。
如果不需要此行为,可以直接在 Cache 上调用 early_initialization(...),该调用会提前执行此函数(例如,torch.export 就要求这样做)。此外,当 prefill 本身位于编译区域内时(例如使用分块 prefill 时),也必须执行此操作。
class transformers.QuantoQuantizedLayer
< source >( nbits: int = 4axis_key: int = 0axis_value: int = 0q_group_size: int = 64residual_length: int = 128 )
更新
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
就地更新键和值缓存,并返回所需的键和值状态。
class transformers.HQQQuantizedLayer
< source >( nbits: int = 4axis_key: int = 0axis_value: int = 0q_group_size: int = 64residual_length: int = 128 )
更新
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
就地更新键和值缓存,并返回所需的键和值状态。
一个量化层,以 8 位浮点格式存储键和值状态。每张量(per-tensor)的缩放因子在首次 update 后冻结,因此新状态会按原样追加:没有残差缓存,也没有重新量化。
更细粒度的变体应归入此处,而非 QuantizedLayer 之下,因为沿 head 维度进行分组可保持状态的可追加性,并且仅将存储的 scale 转换为张量。
更新
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
就地更新键和值缓存,并返回所需的键和值状态。
class transformers.Cache
< source >( layers: list[transformers.cache_utils.CacheLayerMixin | transformers.cache_utils.LinearAttentionCacheLayerMixin | transformers.cache_utils.DummyLayer] | None = Nonelayer_class_to_replicate: type[transformers.cache_utils.CacheLayerMixin | transformers.cache_utils.LinearAttentionCacheLayerMixin] | None = Noneoffloading: bool = Falseoffload_only_non_sliding: bool = True )
参数
- layers (
Optional, 可选) — 一个由预创建的CacheLayerMixin或LinearAttentionCacheLayerMixin组成的列表。如果省略(None),则会使用layer_class_to_replicate。 - layer_class_to_replicate (
type[CacheLayerMixin | LinearAttentionCacheLayerMixin],可选) — 仅在省略layers(即None)时使用,此时它将作为每一层的基类,并且当以大于当前层列表的layer_idx调用update时,会按需懒加载添加相应的层。 - offloading(
bool,可选,默认为False)—— 是否将层卸载到cpu以节省 GPU 内存。 - offload_only_non_sliding (
bool,可选,默认为True) — 如果offloading为True,此参数进一步决定是否仅卸载非滑动层(因为滑动层通常体积较小,无需卸载,跳过它们速度更快)。
Cache 基本上是一个 CacheLayerMixin 对象的列表,每个模型层对应一个。它用作每层 Cache 的容器。
更新
< source >( key_states: Tensorvalue_states: Tensorlayer_idx: int*args**kwargs )
使用新的 key_states 和 value_states 更新层 layer_idx 的缓存。
early_initialization
< source >( batch_size: intnum_heads: int | list[int]head_dim: int | list[int]dtype: dtypedevice: device )
提前初始化所有层(否则会在首次调用 update 时进行惰性初始化)。
这对我们的 export 配方很有用,因为 export 需要预先准备好所有内容。
返回给定层的缓存序列长度。
返回一个元组 (kv_length, kv_offset),对应于在 layer_idx 指定的层中返回的长度和偏移量。
随后,根据每层给定的长度 (kv_length, kv_offset) 和模式来准备掩码。
返回缓存的最大长度。如果未提供 layer_idx(默认情况),则返回所有层中的最大值。否则,返回给定层支持的最大值。
值为 -1 表示没有最大值或最大值未定义,例如可以无限增长的动态注意力层,或者没有序列长度维度的线性注意力层。
递归重置所有层的张量
为束搜索重新排序缓存
从当前 Cache 中移除 tokens_to_remove 个 token。对于不需要在内存中保留所有过去状态的层(例如滑动窗口层或线性注意力层),此操作还会将缓存状态的大小限制回其最小工作尺寸。这意味着 crop(0) 并不一定总是无操作,因为它仍可能从 Cache 中移除无用的状态(即下一次 forward 不需要的状态)。
重复并交错缓存
从缓存中选择索引
class transformers.DynamicCache
< source >( ddp_cache_data: collections.abc.Iterable[tuple[typing.Optional[torch.Tensor], ...]] | None = Noneconfig: transformers.configuration_utils.PreTrainedConfig | None = Noneoffloading: bool = Falseoffload_only_non_sliding: bool = False )
参数
- ddp_cache_data (
Iterable[tuple[torch.Tensor, torch.Tensor]], 可选) — 最初添加此参数是为了与torch.distributed(DDP) 保持兼容。简而言之,它相当于map(gather_map, zip(*caches)),即可迭代对象中的每个元素包含通过 torch.distributed 在各副本间收集的某一层的键和值状态 (shape=[global batch size, num_heads, seq_len, head_dim])。 注意:为了确保正确运行,它也需要作为第一个参数传入 - config (
PreTrainedConfig,可选) — 此 Cache 所对应模型的配置。如果传入该参数,将用于检查滑动窗口或混合层结构,从而大幅降低缓存张量的内存需求,使其变为[batch_size, num_heads, min(seq_len, sliding_window), head_dim]。 - offloading(
bool,可选,默认为False)—— 是否将层卸载到cpu以节省 GPU 内存。 - offload_only_non_sliding (
bool,可选,默认为False) — 如果offloading为True,此参数进一步决定是否仅卸载非滑动层(因为滑动层通常体积较小,无需卸载,跳过它们速度更快)。
一种随着生成 token 数量增加而动态增长的缓存。这是生成式模型的默认设置。
它以 CacheLayer 列表的形式存储键和值状态,每个层对应一个。每个 CacheLayer 中张量的预期形状为 [batch_size, num_heads, seq_len, head_dim]。
如果传入了配置,它还会检查滑动窗口或混合缓存结构,从而将缓存张量的内存需求大幅降低至 [batch_size, num_heads, min(seq_len, sliding_window), head_dim]。
有关所有缓存类实现的通用方法的详细信息,请参阅 Cache。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, DynamicCache
>>> model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
>>> tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
>>> inputs = tokenizer(text="My name is Qwen2", return_tensors="pt")
>>> # Prepare a cache class and pass it to model's forward
>>> past_key_values = DynamicCache(config=model.config)
>>> outputs = model(**inputs, past_key_values=past_key_values, use_cache=True)
>>> outputs.past_key_values # access cache filled with key/values from generation类 transformers.StaticCache
< source >( config: PreTrainedConfigmax_cache_len: intoffloading: bool = Falseoffload_only_non_sliding: bool = True**kwargs )
用于配合 torch.compile(model) 和 torch.export() 使用的静态 Cache 类。它会检查 config 中是否存在潜在的混合缓存结构,并据此初始化每一层。
有关所有缓存类实现的通用方法的详细信息,请参阅 Cache。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, StaticCache
>>> model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
>>> tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
>>> inputs = tokenizer(text="My name is Llama", return_tensors="pt")
>>> # Prepare a cache class and pass it to model's forward
>>> # Leave empty space for 10 new tokens, which can be used when calling forward iteratively 10 times to generate
>>> max_generated_length = inputs.input_ids.shape[1] + 10
>>> past_key_values = StaticCache(config=model.config, max_cache_len=max_generated_length)
>>> outputs = model(**inputs, past_key_values=past_key_values, use_cache=True)
>>> outputs.past_key_values # access cache filled with key/values from generation
StaticCache()class transformers.QuantizedCache
< source >( backend: strconfig: PreTrainedConfignbits: int | None = Noneaxis_key: int | None = Noneaxis_value: int | None = Noneq_group_size: int | None = Noneresidual_length: int | None = None )
参数
- backend (
str) — 要使用的量化后端。取值为("quanto", "hqq", "fp8")之一。 - config (
PreTrainedConfig) — 此 Cache 所对应模型的配置。 - nbits (
int,可选,默认为 4) — 用于量化的位数。 - axis_key (
int,可选,默认为 0) — 用于对键进行量化的轴。 - axis_value (
int,可选,默认为 0) — 用于对值进行量化的轴。 - q_group_size (
int,可选,默认值为 64) — 量化按通道进行,针对键和值均使用固定的q_group_size。 - residual_length (
int,可选,默认为 128) — 原始精度缓存的最大容量。
一种类似于 KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache 论文 中描述的量化器缓存。
它通过应用量化,使模型能够在不占用过多键和值内存的情况下生成长序列。
该缓存具有两种存储类型,一种用于原始精度,另一种用于量化后的缓存。
residual length 被设置为原始精度缓存的最大容量。当长度超过最大容量时,原始精度缓存将被丢弃并移入量化缓存。
与论文中描述的不同,量化是按通道进行的,键和值均使用固定的 q_group_size。
有关所有缓存类实现的通用方法的详细信息,请参阅 Cache。
最后五个参数用于配置分组整数后端。fp8 后端按张量进行量化,并会拒绝这些参数。
class transformers.EncoderDecoderCache
< source >( *caches )
所有编码器-解码器缓存的基类和抽象类。可用于保存自注意力和交叉注意力缓存的组合。
有关所有缓存类实现的通用方法的详细信息,请参阅 Cache。
示例:
>>> from transformers import AutoProcessor, AutoModelForCausalLM, DynamicCache, EncoderDecoderCache
>>> model = AutoModelForCausalLM.from_pretrained("openai/whisper-small")
>>> processor = AutoProcessor.from_pretrained("openai/whisper-small")
>>> inputs = processor(audio=YOUR-AUDIO, return_tensors="pt")
>>> # Prepare cache classes for encoder and decoder and pass it to model's forward
>>> self_attention_cache = DynamicCache(config=self.config)
>>> cross_attention_cache = DynamicCache(config=self.config)
>>> past_key_values = EncoderDecoderCache(self_attention_cache, cross_attention_cache)
>>> outputs = model(**inputs, past_key_values=past_key_values, use_cache=True)
>>> outputs.past_key_values # access cache filled with key/values from generation
EncoderDecoderCache()在批次维度上重复缓存 repeats 次。用于对比搜索(在 Hub 上)。
仅保留缓存中批次维度的 indices。用于对比搜索(在 Hub 上)。
从当前缓存层中移除 tokens_to_remove 个 token。
返回缓存对象的最大序列长度(即最大容量)
返回缓存状态的序列长度。可以可选地传入一个层索引。
根据选定的 beam 索引,重新排序 beam search 的缓存。
水印工具
class transformers.WatermarkingConfig
< source >( greenlist_ratio: float = 0.25bias: float = 2.0hashing_key: int = 15485863seeding_scheme: str = 'lefthash'context_width: int = 1 )
用于保存水印生成参数的类,应在调用 generate 时传入 GenerationConfig。
有关这些参数的详细信息,请参阅 这篇论文。
接受以下键:
- greenlist_ratio (
float): 用于水印。指“绿色”token 数量与词表大小的比例。默认值为 0.25。 - bias (
float): 与水印功能配合使用。表示添加到所选“绿色”token 的 logits 上的偏置值。默认值为 2.0。 - hashing_key (
int): 用于水印的哈希密钥。默认值为 15485863(第一百万个质数)。 - seeding_scheme (
str): 用于水印的算法。可接受的值:- “lefthash”(默认值):“green” token 的选择取决于最后一个 token(论文中的算法 2)
- “selfhash”:选择“green” token 取决于当前 token 本身(论文中的算法 3) 该方案的缺点是它会考虑所有可能的下一个 token,因此可能比 “lefthash” 更慢。
- context_width(
int): 用于播种的先前 token 的上下文长度。上下文长度越高,水印越稳健。
class transformers.WatermarkDetector
< source >( model_config: PreTrainedConfigdevice: strwatermarking_config: typing.Union[ForwardRef('WatermarkingConfig'), dict]ignore_repeated_ngrams: bool = Falsemax_cache_size: int = 128 )
参数
- model_config (
PreTrainedConfig) — 用于获取生成时所使用的模型特定参数的模型配置。 - device (
str) — 生成带水印文本时所使用的设备。 - watermarking_config (Union[
WatermarkingConfig,Dict]) — 生成文本时所使用的完全相同的 watermarking 配置和参数。 - ignore_repeated_ngrams (
bool,可选,默认为False) — 是否仅对每个唯一的 ngram 计数一次。 - max_cache_size (
int,可选,默认值为 128) — 用于每个 token 调用的种子/采样算法的 LRU 缓存的最大大小。
用于检测带水印生成文本的检测器。检测器需要接收与文本生成时完全相同的设置,以复现水印绿名单的生成过程,从而检测出水印。这包括文本生成时使用的正确设备、正确的水印参数以及正确的分词器词表大小。该代码基于 原始仓库。
有关更多信息,请参阅该论文。
示例:
>>> from transformers import AutoTokenizer, AutoModelForCausalLM, WatermarkDetector, WatermarkingConfig
>>> model_id = "openai-community/gpt2"
>>> model = AutoModelForCausalLM.from_pretrained(model_id)
>>> tok = AutoTokenizer.from_pretrained(model_id)
>>> tok.pad_token_id = tok.eos_token_id
>>> tok.padding_side = "left"
>>> inputs = tok(["This is the beginning of a long story", "Alice and Bob are"], padding=True, return_tensors="pt")
>>> input_len = inputs["input_ids"].shape[-1]
>>> # first generate text with watermark and without
>>> watermarking_config = WatermarkingConfig(bias=2.5, seeding_scheme="selfhash")
>>> out_watermarked = model.generate(**inputs, watermarking_config=watermarking_config, do_sample=False, max_length=20)
>>> out = model.generate(**inputs, do_sample=False, max_length=20)
>>> # now we can instantiate the detector and check the generated text
>>> detector = WatermarkDetector(model_config=model.config, device="cpu", watermarking_config=watermarking_config)
>>> detection_out_watermarked = detector(out_watermarked, return_dict=True)
>>> detection_out = detector(out, return_dict=True)
>>> detection_out_watermarked.prediction
array([ True, True])
>>> detection_out.prediction
array([False, False])__call__
< source >( input_ids: LongTensorz_threshold: float = 3.0return_dict: bool = False ) → WatermarkDetectorOutput or np.ndarray
参数
- input_ids (
torch.LongTensor) — 水印生成的文本。建议移除提示词,因为它可能会影响检测。 - z_threshold (
Dict, 可选,默认为3.0) — 更改此阈值会改变检测器的灵敏度。较高的 z 阈值会降低灵敏度,较低的 z 阈值则会提高灵敏度。 - return_dict (
bool,可选,默认为False) — 是否返回~generation.WatermarkDetectorOutput。如果不返回,则返回布尔预测值,
返回值
WatermarkDetectorOutput 或 np.ndarray
如果 return_dict=True,则返回 WatermarkDetectorOutput,否则返回 np.ndarray。
ma
class transformers.BayesianDetectorConfig
< source >( watermarking_depth: int | None = Nonebase_rate: float = 0.5**kwargs )
这是用于存储 BayesianDetectorModel 配置的类。它根据指定的参数实例化一个 Bayesian Detector 模型。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
class transformers.BayesianDetectorModel
< source >( config )
参数
- config (BayesianDetectorConfig) — 模型配置类,包含模型的所有参数。 通过配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
用于水印检测的贝叶斯分类器。
该检测器使用贝叶斯法则计算水印分数,该分数是后验概率 P(watermarked|g_values) 与 P(unwatermarked|g_values) 之比的日志值的 sigmoid。有关更多详细信息,请参阅论文中关于 BayesianScore 的部分。 论文网址:https://www.nature.com/articles/s41586-024-08025-4
请注意,该检测器仅适用于使用 Bernoulli(0.5) g 值分布的非失真 Tournament 水印。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( g_values: Tensormask: Tensorlabels: typing.Optional[torch.Tensor] = Noneloss_batch_weight = 1return_dict = False )
计算带水印的后验概率 P(watermarked|g_values)。
class transformers.SynthIDTextWatermarkingConfig
< source >( ngram_len: intkeys: list[int]context_history_size: int = 1024sampling_table_seed: int = 0sampling_table_size: int = 65536skip_first_ngram_calls: bool = Falsedebug_mode: bool = False )
参数
- ngram_len (
int) — Ngram 长度。 - keys (
list[int]) — 水印密钥序列,每个深度对应一个。 - context_history_size (
int,可选,默认为 1024) — 用于跟踪已查看上下文的张量大小。 - sampling_table_seed(
int,可选,默认为 0)—— 用于生成采样表的随机种子。 - sampling_table_size (
int,可选,默认为 65536) — 采样表的大小。 - skip_first_ngram_calls (
bool,可选,默认为False) — 是否跳过前 ngram 次调用。 - debug_mode (
bool,可选,默认为False) — 在应用水印修改之前,Logits 会被修改为均匀分布。此参数用于测试实现。
用于保存水印生成参数的类,应在调用 generate 时传入 GenerationConfig。
有关这些参数的详细信息,请参阅 这篇论文。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer, SynthIDTextWatermarkingConfig
>>> tokenizer = AutoTokenizer.from_pretrained('google/gemma-2-2b', padding_side="left")
>>> model = AutoModelForCausalLM.from_pretrained('google/gemma-2-2b')
>>> # SynthID Text configuration
>>> watermarking_config = SynthIDTextWatermarkingConfig(
... keys=[654, 400, 836, 123, 340, 443, 597, 160, 57],
... ngram_len=5,
... )
>>> # Generation with watermarking
>>> tokenized_prompts = tokenizer(["Once upon a time, "], return_tensors="pt", padding=True)
>>> output_sequences = model.generate(
... **tokenized_prompts, watermarking_config=watermarking_config, do_sample=True, max_new_tokens=10
... )
>>> watermarked_text = tokenizer.batch_decode(output_sequences, skip_special_tokens=True)class transformers.SynthIDTextWatermarkDetector
< source >( detector_module: BayesianDetectorModellogits_processor: SynthIDTextWatermarkLogitsProcessortokenizer: Any )
参数
- detector_module (BayesianDetectorModel) — 使用参数初始化的贝叶斯检测器模块对象。 有关用法,请参见 https://github.com/huggingface/transformers-research-projects/tree/main/synthid_text。
- logits_processor (
SynthIDTextWatermarkLogitsProcessor) — 用于水印的 logits 处理器。 - tokenizer (
Any) — 用于该模型的 tokenizer。
SynthID 文本水印检测器类。
此类必须使用训练好的贝叶斯检测器模块进行初始化,例如在 examples/synthid_text/detector_training.py 中检查训练、保存和加载该检测器模块的脚本。该文件夹还展示了此检测器的示例用例。
示例:
>>> from transformers import (
... AutoTokenizer, BayesianDetectorModel, SynthIDTextWatermarkLogitsProcessor, SynthIDTextWatermarkDetector
... )
>>> # Load the detector. See https://github.com/huggingface/transformers-research-projects/tree/main/synthid_text for training a detector.
>>> detector_model = BayesianDetectorModel.from_pretrained("joaogante/dummy_synthid_detector")
>>> logits_processor = SynthIDTextWatermarkLogitsProcessor(
... **detector_model.config.watermarking_config, device="cpu"
... )
>>> tokenizer = AutoTokenizer.from_pretrained(detector_model.config.model_name)
>>> detector = SynthIDTextWatermarkDetector(detector_model, logits_processor, tokenizer)
>>> # Test whether a certain string is watermarked
>>> test_input = tokenizer(["This is a test input"], return_tensors="pt")
>>> is_watermarked = detector(test_input.input_ids)编译工具
class transformers.CompileConfig
< source >( fullgraph: bool = Falsedynamic: bool | None = Nonebackend: str | collections.abc.Callable = 'inductor'mode: str = 'reduce-overhead'options: dict | None = None )
用于保存在使用 generate 进行自动编译时与 torch.compile 行为相关的参数的类。
有关这些参数的详细信息,请参阅 torch.compile。
示例:
>>> from transformers import AutoModelForCausalLM, AutoTokenizer, CompileConfig
>>> tokenizer = AutoTokenizer.from_pretrained('google/gemma-2-2b')
>>> model = AutoModelForCausalLM.from_pretrained('google/gemma-2-2b').cuda()
>>> # Automatic compile configuration, used with static cache
>>> compile_config = CompileConfig(dynamic=True)
>>> # Generation with static cache and compile config
>>> input = tokenizer.encode("Hello there, how", return_tensors="pt").cuda()
>>> output = model.generate(
... input, do_sample=False, max_new_tokens=300, cache_implementation="static", compile_config=compile_config
... )
>>> output_text = tokenizer.batch_decode(output, skip_special_tokens=True)[0]