Diffusers documentation
LLaDA2
LLaDA2
LLaDA2 adalah keluarga model bahasa difusi diskrit yang menghasilkan teks melalui penyempurnaan iteratif per blok. Alih-alih generasi token per token secara autoregresif, LLaDA2 dimulai dari urutan yang sepenuhnya ter-mask dan secara bertahap membuka mask token berdasarkan tingkat kepercayaan melalui beberapa langkah penyempurnaan.
Penggunaan
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from diffusers import BlockRefinementScheduler, LLaDA2Pipeline
model_id = "inclusionAI/LLaDA2.1-mini"
model = AutoModelForCausalLM.from_pretrained(
model_id, trust_remote_code=True, dtype=torch.bfloat16, device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
scheduler = BlockRefinementScheduler()
pipe = LLaDA2Pipeline(model=model, scheduler=scheduler, tokenizer=tokenizer)
output = pipe(
prompt="Write a short poem about the ocean.",
gen_length=256,
block_length=32,
num_inference_steps=32,
threshold=0.7,
editing_threshold=0.5,
max_post_steps=16,
temperature=0.0,
)
print(output.texts[0])Callback
Callback dijalankan setelah setiap langkah penyempurnaan. Luluskan callback_on_step_end_tensor_inputs untuk memilih tensor mana yang
disertakan dalam callback_kwargs. Dalam implementasi saat ini, block_x (jendela sekuens yang sedang disempurnakan) dan transfer_index (mask komitmen pengisian mask) disediakan; kembalikan {"block_x": ...} dari callback untuk mengganti
jendela tersebut.
def on_step_end(pipe, step, timestep, callback_kwargs):
block_x = callback_kwargs["block_x"]
# Inspect or modify `block_x` here.
return {"block_x": block_x}
out = pipe(
prompt="Write a short poem.",
callback_on_step_end=on_step_end,
callback_on_step_end_tensor_inputs=["block_x"],
)Parameter yang direkomendasikan
Model LLaDA2.1 mendukung dua mode:
| Mode | threshold | editing_threshold | max_post_steps |
|---|---|---|---|
| Kualitas | 0.7 | 0.5 | 16 |
| Kecepatan | 0.5 | None | 16 |
Lewati editing_threshold=None, 0.0, atau nilai negatif untuk mematikan pengeditan pasca-masker.
Untuk model LLaDA2.0, nonaktifkan pengeditan dengan meneruskan editing_threshold=None atau 0.0.
Untuk semua model: block_length=32, temperature=0.0, num_inference_steps=32.
LLaDA2Pipeline
kelas diffusers.LLaDA2Pipeline
< source >( model: Anyscheduler: BlockRefinementSchedulertokenizer: Any | None = None )
Pipeline untuk generasi teks difusi diskret bergaya LLaDA2 melalui penyempurnaan iteratif per blok.
Pipeline ini mempertahankan sekuens template yang diisi dengan mask_token_id dan menyempurnakannya dalam blok-blok. Pada setiap langkah penyempurnaan, pipeline ini mengambil sampel token kandidat untuk blok yang aktif dan mengunci sebagian kecil berdasarkan tingkat kepercayaan.
Model diharapkan menerima attention mask dan position_ids, serta mengembalikan logits dengan bentuk [batch, seq, vocab_size].
__call__
< source >( prompt: str | list[str] | None = Nonemessages: list[dict[str, str]] | None = Noneinput_ids: torch.LongTensor | None = Noneattention_mask: torch.LongTensor | None = Noneuse_chat_template: bool = Trueadd_generation_prompt: bool = Truegen_length: int = 2048block_length: int | None = Nonenum_inference_steps: int = 32temperature: float = 0.0top_p: float | None = Nonetop_k: int | None = Nonesampling_method: str = 'multinomial'threshold: float = 0.7editing_threshold: float | None = 0.5max_post_steps: int = 16minimal_topk: int = 1eos_early_stop: bool = Trueeos_token_id: int | None = Nonemask_token_id: int | None = Nonegenerator: torch.Generator | None = Noneoutput_type: str = 'text'return_dict: bool = Truecallback_on_step_end: Callable[[int, int, dict], None] | PipelineCallback | MultiPipelineCallbacks | None = Nonecallback_on_step_end_tensor_inputs: list[str] | None = None ) → LLaDA2PipelineOutput or tuple
Parameter
- prompt (
stratauList[str], opsional) — Teks prompt. Ketikause_chat_templateadalahTrue(default) dan tokenizer dengan template chat tersedia, prompt dibungkus dalam pesan chat sebelum ditokenisasi. - messages (
List[Dict[str, str]], opsional) — Pesan chat untuk dienkod (mis.[{"role": "user", "content": "Hello"}]). Memiliki prioritas lebih tinggi daripadapromptketika diberikan. Memerlukan tokenizer denganapply_chat_template. - input_ids (
torch.LongTensor, opsional) — ID input yang sudah di-tokenisasi. Memiliki prioritas lebih tinggi daripadapromptdanmessages. - attention_mask (
torch.LongTensor, opsional) — Mask per token (1 untuk token prompt yang valid, 0 untuk padding) yang sesuai dengan bentukinput_ids. Hanya digunakan ketikainput_idsdiberikan. Jika diabaikan (daninput_idsdiberikan), semua posisi dianggap valid. Saat menyusun input dariprompt/messages, mask dari tokenizer diteruskan secara otomatis. - use_chat_template (
bool, defaultnyaTrue) — Apakah prompt akan dibungkus dalam template chat. - add_generation_prompt (
bool, defaultnyaTrue) — Apakah akan menambahkan prompt generasi saat menggunakan template chat. - gen_length (
int) — Jumlah token yang akan dihasilkan. - block_length (
int, opsional) — Ukuran blok untuk penyempurnaan. Jika tidak diberikan,block_lengthyang dikonfigurasi pada scheduler akan digunakan. - num_inference_steps (
int) — Jumlah langkah penyempurnaan per blok. - temperature (
float) — Suhu sampling. - top_p (
float, opsional) — Batas pemotongan nucleus sampling. - top_k (
int, opsional) — Batas pemotongan sampling top-k. - sampling_method (
str) — Metode sampling (auto,greedy,multinomial). - threshold (
float) — Ambang batas kepercayaan untuk mengunci token. - editing_threshold (
float, opsional) — Ambang batas kepercayaan untuk mengedit token yang sudah dikomit (non-mask). Jika bernilai positif, setelah semua token mask dalam blok terselesaikan, pipeline akan terus menyempurnakan: jika model memprediksi token yang berbeda dengan kepercayaan di atas ambang batas ini, token yang ada akan diganti. Atur keNone,0.0, atau nilai negatif untuk menonaktifkan pengeditan. Nilai default adalah0.5. - max_post_steps (
int) — Jumlah maksimum iterasi penyempurnaan tambahan setelah semua token mask dalam blok terselesaikan. Hanya digunakan ketikaediting_thresholddiaktifkan. Nilainya secara bawaan adalah16. - minimal_topk (
int) — Jumlah minimum token yang harus dikomit per langkah. - eos_early_stop (
bool) — Apakah akan berhenti setelah mengonfirmasi EOS dalam sebuah blok. - eos_token_id (
int, opsional) — ID token EOS yang digunakan untuk penghentian dini. - mask_token_id (
int, opsional) — ID token mask yang akan digunakan untuk template. - generator (
torch.Generator, opsional) — RNG untuk sampling. - output_type (
str, defaultnya"text") — Format output."text"mendekode urutan menjadi string (memerlukan tokenizer)."seq"hanya mengembalikan urutan ID token mentah. - return_dict (
bool, opsional, defaultTrue) — Apakah akan mengembalikan LLaDA2PipelineOutput alih-alih tuple. - callback_on_step_end (
CallableatauPipelineCallback, opsional) — Callback yang dijalankan setelah setiap langkah penyempurnaan dengan tanda tangancallback_on_step_end(self, step: int, timestep: int, callback_kwargs: Dict). - callback_on_step_end_tensor_inputs (
List[str], opsional) — Kunci tensor yang akan diteruskan ke callback. Kunci yang diizinkan:block_x,transfer_index,editing_transfer_index,sampled_tokens,sampled_probs,active_block.
Mengembalikan
LLaDA2PipelineOutput atau tuple
Jika return_dict adalah True, LLaDA2PipelineOutput dikembalikan,
sebaliknya sebuah tuple dikembalikan di mana elemen pertama adalah ID token yang dihasilkan (torch.LongTensor)
dan elemen kedua adalah teks yang didekodekan (list[str]), atau None ketika output_type adalah "seq".
Generate teks dengan penyempurnaan per blok.
Contoh:
>>> import torch
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> from diffusers import BlockRefinementScheduler, LLaDA2Pipeline
>>> model_id = "inclusionAI/LLaDA2.1-mini"
>>> model = AutoModelForCausalLM.from_pretrained(
... model_id, trust_remote_code=True, dtype=torch.bfloat16, device_map="auto"
... )
>>> tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
>>> scheduler = BlockRefinementScheduler()
>>> pipe = LLaDA2Pipeline(model=model, scheduler=scheduler, tokenizer=tokenizer)
>>> output = pipe(prompt="What is the meaning of life?", gen_length=256)
>>> print(output.texts[0])LLaDA2PipelineOutput
kelas diffusers.LLaDA2PipelineOutput
< source >( sequences: torch.LongTensortexts: list[str] | None = None )