o
    Tim                     @   s   d dl mZmZmZ d dlmZ d dlZd dlmZm	Z	 ddl
mZ de	fdd	Zde	fd
dZg di fde	dededef dee dee f
ddZg di fde	dededef dee def
ddZdededefddZdede	dee fddZdS )    )CallableAnyList)defaultdictN)NodeGraph   )get_last_usesgraphc                 C   s&   | j D ]}|jdkr|  S qtd)NoutputzNo output node found)nodestarget
ValueError)r
   v r   H/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/compile/fx.pyget_output_node   s
   

r   c                    sf   dd | j D }dd | j D }|| }t }i  |D ]}|| fdd}| |j< q|  |S )Nc                 S   s   g | ]	}|j d kr|qS placeholderop.0nr   r   r   
<listcomp>       z(move_primals_to_head.<locals>.<listcomp>c                 S   s   g | ]	}|j d kr|qS r   r   r   r   r   r   r      r   c                    s
    | j  S Nname)r   envr   r   <lambda>    s   
 z&move_primals_to_head.<locals>.<lambda>)r   r   	node_copyr   lint)r
   primalsnon_primals	all_nodes	new_graphnodenew_noder   r   r   move_primals_to_head   s   r*   r(   fn.
extra_argsreturnc                 C   s   g }|  |= dd |jD }|D ])}| jd||ft| |d}	| D ]	\}
}||	j|
< q&|||	 ||	 qW d    |S 1 sGw   Y  |S )Nc                 S   s   g | ]	}t |tr|qS r   )
isinstancer   )r   argr   r   r   r   0   r   z$add_args_process.<locals>.<listcomp>call_functionr   )inserting_beforeargscreate_nodetupleitemsmetareplace_input_withappend)r
   r(   r+   r,   r   r6   	new_nodestarget_argsr/   r)   kr   r   r   r   add_args_process'   s   


r<   c                 C   s   |  |F |f}|D ]}||f7 }q|j }| jd||i |d}	i }
|D ]}||	kr2||	f|
|< q&|
 D ]\}\}}||| q7W d    n1 sNw   Y  | D ]	\}}||	j|< qW|	S )Nr0   r   )inserting_afteruserskeysr3   r5   r7   r6   )r
   r(   r+   r,   r   r6   r2   a
node_usersr)   r>   uold_innew_inr;   r   r   r   r   add_postprocess<   s$   
rE   ds_idcommc                 C   s*   | j ||d}d| jv r| jd |d< |S )N)
param_namerF   rG   tensor_meta)r   r6   )r(   rF   rG   r6   r   r   r   _make_node_metaW   s   
rJ   graph_idactivation_node_namesc              	      s  t |\}}tfdd|jD i }i |jD ],}|jtjjjjkr1|j	d }|||j	d < q|jtjjj
jkrE|j	d }||| < qtfddD tt}	| D ]\}}
|	|
 | qYdtdtfd	d
 dttj fdd}|	 D ]E\}
} fdd|D }t|dkrq|ddd |D  }||
 |f}|jdtjjjj|i |d W d    n1 sw   Y  q|d S )Nc                    s$   g | ]}|j d kr|j v r|qS r   )r   r   r   )rL   r   r   r   `   s   $ z(add_free_activations.<locals>.<listcomp>r      c                 3   s$    | ]}| v r | n|V  qd S r   r   r   )node_to_wait_reloadr   r   	<genexpr>m   s   " z'add_free_activations.<locals>.<genexpr>r(   r-   c                 S   s    t | dsdS d| jvrdS dS )Nr6   FrI   T)hasattrr6   )r(   r   r   r   _should_frees   s
   

z*add_free_activations.<locals>._should_freetensorsc                 S   s2   | D ]}|  dkrtjdg|j|jd|_qd S )Ni r   )devicedtype)numeltorchemptyrS   rT   data)rR   r@   r   r   r   free_tensorsz   s
   z*add_free_activations.<locals>.free_tensorsc                    s    g | ]}|v r |r|qS r   r   )r   an)rQ   activation_nodes_setr   r   r      s     free_activations_c                 S   s   g | ]}|j qS r   r   r   r   r   r   r      s    r0   r   )r	   setr   r   rV   opsdcreload_tensordefaultr2   wait_reloadr   listr5   r8   r   boolr   Tensorlenr=   r3   rY   )rK   r
   rL   node_to_last_use_offload_id_to_noder(   offload_act
offload_idlast_user_to_uses	last_userrY   
used_nodesactivation_args	node_namer2   r   )rQ   rL   r[   rN   r   add_free_activations^   s:   


rq   )typingr   r   r   collectionsr   rV   torch.fxr   r   utilr	   r   r*   intr<   rE   rd   rJ   strrq   r   r   r   r   <module>   sB   



