o
    ॵiC                     @   s   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
mZmZ G dd	 d	eZe	jejd
G dd deZdS )    N)version)Hooks)Hook)HOOKS   )OptimizerHookOptimizerProcessorc                   @   s$   e Zd Zdd Zdd Zdd ZdS )ApexOptimizerProcessorc                 C   s
   || _ d S )N	opt_level)selfr    r   k/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/hooks/optimizer/apex_optimizer_hook.py__init__   s   
zApexOptimizerProcessor.__init__c                 C   sn   ddl m} ttjtdkr|jd t	d |
|j}|j||j| jd\|_|_|j  d S )Nr   ampz1.9.0zApexAMPOptimizerHook is only tested on torch version 1.8.x,if it works abnormally please consider downgrading your torch version to 1.8.x.z	open fp16r
   )apexr   r   parsetorch__version__loggerwarninglogginginfounwrap_modulemodel
initialize	optimizerr   	zero_grad)r   trainerr   r   r   r   r   initialize_optimizer   s   

z+ApexOptimizerProcessor.initialize_optimizerc              	   C   s   |D ]}|j |  |  < qddlm} |D ] }||j | |j}|  W d    n1 s1w   Y  qt||rY|d urMtj	|j
 fi | |j  |j  d S d S )Nr   r   )train_outputsr   r   
scale_lossr   backwardr   every_n_itersr   
clip_gradsr   
parametersstepr   )r   r   	loss_keyscumulative_iters	grad_clipkr   scaled_lossr   r   r   r#   #   s&   

zApexOptimizerProcessor.backwardN)__name__
__module____qualname__r   r    r#   r   r   r   r   r	      s    r	   )module_namec                   @   s(   e Zd ZdZejZdddZdd ZdS )	ApexAMPOptimizerHooka  
    Fp16 optimizer, if torch version is less than 1.6.0,
    you must install apex (https://www.github.com/nvidia/apex) else use torch.cuda.amp by default

    Args:
        opt_level (str): "O0" and "O3" are not true mixed precision,
            but they are useful for establishing accuracy and speed baselines, respectively.
            "O1" and "O2" are different implementations of mixed precision.
            Try both, and see what gives the best speedup and accuracy for your model.
    O1c                 K   s0   || _ z	ddlm} W d S  ty   tdw )Nr   r   zPapex not installed, please install apex from https://www.github.com/nvidia/apex.)r   r   r   ImportError
ValueError)r   r   kwargsr   r   r   r   r   E   s   zApexAMPOptimizerHook.__init__c                 C   sP   | t}t|dkr$t|d jtd tfv r&|d t| j d S d S d S )Nr   )	get_hookr   lentype	processorr   set_processorr	   r   )r   r   optimizer_hookr   r   r   register_processorO   s   
z'ApexAMPOptimizerHook.register_processorN)r2   )r-   r.   r/   __doc__r   PRIORITYr   r<   r   r   r   r   r1   6   s
    

r1   )r   r   	packagingr   modelscope.metainfor   modelscope.trainers.hooksr   !modelscope.trainers.hooks.builderr   baser   r   r	   register_moduler1   r   r   r   r   <module>   s   )