|
import os |
|
|
|
from peewee import CharField, FloatField, ForeignKeyField, IntegerField, Model |
|
from playhouse.sqlite_ext import JSONField, SqliteExtDatabase |
|
|
|
from nni.nas.benchmarks.constants import DATABASE_DIR |
|
from nni.nas.benchmarks.utils import json_dumps |
|
|
|
db = SqliteExtDatabase(os.path.join(DATABASE_DIR, 'nds.db'), autoconnect=True) |
|
|
|
|
|
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 = db |
|
|
|
|
|
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 = db |
|
|
|
|
|
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 = db |
|
|