a vK6d^@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z m Z ddlmZmZddlZddlZddlmZddlZddlmZeejdddkZerdd lmZdd lm Z Gd d d e!Z"e#d dZ$ddZ%ddZ&dCddZ'Gddde!Z(ddZ)ddZ*ddZ+Gddde!Z,eed d!d"Z-ej.j/eee,d#d$d%Z0d&d'Z1d(d)Z2d*d+Z3d,d-Z4d.d/Z5d0d1Z6d2d3Z7e8dDd5d6Z9e8d7d8Z:dEd:d;Z;GddS)Gz` Misc functions, including distributed helpers. Mostly copy-paste from torchvision references. N) OrderedDict defaultdictdeque)ListOptional)Tensor.)_new_empty_tensor) _output_sizec@speZdZdZdddZdddZd d Zed d Zed dZ eddZ eddZ eddZ ddZ dS) SmoothedValuezsTrack a series of values and provide access to smoothed values over a window or the global series average. NcCs.|dur d}t|d|_d|_d|_||_dS)Nz{median:.4f} ({global_avg:.4f}))maxlenr)rtotalcountfmt)self window_sizerr/mnt/e/Liuyz_DL_and_ML/jupyter_notebook/python_CVs/Grounded-Segment-Anything_huggingface_yizhangliu/GroundingDINO/groundingdino/util/misc.py__init__&s  zSmoothedValue.__init__r cCs0|j||j|7_|j||7_dSN)rappendrr)rvaluenrrrupdate.s zSmoothedValue.updatecCsZts dStj|j|jgtjdd}tt|| }t |d|_|d|_dS)z: Warning: does not synchronize the deque! Ncudadtypedevicerr ) is_dist_avail_and_initializedtorchtensorrrfloat64distbarrier all_reducetolistint)rtrrrsynchronize_between_processes3s z+SmoothedValue.synchronize_between_processescCs.tt|j}|jddkr"dS|SNr)r#r$listrshapemedianitemrdrrrr0@szSmoothedValue.mediancCs"tjt|jtjd}|S)N)r )r#r$r.rfloat32meanr1r2rrravgGszSmoothedValue.avgcCs,tjdddkrd}nd}|j|j|S)NZ SHILONG_AMP1-C6?gư>)osenvirongetrr)repsrrr global_avgLszSmoothedValue.global_avgcCs t|jSr)maxrrrrrr>TszSmoothedValue.maxcCs |jdS)N)rr?rrrrXszSmoothedValue.valuecCs |jj|j|j|j|j|jdS)N)r0r6r=r>r)rformatr0r6r=r>rr?rrr__str__\szSmoothedValue.__str__)rN)r )__name__ __module__ __qualname____doc__rrr,propertyr0r6r=r>rrBrrrrr !s        r cCs tdkrtjddStjjS)zj Return a process group based on gloo backend, containing all the ranks The result is cached. ncclgloo)backend)r& get_backend new_groupgroupWORLDrrrr_get_global_gloo_groupfs  rOcst}|dkr|gSt}t}t|||}|durBdndt|}tj | gtj d}fddt |D}|durt ||ntdt j|||d d d|D}t|}t|tsJt|}g} |D]} | tj|ftjd q||krBtj||ftjd } tj|| fd d}|durZt | |nt j| ||d g} t|| D]L\} }tj|| || gd dd }t|}t|}| |qx| S) Run all_gather on arbitrary picklable data (not necessarily tensors) Args: data: any picklable object Returns: list[data]: list of data gathered from each rank r Nrcpur!r cs g|]}tjdgtjdqS)rrR)r#r$long.0_r!rr z"all_gather_cpu..zgathering on cpu)rMcSsg|]}t|qSrr*r1rUsizerrrrXrYrr\r r!rdim)get_world_sizerOioBytesIOr#save getbuffer ByteTensortor$numelrSranger& all_gatherprintr> isinstancer1r*remptyuint8catzipsplitrQnumpyload)data world_sizeZ cpu_groupbufferZ data_viewr$ local_size size_listmax_size tensor_listrVpadding data_listr\objrrWrall_gather_cpussF      r}c CsDtddkrt|St}|dkr*|gSt|}tj|}t | d}tj | gdd}ddt |D}t||dd|D}t|}g}|D]} |tj|ftjdd q||krtj||ftjdd } tj|| fd d }t||g} t||D]2\} }|d | }| t|q | S)rPZ CPU_REDUCEr7r rrWcSsg|]}tjdgddqS)rrrW)r#r$rTrrrrXrYzall_gather..cSsg|]}t|qSrrZr[rrrrXrYrr]rr^N)r9getenvr}r`pickledumpsr# ByteStorage from_bufferrerfr$rgrhr&rir>rrlrmrnrorQrqtobytesloads) rsrtrustorager$rvrwrxryrVrzr{r\rrrris2     riTcCst}|dkr|Stzg}g}t|D]}|||||q0tj|dd}t||rr||}ddt ||D}Wdn1s0Y|S)a6 Args: input_dict (dict): all the values will be reduced average (bool): whether to do average or sum Reduce the values in the dictionary from all processes so that all processes have the averaged results. Returns a dict with the same fields as input_dict, after reduction. rr^cSsi|]\}}||qSrr)rUkvrrr rYzreduce_dict..N) r`r#no_gradsortedkeysrstackr&r(ro)Z input_dictaveragertnamesvaluesrZ reduced_dictrrr reduce_dicts    2rc@sHeZdZdddZddZddZdd Zd d Zd d ZdddZ dS) MetricLogger cCstt|_||_dSr)rr meters delimiter)rrrrrrs zMetricLogger.__init__cKsL|D]>\}}t|tjr$|}t|ttfs6J|j||qdSr) itemsrkr#rr1floatr*rr)rkwargsrrrrrrs  zMetricLogger.updatecCsB||jvr|j|S||jvr(|j|Stdt|j|dS)Nz!'{}' object has no attribute '{}')r__dict__AttributeErrorrAtyperC)rattrrrr __getattr__s     zMetricLogger.__getattr__cCsDg}|jD](\}}|jdkr|d|t|q|j|S)Nrz{}: {})rrrrrAstrrjoin)rZloss_strnamemeterrrrrB s  zMetricLogger.__str__cCs|jD] }|q dSr)rrr,)rrrrrr,sz*MetricLogger.synchronize_between_processescCs||j|<dSr)r)rrrrrr add_meterszMetricLogger.add_meterNc cs|durt}n|j}d}|s d}t}t}tdd} tdd} dtttt|d} tjr|j |d| dd d d d d g} n |j |d| dd d d d g} d} |D]}| t||V| t|||dks|t|dkr| j t||}tt jt|d}tjrn|| j|t||t|t| t| tj| dn*|| j|t||t|t| t| d|d7}t}qt|}tt jt|d}|d|||t|dS)Nrz {avg:.4f})r:r3z[{0z}/{1}]z eta: {eta}z{meters}z time: {time}z data: {data}zmax mem: {memory:.0f}g0Ar )seconds)etartimersmemory)rrrrsz!{} Total time: {} ({:.4f} s / it))rjinforr rlenr#r is_availablerrrr=datetime timedeltar*rAmax_memory_allocated)riterableZ print_freqheaderloggerZ print_funci start_timeendZ iter_timeZ data_timeZ space_fmtZlog_msgMBr|Z eta_secondsZ eta_string total_timeZtotal_time_strrrr log_everys              zMetricLogger.log_every)r)NN) rCrDrErrrrBr,rrrrrrrs  rcstjtjtfdd}d}d}d}zF|gd}tjddgd|gd }|r`d nd}|gd }WntyYn0d |d |d|}|S)Ncstj|ddS)Ncwdascii) subprocess check_outputdecodestrip)commandrrr_runmszget_sha.._runzN/Aclean)git rev-parseHEADrdiffr)rz diff-indexrzhas uncommited changes)rrz --abbrev-refrzsha: z , status: z , branch: )r9pathdirnameabspath__file__rr Exception)rsharbranchmessagerrrget_shajs     rcCs$tt|}t|d|d<t|Sr-)r.ronested_tensor_from_tensor_listtuple)batchrrr collate_fns rcCsB|d}|ddD](}t|D]\}}t|||||<q q|SNrr ) enumerater>)the_listmaxessublistindexr1rrr _max_by_axiss rc@sfeZdZeedddZddZddZdd Zd d Z e d d Z ddZ ddZ e ddZdS) NestedTensormaskcCs||_||_|dkrt||j|_|jdkrL|jdt|_n>|jdkrp|jdt|_nt d |j|jj dS)Nautorr z%tensors dim must be 3 or 4 but {}({})) tensorsrr# zeros_likerfr!r_sumbool ValueErrorrAr/)rrrrrrrszNestedTensor.__init__cCs\g}t|jjdD]B}|j|}|d}|d}|t||gq|Sr) rhrr/rrr>rr#r)rresrrmaxHmaxWrrrimgsizes zNestedTensor.imgsizecCs@|j|}|j}|dur2|dus&J||}nd}t||Sr)rrfrr)rr! cast_tensorrZ cast_maskrrrrfs   zNestedTensor.tocCs\|dksJd||d}|d}|ddd|d|f}|S)Nrz dim of tensor should be 3 but {}rr )r_rArr>)rr$rrrimgrrrto_img_list_singles zNestedTensor.to_img_list_singlecCsf|jdkr||j|jSg}t|jjdD]*}|j|}|j|}||||q2|SdS)zgremove the padding and convert to img list Returns: [type]: [description] rrN)rr_rrrhr/r)rrrZtensor_iZmask_irrr to_img_lists  zNestedTensor.to_img_listcCs|jjSr)rr!r?rrrr!szNestedTensor.devicecCs |j|jfSr)rrr?rrr decomposeszNestedTensor.decomposecCs t|jSr)rrr?rrr__repr__szNestedTensor.__repr__cCs|jj|jjdS)N)z tensors.shapez mask.shape)rr/rr?rrrr/szNestedTensor.shapeN)rCrDrErrrrrfrrrGr!rrr/rrrrrs   r)rycCs|djdkrtrt|Stdd|D}t|g|}|\}}}}|dj}|dj}tj |||d} tj |||ftj |d} t || | D]\\} } } | d| j dd| j dd| j df| d| d| j dd| j df<qntd t| | S) NrrcSsg|]}t|jqSr)r.r/rUrrrrrXrYz2nested_tensor_from_tensor_list..rr rFz not supported)ndim torchvision _is_tracing$_onnx_nested_tensor_from_tensor_listrrr r!r#zerosonesrror/copy_rr)ryrx batch_shapebchwr r!r$rrZpad_imgmrrrrs   2$r)ryreturnc s&g}t|dD]<ttfdd|Dtjtj}||qt |}g}g}|D]}ddt |t |j D}tj j |d|dd|dd|df}||tj|dtj|jd}tj j |d|dd|dfdd} || tjqft|} t|} t| | d S) Nrcsg|]}|jqSr)r/rrrrrXrYz8_onnx_nested_tensor_from_tensor_list..cSsg|]\}}||qSrr)rUs1s2rrrrXrYrr rconstantr)rhr_r#r>rrfr4int64rrror/nn functionalpadrr*r!rr) ryrx max_size_i padded_imgsZ padded_masksrrz padded_imgr padded_maskr$rrrrrs* ( $  rcs&ddl}|jfdd}||_dS)zD This function disables printing when not in master process rNcs&|dd}s|r"|i|dS)NforceF)pop)argsrr Z builtin_print is_masterrrrjs z$setup_for_distributed..print)builtinsrj)r __builtin__rjrr rsetup_for_distributedsrcCsts dStsdSdS)NFT)r&ris_initializedrrrrr"$s r"cCsts dStS)Nr )r"r&r`rrrrr`,sr`cCsts dStSr-)r"r&get_rankrrrrr2srcCs tdkSr-)rrrrris_main_process8srcOstrtj|i|dSr)rr#rc)r rrrrsave_on_master<srcCsdtjvrtjddkrttjd|_ttjd|_ttjd|_|_td|j|j|jtt j t tjddndtjvrttjd|_ttjd |_|_ttjd |_td |j|j|jt j n$td d |_d|_d|_d|_dStd|j|j|jd|_t j |jd|_td|j|jddt jj|j|j|j|jdtdt jtdt|jdkdS)N WORLD_SIZErRANK LOCAL_RANKz(world size: {}, rank: {}, local rank: {}r)indentZ SLURM_PROCIDZ SLURM_LOCALIDZ SLURM_NPROCSz@world size: {}, world rank: {}, local rank: {}, device_count: {}zNot using distributed modeFr rz#world_size:{} rank:{} local_rank:{}TrHz | distributed init (rank {}): {})flush)rJrtrank init_methodz"Before torch.distributed.barrier()zEnd torch.distributed.barrier())r9r:r*rrtgpu local_rankrjrAjsonrdictr#r device_count distributed set_device dist_backendZdist_urlinit_process_groupr'r)r rrrinit_distributed_modeAsP    r&r c Cs|dkrtjg|jdgSt|}|d}||ddd\}}|}|| dd |}g}|D]4} |d|  d d} | | d|ql|S)z6Computes the precision@k for the specified values of krrWr Tr@NY@)rgr#rr!r>r\topkr+eqview expand_asrrrmul_) outputtargetr)Zmaxk batch_sizerVpredZcorrectrrZ correct_krrraccuracy}s  r2cCs4||ddk}||jdd}|S)zO_summary_ Args: pred (_type_): n, c gt (_type_): n, c r@r8rd)absrrr/)r1gttpaccrrraccuracy_onehotsr8nearestcCsvtdkr\|dkr*tjj|||||Std|||}t|jddt|}t ||St j j |||||SdS)z Equivalent to nn.functional.interpolate, but with support for empty batch sizes. This will eventually be supported natively by PyTorch, and this class can go away. gffffff?rrN) __torchvision_need_compat_flagrgr#rr interpolater r.r/r ropsmisc)inputr\ scale_factormode align_corners output_shaperrrr<s  r<c@s"eZdZddddZddZdS) color_sysN)rc Cs||_g}tddd|D]Z}|d}dtjdd}dtjdd}|tddt|||Dq||_ dS) Nrgv@2 r(ZcSsg|]}t|dqS))r*)rUjrrrrXrYz&color_sys.__init__..) num_colorsnparangerandomrandrrcolorsys hls_to_rgbcolors)rrJrQrhueZ lightness saturationrrrrszcolor_sys.__init__cCs |j|Sr)rQ)ridxrrr__call__szcolor_sys.__call__)rCrDrErrUrrrrrDs rDMbP?cCs8|jddd}|j|d}d|j|d}t||S)Nrr )minr>)rW)clampr#log)xr<x1x2rrrinverse_sigmoids r]cCs@t}|D],\}}|dddkr2|dd}|||<q|S)Nr zmodule.)rr) state_dictZnew_state_dictrrrrrclean_state_dicts   r_)T)r')NNr9N)rV)?rFrOr functoolsrarr9rrr collectionsrrrtypingrrrqrKr#torch.distributedr"r&rrr __version__rpr;Ztorchvision.opsr Ztorchvision.ops.miscr objectr lru_cacherOr}rirrrrrrrjitunusedrrr"r`rrrr&rr2r8r<rDr]r_rrrrsb    E :/ s K<