a
    dI.                     @   sX  d 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	m
Z
 ddlZddlZddlZddlmZ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 eeZdd Z dd Z!G dd dZ"d%ddZ#ddddddddddddddddeedddddddej$e%dddddfdd Z&G d!d" d"ej'j(j)Z*G d#d$ d$e+Z,dS )&a   Loader Factory, Fast Collate, CUDA Prefetcher

Prefetcher and Fast Collate inspired by NVIDIA APEX example at
https://github.com/NVIDIA/apex/commit/d5e2bb4bdeedd27b1dfaf5bb2b24d6c000dee9be#diff-cf86c282ff7fba81fad27a559379d5bf

Hacked together by / Copyright 2019, Ross Wightman
    N)suppress)partial)repeat)Callable   )IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)IterableImageDataset)OrderedDistributedSamplerRepeatAugSampler)RandomErasing)FastCollateMixup)create_transformc              	   C   s2  t | d tsJ t| }t | d d trt| d d }|| }tj|tjd}tj|g| d d d jR tjd}t|D ]l}t| | d |ksJ t|D ]F}| | d ||||  < ||||    t	| | d | 7  < qq||fS t | d d t
jrtjdd | D tjd}t||ks:J tj|g| d d jR tjd}t|D ]$}||  t	| | d 7  < qd||fS t | d d tjr$tjdd | D tjd}t||ksJ tj|g| d d jR tjd}t|D ]}|| | | d  q||fS ds.J dS )	zd A fast collation function optimized for uint8 images (np array or torch) and int64 targets (labels)r   )dtyper   c                 S   s   g | ]}|d  qS r    .0br   r   Y/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/data/loader.py
<listcomp>/       z fast_collate.<locals>.<listcomp>c                 S   s   g | ]}|d  qS r   r   r   r   r   r   r   6   r   FN)
isinstancetuplelentorchzerosint64shapeZuint8rangeZ
from_numpynpZndarraytensorZTensorZcopy_)batch
batch_sizeZinner_tuple_sizeZflattened_batch_sizetargetsr!   ijr   r   r   fast_collate   s8    &."""r'   c                 C   sn   t | ttfstt| |} nLt| |krVt|  }|f| } t	d|  d nt| |ksjJ d| S )Nz@Pretrained mean/std different shape than model, using avg value .z-normalization stats must match image channels)
r   r   listr   r   r    meanitem_loggerwarning)xnZx_meanr   r   r   adapt_to_chs@   s    
r0   c                
   @   st   e Zd Zeededejdddddf
dd	Zd
d Z	dd Z
edd Zedd Zedd Zejdd ZdS )PrefetchLoader   cudaF        constr   r   c                 C   s   t ||}t ||}d|ddf}|| _|| _|r6tj}|| _tjdd |D ||d|| _tjdd |D ||d|| _	|dkrt
||	|
||d| _nd | _tj o|jdk| _d S )	Nr   c                 S   s   g | ]}|d  qS    r   r   r.   r   r   r   r   g   r   z+PrefetchLoader.__init__.<locals>.<listcomp>)devicer   c                 S   s   g | ]}|d  qS r6   r   r8   r   r   r   r   i   r   r4   )Zprobabilitymode	max_countZ
num_splitsr9   r3   )r0   loaderr9   r   float16	img_dtyper!   viewr*   stdr   random_erasingr3   Zis_availabletypeis_cuda)selfr<   r*   r@   channelsr9   r>   fp16re_probre_modere_countre_num_splitsZnormalization_shaper   r   r   __init__N   s8    


zPrefetchLoader.__init__c              	   c   s   d}| j r&tj }ttjj|d}nd }t}| jD ]\}}| ` |j| j	dd}|j| j	dd}|| j
| j| j}| jd ur| |}W d    n1 s0    Y  |s||fV  nd}|d urtj | |}|}q4||fV  d S )NT)stream)r9   Znon_blockingF)rC   r   r3   ZStreamr   rL   r   r<   tor9   r>   Zsub_r*   Zdiv_r@   rA   Zcurrent_streamZwait_stream)rD   firstrL   Zstream_contextZ
next_inputZnext_targetinputtargetr   r   r   __iter__v   s*    

(zPrefetchLoader.__iter__c                 C   s
   t | jS N)r   r<   rD   r   r   r   __len__   s    zPrefetchLoader.__len__c                 C   s   | j jS rR   )r<   samplerrS   r   r   r   rU      s    zPrefetchLoader.samplerc                 C   s   | j jS rR   )r<   datasetrS   r   r   r   rV      s    zPrefetchLoader.datasetc                 C   s    t | jjtr| jjjS dS d S )NFr   r<   
collate_fnr   mixup_enabledrS   r   r   r   rY      s    
zPrefetchLoader.mixup_enabledc                 C   s   t | jjtr|| jj_d S rR   rW   )rD   r.   r   r   r   rY      s    N)__name__
__module____qualname__r   r   r   r9   float32rK   rQ   rT   propertyrU   rV   rY   setterr   r   r   r   r1   L   s*   
(


r1   allc                 C   s|   t jj }|j| ksJ t|trR||}t| t 	| t
j|d  n&|dv s^J |dkrxt
j|jd  d S )Nl    )r`   partr`   )r   utilsdataZget_worker_infoidr   r   randomseedZmanual_seedr    )Z	worker_idworker_seedingZworker_inforf   r   r   r   _worker_init   s    


rh   FTr4   r5   g      ?g?Zbilinearr3   c"           )      C   s  d}"|	r|pd}"t |||||
|||||||||||||||"|dkd| _t| tr^| j|d d }#|rt| tjjjs|r|rt	| |d}#qtjjj
| }#qt| }#n|dksJ d|d u r|rtn
tjjjj}tjjj}$|rt}$t|t| tjjj o
|#d u o
|||#|||tt|!d| d	}%z|$| fi |%}&W n@ tyz }' z&|%d	 |$| fi |%}&W Y d }'~'n
d }'~'0 0 |r|r|s|nd
}(t|&|||d ||||(|||"d}&|&S )Nr      )is_traininguse_prefetcherno_augscaleratiohflipvflipcolor_jitterauto_augmentinterpolationr*   r@   crop_pct	crop_modetf_preprocessingrG   rH   rI   rJ   Zseparate)num_workers)Znum_repeatszORepeatAugment not currently supported in non-distributed or IterableDataset use)rg   )	r#   shufflerw   rU   rX   
pin_memoryZ	drop_lastZworker_init_fnpersistent_workersrz   r4   )
r*   r@   rE   r9   rF   r>   rG   rH   rI   rJ   )r   Z	transformr   r	   Zset_loader_cfgr   rb   rc   ZIterableDatasetr   distributedZDistributedSamplerr
   r'   Z
dataloaderZdefault_collate
DataLoaderMultiEpochsDataLoaderdictr   rh   	TypeErrorpopr1   ))rV   Z
input_sizer#   rj   rk   rl   rG   rH   rI   Zre_splitrm   rn   ro   rp   rq   rr   Znum_aug_repeatsZnum_aug_splitsrs   r*   r@   rw   r{   rt   ru   rX   ry   rF   r>   r9   rv   Zuse_multi_epochs_loaderrz   rg   rJ   rU   loader_classZloader_argsr<   eZprefetch_re_probr   r   r   create_loader   s    $


 

&r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )r}   c                    sR   t  j|i | d| _| jd u r0t| j| _nt| j| _d| _t   | _d S )NFT)superrK   Z_DataLoader__initializedbatch_sampler_RepeatSamplerrU   rQ   iterator)rD   argskwargs	__class__r   r   rK   <  s    
zMultiEpochsDataLoader.__init__c                 C   s    | j d u rt| jS t| j jS rR   )r   r   rU   rS   r   r   r   rT   F  s    zMultiEpochsDataLoader.__len__c                 c   s"   t t| D ]}t| jV  qd S rR   )r   r   nextr   )rD   r%   r   r   r   rQ   I  s    zMultiEpochsDataLoader.__iter__)rZ   r[   r\   rK   rT   rQ   __classcell__r   r   r   r   r}   :  s   
r}   c                   @   s    e Zd ZdZdd Zdd ZdS )r   zH Sampler that repeats forever.

    Args:
        sampler (Sampler)
    c                 C   s
   || _ d S rR   )rU   )rD   rU   r   r   r   rK   U  s    z_RepeatSampler.__init__c                 c   s   t | jE d H  q d S rR   )iterrU   rS   r   r   r   rQ   X  s    z_RepeatSampler.__iter__N)rZ   r[   r\   __doc__rK   rQ   r   r   r   r   r   N  s   r   )r`   )-r   loggingre   
contextlibr   	functoolsr   	itertoolsr   typingr   r   Ztorch.utils.datanumpyr    	constantsr   r   rV   r	   Zdistributed_samplerr
   r   rA   r   Zmixupr   Ztransforms_factoryr   	getLoggerrZ   r,   r'   r0   r1   rh   r]   r9   r   rb   rc   r|   r}   objectr   r   r   r   r   <module>   sl   
#a

}