o
    ٷis                     @   s  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
 d dlmZ e
eZd	e jjeB d
ede jjfddZde jjde jjfddZde jjeB d
eddfddZde jjdefddZde jjdefddZde jjdefddZde jjdefddZdS )    N)
ModelMixin   )ParallelismBackend)ParallelismConfig)maybe_empty_cache)init_logger)ENVtransformerparallelism_configreturnc                 C   s$  t | tjjtfsJ dt|  t| ddrtd | S ddl	m
} || |d} t| |d g }|jd ur?|jd	g }|r|D ]F}t|rZt|sZdd
lm} |||d qCt|rut|suddlm} |||d t||d qCt|rt|sddlm} |||d qC|| _t  | S )NzJtransformer must be an instance of torch.nn.Module or ModelMixin, but got _is_parallelizedFzGThe transformer is already parallelized. Skipping parallelism enabling.r   )(maybe_enable_parallelism_for_transformer)r	   r
   )moduler
   extra_parallel_modules))maybe_enable_parallelism_for_text_encoder)text_encoderr
   )'maybe_enable_parallelism_for_controlnet)
controlnetr
   ))maybe_enable_parallelism_for_auto_encoder)auto_encoderr
   )
isinstancetorchnnModuler   typegetattrloggerwarningtransformersr   #_maybe_set_module_attention_backendparallel_kwargsget_is_text_encoderr   text_encodersr   _is_controlnetcontrolnetsr   _is_auto_encoderautoencodersr   _extra_parallel_modulesr   )r	   r
   r   r   r   r   r   r    r)   R/home/ubuntu/.local/lib/python3.10/site-packages/cache_dit/parallelism/dispatch.pyenable_parallelism   sd   

r+   r   c                 C   sb   t | dds| S dtjjdd fdd}||  t| ds| S t | dg }|D ]}|| q&| `| S )Nr   Fr   r   c                 S   s$   t | dr| `t | dr| `d S d S )Nr   _parallelism_config)hasattrr   r,   r   r)   r)   r*   _remove_parallel_statsc   s
   

z8remove_parallelism_stats.<locals>._remove_parallel_statsr(   )r   r   r   r   r-   r(   )r   r/   r   extra_moduler)   r)   r*   remove_parallelism_stats\   s   

r1   c                 C   s   | j j}t| drPt| trR|jdd }|d u r1|jtj	kr/| 
d td| d d S d S tjs=ddlm} |  | 
| td| d	| d
 d S d S d S )Nset_attention_backendattention_backendnativez<attention_backend is None, set default attention backend of z# to native for context parallelism.r   )$_maybe_register_custom_attn_backendsz>Found attention_backend from config, set attention backend of z to: .)	__class____name__r-   r   r   r    r!   backendr   NATIVE_DIFFUSERr2   r   r   r   -CACHE_DIT_ENABLE_CUSTOM_ATTN_ALREADY_DISPATCH	attentionr5   info)r   r
   module_cls_namer3   r5   r)   r)   r*   r   x   s0   

r   c                 C      | j j}|dS )Nr   r7   
__module__
startswithr   _import_moduler)   r)   r*   r"         
r"   c                 C   r?   )Nzdiffusers.models.controlnetr@   rC   r)   r)   r*   r$      rE   r$   c                 C   r?   )Nzdiffusers.models.autoencoderr@   rC   r)   r)   r*   r&      rE   r&   c                 C   s   t | ddS )Nr   F)r   r.   r)   r)   r*   r      s   r   )r   diffusers.models.modeling_utilsr   r9   r   configr   cache_dit.utilsr   cache_dit.loggerr   cache_dit.envsr   r8   r   r   r   r+   r1   r   boolr"   r$   r&   r   r)   r)   r)   r*   <module>   s>    

O


'