Home

Awesome

energy_constrained_compression

Code for paper "ECC: Platform-Independent Energy-Constrained Deep Neural Network Compression via a Bilinear Regression Model" (https://arxiv.org/abs/1812.01803)

@inproceedings{yang2018ecc,
  title={ECC: Platform-Independent Energy-Constrained Deep Neural Network Compression via a Bilinear Regression Model},
  author={Yang, Haichuan and Zhu, Yuhao and Liu, Ji},
  booktitle={CVPR},
  year={2019}
}

Prerequisites

Python (3.6)
PyTorch 1.0

To use the ImageNet dataset, download the dataset and move validation images to labeled subfolders (e.g., using https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh)

Training and testing

example

To run the training with (TX2) energy constraint on MobileNet (with multiple GPUs),

python admm_prox_train.py --net mobilenet-imagenet --dataset imagenet --datadir ./ILSVRC_CLS/ --batch_size 128 --num_workers 8 --plr 1e-5 --l2wd 1e-4 --pslr 3.0 --psgrad_clip 1.0 --budget 0.0077 --zinit 0.0 --rho_z 10.0 --rho_y 10.0 --distill 0.5 --val_batch_size 512 --energymodel ./energymodel_mbnet_tx2.pt --logdir log/default/ --padam --psgrad_mask --mgpu --save_interval 1 --pretrain imagenet_pretrained_mbnet.pt

usage

Collect empirical measurements of energy consumption

usage: energy_tr_gen.py [-h] [--net NET] [--num NUM] [--gpuid GPUID]
                        [--num_classes NUM_CLASSES] [--test_num TEST_NUM]
                        [--conv] [--cpu] [--outfile OUTFILE]

Generate Energy Cost Data

optional arguments:
  -h, --help            show this help message and exit
  --net NET             network architecture
  --num NUM             number of samples to generate
  --gpuid GPUID         gpuid
  --num_classes NUM_CLASSES
                        number of classes
  --test_num TEST_NUM   number of repeated trails
  --conv                only use conv layers
  --cpu                 use cpu
  --outfile OUTFILE     the output file of generated data

Fit the energy estimation model

usage: energy_estimator.py [-h] [--infile INFILE] [--outfile OUTFILE]
                           [--net NET] [--preprocess PREPROCESS]
                           [--batch_size BATCH_SIZE] [--seed SEED]
                           [--epochs EPOCHS] [--wd WD] [--errhist ERRHIST]
                           [--pinv]

Energy Estimator Training

optional arguments:
  -h, --help            show this help message and exit
  --infile INFILE       the input file of training data
  --outfile OUTFILE     the output file of trained model
  --net NET             network architecture
  --preprocess PREPROCESS
                        preprocessor method
  --batch_size BATCH_SIZE
                        input batch size for training
  --seed SEED           random seed (default: 117)
  --epochs EPOCHS       number of epochs to train
  --wd WD               weight decay
  --errhist ERRHIST     the output of error history
  --pinv                use pseudo inverse to solve (only for bi-linear model)

Energy-constrained training

usage: admm_prox_train.py [-h] [--net NET] [--energymodel ENERGYMODEL]
                          [--dataset DATASET] [--datadir DATADIR]
                          [--batch_size BATCH_SIZE]
                          [--val_batch_size VAL_BATCH_SIZE]
                          [--num_workers NUM_WORKERS] [--epochs EPOCHS]
                          [--plr PLR] [--padam] [--padam_beta PADAM_BETA]
                          [--pslr PSLR] [--psgrad_mask]
                          [--psgrad_clip PSGRAD_CLIP] [--l2wd L2WD]
                          [--momentum MOMENTUM] [--zinit ZINIT]
                          [--yinit YINIT] [--lr_decay LR_DECAY]
                          [--s_int S_INT] [--randinit] [--pretrain PRETRAIN]
                          [--seed SEED] [--log_interval LOG_INTERVAL]
                          [--test_interval TEST_INTERVAL]
                          [--save_interval SAVE_INTERVAL] [--logdir LOGDIR]
                          [--distill DISTILL] [--rho_z RHO_Z] [--rho_y RHO_Y]
                          [--budget BUDGET] [--dadam] [--mgpu] [--slb SLB]
                          [--eval]

Model-Free Energy Constrained Training

optional arguments:
  -h, --help            show this help message and exit
  --net NET             network arch
  --energymodel ENERGYMODEL
                        energy prediction model file
  --dataset DATASET     dataset used in the experiment
  --datadir DATADIR     dataset dir in this machine
  --batch_size BATCH_SIZE
                        batch size for training
  --val_batch_size VAL_BATCH_SIZE
                        batch size for evaluation
  --num_workers NUM_WORKERS
                        number of workers for training
  --epochs EPOCHS       number of epochs to train
  --plr PLR             primal learning rate
  --padam               use adam for primal net update
  --padam_beta PADAM_BETA
                        betas of adam for primal net update
  --pslr PSLR           primal learning rate for sparsity
  --psgrad_mask         update s only when s.grad < 0
  --psgrad_clip PSGRAD_CLIP
                        clip s.grad to
  --l2wd L2WD           l2 weight decay
  --momentum MOMENTUM   primal momentum (if using sgd)
  --zinit ZINIT         initial dual variable z
  --yinit YINIT         initial dual variable y
  --lr_decay LR_DECAY   learning rate (default: 1)
  --s_int S_INT         how many batches for updating s
  --randinit            use random init
  --pretrain PRETRAIN   file to load pretrained model
  --seed SEED           random seed (default: 117)
  --log_interval LOG_INTERVAL
                        how many batches to wait before logging training
                        status
  --test_interval TEST_INTERVAL
                        how many epochs to wait before another test
  --save_interval SAVE_INTERVAL
                        how many epochs to wait before save a model
  --logdir LOGDIR       folder to save to the log
  --distill DISTILL     distill loss weight
  --rho_z RHO_Z         ADMM hyperparameter: rho for z
  --rho_y RHO_Y         ADMM hyperparameter: rho for y
  --budget BUDGET       energy budget
  --dadam               use adam for dual
  --mgpu                enable using multiple gpus
  --slb SLB             sparsity lower bound
  --eval                eval in the begining

Energy-constrained NetAdapt (our implementation)

usage: net_adapt.py [-h] [--net NET] [--budget BUDGET] [--abs_budget]
                    [--bdecay BDECAY] [--dataset DATASET] [--datadir DATADIR]
                    [--nclasses NCLASSES] [--batch_size BATCH_SIZE]
                    [--val_batch_size VAL_BATCH_SIZE] --energymodel
                    ENERGYMODEL [--num_workers NUM_WORKERS] [--lr LR]
                    [--l2wd L2WD] [--momentum MOMENTUM] [--pretrain PRETRAIN]
                    [--epochs EPOCHS] [--lt_epochs LT_EPOCHS] [--seed SEED]
                    [--randinit] [--eval] [--finetune] [--optim OPTIM]
                    [--log_interval LOG_INTERVAL]
                    [--test_interval TEST_INTERVAL]
                    [--save_interval SAVE_INTERVAL] [--logdir LOGDIR]
                    [--distill DISTILL] [--mgpu]

NetAdapt Implementation

optional arguments:
  -h, --help            show this help message and exit
  --net NET             network arch
  --budget BUDGET       energy budget
  --abs_budget          absolute budget
  --bdecay BDECAY       budget decay rate
  --dataset DATASET     dataset used in the experiment
  --datadir DATADIR     dataset dir in this machine
  --nclasses NCLASSES   number of classes for dataset
  --batch_size BATCH_SIZE
                        batch size for training
  --val_batch_size VAL_BATCH_SIZE
                        batch size for evaluation
  --energymodel ENERGYMODEL
                        energy predictor model
  --num_workers NUM_WORKERS
                        number of workers for train
  --lr LR               primal learning rate
  --l2wd L2WD           l2 weight decay
  --momentum MOMENTUM   primal momentum
  --pretrain PRETRAIN   file to load pretrained model
  --epochs EPOCHS       number of epochs to train
  --lt_epochs LT_EPOCHS
                        number of epochs to train
  --seed SEED           random seed (default: 117)
  --randinit            use random init
  --eval                eval mode
  --finetune            finetune mode
  --optim OPTIM         optimizer
  --log_interval LOG_INTERVAL
                        how many batches to wait before logging training
                        status
  --test_interval TEST_INTERVAL
                        how many epochs to wait before another test
  --save_interval SAVE_INTERVAL
                        how many epochs to wait before save a model
  --logdir LOGDIR       folder to save to the log
  --distill DISTILL     distill loss weight
  --mgpu                enable using multiple gpus