o
    ٷia                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZmZ ddlmZ ddlmZ ddlmZ d d	lmZ eeZG d
d dZejG dd dZdS )    N)Iterable)AnyTupleListOptionalUnion)DiffusionPipeline
ModelMixin   )PatchFunctor)ForwardPattern)ParamsModifier)init_loggerc                   @   s*   e Zd Z	ddeejjeB  fddZdS )FakeDiffusionPipelineNtransformerc                 C   s
   || _ d S Nr   selfr    r   c/home/ubuntu/.local/lib/python3.10/site-packages/cache_dit/caching/block_adapters/block_adapters.py__init__   s   
zFakeDiffusionPipeline.__init__r   )	__name__
__module____qualname__r   torchnnModuler	   r   r   r   r   r   r      s
    r   c                   @   s  e Zd ZU dZeeeef ed< dZ	ee
jjee
jj f ed< dZee
jjee
jj eee
jj  f ed< dZeeee eee  f ed< ejedZeeee eee  f ed< ejedZeee eee  f ed< dZeeee eee  f ed	< dZeeeee eee  f  ed
< dZee ed< dZeed< dZee  ed< dZ!eed< dZ"eed< ejdd dZ#ee ed< dZ$eed< ejdd dZ%ee ed< dZ&eed< ejddddgidZ'eed< dZ(eed< dd  Z)d!d" Z*d#d$ Z+d%d& Z,d'd( Z-e.	)	 	*	 dOd+d,Z/e.d)d d*efd-d.Z0e.g d/d0gddfde
jjdee dee deded*e1e
jjef fd1d2Z2e.de
jjd*ee
jj fd3d4Z3e.d5e
jjd	ed*efd6d7Z4e.	dPd8e
jjd	ed9ed*efd:d;Z5e.	dPd)d d<ed*d fd=d>Z6e7dQd?d@Z8e7dQdAdBZ9e7d)d d*efdCdDZ:e7d)ed*efdEdFZ;e7d)ed*efdGdHZ<e7dIefdJdKZ=e7dLee d*ee fdMdNZ>dS )RBlockAdapterNpiper   blocksblocks_name)default_factoryunique_blocks_namedummy_blocks_namesforward_patternparams_modifierscheck_forward_patternFcheck_num_outputspatch_functorhas_separate_cfgautoc                   C   s   g dS )N)r   single_transformerr    layerssingle_stream_blocksdouble_stream_blocksr   r   r   r   r   <lambda>c   s    zBlockAdapter.<lambda>allow_prefixesTcheck_prefixesc                   C   s   dgS )NTransformerBlockr   r   r   r   r   r0   m   s    allow_suffixescheck_suffixesmaxallowed_valuesmin)defaultmetadatablocks_policyskip_post_initc                 C   sJ   | j rd S |   t| jd u| jd ufr#|   |   |   d S d S r   )r<   maybe_fake_pipeanyr   r   maybe_fill_attrsmaybe_patchifymaybe_skip_checksr   r   r   r   __post_init__v   s   zBlockAdapter.__post_init__c                 C   s$   | j d u rt | _ td d S d S )Nz0pipe is None, use FakeDiffusionPipeline instead.)r   r   loggerwarningrB   r   r   r   r=      s   
zBlockAdapter.maybe_fake_pipec                 C   s   | j d u rP| jd urP| | jdkr| j}n| | jdkr$| jd }ntd| | j |jdrCd| _ td|j d nd| _ td	|j d
 t| jdd d urft	d d| _ d| _
d S t| jdd d ur|t	d d| _ d| _
d S d S )Nr      8transformer nested depth can't more than 1, current is: 	diffusersTz"Found transformer from diffusers: z) enable check_forward_pattern by default.Fz&Found transformer NOT from diffusers: z* disable check_forward_pattern by default._hf_hookz/_hf_hook is not None, force skip pattern check!_diffusers_hookz6_diffusers_hook is not None, force skip pattern check!)r'   r   nested_depth
ValueErrorr   
startswithrD   infogetattrrE   r(   r   r   r   r   rA      s:   






zBlockAdapter.maybe_skip_checksc                    s  j d urΈjd urЈjd u rdd  j dkrLjdkr, j j_njdkrA fddjD _ntdj j dkrjdkrxtj tjkshJ  fddtj jD _nJjd	krtj tjksJ g _ttjD ]j fd
dj D  qntdj tdj  t	
dj d d S d S d S d S )Nc                 S   sv   t | }t|tjjsJ d }|D ]}t| |d  }d ur0t|tjjr0t|t|kr0|} nq|d us9J d|S )Nz-No blocks_name match, please set it manually!)dir
isinstancer   r   
ModuleListrO   id)r   r    
attr_namesr!   	attr_nameattrr   r   r   _find   s   z,BlockAdapter.maybe_fill_attrs.<locals>._findr   rF   c                    s   g | ]} j |qS r   r   .0r    )rW   r   r   r   
<listcomp>   s    z1BlockAdapter.maybe_fill_attrs.<locals>.<listcomp>zPBlocks nested depth can't more than 1 if transformer is not a list, current is: c                    s   g | ]	\}} ||qS r   r   )rY   r   r    )rW   r   r   rZ      s    r
   c                    s   g | ]
} j  |qS r   r   rX   rW   ir   r   r   rZ      s    zMBlocks nested depth can only be 1 or 2 if transformer is a list, current is: rG   zAuto fill blocks_name: .)r   r    r!   rK   rL   lenziprangeappendrD   rN   rB   r   r[   r   r?      sL   




zBlockAdapter.maybe_fill_attrsc                 O   s   | j d ure| jd urJ| | jdkr"| j j| jg|R i | d S | | jdkr?| jD ]}| j j|g|R i | q-d S td| | j t| jdsTJ d| j j| jjg|R i | d S d S )Nr   rF   rG   r   zXpipe.transformer can not be None when patch_functor is provided and transformer is None.)r)   r   rK   applyrL   hasattrr   )r   argskwargsr   r   r   r   r@      s$   

 

"zBlockAdapter.maybe_patchifyadapterreturnc              
   C   s   | j sJ d| jd usJ d| jd usJ d| j}t|tr%tdt|ds.J d|j}tj	|| j
| j| j| j| j| j| jd\}}t||||| jdS )	Nz^Please manually set `auto` to True, or, manually set all the transformer blocks configuration.zadapter.pipe can not be None.z(adapter.forward_pattern can not be None.z5Can not auto block adapter for FakeDiffusionPipeline.r   z!pipe.transformer can not be None.)r   r1   r4   r2   r5   r;   r%   r(   )r   r   r    r!   r%   )r+   r   r%   rQ   r   rL   rc   r   r   find_match_blocksr1   r4   r2   r5   r;   r(   )rf   r   r   r    r!   r   r   r   auto_block_adapter   s6   

zBlockAdapter.auto_block_adapterc                    s   t  ddrdS dtf fdd}|dsdS |dsdS |d	s#dS |d
s)dS |ds/dS t jdkr; j}nt jd }t|tjj	sQt
d dS dS )N_is_normlizedFTrV   c                    s(   t  | d d u rt|  d dS dS )Nz	 is None!FT)rO   rD   rE   )rV   rf   r   r   _check_warning$  s   z8BlockAdapter.check_block_adapter.<locals>._check_warningr   r   r    r!   r%   r   zblocks is not ModuleList.)rO   strr   rK   r    flattenrQ   r   r   rR   rD   rE   )rf   rl   r    r   rk   r   check_block_adapter  s(   
z BlockAdapter.check_block_adapter)transformer_blockssingle_transformer_blocksr    r-   r.   r/   r3   c                    s  |rg }t | D ]}|D ]}||r|| qqnt | }g }	g }
|dd }|D ]X}t| |d  }d urt|tjjr|d }|j	j
 t|tjjrt fdd|D sZ|s|d urwtj||fddi|rv|	| |
t| q+|	| |
t| q+|	std|	d }|
d }|dd	}t|	|
D ]0\}}t| |}td
| d|d j	j
 d|  |d	kr||k r|}|}q||kr|}|}qt| |}td| d|d j	j
 d| d| d	 ||fS )Nr%   r   c                 3   s    | ]}  |V  qd S r   )endswith)rY   allow_suffixblock_cls_namer   r   	<genexpr>l  s
    
z1BlockAdapter.find_match_blocks.<locals>.<genexpr>loggingFz@Auto selected transformer blocks failed, please set it manually.r;   r6   z"Auto selected transformer blocks: z	, class: z, num blocks: z#Final selected transformer blocks: z, block_policy: r]   )rP   rM   ra   poprO   rQ   r   r   rR   	__class__r   r   r>   r   match_blocks_patternr^   rL   getr_   rD   rN   )r   r1   r4   r2   r5   re   blocks_namesrU   prefixvalid_namesvalid_countr%   r!   r    block
final_namefinal_countblock_policycountfinal_blocksr   rt   r   rh   D  s   









zBlockAdapter.find_match_blocksc                 C   sT   g }t | D ]!}t| |d  }d ur't|tjjr't|d tjjr'|| q|S )Nr   )rP   rO   rQ   r   r   rR   r   ra   )r   total_blocksrV   r    r   r   r   find_blocks  s   
zBlockAdapter.find_blocksr   c                 K   s   | ddsdS |jr|t v sJ d| dt| dr)t| jtjj	r)| j} t
t| jj }d}d}| ddrWtt| jjd}|dkrWt|j|krWd	}|jD ]}||vrbd	}qZ|of|S )
Nr'   TPattern  is not support now!r   r(   ztorch.Tensorr   F)r{   	Supportedr   supported_patternsrc   rQ   r   r   r   r   setinspect	signatureforward
parameterskeysrm   return_annotationr   r^   OutIn)r   r%   re   forward_parameters
in_matchedout_matchednum_outputsrequired_paramr   r   r   match_block_pattern  s0   


z BlockAdapter.match_block_patternrp   rw   c                 K   s   | dds|rtd|  dS |jr|t v s#J d| dt| tjj	s,J g }| D ]}|
tj||fi | q0t|}|rs|rsdd | D }tt|}t|dkr_|d	 }td
| d| d|j d|j d	 |S )Nr'   TzSkipped Forward Pattern Check: r   r   c                 S   s   g | ]}|j jqS r   )ry   r   )rY   r   r   r   r   rZ     s    z5BlockAdapter.match_blocks_pattern.<locals>.<listcomp>rF   r   zMatch Block Forward Pattern: z, z
IN:z, OUT:))r{   rD   rE   r   r   r   rQ   r   r   rR   ra   r   r   alllistr   r^   rN   r   r   )rp   r%   rw   re   pattern_matched_statesr   pattern_matchedblock_cls_namesr   r   r   rz     sD   
z!BlockAdapter.match_blocks_patternuniquec                    s   t  ddr S t jdkr jg _dtf fdd}| j _| j _| j _| j _| j	 _	|rCt
  d _ S )N_is_normalizedFr   rV   c                    s   | }| d u r|S t | dkr| gg}n*t | dkr>| r2t| t jkr.dd | D }n| g}ndd tt jD }t jt|ksIJ |S )Nr   rF   c                 S   s   g | ]}|gqS r   r   )rY   ar   r   r   rZ     s    zCBlockAdapter.normalize.<locals>._normalize_attr.<locals>.<listcomp>c                 S   s   g | ]}g qS r   r   )rY   _r   r   r   rZ     s    )r   rK   r^   r   r`   )rV   normalized_attrrk   r   r   _normalize_attr  s   
z/BlockAdapter.normalize.<locals>._normalize_attrT)rO   r   rK   r   r   r    r!   r%   r$   r&   r   r   )rf   r   r   r   rk   r   	normalize  s   

zBlockAdapter.normalizec                 C   s  t t|jD ]"}t|j| t|j| ksJ t|j| t|j| ks)J qt|jdkrPt t|jD ]}|jdd t|j| |j| D  q8nt|jt|jks\J t t|jD ]&}t|j| |j| D ]\}}t	j
|||j|jdsJ dt  qpqcd S )Nr   c                 S   s&   g | ]\}}| d t t| qS )r   )hashrS   )rY   r    namer   r   r   rZ   7  s    z'BlockAdapter.unique.<locals>.<listcomp>)r%   r(   r'   z3No block forward pattern matched, supported lists: )r`   r^   r    r!   r%   r#   r   ra   r_   r   rz   r(   r'   r   r   )clsrf   r\   r%   r    r   r   r   r   ,  s:    "zBlockAdapter.uniquec                 C   s   t |dds
tdd S )Nr   Fz!block_adapter must be normailzed.)rO   RuntimeErrorr   rf   r   r   r   assert_normalizedO  s   zBlockAdapter.assert_normalizedc                 C   s   t |ddS )Nr   F)rO   r   r   r   r   is_normalizedT  s   zBlockAdapter.is_normalizedc                 C   s   t || r| | tt|jddt|jd ddfS t |ttjj	fr+t|ddS t |t
rCt |d tjj	s;J t|d ddS t|ddS )N
_is_cachedFr   )rQ   r   r   rO   r   r   r   r   r   r   r   r   r   r   r   	is_cachedX  s    



zBlockAdapter.is_cachedc                 C   s   t || r| | t|jd ddS t |trt|jddS t |tjjr,t|ddS t |trDt |d tjjs<J t|d ddS t|ddS )Nr   _is_parallelizedF)	rQ   r   rO   r   r   r   r   r   r   r   r   r   r   is_parallelizedm  s   



zBlockAdapter.is_parallelizedobjc                 C   sx   t ttjjtjjtjf}t||rdS t|tsdS t|t	r$|
 }n|}d}|D ]}| |}||kr7|}q*d| S )Nr   rF   )rm   bytesr   r   rR   r   TensorrQ   r   dictvaluesrK   )r   r   
atom_typesitems	max_depthitemcurrent_depthr   r   r   rK   |  s(   




zBlockAdapter.nested_depthrV   c                 C   sh   t ttjjtjjtjf}t|ts|S g }|D ]}t|tr,t||s,|	| 
| q|| q|S r   )rm   r   r   r   rR   r   r   rQ   r   extendrn   ra   )r   rV   r   	flattenedr   r   r   r   rn     s   
zBlockAdapter.flatten)rf   r   rg   r   )T)rf   r   )?r   r   r   r   r   r   r   r   __annotations__r   r   r   r   r   r    rR   r!   rm   dataclassesfieldr   r#   r$   r%   r   r&   r   r   r'   boolr(   r)   r   r*   r+   r1   r2   r4   r5   r;   r<   rC   r=   rA   r?   r@   staticmethodri   ro   r   rh   r   r   rz   r   classmethodr   r   r   r   r   rK   rn   r   r   r   r   r      s8  
 







	
	



"7%'	
]
&)," r   )r   r   r   collections.abcr   typingr   r   r   r   r   rH   r   r	   patch_functorsr   r%   r   params_modifierr   cache_dit.loggerr   r   rD   r   	dataclassr   r   r   r   r   <module>   s    	