o
    ॵiE1                     @   sP  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dZ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	j-Z.dS )*    N)OrderedDict)Mapping)
expanduser)DEFAULT_CREDENTIALS_PATH)is_tf_availableis_torch_available   
TEST_LEVELTEST_ACCESS_TOKEN_CITESTTEST_ACCESS_TOKEN_SDKDEVu   内部测试模型citestc                  C   s   t t} tj| dd d S )NT)ignore_errors)r   r   shutilrmtree)path_credential r   O/home/ubuntu/.local/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	test_caser   r   r   
require_tf0      r   c                 C   r   )Nztest requires PyTorch)r   r   r   r   r   r   r   require_torch6   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__C   s   
zDummyTorchDataset.__init__c                 C   s"   dd l }|| j|| jdS )Nr   )r'   labels)torchTensorr'   r(   )r*   indexr-   r   r   r   __getitem__H   s   

zDummyTorchDataset.__getitem__c                 C   s   | j S r   )r)   )r*   r   r   r   __len__O   s   zDummyTorchDataset.__len__)r%   N)__name__
__module____qualname__r+   r0   r1   r   r   r   r   r$   A   s    
r$   c                 C   s   t | ||S r   )r$   r&   r   r   r   create_dummy_test_datasetS   s   r5   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   r7   existsrequestsgetopenwritecontentbasenamedirnamesplitextjointarfile
extractall)
fpathfurldstrf	file_nameroot_dirtarget_dir_nametarget_dir_pathtr   r   r   download_and_untarW   s   

rN   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   damo   ztests/ .py/.)
subprocessgetstatusoutputsplitr   stripfindlenrfindsetaddreplace)status_coderesultlines
test_casesmodel_caseslineelements	test_file	model_pos
left_quote
rquote_idx
model_name
model_info	case_infor   r   r   get_case_model_infoi   s<   






rp   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atol	equal_nanz, length is not equal:z, c              	      s"   g | ]\}}t d || dqS N)rs   rt   compare_arguments_nested).0sub_arg1sub_arg2)rt   rs   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 rv   rw   )ry   keyarg1arg2rt   rs   r   r   r|      s    )dtypeztype not supported: )typer2   print
isinstancer   strboolnpbool_integerstr_floatfloatingisclosetuplelistr]   allzipr   keysr_   ndarraywhereequalNaNastypeflatten
ValueError)
print_contentr   r   rs   rt   ignore_unknown_typetype1type2keys1keys2r   r~   r   rx      s   




  

rx   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{}={},rU   )suffixz.pklwzsave temporary run file to : {}zsave results to : {}rP   
PYTHONPATHrT   1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   r7   rZ   r@   r4   r   r   formatappenditemsrA   r[   tempfileNamedTemporaryFilenamer;   r   _DIST_SCRIPT_TEMPLATEr<   range
addCleanup	clean_tmpcopydeepcopyr   r:   lstriprX   callpickleloadassertEqual)r*   dist_start_cmdfuncnum_gpusassert_callbacksave_all_ranksargskwargsscript_path
script_dirscript_name	func_namefunc_paramsargkvtmp_run_filetmp_res_filerH   run_file_contenttmp_res_filesitmp_envscript_params
script_cmdres
script_res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 )NrS   )_find_free_portr   zV%s -m torch.distributed.launch --nproc_per_node=%d --master_addr='%s' --master_port=%s)r   r   r   r   r   )	torch_utilsr   socketgethostbynamegethostnamepopsys
executabler   )
r*   r   r   r   r   r   r   r   ipr   r   r   r   startg  s"   zDistributedTestCase.startc                 C   s<   |D ]}t j|rt j|rt| qt | qd S r   )r   r7   r8   isdirr   r   remove)r*   tmp_file_listfiler   r   r   r     s   
zDistributedTestCase.clean_tmp)NF)r2   r3   r4   __doc__r   r   r   r   r   r   r   r      s    !
L
r   )rq   rr   T)/r   r   r   r   r   rX   r   rB   r   r   collectionsr   collections.abcr   os.pathr   numpyr   r9   modelscope.hub.constantsr   modelscope.utils.import_utilsr   r   r	   r   r   r:   TEST_ACCESS_TOKEN1TEST_ACCESS_TOKEN2TEST_MODEL_CHINESE_NAMETEST_MODEL_ORGr   r   r   r!   r   r#   r$   r5   r   rN   rp   rx   r   TestCaser   r   r   r   r   <module>   sL   $
T"