o
    W+ i1                     @   sl  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ d dlZd dlZd dlmZ d dlmZmZ dadZejd	dZejd
dZdZejddZe edstej!e_"dd Z#dd Z$dd Z%dd Z&de'fddZ(G dd dZ)dd Z*de+fdd Z,d!d" Z-	#	$	%d+d&d'Z.d(Z/G d)d* d*e	j0Z1dS ),    N)OrderedDict)Mapping)
expanduser)DEFAULT_CREDENTIALS_PATH)is_tf_availableis_torch_available   
TEST_LEVELZTEST_ACCESS_TOKEN_CITESTZTEST_ACCESS_TOKEN_SDKDEVu   内部测试模型TEST_MODEL_ORGZcitestNaNc                  C   s   t t} tj| dd d S )NT)ignore_errors)r   r   shutilrmtree)Zpath_credential r   g/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/modelscope/utils/test_utils.pydelete_credential&   s   r   c                   C   s   t tjv rttjt  atS N)TEST_LEVEL_STRosenvironintr	   r   r   r   r   
test_level+   s   
r   c                 C      t  s
td| } | S )Nztest requires TensorFlow)r   unittestskipZ	test_caser   r   r   
require_tf3      r   c                 C   r   )Nztest requires PyTorch)r   r   r   r   r   r   r   require_torch9   r   r   levelc                 C   s   | a d S r   )r	   )r   r   r   r   set_test_level?   s   r    c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
DummyTorchDatasetreturnNc                 C   s   || _ || _|| _d S r   featlabelnum)selfr$   r%   r&   r   r   r   __init__F   s   
zDummyTorchDataset.__init__c                 C   s"   dd l }|| j|| jdS )Nr   )r$   labels)torchZTensorr$   r%   )r'   indexr*   r   r   r   __getitem__K   s   

zDummyTorchDataset.__getitem__c                 C   s   | j S r   )r&   )r'   r   r   r   __len__R   s   zDummyTorchDataset.__len__)r"   N)__name__
__module____qualname__r(   r,   r-   r   r   r   r   r!   D   s    
r!   c                 C   s   t | ||S r   )r!   r#   r   r   r   create_dummy_test_datasetV   s   r1   r"   c           
      C   s   t j| s&t|}t| d}||j W d    n1 s!w   Y  t j| }t j	| }t j
t j
|d d }t j||}t| }	|	j|d |S )Nwbr   )path)r   r3   existsrequestsgetopenwritecontentbasenamedirnamesplitextjointarfile
extractall)
ZfpathZfurldstrf	file_nameroot_dirZtarget_dir_nameZtarget_dir_pathtr   r   r   download_and_untarZ   s   

rF   c                  C   s   t d\} }|d}t }t }|D ]b}| }|d}|d }|d}|dks4|d t|kr5q||d  }	||	}
|||
 }||vrOt ||< || }|	| ||vrat ||< || }|	|
dd	
d
d	
dd q|S )NzTgrep -rn "damo/" tests/  | grep -v "*.pyc" | grep -v "Binary file" | grep -v run.py 
:r   Zdamo   ztests/ .py/.)
subprocessgetstatusoutputsplitr   stripfindlenrfindsetaddreplace)status_coderesultlinesZ
test_casesZmodel_caseslineelementsZ	test_fileZ	model_posZ
left_quoteZ
rquote_idxZ
model_nameZ
model_infoZ	case_infor   r   r   get_case_model_infol   s<   






r^   MbP?:0yE>Tc           
         s  t  }t }|j|jkr"| d ur t|  d|j d|j  dS  d u r(dS t ttttjtj	tj
frN krL| d urJt|  d  d  dS dS t ttjfrttj ddsr| d urpt|  d  d  dS dS t ttfrt tkr| d urt|  dt  d	t  dS tfd
dt D s| d urt|   dS dS t tr!  } }	t|t|	kr| d urt|  dt| d	t|	  dS tt|t|	 dkr| d urt|  dt|t|	   dS t fdd|D s| d urt|   dS dS t tjrett d tj jtd ttd tjjtdttj dd sc| d urat|   dS dS |rjdS td| )Nz, type not equal:z and FTz, arg1:z, arg2:)rtolatolZ	equal_nanz, length is not equal:z, c              	      s"   g | ]\}}t d || dqS N)ra   rb   compare_arguments_nested).0Zsub_arg1Zsub_arg2)rb   ra   r   r   
<listcomp>   s    
z,compare_arguments_nested.<locals>.<listcomp>z, key length is not equal:r   z, key diff:c              	      s&   g | ]}t d  | | dqS rc   rd   )rf   keyarg1arg2rb   ra   r   r   rg      s    )Zdtypeztype not supported: )typer.   print
isinstancer   strboolnpZbool_integerZstr_floatZfloatingisclosetuplelistrT   allzipr   keysrV   Zndarraywhereequalr   Zastypeflatten
ValueError)
Zprint_contentrj   rk   ra   rb   Zignore_unknown_typeZtype1Ztype2Zkeys1keys2r   ri   r   re      s   




  

re   aW  
import ast
import argparse
import pickle
import torch
from torch import distributed as dist
from modelscope.utils.torch_utils import get_dist_info
import {}

parser = argparse.ArgumentParser()
parser.add_argument('--save_all_ranks', type=ast.literal_eval, help='save all ranks results')
parser.add_argument('--save_file', type=str, help='save file')
parser.add_argument('--local_rank', type=int, default=0)
args = parser.parse_args()


def main():
    results = {}.{}({})  # module.func(params)
    if args.save_all_ranks:
        save_file = args.save_file + str(dist.get_rank())
        with open(save_file, 'wb') as f:
            pickle.dump(results, f)
    else:
        rank, _ = get_dist_info()
        if rank == 0:
            with open(args.save_file, 'wb') as f:
                pickle.dump(results, f)


if __name__ == '__main__':
    main()
c                   @   s4   e Zd ZdZ		d
ddZ		d
ddZdd	 ZdS )DistributedTestCaseaD  Distributed TestCase for test function with distributed mode.
    Examples:
        >>> import torch
        >>> from torch import distributed as dist
        >>> from modelscope.utils.torch_utils import init_dist

        >>> def _test_func(*args, **kwargs):
        >>>     init_dist(launcher='pytorch')
        >>>     rank = dist.get_rank()
        >>>     if rank == 0:
        >>>         value = torch.tensor(1.0).cuda()
        >>>     else:
        >>>         value = torch.tensor(2.0).cuda()
        >>>     dist.all_reduce(value)
        >>>     return value.cpu().numpy()

        >>> class DistTest(DistributedTestCase):
        >>>     def test_function_dist(self):
        >>>         args = ()  # args should be python builtin type
        >>>         kwargs = {}  # kwargs should be python builtin type
        >>>         self.start(
        >>>             _test_func,
        >>>             num_gpus=2,
        >>>             assert_callback=lambda x: self.assertEqual(x, 3.0),
        >>>             *args,
        >>>             **kwargs,
        >>>         )
    NFc              	   O   sR  |j j}tj|\}	}
tj|
d }
|j}g }|D ]}t|tr'd	|}|
t| q| D ]\}}t|trAd	|}|
d	|| q3d|d}tjddj}tjddj}t|d#}td		| td
	| t	|
|
||}|| W d    n1 sw   Y  g }|rt|D ]}|
|t|  qn|g}| | j|g|  ttj}d|dd|	fd|d< d|d< d||f }d|||f }td|  tj|d|d}g }|D ] }t|d}|
t | W d    n	1 sw   Y  q|s|d }|r|| | j!|dd	||
d |S )Nr   z'{}'z{}={},rL   )suffixz.pklwzsave temporary run file to : {}zsave results to : {}rH   
PYTHONPATHrK   1ZNCCL_P2P_DISABLEz"--save_all_ranks=%s --save_file=%sz%s %s %szscript command: %sT)shellenvrbz.The test function ``{}`` in ``{}`` run failed!)msg)"__code__co_filenamer   r3   rQ   r<   r0   rn   ro   formatappenditemsr=   rR   tempfileNamedTemporaryFilenamer7   rm   _DIST_SCRIPT_TEMPLATEr8   rangeZ
addCleanup	clean_tmpcopydeepcopyr   r6   lstriprO   callpickleloadassertEqual)r'   dist_start_cmdfuncnum_gpusassert_callbacksave_all_ranksargskwargsZscript_pathZ
script_dirscript_name	func_nameZfunc_paramsargkvZtmp_run_fileZtmp_res_filerB   Zrun_file_contentZtmp_res_filesiZtmp_envZscript_paramsZ
script_cmdresZ
script_resZres_filer   r   r   _start!  s|   



zDistributedTestCase._startc           
      O   s^   ddl m} tt }d|v r|d}	n
dtj||| f }	| j||	||||d|S )NrJ   )_find_free_portr   zV%s -m torch.distributed.launch --nproc_per_node=%d --master_addr='%s' --master_port=%s)r   r   r   r   r   )	Ztorch_utilsr   socketgethostbynamegethostnamepopsys
executabler   )
r'   r   r   r   r   r   r   r   ipr   r   r   r   startj  s"   zDistributedTestCase.startc                 C   s<   |D ]}t j|rt j|rt| qt | qd S r   )r   r3   r4   isdirr   r   remove)r'   Ztmp_file_listfiler   r   r   r     s   
zDistributedTestCase.clean_tmp)NF)r.   r/   r0   __doc__r   r   r   r   r   r   r   r     s    !
L
r   )r_   r`   T)2r   r   r   r   r   rO   r   r>   r   r   collectionsr   collections.abcr   Zos.pathr   numpyrq   r5   Zmodelscope.hub.constantsr   Zmodelscope.utils.import_utilsr   r   r	   r   r   r6   ZTEST_ACCESS_TOKEN1ZTEST_ACCESS_TOKEN2ZTEST_MODEL_CHINESE_NAMEr
   hasattrnanr   r   r   r   r   r   r    r!   r1   ro   rF   r^   re   r   ZTestCaser   r   r   r   r   <module>   sP   
$
T"