o
     ݱi
                     @   s   d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlm	Z
 d dlZd dlmZ ej r2ejnejZdd Zdd Zdd	 Zd
d Zdd Zdd Zdd ZG dd dZdS )    N)	timedelta)	OmegaConfc                 C   s$   t |  tj |  t|  dS )z$Set random seed for reproducibility.N)randomseednptorchmanual_seed)r    r	   =/data/cameron/vidgen/unified-world-model/experiments/utils.pyset_seed   s   
r   c              	   C   s   t j| jd| d}| jr2t j|r2t|d}t|d }W d   n1 s,w   Y  n"t	j
 }t|d}td|i| W d   n1 sOw   Y  t	jd|| jd| jt| jgtj| d	d
| j|d dS )zInitialize WANDB logging. Only use in main process.

    Args:
        config: config dictionary
        job_type: "train" or "eval"
    Zrun_id_z.jsonrrun_idNwzvideo-action-learning_T)resolve)projectjob_typegroupnameconfigresumeid)ospathjoinlogdirr   existsopenjsonloadwandbutilgenerate_iddumpinitalgoZexp_idstrr   r   to_container)r   r   Zrun_id_pathfr   r	   r	   r
   
init_wandb   s&   

r)   c                 C   sD   t jddt jd< t jddt jd< tjd| |tddd d	S )
zInitialize distributed training and set visible device.

    Args:
        rank: unique identifier of each process
        world_size: total number of processes
    MASTER_ADDR	localhostMASTER_PORTZ25678nccli  )seconds)backendrank
world_sizetimeoutN)r   environgetdistinit_process_groupr   )r0   r1   r	   r	   r
   init_distributed3   s   
r7   c                   C      t  sdS t  S Nr   )r5   is_initializedget_rankr	   r	   r	   r
   r;   D      r;   c                   C   r8   )N   )r5   r:   get_world_sizer	   r	   r	   r
   r>   J   r<   r>   c                   C   s
   t  dkS r9   )r;   r	   r	   r	   r
   is_main_processP   s   
r?   c                 C   s@   t |  | D ]\}}|j|jd|  |j|   q	dS )z+Soft update target model with source model.g      ?N)zip
parametersdatacopy_)targetsourcetauZtarget_paramparamr	   r	   r
   soft_updateT   s   "rH   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )FreezeParametersc                 C   s   || _ dd | j D | _d S )Nc                 S   s   g | ]}|j qS r	   )requires_grad).0pr	   r	   r
   
<listcomp>]   s    z-FreezeParameters.__init__.<locals>.<listcomp>)paramsparam_states)selfrN   r	   r	   r
   __init__[   s   zFreezeParameters.__init__c                 C   s   | j D ]}d|_qd S )NF)rN   rJ   )rP   rG   r	   r	   r
   	__enter___   s   
zFreezeParameters.__enter__c                 C   s$   t | jD ]
\}}| j| |_qd S )N)	enumeraterN   rO   rJ   )rP   exc_typeexc_valexc_tbirG   r	   r	   r
   __exit__c   s   zFreezeParameters.__exit__N)__name__
__module____qualname__rQ   rR   rX   r	   r	   r	   r
   rI   Z   s    rI   )r   r   r   datetimer   numpyr   r   torch.distributeddistributedr5   r    	omegaconfr   cudais_bf16_supportedbfloat16float16Z	DATA_TYPEr   r)   r7   r;   r>   r?   rH   rI   r	   r	   r	   r
   <module>   s$    