o
    ॵi	                     @   sb   d dl Z d dlZd dlmZmZ d dlZd dlZg dZdd Z	G dd dZ
G dd	 d	eZdS )
    N)defaultdictdeque)AverageMeterMeterBuffergpu_mem_usagec                  C   s   t j } | d S )zC
    Compute the GPU memory usage for the current device (MB).
    i   )torchcudamax_memory_allocated)mem_usage_bytes r   K/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/utils/metric.pyr      s   
r   c                   @   sn   e Zd ZdZdddZdd Zedd Zed	d
 Zedd Z	edd Z
edd Zdd Zdd ZdS )r   zsTrack a series of values and provide access to smoothed values over a
    window or the global series average.
    2   c                 C   s   t |d| _d| _d| _d S )N)maxlen        r   )r   _deque_total_count)selfwindow_sizer   r   r   __init__   s   
zAverageMeter.__init__c                 C   s,   | j | |  jd7  _|  j|7  _d S )N   )r   appendr   r   )r   valuer   r   r   update$   s   zAverageMeter.updatec                 C   s   t t| j}t |S N)nparraylistr   medianr   dr   r   r   r   )   s   
zAverageMeter.medianc                 C   s   t t| j}| S r   )r   r   r   r   meanr   r   r   r   avg.   s   zAverageMeter.avgc                 C   s   | j t| jd S )Ngh㈵>)r   maxr   r   r   r   r   
global_avg4   s   zAverageMeter.global_avgc                 C   s   t | jdkr| jd S d S )Nr   )lenr   r$   r   r   r   latest8   s   zAverageMeter.latestc                 C   s   | j S r   )r   r$   r   r   r   total<   s   zAverageMeter.totalc                 C   s   | j   d| _d| _d S )Nr   r   )r   clearr   r   r$   r   r   r   reset@   s   

zAverageMeter.resetc                 C   s   | j   d S r   )r   r*   r$   r   r   r   r*   E   s   zAverageMeter.clearN)r   )__name__
__module____qualname____doc__r   r   propertyr   r"   r%   r(   r)   r+   r*   r   r   r   r   r      s     





r   c                       sF   e Zd ZdZd fdd	Zdd Zddd	ZdddZdd Z  Z	S )r   z1Computes and stores the average and current value   c                    s   t jt|d}t | d S )N)r   )	functoolspartialr   superr   )r   r   factory	__class__r   r   r   L   s   zMeterBuffer.__init__c                 C      |   D ]}|  qd S r   )valuesr+   r   vr   r   r   r+   P      
zMeterBuffer.resettimec                    s    fdd|   D S )Nc                    s   i | ]\}} |v r||qS r   r   ).0kr;   
filter_keyr   r   
<dictcomp>U   s    z2MeterBuffer.get_filtered_meter.<locals>.<dictcomp>)items)r   rA   r   r@   r   get_filtered_meterT   s   zMeterBuffer.get_filtered_meterNc                 K   sN   |d u ri }| | | D ]\}}t|tjr| }| |  | qd S r   )r   rC   
isinstancer   Tensordetach)r   r9   kwargsr?   r;   r   r   r   r   W   s   
zMeterBuffer.updatec                 C   r8   r   )r9   r*   r:   r   r   r   clear_meters`   r<   zMeterBuffer.clear_meters)r1   )r=   r   )
r,   r-   r.   r/   r   r+   rD   r   rI   __classcell__r   r   r6   r   r   I   s    

	r   )r2   oscollectionsr   r   numpyr   r   __all__r   r   r   r   r   r   r   <module>   s   /