o
    $i                  	   @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlm  mZ d dl	m
Z
 d dlmZ d dlmZmZ d dlZd dlmZ d dlmZ d dlmZ dZdZG d	d
 d
ejZd5ddZd5ddZd6ddZdd Zedkre jddZ e j!ddddd e j!dddd e " \Z#Z$ej%e#j&rdndd  e Z'de(e#j)d!Z*ej+ej,ee*d"ej-d#d$e'e#j&rd%nd&d'ej.d(d)e#j&rd*nd+d,d-e/d.d/e0d0d1d2d3Z1e12 Z3e4d4e35 j6 e3j7rJ dS dS )7    N)FileLock)datasets
transforms)tune)
Checkpoint)AsyncHyperBandScheduleri      c                       s$   e Zd Z fddZdd Z  ZS )ConvNetc                    s2   t t|   tjdddd| _tdd| _d S )N      )kernel_size   
   )superr	   __init__nnConv2dconv1Linearfc)self	__class__ \/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/ray/tune/examples/mnist_pytorch.pyr      s   zConvNet.__init__c                 C   s<   t t | |d}|dd}| |}t j|ddS )Nr   r   r
   )dim)Frelu
max_pool2dr   viewr   log_softmax)r   xr   r   r   forward   s   
zConvNet.forward)__name__
__module____qualname__r   r#   __classcell__r   r   r   r   r	      s    r	   c           	      C   s   |pt d}|   t|D ]2\}\}}|t| tkr  d S ||||}}|  | |}t	||}|
  |  qd S )Ncpu)torchdevicetrain	enumeratelen
EPOCH_SIZEto	zero_gradr   nll_lossbackwardstep)	model	optimizertrain_loaderr*   	batch_idxdatatargetoutputlossr   r   r   
train_func&   s   
r<   c                 C   s   |pt d}|   d}d}t  S t|D ]9\}\}}|t| tkr( n4||||}}| |}t |j	d\}	}
||
d7 }||
|k  7 }qW d    || S W d    || S 1 siw   Y  || S )Nr(   r   r
   )r)   r*   evalno_gradr,   r-   	TEST_SIZEr/   maxr8   sizesumitem)r4   data_loaderr*   correcttotalr7   r8   r9   outputs_	predictedr   r   r   	test_func4   s*   





rJ   @   c                 C   s   t t  t ddg}ttjd- tj	j
jtjddd|d| dd}tj	j
jtjddd|d| dd}W d    ||fS 1 sEw   Y  ||fS )	N)g_)Ǻ?)gGr?z~/data.lockz~/dataT)r+   download	transform)
batch_sizeshuffleF)r   ComposeToTensor	Normalizer   ospath
expanduserr)   utilsr8   
DataLoaderr   MNIST)rN   mnist_transformsr6   test_loaderr   r   r   get_data_loadersF   s,   
r[   c                 C   s   |  dd}tj }t|rdnd}t \}}t |}tj	|
 | d | d d}	 t|||| t|||}d	|i}	|rmt }
t| tj|
d
 tj|	t|
d W d    n1 sgw   Y  nt|	 q.)Nshould_checkpointFcudar(   lrmomentumr^   r_   Tmean_accuracyzmodel.pt)
checkpoint)getr)   r]   is_availabler*   r[   r	   r/   optimSGD
parametersr<   rJ   tempfileTemporaryDirectorysave
state_dictrS   rT   joinr   reportr   from_directory)configr\   use_cudar*   r6   rZ   r4   r5   accmetricstempdirr   r   r   train_mnist`   s(   



rt   __main__zPyTorch MNIST Example)descriptionz--cuda
store_trueFzEnables GPU training)actiondefaulthelpz--smoke-testzFinish quickly for testing)rx   rz      )num_cpus)r(   gpu)	resourcesra   r@   r
   2   )metricmode	schedulernum_samplesexpg\(\?   d   )ra   training_iteration)namestopg-C6?g{Gz?g?g?r`   )tune_config
run_configparam_spacezBest config is:)N)rK   )8argparserS   rh   r)   torch.nnr   torch.nn.functional
functionalr   torch.optimre   filelockr   torchvisionr   r   rayr   ray.tuner   ray.tune.schedulersr   r.   r?   Moduler	   r<   rJ   r[   rt   r$   ArgumentParserparseradd_argumentparse_known_argsargsrH   init
smoke_testschedintr]   resources_per_trialTunerwith_resources
TuneConfig	RunConfig
loguniformuniformtunerfitresultsprintget_best_resultro   errorsr   r   r   r   <module>   sn   





(