o
    #j;#                     @   s   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 d dl	m
Z
 e
eejddZeZeZeZdd Zd	d
 Zdd Zdd Zdd ZddhZdd Zdd ZG dd dZh dZeZdS )    N)EXTRA_BLACK_LISTFP16_BLACK_LISTFP16_WHITE_LIST)core)
get_loggerz&%(asctime)s-%(levelname)s: %(message)s)fmtc                 C   s&   t | tr	|  } | dvrtd| S )z.
    Check amp_dtype: float16 or bfloat16
    )float16bfloat167If enable AMP, dtype should be 'float16' or 'bfloat16'.)
isinstancestrlower
ValueErrordtype r   ]/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/static/amp/fp16_lists.pycheck_amp_dtype$   s   
r   c                 C   sj   t | tjjr	| S t | tr,|  } | dkrtjjj}|S | dkr(tjjj}|S tdt	d
t| )Nr   r	   r
   TThe type of dtype is expected to be string or core.VarDesc.VarType, but recieved {}.)r   r   VarDescVarTyper   r   FP16BF16r   	TypeErrorformattype)r   var_typer   r   r   get_low_precision_vartype1   s$   


r   c                 C   s^   t | tr	t| S t | tjjr&| tjjjkrdS | tjjjkr"dS tdt	d
t| )Nr   r	   zVIf enable AMP, dtype should be core.VarDesc.VarType.FP16 or core.VarDesc.VarType.BF16.r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   get_low_precision_dtypestrG   s   
r   c                 C   sl   t | }d }t rd}nttj tjrtj  }nd}t	||\}}}h d}||8 }|||fS )NZXPUZGPU>   Zselect_inputZconditional_block_inferZtensor_array_to_tensorZwrite_to_arraywhilecastZconditional_blockZlod_array_length)
r   r   Zis_compiled_with_xpur   paddleZ	frameworkZ_current_expected_placeZCustomPlaceZget_device_typeZop_supported_infos)r   r   deviceZall_ops_sys_unsupported_listZsupported_fp16_listr   r   r   _get_sys_unsupported_list[   s   

r%   c                 C   s   t | \}}}||fS N)r%   )r   r#   Z_sys_unsupported_listZ_sys_all_listr   r   r   _get_unsupported_listz   s   r'   Zresnet_unitfused_bn_add_activationc                 C   s   t  t}| dkr|tB }|S )Nr   )copyr   _only_supported_fp16_list)r   Zwhite_list_for_dtyper   r   r   _get_white_list   s   
r+   c                  C   s   t  t} | tB } | S r&   )r)   r   r   )Z_black_listr   r   r   _get_black_list   s   
r,   c                   @   s*   e Zd ZdZ				dddZdd ZdS )	AutoMixedPrecisionListsa5  
    AutoMixedPrecisionLists is a class for black/white list. It can update
    pre-defined black list and white list according to users' custom black
    white lists. The lists are used for an algorithm which determines op's
    execution mode (fp32, fp16 or bf16).

    Args:
        custom_white_list (set): Users' custom white list.
        custom_black_list (set): Users' custom black list.
        custom_black_varnames (set): Users' custom black varibles' names.
        dtype (str): the low precision dtype, which can be set to 'float16' or 'bfloat16'.
    Nr   c                 C   s   t || _|| _|| _tt| j| _tt | _tt	| _	t
| j\}}t|| _t|| _t|| _|   d S r&   )r   	amp_dtype_custom_white_list_custom_black_listr)   r+   
white_listr,   
black_list	gray_listr'   unsupported_listZall_listblack_varnames_update_list)selfZcustom_white_listZcustom_black_listZcustom_black_varnamesr   r4   Zsys_all_listr   r   r   __init__   s   
z AutoMixedPrecisionLists.__init__c              	   C   sx  t d| j d t d| j d t d| j d | jr7| jr7| jD ]}|| jv r6td| dq'| jr]| jD ]}|| jv rK| j| n|| jv rV| j| | j	
| q=| jr| jD ]%}|| j	v rq| j	| n|| jv r|| j| | j
| | j
| qct| j\}}}g }|D ]}|| j	v r|| qt|dkrt d| d	| j d
| d dS dS )zN
        Update black and white list according to users' custom list.
        z---- custom_white_list z ---- z---- custom_black_list z---- custom_black_varnames z>The given custom_white_list overlaps custom_black_list with < z >!r   zOn current z, z" is not supported for operators < z > in white_list!N)_loggerdebugr/   r0   r5   r   r2   remover3   r1   addr4   r%   r.   appendlenwarning)r7   Zop_namer"   r$   r#   Zactual_unsupported_listr   r   r   r6      sL   











z$AutoMixedPrecisionLists._update_list)NNNr   )__name__
__module____qualname____doc__r8   r6   r   r   r   r   r-      s    
r-   >.   Zelementwise_floordivsignstackZelementwise_subZ
c_identityZelementwise_addsplitr    Zflatten2Zgaussian_randomZ
batch_normZ
transpose2Zelementwise_maxZuniform_randomZelementwise_divZget_tensor_from_selected_rowsZfused_attentionZreshape2ZgatherZfill_constantconcatsliceZ
layer_normZpool2dZelementwise_modZunstackscaleZrelu6Zfused_feedforwardZdropoutZtop_kZ	soft_reluranktanhZc_concatZelementwise_mulZsigmoidZuniform_random_batch_size_likeZ
leaky_reluZfused_multi_transformerZc_allreduce_sumZelementwise_minr(   Zpool3dZreluZelementwise_pow)r)   loggingr!   Zpaddle.amp.amp_listsr   r   r   Zpaddle.baser   Zpaddle.base.log_helperr   r@   INFOr9   r2   Z_extra_black_listr1   r   r   r   r%   r'   r*   r+   r,   r-   r3   ZCustomOpListsr   r   r   r   <module>   s.   N1