Agent
laya.Agent charge un checkpoint et répond à des questions typées sur un état. laya.load est
un raccourci pour Agent(...), et laya.RLAgent est un alias de Agent. ONNXAgent exécute un
modèle ONNX exporté sur CPU ; importe-le depuis laya.onnx_agent.
Les noms, types, valeurs par défaut et le code restent en anglais ; le reste est traduit (les entrées non encore traduites s'affichent dans l'original anglais).
Agent
Agent(
model_id_or_path: str = "convaiinnovations/laya",
device: Optional[str] = None,
token: Optional[str] = None,
subfolder: Optional[str] = None,
fast: bool = False,
compile: bool = False,
revision: Optional[str] = None,
expected_sha256: Optional[Dict[str, str]] = None,
lang_temperatures: Optional[Dict[str, Dict[str, Any]]] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: bool = True,
hooks_concurrent: bool = True,
hooks_timeout: Optional[float] = None,
calibration: Optional[str] = None,
backend: Optional[str] = None,
compile_warmup: bool = True,
compile_cache: bool = False,
compile_mode: str = "default",
)Classes de base: HookRegistry
Runtime du modèle de décision System One : décisions rapides, non autorégressives et calibrées.
dtype est la cible de l’autocast, pas la précision de chaque appel. Sur MPS un appel
ne fait de l’autocast qu’à partir de mps_amp_min_rows lignes, donc dtype peut indiquer float16 alors
qu’un appel tourne en float32. dtype_for(rows) renvoie la précision d’un appel avec rows lignes.
Charge un checkpoint de Laya.
backend sélectionne « eager », « auto », « compile » ou « tilelang » ; voir laya.backends.
Il a la priorité sur fast et compile. Omets-le pour conserver ces flags hérités.
Pour ONNX, utilise plutôt load(backend="onnx").
revision épingle éventuellement le téléchargement depuis le Hub à un commit SHA/branche/tag explicite ;
si on l’omet, le défaut normal de huggingface_hub et le cache hors ligne existant sont utilisés.
expected_sha256 ({path relative to the checkpoint dir: hexdigest})
vérifie l’intégrité des artefacts avant qu’aucun poids ne soit analysé ou exécuté ; il est optionnel
et s’applique aussi aux répertoires locaux. Un artefact manquant lève FileNotFoundError
et une divergence d’empreinte lève ValueError ; l’une ou l’autre de ces erreurs refuse le chargement.
fast=True remplace la passe avant de l’encodeur/de la tête par le chemin rapide TileLang (CUDA uniquement, nécessite
pip install laya[fast]) ; voir Agent.accelerate.
compile=True exécute le modèle sous torch.compile et active reference_compile de l’encodeur
de ModernBERT. torch.compile se spécialise par forme d’entrée et Laya en voit une
nouvelle à presque chaque requête, donc ces graphes coûtent souvent plus qu’ils ne rapportent ;
utilise-le quand le trafic est répétitif. fast=True a la priorité, car le
chemin TileLang remplace la passe avant qui serait compilée.
Les agents compilés exécutent warmup() avant de revenir ; compile_warmup=False reporte ce
travail aux requêtes ou à un appel manuel à warmup(). Les agents eager et fast restent inchangés.
compile_cache=True active un répertoire Laya Inductor persistant (à l’échelle du processus),
en respectant un TORCHINDUCTOR_CACHE_DIR existant ; voir les notes d’ingénierie de compilation.
compile_mode="reduce-overhead" active les graphes CUDA. Il peut retenir plus de mémoire GPU
et enregistre chaque nouvelle forme séparément. Les sorties CUDA sont copiées avant la relecture suivante ;
les passes avant de graphes CUDA compilés sont sérialisées. Le mode par défaut reste « default ».
subfolder sélectionne un checkpoint dans un dépôt qui en regroupe plusieurs, p. ex.
Agent("convaiinnovations/laya", subfolder="multilingual"). Seul ce sous-dossier est
téléchargé, donc le regroupement ne coûte pas toute la famille à chaque utilisateur.
calibration est un chemin JSON optionnel avec temperature et temperature_by_options.
Il est appliqué après la configuration du checkpoint, donc une table ajustée écrase les scalaires livrés
sans réécrire model.safetensors.
hooks / on_predict_start / on_predict_end observent ou façonnent chaque prédiction ; voir
laya.hooks. hooks_raise=False avertit et continue quand un hook échoue,
hooks_concurrent=False sérialise les hooks qui ne sont pas sûrs à exécuter en parallèle, et
hooks_timeout borne chaque appel de hook en secondes (None signifie aucune limite).
Paramètres
model_id_or_pathstr="convaiinnovations/laya"deviceOptional[str]=NonetokenOptional[str]=NonesubfolderOptional[str]=Nonefastbool=Falsecompilebool=FalserevisionOptional[str]=Noneexpected_sha256Optional[Dict[str, str]]=Nonelang_temperaturesOptional[Dict[str, Dict[str, Any]]]=Nonehooks=Noneon_predict_start=Noneon_predict_end=Nonehooks_raisebool=Truehooks_concurrentbool=Truehooks_timeoutOptional[float]=NonecalibrationOptional[str]=NonebackendOptional[str]=Nonecompile_warmupbool=Truecompile_cachebool=Falsecompile_modestr="default"
backend
backend: strLe backend d’inférence actif, y compris les flags hérités compile et fast.
backend_object
backend_objectL’objet Backend installé, ou None pour un runtime hérité.
set_backend
set_backend(name: str = "auto", strict: bool = False, options) -> strChange de backend ; les backends indisponibles avertissent et utilisent eager sauf si strict=True.
Les options vont au constructeur du backend, p. ex. warmup=False pour compile ou
use_graphs=False pour tilelang. Le changement attend l’inférence en cours.
Paramètres
namestr="auto"strictbool=Falseoptions
accelerate
accelerate(use_graphs: bool = True, strict: bool = False)Remplace la passe avant du modèle par le chemin rapide TileLang (kernels fusionnés GEMM/GEGLU/LayerNorm/RoPE, flash attention à fenêtre glissante, poids résidents en 16 bits, graphes CUDA par bucket de forme).
Le chemin rapide s’exécute dans le dtype d’autocast de l’agent au moment de l’appel (bf16 ou fp16), donc il
correspond à la passe avant standard qu’il remplace à l’arrondi près (voir benchmarks/parity_fast.py). Après
avoir changé agent.dtype, appelle deaccelerate() puis accelerate() pour le reconstruire. Renvoie True si
il est activé. Avec strict=False, toute défaillance (pas de CUDA, tilelang absent) laisse le chemin standard en place.
Paramètres
use_graphsbool=Truestrictbool=False
warmup
warmup(shapes=None) -> floatExécute dès maintenant la passe avant sur une entrée synthétique de chaque forme et renvoie les secondes que cela a pris.
compile=True appelle ceci au chargement, sauf si compile_warmup=False. Des formes supplémentaires peuvent toujours
être préchauffées manuellement. fast=True construit ses kernels et ses graphes CUDA par bucket de forme au
premier usage ; appeler ceci avant de servir sort ce coût des premières
requêtes. Avec la passe avant standard, ce sont quelques passes avant ordinaires. shapes est une liste
de (rows, tokens, markers) ; les jetons sont plafonnés au max_len de l’agent. Rien n’est
renvoyé à un appelant ni enregistré pour lui, et les hooks ne s’exécutent pas.
Paramètres
shapes=None
deaccelerate
deaccelerate()Restaure la passe avant standard.
dtype_for
dtype_for(rows: int) -> torch.dtypePrécision dans laquelle tourne une passe avant avec rows lignes de question.
dtype est la cible de l’autocast, fixée une fois au chargement. Le fait qu’une passe avant fasse de l’autocast se
décide par appel : sur MPS uniquement à partir de mps_amp_min_rows lignes. Ceci renvoie dtype
quand une passe avant avec rows lignes fait de l’autocast, et torch.float32 sinon. Un
appel predict traite une ligne par question.
Paramètres
rowsint
predict_batch
predict_batch(
states: List[Union[str, dict, list]],
questions: Dict[str, Dict[str, Any]],
batch_size: Optional[int] = None,
lang: Optional[str] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: Optional[bool] = None,
hooks_timeout: Optional[float] = None,
max_len: Optional[int] = None,
head_max_len: Optional[int] = None,
sort_by_length: bool = False,
min_confidence: Optional[float] = None,
) -> List[Dict[str, Any]]Évalue les mêmes questions sur de nombreux états, en les regroupant dans des passes avant partagées.
C’est le chemin de débit. system_one/predict traitent un état par passe avant ; sur un
GPU cela laisse la majeure partie de la dimension de lot inactive. predict_batch rassemble les lignes de question de plusieurs états
dans un seul tenseur, donc un appel qui prendrait N passes avant séquentielles en prend
une (ou ceil(len(states) / batch_size)), ce qui est plusieurs fois plus rapide par décision sur GPU.
Paramètres
statesList[Union[str, dict, list]]Une liste d’états (chacun une chaîne de texte, un dict JSON ou une liste de tours de conversation). Les mêmes
questionssont évaluées contre chaque état.questionsDict[str, Dict[str, Any]]Définitions de questions, exactement comme les accepte
system_one.batch_sizeOptional[int]=NonePlafond optionnel du nombre d’états par passe avant.
Noneles envoie tous en une seule passe ; fixe-le pour borner la mémoire de pointe quand tu regroupes beaucoup d’états ou des états longs.langOptional[str]=NonehooksHookArg=NoneHooks par appel, ajoutés après ceux installés sur l’Agent. Voir
laya.hooks.on_predict_startPredictHookArg=NoneUn hook de début par appel. Il peut réécrire l’état/les questions ou appeler
ctx.skip(...)pour court-circuiter l’inférence.on_predict_endPredictHookArg=NoneUn hook de fin par appel. Il peut réécrire les résultats.
hooks_raiseOptional[bool]=NoneRemplace le
hooks_raisede l’Agent pour cet appel.hooks_timeoutOptional[float]=NoneRemplace le
hooks_timeoutde l’Agent pour cet appel.max_lenOptional[int]=NoneRemplace le
max_lende la config de l’agent pour cet appel. Un hook de début peut aussi fixerctx.max_lenpour façonner le budget de jetons.head_max_lenOptional[int]=NoneRemplace le
head_max_lende la config de l’agent pour cet appel. Un hook de début peut aussi fixerctx.head_max_len.sort_by_lengthbool=FalseRegroupe les états encodés de taille similaire dans des fenêtres de huit lots pour réduire le padding. Nécessite un
batch_sizeexplicite supérieur à un et inférieur au nombre d’états ; sinon cela n’a aucun effet. Les résultats conservent l’ordre d’entrée. Cela met en tampon jusqu’à huit lots d’états tokenisés au lieu d’un. Changer les formes de lots peut légèrement modifier les prédictions en virgule flottante.min_confidenceOptional[float]=None
Renvoie
Une liste de dicts de résultat par état, chacun de forme identique à la sortie de system_one et
aligné avec states par indice.
predict_long
predict_long(
state: Union[str, dict, list],
questions: Dict[str, Dict[str, Any]],
window: Optional[int] = None,
stride: Optional[int] = None,
aggregate: str = "auto",
batch_size: Optional[int] = None,
lang: Optional[str] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: Optional[bool] = None,
hooks_timeout: Optional[float] = None,
) -> Dict[str, Any]Évalue des questions sur un état plus long que la fenêtre de contexte, en le parcourant en fenêtres chevauchantes et en agrégeant par question.
system_one/predict tronquent un état qui dépasse max_len à une seule fenêtre (la
première, ou pour une liste de conversation la dernière), en abandonnant le reste en silence. predict_long
tokenise l’état une fois, le découpe en fenêtres de jetons chevauchantes, score chaque fenêtre dans
des passes avant partagées (via predict_batch), et combine les réponses par fenêtre :
- noul -> P(true) est le max sur les fenêtres (l’énoncé tient si une fenêtre le soutient)
- choice-> la réponse de la fenêtre la plus confiante, pour qu’un signal localisé ne soit pas mis en minorité par les nombreuses fenêtres neutres dont un long document est majoritairement fait (la moyenne le noie -- la majorité neutre domine)
- score -> le niveau de la fenêtre la plus confiante, de même
La probabilité/confiance renvoyée est celle de la fenêtre décisive, pas un nombre calibré pour
tout le document : un max noul sur beaucoup de fenêtres dérive vers le haut avec le nombre de fenêtres même
sans signal, et choice peut tomber sur une fenêtre résolument neutre quand rien dans le
document n’est décisif. Chaque réponse porte donc answer["window"] — l’index de la fenêtre
décisive, token_start/token_end dans l’état tokenisé, et le count de fenêtres
— pour qu’un appelant puisse inspecter l’intervalle d’où vient la réponse plutôt que de faire confiance au nombre brut.
Cette plage est celle que le modèle a lue, pas seulement celle demandée : la fenêtre est plafonnée à
la place que laissent les questions, donc ce qui est transmis à predict_batch n’est pas tronqué une seconde fois.
Un état qui tient déjà dans une seule fenêtre est passé directement à system_one (sortie identique).
Les hooks enveloppent l’inférence qui répond à l’état, laquelle, pour un document nécessitant plusieurs
fenêtres, est l’unique predict_batch partagé sur elles : on_predict_start se déclenche une fois, et
ctx.states contient les textes de fenêtre décodés dans l’ordre de parcours -- pas le state de l’appelant, qui
a été tokenisé pour les produire. Trois issues découlent de ce que la chaîne laisse derrière elle :
ctx.skip([result])répond au document : la charge revient sans attribution de fenêtre et avecusage["windows"]à 0, parce que rien n’a été scoré- un parcours laissé tel que cette méthode l’a construit : chaque fenêtre est scorée, chaque réponse porte
answer["window"], etusage["windows"]est le nombre de fenêtres - un parcours réécrit (
ctx.statesremplacé, de quelque façon que ce soit) : les réponses sont agrégées sur les états qui ont été scorés, mais aucune réponse ne porteanswer["window"]-- les décalages ci-dessus décrivent les fenêtres de cette méthode, pas le texte que le modèle a lu
Paramètres
stateUnion[str, dict, list]questionsDict[str, Dict[str, Any]]windowOptional[int]=Nonejetons d’état par fenêtre. Par défaut le budget d’état du checkpoint (
max_len - head_max_len - 8), et dans tous les cas plafonné à la place que les questions laissent pour l’état dansmax_len-- la plus petite de ces places, car une même liste de fenêtres est scorée pour chaque question. Une fenêtre plus large est re-tronquée sur le chemin vers le modèle, donc elle est plutôt ramenée à la limite, avec unRuntimeWarningquand c’est l’appelant qui l’a demandée. Les options sont ce qui réduit la place : sur le checkpoint anglais une question à 2 options laisse 483 jetons pour l’état et une à 100 options en laisse 100. Une fenêtre plus petite isole mieux un signal localisé (un court intervalle décisif représente une plus grande fraction de sa fenêtre, donc cette fenêtre le classe clairement), au prix de plus de fenêtres ; la grande valeur par défaut favorise le contexte et le débit.noulest robuste à cela,choice/scorebénéficient d’une fenêtre plus petite quand l’intervalle décisif est une petite partie d’un document long et par ailleurs neutre.strideOptional[int]=Nonepas de jetons entre les fenêtres. Par défaut la moitié de la fenêtre effective (50 % de chevauchement), pour qu’un intervalle proche d’une frontière tombe encore entier dans une fenêtre. Un pas au-delà de la fenêtre effective est refusé plutôt que ramené : les jetons entre chaque paire de fenêtres ne seraient lus par aucune fenêtre, ce qui est l’échec que cette méthode existe pour empêcher.
aggregatestr="auto"« auto » (les règles par type ci-dessus) est le seul mode pour l’instant.
batch_sizeOptional[int]=Noneplafond du nombre de fenêtres par passe avant, pour borner la mémoire sur de très longs états.
langOptional[str]=Nonesélection de température par langue, comme dans
system_one.hooksHookArg=NoneHooks par appel, ajoutés après ceux installés sur l’Agent. Voir
laya.hooks.on_predict_startPredictHookArg=NoneUn hook de début par appel, comme dans
system_one.on_predict_endPredictHookArg=NoneUn hook de fin par appel, comme dans
system_one.hooks_raiseOptional[bool]=NoneRemplace le
hooks_raisede l’Agent pour cet appel.hooks_timeoutOptional[float]=NoneRemplace le
hooks_timeoutde l’Agent pour cet appel.
Exceptions
ValueError : aggregate est autre chose que « auto » ; les options des questions remplissent toute la
séquence, ne laissant aucune place pour l’état ; ou stride dépasse la fenêtre
effective, donc les jetons entre deux fenêtres ne seraient lus par rien.
Renvoie un seul dict de résultat, de même forme que system_one, avec usage["windows"] ajouté.
La clé est toujours présente et compte les fenêtres que le modèle a scorées pour produire la réponse : 1
pour un état qui tenait dans une fenêtre, N pour un document parcouru en N fenêtres chevauchantes (ou
le N auquel un hook de début les a réécrites), et 0 quand un hook de début a répondu au document, ou
n’a laissé aucun état à scorer, avant qu’aucune fenêtre ne soit lue -- sur l’un ou l’autre chemin, pour qu’une réponse en cache
ne se lise jamais comme une fenêtre que le modèle a lue.
Sur plusieurs fenêtres, les clés de troncature sont combinées comme tout autre champ de usage :
truncated, state_tokens et state_tokens_dropped sont sommés (donc truncated est le
nombre de fenêtres qui ont été coupées, et les comptes de jetons incluent le chevauchement), et
truncated_questions est la liste de la dernière fenêtre. Les deux peuvent diverger : quand seule une
fenêtre antérieure a été coupée, truncated est supérieur à 0 et truncated_questions est vide. Une
fenêtre est coupée quand elle est plus grande que la place que laisse la tête d’une question. Teste
usage["truncated"] > 0 ici, pas is True.
system_one
system_one(
state: Union[str, dict, list],
questions: Dict[str, Dict[str, Any]],
lang: Optional[str] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: Optional[bool] = None,
hooks_timeout: Optional[float] = None,
max_len: Optional[int] = None,
head_max_len: Optional[int] = None,
min_confidence: Optional[float] = None,
) -> Dict[str, Any]Évalue des questions typées sur un état en une seule passe avant parallèle.
Paramètres
stateUnion[str, dict, list]Chaîne de texte, dict JSON ou liste de tours de conversation.
questionsDict[str, Dict[str, Any]]Dictionnaire associant question_id -> définition de question.
choice: {"type": "choice", "instructions": "...", "criteria": {"optA": "...", ...}}
score: {"type": "score", "instructions": "...", "criteria": ["lvl0", "lvl1", ...]}
noul: {"type": "noul", "instructions": "...", "criteria": {"false": "...", "true": "..."}, "labels": {"false": "B", "true": "A"}}
Les criteria et labels de Noul sont optionnels. Les labels ne contrôlent que le texte montré au modèle ; leurs clés gardent la sémantique false/true, et la valeur
noulrenvoyée est toujours P(true). Par compatibilité, les labels valent false/true par défaut.
langOptional[str]=Nonehooks=Noneon_predict_start=Noneon_predict_end=Nonehooks_raiseOptional[bool]=Nonehooks_timeoutOptional[float]=Nonemax_lenOptional[int]=Nonehead_max_lenOptional[int]=Nonemin_confidenceOptional[float]=None
Renvoie
Dictionnaire avec les réponses, les probabilités, la confiance calibrée et l’usage de jetons. Les questions vides renvoient des réponses vides et un usage de jetons nul, sans tokenisation ni passe avant du modèle.
Quand le budget de la tête laisse deux options avec le même intervalle de jetons, usage porte
une entrée options pour chaque question concernée -- total, distinct et
tokens_per_option -- parce qu’une réponse choisie parmi 42 intervalles distinguables sur
58 a un plafond qui est celui du budget et non celui du modèle. Les questions dont les options
survivent toutes sont absentes, donc une requête qui ne réduit rien reste inchangée.
usage indique aussi si l’état tenait : truncated, state_tokens,
state_tokens_dropped, et truncated_questions (les questions dont la tête a laissé
trop peu de place). Un appelant qui se soucie de savoir si la réponse a vu tout l’état devrait
lire usage["truncated"] plutôt qu’estimer d’après la longueur de ce qu’il a envoyé.
Pour scorer beaucoup d’états à la fois, voir predict_batch, qui partage les passes avant entre eux.
decide
decide(
state: Union[str, dict, list],
schema: Any = None,
questions: Optional[Dict[str, Any]] = None,
return_details: bool = False,
min_confidence: Optional[float] = None,
predict_kwargs,
) -> AnyRépond à state contre un schéma (schéma JSON ou modèle pydantic) et renvoie des valeurs typées.
Voir laya.structured. Passe exactement l’un de schema ou questions ; les arguments nommés supplémentaires
sont transmis à predict / system_one.
Paramètres
stateUnion[str, dict, list]schemaAny=NonequestionsOptional[Dict[str, Any]]=Nonereturn_detailsbool=Falsemin_confidenceOptional[float]=Nonepredict_kwargs
decide_batch
decide_batch(
states: List[Union[str, dict, list]],
schema: Any = None,
questions: Optional[Dict[str, Any]] = None,
return_details: bool = False,
min_confidence: Optional[float] = None,
predict_kwargs,
) -> List[Any]Répond à de nombreux états contre un seul schéma (schéma JSON ou modèle pydantic) en un appel par lots.
La forme haut débit de :meth:decide : le schéma est planifié une fois et ses questions
tournent sur chaque état via :meth:predict_batch (passes avant partagées, résultats
dans l’ordre d’entrée), puis les réponses de chaque état sont projetées comme le fait decide. Les arguments
nommés supplémentaires (batch_size=, lang=, hooks=, ...) sont transmis à
predict_batch. Voir laya.structured.
Paramètres
statesList[Union[str, dict, list]]schemaAny=NonequestionsOptional[Dict[str, Any]]=Nonereturn_detailsbool=Falsemin_confidenceOptional[float]=Nonepredict_kwargs
fit_temperatures
fit_temperatures(records, compute_ece: bool = False, seed: int = 0) -> Dict[str, Any]Ajuste des températures par bucket à partir d’enregistrements CPU et les stocke sur cet agent.
records sont (qtype, logits, target, k). Construis-les avec
laya.calibrate.records_from_labeled quand tu as des passes avant étiquetées ; cette méthode
ne télécharge pas de poids ni n’écrit model.safetensors. seed n’affecte que la
partition ECE réservée quand compute_ece est true. Le cfg du checkpoint est laissé tel que chargé.
Paramètres
recordscompute_ecebool=Falseseedint=0
fit_binning
fit_binning(
records,
min_bucket_n: int = MIN_BINNING_BUCKET_N,
MIN_BINNING_BUCKET_N,
) -> Dict[str, Any]Ajuste une table de binning par histogramme par-dessus les températures ajustées de cet agent et la stocke.
records sont les mêmes tuples (qtype, logits, target[, k]) que ceux consommés par
fit_temperatures. La table est indexée exactement comme temperature_by_options, se compose par-dessus
les températures actuelles, et save_calibration l’écrit sous le nom binning_map.
Paramètres
recordsmin_bucket_nint=MIN_BINNING_BUCKET_NMIN_BINNING_BUCKET_N
save_calibration
save_calibration(path: str) -> NoneÉcrit les températures et le checkpoint pour lequel elles ont été ajustées. N’écrit pas les poids.
Paramètres
pathstr
load_calibration
load_calibration(path: str) -> NoneLit sur cet agent une table JSON écrite par save_calibration.
Un fichier sans version est traité comme la version 1 et se charge quand même. Un fichier plus récent
dont le checkpoint enregistré ne correspond pas à cet agent avertit et se charge quand même.
Les valeurs qui ne sont pas des nombres, ou qui sortent de [TEMP_MIN, TEMP_MAX], sont bornées
avec clamp_temperature de la même façon qu’au chargement d’un checkpoint.
Paramètres
pathstr
load
load(
model_id_or_path: str = "convaiinnovations/laya",
device: Optional[str] = None,
token: Optional[str] = None,
subfolder: Optional[str] = None,
fast: bool = False,
compile: bool = False,
revision: Optional[str] = None,
expected_sha256: Optional[Dict[str, str]] = None,
lang_temperatures: Optional[Dict[str, Dict[str, Any]]] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: bool = True,
hooks_concurrent: bool = True,
hooks_timeout: Optional[float] = None,
calibration: Optional[str] = None,
backend: Optional[str] = None,
onnx_path: Optional[str] = None,
compile_warmup: bool = True,
compile_cache: bool = False,
compile_mode: str = "default",
) -> AgentCharge un agent Laya.
subfolder choisit un checkpoint dans un dépôt qui en regroupe plusieurs :
laya.load("convaiinnovations/laya") # English (repo root)
laya.load("convaiinnovations/laya", subfolder="multilingual")
laya.load("convaiinnovations/laya", fast=True) # TileLang GPU fast path
laya.load("convaiinnovations/laya", compile=True) # torch.compile the model
model_id_or_path accepte aussi un nom de checkpoint ou un alias -- les mêmes que
résout Router, donc les deux points d’entrée lisent une seule table :
laya.load("typed-decisions")
laya.load("ml") # multilingual
Tout le reste (un id de dépôt Hub, un répertoire local) est transmis à Agent inchangé.
backend sélectionne « auto », « eager », « compile », « tilelang » ou « onnx ». ONNX renvoie
l’ONNXAgent existant, avec onnx_path (par défaut « laya.onnx »).
Les autres backends utilisent Agent ; un backend explicite a la priorité sur les flags hérités.
revision/expected_sha256 épinglent et vérifient les artefacts téléchargés ; voir Agent.
hooks / on_predict_start / on_predict_end observent ou façonnent chaque prédiction ; voir
laya.hooks. calibration est le même chemin JSON optionnel accepté par Agent.
Paramètres
model_id_or_pathstr="convaiinnovations/laya"deviceOptional[str]=NonetokenOptional[str]=NonesubfolderOptional[str]=Nonefastbool=Falsecompilebool=FalserevisionOptional[str]=Noneexpected_sha256Optional[Dict[str, str]]=Nonelang_temperaturesOptional[Dict[str, Dict[str, Any]]]=Nonehooks=Noneon_predict_start=Noneon_predict_end=Nonehooks_raisebool=Truehooks_concurrentbool=Truehooks_timeoutOptional[float]=NonecalibrationOptional[str]=NonebackendOptional[str]=Noneonnx_pathOptional[str]=Nonecompile_warmupbool=Truecompile_cachebool=Falsecompile_modestr="default"
ONNXAgent
ONNXAgent(
model_id_or_path: str,
onnx_path: str = "laya.onnx",
token: Optional[str] = None,
subfolder: Optional[str] = None,
revision: Optional[str] = None,
expected_sha256: Optional[Dict[str, str]] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: bool = True,
hooks_concurrent: bool = True,
hooks_timeout: Optional[float] = None,
lang_temperatures: Optional[Dict[str, Dict[str, Any]]] = None,
calibration: Optional[str] = None,
)Classes de base: HookRegistry
Runtime du modèle de décision System One via ONNX : décisions rapides optimisées pour CPU.
Charge un agent Laya propulsé par ONNX Runtime.
Paramètres
model_id_or_pathstrID HuggingFace Hub ou chemin local vers le checkpoint PyTorch d’origine (utilisé pour charger le tokenizer et la config).
onnx_pathstr="laya.onnx"Chemin vers le fichier .onnx exporté.
tokenOptional[str]=NoneJeton HuggingFace optionnel pour un checkpoint privé ou sous accès restreint ; retombe sur
$HF_TOKEN, exactement comme le faitAgent. Seuls le tokenizer et la config sont récupérés -- le graphe lui-même est leonnx_pathlocal.subfolderOptional[str]=NoneSous-dossier optionnel si le téléchargement se fait depuis un dépôt groupé.
revisionOptional[str]=NoneRévision Hub optionnelle (commit SHA/branche/tag). Si on l’omet, le défaut normal de huggingface_hub et le cache hors ligne existant sont utilisés.
expected_sha256Optional[Dict[str, str]]=None{path relative to the checkpoint dir: hexdigest} optionnel, vérifié avant qu’aucun fichier de checkpoint ne soit analysé ; optionnel, et s’applique aussi aux répertoires locaux. Un artefact manquant lève
FileNotFoundErroret une divergence d’empreinte lèveValueError; l’une ou l’autre de ces erreurs refuse le chargement.hooksHookArg=NoneHooks de prédiction optionnels ; voir
laya.hooks.on_predict_startPredictHookArg=NoneUn hook de début optionnel, exécuté avant l’inférence.
on_predict_endPredictHookArg=NoneUn hook de fin optionnel, exécuté après l’inférence.
hooks_raisebool=TrueQuand il vaut False, un hook qui échoue avertit et l’inférence continue.
hooks_concurrentbool=TrueQuand il vaut False, les hooks sont sérialisés avec un verrou.
hooks_timeoutOptional[float]=NoneBorne chaque appel de hook en secondes ; None signifie aucune limite.
lang_temperaturesOptional[Dict[str, Dict[str, Any]]]=NoneSubstitutions de température par langue optionnelles, indexées par code de langue, chacune
{"temperature": [3 floats], "temperature_by_options": {}}. Appliquées quand unlang=est passé àsystem_one/predict, reproduisant l’AgentPyTorch ; sinon un changement de backend perd la calibration.calibrationOptional[str]=None
load_calibration
load_calibration(path: str) -> NoneLit sur cet agent une table JSON écrite par save_calibration.
Paramètres
pathstr
system_one
system_one(
state: Union[str, dict, list],
questions: Dict[str, Dict[str, Any]],
lang: Optional[str] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: Optional[bool] = None,
hooks_timeout: Optional[float] = None,
max_len: Optional[int] = None,
head_max_len: Optional[int] = None,
min_confidence: Optional[float] = None,
) -> Dict[str, Any]Évalue des questions typées sur un état en une seule exécution de session ONNX Runtime.
lang sélectionne une substitution de température par langue (voir lang_temperatures), en accord avec
la signature de Agent.system_one de PyTorch, de sorte que l’un ou l’autre backend remplace l’autre sans changement.
Défini en termes de predict_batch, exactement comme l’est Agent.system_one de PyTorch, pour que les
chemins mono-état et par lots ne puissent pas diverger.
Paramètres
stateUnion[str, dict, list]Chaîne de texte, dict JSON ou liste de tours de conversation.
questionsDict[str, Dict[str, Any]]Définitions de questions, avec les formes qu’accepte
Agent.system_one.langOptional[str]=NoneSubstitution de température par langue (voir
lang_temperatures).hooksHookArg=NoneHooks par appel, ajoutés après ceux installés sur l’agent.
on_predict_startPredictHookArg=NoneUn hook de début par appel. Il peut réécrire l’état/les questions ou appeler
ctx.skip(...)pour court-circuiter l’inférence.on_predict_endPredictHookArg=NoneUn hook de fin par appel. Il peut réécrire les résultats.
hooks_raiseOptional[bool]=NoneRemplace le
hooks_raisede l’agent pour cet appel.hooks_timeoutOptional[float]=NoneRemplace le
hooks_timeoutde l’agent pour cet appel.max_lenOptional[int]=NoneRemplace le
max_lende la config pour cet appel.head_max_lenOptional[int]=NoneRemplace le
head_max_lende la config pour cet appel.min_confidenceOptional[float]=NoneSeuil d’abstention optionnel sur
answer_confidence(#361) ; une réponse en dessous est renvoyée marquée parlow_confidence: True.
Renvoie
Dictionnaire avec les réponses, les probabilités, la confiance calibrée et l’usage de jetons.
Pour scorer beaucoup d’états à la fois, voir predict_batch, qui partage les exécutions de session entre eux.
predict_batch
predict_batch(
states: List[Union[str, dict, list]],
questions: Dict[str, Dict[str, Any]],
batch_size: Optional[int] = None,
lang: Optional[str] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: Optional[bool] = None,
hooks_timeout: Optional[float] = None,
max_len: Optional[int] = None,
head_max_len: Optional[int] = None,
sort_by_length: bool = False,
min_confidence: Optional[float] = None,
) -> List[Dict[str, Any]]Évalue les mêmes questions sur de nombreux états, en partageant les exécutions de session ONNX Runtime.
Le chemin de débit, calqué sur laya.agent.Agent.predict_batch : system_one rassemble les
lignes de question d’un état par exécution de session, donc N états coûtent N exécutions. predict_batch rassemble
les lignes de plusieurs états en une exécution -- ou ceil(len(states) / batch_size) d’entre elles -- ce qui est
là où le parallélisme propre d’ONNX Runtime est payant sur CPU.
Paramètres
statesList[Union[str, dict, list]]Une liste d’états (chacun une chaîne de texte, un dict JSON ou une liste de tours de conversation). Les mêmes
questionssont évaluées contre chaque état.questionsDict[str, Dict[str, Any]]Définitions de questions, exactement comme les accepte
system_one.batch_sizeOptional[int]=NonePlafond optionnel du nombre d’états par exécution de session.
Noneles envoie tous en une seule exécution ; fixe-le pour borner la mémoire de pointe quand tu regroupes beaucoup d’états ou des états longs.langOptional[str]=NoneSubstitution de température par langue appliquée à chaque état ; voir
lang_temperatures.hooksHookArg=NoneHooks par appel, ajoutés après ceux installés sur l’agent.
on_predict_startPredictHookArg=NoneUn hook de début par appel. Il peut réécrire les états/les questions ou appeler
ctx.skip(...)pour court-circuiter l’inférence.on_predict_endPredictHookArg=NoneUn hook de fin par appel. Il peut réécrire les résultats.
hooks_raiseOptional[bool]=NoneRemplace le
hooks_raisede l’agent pour cet appel.hooks_timeoutOptional[float]=NoneRemplace le
hooks_timeoutde l’agent pour cet appel.max_lenOptional[int]=NoneRemplace le
max_lende la config pour cet appel.head_max_lenOptional[int]=NoneRemplace le
head_max_lende la config pour cet appel.sort_by_lengthbool=FalseRegroupe les états encodés de taille similaire dans des fenêtres de huit lots pour réduire le padding, exactement comme le fait
Agent.predict_batch. Nécessite unbatch_sizeexplicite supérieur à un et inférieur au nombre d’états ; sinon cela n’a aucun effet. Les résultats conservent l’ordre d’entrée. Changer les formes de lots peut légèrement modifier les prédictions en virgule flottante près des seuils de décision.min_confidenceOptional[float]=NoneSeuil d’abstention optionnel sur
answer_confidence(#361) ; les réponses en dessous sont renvoyées marquées parlow_confidence: True.
Renvoie
Une liste de dicts de résultat par état, chacun de forme identique à la sortie de system_one et
aligné avec states par indice.
predict_long
predict_long(
state: Union[str, dict, list],
questions: Dict[str, Dict[str, Any]],
window: Optional[int] = None,
stride: Optional[int] = None,
aggregate: str = "auto",
batch_size: Optional[int] = None,
lang: Optional[str] = None,
hooks=None,
on_predict_start=None,
on_predict_end=None,
hooks_raise: Optional[bool] = None,
hooks_timeout: Optional[float] = None,
) -> Dict[str, Any]Évalue des questions sur un état plus long que la fenêtre de contexte, en le parcourant en fenêtres chevauchantes et en agrégeant par question.
Le portage ONNX de laya.agent.Agent.predict_long, avec les mêmes règles d’agrégation :
system_one tronque un état qui dépasse max_len à une seule fenêtre, en abandonnant le reste
en silence. predict_long tokenise l’état une fois, le découpe en fenêtres de jetons
chevauchantes, score chaque fenêtre via predict_batch -- ainsi les fenêtres partagent des exécutions
de session ONNX Runtime plutôt que d’en coûter une chacune -- et combine les réponses par fenêtre :
- noul -> P(true) est le max sur les fenêtres (l’énoncé tient si une fenêtre le soutient)
- choice-> la réponse de la fenêtre la plus confiante, pour qu’un signal localisé ne soit pas mis en minorité par les nombreuses fenêtres neutres dont un long document est majoritairement fait
- score -> le niveau de la fenêtre la plus confiante, de même
La probabilité/confiance renvoyée est celle de la fenêtre décisive, pas un nombre calibré pour
tout le document, pour les mêmes raisons que celles données par le docstring PyTorch. Chaque réponse porte
answer["window"] -- l’index de la fenêtre décisive, token_start/token_end dans l’état
tokenisé, et le count de fenêtres.
Un état qui tient déjà dans une seule fenêtre est passé directement à system_one (sortie identique).
Paramètres
stateUnion[str, dict, list]Chaîne de texte, dict JSON ou liste de tours de conversation.
questionsDict[str, Dict[str, Any]]Définitions de questions, exactement comme les accepte
system_one.windowOptional[int]=NoneJetons d’état par fenêtre. Par défaut le budget d’état par question (
max_len - head_max_len - 8). Des fenêtres plus petites isolent mieux un signal localisé, au prix de plus de fenêtres, comme dansAgent.predict_long.strideOptional[int]=NonePas de jetons entre les fenêtres. Par défaut
window // 2(50 % de chevauchement).aggregatestr="auto"« auto » (les règles par type ci-dessus) est le seul mode pour l’instant.
batch_sizeOptional[int]=NonePlafond du nombre de fenêtres par exécution de session, pour borner la mémoire de pointe sur de très longs états.
langOptional[str]=NoneSélection de température par langue, comme dans
system_one.hooksHookArg=NoneHooks par appel, ajoutés après ceux installés sur l’agent. Ils suivent le contrat de
Agent.predict_long: ils enveloppent l’inférence qui répond à l’état, un hook de début qui répond avecctx.skip(...)obtientusage["windows"] == 0et aucune attribution de fenêtre, et un parcours réécrit est agrégé sansanswer["window"].on_predict_startPredictHookArg=NoneUn hook de début par appel, comme dans
system_one.on_predict_endPredictHookArg=NoneUn hook de fin par appel, comme dans
system_one.hooks_raiseOptional[bool]=NoneRemplace le
hooks_raisede l’agent pour cet appel.hooks_timeoutOptional[float]=NoneRemplace le
hooks_timeoutde l’agent pour cet appel.
Renvoie un seul dict de résultat, de même forme que system_one, avec usage["windows"]
ajouté. Sur plusieurs fenêtres, les clés de troncature sont sommées ou portées de la même façon que
dans Agent.predict_long : truncated est un nombre de fenêtres et truncated_questions est la
liste de la dernière fenêtre, donc truncated peut être supérieur à 0 alors que la liste est vide.
decide
decide(
state: Union[str, dict, list],
schema: Any = None,
questions: Optional[Dict[str, Dict[str, Any]]] = None,
return_details: bool = False,
min_confidence: Optional[float] = None,
predict_kwargs,
) -> AnyRépond à state contre un schéma (schéma JSON ou modèle pydantic) et renvoie des valeurs typées.
Voir laya.structured. Passe exactement l’un de schema ou questions ; les arguments nommés supplémentaires
sont transmis à predict / system_one.
Paramètres
stateUnion[str, dict, list]schemaAny=NonequestionsOptional[Dict[str, Dict[str, Any]]]=Nonereturn_detailsbool=Falsemin_confidenceOptional[float]=Nonepredict_kwargs
decide_batch
decide_batch(
states: List[Union[str, dict, list]],
schema: Any = None,
questions: Optional[Dict[str, Dict[str, Any]]] = None,
return_details: bool = False,
min_confidence: Optional[float] = None,
predict_kwargs,
) -> List[Any]Répond à de nombreux états contre un seul schéma via predict_batch ; voir laya.structured.
Paramètres
statesList[Union[str, dict, list]]schemaAny=NonequestionsOptional[Dict[str, Dict[str, Any]]]=Nonereturn_detailsbool=Falsemin_confidenceOptional[float]=Nonepredict_kwargs
Export quantifié
scripts/export_onnx.py --quantize écrit une copie quantifiée INT8 (poids uniquement) à côté de
l’export fp32 (laya.onnx produit aussi laya.int8.onnx). La quantification dynamique convertit les poids
MatMul en int8 et calcule l’échelle d’activation par entrée à l’exécution, donc aucun jeu de données de
calibration n’est nécessaire, et ONNXAgent charge le résultat en pointant onnx_path dessus. Sur CPU, c’est
environ 2x plus rapide que le modèle eager et ~1.8x plus rapide que le graphe ONNX fp32, et 1.4-2.8x plus
petit selon le checkpoint.
INT8 échange de la vraie précision, c’est donc une option de taille/latence, pas gratuite — ne l’utilise pas
là où la probabilité ou la confiance calibrée compte. Les échelles sont par tenseur par défaut ;
--per-channel active des poids par canal, mais sur le chemin dynamique, cela effondre le modèle de décision
(l’accord avec le modèle eager est tombé à ~32% sur le checkpoint anglais et ~40% sur le multilingue, contre
~67% / ~83% par tenseur ; voir l’issue #790). Même par tenseur, la dérive reste notable sur le plus grand
checkpoint ; un int8 sûr pour la précision nécessiterait du QAT ou un traitement des valeurs aberrantes à la
SmoothQuant. Le graphe int8 est réservé au CPU : ONNX Runtime n’a pas de noyau INT8 MatMul sur le
CUDAExecutionProvider, et un fournisseur GPU retombe silencieusement nœud par nœud.
python scripts/export_onnx.py --model convaiinnovations/laya --output laya.onnx --quantize