DARTS code for architecture search model implemented in JAX. Currently, majority of the codebase is not supported. Only model_search.py
and its dependecies are transcribed. This allows to build a DARTS model Network
in JAX.
The majority of the port makes use of the excellent Equinox (for JAX) library.
This pacakge depends on jfi, a helper interface for JAX I made.
Equinox provides an experimental BatchNorm, but I found it to slow compilation enormously. Instead, I implemented a custom BatchNorm2d, but with explicit state
tracking.
from jfi import jaxm # JAXFriendlyInterface module
from darts_jax.cnn.model_search import Network
in_channels, classes, layers = 3, 10, 16
network = Network(in_channels, classes, layers)
x0 = jaxm.randn((2, 3, 32, 32))
x, state0 = network(x0)
x, state = network(x0, state=state)
Done:
-
model_search.py
ported,Network
can be represented in JAX -
make_functional
implemented to convert a DARTS Network in a functional model - custom
BatchNorm2d
implemented
TODO:
- port training code
- port most likely network resolution (alpha argmax)
- ...
Original README below
Code accompanying the paper
The algorithm is based on continuous relaxation and gradient descent in the architecture space. It is able to efficiently design high-performance convolutional architectures for image classification (on CIFAR-10 and ImageNet) and recurrent architectures for language modeling (on Penn Treebank and WikiText-2). Only a single GPU is required.DARTS: Differentiable Architecture Search
Hanxiao Liu, Karen Simonyan, Yiming Yang.
arXiv:1806.09055.
Python >= 3.5.5, PyTorch == 0.3.1, torchvision == 0.2.0
NOTE: PyTorch 0.4 is not supported at this moment and would lead to OOM.
Instructions for acquiring PTB and WT2 can be found here. While CIFAR-10 can be automatically downloaded by torchvision, ImageNet needs to be manually downloaded (preferably to a SSD) following the instructions here.
The easist way to get started is to evaluate our pretrained DARTS models.
CIFAR-10 (cifar10_model.pt)
cd cnn && python test.py --auxiliary --model_path cifar10_model.pt
- Expected result: 2.63% test error rate with 3.3M model params.
PTB (ptb_model.pt)
cd rnn && python test.py --model_path ptb_model.pt
- Expected result: 55.68 test perplexity with 23M model params.
ImageNet (imagenet_model.pt)
cd cnn && python test_imagenet.py --auxiliary --model_path imagenet_model.pt
- Expected result: 26.7% top-1 error and 8.7% top-5 error with 4.7M model params.
To carry out architecture search using 2nd-order approximation, run
cd cnn && python train_search.py --unrolled # for conv cells on CIFAR-10
cd rnn && python train_search.py --unrolled # for recurrent cells on PTB
Note the validation performance in this step does not indicate the final performance of the architecture. One must train the obtained genotype/architecture from scratch using full-sized models, as described in the next section.
Also be aware that different runs would end up with different local minimum. To get the best result, it is crucial to repeat the search process with different seeds and select the best cell(s) based on validation performance (obtained by training the derived cell from scratch for a small number of epochs). Please refer to fig. 3 and sect. 3.2 in our arXiv paper.
Figure: Snapshots of the most likely normal conv, reduction conv, and recurrent cells over time.
To evaluate our best cells by training from scratch, run
cd cnn && python train.py --auxiliary --cutout # CIFAR-10
cd rnn && python train.py # PTB
cd rnn && python train.py --data ../data/wikitext-2 \ # WT2
--dropouth 0.15 --emsize 700 --nhidlast 700 --nhid 700 --wdecay 5e-7
cd cnn && python train_imagenet.py --auxiliary # ImageNet
Customized architectures are supported through the --arch
flag once specified in genotypes.py
.
The CIFAR-10 result at the end of training is subject to variance due to the non-determinism of cuDNN back-prop kernels. It would be misleading to report the result of only a single run. By training our best cell from scratch, one should expect the average test error of 10 independent runs to fall in the range of 2.76 +/- 0.09% with high probability.
Figure: Expected learning curves on CIFAR-10 (4 runs), ImageNet and PTB.
Package graphviz is required to visualize the learned cells
python visualize.py DARTS
where DARTS
can be replaced by any customized architectures in genotypes.py
.
If you use any part of this code in your research, please cite our paper:
@article{liu2018darts,
title={DARTS: Differentiable Architecture Search},
author={Liu, Hanxiao and Simonyan, Karen and Yang, Yiming},
journal={arXiv preprint arXiv:1806.09055},
year={2018}
}