Ë
    ÛÓ^j˜w  ã                  ó‚  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZmZ d
dlmZ d
dlmZ d
dlmZmZmZmZ  e«       rddlZddlmZ ddlmZ ddl m!Z!  ejD                  e#«      Z$ G d„ de«      Z%e
dFd„«       Z&e
dGd„«       Z' edd«      d„ «       Z( edd«      d„ «       Z) edddddddd «      d!„ «       Z*	 	 	 dH	 	 	 	 	 	 	 	 	 dId"„Z+ edd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6«      d7„ «       Z,dJd8„Z-dKd9„Z.dLd:„Z/dMd;„Z0dNd<„Z1dOd=„Z2dPd>„Z3dQd?„Z4dRd@„Z5dSdA„Z6dTdB„Z7dUdC„Z8dDZ9e
dVdE„«       Z:y)Wu  Dynamo exporter.

Wraps `torch.export.export(strict=False)` with helpers that make Transformers
models exportable. The export pipeline uses five sections, in execution order:

1. **Model signature patch** (`patch_forward_signature`): replaces `model.forward`
   with a flat explicit signature derived from `sample_inputs` so `torch.export` does
   not expand `**kwargs` into a `combined_args` bundle that mismatches `dynamic_shapes`.
   This is the entry contract `torch.export` reads before tracing.
2. **Model patches** (`_PATCHES["dynamo"]` via `apply_patches("dynamo")`): reversible
   class-attribute swaps applied during tracing to replace non-exportable model patterns
   (data-dependent loops, in-place ops, mask checks) with export-safe equivalents.
   Modeling code itself is not updated because these patches are too model-specific.
3. **Pytree registration** (`register_cache_pytrees_for_model`): flatten/unflatten
   hooks (via `torch.utils._pytree.register_pytree_node`) for Cache subclasses and
   custom containers so `torch.export` can trace through them.
4. **Dynamic shapes** (`get_auto_dynamic_shapes`): automatic `Dim.AUTO` inference
   for all tensor and cache inputs when `DynamoConfig.dynamic=True`.
5. **Model state cleanup** (`reset_model_state`): non-Cache stateful module attributes
   (`_STATEFUL_CACHE_ATTRS`) are saved on entry, set to `None` during the trace, and
   restored on exit â€” so a previous eager forward doesn't leak into the trace and any
   FakeTensors the trace planted are discarded before the next eager forward.
é    )ÚannotationsN)ÚMutableMapping)Úcontextmanager)ÚAnyé   )Úlogging)Úis_detectron2_availableÚis_torch_availableÚtorch_compilable_checké   )Ú
HfExporter)ÚDynamoConfig)Úapply_patchesÚpatch_attributesÚprepare_for_exportÚregister_patch)ÚExportedProgram)ÚCache)ÚPreTrainedModelc                  ó>   — e Zd ZdZdgZddiZddiZ	 	 	 	 	 	 	 	 dd„Zy)ÚDynamoExporterao  Exporter that converts a [`PreTrainedModel`] to an `ExportedProgram`.

    Example:

    ```python
    >>> from transformers.exporters.exporter_dynamo import DynamoExporter, DynamoConfig

    >>> exporter = DynamoExporter()
    >>> exported = exporter.export(model, inputs, config=DynamoConfig(dynamic=True))
    >>> outputs = exported.module()(**inputs)
    ```
    Útorchz2.11.0z2.12.0c                ó¼  — t        |t        «      rt        di |¤Ž}n't        |t        «      st        dt	        |«      › �«      ‚t        ||«      \  }}}|j                  }|j                  r|€t        |«      }t        |«       t        d«      5  t        |«      5  t        ||«      5  t        ||«      5  t        j                  j                  |dt!        j"                  t        |«      «      |j$                  ||j&                  ¬«      }d d d «       d d d «       d d d «       d d d «       S # 1 sw Y   Œ#xY w# 1 sw Y   Œ'xY w# 1 sw Y   Œ+xY w# 1 sw Y   S xY w)Nz2Expected config to be a DynamoConfig or dict, got Údynamo© )ÚargsÚkwargsÚstrictÚdynamic_shapesÚ+prefer_deferred_runtime_asserts_over_guards)Ú
isinstanceÚdictr   Ú	TypeErrorÚtyper   r   ÚdynamicÚget_auto_dynamic_shapesÚ register_cache_pytrees_for_modelr   Úreset_model_stateÚpatch_model_configÚpatch_forward_signaturer   ÚexportÚcopyÚdeepcopyr   r    )ÚselfÚmodelÚsample_inputsÚconfigÚoutput_flagsr   Úexported_programs          úq/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/exporters/exporter_dynamo.pyr+   zDynamoExporter.exportV   sL  € ô �fœdÔ#Ü!Ñ+ FÑ+‰FÜ˜F¤LÔ1ÜÐPÔQUÐV\ÓQ]ÐP^Ð_Ó`Ð`ä-?ÀÀ}Ó-UÑ*ˆˆ}˜là×.Ñ.ˆØ�>Š>˜nÐ4Ü4°]ÓCˆNä(¨Ô/ô ˜(Ó#ñ	ä˜eÓ$ñ	ô ˜u lÓ3ñ	ô $ E¨=Ó9ñ		ô 16·±×0CÑ0CØØÜ—}‘}¤T¨-Ó%8Ó9Ø—}‘}Ø-Ø<B×<nÑ<nð 1Dó 1Ð÷	÷ 	÷ 	÷ 	ð  Ð÷	ð 	ú÷ 	ð 	ú÷ 	ð 	ú÷ 	ð  ÐúsU   ÂEÂEÂ(D9Â5AD-	ÄD9ÄEÄEÄ-D6Ä2D9Ä9EÄ>EÅE	Å
EÅEN)r/   r   r0   zMutableMapping[str, Any]r1   zDynamoConfig | dict[str, Any]Úreturnr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequired_packagesÚmin_versionsÚtested_versionsr+   r   ó    r4   r   r   D   sP   „ ñð !˜	ÐØ˜XÐ&€LØ Ð)€Oð" àð" ð 0ð" ð .ð	" ð
 
ô" r=   r   c              #  óÄ  K  — g }|j                  «       D ]K  \  }}|�"t        | d«      rt        | j                  |«      sŒ+|j                  | j                  ||fd„f«       ŒM | j	                  «       D ]E  }t        |d«      sŒt        |j                  d«      sŒ'|j                  |j                  dd„ f«       ŒG t        |«      5  d–— ddd«       y# 1 sw Y   yxY w­w)uK  Reversibly tweak `model.config` for the trace:

    - Applies `output_flags` (popped from inputs by `prepare_for_export`) onto
      `model.config.<flag>` so the model picks them up via its usual `<flag> if <flag> is
      not None else self.config.<flag>` fallback.
    - Disables `use_mamba_kernels` on every submodel's config that declares it (mamba/jamba
      kernels are not exportable).

    Originals are restored on exit. Flags whose value is `None`, or that the config doesn't
    declare, are silently skipped â€” useful for submodels that don't accept every parent flag.
    Nr1   c                ó   — |S ©Nr   )Ú	_originalÚvs     r4   ú<lambda>z$patch_model_config.<locals>.<lambda>”   s   € Èa€ r=   Úuse_mamba_kernelsc                 ó   — y©NFr   ©rA   s    r4   rC   z$patch_model_config.<locals>.<lambda>—   ó   � r=   )ÚitemsÚhasattrr1   ÚappendÚmodulesr   )r/   r2   Úconfig_patchesÚflagÚvalueÚmodules         r4   r)   r)   ƒ   sÓ   è ø€ ð €NØ#×)Ñ)Ó+ò R‰ˆˆeØˆ=¤¨¨xÔ 8ÄÈÏÉÐVZÔ@[ØØ×Ñ˜uŸ|™|¨TÀuÒ3OÐPÕQðRð —-‘-“/ò aˆÜ�6˜8Õ$¬°·±Ð@SÕ)TØ×!Ñ! 6§=¡=Ð2EÑG^Ð"_Õ`ðaô 
˜.Ó	)ñ Û÷÷ ñ üs*   ‚B C ÂC Â,C ÃCÃ	C ÃCÃC c           
   #  ó$  ‡K  — | j                   Šˆfd„}t        j                  |D �cg c]2  }t        j                  |t        j                  j                  d¬«      ‘Œ4 c}«      |_        	 || _         d–— ‰| _         yc c}w # ‰| _         w xY w­w)aü  Temporarily replace `model.forward` with a flat explicit signature derived from `inputs`.

    `torch.export` infers the exported function signature from `model.forward.__signature__`.
    Most transformers models use `**kwargs: Unpack[TransformersKwargs]`, which causes
    `torch.export` to expand the signature into a large `combined_args` bundle that
    mismatches the `dynamic_shapes` dict. This patch replaces the forward with a
    minimal signature containing only the keys present in `inputs`.
    c                 ó   •—  ‰di | ¤ŽS )Nr   r   )r   Úoriginal_forwards    €r4   Ú_flat_forwardz.patch_forward_signature.<locals>._flat_forward¨   s   ø€ ÙÑ) &Ñ)Ð)r=   N)Údefault)ÚforwardÚinspectÚ	SignatureÚ	ParameterÚPOSITIONAL_OR_KEYWORDÚ__signature__)r/   ÚinputsrT   ÚkrS   s       @r4   r*   r*   œ   s}   øè ø€ ð —}‘}Ðô*ô #*×"3Ñ"3Ø^dÖeÐYZŒ×	Ñ	˜1œg×/Ñ/×EÑEÈtÖ	TÒeó#€MÔð)Ø%ˆŒÛà(ˆ�ùò 	føð )ˆ�üs(   ƒ%B¨7A?ÁBÁ,B Á7BÂ	BÂBr   zQtransformers.models.nllb_moe.modeling_nllb_moe.NllbMoeTop2Router._cast_classifierc                ó   — d„ S )z:Disable classifier dtype cast in nllb-moe (not traceable).c                 ó   — y r@   r   )r.   r   r   s      r4   rC   z(_patch_classifier_cast.<locals>.<lambda>É   rH   r=   r   rG   s    r4   Ú_patch_classifier_castr`   Æ   s
   € ñ .Ð-r=   z0torch.nn.functional.scaled_dot_product_attentionc                ó*   ‡ ‡‡— ddl mŠmŠ ˆˆ ˆfd„}|S )u4  Route SDPA through the MATH backend on CPU during tracing â€” CPU SDPA's flash/efficient
    paths guard on ``Eq(batch, 1)`` (upstream https://github.com/pytorch/pytorch/issues/180202),
    which trips ``GuardOnDataDependentSymNode`` whenever the batch dim comes from a data-dependent
    op like ``pixel_values[bool_mask]`` (Idefics2/3 and most VLMs). The MATH decomposition has no
    batch-1 dispatch, so the guard never fires. CUDA exports are left alone â€” the GPU kernels
    don't have this guard, and we want the flash/efficient decompositions there.
    r   )Ú
SDPBackendÚsdpa_kernelc                ó¶   •— | j                   j                  dk(  r( ‰‰j                  «      5   ‰| g|¢­i |¤Žcd d d «       S  ‰| g|¢­i |¤ŽS # 1 sw Y   ŒxY w)NÚcpu)Údevicer$   ÚMATH)Úqueryr   r   rb   Úoriginalrc   s      €€€r4   Úpatchz_patch_sdpa.<locals>.patch×   sb   ø€ Ø�<‰<×Ñ Ò%Ù˜ZŸ_™_Ó-ñ 8Ù Ð7¨Ò7°Ñ7÷8ñ 8á˜Ð/ Ò/¨Ñ/Ð/÷8ð 8ús   ­AÁA)Útorch.nn.attentionrb   rc   )ri   rj   rb   rc   s   ` @@r4   Ú_patch_sdparl   Ì   s   ú€ ÷ ;ö0ð €Lr=   z4transformers.utils.import_utils.is_kernels_availablez'transformers.utils.is_kernels_availablez0transformers.modeling_utils.is_kernels_availablezGtransformers.models.sam3_video.modeling_sam3_video.is_kernels_availablez9transformers.models.mra.modeling_mra.is_kernels_availablez;transformers.models.rwkv.modeling_rwkv.is_kernels_availablez;transformers.models.yoso.modeling_yoso.is_kernels_availablec                ó   — d„ S )uÑ   Force-disable the optional ``kernels`` library during export â€” its kernels
    call into native code that ``torch.export`` cannot trace, and the pure-PyTorch
    fallbacks in each model are always traceable.c                  ó   — yrF   r   )r   r   s     r4   rC   z-_patch_is_kernels_available.<locals>.<lambda>ñ   rH   r=   r   rG   s    r4   Ú_patch_is_kernels_availablero   à   s
   € ñ" )Ð(r=   c                óæ  ‡‡— |j                   dk(  }|r|j                  d«      }|j                  d   }t        |dk7  d«       |j                  d   dz
  Št        |‰z  dk(  d«       t	        | d«      �r@t	        | d«      rãt	        | d«      r×| j
                  | j                  k7  r¾| j                  |«      j                  | j
                  | j                  | j                  gd	¬
«      \  }	}
}|	j                  || j                  | j                  «      }	|
j                  || j                  | j                  «      }
|j                  || j                  | j                  «      }�n | j                  |«      j                  |d| j                  d	«      j                  dd«      j                  d«      \  }	}
}nÏt!        | dt!        | dd«      «      }t!        | dt!        | dd«      «      }t!        | dt!        | dd«      «      } ||«      j                  || j                  | j                  «      }	 ||«      j                  || j                  | j                  «      }
 ||«      j                  || j                  | j                  «      }|�¨t"        j$                  t'        | «      j(                     j*                  }t-        |t.        t0        f«      r|\  }} ||	|
||«      \  }	}
nN ||	j3                  d«      |«      j                  d«      }	 ||
j3                  d«      |«      j                  d«      }
|‰z  Šˆˆfd„} ||	«      }	 ||
«      }
 ||«      }t        |	j                  d   dk7  d«       t        |	j                  d   dk7  d«       t4        j6                  j8                  j;                  |	|
|d| j<                  | j>                  sdn| j@                  t!        | d| j                  «      | j                  k7  ¬«      }|j                  dd«      j                  |d	«      jC                  «       }t	        | d«      r| jD                  n| jF                  } ||«      }|r|j3                  d«      }|r|dfS |S )z¬Export-safe chunked vision/audio attention: reshape segments into a batch dim,
    apply rotary if provided, run one SDPA call, project, and re-emit in the original layout.é   r   z1Chunked vision attention received an empty input.r   z¹Chunked vision attention requires uniform segment lengths during export. Ensure all images have the same resolution (use do_resize=True in the processor) or pad inputs to a common size.ÚqkvÚq_dimÚkv_diméÿÿÿÿ)ÚdimÚq_projÚqNÚk_projr]   Úv_projrB   c                óL   •— | j                  d‰‰f«      j                  dd«      S )Nr   r   r   )Ú	unflattenÚ	transpose)ÚtÚnum_segmentsÚseg_lens    €€r4   Ú_to_batchedz7_reshaped_vision_attention_forward.<locals>._to_batchedO  s&   ø€ Ø�{‰{˜1˜|¨WÐ5Ó6×@Ñ@ÀÀAÓFÐFr=   z1Reshaped chunked-vision attention got zero batch.r   z/Reshaped chunked-vision attention got zero seq.Fg        Únum_key_value_heads)Ú	is_causalÚscaleÚ	dropout_pÚ
enable_gqaÚproj)$ÚndimÚsqueezeÚshaper   rJ   rs   rt   rr   ÚsplitÚviewÚ	num_headsÚhead_dimr‚   Úreshaper}   ÚunbindÚgetattrÚsysrL   r$   r7   Úapply_rotary_pos_emb_visionr!   ÚtupleÚlistÚ	unsqueezer   ÚnnÚ
functionalÚscaled_dot_product_attentionÚscalingÚtrainingÚattention_dropoutÚ
contiguousr‡   Úout_proj)r.   Úhidden_statesÚ
cu_seqlensÚrotary_pos_embÚposition_embeddingsÚreturns_tupler   Úneeds_batch_restoreÚ
seq_lengthÚquery_statesÚ
key_statesÚvalue_statesrw   ry   rz   r“   ÚcosÚsinr�   Úattn_outputrž   r   r€   s                        @@r4   Ú"_reshaped_vision_attention_forwardr¬     s  ù€ ð (×,Ñ,°Ñ1ÐÙØ%×-Ñ-¨aÓ0ˆà×$Ñ$ QÑ'€JÜØ�a‰Ø;ôð ×#Ñ# AÑ&¨Ñ*€LÜØ�\Ñ! QÑ&ð	*ôô ˆt�UÕô �4˜Ô!¤g¨d°HÔ&=À$Ç*Á*ÐPT×P[ÑP[ÒB[Ø59·X±X¸mÓ5L×5RÑ5RØ—‘˜TŸ[™[¨$¯+©+Ð6¸Bð 6Só 6Ñ2ˆL˜* lð (×,Ñ,¨Z¸¿¹ÈÏÉÓWˆLØ#Ÿ™¨°T×5MÑ5MÈtÏ}É}Ó]ˆJØ'×,Ñ,¨Z¸×9QÑ9QÐSW×S`ÑS`ÓaŠLð —‘˜Ó'×/Ñ/°
¸A¸t¿~¹~ÈrÓR×\Ñ\Ð]^Ð`aÓb×iÑiÐjkÓlñ 3ˆL˜*¡lô ˜˜x¬°°s¸DÓ)AÓBˆÜ˜˜x¬°°s¸DÓ)AÓBˆÜ˜˜x¬°°s¸DÓ)AÓBˆÙ˜mÓ,×1Ñ1°*¸d¿n¹nÈdÏmÉmÓ\ˆÙ˜MÓ*×/Ñ/°
¸D¿N¹NÈDÏMÉMÓZˆ
Ù˜mÓ,×1Ñ1°*¸d¿n¹nÈdÏmÉmÓ\ˆàÐ&ô
 '*§k¡k´$°t³*×2GÑ2GÑ&H×&dÑ&dÐ#ÜÐ)¬E´4¨=Ô9à*‰HˆC�Ù'BÀ<ÐQ[Ð]`ÐbeÓ'fÑ$ˆL™*ñ 7°|×7MÑ7MÈaÓ7PÐReÓf×nÑnÐopÓqˆLÙ4°Z×5IÑ5IÈ!Ó5LÐNaÓb×jÑjÐklÓmˆJà˜LÑ(€GõGñ ˜|Ó,€LÙ˜ZÓ(€JÙ˜|Ó,€Lä˜<×-Ñ-¨aÑ0°AÑ5Ð7jÔkÜ˜<×-Ñ-¨aÑ0°AÑ5Ð7hÔiÜ—(‘(×%Ñ%×BÑBØØØØØ�l‰lØ!Ÿ]š]‘#°×0FÑ0FÜ˜4Ð!6¸¿¹ÓGÈ4Ï>É>ÑYð Có €Kð ×'Ñ'¨¨1Ó-×5Ñ5°jÀ"ÓE×PÑPÓR€KÜ# D¨&Ô1ˆt�yŠy°t·}±}€HÙ˜;Ó'€KáØ!×+Ñ+¨AÓ.ˆá"/ˆK˜ÐÐ@°[Ð@r=   zFtransformers.models.qwen2_vl.modeling_qwen2_vl.VisionAttention.forwardzTtransformers.models.qwen2_5_vl.modeling_qwen2_5_vl.Qwen2_5_VLVisionAttention.forwardzMtransformers.models.qwen3_vl.modeling_qwen3_vl.Qwen3VLVisionAttention.forwardzXtransformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe.Qwen3VLMoeVisionAttention.forwardzKtransformers.models.qwen3_5.modeling_qwen3_5.Qwen3_5VisionAttention.forwardzVtransformers.models.qwen3_5_moe.modeling_qwen3_5_moe.Qwen3_5MoeVisionAttention.forwardz^transformers.models.qwen3_omni_moe.modeling_qwen3_omni_moe.Qwen3OmniMoeVisionAttention.forwardzEtransformers.models.glm4v.modeling_glm4v.Glm4vVisionAttention.forwardzPtransformers.models.glm4v_moe.modeling_glm4v_moe.Glm4vMoeVisionAttention.forwardzJtransformers.models.glm_ocr.modeling_glm_ocr.GlmOcrVisionAttention.forwardzbtransformers.models.ernie4_5_vl_moe.modeling_ernie4_5_vl_moe.Ernie4_5_VLMoeVisionAttention.forwardzRtransformers.models.exaone4_5.modeling_exaone4_5.Exaone4_5_VisionAttention.forwardzPtransformers.models.glm_image.modeling_glm_image.GlmImageVisionAttention.forwardzYtransformers.models.qwen2_5_omni.modeling_qwen2_5_omni.Qwen2_5OmniVisionAttention.forwardz[transformers.models.video_llama_3.modeling_video_llama_3.VideoLlama3VisionAttention.forwardzWtransformers.models.paddleocr_vl.modeling_paddleocr_vl.PaddleOCRVisionAttention.forwardzWtransformers.models.minicpmv4_6.modeling_minicpmv4_6.MiniCPMV4_6VisionAttention.forwardzXtransformers.models.qwen2_5_omni.modeling_qwen2_5_omni.Qwen2_5OmniAudioAttention.forwardz]transformers.models.qwen3_omni_moe.modeling_qwen3_omni_moe.Qwen3OmniMoeAudioAttention.forwardzOtransformers.models.qwen3_asr.modeling_qwen3_asr.Qwen3ASRAudioAttention.forwardc                óP   ‡— t        j                  | «      }d|v xs d|v Šˆfd„}|S )zPBind `returns_tuple` once per class by inspecting the original forward's source.zreturn attn_output, attn_weightzreturn attn_output, Nonec                ó&   •— t        | g|¢­d‰i|¤ŽS )Nr£   )r¬   )r.   r   r   r£   s      €r4   rV   z0_patch_chunked_vision_attention.<locals>.forward�  s   ø€ Ü1°$Ðe¸ÒeÈ]ÐeÐ^dÑeÐer=   )rW   Ú	getsource)ri   ÚsrcrV   r£   s      @r4   Ú_patch_chunked_vision_attentionr±   m  s9   ø€ ô@ ×
Ñ
˜HÓ
%€CØ5¸Ð<ÒaÐ@ZÐ^aÐ@a€Môfð €Nr=   c                ó8   — | j                   › d| j                  › �S )Nú:)r7   r8   )Úclss    r4   Ú_class_to_pathrµ      s   € Ø�n‰nÐ˜Q˜s×/Ñ/Ð0Ð1Ð1r=   c                óž   — | j                  dd«      \  }}t        j                  |«      }|j                  d«      D ]  }t        ||«      }Œ |S )Nr³   r   ú.)r‹   Ú	importlibÚimport_moduler‘   )ÚpathÚmodule_nameÚqualnameÚobjÚparts        r4   Ú_path_to_classr¿   ¤  sP   € Ø ŸJ™J s¨AÓ.Ñ€K�Ü
×
!Ñ
! +Ó
.€CØ—‘˜sÓ#ò !ˆÜ�c˜4Ó ‰ð!à€Jr=   c                óX  — | �!t        | «      t        t        t        t        fv r| S t        | «      t
        u r| D �cg c]  }t        ||«      ‘Œ c}S t        | «      t        u r.| j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}S t        | t        j                  «      r!t        |«      }|j                  | «       d|dœS t        | t        j                  «      rdt        | «      dœS t        | t        j                  «      rdt	        | «      dœS t        | t        j                   «      rdt	        | «      j#                  d«      d	œS t        | t        j$                  «      rd
t	        | «      j#                  d«      d	œS t        | t        j&                  t        j(                  t        j*                  f«      r!t        |«      }|j                  | «       d|dœS t        | t         «      rdt-        | «      dœS t        | «      }t        | t        «      r;dt-        |«      | j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}dœS t        | t.        t
        t0        t2        f«      r'dt-        |«      | D �cg c]  }t        ||«      ‘Œ c}dœS t5        | d«      rDdt-        |«      t7        | «      j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}dœS t9        dt        | «      j:                  › d�«      ‚c c}w c c}}w c c}}w c c}w c c}}w )z]Single-pass: recursively build a JSON-native context while collecting tensors into `tensors`.Útensor)Ú_tÚiÚsize)rÂ   rB   rf   )rÂ   ÚsÚdtypeztorch.)rÂ   ÚnÚlayoutÚsymr$   )rÂ   ÚpÚmap)rÂ   rÊ   rB   ÚseqÚ__dict__r½   )rÂ   rÊ   rÅ   zCannot flatten z for pytree context)r$   ÚboolÚintÚfloatÚstrr•   Ú_flatten_to_contextr"   rI   r!   r   ÚTensorÚlenrK   ÚSizerf   rÆ   ÚremoveprefixrÈ   ÚSymIntÚSymFloatÚSymBoolrµ   r”   ÚsetÚ	frozensetrJ   Úvarsr#   r6   )r½   ÚtensorsrÃ   r]   rB   Úidxr´   s          r4   rÒ   rÒ   ¬  s¥  € ð €{”d˜3“i¤D¬#¬u´cÐ#:Ñ:Øˆ
ÜˆCƒy”DÑØ9<Ö=°AÔ# A wÕ/Ò=Ð=ÜˆCƒy”DÑØ?B¿y¹y»{×K±t°q¸!�Ô& q¨'Ó2Ñ2ÓKÐKô �#”u—|‘|Ô$Ü�'‹lˆØ�‰�sÔØ SÑ)Ð)Ü�#”u—z‘zÔ"Ø¤4¨£9Ñ-Ð-Ü�#”u—|‘|Ô$Ø¤S¨£XÑ.Ð.Ü�#”u—{‘{Ô#Ø¤C¨£H×$9Ñ$9¸(Ó$CÑDÐDÜ�#”u—|‘|Ô$Ø¤S¨£X×%:Ñ%:¸8Ó%DÑEÐEÜ�#œŸ™¤e§n¡n´e·m±mÐDÔEÜ�'‹lˆØ�‰�sÔØ #Ñ&Ð&ô �#”tÔØ¤>°#Ó#6Ñ7Ð7ô ˆs‹)€CÜ�#”tÔàÜ Ó$ØADÇÁÃ×M¹¸¸A�!Ô(¨¨GÓ4Ñ4ÓMñ
ð 	
ô
 �#œœt¤S¬)Ð4Ô5àÜ Ó$Ø;>Ö?°aÔ% a¨Õ1Ò?ñ
ð 	
ô
 ˆs�JÔàÜ Ó$ÜAEÀcÃÇÁÓAR×S¹¸¸A�!Ô(¨¨GÓ4Ñ4ÓSñ
ð 	
ô �o¤d¨3£i×&8Ñ&8Ð%9Ð9LÐMÓ
NÐNùò_ >ùãKùó< Nùò @ùó Ts   »LÁ5LÈ:L
ÊL!ËL&
c                óÄ  — | �!t        | «      t        t        t        t        fv r| S t        | «      t
        u r| D �cg c]  }t        ||«      ‘Œ c}S t        | «      t        u r2d| vr.| j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}S | d   }|dk(  r|| d      S |dk(  rt        t        | d   «      S |dk(  rt        t        | d   «      S |dk(  rt        j                  | d   «      S |d	k(  rt        j                  | d
   «      S |dk(  r|| d      S |dk(  rt        | d   «      S |dk(  rEt        | d   «      } || d
   j                  «       D ��ci c]  \  }}|t        ||«      “Œ c}}«      S |dk(  r3t        | d   «      }| d
   D �cg c]  }t        ||«      ‘Œ }}	  ||«      S |dk(  rlt        | d   «      }| d   j                  «       D ��ci c]  \  }}|t        ||«      “Œ }}}|j                  |«      }	|	j                   j#                  |«       |	S t        d|›d�«      ‚c c}w c c}}w c c}}w c c}w # t        $ r  ||Ž cY S w xY wc c}}w )zVReconstruct an object from its JSON-native context, substituting tensor index markers.rÂ   rÁ   rÃ   rÈ   rÇ   rÆ   rf   rÅ   rÄ   rB   rÉ   r$   rÊ   rË   rÌ   r½   zUnknown tag z in pytree context)r$   rÎ   rÏ   rÐ   rÑ   r•   Ú_unflatten_from_contextr"   rI   r‘   r   rf   rÕ   r¿   r#   Ú__new__rÍ   Úupdate)
ÚctxrÝ   rÃ   r]   rB   r~   r´   rI   ÚstateÚinstances
             r4   rà   rà   ä  sx  € ð €{”d˜3“i¤D¬#¬u´cÐ#:Ñ:Øˆ
ÜˆCƒy”DÑØ=@ÖA¸Ô'¨¨7Õ3ÒAÐAÜˆCƒy”DÑ˜T¨™_ØCFÇ9Á9Ã;×O¹4¸1¸a�Ô*¨1¨gÓ6Ñ6ÓOÐOð 	ˆD‰	€AØˆH‚}Ø�s˜3‘xÑ Ð ØˆH‚}Ü”u˜c #™hÓ'Ð'ØˆG‚|Ü”u˜c #™hÓ'Ð'ØˆH‚}Ü�|‰|˜C ™HÓ%Ð%ØˆF‚{Ü�z‰z˜#˜c™(Ó#Ð#ØˆE‚zØ�s˜3‘xÑ Ð ð 	ˆF‚{Ü˜c #™hÓ'Ð'ð 	ˆE‚zÜ˜S ™XÓ&ˆÙÀsÈ3ÁxÇ~Á~ÓGW×X¹t¸qÀ!�AÔ.¨q°'Ó:Ñ:ÓXÓYÐYØˆE‚zÜ˜S ™XÓ&ˆØ>AÀ#¹hÖG¸Ô(¨¨GÕ4ÐGˆÐGð	Ù�u“:Ðð 	ˆE‚zÜ˜S ™XÓ&ˆØDGÈÁHÇNÁNÓDT×U¹D¸A¸q�Ô+¨A¨wÓ7Ñ7ÐUˆÑUØ—;‘;˜sÓ#ˆØ×Ñ× Ñ  Ô'Øˆä
�l 1 %Ð'9Ð:Ó
;Ð;ùòS BùãOùó0 Yùò Høô ò 	Ù˜�;Òð	üó Vs/   »H2Á9H7ÅH=
ÆIÆ*I ÇIÉIÉIc                ó&   — g }t        | |«      }||fS r@   )rÒ   )r½   rÝ   Úcontexts      r4   Ú_pytree_flattenrè     s   € Ø€GÜ! # wÓ/€GØ�GÐÐr=   c                ó¼   — t        | «      \  }}t        |«      D ��cg c]0  \  }}t        j                  j                  j                  |«      |f‘Œ2 c}}|fS c c}}w r@   )rè   Ú	enumerater   ÚutilsÚ_pytreeÚSequenceKey)r½   Úleavesrç   rÃ   Úleafs        r4   Ú_pytree_flatten_with_keysrð     sN   € Ü% cÓ*�O€FˆGÜFOÐPVÓFW×X¹7¸1¸dŒU�[‰[× Ñ ×,Ñ,¨QÓ/°Ò6ÓXÐZaÐaÐaùÓXs   �5Ac                ó,   — t        |t        | «      «      S r@   )rà   r•   )Úvaluesrç   s     r4   Ú_pytree_unflattenró   !  s   € Ü" 7¬D°«LÓ9Ð9r=   c                óÔ   — 	 t         j                  j                  j                  | t        t
        t        | «      t        ¬«       y # t        $ r}dt        |«      vr‚ Y d }~y d }~ww xY w)N)Úserialized_type_nameÚflatten_with_keys_fnz!already registered as pytree node)
r   rë   rì   Úregister_pytree_noderè   ró   rµ   rð   Ú
ValueErrorrÑ   )Ú
object_clsÚes     r4   Ú_register_pytree_noderû   %  s^   € ð
Ü�‰×Ñ×0Ñ0ØÜÜÜ!/°
Ó!;Ü!:ð 	1õ 	
øô ò Ø.´c¸!³fÑ<Øô =ûðús   ‚AA Á	A'ÁA"Á"A'c              #  óh   K  — | j                  «       D ]  }|–— t        |«      E d {  –—†  Œ y 7 Œ­wr@   )Ú__subclasses__Ú_iter_subclasses)r´   Úsubclasss     r4   rþ   rþ   3  s4   è ø€ Ø×&Ñ&Ó(ò .ˆØŠÜ# HÓ-×-Ñ-ñ.à-ús   ‚&2¨0©2c                ó  — t        t        «      D ]  }t        |«       Œ t        j                  t        j
                  | «      «      D ]w  \  }}t        j                  |«      sŒ|j                  | j                  j                  k(  sŒ@|j                  j                  d«      sŒ\t        |t        «      rŒmt        |«       Œy t        «       r=t        | t        «      r,| j                  j                   dk(  rddlm} t        |«       yyyy)zCRegister all relevant cache types as pytree nodes for torch.export.r   Ú
layoutlmv2r   )Ú	ImageListN)rþ   r   rû   rW   Ú
getmembersÚ	getmoduleÚisclassr7   Ú	__class__r6   ÚendswithÚ
issubclassr	   r!   r   r1   Ú
model_typeÚ detectron2.structures.image_listr  )r/   Ú
cache_typeÚ_r½   r  s        r4   r'   r'   9  sÌ   € ô '¤uÓ-ò *ˆ
Ü˜jÕ)ð*ô ×$Ñ$¤W×%6Ñ%6°uÓ%=Ó>ò '‰ˆˆ3ä�O‰O˜CÕ Ø—‘ %§/¡/×"<Ñ"<Ó<Ø—‘×%Ñ% gÕ.Ü˜s¤EÕ*ä! #Õ&ð'ô Ô ¤Z°´Ô%GÈEÏLÉL×LcÑLcÐgsÒLsÝ>ä˜iÕ(ð MtÐ%GÐ r=   c                ó    — t         j                  t        | j                  «       «      t        j
                  j                  j                  «      S )zPGenerate a dynamic shape with all dimensions set to Dim.AUTO for a given tensor.)r"   ÚfromkeysÚrangerv   r   r+   ÚDimÚAUTO)rÁ   s    r4   Ú_auto_dynamic_shaper  U  s.   € ä�=‰=œ˜vŸz™z›|Ó,¬e¯l©l×.>Ñ.>×.CÑ.CÓDÐDr=   c                óØ  — t        | t        j                  «      rt        | «      S | � t        | t        t
        t        t        f«      ryt        | d«      rt        | «      \  }}t        |«      S t        | «      t        t        t        t        fv r t        | «      d„ | D «       «      S t        | «      t         u r-| j#                  «       D ��ci c]  \  }}|t        |«      “Œ c}}S yc c}}w )uÜ  Recursively build dynamic shapes for any input value.

    - Tensors â†’ per-dimension Dim.AUTO spec.
    - Scalars / None â†’ None (no dynamic dims).
    - Objects with ``__dict__`` (ModelOutput, Cache, â€¦) â†’ flat list of leaf specs,
      matching the ``TreeSpec(list, â€¦)`` that torch.export produces for these types.
    - Lists / tuples â†’ same container type, recursed element-wise.
    - Plain dicts â†’ recursed dict of specs.
    - Everything else â†’ None.
    NrÍ   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr@   )r&   )Ú.0rB   s     r4   ú	<genexpr>z*get_auto_dynamic_shapes.<locals>.<genexpr>m  s   è ø€ ÒG¸1Ô3°A×6ÑGùs   ‚)r!   r   rÓ   r  rÏ   rÐ   rÎ   rÑ   rJ   rè   r&   r$   r•   r”   rÚ   rÛ   r"   rI   )r\   rî   r  r]   rB   s        r4   r&   r&   Z  sÁ   € ô �&œ%Ÿ,™,Ô'Ü" 6Ó*Ð*Ø€~œ F¬S´%¼¼sÐ,CÔDØÜˆv�zÔ"Ü# FÓ+‰	ˆ�Ü& vÓ.Ð.ÜˆFƒ|œœe¤S¬)Ð4Ñ4ØŒt�F‹|ÑGÀÔGÓGÐGÜˆFƒ|”tÑØ:@¿,¹,».×I±$°!°Q�Ô*¨1Ó-Ñ-ÓIÐIØùó Js   ÃC&)Ú_cached_decode_position_idsÚ_prefill_lenÚ"cached_rotary_positional_embeddingÚcached_sequence_lengthc              #  óB  K  — | j                  «       D ��cg c](  }t        D ]  }t        ||«      r||t        ||«      f‘Œ Œ* }}}|D ]  \  }}}t	        ||d«       Œ 	 d–— |D ]  \  }}}t	        |||«       Œ yc c}}w # |D ]  \  }}}t	        |||«       Œ w xY w­w)zÊSave each `_STATEFUL_CACHE_ATTRS` value, null it for the trace, restore on exit.

    FakeTensors that `torch.export` plants into these attributes during the trace are
    discarded by the restore.
    N)rL   Ú_STATEFUL_CACHE_ATTRSrJ   r‘   Úsetattr)r/   rP   ÚattrÚ	originalsr  ri   s         r4   r(   r(   †  sÏ   è ø€ ð —m‘m“o÷àÜ)òð Ü�6˜4Ô ð 
�”w˜v tÓ,Ò-ðØ-ð€Iñ ð %ò $‰ˆ��aÜ�˜˜dÕ#ð$ð,Ûà&/ò 	,Ñ"ˆF�D˜(Ü�F˜D (Õ+ñ	,ùóøð '0ò 	,Ñ"ˆF�D˜(Ü�F˜D (Õ+ñ	,üs(   ‚B–-A<ÁBÁB Á#BÂBÂB)r/   r   r2   údict[str, Any])r/   r   r\   r   )NNF)
rŸ   útorch.Tensorr    r!  r¡   ztorch.Tensor | Noner¢   z(tuple[torch.Tensor, torch.Tensor] | Noner£   rÎ   )r´   r$   r5   rÑ   )rº   rÑ   r5   r$   )r½   r   rÝ   r•   r5   r   )rã   r   rÝ   r•   r5   r   )r½   r   r5   ztuple[list, Any])r½   r   )rç   r   r5   r   )rù   r$   )r´   r$   )r/   r   )rÁ   r!  r5   zdict[int, torch.export.Dim])r\   r   r5   r   )r/   ztorch.nn.Module);r9   Ú
__future__r   r,   r¸   rW   r’   Úcollections.abcr   Ú
contextlibr   Útypingr   rë   r   Úutils.import_utilsr	   r
   r   Úbaser   Úconfigsr   r   r   r   r   r   Útorch.exportr   Úcache_utilsr   Úmodeling_utilsr   Ú
get_loggerÚ__file__Úloggerr   r)   r*   r`   rl   ro   r¬   r±   rµ   r¿   rÒ   rà   rè   rð   ró   rû   rþ   r'   r  r&   r  r(   r   r=   r4   ú<module>r/     s  ðñ õ0 #ã Û Û Û 
Ý *Ý %Ý å ß dÑ dÝ Ý !ß VÓ Vñ ÔÛÝ,å#Ý0ð 
ˆ×	Ñ	˜HÓ	%€ô4 �Zô 4 ð~ òó ðð0 ò)ó ð)ñR �ÐmÓnñ.ó oð.ñ
 �ÐLÓMñó Nðñ& Øà:Ø-ð 7ØMØ?ØAØAóñ)óð)ð< +/ØDHØðcAàðcAð ðcAð (ð	cAð
 BðcAð ócAñL ØàLØZØSØ^ØQØ\ØdØKØVØPØhàXàVà_àaØ]à]à^ØcØUó9ñ<ó=ð<ó*2óó5Oóp/<ódóbó
:óó.ó)ó8Eó
ðHÐ ð ò,ó ñ,r=   