ó
    oM‡j,  ã            	       óž  • S SK Jr  S SKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SS	KJrJrJrJr  \" \5      rS
rSr\ " S S5      5       r " S S\5      r " S S\5      r " S S\5      rS\R0                  R2                  S\SS4S jrS\R0                  R2                  S\S\SS4S jrSS\R0                  R2                  S\S\SS4S jjrg)é    )Ú	dataclassNé   )Ú
get_logger)Úunwrap_moduleé   )Ú"_ALL_TRANSFORMER_BLOCK_IDENTIFIERS)ÚTransformerBlockRegistry)Ú	BaseStateÚHookRegistryÚ	ModelHookÚStateManagerÚfbc_leader_block_hookÚfbc_block_hookc                   ó(   • \ rS rSr% SrSr\\S'   Srg)ÚFirstBlockCacheConfigé    a3  
Configuration for [First Block
Cache](https://github.com/chengzeyi/ParaAttention/blob/7a266123671b55e7e5a2fe9af3121f07a36afc78/README.md#first-block-cache-our-dynamic-caching).

Args:
    threshold (`float`, defaults to `0.05`):
        The threshold to determine whether or not a forward pass through all layers of the model is required. A
        higher threshold usually results in a forward pass through a lower number of layers and faster inference,
        but might lead to poorer generation quality. A lower threshold may not result in significant generation
        speedup. The threshold is compared against the absmean difference of the residuals between the current and
        cached outputs from the first transformer block. If the difference is below the threshold, the forward pass
        is skipped.
gš™™™™™©?Ú	threshold© N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚfloatÚ__annotations__Ú__static_attributes__r   ó    Ú¯C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\diffusers/hooks/first_block_cache.pyr   r       s   ‡ ñð €IˆuÖr   r   c                   ó2   ^ • \ rS rSrSU 4S jjrS rSrU =r$ )ÚFBCSharedBlockStateé3   c                 óZ   >• [         TU ]  5         S U l        S U l        S U l        SU l        g ©NT)ÚsuperÚ__init__Úhead_block_outputÚhead_block_residualÚtail_block_residualsÚshould_compute)ÚselfÚ	__class__s    €r   r%   ÚFBCSharedBlockState.__init__4   s.   ø€ Ü‰ÑÔàJNˆÔØ15ˆÔ ØMQˆÔ!Ø$(ˆÕr   c                 ó    • S U l         SU l        g r#   )r(   r)   )r*   s    r   ÚresetÚFBCSharedBlockState.reset<   s   € Ø$(ˆÔ!Ø"ˆÕr   )r&   r'   r)   r(   )ÚreturnN)r   r   r   r   r%   r.   r   Ú__classcell__©r+   s   @r   r    r    3   s   ø† ÷)÷#ð #r   r    c                   óÄ   • \ rS rSrSrS\S\4S jrS rS\	R                  R                  4S jrS	 r\	R                  R                  S
\	R                   S\4S j5       rSrg)ÚFBCHeadBlockHookéA   TÚstate_managerr   c                 ó*   • Xl         X l        S U l        g ©N)r6   r   Ú	_metadata)r*   r6   r   s      r   r%   ÚFBCHeadBlockHook.__init__D   s   € Ø*ÔØ"ŒØˆ�r   c                 óf   • [        U5      n[        R                  " UR                  5      U l        U$ r8   ©r   r	   Úgetr+   r9   ©r*   ÚmoduleÚunwrapped_modules      r   Úinitialize_hookÚ FBCHeadBlockHook.initialize_hookI   ó+   € Ü(¨Ó0ÐÜ1×5Ò5Ð6F×6PÑ6PÓQˆŒØˆr   r?   c                 óÔ  • U R                   R                  SX#5      nU R                  R                  " U0 UD6n[	        U[
        5      nU(       a  XPR                   R                     U-
  nOXT-
  nU R                  R                  5       nS =pšU R                  U5      nX¸l
        U(       dâ  U(       a)  UR                  S   XPR                   R                     -   n	OUR                  S   U-   n	U R                   R                  b1  U(       d   eUR                  S   XPR                   R                     -   n
U(       aK  S /[        U5      -  nXœU R                   R                  '   X¬U R                   R                  '   [        U5      nOU	nUnU$ U(       aF  S /[        U5      -  nXPR                   R                     US'   XPR                   R                     US'   OUnXØl        Xxl        U$ )NÚhidden_statesr   r   )r9   Ú_get_parameter_from_args_kwargsÚfn_refÚoriginal_forwardÚ
isinstanceÚtupleÚreturn_hidden_states_indexr6   Ú	get_stateÚ _should_compute_remaining_blocksr)   r(   Ú"return_encoder_hidden_states_indexÚlenr&   r'   )r*   r?   ÚargsÚkwargsÚoriginal_hidden_statesÚoutputÚis_output_tupleÚhidden_states_residualÚshared_staterE   Úencoder_hidden_statesr)   Úreturn_outputr&   s                 r   Únew_forwardÚFBCHeadBlockHook.new_forwardN   sÈ  € Ø!%§¡×!OÑ!OÐP_ÐaeÓ!nÐà—‘×-Ò-¨tÐ>°vÑ>ˆÜ$ V¬UÓ3ˆæØ%+¯N©N×,UÑ,UÑ%VÐYoÑ%oÑ"à%+Ñ%DÐ"à,0×,>Ñ,>×,HÑ,HÓ,JˆØ04Ð4ˆØ×>Ñ>Ð?UÓVˆØ&4Ô#ææà ×5Ñ5°aÑ8¸6Ç.Á.×BkÑBkÑ;lÑlñ ð !-× AÑ AÀ!Ñ DÀvÑ M�à�~‰~×@Ñ@ÑLÞ&Ð&�à ×5Ñ5°aÑ8¸6Ç.Á.×BsÑBsÑ;tÑtð &ö Ø!% ¬¨V«Ñ 4�ØKX˜dŸn™n×GÑGÑHØSh˜dŸn™n×OÑOÑPÜ % mÓ 4‘à -�Ø"ˆFð ˆö Ø%) F¬S°«[Ñ$8Ð!Ø'-¯n©n×.WÑ.WÑ'XÐ! !Ñ$Ø'-¯n©n×._Ñ._Ñ'`Ð! !Ò$à$*Ð!Ø->Ô*Ø/EÔ,àˆr   c                 ó:   • U R                   R                  5         U$ r8   )r6   r.   )r*   r?   s     r   Úreset_stateÚFBCHeadBlockHook.reset_state�   s   € Ø×Ñ× Ñ Ô"Øˆr   rU   r0   c                 ó&  • U R                   R                  5       nUR                  c  gUR                  nX-
  R                  5       R	                  5       nUR                  5       R	                  5       nXE-  R                  5       nX`R                  :„  $ r#   )r6   rL   r'   ÚabsÚmeanÚitemr   )r*   rU   rV   Úprev_hidden_states_residualÚabsmeanÚprev_hidden_states_absmeanÚdiffs          r   rM   Ú1FBCHeadBlockHook._should_compute_remaining_blocks…   s�   € à×)Ñ)×3Ñ3Ó5ˆØ×+Ñ+Ñ3ØØ&2×&FÑ&FÐ#Ø)ÑG×LÑLÓN×SÑSÓUˆØ%@×%DÑ%DÓ%F×%KÑ%KÓ%MÐ"ØÑ4×:Ñ:Ó<ˆØ—n‘nÑ$Ð$r   )r9   r6   r   N)r   r   r   r   Ú_is_statefulr   r   r%   rA   ÚtorchÚnnÚModulerY   r\   ÚcompilerÚdisableÚTensorÚboolrM   r   r   r   r   r4   r4   A   sj   † Ø€Lð lð ¸uô ò
ð
1 %§(¡(§/¡/ô 1òfð ‡^�^×Ñð%ÀuÇ|Á|ð %ÐX\ó %ó ó%r   r4   c                   ót   ^ • \ rS rSrS	S\S\4U 4S jjjrS rS\R                  R                  4S jrSrU =r$ )
ÚFBCBlockHooké‘   r6   Úis_tailc                 óH   >• [         TU ]  5         Xl        X l        S U l        g r8   )r$   r%   r6   rr   r9   )r*   r6   rr   r+   s      €r   r%   ÚFBCBlockHook.__init__’   s    ø€ Ü‰ÑÔØ*ÔØŒØˆ�r   c                 óf   • [        U5      n[        R                  " UR                  5      U l        U$ r8   r<   r>   s      r   rA   ÚFBCBlockHook.initialize_hook˜   rC   r   r?   c                 óæ  • U R                   R                  SX#5      nS nU R                   R                  b  U R                   R                  SX#5      nU R                  R	                  5       nUR
                  (       a®  U R                  R                  " U0 UD6nU R                  (       a  S =p‰[        U[        5      (       aQ  XpR                   R                     UR                  S   -
  nXpR                   R                     UR                  S   -
  n	OXvR                  -
  nX‰4Ul        U$ Uc  Un
U
$ S S /n
XJU R                   R                  '   XZU R                   R                  '   [        U
5      n
U
$ )NrE   rW   r   r   )r9   rF   rN   r6   rL   r)   rG   rH   rr   rI   rJ   rK   r&   r(   )r*   r?   rP   rQ   rR   Úoriginal_encoder_hidden_statesrV   rS   rU   Úencoder_hidden_states_residualrX   s              r   rY   ÚFBCBlockHook.new_forward�   sb  € Ø!%§¡×!OÑ!OÐP_ÐaeÓ!nÐØ)-Ð&Ø�>‰>×<Ñ<ÑHØ-1¯^©^×-[Ñ-[Ø'¨ó.Ð*ð ×)Ñ)×3Ñ3Ó5ˆà×&×&Ø—[‘[×1Ò1°4ÐB¸6ÑBˆFØ�|�|ØJNÐNÐ&Ü˜f¤e×,Ñ,àŸ~™~×HÑHÑIÈL×LjÑLjÐklÑLmÑmð +ð Ÿ~™~×PÑPÑQÐT`×TrÑTrÐstÑTuÑuñ 3ð .4×6TÑ6TÑ-TÐ*Ø5KÐ4l�Ô1ØˆMà)Ñ1Ø2ˆMð Ðð	 " 4˜LˆMØG]˜$Ÿ.™.×CÑCÑDØOm˜$Ÿ.™.×KÑKÑLÜ! -Ó0ˆMØÐr   )r9   rr   r6   ©F)r   r   r   r   r   rn   r%   rA   rh   ri   rj   rY   r   r1   r2   s   @r   rp   rp   ‘   s9   ø† ñ lð ¸T÷ ð òð
! %§(¡(§/¡/÷ !ò !r   rp   r?   Úconfigr0   c                 ól  • [        [        S0 5      n/ nU R                  5        Hf  u  pEU[        ;  d)  [	        U[
        R                  R                  5      (       d  M:  [        U5       H  u  pgUR                  U SU 3U45        M     Mh     UR                  S5      u  p‰UR                  S5      u  p«[        R                  SU S35        [        X’UR                  5        U H)  u  pG[        R                  SU S35        [        Xr5        M+     [        R                  SU
 S35        [        X²S	S
9  g)aC  
Applies [First Block
Cache](https://github.com/chengzeyi/ParaAttention/blob/4de137c5b96416489f06e43e19f2c14a772e28fd/README.md#first-block-cache-our-dynamic-caching)
to a given module.

First Block Cache builds on the ideas of [TeaCache](https://huggingface.co/papers/2411.19108). It is much simpler
to implement generically for a wide range of models and has been integrated first for experimental purposes.

Args:
    module (`torch.nn.Module`):
        The pytorch module to apply FBCache to. Typically, this should be a transformer architecture supported in
        Diffusers, such as `CogVideoXTransformer3DModel`, but external implementations may also work.
    config (`FirstBlockCacheConfig`):
        The configuration to use for applying the FBCache method.

Example:
    ```python
    >>> import torch
    >>> from diffusers import CogView4Pipeline
    >>> from diffusers.hooks import apply_first_block_cache, FirstBlockCacheConfig

    >>> pipe = CogView4Pipeline.from_pretrained("THUDM/CogView4-6B", torch_dtype=torch.bfloat16)
    >>> pipe.to("cuda")

    >>> apply_first_block_cache(pipe.transformer, FirstBlockCacheConfig(threshold=0.2))

    >>> prompt = "A photo of an astronaut riding a horse on mars"
    >>> image = pipe(prompt, generator=torch.Generator().manual_seed(42)).images[0]
    >>> image.save("output.png")
    ```
r   Ú.r   éÿÿÿÿzApplying FBCHeadBlockHook to 'Ú'zApplying FBCBlockHook to 'z%Applying FBCBlockHook to tail block 'T)rr   N)r   r    Únamed_childrenr   rI   rh   ri   Ú
ModuleListÚ	enumerateÚappendÚpopÚloggerÚdebugÚ_apply_fbc_head_block_hookr   Ú_apply_fbc_block_hook)r?   r|   r6   Úremaining_blocksÚnameÚ	submoduleÚindexÚblockÚhead_block_nameÚ
head_blockÚtail_block_nameÚ
tail_blocks               r   Úapply_first_block_cacher“   Á   s  € ôB !Ô!4°b¸"Ó=€MØÐà!×0Ñ0Ö2‰ˆØÔ9Ó9ÄÈIÔW\×W_ÑW_×WjÑWj×AkÑAkÙÜ% iÖ0‰LˆEØ×#Ñ#¨ v¨Q¨u¨gÐ%6¸Ð$>Ö?ó 1ñ 3ð #3×"6Ñ"6°qÓ"9Ñ€OØ"2×"6Ñ"6°rÓ":Ñ€Oä
‡L�LÐ1°/Ð1BÀ!ÐDÔEÜ˜z¸&×:JÑ:JÔKã'‰ˆÜ�‰Ð1°$°°qÐ9Ô:Ü˜eÖ3ñ (ô ‡L�LÐ8¸Ð8IÈÐKÔLÜ˜*¸TÓBr   rŽ   r6   r   c                 ór   • [         R                  " U 5      n[        X5      nUR                  U[        5        g r8   )r   Úcheck_if_exists_or_initializer4   Úregister_hookÚ_FBC_LEADER_BLOCK_HOOK)rŽ   r6   r   ÚregistryÚhooks        r   rˆ   rˆ   ù   s-   € Ü×9Ò9¸%Ó@€HÜ˜MÓ5€DØ×Ñ˜4Ô!7Õ8r   rr   c                 ór   • [         R                  " U 5      n[        X5      nUR                  U[        5        g r8   )r   r•   rp   r–   Ú_FBC_BLOCK_HOOK)rŽ   r6   rr   r˜   r™   s        r   r‰   r‰   ÿ   s,   € Ü×9Ò9¸%Ó@€HÜ˜Ó/€DØ×Ñ˜4¤Õ1r   r{   )Údataclassesr   rh   Úutilsr   Úutils.torch_utilsr   Ú_commonr   Ú_helpersr	   Úhooksr
   r   r   r   r   r†   r—   r›   r   r    r4   rp   ri   rj   r“   r   rˆ   rn   r‰   r   r   r   Ú<module>r¢      sö   ðõ "ã å Ý -Ý 7Ý .ß CÓ Cñ 
�HÓ	€à0Ð Ø"€ð ÷ð ó ðô$#˜)ô #ôM%�yô M%ô`-�9ô -ð`5C E§H¡H§O¡Oð 5CÐ=Rð 5CÐW[ô 5Cðp9 e§h¡h§o¡oð 9Àlð 9Ð_dð 9Ðimô 9ñ2 §¡§¡ð 2Àð 2ÐX\ð 2Ðimö 2r   