o
    TiD                     @   sd   d Z ddlZddlZddlmZ ddlmZ dZdd Zd	d
 Z	dd Z
dd Zdd Zdd ZdS )zM
Functionality of swapping optimizer tensors to/from (NVMe) storage devices.
    N   )refine_integer_value)get_accelerator:c                 C   sD   | j rt| j tkrt| j | _ | jr t| jtkr t| j| _| S )N)io_sizetypestrr   
block_sizeargs r   N/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/nvme/ds_aio_args.pyrefine_args   s
   r   c                    sT    j d ur fddt jD }|S i } jD ]}|t}|d ||d < q|S )Nc                    s   i | ]}| j qS r   )folder).0ir
   r   r   
<dictcomp>   s    z%_get_mapping_dict.<locals>.<dictcomp>r   r   )r   rangemulti_processfolder_to_device_mappingsplitMAPPING_DELIMITER)r   dmfieldsr   r
   r   _get_mapping_dict   s   


r   c                 C   s   d}g }dd | j D }t|dkr|dt d|  d}dd | j D }d	d |D }t|dkr>|d
|  d}| jr`dd | j D }dd |D }t|dkr`|d|  d}||fS )NTc                 S   s   g | ]}t |vr|qS r   )r   r   r   r   r   r   
<listcomp>*       z,_validate_folder_mapping.<locals>.<listcomp>r   zMissing delimiter (z) in folder_to_device_mapping Fc                 S   s   g | ]	}| td  qS )r   )r   r   r   r   r   r   r   0   s    c                 S   s   g | ]
}t j|s|qS r   )ospathexists)r   r   r   r   r   r   1   s    z-Invalid folders in folder_to_device_mapping: c                 S   s   g | ]}t |td  qS )r   )intr   r   r   r   r   r   r   7       c                 S   s   g | ]}|t   k s|qS r   )r   device_count)r   dev_idr   r   r   r   8   r#   z0Invalid device ids in folder_to_device_mapping: )r   lenappendr   gpu)r   no_errorerror_messagesinvalid_mappingsfolder_listinvalid_foldersdevice_listinvalid_device_listr   r   r   _validate_folder_mapping'   s(   r0   c                 C   s  d}g }| j d urt| jdkr|d d}n| j d u r+t| jdkr+|d d}| j d urCtj| j sCd}|d| j  d t| jdkrXt| \}}|oS|}||7 }| jre| j	se|d d}|st
d	t| d
 t|D ]\}}t
|d  d|  qu|S )NTr   zE--folder and --folder_to_device_mapping cannot be specified together.FzIAt least one of --folder or --folder_to_device_mapping must be specified.zInvalid folder in --folder:  z,--gpu must be set to transfer with --use_gdszFound z validation errorsr   z: )r   r&   r   r'   r   r    r!   r0   use_gdsr(   print	enumerate)r   r)   r*   no_mapping_errormapping_error_messagesr   msgr   r   r   validate_args@   s.   


r8   c                  C   s4  t  } | jdd tdd | jdg ddd | jdtd d	d
d | jdddd | jdtddd | jdtddd | jdtddd | jdddd | jdddd | jdddd | jd dd!d | jd"td#d$d | jd%td d&d | jd'dd(d | jd)dd*d | jd+dd,d |  }td-|  |S ).Nz--folderzFolder to use for I/O.)defaultr   helpz--folder_to_device_mapping+a!  Specification of mapping of folder to (gpu) device id, (ignored for cpu accesses).Can be specified multiple times for multi-process runs,e.g. --folder_to_device_mapping /mnt/nvme0:0 --folder_to_device_mapping /mnt/nvme1:15 --gpumeans access /mnt/nvme0 with gpu 0 and /mnt/nvme1 with gpu 15)r9   nargsr:   z	--io_sizeTz!Number of bytes to read or write.)r   r9   requiredr:   z--read
store_truez#Perform read I/O (default is write))actionr:   z--multi_processr   z3Number of parallel processes doing I/O (default 1).)r   r9   r:   z--block_size1MzGI/O block size. Can use K, M, or G suffix (default 1M for 1 megabytes).z--queue_depth    zI/O queue depth (default 32).z--single_submitzOSubmit I/O requests in singles (default is submit queue_depth amount at once.).z--sequential_requestsz}Delay I/O request submission until completion of prior requests (default is overlap I/O submission and completion requests.).z
--validatez.Perform validation of I/O transfer in library.z--handlezUse AIO handle.z--loops   zCount of operation repetitionsz--io_parallelzPer iop parallelismz--gpuzUse GPU memoryz	--use_gdszEnable GDS AIOz--slow_bounce_bufferzSFor GPU memory transfers, measure impact of bounce buffer pinning on critical path.zargs = )argparseArgumentParseradd_argumentr   r"   
parse_argsr3   )parserr   r   r   r   parse_argumentsc   sT   rH   c               
   C   s   t  } t| } t| st  td | jrdnd}t| | _dd | j D | _	t
| jt
| j	ks5J tdt
| j	 d| d t| j	D ]\}\}}td	| d
| d| d|  qH| S )Nz/Successful validation of command line argumentsr(   processc                 S   s   g | ]\}}||fqS r   r   )r   	device_idr   r   r   r   r      r   z&get_validated_args.<locals>.<listcomp>zConfiguring r1   z to folder mapping[z]: z <----> )rH   r   r8   quitr3   r(   r   mapping_dictitemsmapping_listr&   r4   )r   peer_tagr   rJ   r   r   r   r   get_validated_args   s   
"rQ   )__doc__rC   r   test_ds_aio_utilsr   deepspeed.acceleratorr   r   r   r   r0   r8   rH   rQ   r   r   r   r   <module>   s   
#=