o
    Ti	                     @   s  U d dl mZmZmZmZ d dlZd dlmZ d dlZd dl	m
Z
mZ ddlmZmZ ddlmZ eeaeeeeef f ed< e aee ed	< d
efddZded
efddZde
dedeeeef  dee deded
e
fddZde
dedee deded
e
fddZdS )    )ListDictSetTupleN)defaultdict)GraphNode   )get_output_nodemove_primals_to_head)DSGraphParamManagervalue_to_idused_idsreturnc                  C   s2   dd } |  }|t v r|  }|t v st | |S )Nc                   S   s   t ddS )Ni'  l        )randomrandint r   r   _/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/compile/passes/offload_activation.py_gen   s   zget_random_id.<locals>._gen)r   add)r   vr   r   r   get_random_id   s   
r   nodec                 C   s    t | dsdS d| jvrdS dS )NmetaFtensor_metaT)hasattrr   )r   r   r   r   _should_offload"   s
   

r   graphgraph_idnodes_to_offload_with_namesgraph_order
mem_budgetparam_managerc                 C   s<  t |j}dd l}|| }|t| |D ]|\}	}
|
j|v r!qt|
s&qt }| 	|
  | j
dtjjjj|
||fi d|
j d| d}W d    n1 sQw   Y  | 	|  | j
dtjjjj|||fi d|
j d| d}W d    n1 s~w   Y  t| }||
| |t| |	< qt| } |   | S )Nr   call_functionoffload__name
wait_copy_)setparam_namescopydeepcopy
erase_noder
   r'   r   r   inserting_aftercreate_nodetorchopsdcoffload_tensordefaultwait_offloadreplace_input_withr   r   lint)r   r   r   r    r!   r"   r*   r+   cl_graphr'   r   val_idoffload_node	wait_nodeoutput_noder   r   r   offload_activation_fwd+   s8   


r=   c                    s  t | }dd | jD   fdd| D }i }|D ]}| jD ]}	||	jv r-|	||<  nq q|D ]}	||	j }
| ||	   | jdtjj	j
j|	||
fi d|	j d|
 d}W d    n1 sbw   Y  | |  | jdtjj	jj|||
fi d	|	j d|
 d}W d    n1 sw   Y  i }|	j D ]}||kr|	|f||< q| D ]\}\}}||| qq1t| } |   | S )
Nc                 S   s   i | ]}|j |qS r   r&   .0nr   r   r   
<dictcomp>T       z)reload_activation_bwd.<locals>.<dictcomp>c                    s   g | ]} | qS r   r   r>   name_to_noder   r   
<listcomp>U   rB   z)reload_activation_bwd.<locals>.<listcomp>r#   reload_r%   r&   r(   )r   nodeskeysargsr'   inserting_beforer/   r0   r1   r2   reload_tensorr4   r.   wait_reloadusersitemsr6   r   r7   )r   r   r    r!   r"   graph_value_to_id	act_nodesnode_to_first_useractr   r9   reload_noder;   rM   uold_innew_inr   rC   r   reload_activation_bwdP   sH   


rW   )typingr   r   r   r   r   collectionsr   r0   torch.fxr   r   fxr
   r   graph_paramr   dictr   intstr__annotations__r)   r   r   boolr   floatr=   rW   r   r   r   r   <module>   s2    	
%