U
    <c^                  	   @   s  d dl Z d dlZd dlmZmZmZmZ d dlZd dlm	Z
 d dlm	  mZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dlm Z! dd Z"dd Z#dd Z$ej%j&ee edddZ'ej%j&ee( dddZ)ej%j&eee(  ddddZ*e(e(dddZ+G dd dZ,ej%j&dd  Z-ej%j&d!d" Z.ej%j&d#d$ Z/ej%j&e0d%d&d'Z1ej%j&e0e0ed(d)d*Z2ej%j&d+d, Z3ej%j&ee ed-d.d/Z4ej%j&ee ee d-d0d1Z5ej%j&d2d3 Z6ej%j&d4d5 Z7ej%j&ee0ed6d7d8Z8ej%j&e0e0ed(d9d:Z9ej%j&eed;d<d=Z:G d>d? d?ej%j;Z<ej%j=ee ee d-d@dAZ>ej%j&ee ed-dBdCZ?G dDdE dEZ@G dFdG dGZAej%j&G dHdI dIZBej%jCG dJdK dKejDjEZFG dLdM dMej%j;ZGdNdO ZHdPdQ ZIej%j&eeB e(ddRdSZJej%j&eeF eddTdUZKG dVdW dWZLdXdY ZMej%j&eNdZdZgeNd[d[gfd\d]ZOej%j&eNd^d^gd_d^fee0e(ee0e(d`dadbZPej%j&dcdd ZQej%j&e0eeef ee0ef dedfdgZRej%j&e0eeef ee0ef dedhdiZSej%j&e0eeef ee0ef dedjdkZTG dldm dmZUej%j=e(eFdndodpZVej%j&e(eFdndqdrZWej%j&eeF eedsdtduZXej%j&ee eYddvdwZZej%j&ee e0ddxdydzZ[ej%j&eeed{d|d}Z\ej]j^ej%j&e0eeee d~ddZ_ej]j^ej%j&edddZ`dd ZaG dd de,e@eLeUeAeZbdS )    N)DictListTupleAny)Tensor)record_function)RRef)RPCExecMode_build_rpc_profiling_key)Future)TemporaryFileName)	dist_initget_function_eventinitialize_pgworker_name)RpcAgentTestFixture)profilec                 C   s   t |  |S N)
isinstancelocal_value)rrefZcls_to_check r   X/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/distributed/rpc/jit/rpc_test.pyrref_isinstance   s    r   c                 C   s   t |  d S r   )timesleep)tr   r   r   r      s    r   c                 C   s   t j| tjtdddfdS N      args)rpcremotetorchaddones)dstr   r   r   rpc_return_rref!   s    r(   r   returnc                 C   s   |   S r   )r   r   r   r   r   rref_local_value%   s    r,   r*   c                  C   s   dddg} | S )Nr   r      r   )Zglobal_listr   r   r   list_create*   s    
r/   c                 C   s0   |   d |  d | dd d S )N      g      @   )r   appendto_herer+   r   r   r   rref_list_mutate0   s    r5   )valuer*   c                 C   s   | S r   r   r6   r   r   r   return_value7   s    r8   c                   @   s\   e Zd Zedd Zedd Zedd Zdd Zed	d
 Zedd Z	edd Z
dS )RRefAPITestc                 C   sP   t | jd | j }t|}tjjtt t	ddd}||}| 
|d d S )Nr   rref_varr*   c                 S   s   |   S r   )Zis_ownerr;   r   r   r   rref_tensor_is_ownerA   s    z<RRefAPITest.test_rref_is_owner.<locals>.rref_tensor_is_ownerF)r   rank
world_sizer(   r$   jitscriptr   r   boolassertEqual)selfdst_worker_namer;   r=   resr   r   r   test_rref_is_owner<   s    zRRefAPITest.test_rref_is_ownerc              	   C   s~   | j dkrd S t| j d | j }t|}| td t| W 5 Q R X t|t|f }}| 	|t
t
ddd d S )Nr   r   z3Can't call RRef.local_value\(\) on a non-owner RRefr   )r>   r   r?   r(   assertRaisesRegexRuntimeErrorr,   r"   rpc_syncrC   r$   r%   r&   rD   rE   r   retr   r   r   test_rref_local_valueH   s    
 z!RRefAPITest.test_rref_local_valuec                 C   s@   | j dkrd S t| j }t|tdi }t|}| |d d S )Nr   )r1   r1   )r>   r   r"   r#   r8   r,   rC   rK   r   r   r   test_local_rref_local_valueX   s    

z'RRefAPITest.test_local_rref_local_valuec                 C   s2   | j d | j }tjt|tjtdddfdS r   )r>   r?   r"   r#   r   r$   r%   zeros)rD   Z
owner_rankr   r   r   _create_rrefc   s      zRRefAPITest._create_rrefc                 C   s>   | j d | j }|  }tjt|t|fd}| |d d S Nr   r    T)r>   r?   rP   r"   rJ   r   script_check_rref_confirmedrC   )rD   dst_rankr   rL   r   r   r   test_user_rrefs_confirmedi   s      z%RRefAPITest.test_user_rrefs_confirmedc                 C   sB   | j d | j }|  }tjt|t|fd}| | d d S rQ   )	r>   r?   rP   r"   r#   r   rR   rC   r4   )rD   rS   r   Zret_rrefr   r   r    test_user_rrefs_confirmed_remoter   s      z,RRefAPITest.test_user_rrefs_confirmed_remotec              	   C   sR   t | jd | j }t|t}tj|t|fd | |	 ddddddg d S )Nr   r    r   r.   r0   r1   r2   )
r   r>   r?   r"   r#   r/   rJ   r5   rC   r4   )rD   r'   Z	list_rrefr   r   r   test_rref_list_mutate{   s    z!RRefAPITest.test_rref_list_mutateN)__name__
__module____qualname__r   rG   rM   rN   rP   rT   rU   rV   r   r   r   r   r9   ;   s   





r9   c                   C   s   dS Nr   r   r   r   r   r   no_arg   s    r[   c                 C   s   | d S Nr   r   r7   r   r   r   one_arg   s    r]   c                 C   s   t | t dS r\   )r$   r%   r&   )xr   r   r   script_add_ones   s    r_   )blockc              
   C   s2   t |  t| tdW  5 Q R  S Q R X d S r\   )r   r$   r%   r&   )r^   r`   r   r   r   $script_add_ones_with_record_function   s    
ra   )rE   r`   r*   c              	   C   s`   t d}t|D}t| t|f}t |}t| t|f}| |  | }W 5 Q R X |S r\   )r$   r&   r   r"   	rpc_asyncr_   Z
zeros_likewait)rE   r`   r   rfZfut1ZzeroZfut2rF   r   r   r   #record_function_on_caller_rpc_async   s    


re   c                 C   s   t jt| }t j|}|S r   )r$   r@   _forkr_   _wait)tensorfutr^   r   r   r   script_fork_wait_udf   s    rj   r:   c                 C   s   |   S r   )r4   r<   r   r   r   rref_to_here   s    rk   c                 C   s   | S r   r   r<   r   r   r   return_rref   s    rl   c                 C   s   |   dkrtd| d S )Nr   Expected errorr   )Znumel
ValueErrorr7   r   r   r   script_raise_func   s    ro   c                 C   s   t jt| }t j|}|S r   )r$   r@   rf   ro   rg   )Zinvalueri   r6   r   r   r   script_fork_wait_throw   s    rp   )handlerE   r*   c                 C   s2   t |ttdf}tjj| | | }|S r\   )	r"   rb   r]   r$   rh   opsprofiler_call_end_callbacks_on_jit_futrc   )rq   rE   ri   rL   r   r   r   call_rpc_with_profiling   s    ru   c                 C   s    t | ttd|f}| S r\   )r"   rb   ra   r$   rh   rc   )rE   r`   ri   r   r   r   )call_rpc_torchscript_with_record_function   s    rv   )rq   r*   c                 C   s0   t jtt d}t jj| | | }|S r\   )	r$   r@   rf   r]   rh   rr   rs   rt   rc   )rq   ri   rL   r   r   r   call_fork_with_profiling   s    rw   c                       s2   e Zd Z fddZejjedddZ  Z	S )MyScriptModuleWithRRefsc                    s2   t    g | _tdD ]}| jt| qd S )Nr0   )super__init__rrefsranger3   r(   )rD   Z
dst_worker_	__class__r   r   rz      s    
z MyScriptModuleWithRRefs.__init__r-   c                 C   s(   t dd}| jD ]}|| 7 }q|S Nr   )r$   r&   r{   r4   )rD   Z
res_tensorr   r   r   r   forward   s    
zMyScriptModuleWithRRefs.forward)
rW   rX   rY   rz   r$   r@   script_methodr   r   __classcell__r   r   r~   r   rx      s   rx   c                 C   s   | S r   r   r<   r   r   r   rref_python_annotation   s    r   c                 C   s   t |  S r   )r   r4   r<   r   r   r   rref_script_annotation   s    r   c                   @   s0   e Zd Zedd Zedd Zedd ZdS )RRefTypingTestc           	      C   s   | j d }|| j }ttdd}tjt| j ttddfd}tjt|t	|fd}| 
|| tjt|t|fd}| 
| | tjt|t	|fd}| 
| | tjt|t|fd}| 
|  | d S Nr   r   r    )r>   r?   r]   r$   r&   r"   r#   r   rJ   rk   rC   rl   r4   )	rD   nrS   	local_retr   rL   Zrref1Zrref2Zrref3r   r   r   test_rref_as_arg_and_return   s    

 z*RRefTypingTest.test_rref_as_arg_and_returnc                 C   sB   | j d }|| j }tt|}| }| |tddd  d S )Nr   r   	   )r>   r?   rx   r   rC   r$   r&   )rD   r   rS   Zmodule_with_rrefsrF   r   r   r    test_my_script_module_with_rrefs  s
    

z/RRefTypingTest.test_my_script_module_with_rrefsc                 C   sD   | j d }|| j }tt|}t|}| |tddd  d S )Nr   r   )r>   r?   r(   r   r   rC   r$   r&   )rD   r   rS   r;   rF   r   r   r   test_rref_python_annotation  s
    

z*RRefTypingTest.test_rref_python_annotationN)rW   rX   rY   r   r   r   r   r   r   r   r   r      s   

r   c                   @   s$   e Zd Zedd Zedd ZdS )FutureTypingTestc                 C   s   | j d | j }tddgtddgf}tjt|t|d}tddg}tjj	t
t tddd}| ||| tjj	ttttf t
t dd	d
}|||}| | | d S )Nr   r   r    
   )ri   r*   c                 S   s   |   S r   rc   ri   r   r   r   future_wait_in_script.  s    zYFutureTypingTest.test_future_passed_between_python_and_jit.<locals>.future_wait_in_script)rS   inputsr*   c                 S   s   t d| t|S )Nzworker{})r"   rb   formattwo_args_two_kwargs)rS   r   r   r   r   future_return_to_python4  s
      z[FutureTypingTest.test_future_passed_between_python_and_jit.<locals>.future_return_to_python)r>   r?   r$   rh   r"   rb   r   r   r@   rA   r   r   rC   intr   rc   )rD   rS   r   Zret_futexpected_resr   r   Zfut_resr   r   r   )test_future_passed_between_python_and_jit'  s     

z:FutureTypingTest.test_future_passed_between_python_and_jitc                    s   | j dkrd S t| j d | j  tdddt}tjjtt	 d fddtjj
t	dfdd}| }| || d S )	Nr   r   r   r-   c                     s   t  tjfi } | S r   )r"   rb   r$   r%   r   )rE   input_0input_1r   r   python_return_futureI  s    zLFutureTypingTest.test_future_python_annotation.<locals>.python_return_futurec                     s     } |   S r   r   r   )r   r   r   script_use_futureN  s    zIFutureTypingTest.test_future_python_annotation.<locals>.script_use_future)r>   r   r?   r$   r&   r%   r@   ignorer   r   rA   rC   )rD   r   r   rF   r   )rE   r   r   r   r   test_future_python_annotation?  s    
z.FutureTypingTest.test_future_python_annotationN)rW   rX   rY   r   r   r   r   r   r   r   r   &  s   
r   c                   @   s(   e Zd ZedddZedddZdS )MyScriptClassac                 C   s
   || _ d S r   r   )rD   r   r   r   r   rz   Y  s    zMyScriptClass.__init__r-   c                 C   s   | j S r   r   rD   r   r   r   	get_value\  s    zMyScriptClass.get_valueN)rW   rX   rY   r   rz   r   r   r   r   r   r   W  s   r   c                   @   s   e Zd ZedddZdS )MyModuleInterfacer-   c                 C   s   d S r   r   r   r   r   r   r   b  s    zMyModuleInterface.forwardN)rW   rX   rY   r   r   r   r   r   r   r   `  s   r   c                       sH   e Zd Z fddZejjedddZejjedddZ	  Z
S )MyScriptModulec                    s   t    t|| _d S r   )ry   rz   r$   r&   r   )rD   r>   r~   r   r   rz   h  s    
zMyScriptModule.__init__r-   c                 C   s   | j S r   r   r   r   r   r   r   l  s    zMyScriptModule.forwardc                 C   s   | j S r   r   r   r   r   r   custom_funcp  s    zMyScriptModule.custom_func)rW   rX   rY   rz   r$   r@   r   r   r   r   r   r   r   r~   r   r   g  s
   r   c                 C   s   t t| S r   )r"   r   r   r   r   r   r   !owner_create_rref_my_script_classu  s    r   c                 C   s   t jt| tdS )N)Z	type_hint)r"   r   r   r   r   r   r   r   "owner_create_rref_my_script_moduley  s    r   c                 C   s   |    S r   )r4   r   r+   r   r   r   %script_rref_get_value_my_script_class}  s    r   c                 C   s   |    S r   r4   r   r+   r   r   r   (script_rref_run_forward_my_script_module  s    r   c                   @   s<   e Zd Zedd Zedd Zedd Zedd Zd	S )
LocalRRefTestc                 C   s<   | j dkrd S tt| j }|  }| || j  d S rZ   )r>   r"   r   r   r4   r   rC   )rD   Zrref_script_classrL   r   r   r   )test_create_local_script_class_rref_in_py  s
    
z7LocalRRefTest.test_create_local_script_class_rref_in_pyc              	   C   sl   | j dkrd S tt| j t}|  }| |t	| j  | 
td tt| j }W 5 Q R X d S )Nr   z[The RRef being created contains a ScriptModule, must provide its ModuleInterface type hint.)r>   r"   r   r   r   r4   r   rC   r$   r&   rH   rI   )rD   Zrref_script_modulerL   r   r   r   *test_create_local_script_module_rref_in_py  s    
z8LocalRRefTest.test_create_local_script_module_rref_in_pyc                 C   s   | j dkrd S t| j d | j }tj|t| j fd}tt tddd}||}| 	|| j  t
j|}||}| 	|| j  d S )Nr   r   r    r)   c                 S   s*   | f}i }t |  t||}| }|S r   )r"   rb   ownerr   rc   r   r!   kwargsri   rL   r   r   r   use_rref_on_owner  s       zdLocalRRefTest.test_return_local_script_class_rref_in_py_and_use_in_script.<locals>.use_rref_on_owner)r>   r   r?   r"   rJ   r   r   r   r   rC   r$   r@   rA   rD   rE   r   r   rL   Zuse_rref_on_owner_scriptr   r   r   ;test_return_local_script_class_rref_in_py_and_use_in_script  s    
  
zILocalRRefTest.test_return_local_script_class_rref_in_py_and_use_in_scriptc                 C   s   | j dkrd S t| j d | j }tj|t| j fd}tt tddd}||}| 	|t
| j  t
j|}||}| 	|t
| j  d S )Nr   r   r    r)   c                 S   s*   | f}i }t |  t||}| }|S r   )r"   rb   Z
owner_namer   rc   r   r   r   r   r     s    zeLocalRRefTest.test_return_local_script_module_rref_in_py_and_use_in_script.<locals>.use_rref_on_owner)r>   r   r?   r"   rJ   r   r   r   r   rC   r$   r&   r@   rA   r   r   r   r   <test_return_local_script_module_rref_in_py_and_use_in_script  s    
  zJLocalRRefTest.test_return_local_script_module_rref_in_py_and_use_in_scriptN)rW   rX   rY   r   r   r   r   r   r   r   r   r   r     s   
	

r   c                   C   s   dS rZ   r   r   r   r   r   python_function  s    r   r.   r0   c                 C   s   | | | | S r   r   )Z	first_argZ
second_argfirst_kwargsecond_kwargr   r   r   r     s    r   r   	str_kwargZ
tensor_argstr_argZint_argtensor_kwargr   	int_kwargc                 C   s   | | || || fS r   r   r   r   r   r   assorted_types_args_kwargs  s    	r   c                   C   s   t dd S )Nrm   )rI   r   r   r   r   raise_script   s    r   )rE   r!   r   c                 C   s   t | t||}| }|S r   )r"   rb   r   rc   rE   r!   r   ri   rL   r   r   r   script_rpc_async_call  s    r   c                 C   s   t | t||}|S r   )r"   rJ   r   )rE   r!   r   rF   r   r   r   script_rpc_sync_call  s    r   c                 C   s   t | t||}| S r   )r"   r#   r   r4   )rE   r!   r   Zrref_resr   r   r   script_rpc_remote_call  s    r   c                   @   s   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd ZdS )JitRpcOpTestc                 C   sx   | j dkrd S t| j d | j }tddgtddgf}i }tttfD ]&}||||}| |tddg qLd S )Nr   r   r   r   	r>   r   r?   r$   rh   r   r   r   rC   rD   rE   r!   r   Z	script_oprL   r   r   r   )test_all_kwargs_are_populated_by_defaults  s    
  z6JitRpcOpTest.test_all_kwargs_are_populated_by_defaultsc                 C   s   | j dkrd S t| j d | j }tddgtddgf}dtddgi}tttfD ]&}||||}| |tddg qZd S )Nr   r   r   r   r   r   r   r   r   r   *test_some_kwargs_are_populated_by_defaults-  s    
  z7JitRpcOpTest.test_some_kwargs_are_populated_by_defaultsc                 C   s   | j dkrd S t| j d | j }tddgtddgf}tddgtddgd}tttfD ]&}||||}| |tddg qfd S )Nr   r   r   r.   )r   r      r   r   r   r   r   (test_no_kwargs_are_populated_by_defaults=  s    
  z5JitRpcOpTest.test_no_kwargs_are_populated_by_defaultsc                 C   s`   | j dkrd S t| j d | j }tjjtddd}||}| |tddgddf d S )Nr   r   rE   c                 S   sF   t ddgddf}t ddgddd}t| t||}| }|S )Nr   r   r.   Z
_str_kwarg)r   r   r   )r$   rh   r"   rb   r   rc   r   r   r   r   )script_rpc_async_call_with_assorted_typesV  s       zlJitRpcOpTest.test_args_and_kwargs_contain_different_types.<locals>.script_rpc_async_call_with_assorted_typesr0   Zstr_arg_str_kwarg)	r>   r   r?   r$   r@   rA   strrC   rh   )rD   rE   r   rL   r   r   r   ,test_args_and_kwargs_contain_different_typesO  s    
z9JitRpcOpTest.test_args_and_kwargs_contain_different_typesc                 C   sP   | j dkrd S t| j d | j }tjjtddd}||}| |d d S )Nr   r   r   c                 S   s   d}t | t|}| }|S Nr   r"   rb   r[   rc   )rE   r!   ri   rL   r   r   r   +script_rpc_async_call_without_kwargs_passedw  s    zXJitRpcOpTest.test_kwargs_not_passed.<locals>.script_rpc_async_call_without_kwargs_passedr>   r   r?   r$   r@   rA   r   rC   )rD   rE   r   rL   r   r   r   test_kwargs_not_passedp  s    
z#JitRpcOpTest.test_kwargs_not_passedc                 C   sP   | j dkrd S t| j d | j }tjjtddd}||}| |d d S )Nr   r   r   c                 S   s   t | t}| }|S r   r   )rE   ri   rL   r   r   r   0script_rpc_async_call_without_args_kwargs_passed  s    zjJitRpcOpTest.test_args_kwargs_are_neither_passed.<locals>.script_rpc_async_call_without_args_kwargs_passedr   )rD   rE   r   rL   r   r   r   #test_args_kwargs_are_neither_passed  s    
z0JitRpcOpTest.test_args_kwargs_are_neither_passedc              	   C   sT   | j dkrd S t| j d | j }| td tjjtddd}W 5 Q R X d S )Nr   r   z Argument second_arg not providedr   c                 S   s0   t ddgf}i }t| t||}| }|S r\   r$   rh   r"   rb   r   rc   r   r   r   r   $script_rpc_async_call_with_less_args  s
    zcJitRpcOpTest.test_less_than_needed_args_are_specified.<locals>.script_rpc_async_call_with_less_args	r>   r   r?   rH   rI   r$   r@   rA   r   )rD   rE   r   r   r   r   (test_less_than_needed_args_are_specified  s    
z5JitRpcOpTest.test_less_than_needed_args_are_specifiedc              	   C   sT   | j dkrd S t| j d | j }| td tjjtddd}W 5 Q R X d S )Nr   r   z=Expected at most 4 arguments but found 5 positional argumentsr   c                 S   s`   t ddgt ddgt ddgt ddgt ddgf}i }t| t||}| }|S )Nr   r   r.   r0   r1   r   r   r   r   r   $script_rpc_async_call_with_more_args  s    zcJitRpcOpTest.test_more_than_needed_args_are_specified.<locals>.script_rpc_async_call_with_more_argsr   )rD   rE   r   r   r   r   (test_more_than_needed_args_are_specified  s    
z5JitRpcOpTest.test_more_than_needed_args_are_specifiedc              	   C   sh   | j dkrd S t| j d | j }tjjtddd}| td ||}| 	|d W 5 Q R X d S )Nr   r   r   c                 S   sJ   t ddgt ddgf}dt ddgi}t| t||}| }|S )Nr   r   Zthird_kwargr   r   r   r   r   +script_rpc_async_call_with_unexpected_kwarg  s
    zeJitRpcOpTest.test_unexepected_kwarg_is_specified.<locals>.script_rpc_async_call_with_unexpected_kwargz&Unknown keyword argument 'third_kwarg'
r>   r   r?   r$   r@   rA   r   rH   rI   rC   )rD   rE   r   rL   r   r   r   #test_unexepected_kwarg_is_specified  s    
	 z0JitRpcOpTest.test_unexepected_kwarg_is_specifiedc              	   C   sh   | j dkrd S t| j d | j }tjjtddd}| td ||}| 	|d W 5 Q R X d S )Nr   r   r   c                 S   s$   d}i }t | t||}| }|S r   )r"   rb   r   rc   r   r   r   r   0rpc_async_call_remote_py_function_in_torchscript  s
    zJitRpcOpTest.test_call_python_function_remotely_from_script_not_supported.<locals>.rpc_async_call_remote_py_function_in_torchscriptz#attempted to get undefined functionr   )rD   rE   r   rL   r   r   r   <test_call_python_function_remotely_from_script_not_supported  s    
 zIJitRpcOpTest.test_call_python_function_remotely_from_script_not_supportedc              	   C   sh   | j dkrd S t| j d | j }tjjtddd}| td ||}| 	|d W 5 Q R X d S )Nr   r   r   c                 S   s$   d}i }t | t||}| }|S r   )r"   rb   r   rc   r   r   r   r   8rpc_async_call_remote_raising_torchscript_in_torchscript  s
    zJitRpcOpTest.test_call_script_function_that_raises_remotely_from_script.<locals>.rpc_async_call_remote_raising_torchscript_in_torchscriptrm   r   )rD   rE   r   rL   r   r   r   :test_call_script_function_that_raises_remotely_from_script  s    
	zGJitRpcOpTest.test_call_script_function_that_raises_remotely_from_scriptc              	      s|   | j dkrd S t| j d | j }tjjdd  tjjtd fdd}| td ||}| 	|d W 5 Q R X d S )	Nr   r   c                   S   s   dS rZ   r   r   r   r   r   nonexisting_script  s    zgJitRpcOpTest.test_call_script_function_that_not_exists_remotely_from_script.<locals>.nonexisting_scriptr   c                    s$   d}i }t |  ||}| }|S r   )r"   rb   rc   r   r   r   r   <rpc_async_call_remote_nonexisting_torchscript_in_torchscript  s
    zJitRpcOpTest.test_call_script_function_that_not_exists_remotely_from_script.<locals>.rpc_async_call_remote_nonexisting_torchscript_in_torchscriptz6attempted to get undefined function nonexisting_scriptr   )rD   rE   r   rL   r   r   r   >test_call_script_function_that_not_exists_remotely_from_script  s     

	 zKJitRpcOpTest.test_call_script_function_that_not_exists_remotely_from_scriptN)rW   rX   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s0   



 






r   )r>   r*   c                 C   s   t | S r   )r   r>   r   r   r   my_script_module_init1  s    r   c                 C   s   t | S r   )r   r   r   r   r   construct_my_script_module6  s    r   )ref_script_moduler   r*   c                 C   s   |   }| | S r   r   )r   r   moduler   r   r   run_ref_script_module;  s    r   c                 C   s   |   S r   )Zconfirmed_by_ownerr+   r   r   r   rR   C  s    rR   )r;   fnamer*   c                 C   s   t | | d S r   )r$   save)r;   r   r   r   r   	save_rrefH  s    r   )r^   yr*   c                 C   s   | | S r   r   )r^   r   r   r   r   
script_addM  s    r   tor^   r   r*   c                 C   s   t | t||fS r   r"   rb   r   r   r^   r   r   r   r   	async_addR  s    r   c                   C   s
   t dS r   )r$   rO   r   r   r   r   async_wrong_typeX  s    r   c                 C   s   t | }tj|}| S r   )ioBytesIOr$   r@   load)Zpickled_script_modulefmr   r   r   $load_script_module_with_pickled_rref^  s    
r   c                   @   sH  e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zd'd( Zd)d* Zed+d, Zed-d. Zed/d0 Zed1d2 Zed3d4 Zed5d6 Zd7S )8
JitRpcTestc                 C   s   t | jd | j }ttdd}tj|ttddfd}| || tj	|ttddfd}| |
 | tj	t | jttddfd}| |
 | d S r   )r   r>   r?   r]   r$   r&   r"   rJ   rC   r#   r4   )rD   rE   r   rL   r   Z
local_rrefr   r   r   test_torchscript_functionl  s      z$JitRpcTest.test_torchscript_functionc              	   C   sh   t | jd | j }| td tj|tdd}W 5 Q R X | td tj|tdd}W 5 Q R X d S )Nr   zone_arg\(\) expected at most)r      r    )	r   r>   r?   rH   rI   r"   rJ   r]   r#   )rD   rE   rL   r   r   r   r   #test_torchscript_function_exceptionz  s
    z.JitRpcTest.test_torchscript_function_exceptionc              	   C   sz   t | jd | j }t| j}t| j| j| j t  tj	|t
| jfd}| td tj||jdd}W 5 Q R X d S )Nr   r    pickler   )r   r>   r?   r   r   Zfile_init_methoddistZbarrierr"   rJ   r   rH   	TypeErrorrb   r   )rD   rE   Zmy_local_script_modulerL   r   r   r   (test_torchscript_functions_not_supported  s    
  z3JitRpcTest.test_torchscript_functions_not_supportedc              	   C   s   dd l m  m  m} d|_t| jt| j }| jd }|| j }tj	t
|t| jfd}tjt
|t|t| jfd}| || | td( tjt
| jt|t| jfd}W 5 Q R X d S )Nr   Tr   r    zFis an RRef to a ScriptModule. It can't be sent through RPC from owner,)Ztorch.distributed.rpc.apidistributedr"   apiZ_ignore_rref_leakr$   r&   r>   r?   r#   r   r   rJ   r   rC   rH   rI   )rD   r  r   r   rS   Z
remote_refrL   r   r   r   test_remote_script_module  s2    

  z$JitRpcTest.test_remote_script_modulec           
      C   s&  t | jd | j }tj|t| jfd}| t|tj	j
 | }| t| j| tj|t| jfd}tj| t|tj	j
fd}| | |  }| |t| j |  }| |t| j | }| t|tj	j
 | }| |t| j | }	| |	t| j d S Nr   r    )r   r>   r?   r"   rJ   r   
assertTruer   r$   r@   ScriptModulerC   r&   r#   r   r   r   r   r4   )
rD   dst_nameZcreated_script_moduleZrank_ones_tensorZremote_script_moduleZremote_end_is_scriptZremote_forward_outputZremote_func_outputZlocal_script_moduleZlocal_script_func_outputr   r   r   #test_create_script_module_on_remote  s4      

z.JitRpcTest.test_create_script_module_on_remotec                 C   sv   t | jd | j }t|}t|}t }t  tj	
|| t  tj|t| fd}| }| || d S r
  )r   r>   r?   rx   r   r   r"   Z_enable_jit_rref_pickler$   r@   r   Z_disable_jit_rref_picklerJ   r   getvaluerC   )rD   r  m1m2r   Zout1Zout2r   r   r   )test_load_script_module_with_pickled_rref  s    z4JitRpcTest.test_load_script_module_with_pickled_rrefc              
   C   sX   | j d }|| j }tt|}t (}| td t|| W 5 Q R X W 5 Q R X d S )Nr   z2RRef jit pickling is only allowed inside RPC calls)r>   r?   r(   r   r   rH   rI   r   )rD   r   rS   r;   r   r   r   r   "test_rref_jit_pickle_not_supported  s    

 z-JitRpcTest.test_rref_jit_pickle_not_supportedc              	   C   sL   t jt| jd | j ttdfd}| t	d |
  W 5 Q R X d S Nr   r   r    .*Expected error.*)r"   r#   r   r>   r?   ro   r$   r&   rH   	Exceptionr4   rD   r   r   r   r   test_remote_script_throw  s    
z#JitRpcTest.test_remote_script_throwc                 C   sF   t jt| jd | j ttdfd}| |	 tdd  d S r   )
r"   r#   r   r>   r?   rj   r$   r&   rC   r4   r  r   r   r   test_remote_script_udf  s    
z!JitRpcTest.test_remote_script_udfc                 C   sF   t jt| jd | j ttdfd}| |	 tdd  d S r   )
r"   rb   r   r>   r?   rj   r$   r&   rC   rc   rD   futurer   r   r   test_async_script_udf  s    
z JitRpcTest.test_async_script_udfc                 C   sX   dd }t jt| jd | j ttdfd|}| 	|
 tdd d  d S )Nc                 S   s   |   d S r\   r   r   r   r   r   callback"  s    z1JitRpcTest.test_callback_simple.<locals>.callbackr   r   r    )r"   rb   r   r>   r?   rj   r$   r&   thenrC   rc   rD   r  r  r   r   r   test_callback_simple   s    
zJitRpcTest.test_callback_simplec                 C   s   | j d }t|| j }dd }tjt|| j tt||fd}d}t|D ]}|	|}qP| 
| t||d |  d S )Nr   c                 S   s   |   d S r\   r   r   r   r   r   r  1  s    z0JitRpcTest.test_callback_chain.<locals>.callbackr    r  )r>   r   r?   r"   rb   r]   r$   r&   r|   r  rC   rc   )rD   r   r'   r  ri   Znum_cbsr}   r   r   r   test_callback_chain,  s    
  zJitRpcTest.test_callback_chainc                    s   d   fdd}t jt| jd | j ttdfd}|| |	dd }| 
| tdd  |  | 
 tdd  d S )	Nc                    s   |   d  d S r   r   r   Zcallback_calledr   r   r  B  s    z3JitRpcTest.test_add_done_callback.<locals>.callbackr   r   r    c                 S   s   dS )NTr   )r}   r   r   r   <lambda>M      z3JitRpcTest.test_add_done_callback.<locals>.<lambda>r0   )r"   rb   r   r>   r?   rj   r$   r&   Zadd_done_callbackr  rC   rc   )rD   r  r  Zfuture_thenr   r"  r   test_add_done_callback>  s    

z!JitRpcTest.test_add_done_callbackc              	   C   sL   t jt| jd | j ttdfd}| t	d |
  W 5 Q R X d S r  )r"   rb   r   r>   r?   rp   r$   r&   rH   r  rc   r  r   r   r   test_async_script_throwV  s    
z"JitRpcTest.test_async_script_throwc              	      s^    fdd}t jt jd  j ttdfd|} 	t
d |  W 5 Q R X d S )Nc              	      s,     td |   W 5 Q R X tdd S )Nr  Another expected error)rH   r  rc   rI   r   r   r   r   r  b  s    z9JitRpcTest.test_callback_with_exception.<locals>.callbackr   r   r    r'  )r"   rb   r   r>   r?   rp   r$   r&   r  rH   rI   rc   r  r   r   r   test_callback_with_exception`  s    
z'JitRpcTest.test_callback_with_exceptionc              
   C   s   | j dkrt D}ttjtjtdd}tj	j
|}t|jd}W 5 Q R X W 5 Q R X |j}t||}| tjt|jk d S )Nr   Zworker0Zworker1)r>   _profiler
   r	   ASYNCr$   _jit_internal_qualified_namer]   autogradrs   r   ru   rq   function_eventsr   r  name)rD   profZprof_keyrd   rL   eventsfunction_eventr   r   r   test_call_rpc_with_profilingp  s    

 
z'JitRpcTest.test_call_rpc_with_profilingc              	      s  j dkrj d j }t|}tddgtddgf}i }t }t||| W 5 Q R X |j}tj	t
  fdd|D }t|d |d }ttj tj |}||j dd |D }	dd |	D }
|
|h d	d |	D d }| d
}|j| d S )Nr   r   r   c                    s&   g | ]} |j kr|jjkr|qS r   )r/  node_idr>   .0eventZ	qual_namerD   r   r   
<listcomp>  s   
 z:JitRpcTest.test_rpc_async_jit_profiled.<locals>.<listcomp>c                 S   s   g | ]}|j r|qS r   )Z	is_remoter5  r   r   r   r9    s      c                 S   s   h | ]
}|j qS r   )r4  r6  Zremote_eventr   r   r   	<setcomp>  s    z9JitRpcTest.test_rpc_async_jit_profiled.<locals>.<setcomp>c                 S   s   g | ]}d |j kr|qS )	aten::addr/  r:  r   r   r   r9    s   
z#remote_op: aten::add)r>   r?   r   r$   rh   r)  r   r.  r+  r,  r   rC   lenr
   r	   	ASYNC_JITr/  )rD   rS   rE   r!   r   r0  r.  Zrpc_async_jit_eventZprofiled_nameZremote_eventsZremote_event_node_idsZ
remote_addZremote_add_profiled_namer   r8  r   test_rpc_async_jit_profiled  sJ      
z&JitRpcTest.test_rpc_async_jit_profiledc              	      s   | j dkr| j d | j }t|}d t }t|  W 5 Q R X |j} fdd|D }| dt| |d }tt	j
tjtt| j |fdd|D }| dt| |D ]}| |j|jk qd S )Nr   r   fooc                    s   g | ]}|j  kr|qS r   r=  r5  )block_scoper   r   r9    s    
 zGJitRpcTest.test_record_function_on_caller_rpc_async.<locals>.<listcomp>c                    s   g | ]}|j  kr|qS r   r=  r5  expected_keyr   r   r9    s    
 r   )r>   r?   r   r)  re   r.  rC   r>  r
   r	   r?  r$   r+  r,  r_   r  Zcpu_time_total)rD   rS   rE   r0  r.  Zrecord_function_scope_eventZjit_rpc_eventsZjit_rpc_eventr   )rB  rD  r   (test_record_function_on_caller_rpc_async  s8    



z3JitRpcTest.test_record_function_on_caller_rpc_asyncc           	   	      s   d}| j dkr| j d | j }t|}d}t }t|| W 5 Q R X |  |j}ttj	t
jtt| j || |   fdd|D d }| ||jk |j}| dd |D  d S )	Nz#remote_op: r   r   rA  c                    s   g | ]}|j  kr|qS r   r=  )r6  ZevtrC  r   r   r9    s    
 zCJitRpcTest.test_rpc_torchscript_record_function.<locals>.<listcomp>c                 s   s   | ]}d |j kV  qdS )r<  Nr=  )r6  childr   r   r   	<genexpr>  s     zBJitRpcTest.test_rpc_torchscript_record_function.<locals>.<genexpr>)r>   r?   r   r)  rv   Zkey_averagesr.  r
   r	   r?  r$   r+  r,  ra   r  r/  Zcpu_children)	rD   ZREMOTE_OP_STRrS   rE   rB  r0  r.  Zremote_record_function_eventZremote_childrenr   rC  r   $test_rpc_torchscript_record_function  s<    
	
z/JitRpcTest.test_rpc_torchscript_record_functionc              
   C   s   d}t  @}tjjd}tjt|}|| W 5 Q R X |	  W 5 Q R X |j
}t|d}| |jd | |jd | d S )Nr   rA  gư>)r)  r$   r-  rs   r   r@   rf   r   Z_call_end_callbacks_on_futurerc   r.  r   rC   r/  ZassertGreaterAlmostEqualZcpu_time)rD   Zsleep_intervalr0  rd   ri   r.  Zsleep_eventr   r   r   0test_record_function_jit_end_callbacks_with_fork  s    
z;JitRpcTest.test_record_function_jit_end_callbacks_with_forkc              
   C   sX   t  *}tjjd}t|j}W 5 Q R X W 5 Q R X |j}t|d}| 	|j
d d S )NrA  )r)  r$   r-  rs   r   rw   rq   r.  r   rC   r/  )rD   r0  rd   rL   r1  r2  r   r   r   $test_call_fork_in_jit_with_profiling  s    
z/JitRpcTest.test_call_fork_in_jit_with_profilingc              	   C   sj   t | jd | j }t | jd | j }tj|t|tddtddfd}| |tddd  d S r   )	r   r>   r?   r"   rJ   r   r$   r&   rC   )rD   dst1dst2rL   r   r   r   test_async_function_simple  s      z%JitRpcTest.test_async_function_simplec              	   C   s8   |  td" tt| jd | j t W 5 Q R X d S )NDAsync functions must return an IValue of Future type, but got Tensorr   )rH   rI   r"   rJ   r   r>   r?   r   r   r   r   r   %test_async_function_wrong_return_type"  s     z0JitRpcTest.test_async_function_wrong_return_typec              	   C   sB   |  t. tjjtjjtt	t	t
t	 ddd}W 5 Q R X d S )Nr   c                 S   s   t | t||fS r   r   r   r   r   r   async_wrong_decorator_order;  s    zYJitRpcTest.test_async_function_wrong_decorator_order.<locals>.async_wrong_decorator_order)assertRaisesrI   r$   r@   rA   r"   	functionsasync_executionr   r   r   )rD   rP  r   r   r   )test_async_function_wrong_decorator_order,  s      z4JitRpcTest.test_async_function_wrong_decorator_orderc              	   C   sn   t | jd | j }t | jd | j }tj|t|tddtddfd}| |	 tddd  d S r   )
r   r>   r?   r"   r#   r   r$   r&   rC   r4   )rD   rK  rL  r   r   r   r   test_async_function_remoteB  s      z%JitRpcTest.test_async_function_remotec                 C   s   t | jd | j }t | jd | j }d}g }t|D ]4}|tj|t|t	ddt	dd| fd q8t|D ]$}| 
||  t	dd|  qvd S )Nr   r   r  r    )r   r>   r?   r|   r3   r"   r#   r   r$   r&   rC   r4   )rD   rK  rL  numr{   ir   r   r    test_async_function_remote_multiL  s      z+JitRpcTest.test_async_function_remote_multic              	   C   s@   t t| jd | j t}| td |  W 5 Q R X d S )Nr   rN  )	r"   r#   r   r>   r?   r   rH   rI   r4   r  r   r   r   ,test_async_function_wrong_return_type_remote]  s     z7JitRpcTest.test_async_function_wrong_return_type_remoteN)rW   rX   rY   r   r   r  r  r	  r  r  r  r  r  r  r   r!  r%  r&  r(  r3  r@  rE  rH  rI  rJ  rM  rO  rT  rU  rX  rY  r   r   r   r   r   d  sh   



$
#



	





	


.
$
!
	
	

	
r   )cr   r   typingr   r   r   r   r$   Ztorch.distributedr  r  Ztorch.distributed.rpcr"   r   Ztorch.autograd.profilerr   r   Ztorch.distributed.rpc.internalr	   r
   Ztorch.futuresr   Z$torch.testing._internal.common_utilsr   Z"torch.testing._internal.dist_utilsr   r   r   r   Z>torch.testing._internal.distributed.rpc.rpc_agent_test_fixturer   Ztorch.autograd.profiler_legacyr   r)  r   r   r(   r@   rA   r,   r   r/   r5   r8   r9   r[   r]   r_   r   ra   re   rj   rk   rl   ro   rp   ru   rv   rw   r  rx   r   r   r   r   r   r   Z	interfacennModuler   r   r   r   r   r   r   r   rh   r   r   r   r   r   r   r   r   r   r   rB   rR   r   r   rR  rS  r   r   r   r   r   r   r   r   <module>   s  I





	
-1_	
 
 
 
 
 
 
   
