Source code for nni.nas.benchmarks.nds.model

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

from peewee import CharField, FloatField, ForeignKeyField, IntegerField, Model, Proxy
from playhouse.sqlite_ext import JSONField

from nni.nas.benchmarks.utils import json_dumps

proxy = Proxy()

[docs]class NdsTrialConfig(Model): """ Trial config for NDS. Attributes ---------- model_family : str Could be ``nas_cell``, ``residual_bottleneck``, ``residual_basic`` or ``vanilla``. model_spec : dict If ``model_family`` is ``nas_cell``, it contains ``num_nodes_normal``, ``num_nodes_reduce``, ``depth``, ``width``, ``aux`` and ``drop_prob``. If ``model_family`` is ``residual_bottleneck``, it contains ``bot_muls``, ``ds`` (depths), ``num_gs`` (number of groups) and ``ss`` (strides). If ``model_family`` is ``residual_basic`` or ``vanilla``, it contains ``ds``, ``ss`` and ``ws``. cell_spec : dict If ``model_family`` is not ``nas_cell`` it will be an empty dict. Otherwise, it specifies ``<normal/reduce>_<i>_<op/input>_<x/y>``, where i ranges from 0 to ``num_nodes_<normal/reduce> - 1``. If it is an ``op``, the value is chosen from the constants specified previously like :const:`nni.nas.benchmark.nds.CONV_1X1`. If it is i's ``input``, the value range from 0 to ``i + 1``, as ``nas_cell`` uses previous two nodes as inputs, and node 0 is actually the second node. Refer to NASNet paper for details. Finally, another two key-value pairs ``normal_concat`` and ``reduce_concat`` specify which nodes are eventually concatenated into output. dataset : str Dataset used. Could be ``cifar10`` or ``imagenet``. generator : str Can be one of ``random`` which generates configurations at random, while keeping learning rate and weight decay fixed, ``fix_w_d`` which further keeps ``width`` and ``depth`` fixed, only applicable for ``nas_cell``. ``tune_lr_wd`` which further tunes learning rate and weight decay. proposer : str Paper who has proposed the distribution for random sampling. Available proposers include ``nasnet``, ``darts``, ``enas``, ``pnas``, ``amoeba``, ``vanilla``, ``resnext-a``, ``resnext-b``, ``resnet``, ``resnet-b`` (ResNet with bottleneck). See NDS paper for details. base_lr : float Initial learning rate. weight_decay : float L2 weight decay applied on weights. num_epochs : int Number of epochs scheduled, during which learning rate will decay to 0 following cosine annealing. """ model_family = CharField(max_length=20, index=True, choices=[ 'nas_cell', 'residual_bottleneck', 'residual_basic', 'vanilla', ]) model_spec = JSONField(json_dumps=json_dumps, index=True) cell_spec = JSONField(json_dumps=json_dumps, index=True, null=True) dataset = CharField(max_length=15, index=True, choices=['cifar10', 'imagenet']) generator = CharField(max_length=15, index=True, choices=[ 'random', 'fix_w_d', 'tune_lr_wd', ]) proposer = CharField(max_length=15, index=True) base_lr = FloatField() weight_decay = FloatField() num_epochs = IntegerField() class Meta: database = proxy
[docs]class NdsTrialStats(Model): """ Computation statistics for NDS. Each corresponds to one trial. Attributes ---------- config : NdsTrialConfig Corresponding config for trial. seed : int Random seed selected, for reproduction. final_train_acc : float Final accuracy on training data, ranging from 0 to 100. final_train_loss : float or None Final cross entropy loss on training data. Could be NaN (None). final_test_acc : float Final accuracy on test data, ranging from 0 to 100. best_train_acc : float Best accuracy on training data, ranging from 0 to 100. best_train_loss : float or None Best cross entropy loss on training data. Could be NaN (None). best_test_acc : float Best accuracy on test data, ranging from 0 to 100. parameters : float Number of trainable parameters in million. flops : float FLOPs in million. iter_time : float Seconds elapsed for each iteration. """ config = ForeignKeyField(NdsTrialConfig, backref='trial_stats', index=True) seed = IntegerField() final_train_acc = FloatField() final_train_loss = FloatField(null=True) final_test_acc = FloatField() best_train_acc = FloatField() best_train_loss = FloatField(null=True) best_test_acc = FloatField() parameters = FloatField() flops = FloatField() iter_time = FloatField() class Meta: database = proxy
[docs]class NdsIntermediateStats(Model): """ Intermediate statistics for NDS. Attributes ---------- trial : NdsTrialStats Corresponding trial. current_epoch : int Elapsed epochs. train_loss : float or None Current cross entropy loss on training data. Can be NaN (None). train_acc : float Current accuracy on training data, ranging from 0 to 100. test_acc : float Current accuracy on test data, ranging from 0 to 100. """ trial = ForeignKeyField(NdsTrialStats, backref='intermediates', index=True) current_epoch = IntegerField(index=True) train_loss = FloatField(null=True) train_acc = FloatField() test_acc = FloatField() class Meta: database = proxy