o
    TiU                     @   s8   d dl Z d dlmZ d dlmZ G dd de jjZdS )    N)CPUAdagradBuilder)should_log_lec                       sH   e Zd ZdZd fdd	Zdd	 Z fd
dZe dddZ	  Z
S )DeepSpeedCPUAdagradr   {Gz?绽|=FTc                    sf   t ||||d}tt| || tj| _tjd t_|| _t  | _	| j	
| j|||td d S )N)lrepsweight_decayamsgrad   info)dictsuperr   __init__optimizer_idopt_idfp32_optimizer_statesr   loadds_opt_adagradcreate_adagradr   )selfmodel_paramsr   r   r	   r
   r   default_args	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/ops/adagrad/cpu_adagrad.pyr      s   zDeepSpeedCPUAdagrad.__init__c                 C   s   | j | j d S N)r   destroy_adagradr   )r   r   r   r   __del__   s   zDeepSpeedCPUAdagrad.__del__c                    s,   t t| | | jD ]}|dd qd S )Nr
   F)r   r   __setstate__param_groups
setdefault)r   stategroupr   r   r   r       s   
z DeepSpeedCPUAdagrad.__setstate__Nc                 C   s  d}|durt   | }W d   n1 sw   Y  t d}t| jD ]\}}t|d D ]\}}|jdu r;q1|j|ksIJ d|j d| j| }t|dkrld|d< | jr^t j	n|j
}	t j|j|	dd|d	< |d  d
7  < |jjdkr||j}
|d	 |j}| j| j|d |d |d |d |
 |j |  |
 ||
 < | |d	 | < q1| j| j|d |d |d |d |j|jj|d	  q1q'|S )a  Update the model parameters.

        .. note::
            This method will be called internally by ZeRO-Offload. DeepSpeed
            users should still use ``engine.step()`` as shown in the
            `Getting Started
            <https://www.deepspeed.ai/getting-started/#training>`_ guide.

        Args:
            closure (callable, optional): closure to compute the loss.
                Defaults to ``None``.

        Returns:
            loss: if ``closure`` is provided. Otherwise ``None``.
        NcpuparamszCPUAdagrad param is on zY and must be 'cpu', make sure you enabled 'offload_optimizer': 'cpu' in your ZeRO config.r   step)dtypedevice
exp_avg_sqr   Tr   r   r	   )torchenable_gradr)   	enumerater!   gradr#   lenr   floatr(   
zeros_likedata	is_sparsesparse_maskr   adagrad_updater   valuesindices)r   closurelossr)   group_idr$   param_idpr#   state_dtypesparse_paramsparse_exp_avg_sqr   r   r   r'   $   s>   



#zDeepSpeedCPUAdagrad.step)r   r   r   FTr   )__name__
__module____qualname__r   r   r   r    r+   no_gradr'   __classcell__r   r   r   r   r      s    r   )r+   deepspeed.ops.op_builderr   deepspeed.utils.loggingr   optim	Optimizerr   r   r   r   r   <module>   s   