Transformers documentation
Công cụ cho việc tạo
Công cụ cho việc tạo
Trang này liệt kê tất cả các hàm tiện ích được sử dụng bởi generate().
Tạo đầu ra
Đầu ra của generate() là một instance của một subclass của ModelOutput. Đầu ra này là một cấu trúc dữ liệu chứa tất cả thông tin được trả về bởi generate(), nhưng cũng có thể được sử dụng như tuple hoặc dictionary.
Dưới đây là một ví dụ:
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)Đối tượng generation_output là một GenerateDecoderOnlyOutput, như chúng ta có thể thấy trong tài liệu của lớp đó bên dưới, điều này có nghĩa là nó có các thuộc tính sau:
sequences: các chuỗi token được tạo rascores(tùy chọn): điểm dự đoán của đầu mô hình ngôn ngữ, cho mỗi bước sinhhidden_states(tùy chọn): các trạng thái ẩn của mô hình, cho mỗi bước sinhattentions(tùy chọn): trọng số chú ý của mô hình, cho mỗi bước sinh
Ở đây chúng ta có scores vì đã truyền output_scores=True, nhưng không có hidden_states và attentions vì không truyền output_hidden_states=True hoặc output_attentions=True.
Bạn có thể truy cập từng thuộc tính như bình thường, và nếu thuộc tính đó không được mô hình trả về, bạn sẽ nhận được None. Ví dụ, generation_output.scores là tất cả các điểm dự đoán đã được tạo ra bởi đầu mô hình ngôn ngữ, còn generation_output.attentions là None.
Khi sử dụng đối tượng generation_output của chúng ta dưới dạng tuple, nó chỉ giữ lại các thuộc tính không có giá trị None.
Ở đây, ví dụ, nó có hai phần tử, loss rồi đến logits, vì vậy
generation_output[:2]sẽ trả về bộ ba (generation_output.sequences, generation_output.scores), chẳng hạn.
Khi sử dụng đối tượng generation_output của chúng ta như một từ điển, nó chỉ giữ lại các thuộc tính không có giá trị None. Ở đây, ví dụ, nó có hai khóa là sequences và scores.
Chúng tôi liệt kê tại đây tất cả các kiểu đầu ra.
lớp 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 )
Tham số
- sequences (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Các chuỗi được tạo ra. Chiều thứ hai (sequence_length) bằngmax_lengthhoặc ngắn hơn nếu tất cả các batch kết thúc sớm doeos_token_id. - scores (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_scores=True) — Điểm dự đoán đã xử lý của đầu mô hình ngôn ngữ (điểm cho từng token trong từ vựng trước SoftMax) tại mỗi bước sinh. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token được sinh), mỗi tensor có hình dạng(batch_size, config.vocab_size). - logits (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_logits=True) — Điểm dự đoán chưa xử lý của đầu mô hình ngôn ngữ (điểm cho từng token trong từ vựng trước SoftMax) ở mỗi bước sinh. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token được sinh), mỗi tensor có hình dạng(batch_size, config.vocab_size). - attentions (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_attentions=True) — Bộ ba (một phần tử cho mỗi token được tạo ra) của các bộ ba (một phần tử cho mỗi lớp của bộ giải mã) củatorch.Tensorcó hình dạng(batch_size, num_heads, generated_length, sequence_length). - hidden_states (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_hidden_states=True) — Tuple (một phần tử cho mỗi token được tạo) của các tuple (một phần tử cho mỗi lớp của bộ giải mã) củatorch.Tensorcó hình dạng(batch_size, generated_length, hidden_size). - past_key_values (
Cache, tùy chọn, được trả về khiuse_cache=True) — Trả về bộ nhớ đệm của mô hình, được sử dụng để tăng tốc quá trình giải mã. Các mô hình khác nhau có định dạng bộ nhớ đệm khác nhau, hãy xem tài liệu của mô hình. Thông thường, đây là một instance của Cache.
Đầu ra của các mô hình sinh chỉ có bộ giải mã, khi sử dụng các phương pháp không phải beam.
lớp 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 )
Tham số
- sequences (
torch.LongTensorcó hình dạng(batch_size*num_return_sequences, sequence_length)) — Các chuỗi được tạo ra. Chiều thứ hai (sequence_length) bằngmax_lengthhoặc ngắn hơn nếu tất cả các batch kết thúc sớm doeos_token_id. - scores (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_scores=True) — Điểm dự đoán đã xử lý của đầu mô hình ngôn ngữ (điểm cho từng token trong từ vựng trước SoftMax) tại mỗi bước sinh. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token được sinh), mỗi tensor có hình dạng(batch_size, config.vocab_size). - logits (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_logits=True) — Điểm dự đoán chưa xử lý của đầu mô hình ngôn ngữ (điểm cho từng token trong từ vựng trước SoftMax) ở mỗi bước sinh. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token được sinh), mỗi tensor có hình dạng(batch_size, config.vocab_size). - encoder_attentions (
tuple(torch.Tensor), tùy chọn, được trả về khioutput_attentions=True) — Bộ tuple củatorch.Tensor(một cho mỗi lớp của bộ giải mã) có hình dạng(batch_size, num_heads, sequence_length, sequence_length). - encoder_hidden_states (
tuple(torch.Tensor), tùy chọn, được trả về khioutput_hidden_states=True) — Bộ tuple củatorch.Tensor(một cho đầu ra của embeddings + một cho đầu ra của mỗi lớp) có hình dạng(batch_size, sequence_length, hidden_size). - decoder_attentions (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_attentions=True) — Bộ tuple (một phần tử cho mỗi token được tạo ra) của các bộ tuple (một phần tử cho mỗi lớp của bộ giải mã) chứatorch.Tensorcó hình dạng(batch_size, num_heads, generated_length, sequence_length). - cross_attentions (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_attentions=True) — Tuple (một phần tử cho mỗi token được tạo) của các tuple (một phần tử cho mỗi lớp của decoder) củatorch.Tensorcó hình dạng(batch_size, num_heads, generated_length, sequence_length). - decoder_hidden_states (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_hidden_states=True) — Bộ ba (một phần tử cho mỗi token được tạo ra) của các bộ ba (một phần tử cho mỗi lớp của bộ giải mã) gồmtorch.Tensorcó hình dạng(batch_size, generated_length, hidden_size). - past_key_values (
Cache, tùy chọn, được trả về khiuse_cache=True) — Trả về bộ nhớ đệm của mô hình, được sử dụng để tăng tốc quá trình giải mã. Các mô hình khác nhau có định dạng bộ nhớ đệm khác nhau, hãy xem tài liệu của mô hình. Thông thường, đây là một instance của Cache.
Đầu ra của các mô hình sinh mã hóa - giải mã, khi sử dụng các phương pháp không phải beam.
lớp 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 )
Tham số
- sequences (
torch.LongTensorcó hình dạng(batch_size*num_return_sequences, sequence_length)) — Các chuỗi được tạo ra. Chiều thứ hai (sequence_length) bằngmax_lengthhoặc ngắn hơn nếu tất cả các batch kết thúc sớm doeos_token_id. - sequences_scores (
torch.Tensorcó hình dạng(batch_size*num_return_sequences), tùy chọn, được trả về khioutput_scores=True) — Điểm beam cuối cùng của cácsequencesđược tạo ra. - scores (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_scores=True) — Điểm chuyển tiếp beam cho từng token từ vựng ở mỗi bước sinh. Điểm chuyển tiếp beam bao gồm các log xác suất của các token có điều kiện dựa trên log softmax của các token đã sinh trước đó trong beam này. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token đã sinh), mỗi tensor có hình dạng(batch_size*num_beams, config.vocab_size). - logits (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_logits=True) — Điểm dự đoán chưa xử lý của đầu mô hình ngôn ngữ (điểm cho từng token trong từ vựng trước SoftMax) tại mỗi bước sinh. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token được sinh), mỗi tensor có hình dạng(batch_size*num_beams, config.vocab_size). - beam_indices (
torch.LongTensor, tùy chọn, được trả về khioutput_scores=True) — Chỉ số beam của id token được tạo ra ở mỗi bước sinh.torch.LongTensorcó hình dạng(batch_size*num_return_sequences, sequence_length). - attentions (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_attentions=True) — Bộ ba (một phần tử cho mỗi token được tạo ra) của các bộ ba (một phần tử cho mỗi lớp của bộ giải mã) củatorch.Tensorcó hình dạng(batch_size*num_beams, num_heads, generated_length, sequence_length). - hidden_states (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_hidden_states=True) — Tuple (một phần tử cho mỗi token được tạo) của các tuple (một phần tử cho mỗi lớp của bộ giải mã) củatorch.Tensorcó hình dạng(batch_size*num_beams*num_return_sequences, generated_length, hidden_size). - past_key_values (
Cache, tùy chọn, được trả về khiuse_cache=True) — Trả về bộ nhớ đệm của mô hình, được sử dụng để tăng tốc quá trình giải mã. Các mô hình khác nhau có định dạng bộ nhớ đệm khác nhau, hãy xem tài liệu của mô hình. Thông thường, đây là một instance của Cache.
Đầu ra của các mô hình sinh chỉ có bộ giải mã, khi sử dụng các phương pháp chùm.
lớp 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 )
Tham số
- sequences (
torch.LongTensorcó hình dạng(batch_size*num_return_sequences, sequence_length)) — Các chuỗi được tạo ra. Chiều thứ hai (sequence_length) bằngmax_lengthhoặc ngắn hơn nếu tất cả các batch kết thúc sớm doeos_token_id. - sequences_scores (
torch.Tensorcó hình dạng(batch_size*num_return_sequences), tùy chọn, được trả về khioutput_scores=True) — Điểm beam cuối cùng của cácsequencesđược tạo ra. - scores (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_scores=True) — Điểm chuyển tiếp beam cho từng token từ vựng ở mỗi bước sinh. Điểm chuyển tiếp beam bao gồm các log xác suất của các token có điều kiện dựa trên log softmax của các token đã sinh trước đó trong beam này. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token đã sinh), mỗi tensor có hình dạng(batch_size*num_beams, config.vocab_size). - logits (
tuple(torch.Tensor)tùy chọn, được trả về khioutput_logits=True) — Điểm dự đoán chưa xử lý của đầu mô hình ngôn ngữ (điểm cho từng token trong từ vựng trước SoftMax) tại mỗi bước sinh. Tuple củatorch.Tensorvới tối đamax_new_tokensphần tử (một phần tử cho mỗi token được sinh), mỗi tensor có hình dạng(batch_size*num_beams, config.vocab_size). - beam_indices (
torch.LongTensor, tùy chọn, được trả về khioutput_scores=True) — Chỉ số beam của id token được tạo ra ở mỗi bước sinh.torch.LongTensorcó hình dạng(batch_size*num_return_sequences, sequence_length). - encoder_attentions (
tuple(torch.Tensor), tùy chọn, được trả về khioutput_attentions=True) — Bộ tuple củatorch.Tensor(một cho mỗi lớp của bộ giải mã) có hình dạng(batch_size, num_heads, sequence_length, sequence_length). - encoder_hidden_states (
tuple(torch.Tensor), tùy chọn, được trả về khioutput_hidden_states=True) — Bộ tuple củatorch.Tensor(một cho đầu ra của embeddings + một cho đầu ra của mỗi lớp) có hình dạng(batch_size*num_beams*num_return_sequences, sequence_length, hidden_size). - decoder_attentions (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_attentions=True) — Tuple (một phần tử cho mỗi token được tạo) của các tuple (một phần tử cho mỗi lớp của decoder) củatorch.Tensorcó hình dạng(batch_size*num_beams*num_return_sequences, num_heads, generated_length, sequence_length). - cross_attentions (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_attentions=True) — Tuple (một phần tử cho mỗi token được tạo) của các tuple (một phần tử cho mỗi lớp của decoder) củatorch.Tensorcó hình dạng(batch_size, num_heads, generated_length, sequence_length). - decoder_hidden_states (
tuple(tuple(torch.Tensor)), tùy chọn, được trả về khioutput_hidden_states=True) — Bộ ba (một phần tử cho mỗi token được tạo ra) của các bộ ba (một phần tử cho mỗi lớp của bộ giải mã) gồmtorch.Tensorcó hình dạng(batch_size*num_beams*num_return_sequences, generated_length, hidden_size). - past_key_values (
Cache, tùy chọn, được trả về khiuse_cache=True) — Trả về bộ nhớ đệm của mô hình, được sử dụng để tăng tốc quá trình giải mã. Các mô hình khác nhau có định dạng bộ nhớ đệm khác nhau, hãy xem tài liệu của mô hình. Thông thường, đây là một instance của Cache.
Đầu ra của các mô hình sinh mã hóa - giải mã, khi sử dụng các phương pháp chùm.
LogitsProcessor
Một LogitsProcessor có thể được sử dụng để sửa đổi điểm dự đoán của đầu mô hình ngôn ngữ cho việc tạo sinh.
lớp transformers.AlternatingCodebooksLogitsProcessor
< source >( input_start_len: intsemantic_vocab_size: intcodebook_size: int )
LogitsProcessor thực thi việc tạo xen kẽ giữa hai codebook của Bark.
Logits processor này chỉ tương thích với submodel fine của Bark. Xem tài liệu mô hình để biết các ví dụ.
lớp transformers.ClassifierFreeGuidanceLogitsProcessor
< source >( guidance_scale )
LogitsProcessor cho classifier free guidance (CFG). Các điểm số được chia theo chiều batch, trong đó nửa đầu tương ứng với logits có điều kiện (dự đoán từ prompt đầu vào) và nửa sau tương ứng với logits không điều kiện (dự đoán từ prompt rỗng hoặc ‘null’). Bộ xử lý tính trung bình có trọng số giữa logits có điều kiện và không điều kiện, được tham số hóa bởi guidance_scale.
Xem bài báo để biết thêm thông tin.
Logits processor này chỉ tương thích với MusicGen
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.EncoderNoRepeatNGramLogitsProcessor
< source >( encoder_ngram_size: intencoder_input_ids: LongTensor )
LogitsProcessor hoạt động tương tự như NoRepeatNGramLogitsProcessor, nhưng chỉ được áp dụng để ngăn chặn sự lặp lại của các n-gram có sẵn trong prompt.
Nó được thiết kế để thúc đẩy tính trò chuyện trong một mô hình ngôn ngữ, bằng cách ngăn chặn việc tạo ra các n-gram có mặt trong các vòng hội thoại trước đó.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.EncoderRepetitionPenaltyLogitsProcessor
< source >( penalty: floatencoder_input_ids: LongTensor )
LogitsProcessor hoạt động tương tự như RepetitionPenaltyLogitsProcessor, nhưng áp dụng một hình phạt ngược lên các token có mặt trong prompt. Nói cách khác, một hình phạt lớn hơn 1.0 sẽ tăng khả năng chọn các token đã xuất hiện trong prompt.
Nó được thiết kế để tránh hiện tượng ảo giác trong các tác vụ dựa trên đầu vào, chẳng hạn như tóm tắt. Mặc dù ban đầu được dành cho các mô hình encoder-decoder, nó cũng có thể được sử dụng với các mô hình chỉ có decoder như LLM.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.EpsilonLogitsWarper
< source >( epsilon: floatfilter_value: float = -infmin_tokens_to_keep: int = 1 )
Tham số
- epsilon (
float) — Nếu được đặt thành > 0, chỉ các token có xác suấtepsilontrở lên mới được giữ lại để tạo văn bản. - filter_value (
float, tùy chọn, mặc định là -inf) — Tất cả các giá trị bị lọc sẽ được đặt thành giá trị float này. - min_tokens_to_keep (
int, tùy chọn, mặc định là 1) — Số lượng token tối thiểu không thể bị lọc.
LogitsProcessor thực hiện epsilon-sampling, tức là giới hạn trong các token có prob >= epsilon. Nếu không có token nào thỏa mãn ràng buộc này, sẽ lấy min_tokens_to_keep token lớn nhất. Xem Truncation Sampling as Language Model Desmoothing để biết thêm thông tin.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.EtaLogitsWarper
< source >( epsilon: floatfilter_value: float = -infmin_tokens_to_keep: int = 1device: str = 'cpu' )
Tham số
- epsilon (
float) — Một giá trị float trong khoảng (0, 1). Tham số siêu được sử dụng để tính giá trị cắt động,eta. Các giá trị được đề xuất từ bài báo dao động từ 3e-4 đến 4e-3 tùy thuộc vào kích thước của mô hình. - filter_value (
float, tuỳ chọn, mặc định là -inf) — Tất cả các giá trị được xác định là thấp hơn ngưỡng cắt động,eta, sẽ được đặt thành giá trị float này. Tham số này hữu ích khi cần sửa đổi logits cho các token có xác suất rất thấp cần được loại trừ hoàn toàn khỏi quá trình sinh. - min_tokens_to_keep (
int, tùy chọn, mặc định là 1) — Chỉ định số lượng token tối thiểu phải được giữ lại cho quá trình sinh, bất kể xác suất của chúng. Ví dụ, nếumin_tokens_to_keepđược đặt thành 1, ít nhất một token sẽ luôn được giữ lại cho quá trình sinh, ngay cả khi tất cả các token đều có xác suất dưới ngưỡngeta. - device (
str, tùy chọn, mặc định là"cpu") — Thiết bị để cấp phát các tensor.
LogitsProcessor thực hiện eta-sampling, một kỹ thuật để lọc bỏ các token có xác suất thấp hơn một ngưỡng cắt động, eta, được tính toán dựa trên sự kết hợp của siêu tham số epsilon và entropy của các xác suất token, tức là eta := min(epsilon, sqrt(epsilon * e^-entropy(probabilities))). Nếu không có token nào thỏa mãn ràng buộc này, nó sẽ lấy min_tokens_to_keep token lớn nhất. Nó giải quyết vấn đề chất lượng kém trong các mẫu văn bản dài được tạo ra bởi các mô hình ngôn ngữ neural, dẫn đến văn bản mạch lạc và trôi chảy hơn. Xem Truncation Sampling as Language Model Desmoothing để biết thêm thông tin. Lưu ý: do_sample phải được đặt thành True để LogitsProcessor này hoạt động.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.ExponentialDecayLengthPenalty
< source >( exponential_decay_length_penalty: tupleeos_token_id: typing.Union[int, list[int], torch.Tensor]input_ids_seq_length: int )
Tham số
- exponential_decay_length_penalty (
tuple(int, float)) — Bộ ba này phải bao gồm:(start_index, decay_factor)trong đóstart_indexchỉ định vị trí bắt đầu áp dụng hình phạt vàdecay_factorđại diện cho hệ số suy giảm mũ - eos_token_id (
Union[int, list[int], torch.Tensor]) — Các id của token kết thúc chuỗi. - input_ids_seq_length (
int) — Độ dài của chuỗi đầu vào.
LogitsProcessor tăng điểm của eos_token_id theo hàm mũ sau khi start_index đã được
đạt tới. Điều này cho phép tạo ra các chuỗi ngắn hơn mà không cần cắt cứng, cho phép eos_token được
dự đoán ở một vị trí có ý nghĩa.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.ForcedBOSTokenLogitsProcessor
< source >( bos_token_id: int )
LogitsProcessor thực thi việc đặt token được chỉ định làm token đầu tiên được tạo ra. Được sử dụng với các mô hình encoder-decoder.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.ForcedEOSTokenLogitsProcessor
< source >( max_length: inteos_token_id: typing.Union[int, list[int], torch.Tensor]device: str = 'cpu' )
LogitsProcessor thực thi việc đặt token được chỉ định làm token được tạo cuối cùng khi đạt đến max_length.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
LogitsProcessor loại bỏ tất cả các giá trị nan và inf để tránh phương pháp sinh bị lỗi. Lưu ý rằng việc sử dụng logits processor chỉ nên được thực hiện khi cần thiết vì nó có thể làm chậm phương pháp sinh.
Logits processor này không có ví dụ generate, vì không nên có tổ hợp cờ nào phù hợp để sử dụng nó.
__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
LogitsProcessor để chuẩn hóa các điểm số bằng log-softmax. Việc chuẩn hóa điểm số trong quá trình beam search, sau khi áp dụng các logits processors hoặc warpers, là rất quan trọng, vì thuật toán tìm kiếm được sử dụng trong thư viện này không thực hiện việc đó (nó chỉ thực hiện trước đó, nhưng chúng có thể cần được chuẩn hóa lại) trong khi vẫn giả định rằng các điểm số đã được chuẩn hóa khi so sánh các giả thuyết.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
Lớp trừu tượng cơ sở cho tất cả các bộ xử lý logit có thể được áp dụng trong quá trình sinh.
__call__
< source >( input_ids: LongTensorscores: Tensor ) → torch.Tensor of shape (batch_size, config.vocab_size)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
Lớp này có thể được sử dụng để tạo một danh sách LogitsProcessor nhằm xử lý tensor đầu vào scores sau đó.
Lớp này kế thừa từ list và thêm phương thức call cụ thể để áp dụng từng LogitsProcessor vào các
đầu vào.
__call__
< source >( input_ids: LongTensorscores: Tensor**kwargs ) → torch.Tensor of shape (batch_size, config.vocab_size)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng beam search, hoặc log softmax cho từng token từ vựng khi sử dụng beam search - kwargs (
dict[str, Any], tùy chọn) — Các kwargs bổ sung dành riêng cho một logits processor.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.MinLengthLogitsProcessor
< source >( min_length: inteos_token_id: typing.Union[int, list[int], torch.Tensor]device: str = 'cpu' )
LogitsProcessor thực thi độ dài tối thiểu bằng cách đặt xác suất EOS bằng 0. Lưu ý rằng, đối với các mô hình chỉ có decoder như hầu hết các LLM, độ dài bao gồm cả prompt.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.MinNewTokensLengthLogitsProcessor
< source >( prompt_length_to_skip: intmin_new_tokens: inteos_token_id: typing.Union[int, list[int], torch.Tensor]device: str = 'cpu' )
Tham số
- prompt_length_to_skip (
int) — Độ dài của các token đầu vào. Không phải là đối số hợp lệ khi sử dụng vớigeneratevì nó sẽ tự động gán độ dài đầu vào. - min_new_tokens (
int) — Chiều dài tối thiểu của các mới tokens mà dưới ngưỡng này, điểm củaeos_token_idsẽ được đặt thành-float("Inf"). - eos_token_id (
Union[int, list[int], torch.Tensor]) — Các id của token kết thúc chuỗi. - device (
str, tùy chọn, mặc định là"cpu") — Thiết bị để cấp phát các tensor.
LogitsProcessor thực thi độ dài tối thiểu của các token mới bằng cách đặt xác suất của token EOS (End-Of-Sequence) thành 0. Ngược lại với MinLengthLogitsProcessor, bộ xử lý này bỏ qua prompt.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.MinPLogitsWarper
< source >( min_p: floatfilter_value: float = -infmin_tokens_to_keep: int = 1 )
Tham số
- min_p (
float) — Xác suất tối thiểu của token, sẽ được nhân với xác suất của token có khả năng cao nhất. Giá trị này phải nằm trong khoảng từ 0 đến 1. Các giá trị điển hình nằm trong khoảng 0.01-0.2, có tính chọn lọc tương đương với việc đặttop_ptrong khoảng 0.99-0.8 (sử dụng giá trịtop_pngược lại so với thông thường). - filter_value (
float, tùy chọn, mặc định là -inf) — Tất cả các giá trị bị lọc sẽ được đặt thành giá trị float này. - min_tokens_to_keep (
int, tùy chọn, mặc định là 1) — Số lượng token tối thiểu không thể bị lọc.
LogitsProcessor thực hiện min-p, tức là giữ lại tất cả các token có xác suất cao hơn một ngưỡng xác suất tối thiểu, được quy đổi theo xác suất của token có khả năng cao nhất. Kết quả là bộ lọc trở nên khắt khe hơn khi có sự hiện diện của các token có xác suất cao, đây là dấu hiệu của một đầu ra tự tin mà chúng ta không nên lệch khỏi.
Thường được sử dụng cùng với TemperatureLogitsWarper. Được dùng như một phương án thay thế cho TopPLogitsWarper và TopKLogitsWarper.
Được tạo bởi @menhguin và @kalomaze (tên người dùng github). Mã được điều chỉnh từ PR bên ngoài này
Ví dụ:
>>> 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, 9lớp transformers.NoBadWordsLogitsProcessor
< source >( bad_words_ids: listeos_token_id: typing.Union[int, list[int], torch.Tensor, NoneType] = None )
LogitsProcessor đảm bảo rằng các chuỗi được chỉ định sẽ không bao giờ được chọn.
Để lấy token ids của các từ không nên xuất hiện trong văn bản được tạo, hãy đảm bảo đặt
add_prefix_space=Truekhi khởi tạo tokenizer, và sử dụngtokenizer(bad_words, add_special_tokens=False).input_ids. Tham sốadd_prefix_spacechỉ được hỗ trợ cho một số tokenizer chậm, vì hành vi thêm tiền tố của các tokenizer nhanh đến từpre tokenizers. Đọc thêm tại đây.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.NoRepeatNGramLogitsProcessor
< source >( ngram_size: int )
N-grams là các nhóm gồm “n” từ, ký tự hoặc token liên tiếp được lấy từ một chuỗi văn bản. Với câu: “She runs fast”, các bi-gram (n=2) sẽ là (“she”, “runs”) và (“runs”, “fast”). Trong tạo văn bản, việc tránh lặp lại các chuỗi từ giúp đầu ra đa dạng hơn. LogitsProcessor này thực thi việc không lặp lại n-grams bằng cách đặt điểm của các token bị cấm thành âm vô cùng, qua đó loại bỏ các token đó khỏi quá trình xem xét khi xử lý điểm tiếp theo. Lưu ý rằng, đối với các mô hình chỉ có decoder như hầu hết các LLM, prompt cũng được tính đến để lấy các n-grams. Fairseq.
Hãy sử dụng hình phạt n-gram một cách thận trọng. Ví dụ, việc áp dụng hình phạt cho 2-gram (bigram) trong một bài viết về thành phố New York có thể dẫn đến kết quả không mong muốn, trong đó tên thành phố chỉ xuất hiện một lần trong toàn bộ văn bản. Tham khảo
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.PrefixConstrainedLogitsProcessor
< source >( prefix_allowed_tokens_fn: Callablenum_beams: int )
Tham số
- prefix_allowed_tokens_fn (
Callable[[int, torch.Tensor], list[int]]) — Hàm này ràng buộc beam search chỉ sử dụng các token được phép ở mỗi bước. Hàm này nhận 2 tham sốinputs_idsvà ID của batchbatch_id. Nó phải trả về một danh sách các token được phép cho bước sinh tiếp theo, dựa trên các token đã sinh trước đóinputs_idsvà ID của batchbatch_id.
LogitsProcessor thực thi tạo văn bản có ràng buộc và hữu ích cho tạo văn bản có ràng buộc dựa trên tiền tố. Xem Autoregressive Entity Retrieval để biết thêm thông tin.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.RepetitionPenaltyLogitsProcessor
< source >( penalty: floatprompt_ignore_length: typing.Union[int, torch.Tensor, NoneType] = None )
Tham số
- penalty (
float) — Tham số cho hình phạt lặp lại. 1.0 có nghĩa là không có hình phạt. Lớn hơn 1.0 sẽ hình phạt các token đã được tạo trước đó. Nằm giữa 0.0 và 1.0 sẽ thưởng cho các token đã được tạo trước đó. - prompt_ignore_length (
int, hoặctorch.LongTensor, tùy chọn) — Số lượng token đầu cần bỏ qua, có thể chỉ định riêng cho từng phần tử trong batch.
LogitsProcessor ngăn chặn việc lặp lại các token trước đó thông qua một hình phạt. Hình phạt này được áp dụng tối đa một lần cho mỗi token. Lưu ý rằng, đối với các mô hình chỉ có bộ giải mã như hầu hết các LLM, các token được xem xét bao gồm cả prompt theo mặc định.
Trong bài báo gốc, các tác giả đề xuất sử dụng mức phạt khoảng 1.2 để đạt được sự cân bằng tốt giữa việc tạo ra nội dung trung thực và hạn chế sự lặp lại. Để phạt và giảm sự lặp lại, hãy sử dụng các giá trị penalty lớn hơn 1.0, trong đó giá trị cao hơn sẽ phạt mạnh hơn. Để thưởng và khuyến khích sự lặp lại, hãy sử dụng các giá trị penalty nằm giữa 0.0 và 1.0, trong đó giá trị thấp hơn sẽ thưởng mạnh hơn.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.SequenceBiasLogitsProcessor
< source >( sequence_bias: list )
Tham số
- sequence_bias (
list[list[Union[list[int], float]]]) — Danh sách các danh sách ánh xạ một chuỗi token đến số hạng bias của nó (ví dụ:[[[10, 45], -2.0], [[64], -7.5]]). Các bias dương làm tăng xác suất chuỗi được chọn, trong khi các bias âm thì ngược lại. Nếu một chuỗi có độ dài là 1, bias của nó sẽ luôn được áp dụng. Ngược lại, bias chỉ được áp dụng nếu chuỗi đang xét sắp được hoàn thành (trong bước chọn token sau khi bộ xử lý này được áp dụng).
LogitsProcessor áp dụng độ chệch cộng vào các chuỗi. Độ chệch được áp dụng cho token cuối cùng của một chuỗi khi token được sinh ra tiếp theo có thể hoàn thành nó. Do đó, để tận dụng tối đa việc chệch các chuỗi có nhiều hơn một token, hãy cân nhắc sử dụng các phương pháp beam (để xử lý một cách mượt mà các chuỗi hoàn thành một phần có độ chệch âm) và áp dụng độ chệch vào các tiền tố của chúng (để đảm bảo độ chệch được áp dụng sớm hơn).
Ở cấp độ token, việc thiên vị một từ khác với việc thiên vị một từ có khoảng trắng phía trước. Nếu bạn muốn thiên vị “foo” ở giữa câu, bạn có thể sẽ muốn thêm một khoảng trắng tiền tố và thiên vị ” foo” thay vào đó. Xem phần tokenizer của khóa học NLP của chúng tôi để tìm hiểu lý do: https://huggingface.co/learn/nlp-course/chapter2/4?fw=pt
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.SuppressTokensAtBeginLogitsProcessor
< source >( begin_suppress_tokensbegin_indexdevice: str = 'cpu' )
SuppressTokensAtBeginLogitsProcessor sẽ chặn một danh sách các token ngay khi hàm generate bắt đầu tạo ra văn bản, bằng cách sử dụng các token begin_index. Điều này đảm bảo rằng các token được định nghĩa bởi begin_suppress_tokens sẽ không được tạo ra ở phần đầu. Ban đầu được tạo ra cho Whisper.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
Bộ xử lý này có thể được sử dụng để chặn một danh sách các token. Bộ xử lý sẽ đặt log probs của chúng thành -inf để chúng không được tạo ra. Ban đầu được tạo cho Whisper.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.SynthIDTextWatermarkLogitsProcessor
< source >( ngram_len: intkeys: listsampling_table_size: intsampling_table_seed: intcontext_history_size: intdevice: deviceskip_first_ngram_calls: bool = Falsedebug_mode: bool = False )
Tham số
- ngram_len (
int) — Độ dài ngram. - keys (
list[int]) — Một chuỗi các khóa watermarking, mỗi khóa tương ứng với một độ sâu. - sampling_table_size (
int) — Kích thước của bảng lấy mẫu. - sampling_table_seed (
int) — Hạt ngẫu nhiên để tạo bảng lấy mẫu. - context_history_size (
int) — Kích thước của tensor dùng để theo dõi các ngữ cảnh đã gặp. - device (
torch.device) — Thiết bị cần sử dụng. - skip_first_ngram_calls (
bool, tùy chọn, mặc định làFalse) — Có bỏ qua các lần gọi ngram đầu tiên hay không. - debug_mode (
bool, tùy chọn, mặc định làFalse) — Logits được sửa đổi thành phân phối đều trước khi áp dụng sửa đổi watermarking. Điều này dùng để kiểm tra việc triển khai.
Logits processor thực hiện các kỹ thuật đánh dấu (watermarking) cho các mô hình tạo văn bản. Lớp này hỗ trợ việc áp dụng SynthID text watermarking, một phương pháp nhúng các tín hiệu không thể nhận biết vào văn bản được tạo ra để hỗ trợ phát hiện nội dung tổng hợp. Nó hoạt động bằng cách tinh chỉnh nhẹ nhàng xác suất chọn token trong quá trình tạo văn bản theo cách có thể được khôi phục một cách đáng tin cậy sau đó để xác minh.
Các tính năng chính:
Quản lý trạng thái: Duy trì trạng thái nội bộ để theo dõi các chuỗi token và tạo các khóa watermark một cách động.
Định danh khóa: Tính toán các giá trị băm dựa trên các chuỗi token và các tham số đánh dấu để tạo ra các khóa duy nhất cho từng vị trí.
Lấy mẫu G-Value: Sử dụng bảng lấy mẫu được tính toán trước để lấy mẫu các giá trị đánh dấu (g-values) dựa trên các khóa được tạo ra.
Điều chỉnh điểm: Áp dụng các giá trị g đã tính toán để thay đổi xác suất của token trong quá trình sinh, từ đó nhúng watermark.
Xử lý lặp ngữ cảnh: Tích hợp logic để tránh đánh dấu các token trong các ngữ cảnh lặp lại, giữ được tính tự nhiên.
Ẩn token EOS: Hỗ trợ ẩn các token kết thúc câu để ngăn chúng được đưa vào các phép tính đánh dấu mờ.
Các hàm tiện ích: Cung cấp các hàm để tính trực tiếp các giá trị g, kiểm tra sự lặp lại ngữ cảnh, tạo các mặt nạ token EOS và ước tính giá trị g trung bình kỳ vọng.
Xem chi tiết tại: https://www.nature.com/articles/s41586-024-08025-4.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.TemperatureLogitsWarper
< source >( temperature: float )
LogitsProcessor cho nhiệt độ (thang đo mũ của phân phối xác suất đầu ra), điều này có nghĩa là nó có thể kiểm soát tính ngẫu nhiên của các token được dự đoán. Thường được sử dụng cùng với TopPLogitsWarper và TopKLogitsWarper.
Hãy đảm bảo rằng
do_sample=Trueđược bao gồm trong các đối số củagenerate, nếu không giá trị nhiệt độ sẽ không có bất kỳ tác dụng nào.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.TopHLogitsWarper
< source >( top_h: floatfilter_value: float = -inf )
LogitsProcessor thực hiện Top-H sampling, một phương pháp giải mã chọn thích ứng một tập con các token có xác suất cao dựa trên các ràng buộc về entropy và xác suất tích lũy.
Phương pháp này xác định động số lượng token cần giữ lại bằng cách phân tích sự khác biệt entropy của phân phối được chọn, từ đó cân bằng giữa khám phá và khai thác. Nó đảm bảo rằng văn bản được tạo ra duy trì được cả tính đa dạng lẫn tính nhất quán.
Tham khảo: Để biết thêm chi tiết, xem Top-H Decoding: Adapting the Creativity and Coherence with Bounded Entropy in Text Generation (NeurIPS 2025): https://arxiv.org/abs/2509.02510
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — ID của các token đầu vào. - scores (
torch.Tensorcó hình dạng(batch_size, vocab_size)) — Logit thô từ mô hình.
Trả về
torch.Tensor có hình dạng (batch_size, vocab_size)
Logits đã được xử lý, trong đó các token không hợp lệ được che bằng -inf.
Lọc logits bằng phương pháp lấy mẫu Top-H.
lớp transformers.TopKLogitsWarper
< source >( top_k: intfilter_value: float = -infmin_tokens_to_keep: int = 1 )
Tham số
LogitsProcessor thực hiện top-k, tức là giới hạn trong k phần tử có xác suất cao nhất. Thường được sử dụng cùng với TemperatureLogitsWarper và TopPLogitsWarper.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.TopPLogitsWarper
< source >( top_p: floatfilter_value: float = -infmin_tokens_to_keep: int = 1 )
Tham số
- top_p (
float) — Nếu được đặt thành < 1, chỉ tập hợp nhỏ nhất các token có xác suất cao nhất, với tổng xác suất bằng hoặc lớn hơntop_p, sẽ được giữ lại cho quá trình sinh. - filter_value (
float, tùy chọn, mặc định là -inf) — Tất cả các giá trị bị lọc sẽ được đặt thành giá trị float này. - min_tokens_to_keep (
int, tùy chọn, mặc định là 1) — Số lượng token tối thiểu không thể bị lọc.
LogitsProcessor thực hiện top-p, tức là giới hạn trong các token hàng đầu có tổng xác suất <= prob_cut_off. Thường được sử dụng cùng với TemperatureLogitsWarper và TopKLogitsWarper.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.TypicalLogitsWarper
< source >( mass: float = 0.9filter_value: float = -infmin_tokens_to_keep: int = 1 )
Tham số
- mass (
float, tùy chọn, mặc định là 0.9) — Giá trị của typical_p nằm trong khoảng từ 0 đến 1 (bao gồm cả hai đầu), mặc định là 0.9. - filter_value (
float, tùy chọn, mặc định là -inf) — Tất cả các giá trị bị lọc sẽ được đặt thành giá trị float này. - min_tokens_to_keep (
int, tùy chọn, mặc định là 1) — Số lượng token tối thiểu không thể bị lọc.
LogitsProcessor thực hiện giải mã điển hình. Lấy cảm hứng từ cách con người sử dụng ngôn ngữ, nó ưu tiên các token có log xác suất gần với entropy của phân phối xác suất token. Điều này có nghĩa là các token có khả năng cao nhất có thể bị loại bỏ trong quá trình này.
Xem Giải mã điển hình cho tạo ngôn ngữ tự nhiên để biết thêm thông tin.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.UnbatchedClassifierFreeGuidanceLogitsProcessor
< source >( guidance_scale: floatmodelunconditional_ids: typing.Optional[torch.LongTensor] = Noneunconditional_attention_mask: typing.Optional[torch.LongTensor] = Noneuse_cache: bool = True )
Tham số
- guidance_scale (
float) — Thang độ dẫn hướng cho classifier free guidance (CFG). CFG được kích hoạt bằng cách đặtguidance_scale != 1. Thang độ dẫn hướng cao hơn khuyến khích mô hình tạo ra các mẫu gắn kết chặt chẽ hơn với prompt đầu vào, thường phải đánh đổi bằng chất lượng kém hơn. Một giá trị nhỏ hơn 1 có tác dụng ngược lại, đồng thời khiến negative prompt được cung cấp qua negative_prompt_ids (nếu có) hoạt động như một positive prompt. - model (
PreTrainedModel) — Mô hình tính toán điểm số không điều kiện. Được cho là giống với mô hình tính toán điểm số có điều kiện. Cả hai mô hình phải sử dụng cùng một tokenizer. - unconditional_ids (
torch.LongTensorcó shape(batch_size, sequence_length), tuỳ chọn) — Chỉ số của các token trong chuỗi đầu vào theo từ điển cho nhánh không điều kiện. Nếu không được đặt, giá trị mặc định sẽ là token cuối cùng của prompt. - unconditional_attention_mask (
torch.LongTensorcó hình dạng(batch_size, sequence_length), tùy chọn) — Mặt nạ chú ý cho unconditional_ids. - use_cache (
bool, tùy chọn, mặc định làTrue) — Có nên lưu cache các key/value trong quá trình forward pass của negative prompt hay không.
Bộ xử lý logits cho Classifier-Free Guidance (CFG). Bộ xử lý tính trung bình có trọng số giữa các điểm số từ logits có điều kiện theo prompt và logits không điều kiện (hoặc âm) theo prompt, được tham số hóa bởi guidance_scale. Các điểm số không điều kiện được tính toán bên trong bằng cách đưa unconditional_ids vào model.
Xem bài báo để biết thêm thông tin.
Ví dụ:
>>> 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"lớp transformers.WhisperTimeStampLogitsProcessor
< source >( generate_config: GenerationConfigbegin_index: int_detect_timestamp_from_logprob: bool | None = None )
Tham số
- generate_config (
GenerateConfig) — Cấu hình generate được sử dụng để tạo ra đầu ra. Các tham số sau là bắt buộc: eos_token_id (int, tùy chọn, mặc định là 50257): Id của token kết thúc chuỗi. no_timestamps_token_id (int, tùy chọn, mặc định là 50363): Id của token"<|notimestamps|>". max_initial_timestamp_index (int, tùy chọn, mặc định là 1): Được sử dụng để đặt giá trị tối đa của timestamp ban đầu. Điều này được dùng để ngăn mô hình dự đoán các timestamp quá xa trong tương lai. - begin_index (
int) — Chỉ số token của token đầu tiên được mô hình tạo ra. - _detect_timestamp_from_logprob (
bool, tùy chọn) — Liệu có thể dự đoán các mốc thời gian từ logprobs trên tất cả các mốc thời gian hay không.
LogitsProcessor điều chỉnh logits cho việc tạo ra các mốc thời gian trong bản chuyển tự. Khi các token đầu vào đạt đến một ngưỡng cụ thể, bộ xử lý sẽ đặt điểm của chúng thành âm vô cùng. Bộ xử lý đảm bảo rằng các token mốc thời gian xuất hiện theo từng cặp, bằng cách che đi các logits có thể phá vỡ mẫu ghép cặp này. Việc này được thực hiện để duy trì tính nhất quán và cấu trúc của các mốc thời gian được tạo ra. Nó cũng đảm bảo rằng khi xác suất dự đoán để lấy mẫu bất kỳ token mốc thời gian nào lớn hơn bất kỳ token không phải mốc thời gian nào, các logits không phải mốc thời gian đó sẽ được đặt thành âm vô cùng. Việc này được thực hiện để đảm bảo việc tạo ra các mốc thời gian thay vì các token tiềm năng khác.
Xem bài báo để biết thêm thông tin.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
lớp transformers.WatermarkLogitsProcessor
< source >( vocab_sizedevicegreenlist_ratio: float = 0.25bias: float = 2.0hashing_key: int = 15485863seeding_scheme: str = 'lefthash'context_width: int = 1 )
Tham số
- vocab_size (
int) — vocab_size của tokenizer mô hình. Được dùng để tính tỷ lệ token “xanh”. - device (
str) — Thiết bị nơi mô hình được cấp phát. - greenlist_ratio (
float, tùy chọn, tùy chọn, mặc định là 0.25) — Tỷ lệ giữa số lượng token “green” được sử dụng và kích thước bảng từ vựng. Mặc định là 0.25. - bias (
float, optional, optional, mặc định là 2.0) — Giá trị bias được cộng vào logits của các token “green” được chọn. Hãy cân nhắc giảmbiasnếu chất lượng tạo văn bản bị suy giảm. Các giá trị được khuyến nghị nằm trong khoảng [0.5, 2.0]. Mặc định là 2.0. - hashing_key (
int, tùy chọn, tùy chọn, mặc định là 15485863) — Khóa được sử dụng để băm. Nếu bạn triển khai watermark này, chúng tôi khuyên bạn nên sử dụng một khóa riêng tư khác. Mặc định là 15485863 (số nguyên tố thứ một triệu). - seeding_scheme (
str, tuỳ chọn, tuỳ chọn, mặc định là"lefthash") — Phương án seeding được sử dụng để chọn các token “xanh”. Chấp nhận các giá trị:- “lefthash” (mặc định): việc chọn các token “green” phụ thuộc vào token cuối cùng (Thuật toán 2 trong bài báo)
- “selfhash”: việc chọn các token “green” phụ thuộc vào chính token hiện tại (Thuật toán 3 trong bài báo) Nhược điểm của phương án này là nó xem xét tất cả các token tiếp theo có thể và có thể chậm hơn “lefthash”. Chiều dài ngữ cảnh của các token trước đó được sử dụng để khởi tạo. Chiều dài ngữ cảnh cao hơn làm cho việc đánh dấu mờ (watermarking) trở nên bền vững hơn.
- context_width (
int, tùy chọn, mặc định là 1) — Số lượng token trước đó được sử dụng khi đặt seed.
Logits processor để thêm watermark cho văn bản được tạo ra. Bộ xử lý này thay đổi điểm số đầu ra của mô hình bằng cách thêm một độ lệch nhỏ vào tập hợp ngẫu nhiên các token “xanh” trước khi tạo token tiếp theo. Quá trình chọn token “xanh” phụ thuộc vào seeding_scheme được sử dụng. Mã nguồn được dựa trên repo gốc.
Văn bản do LogitsProcessor này tạo ra có thể được phát hiện bằng WatermarkDetector. Xem call() để biết thêm chi tiết,
Xem bài báo để biết thêm thông tin.
Ví dụ:
>>> 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)
Tham số
- input_ids (
torch.LongTensorcó hình dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Input IDs là gì? - scores (
torch.Tensorcó hình dạng(batch_size, config.vocab_size)) — Điểm dự đoán của đầu mô hình hóa ngôn ngữ. Đây có thể là logits cho từng từ vựng khi không sử dụng tìm kiếm chùm (beam search) hoặc log softmax cho từng token từ vựng khi sử dụng tìm kiếm chùm.
Trả về
torch.Tensor có hình dạng (batch_size, config.vocab_size)
Điểm dự đoán đã được xử lý.
StoppingCriteria
StoppingCriteria có thể được sử dụng để thay đổi thời điểm dừng tạo (ngoài token EOS). Lưu ý rằng tính năng này chỉ có sẵn trong các triển khai PyTorch của chúng tôi.
Lớp trừu tượng cơ sở cho tất cả các tiêu chí dừng có thể được áp dụng trong quá trình tạo.
Nếu tiêu chí dừng của bạn phụ thuộc vào đầu vào scores, hãy đảm bảo bạn truyền return_dict_in_generate=True, output_scores=True vào generate.
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
Tham số
- input_ids (
torch.LongTensorcó dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Có thể lấy chỉ số bằng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết. input IDs là gì?Các chỉ số có thể được lấy bằng cách sử dụng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết.
- scores (
tuple(torch.Tensor)) — Điểm dự đoán của đầu mô hình ngôn ngữ, dưới dạng tuple với một tensor cho mỗi bước sinh, mỗi tensor có hình dạng(batch_size, config.vocab_size). Đây có thể là điểm cho từng token trong bảng từ vựng trước SoftMax hoặc điểm cho từng token trong bảng từ vựng sau SoftMax. Nếu tiêu chí dừng này phụ thuộc vào đầu vàoscores, hãy đảm bảo bạn truyềnreturn_dict_in_generate=True, output_scores=Truechogenerate, nếu khôngNonesẽ được truyền. - kwargs (
dict[str, Any], tùy chọn) — Các kwargs tiêu chí dừng bổ sung.
Trả về
torch.BoolTensor. (torch.BoolTensor có hình dạng (batch_size, 1))
True cho biết chúng ta dừng sinh cho một hàng cụ thể.
False cho biết chúng ta nên tiếp tục.
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
Tham số
- input_ids (
torch.LongTensorcó dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Có thể lấy chỉ số bằng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết. input IDs là gì?Các chỉ số có thể được lấy bằng cách sử dụng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết.
- scores (
tuple(torch.Tensor)) — Điểm dự đoán của đầu mô hình ngôn ngữ, dưới dạng tuple với một tensor cho mỗi bước sinh, mỗi tensor có hình dạng(batch_size, config.vocab_size). Đây có thể là điểm cho từng token trong bảng từ vựng trước SoftMax hoặc điểm cho từng token trong bảng từ vựng sau SoftMax. Nếu tiêu chí dừng này phụ thuộc vào đầu vàoscores, hãy đảm bảo bạn truyềnreturn_dict_in_generate=True, output_scores=Truechogenerate, nếu khôngNonesẽ được truyền. - kwargs (
dict[str, Any], tùy chọn) — Các kwargs tiêu chí dừng bổ sung.
Trả về
torch.BoolTensor. (torch.BoolTensor có hình dạng (batch_size, 1))
True cho biết chúng ta dừng sinh cho một hàng cụ thể.
False cho biết chúng ta nên tiếp tục.
lớp transformers.MaxLengthCriteria
< source >( max_length: intmax_position_embeddings: int | None = None )
Lớp này có thể được sử dụng để dừng quá trình sinh khi tổng số token đã sinh vượt quá max_length. Lưu ý rằng đối với các transformer chỉ có decoder, con số này sẽ bao gồm cả các token được đưa vào ban đầu.
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
Tham số
- input_ids (
torch.LongTensorcó dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Có thể lấy chỉ số bằng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết. input IDs là gì?Các chỉ số có thể được lấy bằng cách sử dụng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết.
- scores (
tuple(torch.Tensor)) — Điểm dự đoán của đầu mô hình ngôn ngữ, dưới dạng tuple với một tensor cho mỗi bước sinh, mỗi tensor có hình dạng(batch_size, config.vocab_size). Đây có thể là điểm cho từng token trong bảng từ vựng trước SoftMax hoặc điểm cho từng token trong bảng từ vựng sau SoftMax. Nếu tiêu chí dừng này phụ thuộc vào đầu vàoscores, hãy đảm bảo bạn truyềnreturn_dict_in_generate=True, output_scores=Truechogenerate, nếu khôngNonesẽ được truyền. - kwargs (
dict[str, Any], tùy chọn) — Các kwargs tiêu chí dừng bổ sung.
Trả về
torch.BoolTensor. (torch.BoolTensor có hình dạng (batch_size, 1))
True cho biết chúng ta dừng sinh cho một hàng cụ thể.
False cho biết chúng ta nên tiếp tục.
lớp transformers.MaxTimeCriteria
< source >( max_time: floatinitial_timestamp: float | None = None )
Lớp này có thể được sử dụng để dừng quá trình sinh khi toàn bộ quá trình sinh vượt quá một khoảng thời gian nhất định. Mặc định, thời gian sẽ bắt đầu được tính khi bạn khởi tạo hàm này. Bạn có thể ghi đè điều này bằng cách truyền vào initial_timestamp.
__call__
< source >( input_ids: LongTensorscores: tuple[torch.Tensor] | None**kwargs ) → torch.BoolTensor. (torch.BoolTensor of shape (batch_size, 1))
Tham số
- input_ids (
torch.LongTensorcó dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Có thể lấy chỉ số bằng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết. input IDs là gì?Các chỉ số có thể được lấy bằng cách sử dụng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết.
- scores (
tuple(torch.Tensor)) — Điểm dự đoán của đầu mô hình ngôn ngữ, dưới dạng tuple với một tensor cho mỗi bước sinh, mỗi tensor có hình dạng(batch_size, config.vocab_size). Đây có thể là điểm cho từng token trong bảng từ vựng trước SoftMax hoặc điểm cho từng token trong bảng từ vựng sau SoftMax. Nếu tiêu chí dừng này phụ thuộc vào đầu vàoscores, hãy đảm bảo bạn truyềnreturn_dict_in_generate=True, output_scores=Truechogenerate, nếu khôngNonesẽ được truyền. - kwargs (
dict[str, Any], tùy chọn) — Các kwargs tiêu chí dừng bổ sung.
Trả về
torch.BoolTensor. (torch.BoolTensor có hình dạng (batch_size, 1))
True cho biết chúng ta dừng sinh cho một hàng cụ thể.
False cho biết chúng ta nên tiếp tục.
lớp transformers.StopStringCriteria
< source >( tokenizer: PreTrainedTokenizerBasestop_strings: str | list[str] )
Tham số
- tokenizer (
PreTrainedTokenizer) — Tokenizer liên quan của mô hình (cần thiết để trích xuất bảng từ vựng và mã hóa các chuỗi kết thúc) - stop_strings (
Union[str, list[str]]) — Một danh sách các chuỗi nên kết thúc quá trình sinh. Nếu một chuỗi được truyền vào, nó sẽ được xử lý như một danh sách có một phần tử duy nhất.
Lớp này có thể được sử dụng để dừng quá trình sinh ra bất cứ khi nào các chuỗi ký tự cụ thể được tạo ra. Nó tiền xử lý các chuỗi ký tự cùng với bảng từ vựng của tokenizer để tìm các vị trí mà các token có thể hoàn thành hợp lệ các chuỗi dừng.
Quá trình sinh sẽ dừng ngay khi một token được sinh ra hoàn thành bất kỳ chuỗi dừng nào. Chúng ta muốn bắt mọi trường hợp mà chuỗi dừng có mặt trong đầu ra đã giải mã, điều này có nghĩa là chúng ta cũng phải bắt các trường hợp có phần “lồi ra” ở một hoặc cả hai đầu. Để cụ thể hơn, với chuỗi dừng “stop”, bất kỳ chuỗi token nào sau đây đều sẽ kích hoạt sự khớp:
- [“st”, “op”]
- [“stop”]
- [“st”, “opera”]
- [“sto”, “pper”]
- [“las”, “topper”]
- [“s”, “to”, “pped”]
Lưu ý rằng một sự khớp chỉ được kích hoạt nếu chuỗi dừng nằm ở cuối chuỗi được tạo ra. Nói cách khác, các chuỗi sau sẽ không kích hoạt sự khớp:
- [“stop”, “at”]
- [“st”, “op”, “at”]
- [“st”, “opera”, “tion”]
Lý do các chuỗi này không khớp là vì chuỗi dừng không chồng lấn với token cuối cùng. Nếu bạn có thể xóa một hoặc nhiều token từ cuối chuỗi mà không làm hỏng chuỗi dừng, thì tiêu chí này sẽ không khớp với chuỗi dừng đó. Đây là thiết kế có chủ đích; vì kiểm tra này được thực hiện sau khi mỗi token được tạo ra, chúng ta sẽ không bỏ sót một chuỗi dừng hợp lệ nếu nó được tạo ra, nhưng chúng ta không muốn dừng quá trình tạo chỉ vì chuỗi dừng tồn tại ở đâu đó trong input_ids đầu vào trong quá khứ.
Vậy quá trình khớp thực sự được thực hiện như thế nào? Chúng ta thực hiện theo một cách khá gây nhầm lẫn, vì chúng ta muốn toàn bộ quy trình khớp có thể biên dịch được với Torch hoặc XLA, điều này có nghĩa là chúng ta không thể sử dụng các phương thức chuỗi chuẩn. Tuy nhiên, với một số công sức, việc khớp chuỗi bằng các phép toán tensor thuần túy là hoàn toàn khả thi. Chúng ta sẽ bắt đầu bằng cách mô tả thuật toán mà chúng ta sử dụng với các phép toán chuỗi chuẩn, và sau đó ở cuối bài viết, chúng ta sẽ giải thích cách chuyển đổi nó thành các phép toán tensor thuần túy.
Chìa khóa của thuật toán là một quan sát: Vì chuỗi dừng phải chồng lấp với phần cuối của chuỗi token, chúng ta có thể bắt đầu từ cuối chuỗi và làm việc ngược lại. Cụ thể, chúng ta kiểm tra xem có sự chồng lấp giữa phần đầu của token cuối cùng và phần cuối của stop_string hay không, hay nói cách khác, stop_string[-i:] == token[:i] với một số i > 0. Nếu bạn xem các ví dụ dương ở trên, bạn sẽ thấy token cuối cùng trong tất cả chúng đều thỏa mãn tính chất này:
- [“st”, “op”] (phần chồng lên là “op”, độ dài phần chồng lên == 2)
- [“stop”] (overlap là “stop”, độ dài overlap == 4)
- [“st”, “opera”] (phần chồng lên là “op”, độ dài phần chồng lên == 2)
- [“sto”, “pper”] (phần chồng lên là “p”, độ dài phần chồng lên == 1)
- [“las”, “topper”] (phần chồng lên là “top”, độ dài phần chồng lên == 3)
- [“s”, “to”, “pped”] (phần chồng lên là “p”, độ dài phần chồng lên == 1)
Không thể xây dựng một chuỗi khớp mà không có thuộc tính này (bạn có thể tự kiểm chứng). Tuy nhiên, mặc dù sự chồng lấn giữa phần đầu của token cuối cùng và phần cuối của chuỗi dừng là cần thiết để có một sự khớp, nhưng nó không đủ. Chúng ta cũng cần kiểm tra xem phần còn lại của chuỗi token có nhất quán với chuỗi dừng hay không.
Chúng ta thực hiện điều đó như thế nào? Hãy lấy [“s”, “to”, “pped”] làm ví dụ. Chúng ta biết rằng token cuối cùng, “pped”, có sự trùng lặp 1 ký tự với chuỗi dừng, “stop”. Sau đó, chúng ta quay lại token trước đó, “to”. Vì chúng ta đã khớp 1 ký tự từ chuỗi dừng, phần còn lại cần kiểm tra là “sto”. Chúng ta kiểm tra xem token tiếp theo “to” có khớp với phần cuối của phần còn lại hay không, và nó có khớp. Bây giờ chúng ta đã khớp 3 ký tự từ chuỗi dừng, và phần còn lại cần khớp là “s”. Chúng ta quay lại token trước đó một lần nữa, cũng là “s”. Đây là một sự khớp, và do đó chúng ta đã khớp toàn bộ chuỗi dừng.
Vậy thì khi các token vượt ra khỏi phần đầu của chuỗi dừng, cơ chế hoạt động ra sao? Hãy xem xét ví dụ [“las”, “topper”]. Token cuối cùng, “topper”, có phần chồng lấn 3 ký tự với chuỗi dừng, “stop”. Do đó, phần còn lại của chuỗi dừng cần khớp là “s”. Chúng ta quay lại token trước đó, “las”. Vì phần còn lại cần khớp chỉ là “s”, có độ dài 1, nên chúng ta chỉ xem xét 1 ký tự cuối cùng của token, tức là “s”. Điều này khớp với chuỗi dừng, và do đó toàn bộ chuỗi được khớp.
Vậy làm thế nào để tính toán các khớp này bằng các thao tác tensor? Rất đơn giản: chúng ta tiền xử lý một cách hiệu quả các thông tin cần thiết cho tất cả các token! Với mỗi token, chúng ta tính toán:
- Phần chồng lấn với cuối chuỗi dừng, nếu có
- Các vị trí bên trong chuỗi dừng mà tại đó token khớp, bao gồm cả các lần khớp vượt ra ngoài phần đầu.
- Tổng độ dài của token
Ví dụ, với token “pped”, chúng ta sẽ tính được độ chồng lấn cuối là 1, không có vị trí khớp nội bộ nào, và độ dài là 4. Với token “to”, chúng ta sẽ tính được không có độ chồng lấn cuối, một vị trí khớp nội bộ duy nhất là 1 (đếm từ cuối), và độ dài là 2. Với token “s”, chúng ta sẽ tính được không có độ chồng lấn cuối, một vị trí khớp nội bộ duy nhất là 3 (lại đếm từ cuối) và độ dài là 1.
Miễn là chúng ta có thông tin này, chúng ta có thể thực thi thuật toán ở trên mà không cần bất kỳ thao tác so sánh chuỗi nào. Chúng ta chỉ cần thực hiện các bước sau:
- Kiểm tra xem token cuối cùng có trùng lặp cuối với chuỗi bắt đầu không
- Tiếp tục quay ngược, theo dõi xem chúng ta đã khớp được bao nhiêu phần của chuỗi dừng cho đến nay
- Tại mỗi điểm, kiểm tra xem token tiếp theo có vị trí hiện tại là một trong các vị trí hợp lệ của nó hay không
- Tiếp tục cho đến khi một phần khớp thất bại, hoặc chúng ta khớp hoàn toàn toàn bộ chuỗi dừng
Một lần nữa, hãy xem [“s”, “to”, “pped”] làm ví dụ. “pped” có độ chồng cuối là 1, nên chúng ta có thể bắt đầu khớp. Chúng ta đã khớp được 1 ký tự cho đến nay, nên chúng ta kiểm tra xem token tiếp theo “to” có 1 là một vị trí hợp lệ không (một lần nữa, đếm từ cuối). Có, nên chúng ta thêm độ dài của “to” vào bộ theo dõi vị trí. Chúng ta đã khớp được 3 ký tự, nên chúng ta kiểm tra xem token tiếp theo “s” có 3 là một vị trí hợp lệ không. Có, nên chúng ta thêm độ dài của nó vào bộ theo dõi vị trí. Bộ theo dõi vị trí bây giờ là 4, đây là độ dài của chuỗi dừng. Chúng ta đã khớp được toàn bộ chuỗi dừng.
Trong trường hợp thứ hai, [“las”, “topper”], “topper” có phần chồng lấn cuối là 3, vì vậy chúng ta có thể bắt đầu khớp. Chúng ta đã khớp 3 ký tự cho đến nay, nên chúng ta kiểm tra xem token tiếp theo “las” có 3 là một vị trí hợp lệ hay không. Có, vì chúng ta cho phép các token khớp với các vị trí vượt ra ngoài đầu chuỗi dừng. Chúng ta thêm độ dài của nó vào bộ theo dõi vị trí. Bộ theo dõi vị trí bây giờ là 6, lớn hơn độ dài của chuỗi dừng! Tuy nhiên, đừng hoảng sợ - điều này cũng được tính là một lần khớp với chuỗi dừng. Chúng ta đã khớp toàn bộ chuỗi dừng.
Ví dụ:
>>> 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))
Tham số
- input_ids (
torch.LongTensorcó dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Có thể lấy chỉ số bằng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết. input IDs là gì?Các chỉ số có thể được lấy bằng cách sử dụng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết.
- scores (
tuple(torch.Tensor)) — Điểm dự đoán của đầu mô hình ngôn ngữ, dưới dạng tuple với một tensor cho mỗi bước sinh, mỗi tensor có hình dạng(batch_size, config.vocab_size). Đây có thể là điểm cho từng token trong bảng từ vựng trước SoftMax hoặc điểm cho từng token trong bảng từ vựng sau SoftMax. Nếu tiêu chí dừng này phụ thuộc vào đầu vàoscores, hãy đảm bảo bạn truyềnreturn_dict_in_generate=True, output_scores=Truechogenerate, nếu khôngNonesẽ được truyền. - kwargs (
dict[str, Any], tùy chọn) — Các kwargs tiêu chí dừng bổ sung.
Trả về
torch.BoolTensor. (torch.BoolTensor có hình dạng (batch_size, 1))
True cho biết chúng ta dừng sinh cho một hàng cụ thể.
False cho biết chúng ta nên tiếp tục.
lớp transformers.EosTokenCriteria
< source >( eos_token_id: typing.Union[int, list[int], torch.Tensor] )
Lớp này có thể được sử dụng để dừng quá trình sinh khi token “end-of-sequence” được tạo ra.
Mặc định, nó sử dụng 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))
Tham số
- input_ids (
torch.LongTensorcó dạng(batch_size, sequence_length)) — Chỉ số của các token trong chuỗi đầu vào theo từ vựng. Có thể lấy chỉ số bằng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết. input IDs là gì?Các chỉ số có thể được lấy bằng cách sử dụng AutoTokenizer. Xem PreTrainedTokenizer.encode() và PreTrainedTokenizer.call() để biết thêm chi tiết.
- scores (
tuple(torch.Tensor)) — Điểm dự đoán của đầu mô hình ngôn ngữ, dưới dạng tuple với một tensor cho mỗi bước sinh, mỗi tensor có hình dạng(batch_size, config.vocab_size). Đây có thể là điểm cho từng token trong bảng từ vựng trước SoftMax hoặc điểm cho từng token trong bảng từ vựng sau SoftMax. Nếu tiêu chí dừng này phụ thuộc vào đầu vàoscores, hãy đảm bảo bạn truyềnreturn_dict_in_generate=True, output_scores=Truechogenerate, nếu khôngNonesẽ được truyền. - new_token_length (
int, tuỳ chọn, mặc định là1) — Số lượng token sẽ được kiểm tra theo các tiêu chí.new_token_lengthtoken mới nhất trên mỗi mục trong batch sẽ được kiểm tra. - kwargs (
dict[str, Any], tùy chọn) — Các kwargs tiêu chí dừng bổ sung.
Trả về
torch.BoolTensor. (torch.BoolTensor có hình dạng (batch_size, 1))
True cho biết chúng ta dừng sinh cho một hàng cụ thể.
False cho biết chúng ta nên tiếp tục.
Streamers
lớp transformers.TextStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = False**decode_kwargs: Any )
Tham số
- tokenizer (
AutoTokenizer) — Tokenizer được sử dụng để giải mã các token. - skip_prompt (
bool, tùy chọn, mặc định làFalse) — Có bỏ qua prompt cho.generate()hay không. Hữu ích, ví dụ, cho các chatbot. - decode_kwargs (
dict, tùy chọn) — Các đối số từ khóa bổ sung để truyền cho phương thứcdecodecủa tokenizer.
Trình phát trực tiếp văn bản đơn giản, in các token ra stdout ngay khi các từ hoàn chỉnh được hình thành.
Ví dụ:
>>> 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,Xóa mọi bộ nhớ đệm còn lại và in một ký tự xuống dòng ra stdout.
In ra văn bản mới ra stdout. Nếu luồng đang kết thúc, cũng in xuống dòng mới.
Nhận các token, giải mã chúng và in ra stdout ngay khi chúng tạo thành các từ hoàn chỉnh.
lớp transformers.TextIteratorStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = Falsetimeout: float | None = None**decode_kwargs: Any )
Tham số
- tokenizer (
AutoTokenizer) — Tokenizer được sử dụng để giải mã các token. - skip_prompt (
bool, tùy chọn, mặc định làFalse) — Có bỏ qua prompt cho.generate()hay không. Hữu ích, ví dụ, cho các chatbot. - timeout (
float, tùy chọn) — Thời gian chờ cho hàng đợi văn bản. Nếu làNone, hàng đợi sẽ bị chặn vô thời hạn. Hữu ích để xử lý ngoại lệ trong.generate(), khi nó được gọi trong một luồng riêng biệt. - decode_kwargs (
dict, tùy chọn) — Các đối số từ khóa bổ sung để truyền cho phương thứcdecodecủa tokenizer.
Streamer lưu trữ văn bản sẵn sàng để in vào hàng đợi, để ứng dụng phía dưới sử dụng như một iterator. Điều này hữu ích cho các ứng dụng được hưởng lợi từ việc truy cập văn bản được tạo ra theo cách không chặn (ví dụ: trong một demo Gradio tương tác).
Ví dụ:
>>> 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,'Đặt văn bản mới vào hàng đợi. Nếu luồng đang kết thúc, hãy đặt thêm tín hiệu dừng vào hàng đợi.
lớp transformers.AsyncTextIteratorStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = Falsetimeout: float | None = None**decode_kwargs: Any )
Tham số
- tokenizer (
AutoTokenizer) — Tokenizer được sử dụng để giải mã các token. - skip_prompt (
bool, tùy chọn, mặc định làFalse) — Có bỏ qua prompt cho.generate()hay không. Hữu ích, ví dụ, cho các chatbot. - timeout (
float, tùy chọn) — Thời gian chờ cho hàng đợi văn bản. Nếu làNone, hàng đợi sẽ bị chặn vô thời hạn. Hữu ích để xử lý ngoại lệ trong.generate(), khi nó được gọi trong một luồng riêng biệt. - decode_kwargs (
dict, tùy chọn) — Các đối số từ khóa bổ sung để truyền cho phương thứcdecodecủa tokenizer.
Gây ra
TimeoutError
TimeoutError— Nếu thời gian tạo token vượt quá giá trị timeout.
Streamer lưu trữ văn bản sẵn sàng in vào hàng đợi, để được ứng dụng hạ nguồn sử dụng như một bộ lặp bất đồng bộ. Điều này hữu ích cho các ứng dụng được hưởng lợi từ việc truy cập văn bản được tạo ra một cách bất đồng bộ (ví dụ: trong một demo Gradio tương tác).
Ví dụ:
>>> 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,Đặt văn bản mới vào hàng đợi. Nếu luồng đang kết thúc, hãy đặt thêm tín hiệu dừng vào hàng đợi.
lớp transformers.TextDiffusionStreamer
< source >( tokenizer: PreTrainedTokenizerBaseskip_prompt: bool = Falsesleep_time: float | None = None**decode_kwargs: Any )
Tham số
- tokenizer (
AutoTokenizer) — Tokenizer được sử dụng để giải mã các token. - skip_prompt (
bool, tùy chọn, mặc định làFalse) — Có bỏ qua prompt cho.generate()hay không. Hữu ích, ví dụ, cho các chatbot. - sleep_time (
float, tùy chọn) — Thời gian ngủ giữa các bản nháp khuếch tán, có thể hữu ích để trực quan hóa các đầu ra trung gian. - decode_kwargs (
dict, tùy chọn) — Các đối số từ khóa bổ sung để truyền cho phương thứcdecodecủa tokenizer.
Streamer in ra kết quả khuếch tán văn bản. Các bước khuếch tán trung gian (bản nháp) là tạm thời và sẽ bị ghi đè bởi các bản nháp tiếp theo, đồng thời bị xóa khi văn bản đã được xác nhận in ra.
Nếu bạn đang chạy trong một môi trường như tmux, văn bản nháp có thể không tự ghi đè lên chính nó.
Ví dụ:
>>> 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)Xóa bộ nhớ đệm còn lại và in xuống dòng mới.
Nhận các token đã xác nhận, xóa bản nháp và in chúng vĩnh viễn.
Nhận toàn bộ chuỗi token nháp, giải mã chúng và in ra bằng màu vàng. Ghi đè lên bản nháp trước đó.
Bộ nhớ đệm
Lớp trừu tượng cơ bản cho bộ nhớ đệm của một lớp duy nhất.
Trả về độ dài chuỗi tối đa mà lớp có thể chứa. Giá trị -1 có nghĩa là không có giới hạn tối đa, hoặc giới hạn tối đa không xác định, chẳng hạn như một lớp chú ý động (dynamic attention) tăng trưởng vô hạn hoặc một lớp chú ý tuyến tính (linear attention) không có chiều độ dài chuỗi.
Đặt lại các giá trị cache trong khi giữ nguyên các đối tượng
Sắp xếp lại bộ nhớ đệm của lớp này cho tìm kiếm chùm.
Một lớp cache tăng trưởng động khi có thêm token được tạo ra. Đây là mặc định cho các mô hình sinh.
Nó lưu trữ trạng thái key và value dưới dạng các tensor có hình dạng [batch_size, num_heads, seq_len, head_dim].
cập nhật
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
Cập nhật bộ đệm key và value tại chỗ, và trả về các trạng thái key và value cần thiết.
Xóa các token tokens_to_remove khỏi lớp cache hiện tại.
Lặp lại cache repeats lần theo chiều batch.
Chỉ giữ lại indices trong chiều batch của cache.
lớp transformers.StaticLayer
< source >( max_cache_len: int**kwargs )
Một lớp cache tĩnh lưu trữ trạng thái key và value dưới dạng các tensor tĩnh có hình dạng [batch_size, num_heads, max_cache_len, head_dim].
Nó phân bổ lười các tensor nền đầy đủ của mình, sau đó thay đổi chúng tại chỗ. Được xây dựng để hỗ trợ torch.compile.
cập nhật
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
Cập nhật bộ đệm key và value tại chỗ, và trả về các trạng thái key và value cần thiết.
Khởi tạo trễ các tensor keys và values. Điều này cho phép lấy tất cả các thuộc tính (dtype, device, num_heads trong trường hợp TP, v.v…) trực tiếp tại thời điểm runtime, cực kỳ thực dụng vì tránh việc phải di chuyển device, dtype, v.v sau này cho mỗi lần update (điều này cũng có thể làm hỏng các địa chỉ dynamo tĩnh).
Nếu điều này không mong muốn, bạn có thể gọi early_initialization(...) trực tiếp trên Cache, điều này sẽ gọi hàm này trước thời điểm thực thi (điều này là bắt buộc, chẳng hạn đối với torch.export). Nó cũng là bắt buộc mỗi khi chính prefill nằm trong một vùng được biên dịch (ví dụ với chunked prefill).
lớp transformers.StaticSlidingWindowLayer
< source >( max_cache_len: intsliding_window: int**kwargs )
Một lớp cache tĩnh lưu trữ trạng thái key và value dưới dạng các tensor tĩnh có hình dạng [batch_size, num_heads, min(max_cache_len, sliding_window), head_dim]. Lớp này phân bổ các tensor nền đầy đủ một cách lười biếng, sau đó thay đổi chúng tại chỗ. Được xây dựng để hỗ trợ torch.compile.
cập nhật
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
Cập nhật bộ đệm key và value tại chỗ, và trả về các trạng thái key và value cần thiết.
Khởi tạo trễ các tensor keys và values. Điều này cho phép lấy tất cả các thuộc tính (dtype, device, num_heads trong trường hợp TP, v.v…) trực tiếp tại thời điểm runtime, cực kỳ thực dụng vì tránh việc phải di chuyển device, dtype, v.v sau này cho mỗi lần update (điều này cũng có thể làm hỏng các địa chỉ dynamo tĩnh).
Nếu điều này không mong muốn, bạn có thể gọi early_initialization(...) trực tiếp trên Cache, điều này sẽ gọi hàm này trước thời điểm thực thi (điều này là bắt buộc, chẳng hạn đối với torch.export). Nó cũng là bắt buộc mỗi khi chính prefill nằm trong một vùng được biên dịch (ví dụ với chunked prefill).
lớp transformers.QuantoQuantizedLayer
< source >( nbits: int = 4axis_key: int = 0axis_value: int = 0q_group_size: int = 64residual_length: int = 128 )
cập nhật
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
Cập nhật bộ đệm key và value tại chỗ, và trả về các trạng thái key và value cần thiết.
lớp transformers.HQQQuantizedLayer
< source >( nbits: int = 4axis_key: int = 0axis_value: int = 0q_group_size: int = 64residual_length: int = 128 )
cập nhật
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
Cập nhật bộ đệm key và value tại chỗ, và trả về các trạng thái key và value cần thiết.
Một lớp lượng tử hóa lưu trữ trạng thái key và value ở định dạng số dấu phẩy động 8-bit. Thang đo theo tensor được đóng băng sau lần update đầu tiên, do đó các trạng thái mới được thêm vào nguyên bản: không có bộ đệm phần dư, không có tái lượng tử hóa.
Một biến thể có độ granular mịn hơn thuộc về đây thay vì dưới QuantizedLayer, vì việc nhóm theo chiều head giữ cho các trạng thái có thể thêm vào được và chỉ biến scale được lưu trữ thành một tensor.
cập nhật
< source >( key_states: Tensorvalue_states: Tensor*args**kwargs ) → tuple[torch.Tensor, torch.Tensor]
Cập nhật bộ đệm key và value tại chỗ, và trả về các trạng thái key và value cần thiết.
lớp 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 )
Tham số
- layers (
Optional, tuỳ chọn) — Một danh sách cácCacheLayerMixinhoặcLinearAttentionCacheLayerMixinđã được tạo trước. Nếu bị bỏ qua (None), thìlayer_class_to_replicatesẽ được sử dụng. - layer_class_to_replicate (
type[CacheLayerMixin | LinearAttentionCacheLayerMixin], optional) — Chỉ được sử dụng nếulayersbị bỏ qua (None), khi đó nó sẽ được dùng làm lớp cơ sở cho từng lớp, và các lớp sẽ được thêm một cách lười (lazy) ngay khiupdateđược gọi vớilayer_idxlớn hơn danh sách các lớp hiện tại. - offloading (
bool, tùy chọn, mặc định làFalse) — Có thực hiện offloading các lớp sangcpuhay không, để tiết kiệm bộ nhớ GPU. - offload_only_non_sliding (
bool, tùy chọn, mặc định làTrue) — NếuoffloadinglàTrue, tham số này quyết định xem có chỉ offload các lớp không trượt hay không (vì thường thì các lớp trượt có kích thước nhỏ, nên không cần offload chúng, và việc bỏ qua sẽ nhanh hơn).
Cache chủ yếu là một danh sách các đối tượng CacheLayerMixin, mỗi đối tượng tương ứng với một lớp của mô hình. Nó đóng vai trò là bộ chứa cho Cache của từng lớp.
cập nhật
< source >( key_states: Tensorvalue_states: Tensorlayer_idx: int*args**kwargs )
Cập nhật bộ nhớ đệm với key_states và value_states mới cho lớp layer_idx.
khởi tạo sớm
< source >( batch_size: intnum_heads: int | list[int]head_dim: int | list[int]dtype: dtypedevice: device )
Khởi tạo tất cả các lớp trước (nếu không, chúng sẽ được khởi tạo theo kiểu lười biếng ở lần gọi update đầu tiên).
Điều này hữu ích cho các công thức export của chúng ta, vì export cần mọi thứ được chuẩn bị sẵn từ trước.
Trả về độ dài chuỗi của bộ nhớ đệm cho lớp được chỉ định.
Trả về một tuple (kv_length, kv_offset) tương ứng với độ dài và offset sẽ được trả về cho
layer được chỉ định tại layer_idx.
Các mask sau đó được chuẩn bị theo các độ dài (kv_length, kv_offset) và mẫu (patterns) được chỉ định cho từng layer.
Trả về độ dài tối đa của bộ nhớ đệm. Nếu layer_idx không được cung cấp (mặc định), hàm này trả về giá trị tối đa trên tất cả các lớp. Ngược lại, trả về giá trị tối đa được hỗ trợ cho lớp được chỉ định.
Giá trị -1 có nghĩa là không có giới hạn tối đa, hoặc giới hạn tối đa không xác định, ví dụ như các lớp chú ý động có thể tăng không giới hạn, hoặc các lớp chú ý tuyến tính không có chiều độ dài chuỗi.
Đặt lại đệ quy tất cả các tensor của các lớp
Sắp xếp lại bộ nhớ đệm cho tìm kiếm chùm
Xóa các token tokens_to_remove khỏi Cache hiện tại. Đối với các lớp không cần giữ toàn bộ trạng thái quá khứ trong bộ nhớ, chẳng hạn như các lớp cửa sổ trượt hoặc các lớp chú ý tuyến tính, thao tác này cũng sẽ giới hạn kích thước của các trạng thái được lưu cache trở lại kích thước hoạt động tối thiểu. Điều này có nghĩa là crop(0) không nhất thiết luôn là một thao tác không làm gì (no-op), vì nó vẫn có thể xóa các trạng thái vô dụng (tức là các trạng thái không cần thiết cho lần forward tiếp theo) khỏi Cache.
Lặp lại và xen kẽ bộ nhớ đệm
Chọn các chỉ số từ bộ nhớ đệm
lớp 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 )
Tham số
- ddp_cache_data (
Iterable[tuple[torch.Tensor, torch.Tensor]], optional) — Ban đầu được thêm vào để tương thích vớitorch.distributed(DDP). Tóm lại, nó làmap(gather_map, zip(*caches)), tức là mỗi phần tử trong iterable chứa trạng thái key và value của một lớp đã được thu thập (gather) trên các replica bởi torch.distributed (shape=[global batch size, num_heads, seq_len, head_dim]). Lưu ý: nó cũng cần phải là đối số thứ nhất để hoạt động chính xác - config (
PreTrainedConfig, tùy chọn) — Cấu hình của mô hình mà Cache này sẽ được sử dụng. Nếu được truyền vào, nó sẽ được dùng để kiểm tra cấu trúc lớp trượt hoặc lai, giúp giảm đáng kể yêu cầu bộ nhớ của các tensor được cache xuống còn[batch_size, num_heads, min(seq_len, sliding_window), head_dim]. - offloading (
bool, tùy chọn, mặc định làFalse) — Có thực hiện offloading các lớp sangcpuhay không, để tiết kiệm bộ nhớ GPU. - offload_only_non_sliding (
bool, tùy chọn, mặc định làFalse) — NếuoffloadinglàTrue, tham số này quyết định xem có chỉ offload các lớp không trượt hay không (vì thường thì các lớp trượt có kích thước nhỏ, nên không cần offload chúng, và việc bỏ qua sẽ nhanh hơn).
Bộ đệm tăng trưởng động khi có thêm token được tạo ra. Đây là mặc định cho các mô hình sinh.
Nó lưu trữ trạng thái key và value dưới dạng danh sách các CacheLayer, mỗi lớp một phần tử. Hình dạng mong đợi cho mỗi tensor
trong các CacheLayer là [batch_size, num_heads, seq_len, head_dim].
Nếu một config được truyền vào, nó sẽ kiểm tra thêm cấu trúc bộ đệm trượt hoặc lai, giảm đáng kể
yêu cầu bộ nhớ của các tensor được đệm xuống còn [batch_size, num_heads, min(seq_len, sliding_window), head_dim].
Xem Cache để biết chi tiết về các phương thức phổ biến được triển khai bởi tất cả các lớp cache.
Ví dụ:
>>> 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 generationlớp transformers.StaticCache
< source >( config: PreTrainedConfigmax_cache_len: intoffloading: bool = Falseoffload_only_non_sliding: bool = True**kwargs )
Tham số
- config (
PreTrainedConfig) — Cấu hình của mô hình mà Cache này sẽ được sử dụng. Nó sẽ được dùng để kiểm tra cấu trúc lớp trượt hoặc lai, và khởi tạo từng lớp tương ứng. - max_cache_len (
int) — Số lượng token tối đa mà Cache này nên giữ. - offloading (
bool, tùy chọn, mặc định làFalse) — Có thực hiện offloading các lớp sangcpuhay không, để tiết kiệm bộ nhớ GPU. - offload_only_non_sliding (
bool, tùy chọn, mặc định làTrue) — NếuoffloadinglàTrue, tham số này quyết định xem có chỉ offload các lớp không trượt hay không (vì thường thì các lớp trượt có kích thước nhỏ, nên không cần offload chúng, và việc bỏ qua sẽ nhanh hơn).
Lớp Static Cache để sử dụng với torch.compile(model) và torch.export(). Nó sẽ kiểm tra config để tìm cấu trúc cache hybrid tiềm năng và khởi tạo từng lớp tương ứng.
Xem Cache để biết chi tiết về các phương thức phổ biến được triển khai bởi tất cả các lớp cache.
Ví dụ:
>>> 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()lớp 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 )
Tham số
- backend (
str) — Backend lượng tử hóa cần sử dụng. Một trong số("quanto", "hqq", "fp8"). - config (
PreTrainedConfig) — Cấu hình của mô hình mà Cache này sẽ được sử dụng. - nbits (
int, tùy chọn, mặc định là 4) — Số bit dùng cho lượng tử hóa. - axis_key (
int, tuỳ chọn, mặc định là 0) — Trục để lượng tử hóa các key. - axis_value (
int, tuỳ chọn, mặc định là 0) — Trục để lượng tử hóa các giá trị. - q_group_size (
int, tùy chọn, mặc định là 64) — Lượng tử hóa được thực hiện theo từng kênh dựa trên một tậpq_group_sizecho cả keys và values. - residual_length (
int, tùy chọn, mặc định là 128) — Dung lượng tối đa cho bộ nhớ đệm độ chính xác gốc.
Bộ đệm lượng tử hóa tương tự như được mô tả trong bài báo KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache.
Nó cho phép mô hình tạo ra chuỗi có độ dài lớn hơn mà không cần phân bổ quá nhiều bộ nhớ cho các key và value
bằng cách áp dụng lượng tử hóa.
Bộ đệm có hai loại lưu trữ, một cho độ chính xác gốc và một cho
bộ đệm đã lượng tử hóa. Một residual length được đặt làm dung lượng tối đa cho bộ đệm độ chính xác gốc. Khi
độ dài vượt quá dung lượng tối đa, bộ đệm độ chính xác gốc sẽ bị loại bỏ và chuyển vào bộ đệm lượng tử hóa.
Lượng tử hóa được thực hiện theo từng kênh với một q_group_size được đặt cho cả key và value, trái ngược với những gì
được mô tả trong bài báo.
Xem Cache để biết chi tiết về các phương thức phổ biến được triển khai bởi tất cả các lớp cache.
Năm đối số cuối cùng cấu hình các backend integer theo nhóm. Backend fp8 lượng tử hóa theo tensor và từ chối chúng.
lớp transformers.EncoderDecoderCache
< source >( *caches )
Tham số
- caches (
Iterable) — Thường là một iterable có độ dài 2, chứa 2 đối tượngCache, đối tượng đầu tiên dành cho self-attention, đối tượng thứ hai dành cho cross-attention. Tùy chọn, cũng có thể là một iterable có độ dài 1, chứa mộttuple[tuple[torch.Tensor]](thường được dùng để tương thích với torch dp và ddp).
Lớp trừu tượng cơ bản cho tất cả các bộ nhớ đệm (cache) của bộ mã hóa-giải mã (encoder-decoder). Có thể được sử dụng để lưu trữ các tổ hợp của bộ nhớ đệm self-attention và cross-attention.
Xem Cache để biết chi tiết về các phương thức phổ biến được triển khai bởi tất cả các lớp cache.
Ví dụ:
>>> 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()Lặp lại cache repeats lần theo chiều batch. Được sử dụng trong contrastive search (trên Hub).
Chỉ giữ lại indices trong chiều batch của cache. Được sử dụng trong tìm kiếm tương phản (trên Hub).
Xóa các token tokens_to_remove khỏi lớp cache hiện tại.
Trả về độ dài chuỗi tối đa (tức là sức chứa tối đa) của đối tượng cache
Trả về độ dài chuỗi của các trạng thái được đệm. Có thể truyền tùy chọn một chỉ số lớp.
Sắp xếp lại bộ nhớ đệm cho tìm kiếm chùm, dựa trên các chỉ mục chùm đã chọn.
Công cụ đánh dấu
lớp transformers.WatermarkingConfig
< source >( greenlist_ratio: float = 0.25bias: float = 2.0hashing_key: int = 15485863seeding_scheme: str = 'lefthash'context_width: int = 1 )
Lớp chứa các đối số cho việc tạo watermark và cần được truyền vào GenerationConfig trong quá trình generate.
Xem bài báo này để biết thêm chi tiết về các đối số.
Nhận các khóa sau:
- greenlist_ratio (
float): Được sử dụng cho việc đánh dấu watermark. Tỷ lệ các token “xanh” được sử dụng so với kích thước từ vựng. Mặc định là 0.25. - bias (
float): Dùng với watermarking. Độ chệch được thêm vào logits của các token “xanh” được chọn. Mặc định là 2.0. - hashing_key (
int): Khóa băm được sử dụng cho việc đánh dấu bản quyền. Mặc định là 15485863 (số nguyên tố thứ một triệu). - seeding_scheme (
str): Thuật toán sử dụng cho watermarking. Chấp nhận các giá trị:- “lefthash” (mặc định): việc chọn các token “green” phụ thuộc vào token cuối cùng (Thuật toán 2 trong bài báo)
- “selfhash”: việc chọn các token “green” phụ thuộc vào chính token hiện tại (Thuật toán 3 trong bài báo) Nhược điểm của phương án này là nó xem xét tất cả các token tiếp theo có thể và có thể chậm hơn “lefthash”.
- context_width(
int): Chiều dài ngữ cảnh của các token trước đó được sử dụng trong seeding. Chiều dài ngữ cảnh cao hơn làm cho việc đánh dấu mờ (watermarking) trở nên bền vững hơn.
lớp transformers.WatermarkDetector
< source >( model_config: PreTrainedConfigdevice: strwatermarking_config: typing.Union[ForwardRef('WatermarkingConfig'), dict]ignore_repeated_ngrams: bool = Falsemax_cache_size: int = 128 )
Tham số
- model_config (
PreTrainedConfig) — Cấu hình mô hình sẽ được sử dụng để lấy các đối số cụ thể của mô hình dùng khi tạo ra nội dung. - device (
str) — Thiết bị được sử dụng trong quá trình tạo văn bản có watermark. - watermarking_config (Union[
WatermarkingConfig,Dict]) — Cấu hình và các đối số watermarking hoàn toàn giống với những gì được sử dụng khi tạo văn bản. - ignore_repeated_ngrams (
bool, tùy chọn, mặc định làFalse) — Có nên chỉ đếm mỗi ngram duy nhất một lần hay không. - max_cache_size (
int, tùy chọn, mặc định là 128) — Kích thước tối đa được sử dụng cho bộ nhớ đệm LRU của các thuật toán seeding/sampling được gọi cho mỗi token.
Detector để phát hiện văn bản được tạo ra có watermark. Detector cần được cung cấp chính xác các cài đặt đã được sử dụng trong quá trình tạo văn bản để tái tạo quá trình tạo greenlist của watermark và từ đó phát hiện watermark. Điều này bao gồm thiết bị chính xác đã được sử dụng trong quá trình tạo văn bản, các đối số watermarking chính xác và kích thước từ điển của tokenizer chính xác. Mã được dựa trên repo gốc.
Xem bài báo để biết thêm thông tin.
Ví dụ:
>>> 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
Tham số
- input_ids (
torch.LongTensor) — Văn bản được tạo ra có watermark. Nên loại bỏ prompt vì nó có thể ảnh hưởng đến việc phát hiện. - z_threshold (
Dict, tùy chọn, mặc định là3.0) — Việc thay đổi ngưỡng này sẽ thay đổi độ nhạy của bộ phát hiện. Ngưỡng z cao hơn cho độ nhạy thấp hơn và ngược lại với ngưỡng z thấp hơn. - return_dict (
bool, tùy chọn, mặc định làFalse) — Có nên trả về~generation.WatermarkDetectorOutputhay không. Nếu không, sẽ trả về các dự đoán dạng boolean,
Trả về
WatermarkDetectorOutput hoặc np.ndarray
Một WatermarkDetectorOutput
nếu return_dict=True, ngược lại là một np.ndarray.
ma
lớp transformers.BayesianDetectorConfig
< source >( watermarking_depth: int | None = Nonebase_rate: float = 0.5**kwargs )
Đây là lớp cấu hình để lưu trữ cấu hình của một BayesianDetectorModel. Nó được sử dụng để khởi tạo một mô hình Bayesian Detector theo các đối số được chỉ định.
Các đối tượng cấu hình kế thừa từ PreTrainedConfig và có thể được sử dụng để kiểm soát đầu ra của mô hình. Đọc tài liệu từ PreTrainedConfig để biết thêm thông tin.
lớp transformers.BayesianDetectorModel
< source >( config )
Tham số
- config (BayesianDetectorConfig) — Lớp cấu hình mô hình chứa tất cả các tham số của mô hình. Khởi tạo bằng tệp cấu hình sẽ không tải trọng số liên quan đến mô hình, chỉ tải cấu hình. Xem phương thức from_pretrained() để tải trọng số của mô hình.
Bộ phân loại Bayesian để phát hiện watermark.
Detector này sử dụng quy tắc Bayes để tính điểm watermarking, đó là sigmoid của log của tỷ số giữa xác suất hậu nghiệm P(watermarked|g_values) và P(unwatermarked|g_values). Vui lòng xem phần về BayesianScore trong bài báo để biết thêm chi tiết. URL bài báo: https://www.nature.com/articles/s41586-024-08025-4
Lưu ý rằng trình phát hiện này chỉ hoạt động với kỹ thuật đánh dấu bằng chữ ký (watermarking) dựa trên giải đấu (Tournament) không gây méo, sử dụng phân phối g-value Bernoulli(0.5).
Mô hình này kế thừa từ PreTrainedModel. Xem tài liệu của lớp cha để biết các phương thức chung mà thư viện triển khai cho tất cả các mô hình của nó (chẳng hạn như tải xuống hoặc lưu trữ, thay đổi kích thước các nhúng đầu vào, cắt tỉa các đầu, v.v.)
Mô hình này cũng là một lớp con của torch.nn.Module trong PyTorch. Hãy sử dụng nó như một Module PyTorch thông thường và tham khảo tài liệu PyTorch cho mọi vấn đề liên quan đến cách sử dụng và hành vi chung.
forward
< source >( g_values: Tensormask: Tensorlabels: typing.Optional[torch.Tensor] = Noneloss_batch_weight = 1return_dict = False )
Tính toán posterior có watermark P(watermarked|g_values).
lớp transformers.SynthIDTextWatermarkingConfig
< source >( ngram_len: intkeys: listcontext_history_size: int = 1024sampling_table_seed: int = 0sampling_table_size: int = 65536skip_first_ngram_calls: bool = Falsedebug_mode: bool = False )
Tham số
- ngram_len (
int) — Độ dài ngram. - keys (
list[int]) — Một chuỗi các khóa watermarking, mỗi khóa tương ứng với một độ sâu. - context_history_size (
int, tùy chọn, mặc định là 1024) — Kích thước của tensor dùng để theo dõi các ngữ cảnh đã gặp. - sampling_table_seed (
int, tùy chọn, mặc định là 0) — Hạt ngẫu nhiên để tạo bảng lấy mẫu. - sampling_table_size (
int, tùy chọn, mặc định là 65536) — Kích thước của bảng lấy mẫu. - skip_first_ngram_calls (
bool, tùy chọn, mặc định làFalse) — Có bỏ qua các lần gọi ngram đầu tiên hay không. - debug_mode (
bool, tùy chọn, mặc định làFalse) — Logits được sửa đổi thành phân phối đều trước khi áp dụng sửa đổi watermarking. Điều này dùng để kiểm tra việc triển khai.
Lớp chứa các đối số cho việc tạo watermark và cần được truyền vào GenerationConfig trong quá trình generate.
Xem bài báo này để biết thêm chi tiết về các đối số.
Ví dụ:
>>> 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)lớp transformers.SynthIDTextWatermarkDetector
< source >( detector_module: BayesianDetectorModellogits_processor: SynthIDTextWatermarkLogitsProcessortokenizer: Any )
Tham số
- detector_module (BayesianDetectorModel) — Đối tượng module detector Bayesian được khởi tạo với các tham số. Xem https://github.com/huggingface/transformers-research-projects/tree/main/synthid_text để biết cách sử dụng.
- logits_processor (
SynthIDTextWatermarkLogitsProcessor) — Bộ xử lý logits được sử dụng để thêm watermark. - tokenizer (
Any) — Tokenizer được sử dụng cho mô hình.
Lớp phát hiện watermark văn bản SynthID.
Lớp này phải được khởi tạo với module detector bayesian đã được huấn luyện, xem script kiểm tra trong examples/synthid_text/detector_training.py làm ví dụ về việc huấn luyện/lưu/tải module detector này. Thư mục cũng minh họa một trường hợp sử dụng ví dụ của detector này.
Ví dụ:
>>> 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)Công cụ biên dịch
lớp transformers.CompileConfig
< source >( fullgraph: bool = Falsedynamic: bool | None = Nonebackend: str | collections.abc.Callable = 'inductor'mode: str = 'reduce-overhead'options: dict | None = None )
Tham số
- fullgraph (
bool, tùy chọn, mặc định làFalse) — Nếu False (mặc định), sẽ cố gắng phát hiện các vùng có thể biên dịch để tối ưu hóa. Nếu True, thì yêu cầu rằng toàn bộ hàm phải có thể được bắt vào một đồ thị duy nhất. Nếu điều này không thể thực hiện được (tức là nếu có các điểm ngắt đồ thị), thì một lỗi sẽ được ném ra. - dynamic (
boolhoặcNone, tùy chọn) — Có nên cố gắng sử dụng đồ thị hình dạng động hay không. - backend (
strhoặcCallable, tùy chọn, mặc định là"inductor") — Backend sẽ được sử dụng. - mode (
str, tùy chọn, mặc định là"reduce-overhead") — Kiểm soát sự cân bằng giữa hiệu suất và chi phí overhead. - options (
dict, tùy chọn) — Một từ điển các tùy chọn để truyền cho backend.
Lớp chứa các đối số liên quan đến hành vi của torch.compile khi sử dụng biên dịch tự động trong generate.
Xem torch.compile để biết thêm chi tiết về các đối số.
Ví dụ:
>>> 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]