From 8f002c8b6ec0b6d216d589940e69431dd73346da Mon Sep 17 00:00:00 2001 From: SparkSnail Date: Fri, 21 May 2021 13:58:42 +0800 Subject: [PATCH 1/5] Set version check as warning (#3654) --- nni/tools/trial_tool/trial_keeper.py | 3 +-- nni/tools/trial_tool/trial_runner.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/nni/tools/trial_tool/trial_keeper.py b/nni/tools/trial_tool/trial_keeper.py index c6e502d13e..65ea160a27 100644 --- a/nni/tools/trial_tool/trial_keeper.py +++ b/nni/tools/trial_tool/trial_keeper.py @@ -151,14 +151,13 @@ def check_version(args): nni_log(LogType.Info, 'nni_manager_version is {0}'.format(nni_manager_version)) log_entry = {} if trial_keeper_version != nni_manager_version: - nni_log(LogType.Error, 'Version does not match!') + nni_log(LogType.Warning, 'Version does not match!') error_message = 'NNIManager version is {0}, TrialKeeper version is {1}, NNI version does not match!'.format( nni_manager_version, trial_keeper_version) log_entry['tag'] = 'VCFail' log_entry['msg'] = error_message rest_post(gen_send_version_url(args.nnimanager_ip, args.nnimanager_port), json.dumps(log_entry), 10, False) - os._exit(1) else: nni_log(LogType.Info, 'Version match!') log_entry['tag'] = 'VCSuccess' diff --git a/nni/tools/trial_tool/trial_runner.py b/nni/tools/trial_tool/trial_runner.py index 9f39fe74b5..ebc6ee7dad 100644 --- a/nni/tools/trial_tool/trial_runner.py +++ b/nni/tools/trial_tool/trial_runner.py @@ -119,7 +119,7 @@ def check_version(args): nni_log(LogType.Info, '{0}: nni_manager_version is {1}'.format(args.node_id, nni_manager_version)) log_entry = {} if trial_runner_version != nni_manager_version: - nni_log(LogType.Error, '{0}: Version does not match!'.format(args.node_id)) + nni_log(LogType.Warning, '{0}: Version does not match!'.format(args.node_id)) error_message = '{0}: NNIManager version is {1}, Trial runner version is {2}, NNI version does not match!'.format( args.node_id, nni_manager_version, trial_runner_version) log_entry['tag'] = 'VCFail' @@ -127,7 +127,6 @@ def check_version(args): command_channel.send(CommandType.VersionCheck, log_entry) while not command_channel.sent(): time.sleep(1) - os._exit(1) else: nni_log(LogType.Info, '{0}: Version match!'.format(args.node_id)) log_entry['tag'] = 'VCSuccess' From dfe3c27b3f005de6881945dd2a783c177d27cd1e Mon Sep 17 00:00:00 2001 From: SparkSnail Date: Fri, 21 May 2021 13:59:04 +0800 Subject: [PATCH 2/5] Fix aml v2 config (#3655) --- .../reusable/environments/amlEnvironmentService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ts/nni_manager/training_service/reusable/environments/amlEnvironmentService.ts b/ts/nni_manager/training_service/reusable/environments/amlEnvironmentService.ts index ca19c77560..2cecfc63d5 100644 --- a/ts/nni_manager/training_service/reusable/environments/amlEnvironmentService.ts +++ b/ts/nni_manager/training_service/reusable/environments/amlEnvironmentService.ts @@ -101,7 +101,9 @@ export class AMLEnvironmentService extends EnvironmentService { amlEnvironment.command = `mv envs outputs/envs && cd outputs && ${amlEnvironment.command}`; } amlEnvironment.command = `import os\nos.system('${amlEnvironment.command}')`; - amlEnvironment.useActiveGpu = !!this.config.deprecated.useActiveGpu; + if (this.config.deprecated && this.config.deprecated.useActiveGpu !== undefined) { + amlEnvironment.useActiveGpu = this.config.deprecated.useActiveGpu; + } amlEnvironment.maxTrialNumberPerGpu = this.config.maxTrialNumberPerGpu; await fs.promises.writeFile(path.join(environmentLocalTempFolder, 'nni_script.py'), amlEnvironment.command, { encoding: 'utf8' }); From ac14b9e413d61bca847a69888d3dd2cbe2765af5 Mon Sep 17 00:00:00 2001 From: Yiwu Yao Date: Fri, 21 May 2021 17:44:45 +0800 Subject: [PATCH 3/5] New NAS algorithm: Blockwise DNAS FBNet (#3532) --- docs/en_US/NAS/FBNet.rst | 151 ++++++ docs/en_US/NAS/Overview.rst | 2 + docs/en_US/NAS/one_shot_nas.rst | 1 + docs/img/fbnet.png | Bin 0 -> 310973 bytes examples/nas/oneshot/pfld/__init__.py | 0 examples/nas/oneshot/pfld/datasets.py | 62 +++ examples/nas/oneshot/pfld/export.py | 70 +++ examples/nas/oneshot/pfld/lib/__init__.py | 0 examples/nas/oneshot/pfld/lib/builder.py | 55 +++ examples/nas/oneshot/pfld/lib/ops.py | 456 +++++++++++++++++++ examples/nas/oneshot/pfld/lib/subnet.py | 164 +++++++ examples/nas/oneshot/pfld/lib/supernet.py | 164 +++++++ examples/nas/oneshot/pfld/lib/trainer.py | 297 ++++++++++++ examples/nas/oneshot/pfld/lib/utils.py | 127 ++++++ examples/nas/oneshot/pfld/retrain.py | 313 +++++++++++++ examples/nas/oneshot/pfld/train.py | 184 ++++++++ nni/algorithms/nas/pytorch/fbnet/__init__.py | 11 + nni/algorithms/nas/pytorch/fbnet/mutator.py | 268 +++++++++++ nni/algorithms/nas/pytorch/fbnet/trainer.py | 413 +++++++++++++++++ nni/algorithms/nas/pytorch/fbnet/utils.py | 352 ++++++++++++++ 20 files changed, 3090 insertions(+) create mode 100644 docs/en_US/NAS/FBNet.rst create mode 100644 docs/img/fbnet.png create mode 100644 examples/nas/oneshot/pfld/__init__.py create mode 100644 examples/nas/oneshot/pfld/datasets.py create mode 100644 examples/nas/oneshot/pfld/export.py create mode 100644 examples/nas/oneshot/pfld/lib/__init__.py create mode 100644 examples/nas/oneshot/pfld/lib/builder.py create mode 100644 examples/nas/oneshot/pfld/lib/ops.py create mode 100644 examples/nas/oneshot/pfld/lib/subnet.py create mode 100644 examples/nas/oneshot/pfld/lib/supernet.py create mode 100644 examples/nas/oneshot/pfld/lib/trainer.py create mode 100644 examples/nas/oneshot/pfld/lib/utils.py create mode 100644 examples/nas/oneshot/pfld/retrain.py create mode 100644 examples/nas/oneshot/pfld/train.py create mode 100644 nni/algorithms/nas/pytorch/fbnet/__init__.py create mode 100644 nni/algorithms/nas/pytorch/fbnet/mutator.py create mode 100644 nni/algorithms/nas/pytorch/fbnet/trainer.py create mode 100644 nni/algorithms/nas/pytorch/fbnet/utils.py diff --git a/docs/en_US/NAS/FBNet.rst b/docs/en_US/NAS/FBNet.rst new file mode 100644 index 0000000000..1fb18f4165 --- /dev/null +++ b/docs/en_US/NAS/FBNet.rst @@ -0,0 +1,151 @@ +FBNet +====== + +For the mobile application of facial landmark, based on the basic architecture of PFLD model, we have applied the FBNet (Block-wise DNAS) to design an concise model with the trade-off between latency and accuracy. References are listed as below: + + +* `FBNet: Hardware-Aware Efficient ConvNet Design via Differentiable Neural Architecture Search `__ +* `PFLD: A Practical Facial Landmark Detector `__ + +FBNet is a block-wise differentiable NAS method (Block-wise DNAS), where the best candidate building blocks can be chosen by using Gumbel Softmax random sampling and differentiable training. At each layer (or stage) to be searched, the diverse candidate blocks are side by side planned (just like the effectiveness of structural re-parameterization), leading to sufficient pre-training of the supernet. The pre-trained supernet is further sampled for finetuning of the subnet, to achieve better performance. + +.. image:: ../../img/fbnet.png + :target: ../../img/fbnet.png + :alt: + + +PFLD is a lightweight facial landmark model for realtime application. The architecture of PLFD is firstly simplified for acceleration, by using the stem block of PeleeNet, average pooling with depthwise convolution and eSE module. + +To achieve better trade-off between latency and accuracy, the FBNet is further applied on the simplified PFLD for searching the best block at each specific layer. The search space is based on the FBNet space, and optimized for mobile deployment by using the average pooling with depthwise convolution and eSE module etc. + + +Experiments +------------ + +To verify the effectiveness of FBNet applied on PFLD, we choose the open source dataset with 106 landmark points as the benchmark: + +* `Grand Challenge of 106-Point Facial Landmark Localization `__ + +The baseline model is denoted as MobileNet-V3 PFLD (`Reference baseline `__), and the searched model is denoted as Subnet. The experimental results are listed as below, where the latency is tested on Qualcomm 625 CPU (ARMv8): + + +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Model + - Size + - Latency + - Validation NME + * - MobileNet-V3 PFLD + - 1.01MB + - 10ms + - 6.22% + * - Subnet + - 693KB + - 1.60ms + - 5.58% + + +Example +-------- + +`Example code `__ + +Please run the following scripts at the example directory. + +The Python dependencies used here are listed as below: + +.. code-block:: bash + + numpy==1.18.5 + opencv-python==4.5.1.48 + torch==1.6.0 + torchvision==0.7.0 + onnx==1.8.1 + onnx-simplifier==0.3.5 + onnxruntime==1.7.0 + +Data Preparation +----------------- + +Firstly, you should download the dataset `106points dataset `__ to the path ``./data/106points`` . The dataset includes the train-set and test-set: + +.. code-block:: bash + + ./data/106points/train_data/imgs + ./data/106points/train_data/list.txt + ./data/106points/test_data/imgs + ./data/106points/test_data/list.txt + + +Quik Start +----------- + +1. Search +^^^^^^^^^^ + +Based on the architecture of simplified PFLD, the setting of multi-stage search space and hyper-parameters for searching should be firstly configured to construct the supernet, as an example: + +.. code-block:: bash + + from lib.builder import search_space + from lib.ops import PRIMITIVES + from lib.supernet import PFLDInference, AuxiliaryNet + from nni.algorithms.nas.pytorch.fbnet import LookUpTable, NASConfig, + + # configuration of hyper-parameters + # search_space defines the multi-stage search space + nas_config = NASConfig( + model_dir="./ckpt_save", + nas_lr=0.01, + mode="mul", + alpha=0.25, + beta=0.6, + search_space=search_space, + ) + # lookup table to manage the information + lookup_table = LookUpTable(config=nas_config, primitives=PRIMITIVES) + # created supernet + pfld_backbone = PFLDInference(lookup_table) + + +After creation of the supernet with the specification of search space and hyper-parameters, we can run below command to start searching and training of the supernet: + +.. code-block:: bash + + python train.py --dev_id "0,1" --snapshot "./ckpt_save" --data_root "./data/106points" + +The validation accuracy will be shown during training, and the model with best accuracy will be saved as ``./ckpt_save/supernet/checkpoint_best.pth``. + + +2. Finetune +^^^^^^^^^^^^ + +After pre-training of the supernet, we can run below command to sample the subnet and conduct the finetuning: + +.. code-block:: bash + + python retrain.py --dev_id "0,1" --snapshot "./ckpt_save" --data_root "./data/106points" \ + --supernet "./ckpt_save/supernet/checkpoint_best.pth" + +The validation accuracy will be shown during training, and the model with best accuracy will be saved as ``./ckpt_save/subnet/checkpoint_best.pth``. + + +3. Export +^^^^^^^^^^ + +After the finetuning of subnet, we can run below command to export the ONNX model: + +.. code-block:: bash + + python export.py --supernet "./ckpt_save/supernet/checkpoint_best.pth" \ + --resume "./ckpt_save/subnet/checkpoint_best.pth" + +ONNX model is saved as ``./output/subnet.onnx``, which can be further converted to the mobile inference engine by using `MNN `__ . + +The checkpoints of pre-trained supernet and subnet are offered as below: + +* `Supernet `__ +* `Subnet `__ +* `ONNX model `__ diff --git a/docs/en_US/NAS/Overview.rst b/docs/en_US/NAS/Overview.rst index 6c56fb171d..a8d20a2e7d 100644 --- a/docs/en_US/NAS/Overview.rst +++ b/docs/en_US/NAS/Overview.rst @@ -58,6 +58,8 @@ NNI currently supports the one-shot NAS algorithms listed below and is adding mo - `Cyclic Differentiable Architecture Search `__ builds a cyclic feedback mechanism between the search and evaluation networks. It introduces a cyclic differentiable architecture search framework which integrates the two networks into a unified architecture. * - `ProxylessNAS `__ - `ProxylessNAS: Direct Neural Architecture Search on Target Task and Hardware `__. It removes proxy, directly learns the architectures for large-scale target tasks and target hardware platforms. + * - `FBNet `__ + - `FBNet: Hardware-Aware Efficient ConvNet Design via Differentiable Neural Architecture Search `__. It is a block-wise differentiable neural network architecture search method with the hardware-aware constraint. * - `TextNAS `__ - `TextNAS: A Neural Architecture Search Space tailored for Text Representation `__. It is a neural architecture search algorithm tailored for text representation. * - `Cream `__ diff --git a/docs/en_US/NAS/one_shot_nas.rst b/docs/en_US/NAS/one_shot_nas.rst index 77b3cfcc94..c0efeb282c 100644 --- a/docs/en_US/NAS/one_shot_nas.rst +++ b/docs/en_US/NAS/one_shot_nas.rst @@ -14,5 +14,6 @@ One-shot NAS algorithms leverage weight sharing among models in neural architect SPOS CDARTS ProxylessNAS + FBNet TextNAS Cream diff --git a/docs/img/fbnet.png b/docs/img/fbnet.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c44e76917d9d758d227807e2633aa710567d8b GIT binary patch literal 310973 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 literal 0 HcmV?d00001 diff --git a/examples/nas/oneshot/pfld/__init__.py b/examples/nas/oneshot/pfld/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/nas/oneshot/pfld/datasets.py b/examples/nas/oneshot/pfld/datasets.py new file mode 100644 index 0000000000..41564f6044 --- /dev/null +++ b/examples/nas/oneshot/pfld/datasets.py @@ -0,0 +1,62 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import cv2 +import os + +import numpy as np + +from torch.utils import data + + +class PFLDDatasets(data.Dataset): + """ Dataset to manage the data loading, augmentation and generation. """ + + def __init__(self, file_list, transforms=None, data_root="", img_size=112): + """ + Parameters + ---------- + file_list : list + a list of file path and annotations + transforms : function + function for data augmentation + data_root : str + the root path of dataset + img_size : int + the size of image height or width + """ + self.line = None + self.path = None + self.img_size = img_size + self.land = None + self.angle = None + self.data_root = data_root + self.transforms = transforms + with open(file_list, "r") as f: + self.lines = f.readlines() + + def __getitem__(self, index): + """ Get the data sample and labels with the index. """ + self.line = self.lines[index].strip().split() + # load image + if self.data_root: + self.img = cv2.imread(os.path.join(self.data_root, self.line[0])) + else: + self.img = cv2.imread(self.line[0]) + # resize + self.img = cv2.resize(self.img, (self.img_size, self.img_size)) + # obtain gt labels + self.land = np.asarray(self.line[1: (106 * 2 + 1)], dtype=np.float32) + self.angle = np.asarray(self.line[(106 * 2 + 1):], dtype=np.float32) + + # augmentation + if self.transforms: + self.img = self.transforms(self.img) + + return self.img, self.land, self.angle + + def __len__(self): + """ Get the size of dataset. """ + return len(self.lines) diff --git a/examples/nas/oneshot/pfld/export.py b/examples/nas/oneshot/pfld/export.py new file mode 100644 index 0000000000..78ab54d6d9 --- /dev/null +++ b/examples/nas/oneshot/pfld/export.py @@ -0,0 +1,70 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import argparse +import onnx +import onnxsim +import os +import torch + +from lib.builder import search_space +from lib.ops import PRIMITIVES +from nni.algorithms.nas.pytorch.fbnet import ( + LookUpTable, + NASConfig, + model_init, +) + + +parser = argparse.ArgumentParser(description="Export the ONNX model") +parser.add_argument("--net", default="subnet", type=str) +parser.add_argument("--supernet", default="", type=str, metavar="PATH") +parser.add_argument("--resume", default="", type=str, metavar="PATH") +parser.add_argument("--num_points", default=106, type=int) +parser.add_argument("--img_size", default=112, type=int) +parser.add_argument("--onnx", default="./output/pfld.onnx", type=str) +parser.add_argument("--onnx_sim", default="./output/subnet.onnx", type=str) +args = parser.parse_args() + +os.makedirs("./output", exist_ok=True) + +if args.net == "subnet": + from lib.subnet import PFLDInference +else: + raise ValueError("Network is not implemented") + +check = torch.load(args.supernet, map_location=torch.device("cpu")) +sampled_arch = check["arch_sample"] + +nas_config = NASConfig(search_space=search_space) +lookup_table = LookUpTable(config=nas_config, primitives=PRIMITIVES) +pfld_backbone = PFLDInference(lookup_table, sampled_arch, args.num_points) + +pfld_backbone.eval() +check_sub = torch.load(args.resume, map_location=torch.device("cpu")) +param_dict = check_sub["pfld_backbone"] +model_init(pfld_backbone, param_dict) + +print("Convert PyTorch model to ONNX.") +dummy_input = torch.randn(1, 3, args.img_size, args.img_size) +input_names = ["input"] +output_names = ["output"] +torch.onnx.export( + pfld_backbone, + dummy_input, + args.onnx, + verbose=True, + input_names=input_names, + output_names=output_names, +) + +print("Check ONNX model.") +model = onnx.load(args.onnx) + +print("Simplifying the ONNX model.") +model_opt, check = onnxsim.simplify(args.onnx) +assert check, "Simplified ONNX model could not be validated" +onnx.save(model_opt, args.onnx_sim) +print("Onnx model simplify Ok!") diff --git a/examples/nas/oneshot/pfld/lib/__init__.py b/examples/nas/oneshot/pfld/lib/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/nas/oneshot/pfld/lib/builder.py b/examples/nas/oneshot/pfld/lib/builder.py new file mode 100644 index 0000000000..3f4a5527dc --- /dev/null +++ b/examples/nas/oneshot/pfld/lib/builder.py @@ -0,0 +1,55 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + + +search_space = { + # multi-stage definition for candidate layers + # here two stages are defined for PFLD searching + "stages": { + "stage_0": { + "ops": [ + "mb_k3_res", + "mb_k3_e2_res", + "mb_k3_res_d3", + "mb_k5_res", + "mb_k5_e2_res", + "sep_k3", + "sep_k5", + "gh_k3", + "gh_k5", + ], + "layer_num": 2, + }, + "stage_1": { + "ops": [ + "mb_k3_e2_res", + "mb_k3_e4_res", + "mb_k3_e2_res_se", + "mb_k3_res_d3", + "mb_k5_res", + "mb_k5_e2_res", + "mb_k5_res_se", + "mb_k5_e2_res_se", + "gh_k5", + ], + "layer_num": 3, + }, + }, + # necessary information of layers for NAS + # the basic information is as (input_channels, height, width) + "input_shape": [ + (32, 14, 14), + (32, 14, 14), + (32, 14, 14), + (64, 7, 7), + (64, 7, 7), + ], + # output channels for each layer + "channel_size": [32, 32, 64, 64, 64], + # stride for each layer + "strides": [1, 1, 2, 1, 1], + # height of feature map for each layer + "fm_size": [14, 14, 7, 7, 7], +} diff --git a/examples/nas/oneshot/pfld/lib/ops.py b/examples/nas/oneshot/pfld/lib/ops.py new file mode 100644 index 0000000000..2247877109 --- /dev/null +++ b/examples/nas/oneshot/pfld/lib/ops.py @@ -0,0 +1,456 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import torch + +import torch.nn as nn +import torch.nn.functional as F + + +# Basic primitives as the network path +PRIMITIVES = { + "skip": lambda c_in, c_out, stride, **kwargs: Identity( + c_in, c_out, stride, **kwargs + ), + "conv1x1": lambda c_in, c_out, stride, **kwargs: Conv1x1( + c_in, c_out, stride, **kwargs + ), + "depth_conv": lambda c_in, c_out, stride, **kwargs: DepthConv( + c_in, c_out, stride, **kwargs + ), + "sep_k3": lambda c_in, c_out, stride, **kwargs: SeparableConv( + c_in, c_out, stride, **kwargs + ), + "sep_k5": lambda c_in, c_out, stride, **kwargs: SeparableConv( + c_in, c_out, stride, kernel=5, **kwargs + ), + "gh_k3": lambda c_in, c_out, stride, **kwargs: GhostModule( + c_in, c_out, stride, **kwargs + ), + "gh_k5": lambda c_in, c_out, stride, **kwargs: GhostModule( + c_in, c_out, stride, kernel=5, **kwargs + ), + "mb_k3": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=3, expand=1, **kwargs + ), + "mb_k3_e2": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=3, expand=2, **kwargs + ), + "mb_k3_e4": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=3, expand=4, **kwargs + ), + "mb_k3_res": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=3, expand=1, res=True, **kwargs + ), + "mb_k3_e2_res": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=3, expand=2, res=True, **kwargs + ), + "mb_k3_e4_res": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=3, expand=4, res=True, **kwargs + ), + "mb_k3_d2": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=3, + expand=2, + res=False, + dilation=2, + **kwargs, + ), + "mb_k3_d3": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=3, + expand=2, + res=False, + dilation=3, + **kwargs, + ), + "mb_k3_res_d2": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=3, + expand=2, + res=True, + dilation=2, + **kwargs, + ), + "mb_k3_res_d3": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=3, + expand=2, + res=True, + dilation=3, + **kwargs, + ), + "mb_k3_res_se": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=3, + expand=1, + res=True, + dilation=1, + se=True, + **kwargs, + ), + "mb_k3_e2_res_se": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=3, + expand=2, + res=True, + dilation=1, + se=True, + **kwargs, + ), + "mb_k3_e4_res_se": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=3, + expand=4, + res=True, + dilation=1, + se=True, + **kwargs, + ), + "mb_k5": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=5, expand=1, **kwargs + ), + "mb_k5_e2": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=5, expand=2, **kwargs + ), + "mb_k5_res": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=5, expand=1, res=True, **kwargs + ), + "mb_k5_e2_res": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, c_out, stride, kernel=5, expand=2, res=True, **kwargs + ), + "mb_k5_res_se": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=5, + expand=1, + res=True, + dilation=1, + se=True, + **kwargs, + ), + "mb_k5_e2_res_se": lambda c_in, c_out, stride, **kwargs: MBBlock( + c_in, + c_out, + stride, + kernel=5, + expand=2, + res=True, + dilation=1, + se=True, + **kwargs, + ), +} + + +def conv_bn(inp, oup, kernel, stride, pad=1, groups=1): + return nn.Sequential( + nn.Conv2d(inp, oup, kernel, stride, pad, groups=groups, bias=False), + nn.BatchNorm2d(oup), + nn.ReLU(inplace=True), + ) + + +class SeparableConv(nn.Module): + """Separable convolution.""" + + def __init__(self, in_ch, out_ch, stride=1, kernel=3, fm_size=7): + super(SeparableConv, self).__init__() + assert stride in [1, 2], "stride should be in [1, 2]" + pad = kernel // 2 + + self.conv = nn.Sequential( + conv_bn(in_ch, in_ch, kernel, stride, pad=pad, groups=in_ch), + conv_bn(in_ch, out_ch, 1, 1, pad=0), + ) + + def forward(self, x): + return self.conv(x) + + +class Conv1x1(nn.Module): + """1x1 convolution.""" + + def __init__(self, in_ch, out_ch, stride=1, kernel=1, fm_size=7): + super(Conv1x1, self).__init__() + assert stride in [1, 2], "stride should be in [1, 2]" + padding = kernel // 2 + + self.conv = nn.Sequential( + nn.Conv2d(in_ch, out_ch, kernel, stride, padding), + nn.ReLU(inplace=True), + ) + + def forward(self, x): + return self.conv(x) + + +class DepthConv(nn.Module): + """depth convolution.""" + + def __init__(self, in_ch, out_ch, stride=1, kernel=3, fm_size=7): + super(DepthConv, self).__init__() + assert stride in [1, 2], "stride should be in [1, 2]" + padding = kernel // 2 + + self.conv = nn.Sequential( + nn.Conv2d(in_ch, in_ch, kernel, stride, padding, groups=in_ch), + nn.ReLU(inplace=True), + nn.Conv2d(in_ch, out_ch, 1, 1, 0), + nn.ReLU(inplace=True), + ) + + def forward(self, x): + return self.conv(x) + + +class GhostModule(nn.Module): + """Gost module.""" + + def __init__(self, in_ch, out_ch, stride=1, kernel=3, fm_size=7): + super(GhostModule, self).__init__() + mid_ch = out_ch // 2 + self.primary_conv = conv_bn(in_ch, mid_ch, 1, stride, pad=0) + self.cheap_operation = conv_bn( + mid_ch, mid_ch, kernel, 1, kernel // 2, mid_ch + ) + + def forward(self, x): + x1 = self.primary_conv(x) + x2 = self.cheap_operation(x1) + return torch.cat([x1, x2], dim=1) + + +class StemBlock(nn.Module): + def __init__(self, in_ch=3, init_ch=32, bottleneck=True): + super(StemBlock, self).__init__() + self.stem_1 = conv_bn(in_ch, init_ch, 3, 2, 1) + mid_ch = int(init_ch // 2) if bottleneck else init_ch + self.stem_2a = conv_bn(init_ch, mid_ch, 1, 1, 0) + self.stem_2b = SeparableConv(mid_ch, init_ch, 2, 1) + self.stem_2p = nn.MaxPool2d(kernel_size=2, stride=2) + self.stem_3 = conv_bn(init_ch * 2, init_ch, 1, 1, 0) + + def forward(self, x): + stem_1_out = self.stem_1(x) + + stem_2a_out = self.stem_2a(stem_1_out) + stem_2b_out = self.stem_2b(stem_2a_out) + + stem_2p_out = self.stem_2p(stem_1_out) + + out = self.stem_3(torch.cat((stem_2b_out, stem_2p_out), 1)) + return out, stem_1_out + + +class Identity(nn.Module): + """ Identity module.""" + + def __init__(self, in_ch, out_ch, stride=1, fm_size=7): + super(Identity, self).__init__() + self.conv = ( + conv_bn(in_ch, out_ch, kernel=1, stride=stride, pad=0) + if in_ch != out_ch or stride != 1 + else None + ) + + def forward(self, x): + if self.conv: + out = self.conv(x) + else: + out = x + # Add dropout to avoid overfit on Identity (PDARTS) + out = nn.functional.dropout(out, p=0.5) + return out + + +class Hsigmoid(nn.Module): + """Hsigmoid activation function.""" + + def __init__(self, inplace=True): + super(Hsigmoid, self).__init__() + self.inplace = inplace + + def forward(self, x): + return F.relu6(x + 3.0, inplace=self.inplace) / 6.0 + + +class eSEModule(nn.Module): + """ The improved SE Module.""" + + def __init__(self, channel, fm_size=7, se=True): + super(eSEModule, self).__init__() + self.se = se + + if self.se: + self.avg_pool = nn.Conv2d( + channel, channel, fm_size, 1, 0, groups=channel, bias=False + ) + self.fc = nn.Conv2d(channel, channel, kernel_size=1, padding=0) + self.hsigmoid = Hsigmoid() + + def forward(self, x): + if self.se: + input = x + x = self.avg_pool(x) + x = self.fc(x) + x = self.hsigmoid(x) + return input * x + else: + return x + + +class ChannelShuffle(nn.Module): + """Procedure: [N,C,H,W] -> [N,g,C/g,H,W] -> [N,C/g,g,H,w] -> [N,C,H,W].""" + + def __init__(self, groups): + super(ChannelShuffle, self).__init__() + self.groups = groups + + def forward(self, x): + if self.groups == 1: + return x + + N, C, H, W = x.size() + g = self.groups + assert C % g == 0, "group size {} is not for channel {}".format(g, C) + return ( + x.view(N, g, int(C // g), H, W) + .permute(0, 2, 1, 3, 4) + .contiguous() + .view(N, C, H, W) + ) + + +class MBBlock(nn.Module): + """The Inverted Residual Block, with channel shuffle or eSEModule.""" + + def __init__( + self, + in_ch, + out_ch, + stride=1, + kernel=3, + expand=1, + res=False, + dilation=1, + se=False, + fm_size=7, + group=1, + mid_ch=-1, + ): + super(MBBlock, self).__init__() + assert stride in [1, 2], "stride should be in [1, 2]" + assert kernel in [3, 5], "kernel size should be in [3, 5]" + assert dilation in [1, 2, 3, 4], "dilation should be in [1, 2, 3, 4]" + assert group in [1, 2], "group should be in [1, 2]" + + self.use_res_connect = res and (stride == 1) + padding = kernel // 2 + (dilation - 1) + mid_ch = mid_ch if mid_ch > 0 else (in_ch * expand) + + # Basic Modules + conv_layer = nn.Conv2d + norm_layer = nn.BatchNorm2d + activation_layer = nn.ReLU + channel_suffle = ChannelShuffle + se_layer = eSEModule + + self.ir_block = nn.Sequential( + # pointwise convolution + conv_layer(in_ch, mid_ch, 1, 1, 0, bias=False, groups=group), + norm_layer(mid_ch), + activation_layer(inplace=True), + # channel shuffle if necessary + channel_suffle(group), + # depthwise convolution + conv_layer( + mid_ch, + mid_ch, + kernel, + stride, + padding=padding, + dilation=dilation, + groups=mid_ch, + bias=False, + ), + norm_layer(mid_ch), + # eSEModule if necessary + se_layer(mid_ch, fm_size, se), + activation_layer(inplace=True), + # pointwise convolution + conv_layer(mid_ch, out_ch, 1, 1, 0, bias=False, groups=group), + norm_layer(out_ch), + ) + + def forward(self, x): + if self.use_res_connect: + return x + self.ir_block(x) + else: + return self.ir_block(x) + + +class SingleOperation(nn.Module): + """Single operation for sampled path.""" + + def __init__(self, layers_configs, stage_ops, sampled_op=""): + """ + Parameters + ---------- + layers_configs : list + the layer config: [input_channel, output_channel, stride, height] + stage_ops : dict + the pairs of op name and layer operator + sampled_op : str + the searched layer name + """ + super(SingleOperation, self).__init__() + fm = {"fm_size": layers_configs[3]} + ops_names = [op_name for op_name in stage_ops] + sampled_op = sampled_op if sampled_op else ops_names[0] + + # define the single op + self.op = stage_ops[sampled_op](*layers_configs[0:3], **fm) + + def forward(self, x): + return self.op(x) + + +def choice_blocks(layers_configs, stage_ops): + """ + Create list of layer candidates for NNI one-shot NAS. + + Parameters + ---------- + layers_configs : list + the layer config: [input_channel, output_channel, stride, height] + stage_ops : dict + the pairs of op name and layer operator + + Returns + ------- + output: list + list of layer operators + """ + ops_names = [op for op in stage_ops] + fm = {"fm_size": layers_configs[3]} + op_list = [stage_ops[op](*layers_configs[0:3], **fm) for op in ops_names] + + return op_list diff --git a/examples/nas/oneshot/pfld/lib/subnet.py b/examples/nas/oneshot/pfld/lib/subnet.py new file mode 100644 index 0000000000..b179d9a64a --- /dev/null +++ b/examples/nas/oneshot/pfld/lib/subnet.py @@ -0,0 +1,164 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import torch +import torch.nn as nn + +from lib.ops import ( + MBBlock, + SeparableConv, + SingleOperation, + StemBlock, + conv_bn, +) +from torch.nn import init + +INIT_CH = 16 + + +class PFLDInference(nn.Module): + """ The subnet with the architecture of PFLD. """ + + def __init__(self, lookup_table, sampled_ops, num_points=106): + """ + Parameters + ---------- + lookup_table : class + to manage the candidate ops, layer information and layer perf + sampled_ops : list of str + the searched layer names of the subnet + num_points : int + the number of landmarks for prediction + """ + super(PFLDInference, self).__init__() + + stage_names = [stage_name for stage_name in lookup_table.layer_num] + stage_n = [lookup_table.layer_num[stage] for stage in stage_names] + self.stem = StemBlock(init_ch=INIT_CH, bottleneck=False) + + self.block4_1 = MBBlock(INIT_CH, 32, stride=2, mid_ch=32) + stages_0 = [ + SingleOperation( + lookup_table.layer_configs[layer_id], + lookup_table.lut_ops[stage_names[0]], + sampled_ops[layer_id], + ) + for layer_id in range(stage_n[0]) + ] + + stages_1 = [ + SingleOperation( + lookup_table.layer_configs[layer_id], + lookup_table.lut_ops[stage_names[1]], + sampled_ops[layer_id], + ) + for layer_id in range(stage_n[0], stage_n[0] + stage_n[1]) + ] + + blocks = stages_0 + stages_1 + self.blocks = nn.Sequential(*blocks) + + self.avg_pool1 = nn.Conv2d( + INIT_CH, INIT_CH, 9, 8, 1, groups=INIT_CH, bias=False + ) + self.avg_pool2 = nn.Conv2d(32, 32, 3, 2, 1, groups=32, bias=False) + + self.block6_1 = nn.Conv2d(96 + INIT_CH, 64, 1, 1, 0, bias=False) + self.block6_2 = MBBlock(64, 64, res=True, se=True, mid_ch=128) + self.block6_3 = SeparableConv(64, 128, 1) + + self.conv7 = nn.Conv2d(128, 128, 7, 1, 0, groups=128, bias=False) + self.fc = nn.Conv2d(128, num_points * 2, 1, 1, 0, bias=True) + + # init params + self.init_params() + + def init_params(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + init.kaiming_normal_(m.weight, mode="fan_out") + if m.bias is not None: + init.constant_(m.bias, 0) + elif isinstance(m, nn.BatchNorm2d): + init.constant_(m.weight, 1) + init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + init.normal_(m.weight, std=0.001) + if m.bias is not None: + init.constant_(m.bias, 0) + + def forward(self, x): + """ + Parameters + ---------- + x : tensor + input image + + Returns + ------- + output: tensor + the predicted landmarks + output: tensor + the intermediate features + """ + x, y1 = self.stem(x) + out1 = x + + x = self.block4_1(x) + for i, block in enumerate(self.blocks): + x = block(x) + if i == 1: + y2 = x + elif i == 4: + y3 = x + + y1 = self.avg_pool1(y1) + y2 = self.avg_pool2(y2) + multi_scale = torch.cat([y3, y2, y1], 1) + + y = self.block6_1(multi_scale) + y = self.block6_2(y) + y = self.block6_3(y) + y = self.conv7(y) + landmarks = self.fc(y) + + return landmarks, out1 + + +class AuxiliaryNet(nn.Module): + """ AuxiliaryNet to predict pose angles. """ + + def __init__(self): + super(AuxiliaryNet, self).__init__() + self.conv1 = conv_bn(INIT_CH, 64, 3, 2) + self.conv2 = conv_bn(64, 64, 3, 1) + self.conv3 = conv_bn(64, 32, 3, 2) + self.conv4 = conv_bn(32, 64, 7, 1) + self.max_pool1 = nn.MaxPool2d(3) + self.fc1 = nn.Linear(64, 32) + self.fc2 = nn.Linear(32, 3) + + def forward(self, x): + """ + Parameters + ---------- + x : tensor + input intermediate features + + Returns + ------- + output: tensor + the predicted pose angles + """ + x = self.conv1(x) + x = self.conv2(x) + x = self.conv3(x) + x = self.conv4(x) + x = self.max_pool1(x) + x = x.view(x.size(0), -1) + x = self.fc1(x) + x = self.fc2(x) + + return x diff --git a/examples/nas/oneshot/pfld/lib/supernet.py b/examples/nas/oneshot/pfld/lib/supernet.py new file mode 100644 index 0000000000..df3015413e --- /dev/null +++ b/examples/nas/oneshot/pfld/lib/supernet.py @@ -0,0 +1,164 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import torch +import torch.nn as nn + +from lib.ops import ( + MBBlock, + SeparableConv, + StemBlock, + choice_blocks, + conv_bn, +) +from nni.nas.pytorch import mutables +from torch.nn import init + +INIT_CH = 16 + + +class PFLDInference(nn.Module): + """ PFLD model for facial landmark.""" + + def __init__(self, lookup_table, num_points=106): + """ + Parameters + ---------- + lookup_table : class + to manage the candidate ops, layer information and layer perf + num_points : int + the number of landmarks for prediction + """ + super(PFLDInference, self).__init__() + + stage_names = [stage for stage in lookup_table.layer_num] + stage_lnum = [lookup_table.layer_num[stage] for stage in stage_names] + self.stem = StemBlock(init_ch=INIT_CH, bottleneck=False) + + self.block4_1 = MBBlock(INIT_CH, 32, stride=2, mid_ch=32) + + stages_0 = [ + mutables.LayerChoice( + choice_blocks( + lookup_table.layer_configs[layer_id], + lookup_table.lut_ops[stage_names[0]], + ) + ) + for layer_id in range(stage_lnum[0]) + ] + stages_1 = [ + mutables.LayerChoice( + choice_blocks( + lookup_table.layer_configs[layer_id], + lookup_table.lut_ops[stage_names[1]], + ) + ) + for layer_id in range(stage_lnum[0], stage_lnum[0] + stage_lnum[1]) + ] + blocks = stages_0 + stages_1 + self.blocks = nn.Sequential(*blocks) + + self.avg_pool1 = nn.Conv2d( + INIT_CH, INIT_CH, 9, 8, 1, groups=INIT_CH, bias=False + ) + self.avg_pool2 = nn.Conv2d(32, 32, 3, 2, 1, groups=32, bias=False) + + self.block6_1 = nn.Conv2d(96 + INIT_CH, 64, 1, 1, 0, bias=False) + self.block6_2 = MBBlock(64, 64, res=True, se=True, mid_ch=128) + self.block6_3 = SeparableConv(64, 128, 1) + + self.conv7 = nn.Conv2d(128, 128, 7, 1, 0, groups=128, bias=False) + self.fc = nn.Conv2d(128, num_points * 2, 1, 1, 0, bias=True) + + # init params + self.init_params() + + def init_params(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + init.kaiming_normal_(m.weight, mode="fan_out") + if m.bias is not None: + init.constant_(m.bias, 0) + elif isinstance(m, nn.BatchNorm2d): + init.constant_(m.weight, 1) + init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + init.normal_(m.weight, std=0.001) + if m.bias is not None: + init.constant_(m.bias, 0) + + def forward(self, x): + """ + Parameters + ---------- + x : tensor + input image + + Returns + ------- + output: tensor + the predicted landmarks + output: tensor + the intermediate features + """ + x, y1 = self.stem(x) + out1 = x + + x = self.block4_1(x) + for i, block in enumerate(self.blocks): + x = block(x) + if i == 1: + y2 = x + elif i == 4: + y3 = x + + y1 = self.avg_pool1(y1) + y2 = self.avg_pool2(y2) + multi_scale = torch.cat([y3, y2, y1], 1) + + y = self.block6_1(multi_scale) + y = self.block6_2(y) + y = self.block6_3(y) + y = self.conv7(y) + landmarks = self.fc(y) + + return landmarks, out1 + + +class AuxiliaryNet(nn.Module): + """ AuxiliaryNet to predict pose angles. """ + + def __init__(self): + super(AuxiliaryNet, self).__init__() + self.conv1 = conv_bn(INIT_CH, 64, 3, 2) + self.conv2 = conv_bn(64, 64, 3, 1) + self.conv3 = conv_bn(64, 32, 3, 2) + self.conv4 = conv_bn(32, 64, 7, 1) + self.max_pool1 = nn.MaxPool2d(3) + self.fc1 = nn.Linear(64, 32) + self.fc2 = nn.Linear(32, 3) + + def forward(self, x): + """ + Parameters + ---------- + x : tensor + input intermediate features + + Returns + ------- + output: tensor + the predicted pose angles + """ + x = self.conv1(x) + x = self.conv2(x) + x = self.conv3(x) + x = self.conv4(x) + x = self.max_pool1(x) + x = x.view(x.size(0), -1) + x = self.fc1(x) + x = self.fc2(x) + + return x diff --git a/examples/nas/oneshot/pfld/lib/trainer.py b/examples/nas/oneshot/pfld/lib/trainer.py new file mode 100644 index 0000000000..17321aa2ee --- /dev/null +++ b/examples/nas/oneshot/pfld/lib/trainer.py @@ -0,0 +1,297 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import os +import time +import torch + +import numpy as np + +from nni.algorithms.nas.pytorch.fbnet import FBNetTrainer +from nni.nas.pytorch.utils import AverageMeter +from .utils import accuracy + + +class PFLDTrainer(FBNetTrainer): + def __init__( + self, + model, + auxiliarynet, + model_optim, + criterion, + device, + device_ids, + config, + lookup_table, + train_loader, + valid_loader, + n_epochs=300, + load_ckpt=False, + arch_path=None, + logger=None, + ): + """ + Parameters + ---------- + model : pytorch model + the user model, which has mutables + auxiliarynet : pytorch model + the auxiliarynet to regress angle + model_optim : pytorch optimizer + the user defined optimizer + criterion : pytorch loss + the main task loss + device : pytorch device + the devices to train/search the model + device_ids : list of int + the indexes of devices used for training + config : class + configuration object for fbnet training + lookup_table : class + lookup table object for fbnet training + train_loader : pytorch data loader + data loader for the training set + valid_loader : pytorch data loader + data loader for the validation set + n_epochs : int + number of epochs to train/search + load_ckpt : bool + whether load checkpoint + arch_path : str + the path to store chosen architecture + logger : logger + the logger + """ + + super(PFLDTrainer, self).__init__( + model, + model_optim, + criterion, + device, + device_ids, + lookup_table, + train_loader, + valid_loader, + n_epochs, + load_ckpt, + arch_path, + logger, + ) + + # DataParallel of the AuxiliaryNet to PFLD + self.auxiliarynet = auxiliarynet + self.auxiliarynet = torch.nn.DataParallel( + self.auxiliarynet, device_ids=device_ids + ) + self.auxiliarynet.to(device) + + def _validate(self): + """ + Do validation. During validation, LayerChoices use the mixed-op. + + Returns + ------- + float, float + average loss, average nme + """ + + # test on validation set under eval mode + self.model.eval() + self.auxiliarynet.eval() + + losses, nme = list(), list() + batch_time = AverageMeter("batch_time") + end = time.time() + with torch.no_grad(): + for i, (img, land_gt, angle_gt) in enumerate(self.valid_loader): + img = img.to(self.device, non_blocking=True) + landmark_gt = land_gt.to(self.device, non_blocking=True) + angle_gt = angle_gt.to(self.device, non_blocking=True) + + landmark, _ = self.model(img) + + # compute the l2 loss + landmark = landmark.squeeze() + l2_diff = torch.sum((landmark_gt - landmark) ** 2, axis=1) + loss = torch.mean(l2_diff) + losses.append(loss.cpu().detach().numpy()) + + # compute the accuracy + landmark = landmark.cpu().detach().numpy() + landmark = landmark.reshape(landmark.shape[0], -1, 2) + landmark_gt = landmark_gt.cpu().detach().numpy() + landmark_gt = landmark_gt.reshape(landmark_gt.shape[0], -1, 2) + _, nme_i = accuracy(landmark, landmark_gt) + for item in nme_i: + nme.append(item) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + self.logger.info("===> Evaluate:") + self.logger.info( + "Eval set: Average loss: {:.4f} nme: {:.4f}".format( + np.mean(losses), np.mean(nme) + ) + ) + return np.mean(losses), np.mean(nme) + + def _train_epoch(self, epoch, optimizer, arch_train=False): + """ + Train one epoch. + """ + # switch to train mode + self.model.train() + self.auxiliarynet.train() + + batch_time = AverageMeter("batch_time") + data_time = AverageMeter("data_time") + losses = AverageMeter("losses") + + data_loader = self.valid_loader if arch_train else self.train_loader + end = time.time() + for i, (img, landmark_gt, angle_gt) in enumerate(data_loader): + data_time.update(time.time() - end) + img = img.to(self.device, non_blocking=True) + landmark_gt = landmark_gt.to(self.device, non_blocking=True) + angle_gt = angle_gt.to(self.device, non_blocking=True) + + lands, feats = self.model(img) + landmarks = lands.squeeze() + angle = self.auxiliarynet(feats) + + # task loss + weighted_loss, l2_loss = self.criterion( + landmark_gt, angle_gt, angle, landmarks + ) + loss = l2_loss if arch_train else weighted_loss + + # hardware-aware loss + perf_cost = self._get_perf_cost(requires_grad=True) + regu_loss = self.reg_loss(perf_cost) + if self.mode.startswith("mul"): + loss = loss * regu_loss + elif self.mode.startswith("add"): + loss = loss + regu_loss + + # compute gradient and do SGD step + optimizer.zero_grad() + loss.backward() + optimizer.step() + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + # measure accuracy and record loss + losses.update(np.squeeze(loss.cpu().detach().numpy()), img.size(0)) + + if i % 10 == 0: + batch_log = ( + "Train [{0}][{1}]\t" + "Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t" + "Data {data_time.val:.3f} ({data_time.avg:.3f})\t" + "Loss {losses.val:.4f} ({losses.avg:.4f})".format( + epoch + 1, + i, + batch_time=batch_time, + data_time=data_time, + losses=losses, + ) + ) + self.logger.info(batch_log) + + def _warm_up(self): + """ + Warm up the model, while the architecture weights are not trained. + """ + for epoch in range(self.epoch, self.start_epoch): + self.logger.info("\n--------Warmup epoch: %d--------\n", epoch + 1) + self._train_epoch(epoch, self.model_optim) + # adjust learning rate + self.scheduler.step() + + # validation + _, _ = self._validate() + if epoch % 10 == 0: + filename = os.path.join( + self.config.model_dir, "checkpoint_%s.pth" % epoch + ) + self.save_checkpoint(epoch, filename) + + def _train(self): + """ + Train the model, it trains model weights and architecute weights. + Architecture weights are trained according to the schedule. + Before updating architecture weights, ```requires_grad``` is enabled. + Then, it is disabled after the updating, in order not to update + architecture weights when training model weights. + """ + arch_param_num = self.mutator.num_arch_params() + self.logger.info("#arch_params: {}".format(arch_param_num)) + self.epoch = max(self.start_epoch, self.epoch) + + ckpt_path = self.config.model_dir + choice_names = None + val_nme = 1e6 + + for epoch in range(self.epoch, self.n_epochs): + # update the weight parameters + self.logger.info("\n--------Train epoch: %d--------\n", epoch + 1) + self._train_epoch(epoch, self.model_optim) + # adjust learning rate + self.scheduler.step() + + # update the architecture parameters + self.logger.info("Update architecture parameters") + self.mutator.arch_requires_grad() + self._train_epoch(epoch, self.arch_optimizer, True) + self.mutator.arch_disable_grad() + # temperature annealing + self.temp = self.temp * self.exp_anneal_rate + self.mutator.set_temperature(self.temp) + # sample the architecture of sub-network + choice_names = self._layer_choice_sample() + + # validate + _, nme = self._validate() + + if epoch % 10 == 0: + filename = os.path.join(ckpt_path, "checkpoint_%s.pth" % epoch) + self.save_checkpoint(epoch, filename, choice_names) + + if nme < val_nme: + filename = os.path.join(ckpt_path, "checkpoint_best.pth") + self.save_checkpoint(epoch, filename, choice_names) + val_nme = nme + self.logger.info("Best nme: {:.4f}".format(val_nme)) + + def save_checkpoint(self, epoch, filename, choice_names=None): + """ + Save checkpoint of the whole model. + Saving model weights and architecture weights as ```filename```, + and saving currently chosen architecture in ```arch_path```. + """ + state = { + "pfld_backbone": self.model.state_dict(), + "auxiliarynet": self.auxiliarynet.state_dict(), + "optim": self.model_optim.state_dict(), + "epoch": epoch, + "arch_sample": choice_names, + } + torch.save(state, filename) + self.logger.info("Save checkpoint to {0:}".format(filename)) + + if self.arch_path: + self.export(self.arch_path) + + def load_checkpoint(self, filename): + """ + Load the checkpoint from ```filename```. + """ + ckpt = torch.load(filename) + self.epoch = ckpt["epoch"] + self.model.load_state_dict(ckpt["pfld_backbone"]) + self.auxiliarynet.load_state_dict(ckpt["auxiliarynet"]) + self.model_optim.load_state_dict(ckpt["optim"]) diff --git a/examples/nas/oneshot/pfld/lib/utils.py b/examples/nas/oneshot/pfld/lib/utils.py new file mode 100644 index 0000000000..732a54277e --- /dev/null +++ b/examples/nas/oneshot/pfld/lib/utils.py @@ -0,0 +1,127 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import torch + +import numpy as np +import torch.nn as nn + + +def accuracy(preds, target): + """ + Calculate the NME (Normalized Mean Error). + + Parameters + ---------- + preds : numpy array + the predicted landmarks + target : numpy array + the ground truth of landmarks + + Returns + ------- + output: float32 + the nme value + output: list + the list of l2 distances + """ + N = preds.shape[0] + L = preds.shape[1] + rmse = np.zeros(N).astype(np.float32) + + for i in range(N): + pts_pred, pts_gt = ( + preds[i], + target[i], + ) + if L == 19: + # aflw + interocular = 34 + elif L == 29: + # cofw + interocular = np.linalg.norm(pts_gt[8] - pts_gt[9]) + elif L == 68: + # interocular + interocular = np.linalg.norm(pts_gt[36] - pts_gt[45]) + elif L == 98: + # euclidean dis from left eye to right eye + interocular = np.linalg.norm(pts_gt[60] - pts_gt[72]) + elif L == 106: + # euclidean dis from left eye to right eye + interocular = np.linalg.norm(pts_gt[35] - pts_gt[93]) + else: + raise ValueError("Number of landmarks is wrong") + + pred_dis = np.sum(np.linalg.norm(pts_pred - pts_gt, axis=1)) + rmse[i] = pred_dis / (interocular * L) + + return np.mean(rmse), rmse + + +class PFLDLoss(nn.Module): + """Weighted loss of L2 distance with the pose angle for PFLD.""" + + def __init__(self): + super(PFLDLoss, self).__init__() + + def forward(self, landmark_gt, euler_angle_gt, angle, landmarks): + """ + Calculate weighted L2 loss for PFLD. + + Parameters + ---------- + landmark_gt : tensor + the ground truth of landmarks + euler_angle_gt : tensor + the ground truth of pose angle + angle : tensor + the predicted pose angle + landmarks : float32 + the predicted landmarks + + Returns + ------- + output: tensor + the weighted L2 loss + output: tensor + the normal L2 loss + """ + weight_angle = torch.sum(1 - torch.cos(angle - euler_angle_gt), axis=1) + l2_distant = torch.sum((landmark_gt - landmarks) ** 2, axis=1) + + return torch.mean(weight_angle * l2_distant), torch.mean(l2_distant) + + +def bounded_regress_loss( + landmark_gt, landmarks_t, landmarks_s, reg_m=0.5, br_alpha=0.05 +): + """ + Calculate the Bounded Regression Loss for Knowledge Distillation. + + Parameters + ---------- + landmark_gt : tensor + the ground truth of landmarks + landmarks_t : tensor + the predicted landmarks of teacher + landmarks_s : tensor + the predicted landmarks of student + reg_m : float32 + the value to control the regresion constraint + br_alpha : float32 + the balance value for kd loss + + Returns + ------- + output: tensor + the bounded regression loss + """ + l2_dis_s = (landmark_gt - landmarks_s).pow(2).sum(1) + l2_dis_s_m = l2_dis_s + reg_m + + l2_dis_t = (landmark_gt - landmarks_t).pow(2).sum(1) + br_loss = l2_dis_s[l2_dis_s_m > l2_dis_t].sum() + + return br_loss * br_alpha diff --git a/examples/nas/oneshot/pfld/retrain.py b/examples/nas/oneshot/pfld/retrain.py new file mode 100644 index 0000000000..fa8ca362ee --- /dev/null +++ b/examples/nas/oneshot/pfld/retrain.py @@ -0,0 +1,313 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import argparse +import logging +import os +import time +import torch +import torchvision + +import numpy as np + +from datasets import PFLDDatasets +from lib.builder import search_space +from lib.ops import PRIMITIVES +from lib.utils import PFLDLoss, accuracy +from nni.algorithms.nas.pytorch.fbnet import ( + LookUpTable, + NASConfig, + supernet_sample, +) +from nni.nas.pytorch.utils import AverageMeter +from torch.utils.data import DataLoader + +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + +def validate(model, auxiliarynet, valid_loader, device, logger): + """Do validation.""" + model.eval() + auxiliarynet.eval() + + losses, nme = list(), list() + with torch.no_grad(): + for i, (img, land_gt, angle_gt) in enumerate(valid_loader): + img = img.to(device, non_blocking=True) + landmark_gt = land_gt.to(device, non_blocking=True) + angle_gt = angle_gt.to(device, non_blocking=True) + + landmark, _ = model(img) + + # compute the l2 loss + landmark = landmark.squeeze() + l2_diff = torch.sum((landmark_gt - landmark) ** 2, axis=1) + loss = torch.mean(l2_diff) + losses.append(loss.cpu().detach().numpy()) + + # compute the accuracy + landmark = landmark.cpu().detach().numpy() + landmark = landmark.reshape(landmark.shape[0], -1, 2) + landmark_gt = landmark_gt.cpu().detach().numpy() + landmark_gt = landmark_gt.reshape(landmark_gt.shape[0], -1, 2) + _, nme_i = accuracy(landmark, landmark_gt) + for item in nme_i: + nme.append(item) + + logger.info("===> Evaluate:") + logger.info( + "Eval set: Average loss: {:.4f} nme: {:.4f}".format( + np.mean(losses), np.mean(nme) + ) + ) + return np.mean(losses), np.mean(nme) + + +def train_epoch( + model, + auxiliarynet, + criterion, + train_loader, + device, + epoch, + optimizer, + logger, +): + """Train one epoch.""" + model.train() + auxiliarynet.train() + + batch_time = AverageMeter("batch_time") + data_time = AverageMeter("data_time") + losses = AverageMeter("losses") + + end = time.time() + for i, (img, landmark_gt, angle_gt) in enumerate(train_loader): + data_time.update(time.time() - end) + img = img.to(device, non_blocking=True) + landmark_gt = landmark_gt.to(device, non_blocking=True) + angle_gt = angle_gt.to(device, non_blocking=True) + + lands, feats = model(img) + landmarks = lands.squeeze() + angle = auxiliarynet(feats) + + # task loss + weighted_loss, _ = criterion( + landmark_gt, angle_gt, angle, landmarks + ) + loss = weighted_loss + + # compute gradient and do SGD step + optimizer.zero_grad() + loss.backward() + optimizer.step() + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + # measure accuracy and record loss + losses.update(np.squeeze(loss.cpu().detach().numpy()), img.size(0)) + + if i % 10 == 0: + batch_log = ( + "Train [{0}][{1}]\t" + "Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t" + "Data {data_time.val:.3f} ({data_time.avg:.3f})\t" + "Loss {losses.val:.4f} ({losses.avg:.4f})".format( + epoch + 1, + i, + batch_time=batch_time, + data_time=data_time, + losses=losses, + ) + ) + logger.info(batch_log) + + +def save_checkpoint(model, auxiliarynet, optimizer, filename, logger): + """Save checkpoint of the whole model.""" + state = { + "pfld_backbone": model.state_dict(), + "auxiliarynet": auxiliarynet.state_dict(), + "optim": optimizer.state_dict(), + } + torch.save(state, filename) + logger.info("Save checkpoint to {0:}".format(filename)) + + +def main(args): + """ The main function for supernet pre-training and subnet fine-tuning. """ + logging.basicConfig( + format="[%(asctime)s] [p%(process)s] [%(pathname)s\ + :%(lineno)d] [%(levelname)s] %(message)s", + level=logging.INFO, + handlers=[ + logging.FileHandler(args.log_file, mode="w"), + logging.StreamHandler(), + ], + ) + + # print the information of arguments + for arg in vars(args): + s = arg + ": " + str(getattr(args, arg)) + logging.info(s) + + # for 106 landmarks + num_points = 106 + # list of device ids, and the number of workers for data loading + device_ids = [int(id) for id in args.dev_id.split(",")] + dev_num = len(device_ids) + num_workers = 4 * dev_num + + # import subnet for fine-tuning + from lib.subnet import PFLDInference, AuxiliaryNet + + # the configuration for training control + nas_config = NASConfig( + model_dir=args.snapshot, + search_space=search_space, + ) + # look-up table with information of search space, flops per block, etc. + lookup_table = LookUpTable(config=nas_config, primitives=PRIMITIVES) + + check = torch.load(args.supernet, map_location=torch.device("cpu")) + sampled_arch = check["arch_sample"] + logging.info(sampled_arch) + # create subnet + pfld_backbone = PFLDInference(lookup_table, sampled_arch, num_points) + + # pre-load the weights from pre-trained supernet + state_dict = check["pfld_backbone"] + supernet_sample(pfld_backbone, state_dict, sampled_arch, lookup_table) + + # the auxiliary-net of PFLD to predict the pose angle + auxiliarynet = AuxiliaryNet() + + # DataParallel + pfld_backbone = torch.nn.DataParallel(pfld_backbone, device_ids=device_ids) + pfld_backbone.to(device) + auxiliarynet = torch.nn.DataParallel(auxiliarynet, device_ids=device_ids) + auxiliarynet.to(device) + + # main task loss + criterion = PFLDLoss() + + # optimizer / scheduler for weight train + optimizer = torch.optim.RMSprop( + [ + {"params": pfld_backbone.parameters()}, + {"params": auxiliarynet.parameters()}, + ], + lr=args.base_lr, + momentum=0.0, + weight_decay=args.weight_decay, + ) + + scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( + optimizer, T_max=args.end_epoch, last_epoch=-1 + ) + + # data argmentation and dataloader + transform = torchvision.transforms.Compose( + [torchvision.transforms.ToTensor()] + ) + # the landmark dataset with 106 points is default used + train_dataset = PFLDDatasets( + os.path.join(args.data_root, "train_data/list.txt"), + transform, + data_root=args.data_root, + img_size=args.img_size, + ) + dataloader = DataLoader( + train_dataset, + batch_size=args.train_batchsize, + shuffle=True, + num_workers=num_workers, + pin_memory=True, + drop_last=False, + ) + + val_dataset = PFLDDatasets( + os.path.join(args.data_root, "test_data/list.txt"), + transform, + data_root=args.data_root, + img_size=args.img_size, + ) + val_dataloader = DataLoader( + val_dataset, + batch_size=args.val_batchsize, + shuffle=False, + num_workers=num_workers, + pin_memory=True, + ) + + # start finetune + ckpt_path = args.snapshot + val_nme = 1e6 + + for epoch in range(0, args.end_epoch): + logging.info("\n--------Train epoch: %d--------\n", epoch + 1) + # update the weight parameters + train_epoch( + pfld_backbone, + auxiliarynet, + criterion, + dataloader, + device, + epoch, + optimizer, + logging, + ) + # adjust learning rate + scheduler.step() + + # validate + _, nme = validate( + pfld_backbone, auxiliarynet, val_dataloader, device, logging + ) + + if epoch % 10 == 0: + filename = os.path.join(ckpt_path, "checkpoint_%s.pth" % epoch) + save_checkpoint( + pfld_backbone, auxiliarynet, optimizer, filename, logging + ) + + if nme < val_nme: + filename = os.path.join(ckpt_path, "checkpoint_best.pth") + save_checkpoint( + pfld_backbone, auxiliarynet, optimizer, filename, logging + ) + val_nme = nme + logging.info("Best nme: {:.4f}".format(val_nme)) + + +def parse_args(): + """ Parse the user arguments. """ + parser = argparse.ArgumentParser(description="Finetuning for PFLD") + parser.add_argument("--dev_id", dest="dev_id", default="0", type=str) + parser.add_argument("--base_lr", default=0.0001, type=int) + parser.add_argument("--weight-decay", "--wd", default=1e-6, type=float) + parser.add_argument("--img_size", default=112, type=int) + parser.add_argument("--supernet", default="", type=str, metavar="PATH") + parser.add_argument("--end_epoch", default=300, type=int) + parser.add_argument( + "--snapshot", default="models", type=str, metavar="PATH" + ) + parser.add_argument("--log_file", default="train.log", type=str) + parser.add_argument( + "--data_root", default="/dataset", type=str, metavar="PATH" + ) + parser.add_argument("--train_batchsize", default=256, type=int) + parser.add_argument("--val_batchsize", default=128, type=int) + args = parser.parse_args() + args.snapshot = os.path.join(args.snapshot, 'subnet') + args.log_file = os.path.join(args.snapshot, "{}.log".format('subnet')) + os.makedirs(args.snapshot, exist_ok=True) + return args + + +if __name__ == "__main__": + args = parse_args() + main(args) diff --git a/examples/nas/oneshot/pfld/train.py b/examples/nas/oneshot/pfld/train.py new file mode 100644 index 0000000000..183cf49529 --- /dev/null +++ b/examples/nas/oneshot/pfld/train.py @@ -0,0 +1,184 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import argparse +import logging +import os +import torch +import torchvision + +import numpy as np + +from datasets import PFLDDatasets +from lib.builder import search_space +from lib.ops import PRIMITIVES +from lib.trainer import PFLDTrainer +from lib.utils import PFLDLoss +from nni.algorithms.nas.pytorch.fbnet import LookUpTable, NASConfig +from torch.utils.data import DataLoader + +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + +def main(args): + """ The main function for supernet pre-training and subnet fine-tuning. """ + logging.basicConfig( + format="[%(asctime)s] [p%(process)s] [%(pathname)s\ + :%(lineno)d] [%(levelname)s] %(message)s", + level=logging.INFO, + handlers=[ + logging.FileHandler(args.log_file, mode="w"), + logging.StreamHandler(), + ], + ) + + # print the information of arguments + for arg in vars(args): + s = arg + ": " + str(getattr(args, arg)) + logging.info(s) + + # for 106 landmarks + num_points = 106 + # list of device ids, and the number of workers for data loading + device_ids = [int(id) for id in args.dev_id.split(",")] + dev_num = len(device_ids) + num_workers = 4 * dev_num + + # random seed + manual_seed = 1 + np.random.seed(manual_seed) + torch.manual_seed(manual_seed) + torch.cuda.manual_seed_all(manual_seed) + + # import supernet for block-wise DNAS pre-training + from lib.supernet import PFLDInference, AuxiliaryNet + + # the configuration for training control + nas_config = NASConfig( + model_dir=args.snapshot, + nas_lr=args.theta_lr, + mode=args.mode, + alpha=args.alpha, + beta=args.beta, + search_space=search_space, + ) + # look-up table with information of search space, flops per block, etc. + lookup_table = LookUpTable(config=nas_config, primitives=PRIMITIVES) + + # create supernet + pfld_backbone = PFLDInference(lookup_table, num_points) + # the auxiliary-net of PFLD to predict the pose angle + auxiliarynet = AuxiliaryNet() + + # main task loss + criterion = PFLDLoss() + + # optimizer for weight train + if args.opt == "adam": + optimizer = torch.optim.AdamW( + [ + {"params": pfld_backbone.parameters()}, + {"params": auxiliarynet.parameters()}, + ], + lr=args.base_lr, + weight_decay=args.weight_decay, + ) + elif args.opt == "rms": + optimizer = torch.optim.RMSprop( + [ + {"params": pfld_backbone.parameters()}, + {"params": auxiliarynet.parameters()}, + ], + lr=args.base_lr, + momentum=0.0, + weight_decay=args.weight_decay, + ) + + # data argmentation and dataloader + transform = torchvision.transforms.Compose( + [torchvision.transforms.ToTensor()] + ) + # the landmark dataset with 106 points is default used + train_dataset = PFLDDatasets( + os.path.join(args.data_root, "train_data/list.txt"), + transform, + data_root=args.data_root, + img_size=args.img_size, + ) + dataloader = DataLoader( + train_dataset, + batch_size=args.train_batchsize, + shuffle=True, + num_workers=num_workers, + pin_memory=True, + drop_last=False, + ) + + val_dataset = PFLDDatasets( + os.path.join(args.data_root, "test_data/list.txt"), + transform, + data_root=args.data_root, + img_size=args.img_size, + ) + val_dataloader = DataLoader( + val_dataset, + batch_size=args.val_batchsize, + shuffle=False, + num_workers=num_workers, + pin_memory=True, + ) + + # create the trainer, then search/finetune + trainer = PFLDTrainer( + pfld_backbone, + auxiliarynet, + optimizer, + criterion, + device, + device_ids, + nas_config, + lookup_table, + dataloader, + val_dataloader, + n_epochs=args.end_epoch, + logger=logging, + ) + trainer.train() + + +def parse_args(): + """ Parse the user arguments. """ + parser = argparse.ArgumentParser(description="FBNet for PFLD") + parser.add_argument("--dev_id", dest="dev_id", default="0", type=str) + parser.add_argument("--opt", default="rms", type=str) + parser.add_argument("--base_lr", default=0.0001, type=int) + parser.add_argument("--weight-decay", "--wd", default=1e-6, type=float) + parser.add_argument("--img_size", default=112, type=int) + parser.add_argument("--theta-lr", "--tlr", default=0.01, type=float) + parser.add_argument( + "--mode", default="mul", type=str, choices=["mul", "add"] + ) + parser.add_argument("--alpha", default=0.25, type=float) + parser.add_argument("--beta", default=0.6, type=float) + parser.add_argument("--end_epoch", default=300, type=int) + parser.add_argument( + "--snapshot", default="models", type=str, metavar="PATH" + ) + parser.add_argument("--log_file", default="train.log", type=str) + parser.add_argument( + "--data_root", default="/dataset", type=str, metavar="PATH" + ) + parser.add_argument("--train_batchsize", default=256, type=int) + parser.add_argument("--val_batchsize", default=128, type=int) + args = parser.parse_args() + args.snapshot = os.path.join(args.snapshot, 'supernet') + args.log_file = os.path.join(args.snapshot, "{}.log".format('supernet')) + os.makedirs(args.snapshot, exist_ok=True) + return args + + +if __name__ == "__main__": + args = parse_args() + main(args) diff --git a/nni/algorithms/nas/pytorch/fbnet/__init__.py b/nni/algorithms/nas/pytorch/fbnet/__init__.py new file mode 100644 index 0000000000..fa15cc64a7 --- /dev/null +++ b/nni/algorithms/nas/pytorch/fbnet/__init__.py @@ -0,0 +1,11 @@ +from __future__ import absolute_import + +from .mutator import FBNetMutator # noqa: F401 +from .trainer import FBNetTrainer # noqa: F401 +from .utils import ( # noqa: F401 + LookUpTable, + NASConfig, + RegularizerLoss, + model_init, + supernet_sample, +) diff --git a/nni/algorithms/nas/pytorch/fbnet/mutator.py b/nni/algorithms/nas/pytorch/fbnet/mutator.py new file mode 100644 index 0000000000..42b46afcab --- /dev/null +++ b/nni/algorithms/nas/pytorch/fbnet/mutator.py @@ -0,0 +1,268 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import torch +from torch import nn as nn +from torch.nn import functional as F +import numpy as np + +from nni.nas.pytorch.base_mutator import BaseMutator +from nni.nas.pytorch.mutables import LayerChoice + + +class MixedOp(nn.Module): + """ + This class is to instantiate and manage info of one LayerChoice. + It includes architecture weights and member functions for the weights. + """ + + def __init__(self, mutable, latency): + """ + Parameters + ---------- + mutable : LayerChoice + A LayerChoice in user model + latency : List + performance cost for each op in mutable + """ + super(MixedOp, self).__init__() + self.latency = latency + n_choices = len(mutable) + self.path_alpha = nn.Parameter( + torch.FloatTensor([1.0 / n_choices for i in range(n_choices)]) + ) + self.path_alpha.requires_grad = False + self.temperature = 1.0 + + def get_path_alpha(self): + """Return the architecture parameter.""" + return self.path_alpha + + def get_weighted_latency(self): + """Return the weighted perf_cost of current mutable.""" + soft_masks = self.probs_over_ops() + weighted_latency = sum(m * l for m, l in zip(soft_masks, self.latency)) + return weighted_latency + + def set_temperature(self, temperature): + """ + Set the annealed temperature for gumbel softmax. + + Parameters + ---------- + temperature : float + The annealed temperature for gumbel softmax + """ + self.temperature = temperature + + def to_requires_grad(self): + """Enable gradient calculation.""" + self.path_alpha.requires_grad = True + + def to_disable_grad(self): + """Disable gradient calculation.""" + self.path_alpha.requires_grad = False + + def probs_over_ops(self): + """Apply gumbel softmax to generate probability distribution.""" + return F.gumbel_softmax(self.path_alpha, self.temperature) + + def forward(self, mutable, x): + """ + Define forward of LayerChoice. + + Parameters + ---------- + mutable : LayerChoice + this layer's mutable + x : tensor + inputs of this layer, only support one input + + Returns + ------- + output: tensor + output of this layer + """ + candidate_ops = list(mutable) + soft_masks = self.probs_over_ops() + output = sum(m * op(x) for m, op in zip(soft_masks, candidate_ops)) + + return output + + @property + def chosen_index(self): + """ + choose the op with max prob + + Returns + ------- + int + index of the chosen one + """ + alphas = self.path_alpha.data.detach().cpu().numpy() + index = int(np.argmax(alphas)) + return index + + +class FBNetMutator(BaseMutator): + """ + This mutator initializes and operates all the LayerChoices of the supernet. + It is for the related trainer to control the training flow of LayerChoices, + coordinating with whole training process. + """ + + def __init__(self, model, lookup_table): + """ + Init a MixedOp instance for each mutable i.e., LayerChoice. + And register the instantiated MixedOp in corresponding LayerChoice. + If does not register it in LayerChoice, DataParallel does'nt work then, + for architecture weights are not included in the DataParallel model. + When MixedOPs are registered, we use ```requires_grad``` to control + whether calculate gradients of architecture weights. + + Parameters + ---------- + model : pytorch model + The model that users want to tune, + it includes search space defined with nni nas apis + lookup_table : class + lookup table object to manage model space information, + including candidate ops for each stage as the model space, + input channels/output channels/stride/fm_size as the layer config, + and the performance information for perf_cost accumulation. + + """ + super(FBNetMutator, self).__init__(model) + self.mutable_list = [] + + # Collect the op names of the candidate ops within each mutable + ops_names_mutable = dict() + left = 0 + right = 1 + for stage_name in lookup_table.layer_num: + right = lookup_table.layer_num[stage_name] + stage_ops = lookup_table.lut_ops[stage_name] + ops_names = [op_name for op_name in stage_ops] + + for i in range(left, left + right): + ops_names_mutable[i] = ops_names + left = right + + # Create the mixed op + for i, mutable in enumerate(self.undedup_mutables): + ops_names = ops_names_mutable[i] + latency_mutable = lookup_table.lut_perf[i] + latency = [latency_mutable[op_name] for op_name in ops_names] + self.mutable_list.append(mutable) + mutable.registered_module = MixedOp(mutable, latency) + + def on_forward_layer_choice(self, mutable, *args, **kwargs): + """ + Callback of layer choice forward. This function defines the forward + logic of the input mutable. So mutable is only interface, its real + implementation is defined in mutator. + + Parameters + ---------- + mutable: LayerChoice + forward logic of this input mutable + args: list of torch.Tensor + inputs of this mutable + kwargs: dict + inputs of this mutable + + Returns + ------- + torch.Tensor + output of this mutable, i.e., LayerChoice + int + index of the chosen op + """ + # FIXME: return mask, to be consistent with other algorithms + idx = mutable.registered_module.chosen_index + return mutable.registered_module(mutable, *args, **kwargs), idx + + def num_arch_params(self): + """ + The number of mutables, i.e., LayerChoice + + Returns + ------- + int + the number of LayerChoice in user model + """ + return len(self.mutable_list) + + def get_architecture_parameters(self): + """ + Get all the architecture parameters. + + yield + ----- + PyTorch Parameter + Return path_alpha of the traversed mutable + """ + for mutable in self.undedup_mutables: + yield mutable.registered_module.get_path_alpha() + + def get_weighted_latency(self): + """ + Get the latency weighted by gumbel softmax coefficients. + + yield + ----- + Tuple + Return the weighted_latency of the traversed mutable + """ + for mutable in self.undedup_mutables: + yield mutable.registered_module.get_weighted_latency() + + def set_temperature(self, temperature): + """ + Set the annealed temperature of the op for gumbel softmax. + + Parameters + ---------- + temperature : float + The annealed temperature for gumbel softmax + """ + for mutable in self.undedup_mutables: + mutable.registered_module.set_temperature(temperature) + + def arch_requires_grad(self): + """ + Make architecture weights require gradient + """ + for mutable in self.undedup_mutables: + mutable.registered_module.to_requires_grad() + + def arch_disable_grad(self): + """ + Disable gradient of architecture weights, i.e., does not + calculate gradient for them. + """ + for mutable in self.undedup_mutables: + mutable.registered_module.to_disable_grad() + + def sample_final(self): + """ + Generate the final chosen architecture. + + Returns + ------- + dict + the choice of each mutable, i.e., LayerChoice + """ + result = dict() + for mutable in self.undedup_mutables: + assert isinstance(mutable, LayerChoice) + index = mutable.registered_module.chosen_index + # pylint: disable=not-callable + result[mutable.key] = ( + F.one_hot(torch.tensor(index), num_classes=len(mutable)) + .view(-1) + .bool(), + ) + return result diff --git a/nni/algorithms/nas/pytorch/fbnet/trainer.py b/nni/algorithms/nas/pytorch/fbnet/trainer.py new file mode 100644 index 0000000000..7588ecf5e5 --- /dev/null +++ b/nni/algorithms/nas/pytorch/fbnet/trainer.py @@ -0,0 +1,413 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import json +import os +import time +import torch + +import numpy as np + +from torch.autograd import Variable +from nni.nas.pytorch.base_trainer import BaseTrainer +from nni.nas.pytorch.trainer import TorchTensorEncoder +from nni.nas.pytorch.utils import AverageMeter +from .mutator import FBNetMutator +from .utils import RegularizerLoss, accuracy + + +class FBNetTrainer(BaseTrainer): + def __init__( + self, + model, + model_optim, + criterion, + device, + device_ids, + lookup_table, + train_loader, + valid_loader, + n_epochs=120, + load_ckpt=False, + arch_path=None, + logger=None, + ): + """ + Parameters + ---------- + model : pytorch model + the user model, which has mutables + model_optim : pytorch optimizer + the user defined optimizer + criterion : pytorch loss + the main task loss, nn.CrossEntropyLoss() is for classification + device : pytorch device + the devices to train/search the model + device_ids : list of int + the indexes of devices used for training + lookup_table : class + lookup table object for fbnet training + train_loader : pytorch data loader + data loader for the training set + valid_loader : pytorch data loader + data loader for the validation set + n_epochs : int + number of epochs to train/search + load_ckpt : bool + whether load checkpoint + arch_path : str + the path to store chosen architecture + logger : logger + the logger + """ + self.model = model + self.model_optim = model_optim + self.train_loader = train_loader + self.valid_loader = valid_loader + self.device = device + self.dev_num = len(device_ids) + self.n_epochs = n_epochs + self.lookup_table = lookup_table + self.config = lookup_table.config + self.start_epoch = self.config.start_epoch + self.temp = self.config.init_temperature + self.exp_anneal_rate = self.config.exp_anneal_rate + self.mode = self.config.mode + + self.load_ckpt = load_ckpt + self.arch_path = arch_path + self.logger = logger + + # scheduler of learning rate + self.scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( + model_optim, T_max=n_epochs, last_epoch=-1 + ) + + # init mutator + self.mutator = FBNetMutator(model, lookup_table) + self.mutator.set_temperature(self.temp) + + # DataParallel should be put behind the init of mutator + self.model = torch.nn.DataParallel(self.model, device_ids=device_ids) + self.model.to(device) + + # build architecture optimizer + self.arch_optimizer = torch.optim.AdamW( + self.mutator.get_architecture_parameters(), + self.config.nas_lr, + weight_decay=self.config.nas_weight_decay, + ) + self.reg_loss = RegularizerLoss(config=self.config) + + self.criterion = criterion + self.epoch = 0 + + def _layer_choice_sample(self): + """ + Sample the index of network within layer choice + """ + stages = [stage_name for stage_name in self.lookup_table.layer_num] + stage_lnum = [self.lookup_table.layer_num[stage] for stage in stages] + + # get the choice idx in each layer + choice_ids = list() + layer_id = 0 + for param in self.mutator.get_architecture_parameters(): + param_np = param.cpu().detach().numpy() + op_idx = np.argmax(param_np) + choice_ids.append(op_idx) + self.logger.info( + "layer {}: {}, index: {}".format(layer_id, param_np, op_idx) + ) + layer_id += 1 + + # get the arch_sample + choice_names = list() + layer_id = 0 + for i, stage_name in enumerate(stages): + ops_names = [op for op in self.lookup_table.lut_ops[stage_name]] + for j in range(stage_lnum[i]): + searched_op = ops_names[choice_ids[layer_id]] + choice_names.append(searched_op) + layer_id += 1 + + self.logger.info(choice_names) + return choice_names + + def _get_perf_cost(self, requires_grad=True): + """ + Get the accumulated performance cost. + """ + perf_cost = Variable( + torch.zeros(1), requires_grad=requires_grad + ).to(self.device, non_blocking=True) + + for latency in self.mutator.get_weighted_latency(): + perf_cost = perf_cost + latency + + return perf_cost + + def _validate(self): + """ + Do validation. During validation, LayerChoices use the mixed-op. + + Returns + ------- + float, float, float + average loss, average top1 accuracy, average top5 accuracy + """ + self.valid_loader.batch_sampler.drop_last = False + batch_time = AverageMeter("batch_time") + losses = AverageMeter("losses") + top1 = AverageMeter("top1") + top5 = AverageMeter("top5") + + # test on validation set under eval mode + self.model.eval() + + end = time.time() + with torch.no_grad(): + for i, (images, labels) in enumerate(self.valid_loader): + images = images.to(self.device, non_blocking=True) + labels = labels.to(self.device, non_blocking=True) + + output = self.model(images) + + loss = self.criterion(output, labels) + acc1, acc5 = accuracy(output, labels, topk=(1, 5)) + losses.update(loss, images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % 10 == 0 or i + 1 == len(self.valid_loader): + test_log = ( + "Valid" + ": [{0}/{1}]\t" + "Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t" + "Loss {loss.val:.4f} ({loss.avg:.4f})\t" + "Top-1 acc {top1.val:.3f} ({top1.avg:.3f})\t" + "Top-5 acc {top5.val:.3f} ({top5.avg:.3f})".format( + i, + len(self.valid_loader) - 1, + batch_time=batch_time, + loss=losses, + top1=top1, + top5=top5, + ) + ) + self.logger.info(test_log) + + return losses.avg, top1.avg, top5.avg + + def _train_epoch(self, epoch, optimizer, arch_train=False): + """ + Train one epoch. + """ + batch_time = AverageMeter("batch_time") + data_time = AverageMeter("data_time") + losses = AverageMeter("losses") + top1 = AverageMeter("top1") + top5 = AverageMeter("top5") + + # switch to train mode + self.model.train() + + data_loader = self.valid_loader if arch_train else self.train_loader + end = time.time() + for i, (images, labels) in enumerate(data_loader): + data_time.update(time.time() - end) + images = images.to(self.device, non_blocking=True) + labels = labels.to(self.device, non_blocking=True) + + output = self.model(images) + loss = self.criterion(output, labels) + + # hardware-aware loss + perf_cost = self._get_perf_cost(requires_grad=True) + regu_loss = self.reg_loss(perf_cost) + if self.mode.startswith("mul"): + loss = loss * regu_loss + elif self.mode.startswith("add"): + loss = loss + regu_loss + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, labels, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0].item(), images.size(0)) + top5.update(acc5[0].item(), images.size(0)) + # compute gradient and do SGD step + optimizer.zero_grad() + loss.backward() + optimizer.step() + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % 10 == 0: + batch_log = ( + "Warmup Train [{0}][{1}]\t" + "Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t" + "Data {data_time.val:.3f} ({data_time.avg:.3f})\t" + "Loss {losses.val:.4f} ({losses.avg:.4f})\t" + "Top-1 acc {top1.val:.3f} ({top1.avg:.3f})\t" + "Top-5 acc {top5.val:.3f} ({top5.avg:.3f})\t".format( + epoch + 1, + i, + batch_time=batch_time, + data_time=data_time, + losses=losses, + top1=top1, + top5=top5, + ) + ) + self.logger.info(batch_log) + + def _warm_up(self): + """ + Warm up the model, while the architecture weights are not trained. + """ + for epoch in range(self.epoch, self.start_epoch): + self.logger.info("\n--------Warmup epoch: %d--------\n", epoch + 1) + self._train_epoch(epoch, self.model_optim) + # adjust learning rate + self.scheduler.step() + + # validation + val_loss, val_top1, val_top5 = self._validate() + val_log = ( + "Warmup Valid [{0}/{1}]\t" + "loss {2:.3f}\ttop-1 acc {3:.3f}\ttop-5 acc {4:.3f}".format( + epoch + 1, self.warmup_epochs, val_loss, val_top1, val_top5 + ) + ) + self.logger.info(val_log) + + if epoch % 10 == 0: + filename = os.path.join( + self.config.model_dir, "checkpoint_%s.pth" % epoch + ) + self.save_checkpoint(epoch, filename) + + def _train(self): + """ + Train the model, it trains model weights and architecute weights. + Architecture weights are trained according to the schedule. + Before updating architecture weights, ```requires_grad``` is enabled. + Then, it is disabled after the updating, in order not to update + architecture weights when training model weights. + """ + arch_param_num = self.mutator.num_arch_params() + self.logger.info("#arch_params: {}".format(arch_param_num)) + self.epoch = max(self.start_epoch, self.epoch) + + ckpt_path = self.config.model_dir + choice_names = None + top1_best = 0.0 + + for epoch in range(self.epoch, self.n_epochs): + self.logger.info("\n--------Train epoch: %d--------\n", epoch + 1) + # update the weight parameters + self._train_epoch(epoch, self.model_optim) + # adjust learning rate + self.scheduler.step() + + self.logger.info("Update architecture parameters") + # update the architecture parameters + self.mutator.arch_requires_grad() + self._train_epoch(epoch, self.arch_optimizer, True) + self.mutator.arch_disable_grad() + # temperature annealing + self.temp = self.temp * self.exp_anneal_rate + self.mutator.set_temperature(self.temp) + # sample the architecture of sub-network + choice_names = self._layer_choice_sample() + + # validate + val_loss, val_top1, val_top5 = self._validate() + val_log = ( + "Valid [{0}]\t" + "loss {1:.3f}\ttop-1 acc {2:.3f} \ttop-5 acc {3:.3f}".format( + epoch + 1, val_loss, val_top1, val_top5 + ) + ) + self.logger.info(val_log) + + if epoch % 10 == 0: + filename = os.path.join(ckpt_path, "checkpoint_%s.pth" % epoch) + self.save_checkpoint(epoch, filename, choice_names) + + val_top1 = val_top1.cpu().as_numpy() + if val_top1 > top1_best: + filename = os.path.join(ckpt_path, "checkpoint_best.pth") + self.save_checkpoint(epoch, filename, choice_names) + top1_best = val_top1 + + def save_checkpoint(self, epoch, filename, choice_names=None): + """ + Save checkpoint of the whole model. + Saving model weights and architecture weights as ```filename```, + and saving currently chosen architecture in ```arch_path```. + """ + state = { + "model": self.model.state_dict(), + "optim": self.model_optim.state_dict(), + "epoch": epoch, + "arch_sample": choice_names, + } + torch.save(state, filename) + self.logger.info("Save checkpoint to {0:}".format(filename)) + + if self.arch_path: + self.export(self.arch_path) + + def load_checkpoint(self, filename): + """ + Load the checkpoint from ```ckpt_path```. + """ + ckpt = torch.load(filename) + self.epoch = ckpt["epoch"] + self.model.load_state_dict(ckpt["model"]) + self.model_optim.load_state_dict(ckpt["optim"]) + + def train(self): + """ + Train the whole model. + """ + if self.load_ckpt: + ckpt_path = self.config.model_dir + filename = os.path.join(ckpt_path, "checkpoint_best.pth") + if os.path.exists(filename): + self.load_checkpoint(filename) + + if self.epoch < self.start_epoch: + self._warm_up() + self._train() + + def export(self, file_name): + """ + Export the chosen architecture into a file + + Parameters + ---------- + file_name : str + the file that stores exported chosen architecture + """ + exported_arch = self.mutator.sample_final() + with open(file_name, "w") as f: + json.dump( + exported_arch, + f, + indent=2, + sort_keys=True, + cls=TorchTensorEncoder, + ) + + def validate(self): + raise NotImplementedError + + def checkpoint(self): + raise NotImplementedError diff --git a/nni/algorithms/nas/pytorch/fbnet/utils.py b/nni/algorithms/nas/pytorch/fbnet/utils.py new file mode 100644 index 0000000000..332f2e2c62 --- /dev/null +++ b/nni/algorithms/nas/pytorch/fbnet/utils.py @@ -0,0 +1,352 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +from __future__ import absolute_import, division, print_function + +import gc # noqa: F401 +import os +import timeit +import torch + +import numpy as np +import torch.nn as nn + +from nni.compression.pytorch.utils.counter import count_flops_params + +LUT_FILE = "lut.npy" +LUT_PATH = "lut" + + +class NASConfig: + def __init__( + self, + perf_metric="flops", + lut_load=False, + model_dir=None, + nas_lr=0.01, + nas_weight_decay=5e-4, + mode="mul", + alpha=0.25, + beta=0.6, + start_epoch=50, + init_temperature=5.0, + exp_anneal_rate=np.exp(-0.045), + search_space=None, + ): + # LUT of performance metric + # flops means the multiplies, latency means the time cost on platform + self.perf_metric = perf_metric + assert perf_metric in [ + "flops", + "latency", + ], "perf_metric should be ['flops', 'latency']" + # wether load or create lut file + self.lut_load = lut_load + # necessary dirs + self.lut_en = model_dir is not None + if self.lut_en: + self.model_dir = model_dir + os.makedirs(model_dir, exist_ok=True) + self.lut_path = os.path.join(model_dir, LUT_PATH) + os.makedirs(self.lut_path, exist_ok=True) + # NAS learning setting + self.nas_lr = nas_lr + self.nas_weight_decay = nas_weight_decay + # hardware-aware loss setting + self.mode = mode + assert mode in ["mul", "add"], "mode should be ['mul', 'add']" + self.alpha = alpha + self.beta = beta + # NAS training setting + self.start_epoch = start_epoch + self.init_temperature = init_temperature + self.exp_anneal_rate = exp_anneal_rate + # definition of search blocks and space + self.search_space = search_space + + +class RegularizerLoss(nn.Module): + """Auxilliary loss for hardware-aware NAS.""" + + def __init__(self, config): + """ + Parameters + ---------- + config : class + to manage the configuration for NAS training, and search space etc. + """ + super(RegularizerLoss, self).__init__() + self.mode = config.mode + self.alpha = config.alpha + self.beta = config.beta + + def forward(self, perf_cost, batch_size=1): + """ + Parameters + ---------- + perf_cost : tensor + the accumulated performance cost + batch_size : int + batch size for normalization + + Returns + ------- + output: tensor + the hardware-aware constraint loss + """ + if self.mode == "mul": + log_loss = torch.log(perf_cost / batch_size) ** self.beta + return self.alpha * log_loss + elif self.mode == "add": + linear_loss = (perf_cost / batch_size) ** self.beta + return self.alpha * linear_loss + else: + raise NotImplementedError + + +def accuracy(output, target, topk=(1,)): + """ + Computes the precision@k for the specified values of k + + Parameters + ---------- + output : pytorch tensor + output, e.g., predicted value + target : pytorch tensor + label + topk : tuple + specify top1 and top5 + + Returns + ------- + list + accuracy of top1 and top5 + """ + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +def supernet_sample(model, state_dict, sampled_arch=[], lookup_table=None): + """ + Initialize the searched sub-model from supernet. + + Parameters + ---------- + model : pytorch model + the created subnet + state_dict : checkpoint + the checkpoint of supernet, including the pre-trained params + sampled_arch : list of str + the searched layer names of the subnet + lookup_table : class + to manage the candidate ops, layer information and layer performance + """ + replace = list() + stages = [stage for stage in lookup_table.layer_num] + stage_lnum = [lookup_table.layer_num[stage] for stage in stages] + + if sampled_arch: + layer_id = 0 + for i, stage in enumerate(stages): + ops_names = [op_name for op_name in lookup_table.lut_ops[stage]] + for j in range(stage_lnum[i]): + searched_op = sampled_arch[layer_id] + op_i = ops_names.index(searched_op) + replace.append( + [ + "blocks.{}.".format(layer_id), + "blocks.{}.op.".format(layer_id), + "blocks.{}.{}.".format(layer_id, op_i), + ] + ) + layer_id += 1 + model_init(model, state_dict, replace=replace) + + +def model_init(model, state_dict, replace=[]): + """Initialize the model from state_dict.""" + prefix = "module." + param_dict = dict() + for k, v in state_dict.items(): + if k.startswith(prefix): + k = k[7:] + param_dict[k] = v + + for k, (name, m) in enumerate(model.named_modules()): + if replace: + for layer_replace in replace: + assert len(layer_replace) == 3, "The elements should be three." + pre_scope, key, replace_key = layer_replace + if pre_scope in name: + name = name.replace(key, replace_key) + + # Copy the state_dict to current model + if (name + ".weight" in param_dict) or ( + name + ".running_mean" in param_dict + ): + if isinstance(m, nn.BatchNorm2d): + shape = m.running_mean.shape + if shape == param_dict[name + ".running_mean"].shape: + if m.weight is not None: + m.weight.data = param_dict[name + ".weight"] + m.bias.data = param_dict[name + ".bias"] + m.running_mean = param_dict[name + ".running_mean"] + m.running_var = param_dict[name + ".running_var"] + + elif isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear): + shape = m.weight.data.shape + if shape == param_dict[name + ".weight"].shape: + m.weight.data = param_dict[name + ".weight"] + if m.bias is not None: + m.bias.data = param_dict[name + ".bias"] + + elif isinstance(m, nn.ConvTranspose2d): + m.weight.data = param_dict[name + ".weight"] + if m.bias is not None: + m.bias.data = param_dict[name + ".bias"] + + +class LookUpTable: + """Build look-up table for NAS.""" + + def __init__(self, config, primitives): + """ + Parameters + ---------- + config : class + to manage the configuration for NAS training, and search space etc. + """ + self.config = config + # definition of search blocks and space + self.search_space = config.search_space + # layers for NAS + self.cnt_layers = len(self.search_space["input_shape"]) + # constructors for each operation + self.lut_ops = { + stage_name: { + op_name: primitives[op_name] + for op_name in self.search_space["stages"][stage_name]["ops"] + } + for stage_name in self.search_space["stages"] + } + self.layer_num = { + stage_name: self.search_space["stages"][stage_name]["layer_num"] + for stage_name in self.search_space["stages"] + } + + # arguments for the ops constructors, input_shapes just for convinience + self.layer_configs, self.layer_in_shapes = self._layer_configs() + + # lookup_table + self.perf_metric = config.perf_metric + + if config.lut_en: + self.lut_perf = None + self.lut_file = os.path.join(config.lut_path, LUT_FILE) + if config.lut_load: + self._load_from_file() + else: + self._create_perfs() + + def _layer_configs(self): + """Generate basic params for different layers.""" + # layer_configs are : c_in, c_out, stride, fm_size + layer_configs = [ + [ + self.search_space["input_shape"][layer_id][0], + self.search_space["channel_size"][layer_id], + self.search_space["strides"][layer_id], + self.search_space["fm_size"][layer_id], + ] + for layer_id in range(self.cnt_layers) + ] + + # layer_in_shapes are (C_in, input_w, input_h) + layer_in_shapes = self.search_space["input_shape"] + + return layer_configs, layer_in_shapes + + def _create_perfs(self, cnt_of_runs=200): + """Create performance cost for each op.""" + if self.perf_metric == "latency": + self.lut_perf = self._calculate_latency(cnt_of_runs) + elif self.perf_metric == "flops": + self.lut_perf = self._calculate_flops() + + self._write_lut_to_file() + + def _calculate_flops(self, eps=0.001): + """FLOPs cost.""" + flops_lut = [{} for i in range(self.cnt_layers)] + layer_id = 0 + + for stage_name in self.lut_ops: + stage_ops = self.lut_ops[stage_name] + ops_num = self.layer_num[stage_name] + + for _ in range(ops_num): + for op_name in stage_ops: + layer_config = self.layer_configs[layer_id] + key_params = {"fm_size": layer_config[3]} + op = stage_ops[op_name](*layer_config[0:3], **key_params) + + # measured in Flops + in_shape = self.layer_in_shapes[layer_id] + x = (1, in_shape[0], in_shape[1], in_shape[2]) + flops, _, _ = count_flops_params(op, x, verbose=False) + flops = eps if flops == 0.0 else flops + flops_lut[layer_id][op_name] = float(flops) + layer_id += 1 + + return flops_lut + + def _calculate_latency(self, cnt_of_runs): + """Latency cost.""" + LATENCY_BATCH_SIZE = 1 + latency_lut = [{} for i in range(self.cnt_layers)] + layer_id = 0 + + for stage_name in self.lut_ops: + stage_ops = self.lut_ops[stage_name] + ops_num = self.layer_num[stage_name] + + for _ in range(ops_num): + for op_name in stage_ops: + layer_config = self.layer_configs[layer_id] + key_params = {"fm_size": layer_config[3]} + op = stage_ops[op_name](*layer_config[0:3], **key_params) + input_data = torch.randn( + (LATENCY_BATCH_SIZE, *self.layer_in_shapes[layer_id]) + ) + globals()["op"], globals()["input_data"] = op, input_data + total_time = timeit.timeit( + "output = op(input_data)", + setup="gc.enable()", + globals=globals(), + number=cnt_of_runs, + ) + # measured in micro-second + latency_lut[layer_id][op_name] = ( + total_time / cnt_of_runs / LATENCY_BATCH_SIZE * 1e6 + ) + layer_id += 1 + + return latency_lut + + def _write_lut_to_file(self): + """Save lut as numpy file.""" + np.save(self.lut_file, self.lut_perf) + + def _load_from_file(self): + """Load numpy file.""" + self.lut_perf = np.load(self.lut_file, allow_pickle=True) From 9444e27508ab9d6e4184436af2661cd4efd387bd Mon Sep 17 00:00:00 2001 From: QuanluZhang Date: Sat, 22 May 2021 23:35:23 +0800 Subject: [PATCH 4/5] Support nested ModuleList and fix an issue in list append (#3652) --- nni/retiarii/converter/graph_gen.py | 41 +++++++---- test/ut/retiarii/test_convert_models.py | 91 +++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 13 deletions(-) diff --git a/nni/retiarii/converter/graph_gen.py b/nni/retiarii/converter/graph_gen.py index 7676c0b02d..373cd9b69a 100644 --- a/nni/retiarii/converter/graph_gen.py +++ b/nni/retiarii/converter/graph_gen.py @@ -20,17 +20,17 @@ def __init__(self): self.global_graph_id = 0 def _add_edge_handle_source_node(self, _input, graph_inputs, ir_graph, output_remap, node_index): - if _input in graph_inputs: - idx = graph_inputs.index(_input) - src_node = ir_graph.input_node - src_node_idx = idx - elif _input in output_remap: + if _input in output_remap: assert output_remap[_input].kind() == 'aten::append' predecessor_node = output_remap[_input] assert predecessor_node in node_index, 'predecessor node: {}'.format(predecessor_node) src_node_idx = None src_node = node_index[predecessor_node] assert isinstance(src_node, Node) + elif _input in graph_inputs: + idx = graph_inputs.index(_input) + src_node = ir_graph.input_node + src_node_idx = idx else: predecessor_node = _input.node() assert predecessor_node in node_index, 'predecessor node: {}'.format(predecessor_node) @@ -315,16 +315,31 @@ def handle_function_callmethod(node): if submodule.inputsAt(0).type().name() == 'ModuleList': # handle ModuleList predecessor = submodule.inputsAt(0).node() + module_name_space = [submodule_name] + while predecessor.inputsAt(0).debugName() != 'self': + # this is for dealing with nested ModuleList. below is an example + # %3 : __torch__.torch.nn.modules.container.___torch_mangle_0.ModuleList = prim::GetAttr[name="ops"](%self) + # %5 : __torch__.torch.nn.modules.container.ModuleList = prim::GetAttr[name="0"](%3) + # %7 : __torch__.torch.nn.modules.container.ModuleList = prim::GetAttr[name="1"](%3) + # %9 : __torch__.torch.nn.modules.container.ModuleList = prim::GetAttr[name="2"](%3) + # %11 : __torch__.torch.nn.modules.container.ModuleList = prim::GetAttr[name="3"](%3) + # %14 : __torch__.torch.nn.modules.linear.Linear = prim::GetAttr[name="0"](%5) + # %16 : __torch__.torch.nn.modules.linear.Linear = prim::GetAttr[name="1"](%5) + # %state.2 : Tensor = prim::CallMethod[name="forward"](%14, %x.1) # modulelist.py:18:24 + # %state.4 : Tensor = prim::CallMethod[name="forward"](%16, %state.2) # modulelist.py:18:24 + assert predecessor.kind() == 'prim::GetAttr' + module_name_space.append(predecessor.s('name')) + predecessor = predecessor.inputsAt(0).node() assert predecessor.kind() == 'prim::GetAttr' assert predecessor.hasAttribute('name') - assert predecessor.inputsAt(0).debugName() == 'self' - predecessor_name = predecessor.s('name') - # TODO: exchange submodule_name and predecessor_name - submodule_full_name = build_full_name(module_name, [submodule_name, predecessor_name]) - predecessor_obj = getattr(module, predecessor_name) - submodule_obj = getattr(predecessor_obj, submodule_name) - subgraph, sub_m_attrs = self.convert_module(script_module._modules[predecessor_name]._modules[submodule_name], - submodule_obj, submodule_full_name, ir_model) + module_name_space.append(predecessor.s('name')) + submodule_full_name = build_full_name(module_name, list(reversed(module_name_space))) + submodule_obj = module + script_submodule = script_module + for each_name in list(reversed(module_name_space)): + submodule_obj = getattr(submodule_obj, each_name) + script_submodule = script_submodule._modules[each_name] + subgraph, sub_m_attrs = self.convert_module(script_submodule, submodule_obj, submodule_full_name, ir_model) else: raise RuntimeError('Unsupported module case: {}'.format(submodule.inputsAt(0).type().str())) diff --git a/test/ut/retiarii/test_convert_models.py b/test/ut/retiarii/test_convert_models.py index e69de29bb2..26ee327671 100644 --- a/test/ut/retiarii/test_convert_models.py +++ b/test/ut/retiarii/test_convert_models.py @@ -0,0 +1,91 @@ +import os +import sys +import unittest +from typing import (Dict) + +import numpy as np +import torch +import torch.nn.functional as F +import torchvision + +import nni.retiarii.nn.pytorch as nn +from nni.retiarii import serialize +from nni.retiarii.converter import convert_to_graph +from nni.retiarii.codegen import model_to_pytorch_script + + +class TestModels(unittest.TestCase): + @staticmethod + def _match_state_dict(current_values, expected_format): + result = {} + for k, v in expected_format.items(): + for idx, cv in enumerate(current_values): + if cv.shape == v.shape: + result[k] = cv + current_values.pop(idx) + break + return result + + def run_test(self, model, input, check_value=True): + script_module = torch.jit.script(model) + model_ir = convert_to_graph(script_module, model) + model_code = model_to_pytorch_script(model_ir) + print(model_code) + + exec_vars = {} + exec(model_code + '\n\nconverted_model = _model()', exec_vars) + converted_model = exec_vars['converted_model'] + converted_state_dict = self._match_state_dict(list(model.state_dict().values()), + dict(converted_model.state_dict())) + converted_model.load_state_dict(converted_state_dict) + with torch.no_grad(): + expected_output = model.eval()(*input) + converted_output = converted_model.eval()(*input) + if check_value: + try: + self.assertEqual(len(converted_output), len(expected_output)) + for a, b in zip(converted_output, expected_output): + torch.eq(a, b) + except: + self.assertEqual(converted_output, expected_output) + return converted_model + + def test_nested_modulelist(self): + class Net(nn.Module): + def __init__(self, num_nodes, num_ops_per_node): + super().__init__() + self.ops = nn.ModuleList() + self.num_nodes = num_nodes + self.num_ops_per_node = num_ops_per_node + for _ in range(num_nodes): + self.ops.append(nn.ModuleList([nn.Linear(16, 16) for __ in range(num_ops_per_node)])) + + def forward(self, x): + state = x + for ops in self.ops: + for op in ops: + state = op(state) + return state + + model = Net(4, 2) + x = torch.rand((16, 16), dtype=torch.float) + self.run_test(model, (x, )) + + def test_append_input_tensor(self): + from typing import List + class Net(nn.Module): + def __init__(self, num_nodes): + super().__init__() + self.ops = nn.ModuleList() + self.num_nodes = num_nodes + for _ in range(num_nodes): + self.ops.append(nn.Linear(16, 16)) + def forward(self, x: List[torch.Tensor]): + state = x + for ops in self.ops: + state.append(ops(state[-1])) + return state[-1] + + model = Net(4) + x = torch.rand((1, 16), dtype=torch.float) + self.run_test(model, ([x], )) From 35c3d16919d0164a89c2129866440ee95531dc02 Mon Sep 17 00:00:00 2001 From: Ni Hao Date: Mon, 24 May 2021 14:14:04 +0800 Subject: [PATCH 5/5] Support prefix url for nnimanager (#3643) Co-authored-by: Hao Ni --- nni/tools/nnictl/config_utils.py | 3 ++- nni/tools/nnictl/launcher.py | 23 +++++++++++++----- nni/tools/nnictl/nnictl.py | 1 + nni/tools/nnictl/url_utils.py | 13 +++++++--- .../common/experimentStartupInfo.ts | 24 +++++++++++++++---- ts/nni_manager/main.ts | 8 ++++--- ts/nni_manager/rest_server/nniRestServer.ts | 4 +++- 7 files changed, 58 insertions(+), 18 deletions(-) diff --git a/nni/tools/nnictl/config_utils.py b/nni/tools/nnictl/config_utils.py index 5cef7e2449..154b1d8ccb 100644 --- a/nni/tools/nnictl/config_utils.py +++ b/nni/tools/nnictl/config_utils.py @@ -108,7 +108,7 @@ def __init__(self, home_dir=NNI_HOME_DIR): self.experiments = self.read_file() def add_experiment(self, expId, port, startTime, platform, experiment_name, endTime='N/A', status='INITIALIZED', - tag=[], pid=None, webuiUrl=[], logDir=''): + tag=[], pid=None, webuiUrl=[], logDir='', prefixUrl=None): '''set {key:value} pairs to self.experiment''' with self.lock: self.experiments = self.read_file() @@ -124,6 +124,7 @@ def add_experiment(self, expId, port, startTime, platform, experiment_name, endT self.experiments[expId]['pid'] = pid self.experiments[expId]['webuiUrl'] = webuiUrl self.experiments[expId]['logDir'] = str(logDir) + self.experiments[expId]['prefixUrl'] = prefixUrl self.write_file() def update_experiment(self, expId, key, value): diff --git a/nni/tools/nnictl/launcher.py b/nni/tools/nnictl/launcher.py index 7b2d20f9b8..e4d6a0966a 100644 --- a/nni/tools/nnictl/launcher.py +++ b/nni/tools/nnictl/launcher.py @@ -9,6 +9,7 @@ import random import time import tempfile +import re from subprocess import Popen, check_call, CalledProcessError, PIPE, STDOUT from nni.experiment.config import ExperimentConfig, convert from nni.tools.annotation import expand_annotations, generate_search_space @@ -16,7 +17,7 @@ import nni_node # pylint: disable=import-error from .launcher_utils import validate_all_content from .rest_utils import rest_put, rest_post, check_rest_server, check_response -from .url_utils import cluster_metadata_url, experiment_url, get_local_urls +from .url_utils import cluster_metadata_url, experiment_url, get_local_urls, setPrefixUrl, formatURLPath from .config_utils import Config, Experiments from .common_utils import get_yml_content, get_json_content, print_error, print_normal, print_warning, \ detect_port, get_user @@ -43,7 +44,7 @@ def print_log_content(config_file_name): print_normal(' Stderr:') print(check_output_command(stderr_full_path)) -def start_rest_server(port, platform, mode, experiment_id, foreground=False, log_dir=None, log_level=None): +def start_rest_server(port, platform, mode, experiment_id, foreground=False, log_dir=None, log_level=None, url_prefix=None): '''Run nni manager process''' if detect_port(port): print_error('Port %s is used by another process, please reset the port!\n' \ @@ -81,6 +82,11 @@ def start_rest_server(port, platform, mode, experiment_id, foreground=False, log cmds += ['--log_level', log_level] if foreground: cmds += ['--foreground', 'true'] + if url_prefix: + _validate_prefix_path(url_prefix) + setPrefixUrl(url_prefix) + cmds += ['--url_prefix', url_prefix] + stdout_full_path, stderr_full_path = get_log_path(experiment_id) with open(stdout_full_path, 'a+') as stdout_file, open(stderr_full_path, 'a+') as stderr_file: start_time = time.time() @@ -384,11 +390,12 @@ def launch_experiment(args, experiment_config, mode, experiment_id, config_versi platform = experiment_config['trainingService']['platform'] rest_process, start_time = start_rest_server(args.port, platform, \ - mode, experiment_id, foreground, log_dir, log_level) + mode, experiment_id, foreground, log_dir, log_level, args.url_prefix) # save experiment information Experiments().add_experiment(experiment_id, args.port, start_time, platform, - experiment_config.get('experimentName', 'N/A'), pid=rest_process.pid, logDir=log_dir) + experiment_config.get('experimentName', 'N/A') + , pid=rest_process.pid, logDir=log_dir, prefixUrl=args.url_prefix) # Deal with annotation if experiment_config.get('useAnnotation'): path = os.path.join(tempfile.gettempdir(), get_user(), 'nni', 'annotation') @@ -446,9 +453,9 @@ def launch_experiment(args, experiment_config, mode, experiment_id, config_versi raise Exception(ERROR_INFO % 'Restful server stopped!') exit(1) if experiment_config.get('nniManagerIp'): - web_ui_url_list = ['http://{0}:{1}'.format(experiment_config['nniManagerIp'], str(args.port))] + web_ui_url_list = ['http://{0}:{1}{2}'.format(experiment_config['nniManagerIp'], str(args.port), formatURLPath(args.url_prefix))] else: - web_ui_url_list = get_local_urls(args.port) + web_ui_url_list = get_local_urls(args.port, args.url_prefix) Experiments().update_experiment(experiment_id, 'webuiUrl', web_ui_url_list) print_normal(EXPERIMENT_SUCCESS_INFO % (experiment_id, ' '.join(web_ui_url_list))) @@ -476,6 +483,9 @@ def _validate_v2(config, path): except Exception as e: print_error(f'Config V2 validation failed: {repr(e)}') +def _validate_prefix_path(path): + assert re.match("^[A-Za-z0-9_-]*$", path), "prefix url is invalid." + def create_experiment(args): '''start a new experiment''' experiment_id = ''.join(random.sample(string.ascii_letters + string.digits, 8)) @@ -533,6 +543,7 @@ def manage_stopped_experiment(args, mode): print_normal('{0} experiment {1}...'.format(mode, experiment_id)) experiment_config = Config(experiment_id, experiments_dict[args.id]['logDir']).get_config() experiments_config.update_experiment(args.id, 'port', args.port) + args.url_prefix = experiments_dict[args.id]['prefixUrl'] assert 'trainingService' in experiment_config or 'trainingServicePlatform' in experiment_config try: if 'trainingServicePlatform' in experiment_config: diff --git a/nni/tools/nnictl/nnictl.py b/nni/tools/nnictl/nnictl.py index fd8697337e..d4b55d506a 100644 --- a/nni/tools/nnictl/nnictl.py +++ b/nni/tools/nnictl/nnictl.py @@ -54,6 +54,7 @@ def parse_args(): parser_start.add_argument('--config', '-c', required=True, dest='config', help='the path of yaml config file') parser_start.add_argument('--port', '-p', default=DEFAULT_REST_PORT, dest='port', type=int, help='the port of restful server') parser_start.add_argument('--debug', '-d', action='store_true', help=' set debug mode') + parser_start.add_argument('--url_prefix', '-u', dest='url_prefix', help=' set prefix url') parser_start.add_argument('--foreground', '-f', action='store_true', help=' set foreground mode, print log content to terminal') parser_start.set_defaults(func=create_experiment) diff --git a/nni/tools/nnictl/url_utils.py b/nni/tools/nnictl/url_utils.py index 59a28837a6..71af16de68 100644 --- a/nni/tools/nnictl/url_utils.py +++ b/nni/tools/nnictl/url_utils.py @@ -24,6 +24,13 @@ METRIC_DATA_API = '/metric-data' +def formatURLPath(path): + return '' if path is None else '/{0}'.format(path) + +def setPrefixUrl(prefix_path): + global API_ROOT_URL + API_ROOT_URL = formatURLPath(prefix_path) + def metric_data_url(port): '''get metric_data url''' return '{0}:{1}{2}{3}'.format(BASE_URL, port, API_ROOT_URL, METRIC_DATA_API) @@ -60,7 +67,7 @@ def trial_job_id_url(port, job_id): def export_data_url(port): '''get export_data url''' - return '{0}:{1}{2}{3}'.format(BASE_URL, port, API_ROOT_URL, EXPORT_DATA_API) + return '{0}:{1}{2}{3}{4}'.format(BASE_URL, port, API_ROOT_URL, EXPORT_DATA_API) def tensorboard_url(port): @@ -68,11 +75,11 @@ def tensorboard_url(port): return '{0}:{1}{2}{3}'.format(BASE_URL, port, API_ROOT_URL, TENSORBOARD_API) -def get_local_urls(port): +def get_local_urls(port,prefix): '''get urls of local machine''' url_list = [] for _, info in psutil.net_if_addrs().items(): for addr in info: if socket.AddressFamily.AF_INET == addr.family: - url_list.append('http://{}:{}'.format(addr.address, port)) + url_list.append('http://{0}:{1}{2}'.format(addr.address, port, formatURLPath(prefix))) return url_list diff --git a/ts/nni_manager/common/experimentStartupInfo.ts b/ts/nni_manager/common/experimentStartupInfo.ts index 5316abd26e..18d412869d 100644 --- a/ts/nni_manager/common/experimentStartupInfo.ts +++ b/ts/nni_manager/common/experimentStartupInfo.ts @@ -10,6 +10,8 @@ import * as component from '../common/component'; @component.Singleton class ExperimentStartupInfo { + private readonly API_ROOT_URL: string = '/api/v1/nni'; + private experimentId: string = ''; private newExperiment: boolean = true; private basePort: number = -1; @@ -19,8 +21,9 @@ class ExperimentStartupInfo { private readonly: boolean = false; private dispatcherPipe: string | null = null; private platform: string = ''; + private urlprefix: string = ''; - public setStartupInfo(newExperiment: boolean, experimentId: string, basePort: number, platform: string, logDir?: string, logLevel?: string, readonly?: boolean, dispatcherPipe?: string): void { + public setStartupInfo(newExperiment: boolean, experimentId: string, basePort: number, platform: string, logDir?: string, logLevel?: string, readonly?: boolean, dispatcherPipe?: string, urlprefix?: string): void { assert(!this.initialized); assert(experimentId.trim().length > 0); this.newExperiment = newExperiment; @@ -46,6 +49,10 @@ class ExperimentStartupInfo { if (dispatcherPipe != undefined && dispatcherPipe.length > 0) { this.dispatcherPipe = dispatcherPipe; } + + if(urlprefix != undefined && urlprefix.length > 0){ + this.urlprefix = urlprefix; + } } public getExperimentId(): string { @@ -94,6 +101,11 @@ class ExperimentStartupInfo { assert(this.initialized); return this.dispatcherPipe; } + + public getAPIRootUrl(): string { + assert(this.initialized); + return this.urlprefix==''?this.API_ROOT_URL:`/${this.urlprefix}`; + } } function getExperimentId(): string { @@ -117,9 +129,9 @@ function getExperimentStartupInfo(): ExperimentStartupInfo { } function setExperimentStartupInfo( - newExperiment: boolean, experimentId: string, basePort: number, platform: string, logDir?: string, logLevel?: string, readonly?: boolean, dispatcherPipe?: string): void { + newExperiment: boolean, experimentId: string, basePort: number, platform: string, logDir?: string, logLevel?: string, readonly?: boolean, dispatcherPipe?: string, urlprefix?: string): void { component.get(ExperimentStartupInfo) - .setStartupInfo(newExperiment, experimentId, basePort, platform, logDir, logLevel, readonly, dispatcherPipe); + .setStartupInfo(newExperiment, experimentId, basePort, platform, logDir, logLevel, readonly, dispatcherPipe, urlprefix); } function isReadonly(): boolean { @@ -130,7 +142,11 @@ function getDispatcherPipe(): string | null { return component.get(ExperimentStartupInfo).getDispatcherPipe(); } +function getAPIRootUrl(): string { + return component.get(ExperimentStartupInfo).getAPIRootUrl(); +} + export { ExperimentStartupInfo, getBasePort, getExperimentId, isNewExperiment, getPlatform, getExperimentStartupInfo, - setExperimentStartupInfo, isReadonly, getDispatcherPipe + setExperimentStartupInfo, isReadonly, getDispatcherPipe, getAPIRootUrl }; diff --git a/ts/nni_manager/main.ts b/ts/nni_manager/main.ts index 3b6c9bae90..c104c3a190 100644 --- a/ts/nni_manager/main.ts +++ b/ts/nni_manager/main.ts @@ -25,9 +25,9 @@ import { NNIRestServer } from './rest_server/nniRestServer'; function initStartupInfo( startExpMode: string, experimentId: string, basePort: number, platform: string, - logDirectory: string, experimentLogLevel: string, readonly: boolean, dispatcherPipe: string): void { + logDirectory: string, experimentLogLevel: string, readonly: boolean, dispatcherPipe: string, urlprefix: string): void { const createNew: boolean = (startExpMode === ExperimentStartUpMode.NEW); - setExperimentStartupInfo(createNew, experimentId, basePort, platform, logDirectory, experimentLogLevel, readonly, dispatcherPipe); + setExperimentStartupInfo(createNew, experimentId, basePort, platform, logDirectory, experimentLogLevel, readonly, dispatcherPipe, urlprefix); } async function initContainer(foreground: boolean, platformMode: string, logFileName?: string): Promise { @@ -122,7 +122,9 @@ const readonly = readonlyArg.toLowerCase() == 'true' ? true : false; const dispatcherPipe: string = parseArg(['--dispatcher_pipe']); -initStartupInfo(startMode, experimentId, port, mode, logDir, logLevel, readonly, dispatcherPipe); +const urlPrefix: string = parseArg(['--url_prefix']); + +initStartupInfo(startMode, experimentId, port, mode, logDir, logLevel, readonly, dispatcherPipe, urlPrefix); mkDirP(getLogDir()) .then(async () => { diff --git a/ts/nni_manager/rest_server/nniRestServer.ts b/ts/nni_manager/rest_server/nniRestServer.ts index d9e185773b..cc8c016c94 100644 --- a/ts/nni_manager/rest_server/nniRestServer.ts +++ b/ts/nni_manager/rest_server/nniRestServer.ts @@ -10,6 +10,7 @@ import * as component from '../common/component'; import { RestServer } from '../common/restServer' import { getLogDir } from '../common/utils'; import { createRestHandler } from './restHandler'; +import { getAPIRootUrl } from '../common/experimentStartupInfo'; /** * NNI Main rest server, provides rest API to support @@ -19,14 +20,15 @@ import { createRestHandler } from './restHandler'; */ @component.Singleton export class NNIRestServer extends RestServer { - private readonly API_ROOT_URL: string = '/api/v1/nni'; private readonly LOGS_ROOT_URL: string = '/logs'; + protected API_ROOT_URL: string = '/api/v1/nni'; /** * constructor to provide NNIRestServer's own rest property, e.g. port */ constructor() { super(); + this.API_ROOT_URL = getAPIRootUrl(); } /**