Diffusers documentation
LLaDA2
LLaDA2
LLaDA2 est une famille de modèles de langage de diffusion discrète qui génèrent du texte par raffinement itératif par blocs. Plutôt que d’utiliser une génération auto-régressive jeton par jeton, LLaDA2 démarre avec une séquence entièrement masquée et démasque progressivement les jetons en fonction de leur confiance au fil de plusieurs étapes de raffinement.
Utilisation
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])Callbacks
Les callbacks s'exécutent après chaque étape de raffinement. Passez callback_on_step_end_tensor_inputs pour sélectionner les tenseurs inclus dans callback_kwargs. Dans l'implémentation actuelle, block_x (la fenêtre de séquence en cours de raffinement) et transfer_index (masque de commit de remplissage de masque) sont fournis ; renvoyez {"block_x": ...} depuis le callback pour remplacer la fenêtre.
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"],
)Paramètres recommandés
Les modèles LLaDA2.1 prennent en charge deux modes :
| Mode | threshold | editing_threshold | max_post_steps |
|---|---|---|---|
| Qualité | 0.7 | 0.5 | 16 |
| Vitesse | 0.5 | None | 16 |
Passez editing_threshold=None, 0.0 ou une valeur négative pour désactiver l'édition post-masque.
Pour les modèles LLaDA2.0, désactivez l'édition en passant editing_threshold=None ou 0.0.
Pour tous les modèles : block_length=32, temperature=0.0, num_inference_steps=32.
LLaDA2Pipeline
classe diffusers.LLaDA2Pipeline
< source >( model: Anyscheduler: BlockRefinementSchedulertokenizer: Any | None = None )
Pipeline pour la génération de texte par diffusion discrète de type LLaDA2 via raffinement itératif par blocs.
Ce pipeline maintient une séquence de modèle remplie de mask_token_id et l'affine par blocs. À chaque étape d'affinage, il échantillonne des jetons candidats pour le bloc actif et en valide un sous-ensemble en fonction de la confiance.
Le modèle est censé accepter un masque d'attention et position_ids, et renvoyer des logits de forme [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
Paramètres
- prompt (
strouList[str], facultatif) — Texte de la requête. Lorsqueuse_chat_templateestTrue(par défaut) et qu'un tokenizer avec un modèle de chat est disponible, la requête est encapsulée dans un message de chat avant la tokenisation. - messages (
List[Dict[str, str]], facultatif) — Messages de chat à encoder (par ex.[{"role": "user", "content": "Hello"}]). Prend le pas surpromptlorsqu'il est fourni. Nécessite un tokenizer doté deapply_chat_template. - input_ids (
torch.LongTensor, facultatif) — Identifiants d’entrée pré-tokenisés. Prend le pas surpromptetmessages. - attention_mask (
torch.LongTensor, facultatif) — Masque par jeton (1 pour les jetons de prompt valides, 0 pour le bourrage) correspondant à la forme deinput_ids. Utilisé uniquement lorsqueinput_idsest fourni. S’il est omis (et queinput_idsest donné), toutes les positions sont considérées comme valides. Lors de la construction des entrées à partir deprompt/messages, le masque du tokeniseur est transmis automatiquement. - use_chat_template (
bool, par défautTrue) — Indique s'il faut envelopper le prompt dans un modèle de chat. - add_generation_prompt (
bool, par défautTrue) — Indique s'il faut ajouter le prompt de génération lors de l'utilisation de modèles de discussion. - gen_length (
int) — Nombre de jetons à générer. - block_length (
int, facultatif) — Taille de bloc pour l’affinage. Si non fourni, la valeur deblock_lengthconfigurée sur le planificateur est utilisée. - num_inference_steps (
int) — Nombre d'étapes de raffinement par bloc. - temperature (
float) — Température d'échantillonnage. - top_p (
float, facultatif) — Seuil d'échantillonnage par noyau. - top_k (
int, facultatif) — Seuil d'échantillonnage top-k. - sampling_method (
str) — Méthode d'échantillonnage (auto,greedy,multinomial). - threshold (
float) — Seuil de confiance pour valider les jetons. - editing_threshold (
float, facultatif) — Seuil de confiance pour l'édition des jetons déjà validés (hors masque). S'il est positif, une fois que tous les jetons masque d'un bloc sont résolus, le pipeline continue de raffiner : si le modèle prédit un jeton différent avec une confiance supérieure à ce seuil, le jeton existant est remplacé. Définissez-le surNone,0.0ou une valeur négative pour désactiver l'édition. La valeur par défaut est0.5. - max_post_steps (
int) — Nombre maximal d'itérations de raffinement supplémentaires après la résolution de tous les jetons de masque d'un bloc. Utilisé uniquement lorsqueediting_thresholdest activé. Valeur par défaut :16. - minimal_topk (
int) — Nombre minimal de jetons à valider à chaque étape. - eos_early_stop (
bool) — Indique s'il faut arrêter après l'engagement de l'EOS dans un bloc. - eos_token_id (
int, facultatif) — ID du jeton EOS à utiliser pour l’arrêt anticipé. - mask_token_id (
int, facultatif) — ID du jeton de masque à utiliser pour le modèle. - generator (
torch.Generator, facultatif) — Générateur aléatoire pour l'échantillonnage. - output_type (
str, par défaut"text") — Format de sortie."text"décode les séquences en chaînes de caractères (nécessite un tokenizer)."seq"renvoie uniquement les séquences brutes d'identifiants de jetons. - return_dict (
bool, facultatif, par défautTrue) — Indique s'il faut retourner un LLaDA2PipelineOutput plutôt qu'un tuple. - callback_on_step_end (
CallableouPipelineCallback, facultatif) — Callback exécuté après chaque étape de raffinement avec la signaturecallback_on_step_end(self, step: int, timestep: int, callback_kwargs: Dict). - callback_on_step_end_tensor_inputs (
List[str], facultatif) — Clés de tenseurs à transmettre au rappel. Clés autorisées :block_x,transfer_index,editing_transfer_index,sampled_tokens,sampled_probs,active_block.
Retourne
LLaDA2PipelineOutput ou tuple
Si return_dict est True, LLaDA2PipelineOutput est retourné,
sinon un tuple est retourné dont le premier élément est les identifiants de jetons générés (torch.LongTensor)
et le deuxième élément est les textes décodés (list[str]), ou None lorsque output_type est "seq".
Générer du texte avec une raffinement par blocs.
Exemples :
>>> 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
classe diffusers.LLaDA2PipelineOutput
< source >( sequences: torch.LongTensortexts: list[str] | None = None )