Ë
    Ž\;jÉO  ã                   óà   — 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m	Z	m
Z
 ddlmZmZ ddlmZmZmZ ddlmZ ddlmZmZmZ d	Zdad
adadd„Zd„ Zd„ Z G d„ d«      Z G d„ d«      Z y)é    Né   )Ú_current_expected_placeÚ_get_paddle_placeÚ_get_paddle_place_list)ÚcoreÚin_dynamic_modeé   )ÚBatchSamplerÚIterableDatasetÚSubset)Ú_InfiniteIterableSampler)Ú_DataLoaderIterMultiProcessÚ_DataLoaderIterSingleProcessÚ_DatasetKindé<   Féô  c                 ó   — | a |ay ©N)ÚUSE_AUTOTUNEÚTUNING_STEPS)Úuse_autotuneÚtuning_stepss     úYG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/io/reader.pyÚset_autotune_configr   0   s   € à€Là�Ló    c                  ó|   — t        | «      dk(  rt        S t        | «      dk(  rt        | d   t        «      sJ ‚| d   ay )Nr   r	   )ÚlenÚUSE_PINNED_MEMORYÚ
isinstanceÚbool)Úargss    r   Úuse_pinned_memoryr"   7   s;   € ä
ˆ4ƒy�A‚~Ü Ð ä�4‹y˜AŠ~¤*¨T°!©W´dÔ";Ð;Ð;Ø  ™GÑr   c                 óî   — t        | t        t        f«      s| g} g }| D ]T  }t        |t        j                  «      s't        j                  «       }|j                  |«       |}|j                  |«       ŒV |S r   )r   ÚlistÚtupler   ÚPlaceÚ	set_placeÚappend)ÚplacesÚretÚpÚtmps       r   Ú_convert_placesr-   @   sb   € Ü�fœt¤U˜mÔ,Ø�ˆà
€CÛˆÜ˜!œTŸZ™ZÔ(Ü—*‘*“,ˆCØ�M‰M˜!ÔØˆAà�
‰
�1�ð ð €Jr   c                   ó6   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚAuToTunec                 óJ   — || _         t        j                  «       dz  | _        y )Nr   )ÚloaderÚmultiprocessingÚ	cpu_countÚmax_num_worker)Úselfr1   s     r   Ú__init__zAuToTune.__init__P   s   € ØˆŒÜ-×7Ñ7Ó9¸AÑ=ˆÕr   c                 óÐ  — t         r| j                  «       s| j                  j                  S | j	                  «       }|€| j                  j                  S t        j
                  «       }t        j                  d«       t        j                  dt        | j                  j                  «      z   «       d}t        d«      }t        j                  dt        | j                  «      z   «       d}|| j                  k  r�||_        | j                  |«      }|dz  |kD  r|}|}n&| j                  |||| j                  «      }||k(  rnG|}t        j                  dt        |«      z   dz   t        |«      z   «       |d	z  }|| j                  k  rŒ�t        j                  d
t        |«      z   «       t        j                  dt        t        j
                  «       |z
  «      z   dz   «       |S )Nz(========= DataLoader Auto Tune =========zUser config for DataLoader: r   Úinfz"Tuning Range for num_workers: 0 ~ g      è?znum_workers: ú avg_cost: r   z'auto_tune dataLoader best_num_workers: z AutoTuning Cost for DataLoader: z seconds)r   Úneed_autotuner1   Únum_workersÚget_autotune_loaderÚtimeÚloggingÚdebugÚstrÚfloatr4   Úevaluate_reader_costÚis_bestÚinfo)r5   Úauto_tune_loaderÚauto_tune_startÚbest_num_workersÚmin_costr;   Úavg_costÚ
update_nums           r   Ú__call__zAuToTune.__call__T   sÑ  € å d×&8Ñ&8Ô&:Ø—;‘;×*Ñ*Ð*ð  ×3Ñ3Ó5ÐØÐ#Ø—;‘;×*Ñ*Ð*ô Ÿ)™)›+ˆÜ�‰Ð@ÔAÜ�‰Ø*¬S°·±×1HÑ1HÓ-IÑIô	
ð ÐÜ˜“<ˆÜ�‰Ø0´3°t×7JÑ7JÓ3KÑKô	
ð ˆØ˜D×/Ñ/Ò/Ø+6ÐÔ(Ø×0Ñ0Ð1AÓBˆHØ˜$‰ Ò)Ø#�Ø#.Ñ à!Ÿ\™\Ø$Ø$ØØ×'Ñ'ó	�
ð Ð!1Ò1Øà'1Ð$Ü�M‰MØÜ�kÓ"ñ#àñ ô �h“-ñ ôð ˜1ÑˆKð/ ˜D×/Ñ/Ó/ô0 	�‰Ø5¼Ð<LÓ8MÑMô	
ô 	�‰Ø.Ü”$—)‘)“+ Ñ/Ó0ñ1àñô	
ð  Ðr   c                 óR   — t         j                  dk(  st         j                  dk(  ryy)NÚdarwinÚwin32FT)ÚsysÚplatform©r5   s    r   r:   zAuToTune.need_autotuneŽ   s   € Ü�<‰<˜8Ò#¤s§|¡|°wÒ'>Øàr   c                 ó|   — t        |t        z  t        |«      «      }t        |t	        t        |«      «      ¬«      }|S )N)Úindices)Úminr   r   r   r$   Úrange)r5   ÚdatasetÚ
batch_sizeÚnum_samplesÚsub_datasets        r   Úget_sub_datasetzAuToTune.get_sub_dataset”   s3   € Ü˜*¤|Ñ3´S¸³\ÓBˆÜ˜W¬d´5¸Ó3EÓ.FÔGˆØÐr   c                 ó  — t        j                   | j                  «      }| j                  j                  j                  }t	        | j                  j                  t
        j                  j                  «      rÖ| j                  j                  j                  }| j                  ||«      }t
        j                  j                  ||| j                  j                  j                  | j                  j                  j                  | j                  j                  j                  | j                  j                  j                  ¬«      |_        |S t	        | j                  j                  t
        j                  j                  «      rƒ| j                  j                  j                  j                   }| j                  ||«      }t
        j                  j                  ||| j                  j                  j                  ¬«      |_        |S d }|S )N)rV   rW   Únum_replicasÚrankÚshuffleÚ	drop_last)rV   rW   r_   )Úcopyr1   Úbatch_samplerrW   r   ÚpaddleÚioÚDistributedBatchSamplerrV   rZ   ÚnranksÚ
local_rankr^   r_   r
   ÚsamplerÚdata_source)r5   r1   rW   rV   rY   s        r   r<   zAuToTune.get_autotune_loader™   s~  € Ü—‘˜4Ÿ;™;Ó'ˆØ—[‘[×.Ñ.×9Ñ9ˆ
ÜØ�K‰K×%Ñ%¤v§y¡y×'HÑ'Hô
ð —k‘k×/Ñ/×7Ñ7ˆGØ×.Ñ.¨w¸
ÓCˆKÜ#)§9¡9×#DÑ#DØ#Ø%Ø!Ÿ[™[×6Ñ6×=Ñ=Ø—[‘[×.Ñ.×9Ñ9ØŸ™×1Ñ1×9Ñ9ØŸ+™+×3Ñ3×=Ñ=ð $Eó $ˆFÔ ð$ ˆô ˜Ÿ™×1Ñ1´6·9±9×3IÑ3IÔJØ—k‘k×/Ñ/×7Ñ7×CÑCˆGØ×.Ñ.¨w¸
ÓCˆKÜ#)§9¡9×#9Ñ#9Ø#Ø%ØŸ+™+×3Ñ3×=Ñ=ð $:ó $ˆFÔ ð ˆð ˆFØˆr   c                 ód  — g }d}t        j                   «       }t        |«      D ]?  \  }}|j                  t        j                   «       |z
  «       t        j                   «       }ŒA t        |«      dkD  rt	        |dd  «      t        |dd  «      z  }|S t	        |dd  «      t        |dd  «      z  }|S )Nr   r   )r=   Ú	enumerater(   r   Úsum)r5   ÚreaderÚcostsrI   ÚstartÚiÚdatas          r   rB   zAuToTune.evaluate_reader_costµ   s£   € ØˆØˆÜ—	‘	“ˆÜ  Ö(‰GˆAˆtØ�L‰LœŸ™› uÑ,Ô-Ü—I‘I“K‰Eð )ô ˆu‹:˜Š>Ü˜5  ˜9“~¬¨E°!°"¨I«Ñ6ˆHð ˆô ˜5  ˜9“~¬¨E°!°"¨I«Ñ6ˆHØˆr   c                 ó  — d}|dz   }d}||k  r~|dk  ry|| j                   _        | j                  |«      }t        j                  dt        |«      z   dz   t        |«      z   «       |dz  }||dz  |z  k  r|S |dz  }|dz  }||k  r|dk  rŒy|S )Nr   r	   é   zfor back num_workers: r9   gffffffæ?gš™™™™™é?)r1   r;   rB   r>   r?   r@   )	r5   rl   Úbest_workersÚ	best_timeÚnum_work_boundaryÚstepr;   Úboundaryr=   s	            r   rC   zAuToTune.is_bestÂ   sÃ   € ØˆØ" QÑ&ˆØˆØÐ-Ò-°$¸²(Ø&1ˆD�K‰KÔ#Ø×,Ñ,¨VÓ4ˆDÜ�M‰MØ(Ü�kÓ"ñ#àñ ô �d“)ñôð �A‰IˆDØ�i $Ñ&¨Ñ1Ò1Ø"Ð"à˜qÑ �Ø˜ÑˆHð Ð-Ò-°$¸³(ð Ðr   N)
Ú__name__Ú
__module__Ú__qualname__r6   rK   r:   rZ   r<   rB   rC   © r   r   r/   r/   O   s&   „ ò>ò8 òtòò
ò8ór   r/   c                   óH   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zd„ Zd„ Zd„ Zy)Ú
DataLoadera   
    DataLoader prodives an iterator which iterates given dataset
    once by the batch_sampler.

    DataLoader supports single-process and multi-prcess data loading,
    multi-process workers will be used to load data asynchronously if
    :attr:`num_workers` is set as a positive number.

    DataLoader supports map-style dataset and iterable-style dataset.

    For map-style datast(can get a sample from dataset with a given
    index), please see :code:`paddle.io.Dataset`.

    For iterable-style datast(get samples from dataset iteratively,
    like a Python iterator), please see :code:`paddle.io.IterableDataset`.

    For :code:`batch_sampler` please see :code:`paddle.io.BatchSampler`

    Notes:
        GPU tensor operation is not supported in subprocess currently,
        please don't use GPU tensor operations in pipeline which will
        be performed in subprocess, such as dataset transforms, collte_fn,
        etc. Numpy array and CPU tensor operation is supported.

    **Disable automatic batching**

    In certain cases such as some NLP tasks, instead of automatic batching,
    handling batching manually in dataset is needed by users. For these
    cases, automatic batching is disabled if both :attr:`batch_size` and
    :attr:`batch_sampler` is set as None, each data got from :attr:`dataset`
    should be batched data and will be processed with function define by
    :attr:`collate_fn` or :attr:`default_collate_fn`.


    Notes:
        When automatic batching is disabled, :attr:`default_collate_fn` will
        do nothing to data from dataset.


    Args:
        dataset(Dataset): the dataset to load data from, should be an
            instance of subclass of :code:`paddle.io.Dataset` or
            :code:`paddle.io.IterableDataset`.
        feed_list (list(Tensor)|tuple(Tensor), optional): feed Tensor list.
            The Tensors should be created by :code:`paddle.static.data()`.
            :attr:`feed_list` must be set if :attr:`return_list` is
            False. Default None.
        places(list(Place)|tuple(Place)|list(str), optional): a list of Place,
            to put data onto, :attr:`places` can be None, if
            :attr:`places` is None, default place(CPUPlace or CUDAPlace(0))
            will be used. Default None. If ``places`` is list of string,
            the string in the list can be ``cpu``, ``gpu:x`` and ``gpu_pinned``,
            where ``x`` is the index of the GPUs.
        return_list (bool, optional): whether the return value on each device is
            presented as a list. If :attr:`return_list=False`, the return
            value on each device would be a dict of str -> Tensor, where
            the key of the dict is the name of each fed Tensors. If
            :attr:`return_list=True`, the return value on each device would
            be a list(Tensor). :attr:`return_list` can only be True
            in dynamic graph mode. Default True.
        batch_sampler(BatchSampler, optional): an instance of `paddle.io.BatchSampler`
            to generate batch indices to draw samples from :attr:`dataset`
            and combine a batch. Default None.
        batch_size(int|None, optional): sample number in a mini-batch, a substitution
            parameter for :attr:`batch_sampler`, if :attr:`batch_sampler`
            is not set, a default `paddle.io.BatchSampler` will be used
            and initialize by :attr:`batch_size`, :attr:`shuffle` and
            :attr:`drop_last`. Default 1.
        shuffle(bool, optional): whther to shuffle indices order before genrate
            batch indices, a substitution parameter for :attr:`batch_sampler`
            see :attr:`batch_size`. Default False.
        drop_last(bool, optional): whether drop the last incomplete batch dataset size
            is not divisible by the batch size, a substitution parameter
            for :attr:`batch_sampler`, see :attr:`batch_size`. Default False
        collate_fn(callable, optional): function to generate mini-batch data by merging
            the sample list, None for only stack each fields of sample in axis
            0(same as :attr::`np.stack(..., axis=0)`). Default None
        num_workers(int, optional): the number of subprocess to load data, 0 for no
            subprocess used and loading data in main process. Default 0
        use_buffer_reader (bool, optional): whether to use bufferred reader.
            If use_buffer_reader=True, the DataLoader would prefetch
            batch data asynchronously, so it would speed up data feeding
            and occupies a little more CPU or GPU memory, i.e., the memory
            of one batch input data. Default True.
        prefetch_factor (int, optional): Number of batch data the DataLoader would prefetch
            if use_buffer_reader=True. Default 2.
        use_shared_memory (bool, optional): whether to use shared memory to speed up
            putting data into inter-process queue, set :attr:`use_shared_memory`
            as True only when the shared memory space on your machine(e.g.
            space of '/dev/shm' on Linux operating sysytem) is large enough.
            Shared memory will only be enabled in multi-process mode(num_workers
            > 0). Default True.
        timeout(int, optional): the timeout value for getting data form output queue
            of subprocesses. Default 0.
        worker_init_fn(callable, optional): init function which will be called with
            worker id on each subproces starting if not set as None. Default
            None.

    Returns:
        DataLoader: an iterable object for data iterating, each elemnet of the generated data is a Tensor.

    Examples:

        .. code-block:: python

            >>> import numpy as np

            >>> import paddle
            >>> import paddle.nn as nn
            >>> import paddle.nn.functional as F
            >>> from paddle.io import Dataset, BatchSampler, DataLoader

            >>> BATCH_NUM = 20
            >>> BATCH_SIZE = 16
            >>> EPOCH_NUM = 4

            >>> IMAGE_SIZE = 784
            >>> CLASS_NUM = 10

            >>> # define a random dataset
            >>> class RandomDataset(Dataset):
            ...     def __init__(self, num_samples):
            ...         self.num_samples = num_samples
            ...
            ...     def __getitem__(self, idx):
            ...         image = np.random.random([IMAGE_SIZE]).astype('float32')
            ...         label = np.random.randint(0, CLASS_NUM - 1, (1, )).astype('int64')
            ...         return image, label
            ...
            ...     def __len__(self):
            ...         return self.num_samples
            ...
            >>> dataset = RandomDataset(BATCH_NUM * BATCH_SIZE)

            >>> class SimpleNet(nn.Layer):
            ...     def __init__(self):
            ...         super().__init__()
            ...         self.fc = nn.Linear(IMAGE_SIZE, CLASS_NUM)
            ...
            ...     def forward(self, image, label=None):
            ...         return self.fc(image)
            ...
            >>> simple_net = SimpleNet()
            >>> opt = paddle.optimizer.SGD(learning_rate=1e-3,
            ...                             parameters=simple_net.parameters())
            ...
            >>> loader = DataLoader(dataset,
            ...                     batch_size=BATCH_SIZE,
            ...                     shuffle=True,
            ...                     drop_last=True,
            ...                     num_workers=2)
            ...
            >>> for e in range(EPOCH_NUM):
            ...     for i, (image, label) in enumerate(loader()):
            ...         out = simple_net(image)
            ...         loss = F.cross_entropy(out, label)
            ...         avg_loss = paddle.mean(loss)
            ...         avg_loss.backward()
            ...         opt.minimize(avg_loss)
            ...         simple_net.clear_gradients()
            ...         print("Epoch {} batch {}: loss = {}".format(e, i, np.mean(loss.numpy())))

    Notes:
        For reading iterable dataset with multiprocess Dataloader,
        please see :code:`paddle.io.IterableDataset`
    Nc                 ó¼  — || _         |	| _        || _        || _        || _        || _        |st        «       s	|€J d«       ‚|| _        |€
t        «       }t        |t        t        f«      rt        |«      }nt        |«      }t        |«      | _        |
dk\  sJ d«       ‚|
dkD  r=t         j"                  dk(  st         j"                  dk(  rt%        j&                  d«       d}
|
| _        |dkD  sJ d«       ‚|| _        |r|
dk(  rd| _        |dk\  sJ d	«       ‚|| _        t        |t.        «      r2t0        j2                  | _        |rt7        d
|› �«      ‚|� t7        d«      ‚t0        j8                  | _        |�|dk(  r|s|rJ d«       ‚|| _        d | _        nZ|€d | _        d | _        nI|dkD  sJ d«       ‚|| _        t        |t.        «      rt?        ||«      | _        ntA        ||||¬«      | _        || _!        | j:                  d u| _"        d| _#        t        «       rtI        «       €dn	tI        «       | _#        || _%        d | _&        tO        | «      jQ                  «       | _        y )Nz.feed_list should be set when return_list=Falser   z*num_workers should be a non-negative valuerM   rN   z�DataLoader with multi-process mode is not supported on MacOs and Windows currently. Please use signle-process mode with num_workers = 0 insteadz*prefetch_factor should be a positive valueFz&timeout should be a non-negative valuez5IterableDataset not support shuffle, but got shuffle=z0IterableDataset expect unspecified batch_samplerr	   zJbatch_size/shuffle/drop_last should not be set when batch_sampler is givenzMbatch_size should be None or a positive value when batch_sampler is not given)rV   rW   r^   r_   T))Úreturn_listÚ
collate_fnÚuse_buffer_readerÚprefetch_factorÚworker_init_fnrV   r   Ú	feed_listr   r   r$   r%   r   r   r-   r)   rO   rP   ÚwarningsÚwarnr;   Úuse_shared_memoryÚtimeoutr   r   ÚITERÚdataset_kindÚ
ValueErrorÚMAPra   rW   r   r
   r_   Úauto_collate_batchÚ
pin_memoryr"   Ú_persistent_workersÚ	_iteratorr/   rK   )r5   rV   r„   r)   r   ra   rW   r^   r_   r€   r;   r�   r‚   r‡   rˆ   rƒ   Úpersistent_workerss                    r   r6   zDataLoader.__init__€  s�  € ð& 'ˆÔØ$ˆŒØ!2ˆÔØ.ˆÔØ,ˆÔàˆŒá¤?Ô#4àÐ%ð@à?ó@Ø%à"ˆŒàˆ>Ü,Ó.ˆFÜ�fœt¤U˜mÔ,Ü+¨FÓ3‰Fä& vÓ.ˆFÜ% fÓ-ˆŒà˜aÒÐMÐ!MÓMÐØ˜Š?Ü�L‰L˜HÒ$¬¯©¸Ò(?ä�M‰MðOôð ˆKØ&ˆÔà Ò"ÐPÐ$PÓPÐ"à!2ˆÔÙ °Ò!1Ø%*ˆDÔ"à˜!Š|ÐEÐEÓEˆ|ØˆŒä�gœÔ/Ü ,× 1Ñ 1ˆDÔÙÜ ØKÈGÈ9ÐUóð ð Ð(Ü ØFóð ô !-× 0Ñ 0ˆDÔàÐ$Ø ’?©7¹9ð ð)óÐDð "/ˆDÔØ"ˆD�OØÐØ!%ˆDÔØ"ˆD�Oà ’>ð ð-ó�>ð )ˆDŒOÜ˜'¤?Ô3Ü%=Ø˜Zó&�Õ"ô &2Ø#Ø)Ø#Ø'ô	&�Ô"ð #ˆŒØ"&×"4Ñ"4¸DÐ"@ˆÔàˆŒÜÔä)Ó+Ð3‘Ô9JÓ9Lð ŒOð $6ˆÔ ØˆŒÜ# D›>×2Ñ2Ó4ˆÕr   c                 ó¾   — | j                   t        j                  k(  rt        d«      ‚| j                  rt        | j                  «      S t        | j                  «      S )Nz'length of IterableDataset not supported)rŠ   r   r‰   r‹   r�   r   ra   rV   rQ   s    r   Ú__len__zDataLoader.__len__ó  sK   € Ø×Ñ¤× 1Ñ 1Ò1ÜÐFÓGÐGà×&Ò&Ü˜4×-Ñ-Ó.Ð.ä˜4Ÿ<™<Ó(Ð(r   c                 ó   — | j                   dk(  rt        | «      S | j                  rN| j                  €t	        | «      | _        | j                  S | j                  j                  «        | j                  S t	        | «      S )Nr   )r;   r   r�   r�   r   Ú_resetrQ   s    r   Ú__iter__zDataLoader.__iter__ü  sm   € Ø×Ñ˜qÒ Ü/°Ó5Ð5Ø×%Ò%Ø�~‰~Ð%Ü!<¸TÓ!B�”ð —>‘>Ð!ð —‘×%Ñ%Ô'Ø—>‘>Ð!ä.¨tÓ4Ð4r   c                 ó"   — | j                  «       S r   )r–   rQ   s    r   rK   zDataLoader.__call__  s   € Ø�}‰}‹Ðr   )NNTNr	   FFNr   Tr   Tr   NF)rx   ry   rz   Ú__doc__r6   r“   r–   rK   r{   r   r   r}   r}   Ø   sN   „ ñeðT ØØØØØØØØØØØØØØ ó#q5òf)ò
5ór   r}   )r   )!r`   r>   r2   rO   r=   r…   rb   Úbase.frameworkr   r   r   Ú	frameworkr   r   Ú
dataloaderr
   r   r   Údataloader.batch_samplerr   Údataloader.dataloader_iterr   r   r   ÚQUEUE_GET_TIMEOUTr   r   r   r   r"   r-   r/   r}   r{   r   r   Ú<module>rŸ      s~   ðó Û Û Û 
Û Û ã ÷ñ ÷
 .ß =Ñ =Ý >÷ñ ð Ð àÐ à€Ø€ó ò$ò÷Fñ F÷Rqò qr   