o
    Ti                     @   st   d dl mZ d dlZd dlmZ d dlmZ dd Zdded	efd
dZ	dd	efddZ
dedeej fddZdS )    )SetN)get_accelerator)OffloadStateTypeEnumc                 C   s
   |  dS )N_offload_buffer )keyr   r   Y/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/runtime/zero/offload_states.py_make_offload_state_key   s   
r	   F
pin_memorynon_blockingc                    sL    fdd}| j  D ]\}}d|v r||d d|v r#||d qdS )^Move optimizer states to device. Note that this assumes the state structure of DeepSpeed Adam.c                    sf   t |}|| vrtj| |  d| |< rt | | | |< | | j| | d | | | | _d S )N)devicer   )r	   torch
empty_liker   r
   copy_data)stater   offload_buf_keyr   r   r
   r   r   move_key   s   z%offload_adam_states.<locals>.move_keyexp_avg
exp_avg_sqNr   items)	optimizerr   r
   r   r   _r   r   r   r   offload_adam_states   s   	

r   c                    sJ    fdd}| j  D ]\}}d|v r||d d|v r"||d qdS )r   c                    s    | t | j d| | _d S )Nr   )r	   tor   )r   r   r   r   r   r   move_back_key'   s    z)reload_adam_states.<locals>.move_back_keyr   r   Nr   )r   r   r   r    r   r   r   r   r   reload_adam_states$   s   

r!   r   returnc                    s   |t jkrt fdd  D S |t jkr"tdd   D S |t jkr- jjjhS |t j	krLt fdd  D t fdd  D B S |t j
kr_ jjdkrYi S  jjjhS dS )aW  Retrieve the devices of the specified state of the model.

    Args:
        model (DeepSpeedEngine): The model whose device allocations are to be checked.
        state (OffloadStateTypeEnum): The specific state for which the devices should be retrieved.

    Returns:
        Set[torch.device]: A set of devices of the specified state.

    c                 3   s    | ]	} j |V  qd S Nr   get_hp_param_device.0pmodelr   r   	<genexpr>=   s    z$get_state_devices.<locals>.<genexpr>c                 s   s    | ]}|j jV  qd S r#   )	ds_tensorr   r&   r   r   r   r+   ?   s    c                 3       | ]
} j |d V  qdS )r   Nr$   r&   r)   r   r   r+   C       c                 3   r-   )r   Nr$   r&   r)   r   r   r+   D   r.   N)r   	hp_paramsset
parameters	lp_paramslp_gradsr   grad_partitions_flat_bufferr   optim_statescontiguous_grad_buffer6_DeepSpeedZeroOptimizer_Stage3__ipg_bucket_flat_buffer)r*   r   r   r)   r   get_state_devices1   s   




r8   )FF)F)typingr   r   deepspeed.acceleratorr   %deepspeed.runtime.zero.offload_configr   r	   boolr   r!   r   r8   r   r   r   r   <module>   s   