From 264f9e0e8851a023cf9a648080da4a9fb35c7176 Mon Sep 17 00:00:00 2001 From: wenqiao zhang Date: Sun, 9 Apr 2023 17:54:20 +0800 Subject: [PATCH 01/45] Add DeprecationWarning ignore message to the running script of cnn example --- examples/cnn/run.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/cnn/run.sh b/examples/cnn/run.sh index 9f1c4aa68..a536a1e81 100644 --- a/examples/cnn/run.sh +++ b/examples/cnn/run.sh @@ -17,6 +17,8 @@ # under the License. # +#!/usr/bin/env python -W ignore::DeprecationWarning + ### mnist python train_cnn.py mlp mnist python train_cnn.py cnn mnist From 8edcb96e8a125dd5d6098529e45c1b8d0a1ea05f Mon Sep 17 00:00:00 2001 From: zmeihui Date: Thu, 27 Apr 2023 17:37:29 +0800 Subject: [PATCH 02/45] Add training scripts for xceptionnet --- examples/cifar_distributed_cnn/run-rtx.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/cifar_distributed_cnn/run-rtx.sh b/examples/cifar_distributed_cnn/run-rtx.sh index ff00642ef..3f39694bb 100755 --- a/examples/cifar_distributed_cnn/run-rtx.sh +++ b/examples/cifar_distributed_cnn/run-rtx.sh @@ -38,3 +38,7 @@ mpiexec -np 8 python train_mpi.py mlp cifar100 -l 0.015 -b 32 mpiexec -np 8 python train_mpi.py alexnet mnist -l 0.015 -b 32 mpiexec -np 8 python train_mpi.py alexnet cifar10 -l 0.015 -b 32 mpiexec -np 8 python train_mpi.py alexnet cifar100 -l 0.015 -b 32 + +# xceptionnet +mpiexec -np 8 python train_mpi.py xceptionnet mnist -l 0.015 -b 32 +mpiexec -np 8 python train_mpi.py xceptionnet cifar10 -l 0.015 -b 32 \ No newline at end of file From 0f16a277e5ac58affae316f9e8aa5f2a7c1a2e97 Mon Sep 17 00:00:00 2001 From: wenqiao zhang Date: Thu, 11 May 2023 17:40:08 +0800 Subject: [PATCH 03/45] mlp model examples on top of postgresql --- examples/mlp_postgresql/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 examples/mlp_postgresql/README.md diff --git a/examples/mlp_postgresql/README.md b/examples/mlp_postgresql/README.md new file mode 100644 index 000000000..e34f58197 --- /dev/null +++ b/examples/mlp_postgresql/README.md @@ -0,0 +1,23 @@ + + +# Multi-layer Perceptron (MLP) on top of PostgreSQL + +Examples inside this folder show how to run MLP models +on top of PostgreSQL. \ No newline at end of file From df937b01223ad17138504ba4a381df494e547309 Mon Sep 17 00:00:00 2001 From: liuchangshiye Date: Tue, 30 May 2023 20:22:52 +0800 Subject: [PATCH 04/45] readme for malaria prediction with cnn model --- examples/malaria_cnn/README.md | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 examples/malaria_cnn/README.md diff --git a/examples/malaria_cnn/README.md b/examples/malaria_cnn/README.md new file mode 100644 index 000000000..b9dcbf239 --- /dev/null +++ b/examples/malaria_cnn/README.md @@ -0,0 +1,44 @@ + + +# Singa for Malaria Detection Task + +## Malaria + +Malaria is caused by parasites and could be transmitted through infected mosquitoes. There are about 200 million cases worldwide, and about 400,000 deaths per year, therefore, malaria does lots of harm to global health. + +Although Malaria is a curable disease, inadequate diagnostics make it harder to reduce mortality, as a result, a fast and reliable diagnostic test is a promising and effective way to fight malaria. + +To mitigate the problem, we use Singa to implement a machine learning model to help with Malaria diagnosis. The dataset is from Kaggle https://www.kaggle.com/datasets/miracle9to9/files1?resource=download. Please download the dataset before running the scripts. + +## Structure + +* `data` includes the scripts for preprocessing Malaria image datasets. + +* `model` includes the CNN model construction codes by creating + a subclass of `Module` to wrap the neural network operations + of each model. + +* `train_cnn.py` is the training script, which controls the training flow by + doing BackPropagation and SGD update. + +## Command +```bash +python train_cnn.py cnn malaria -dir pathToDataset +``` \ No newline at end of file From 2f78a24145de2c6b19af900c38fe192215ea7141 Mon Sep 17 00:00:00 2001 From: liuchangshiye Date: Thu, 8 Jun 2023 16:12:48 +0800 Subject: [PATCH 05/45] add shell command file to run the codes --- examples/malaria_cnn/run.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 examples/malaria_cnn/run.sh diff --git a/examples/malaria_cnn/run.sh b/examples/malaria_cnn/run.sh new file mode 100644 index 000000000..6e7e2deb2 --- /dev/null +++ b/examples/malaria_cnn/run.sh @@ -0,0 +1,2 @@ +### malaria dataset +python train_cnn.py cnn malaria -dir pathToDataset \ No newline at end of file From 12b9204d220843d5e081b8167b4b98a47dce6693 Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Wed, 31 May 2023 20:41:00 +0800 Subject: [PATCH 06/45] Init the model selection examples, and add README.md --- examples/model_selection_psql/README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 examples/model_selection_psql/README.md diff --git a/examples/model_selection_psql/README.md b/examples/model_selection_psql/README.md new file mode 100644 index 000000000..c78fca5f1 --- /dev/null +++ b/examples/model_selection_psql/README.md @@ -0,0 +1,22 @@ + + +# Two-Phase Model Selection on PostgreSQL + +Examples inside this folder show how to select a well-performing model using SInga inside RDBMS, such as PostgreSQL. \ No newline at end of file From f4d820fa839675454020569785abe2a495cc1e07 Mon Sep 17 00:00:00 2001 From: solopku Date: Mon, 12 Jun 2023 11:41:47 +0800 Subject: [PATCH 07/45] Init armnet examples, add README.md --- examples/armnet/README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 examples/armnet/README.md diff --git a/examples/armnet/README.md b/examples/armnet/README.md new file mode 100644 index 000000000..698161fe1 --- /dev/null +++ b/examples/armnet/README.md @@ -0,0 +1,24 @@ + + +## ARM-Net: Adaptive Relation Modeling Network for Structured Data + +![version](https://img.shields.io/badge/version-v3.5-green) +![python](https://img.shields.io/badge/python-3.8.3-blue) +![singa](https://img.shields.io/badge/singa-3.1.0-orange) + +This folder contains our Singa implementation of [ARM-Net: Adaptive Relation Modeling Network for Structured Data](https://dl.acm.org/doi/10.1145/3448016.3457321). From 10a7fc980f84b2f9fd1325f438787ae134586dd9 Mon Sep 17 00:00:00 2001 From: liuchangshiye Date: Tue, 13 Jun 2023 10:47:15 +0800 Subject: [PATCH 08/45] Add data loader for malaria dataset --- examples/malaria_cnn/data/malaria.py | 104 +++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 examples/malaria_cnn/data/malaria.py diff --git a/examples/malaria_cnn/data/malaria.py b/examples/malaria_cnn/data/malaria.py new file mode 100644 index 000000000..9c0c1bcac --- /dev/null +++ b/examples/malaria_cnn/data/malaria.py @@ -0,0 +1,104 @@ +try: + import pickle +except ImportError: + import cPickle as pickle + +import numpy as np +import os +import sys +from PIL import Image + + +# need to save to specific local directories +def load_train_data(dir_path="/tmp/malaria", resize_size=(128, 128)): + dir_path = check_dataset_exist(dirpath=dir_path) + path_train_label_1 = os.path.join(dir_path, "training_set/Parasitized") + path_train_label_0 = os.path.join(dir_path, "training_set/Uninfected") + train_label_1 = load_image_path(os.listdir(path_train_label_1)) + train_label_0 = load_image_path(os.listdir(path_train_label_0)) + labels = [] + Images = np.empty((len(train_label_1) + len(train_label_0), + 3, resize_size[0], resize_size[1]), dtype=np.uint8) + for i in range(len(train_label_0)): + image_path = os.path.join(path_train_label_0, train_label_0[i]) + temp_image = np.array(Image.open(image_path).resize( + resize_size).convert("RGB")).transpose(2, 0, 1) + Images[i] = temp_image + labels.append(0) + for i in range(len(train_label_1)): + image_path = os.path.join(path_train_label_1, train_label_1[i]) + temp_image = np.array(Image.open(image_path).resize( + resize_size).convert("RGB")).transpose(2, 0, 1) + Images[i + len(train_label_0)] = temp_image + labels.append(1) + + Images = np.array(Images, dtype=np.float32) + labels = np.array(labels, dtype=np.int32) + return Images, labels + + +# need to save to specific local directories +def load_test_data(dir_path='/tmp/malaria', resize_size=(128, 128)): + dir_path = check_dataset_exist(dirpath=dir_path) + path_test_label_1 = os.path.join(dir_path, "testing_set/Parasitized") + path_test_label_0 = os.path.join(dir_path, "testing_set/Uninfected") + test_label_1 = load_image_path(os.listdir(path_test_label_1)) + test_label_0 = load_image_path(os.listdir(path_test_label_0)) + labels = [] + Images = np.empty((len(test_label_1) + len(test_label_0), + 3, resize_size[0], resize_size[1]), dtype=np.uint8) + for i in range(len(test_label_0)): + image_path = os.path.join(path_test_label_0, test_label_0[i]) + temp_image = np.array(Image.open(image_path).resize( + resize_size).convert("RGB")).transpose(2, 0, 1) + Images[i] = temp_image + labels.append(0) + for i in range(len(test_label_1)): + image_path = os.path.join(path_test_label_1, test_label_1[i]) + temp_image = np.array(Image.open(image_path).resize( + resize_size).convert("RGB")).transpose(2, 0, 1) + Images[i + len(test_label_0)] = temp_image + labels.append(1) + + Images = np.array(Images, dtype=np.float32) + labels = np.array(labels, dtype=np.int32) + return Images, labels + + +def load_image_path(list): + new_list = [] + for image_path in list: + if (image_path.endswith(".png") or image_path.endswith(".jpg")): + new_list.append(image_path) + return new_list + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'Please download the malaria dataset first' + ) + sys.exit(0) + return dirpath + + +def normalize(train_x, val_x): + mean = [0.5339, 0.4180, 0.4460] # mean for malaria dataset + std = [0.3329, 0.2637, 0.2761] # std for malaria dataset + train_x /= 255 + val_x /= 255 + for ch in range(0, 2): + train_x[:, ch, :, :] -= mean[ch] + train_x[:, ch, :, :] /= std[ch] + val_x[:, ch, :, :] -= mean[ch] + val_x[:, ch, :, :] /= std[ch] + return train_x, val_x + + +def load(dir_path): + train_x, train_y = load_train_data(dir_path=dir_path) + val_x, val_y = load_test_data(dir_path=dir_path) + train_x, val_x = normalize(train_x, val_x) + train_y = train_y.flatten() + val_y = val_y.flatten() + return train_x, train_y, val_x, val_y From 4257283a1e555798b3629e52651ab94bf8c6233c Mon Sep 17 00:00:00 2001 From: lemonviv Date: Thu, 20 Jul 2023 11:57:43 +0800 Subject: [PATCH 09/45] add cnn model for malaria detection --- examples/malaria_cnn/model/cnn.py | 77 +++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 examples/malaria_cnn/model/cnn.py diff --git a/examples/malaria_cnn/model/cnn.py b/examples/malaria_cnn/model/cnn.py new file mode 100644 index 000000000..159604888 --- /dev/null +++ b/examples/malaria_cnn/model/cnn.py @@ -0,0 +1,77 @@ + +from singa import layer +from singa import model + + +class CNN(model.Model): + + def __init__(self, num_classes=10, num_channels=1): + super(CNN, self).__init__() + self.num_classes = num_classes + self.input_size = 128 + self.dimension = 4 + self.conv1 = layer.Conv2d(num_channels, 32, 3, padding=0, activation="RELU") + self.conv2 = layer.Conv2d(32, 64, 3, padding=0, activation="RELU") + self.conv3 = layer.Conv2d(64, 64, 3, padding=0, activation="RELU") + self.linear1 = layer.Linear(128) + self.linear2 = layer.Linear(num_classes) + self.pooling1 = layer.MaxPool2d(2, 2, padding=0) + self.pooling2 = layer.MaxPool2d(2, 2, padding=0) + self.pooling3 = layer.MaxPool2d(2, 2, padding=0) + self.relu = layer.ReLU() + self.flatten = layer.Flatten() + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.sigmoid = layer + + def forward(self, x): + y = self.conv1(x) + y = self.pooling1(y) + y = self.conv2(y) + y = self.pooling2(y) + y = self.conv3(y) + y = self.pooling3(y) + y = self.flatten(y) + y = self.linear1(y) + y = self.relu(y) + y = self.linear2(y) + return y + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(**kwargs): + """Constructs a CNN model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = CNN(**kwargs) + + return model + + +__all__ = ['CNN', 'create_model'] \ No newline at end of file From a76f3d7cd7a4b979d709847a91ca46a7a42290ed Mon Sep 17 00:00:00 2001 From: liuchangshiye Date: Fri, 25 Aug 2023 23:01:11 +0800 Subject: [PATCH 10/45] add mlp model for malaria detection --- examples/malaria_cnn/model/mlp.py | 68 +++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 examples/malaria_cnn/model/mlp.py diff --git a/examples/malaria_cnn/model/mlp.py b/examples/malaria_cnn/model/mlp.py new file mode 100644 index 000000000..502fad512 --- /dev/null +++ b/examples/malaria_cnn/model/mlp.py @@ -0,0 +1,68 @@ + +from singa import layer +from singa import model +from singa import tensor +from singa import opt +from singa import device +import argparse +import numpy as np + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + + +class MLP(model.Model): + + def __init__(self, perceptron_size=100, num_classes=10): + super(MLP, self).__init__() + self.num_classes = num_classes + self.dimension = 2 + + self.relu = layer.ReLU() + self.linear1 = layer.Linear(perceptron_size) + self.linear2 = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + def forward(self, inputs): + y = self.linear1(inputs) + y = self.relu(y) + y = self.linear2(y) + return y + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(**kwargs): + """Constructs a CNN model. + + Returns: + The created CNN model. + """ + model = MLP(**kwargs) + + return model + + +__all__ = ['MLP', 'create_model'] \ No newline at end of file From d9831d917ae0918749faacf5a611b161cbdd1fc9 Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Mon, 28 Aug 2023 16:39:50 +0800 Subject: [PATCH 11/45] Add the training file for model selection --- .../model_selection_psql/ms_mlp/train_mlp.py | 375 ++++++++++++++++++ 1 file changed, 375 insertions(+) create mode 100644 examples/model_selection_psql/ms_mlp/train_mlp.py diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py new file mode 100644 index 000000000..1daa9c9b4 --- /dev/null +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -0,0 +1,375 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import singa_wrap as singa +from singa import device +from singa import tensor +from singa import opt +from singa import autograd +from singa.opt import Optimizer +from singa.opt import DecayScheduler +from singa.opt import Constant +import numpy as np +import time +import argparse +from PIL import Image + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Calculate accuracy +def accuracy(pred, target): + # y is network output to be compared with ground truth (int) + y = np.argmax(pred, axis=1) + a = y == target + correct = np.array(a, "int").sum() + return correct + + +# Data partition according to the rank +def partition(global_rank, world_size, train_x, train_y, val_x, val_y): + # Partition training data + data_per_rank = train_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + train_x = train_x[idx_start:idx_end] + train_y = train_y[idx_start:idx_end] + + # Partition evaluation data + data_per_rank = val_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + val_x = val_x[idx_start:idx_end] + val_y = val_y[idx_start:idx_end] + return train_x, train_y, val_x, val_y + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +def resize_dataset(x, image_size): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, image_size, image_size), + dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (image_size, image_size), Image.BILINEAR), + dtype=np.float32) + return X + + +def run(global_rank, + world_size, + local_rank, + max_epoch, + batch_size, + model, + data, + mssgd, + graph, + verbosity, + dist_option='plain', + spars=None, + precision='float32'): + # dev = device.create_cuda_gpu_on(local_rank) # need to change to CPU device for CPU-only machines + dev = device.get_default_device() + dev.SetRandSeed(0) + np.random.seed(0) + + if data == 'cifar10': + from data import cifar10 + train_x, train_y, val_x, val_y = cifar10.load() + elif data == 'cifar100': + from data import cifar100 + train_x, train_y, val_x, val_y = cifar100.load() + elif data == 'mnist': + from data import mnist + train_x, train_y, val_x, val_y = mnist.load() + + + num_channels = train_x.shape[1] + image_size = train_x.shape[2] + data_size = np.prod(train_x.shape[1:train_x.ndim]).item() + num_classes = (np.max(train_y) + 1).item() + + if model == 'resnet': + from model import resnet + model = resnet.resnet50(num_channels=num_channels, + num_classes=num_classes) + elif model == 'xceptionnet': + from model import xceptionnet + model = xceptionnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'cnn': + from model import cnn + model = cnn.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'alexnet': + from model import alexnet + model = alexnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + elif model == 'msmlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from msmlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + # For distributed training, sequential has better performance + if hasattr(mssgd, "communicator"): + DIST = True + sequential = True + else: + DIST = False + sequential = False + + if DIST: + train_x, train_y, val_x, val_y = partition(global_rank, world_size, + train_x, train_y, val_x, + val_y) + + if model.dimension == 4: + tx = tensor.Tensor( + (batch_size, num_channels, model.input_size, model.input_size), dev, + singa_dtype[precision]) + elif model.dimension == 2: + tx = tensor.Tensor((batch_size, data_size), dev, singa_dtype[precision]) + np.reshape(train_x, (train_x.shape[0], -1)) + np.reshape(val_x, (val_x.shape[0], -1)) + + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_val_batch = val_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + # Attach model to graph + model.set_optimizer(mssgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + dev.SetVerbosity(verbosity) + + # Training and evaluation loop + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if global_rank == 0: + print('Starting Epoch %d:' % (epoch)) + + # Training phase + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + model.train() + print ("num_train_batch: \n", num_train_batch) + print () + for b in range(num_train_batch): + if b % 200 == 0: + print ("b: \n", b) + # Generate the patch data in this iteration + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + if model.dimension == 4: + x = augmentation(x, batch_size) + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + + + synflow_flag = False + # Train the model + if epoch == (max_epoch - 1) and b == (num_train_batch - 1): ### synflow calcuation for the last batch + print ("last epoch calculate synflow") + synflow_flag = True + ### step 1: all one input + # Copy the patch data into input tensors + tx.copy_from_numpy(np.ones(x.shape)) + ty.copy_from_numpy(y) + ### step 2: all weights turned to positive (done) + ### step 3: new loss (done) + pn_p_g_list, out, loss = model(tx, ty, synflow_flag, dist_option, spars) + ### step 4: calculate the multiplication of weights + synflow_score = 0.0 + for pn_p_g_item in pn_p_g_list: + print ("calculate weight param * grad parameter name: \n", pn_p_g_item[0]) + if len(pn_p_g_item[1].data.shape) == 2: # param_value.data is "weight" + synflow_score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1].data) * tensor.to_numpy(pn_p_g_item[2].data))) + print ("synflow_score: \n", synflow_score) + elif epoch == (max_epoch - 1) and b == (num_train_batch - 2): # all weights turned to positive + # Copy the patch data into input tensors + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + pn_p_g_list, out, loss = model(tx, ty, synflow_flag, dist_option, spars) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + # all params turned to positive + for pn_p_g_item in pn_p_g_list: + print ("absolute value parameter name: \n", pn_p_g_item[0]) + pn_p_g_item[1].data = tensor.abs(pn_p_g_item[1].data) + else: # normal train steps + # Copy the patch data into input tensors + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + pn_p_g_list, out, loss = model(tx, ty, synflow_flag, dist_option, spars) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, mssgd, reducer) + train_loss = reduce_variable(train_loss, mssgd, reducer) + + if global_rank == 0: + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + # Evaluation phase + model.eval() + for b in range(num_val_batch): + x = val_x[b * batch_size:(b + 1) * batch_size] + if model.dimension == 4: + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = val_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model(tx) + test_correct += accuracy(tensor.to_numpy(out_test), y) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, mssgd, reducer) + + # Output the evaluation accuracy + if global_rank == 0: + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_val_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + dev.PrintTimeProfiling() + + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument( + 'model', + choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'alexnet'], + default='cnn') + parser.add_argument('data', + choices=['mnist', 'cifar10', 'cifar100'], + default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=100, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + # Determine which gpu to use + parser.add_argument('-i', + '--device-id', + default=0, + type=int, + help='which GPU to use', + dest='device_id') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + run(0, + 1, + args.device_id, + args.max_epoch, + args.batch_size, + args.model, + args.data, + mssgd, + args.graph, + args.verbosity, + precision=args.precision) From ba5f5735f009096b7224f6e1e83ddccceba86f5e Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Wed, 30 Aug 2023 15:02:53 +0800 Subject: [PATCH 12/45] Add SGD optimizer for model selection --- .../model_selection_psql/ms_mlp/train_mlp.py | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index 1daa9c9b4..88d6cf549 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -34,6 +34,102 @@ singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} +class MSSGD(MSOptimizer): + """Implements stochastic gradient descent (optionally with momentum). + + Nesterov momentum is based on the formula from `On the importance of initialization and momentum in deep learning`__. + + Args: + lr(float): learning rate + momentum(float, optional): momentum factor(default: 0) + weight_decay(float, optional): weight decay(L2 penalty)(default: 0) + dampening(float, optional): dampening for momentum(default: 0) + nesterov(bool, optional): enables Nesterov momentum(default: False) + + Typical usage example: + >> > from singa import opt + >> > optimizer = opt.SGD(lr=0.1, momentum=0.9) + >> > optimizer.update() + + __ http: // www.cs.toronto.edu / %7Ehinton / absps / momentum.pdf + + .. note:: + The implementation of SGD with Momentum / Nesterov subtly differs from + Sutskever et. al. and implementations in some other frameworks. + + Considering the specific case of Momentum, the update can be written as + + .. math:: + v = \rho * v + g \\ + p = p - lr * v + + where p, g, v and: math: `\rho` denote the parameters, gradient, + velocity, and momentum respectively. + + This is in contrast to Sutskever et. al. and + other frameworks which employ an update of the form + + .. math:: + v = \rho * v + lr * g \\ + p = p - v + + The Nesterov version is analogously modified. + """ + + def __init__(self, + lr=0.1, + momentum=0, + dampening=0, + weight_decay=0, + nesterov=False, + dtype=tensor.float32): + super(MSSGD, self).__init__(lr, dtype) + + # init momentum + if type(momentum) == float or type(momentum) == int: + if momentum < 0.0: + raise ValueError("Invalid momentum value: {}".format(momentum)) + self.momentum = Constant(momentum) + elif isinstance(momentum, DecayScheduler): + self.momentum = momentum + momentum = momentum.init_value + else: + raise TypeError("Wrong momentum type") + self.mom_value = self.momentum(self.step_counter).as_type(self.dtype) + + # init dampening + if type(dampening) == float or type(dampening) == int: + self.dampening = Constant(dampening) + elif isinstance(dampening, DecayScheduler): + self.dampening = dampening + dampening = dampening.init_value + else: + raise TypeError("Wrong dampening type") + self.dam_value = self.dampening(self.step_counter).as_type(self.dtype) + + # init weight_decay + if type(weight_decay) == float or type(weight_decay) == int: + if weight_decay < 0.0: + raise ValueError( + "Invalid weight_decay value: {}".format(weight_decay)) + self.weight_decay = Constant(weight_decay) + elif isinstance(weight_decay, DecayScheduler): + self.weight_decay = weight_decay + else: + raise TypeError("Wrong weight_decay type") + self.decay_value = self.weight_decay(self.step_counter).as_type( + self.dtype) + + # init other params + self.nesterov = nesterov + self.moments = dict() + + # check value + if nesterov and (momentum <= 0 or dampening != 0): + raise ValueError( + "Nesterov momentum requires a momentum and zero dampening") + + # Data augmentation def augmentation(x, batch_size): xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') From 53c664f671ed86923151bf6dbec9a66485fe7b7d Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Thu, 31 Aug 2023 21:05:43 +0800 Subject: [PATCH 13/45] Add implementation for a single optimization step in model selection --- .../model_selection_psql/ms_mlp/train_mlp.py | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index 88d6cf549..aa7bec7d1 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -129,6 +129,49 @@ def __init__(self, raise ValueError( "Nesterov momentum requires a momentum and zero dampening") + def apply(self, param_name, param_value, param_grad): + """Performs a single optimization step. + + Args: + param_name(String): the name of the param + param_value(Tensor): param values to be update in-place + grad(Tensor): param gradients; the values may be updated + in this function; cannot use it anymore + """ + assert param_value.shape == param_grad.shape, ("shape mismatch", + param_value.shape, + param_grad.shape) + self.device_check(param_value, self.step_counter, self.lr_value, + self.mom_value, self.dam_value, self.decay_value) + + # derive dtype from input + assert param_value.dtype == self.dtype + + # TODO add branch operator + # if self.decay_value != 0: + if self.weight_decay.init_value != 0: + singa.Axpy(self.decay_value.data, param_value.data, param_grad.data) + + if self.momentum.init_value != 0: + if param_name not in self.moments: + flag = param_value.device.graph_enabled() + param_value.device.EnableGraph(False) + self.moments[param_name] = tensor.zeros_like(param_value) + param_value.device.EnableGraph(flag) + + buf = self.moments[param_name] + buf *= self.mom_value + alpha = 1.0 - self.dam_value + singa.Axpy(alpha.data, param_grad.data, buf.data) + + if self.nesterov: + singa.Axpy(self.mom_value.data, buf.data, param_grad.data) + else: + param_grad = buf + + minus_lr = 0.0 - self.lr_value + singa.Axpy(minus_lr.data, param_grad.data, param_value.data) + # Data augmentation def augmentation(x, batch_size): @@ -136,8 +179,8 @@ def augmentation(x, batch_size): for data_num in range(0, batch_size): offset = np.random.randint(8, size=2) x[data_num, :, :, :] = xpad[data_num, :, - offset[0]:offset[0] + x.shape[2], - offset[1]:offset[1] + x.shape[2]] + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] if_flip = np.random.randint(2) if (if_flip): x[data_num, :, :, :] = x[data_num, :, :, ::-1] @@ -189,7 +232,7 @@ def resize_dataset(x, image_size): for d in range(0, dim): X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( (image_size, image_size), Image.BILINEAR), - dtype=np.float32) + dtype=np.float32) return X @@ -251,8 +294,8 @@ def run(global_rank, sys.path.insert(0, parent) from mlp import model model = model.create_model(data_size=data_size, - num_classes=num_classes) - + num_classes=num_classes) + elif model == 'msmlp': import os, sys, inspect current = os.path.dirname( @@ -261,7 +304,7 @@ def run(global_rank, sys.path.insert(0, parent) from msmlp import model model = model.create_model(data_size=data_size, - num_classes=num_classes) + num_classes=num_classes) # For distributed training, sequential has better performance if hasattr(mssgd, "communicator"): From dc1a7f38023f67b1712bf3188f3d1addd87c33eb Mon Sep 17 00:00:00 2001 From: liuchangshiye Date: Fri, 1 Sep 2023 15:44:27 +0800 Subject: [PATCH 14/45] Increase the step counter, learning rate for the model selection SGD --- .../model_selection_psql/ms_mlp/train_mlp.py | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index aa7bec7d1..a3f1df8b3 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -172,6 +172,16 @@ def apply(self, param_name, param_value, param_grad): minus_lr = 0.0 - self.lr_value singa.Axpy(minus_lr.data, param_grad.data, param_value.data) + def step(self): + # increment step counter, lr and moment + super().step() + mom_value = self.momentum(self.step_counter).as_type(self.dtype) + dam_value = self.dampening(self.step_counter).as_type(self.dtype) + decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + self.mom_value.copy_from(mom_value) + self.dam_value.copy_from(dam_value) + self.decay_value.copy_from(decay_value) + # Data augmentation def augmentation(x, batch_size): @@ -179,8 +189,8 @@ def augmentation(x, batch_size): for data_num in range(0, batch_size): offset = np.random.randint(8, size=2) x[data_num, :, :, :] = xpad[data_num, :, - offset[0]:offset[0] + x.shape[2], - offset[1]:offset[1] + x.shape[2]] + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] if_flip = np.random.randint(2) if (if_flip): x[data_num, :, :, :] = x[data_num, :, :, ::-1] @@ -232,7 +242,7 @@ def resize_dataset(x, image_size): for d in range(0, dim): X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( (image_size, image_size), Image.BILINEAR), - dtype=np.float32) + dtype=np.float32) return X @@ -294,8 +304,8 @@ def run(global_rank, sys.path.insert(0, parent) from mlp import model model = model.create_model(data_size=data_size, - num_classes=num_classes) - + num_classes=num_classes) + elif model == 'msmlp': import os, sys, inspect current = os.path.dirname( @@ -304,7 +314,7 @@ def run(global_rank, sys.path.insert(0, parent) from msmlp import model model = model.create_model(data_size=data_size, - num_classes=num_classes) + num_classes=num_classes) # For distributed training, sequential has better performance if hasattr(mssgd, "communicator"): From 7f0152a72e4b0b162e6867fa987f5954de6b1da8 Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Sat, 2 Sep 2023 20:51:11 +0800 Subject: [PATCH 15/45] Add implementation for get and set states --- examples/model_selection_psql/ms_mlp/train_mlp.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index a3f1df8b3..1956de9eb 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -182,6 +182,18 @@ def step(self): self.dam_value.copy_from(dam_value) self.decay_value.copy_from(decay_value) + def get_states(self): + states = super().get_states() + if self.mom_value > 0: + states[ + 'moments'] = self.moments # a dict for 1st order moments tensors + return states + + def set_states(self, states): + super().set_states(states) + if 'moments' in states: + self.moments = states['moments'] + self.mom_value = self.momentum(self.step_counter) # Data augmentation def augmentation(x, batch_size): From 96b079958dd736375f2eb75d9ecfdf81a282d08a Mon Sep 17 00:00:00 2001 From: daoducanhc Date: Tue, 5 Sep 2023 16:10:58 +0800 Subject: [PATCH 16/45] Add the implementation for model selection optimizer --- .../model_selection_psql/ms_mlp/train_mlp.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index 1956de9eb..027e659ae 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -34,6 +34,22 @@ singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} +### MSOptimizer +class MSOptimizer(Optimizer): + def __call__(self, loss): + pn_p_g_list = self.call_with_returns(loss) + self.step() + return pn_p_g_list + + def call_with_returns(self, loss): + pn_p_g_list = [] + for p, g in autograd.backward(loss): + if p.name is None: + p.name = id(p) + self.apply(p.name, p, g) + pn_p_g_list.append(p.name, p, g) + return pn_p_g_list + class MSSGD(MSOptimizer): """Implements stochastic gradient descent (optionally with momentum). @@ -195,6 +211,7 @@ def set_states(self, states): self.moments = states['moments'] self.mom_value = self.momentum(self.step_counter) + # Data augmentation def augmentation(x, batch_size): xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') From 3f1d9cc7e487400ab22e8c1c04bfb67c4e8bf721 Mon Sep 17 00:00:00 2001 From: zmeihui Date: Tue, 5 Sep 2023 21:56:47 +0800 Subject: [PATCH 17/45] Add implementation for mlp models in model selection --- examples/model_selection_psql/msmlp/model.py | 153 +++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 examples/model_selection_psql/msmlp/model.py diff --git a/examples/model_selection_psql/msmlp/model.py b/examples/model_selection_psql/msmlp/model.py new file mode 100644 index 000000000..44cf44f95 --- /dev/null +++ b/examples/model_selection_psql/msmlp/model.py @@ -0,0 +1,153 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model +from singa import tensor +from singa import opt +from singa import device +from singa.autograd import Operator +from singa.layer import Layer +from singa import singa_wrap as singa +import argparse +import numpy as np + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +class MSMLP(model.Model): + + def __init__(self, data_size=10, perceptron_size=100, num_classes=10): + super(MSMLP, self).__init__() + self.num_classes = num_classes + self.dimension = 2 + + self.relu = layer.ReLU() + self.linear1 = layer.Linear(perceptron_size) + self.linear2 = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.sum_error = SumErrorLayer() + + def forward(self, inputs): + y = self.linear1(inputs) + y = self.relu(y) + y = self.linear2(y) + return y + + def train_one_batch(self, x, y, synflow_flag, dist_option, spars): + out = self.forward(x) + if synflow_flag: + loss = self.sum_error(out) + else: # normal training + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + pn_p_g_list = self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return pn_p_g_list, out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = MSMLP(**kwargs) + + return model + + +__all__ = ['MLP', 'create_model'] + +if __name__ == "__main__": + np.random.seed(0) + + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # choose one precision + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]).astype(np.int32) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np_precision) + + dev = device.create_cuda_gpu_on(0) + sgd = opt.SGD(0.1, 0.9, 1e-5, dtype=singa_dtype[args.precision]) + tx = tensor.Tensor((400, 2), dev, precision) + ty = tensor.Tensor((400,), dev, tensor.int32) + model = MLP(data_size=2, perceptron_size=3, num_classes=2) + + # attach model to graph + model.set_optimizer(sgd) + model.compile([tx], is_train=True, use_graph=args.graph, sequential=True) + model.train() + + for i in range(args.max_epoch): + tx.copy_from_numpy(data) + ty.copy_from_numpy(label) + out, loss = model(tx, ty, 'fp32', spars=None) + + if i % 100 == 0: + print("training loss = ", tensor.to_numpy(loss)[0]) From 94e8e43d0c789d107501d899952d92f9b885155e Mon Sep 17 00:00:00 2001 From: daoducanhc Date: Wed, 6 Sep 2023 11:16:37 +0800 Subject: [PATCH 18/45] Add implementation for sum error loss for model selection --- examples/model_selection_psql/msmlp/model.py | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/examples/model_selection_psql/msmlp/model.py b/examples/model_selection_psql/msmlp/model.py index 44cf44f95..886be20b7 100644 --- a/examples/model_selection_psql/msmlp/model.py +++ b/examples/model_selection_psql/msmlp/model.py @@ -32,6 +32,28 @@ singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} +#### self-defined loss begin + +### reference from autograd.py +class SumError(Operator): + + def __init__(self): + super(SumError, self).__init__() + # self.t = t.data + + def forward(self, x): + # self.err = singa.__sub__(x, self.t) + self.data_x = x + # sqr = singa.Square(self.err) + # loss = singa.SumAll(sqr) + loss = singa.SumAll(x) + # self.n = 1 + # for s in x.shape(): + # self.n *= s + # loss /= self.n + return loss + + class MSMLP(model.Model): def __init__(self, data_size=10, perceptron_size=100, num_classes=10): From 0c151e7133c1f0186def60d9b2505c85a9f28ddf Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Wed, 6 Sep 2023 14:51:27 +0800 Subject: [PATCH 19/45] Add the backward implementation for sum error loss --- examples/model_selection_psql/msmlp/model.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/examples/model_selection_psql/msmlp/model.py b/examples/model_selection_psql/msmlp/model.py index 886be20b7..81ccd5b05 100644 --- a/examples/model_selection_psql/msmlp/model.py +++ b/examples/model_selection_psql/msmlp/model.py @@ -52,7 +52,21 @@ def forward(self, x): # self.n *= s # loss /= self.n return loss - + + def backward(self, dy=1.0): + # dx = self.err + dev = device.get_default_device() + dx = tensor.Tensor(self.data_x.shape, dev, singa_dtype['float32']) + dx.copy_from_numpy(np.ones(self.data_x.shape)) + # dx *= float(2 / self.n) + dx *= dy + return dx + +### called in the MSMLP class for sum error loss gradients +def se_loss(x): + # assert x.shape == t.shape, "input and target shape different: %s, %s" % ( + # x.shape, t.shape) + return SumError()(x)[0] class MSMLP(model.Model): @@ -66,7 +80,7 @@ def __init__(self, data_size=10, perceptron_size=100, num_classes=10): self.linear2 = layer.Linear(num_classes) self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() self.sum_error = SumErrorLayer() - + def forward(self, inputs): y = self.linear1(inputs) y = self.relu(y) From 2cf2a5be9c855693f77c09cee87647f20e53874f Mon Sep 17 00:00:00 2001 From: liuchangshiye Date: Wed, 6 Sep 2023 16:40:56 +0800 Subject: [PATCH 20/45] Add the SumErrorLayer implementation --- examples/model_selection_psql/msmlp/model.py | 25 +++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/examples/model_selection_psql/msmlp/model.py b/examples/model_selection_psql/msmlp/model.py index 81ccd5b05..be898b291 100644 --- a/examples/model_selection_psql/msmlp/model.py +++ b/examples/model_selection_psql/msmlp/model.py @@ -32,9 +32,7 @@ singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} -#### self-defined loss begin - -### reference from autograd.py +### refer to autograd.py class SumError(Operator): def __init__(self): @@ -52,7 +50,7 @@ def forward(self, x): # self.n *= s # loss /= self.n return loss - + def backward(self, dy=1.0): # dx = self.err dev = device.get_default_device() @@ -62,12 +60,21 @@ def backward(self, dy=1.0): dx *= dy return dx -### called in the MSMLP class for sum error loss gradients def se_loss(x): - # assert x.shape == t.shape, "input and target shape different: %s, %s" % ( - # x.shape, t.shape) return SumError()(x)[0] +### refer to layer.py +class SumErrorLayer(Layer): + """ + Generate a SumError Layer + """ + + def __init__(self): + super(SumErrorLayer, self).__init__() + + def forward(self, x): + return se_loss(x) + class MSMLP(model.Model): def __init__(self, data_size=10, perceptron_size=100, num_classes=10): @@ -79,8 +86,8 @@ def __init__(self, data_size=10, perceptron_size=100, num_classes=10): self.linear1 = layer.Linear(perceptron_size) self.linear2 = layer.Linear(num_classes) self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() - self.sum_error = SumErrorLayer() - + self.sum_error = SumErrorLayer() # for synflow backward + def forward(self, inputs): y = self.linear1(inputs) y = self.relu(y) From 05cd43cf660dc3e5ace8e578769e540d7a45ef05 Mon Sep 17 00:00:00 2001 From: zmeihui Date: Thu, 7 Sep 2023 10:49:00 +0800 Subject: [PATCH 21/45] Create the ms_model_mlp folder for dynamic model creation --- .../ms_model_mlp/model.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 examples/model_selection_psql/ms_model_mlp/model.py diff --git a/examples/model_selection_psql/ms_model_mlp/model.py b/examples/model_selection_psql/ms_model_mlp/model.py new file mode 100644 index 000000000..a717c39f4 --- /dev/null +++ b/examples/model_selection_psql/ms_model_mlp/model.py @@ -0,0 +1,98 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model +from singa import tensor +from singa import opt +from singa import device +from singa.autograd import Operator +from singa.layer import Layer +from singa import singa_wrap as singa +import argparse +import numpy as np + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +#### self-defined loss begin + +### from autograd.py +class SumError(Operator): + + def __init__(self): + super(SumError, self).__init__() + # self.t = t.data + + def forward(self, x): + # self.err = singa.__sub__(x, self.t) + self.data_x = x + # sqr = singa.Square(self.err) + # loss = singa.SumAll(sqr) + loss = singa.SumAll(x) + # self.n = 1 + # for s in x.shape(): + # self.n *= s + # loss /= self.n + return loss + + def backward(self, dy=1.0): + # dx = self.err + dev = device.get_default_device() + dx = tensor.Tensor(self.data_x.shape, dev, singa_dtype['float32']) + dx.copy_from_numpy(np.ones(self.data_x.shape)) + # dx *= float(2 / self.n) + dx *= dy + return dx + +def se_loss(x): + # assert x.shape == t.shape, "input and target shape different: %s, %s" % ( + # x.shape, t.shape) + return SumError()(x)[0] + +### from layer.py +class SumErrorLayer(Layer): + """ + Generate a MeanSquareError operator + """ + + def __init__(self): + super(SumErrorLayer, self).__init__() + + def forward(self, x): + return se_loss(x) + +#### self-defined loss end + +class MSMLP(model.Model): + + def __init__(self, data_size=10, perceptron_size=100, num_classes=10, layer_hidden_list=[10,10,10,10]): + super(MSMLP, self).__init__() + self.num_classes = num_classes + self.dimension = 2 + + self.relu = layer.ReLU() + self.linear1 = layer.Linear(layer_hidden_list[0]) + self.linear2 = layer.Linear(layer_hidden_list[1]) + self.linear3 = layer.Linear(layer_hidden_list[2]) + self.linear4 = layer.Linear(layer_hidden_list[3]) + self.linear5 = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.sum_error = SumErrorLayer() From d14fc3bc1cb3c777e4cb183d77a8e1d25b83ba93 Mon Sep 17 00:00:00 2001 From: daoducanhc Date: Thu, 7 Sep 2023 11:30:08 +0800 Subject: [PATCH 22/45] Add the autograd implementation for msmlp --- examples/model_selection_psql/msmlp/native.py | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 examples/model_selection_psql/msmlp/native.py diff --git a/examples/model_selection_psql/msmlp/native.py b/examples/model_selection_psql/msmlp/native.py new file mode 100644 index 000000000..a82ec3b24 --- /dev/null +++ b/examples/model_selection_psql/msmlp/native.py @@ -0,0 +1,137 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import tensor +from singa.tensor import Tensor +from singa import autograd +from singa import opt +import numpy as np +from singa import device +import argparse + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + np.random.seed(0) + + autograd.training = True + + # prepare training data in numpy array + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np.float32) + + def to_categorical(y, num_classes): + """ + Converts a class vector (integers) to binary class matrix. + + Args: + y: class vector to be converted into a matrix + (integers from 0 to num_classes). + num_classes: total number of classes. + + Returns: + A binary matrix representation of the input. + """ + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + categorical[np.arange(n), y] = 1 + return categorical + + label = to_categorical(label, 2).astype(np.float32) + print("train_data_shape:", data.shape) + print("train_label_shape:", label.shape) + + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + dev = device.create_cuda_gpu() + + inputs = Tensor(data=data, device=dev) + target = Tensor(data=label, device=dev) + + inputs = inputs.as_type(precision) + target = target.as_type(tensor.int32) + + w0_np = np.random.normal(0, 0.1, (2, 3)).astype(np_precision) + w0 = Tensor(data=w0_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0 = Tensor(shape=(3,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0.set_value(0.0) + + w1_np = np.random.normal(0, 0.1, (3, 2)).astype(np_precision) + w1 = Tensor(data=w1_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1 = Tensor(shape=(2,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1.set_value(0.0) + + sgd = opt.SGD(0.05, 0.8) + + # training process + for i in range(args.max_epoch): + x = autograd.matmul(inputs, w0) + x = autograd.add_bias(x, b0) + x = autograd.relu(x) + x = autograd.matmul(x, w1) + x = autograd.add_bias(x, b1) + loss = autograd.softmax_cross_entropy(x, target) + sgd(loss) + + if i % 100 == 0: + print("%d, training loss = " % i, tensor.to_numpy(loss)[0]) From 62a94cd309cd18d2179d6fea2abcf0a1d91d708e Mon Sep 17 00:00:00 2001 From: qingpeng Date: Thu, 7 Sep 2023 16:33:48 +0800 Subject: [PATCH 23/45] Add train one batch function for the dynamic model --- .../ms_model_mlp/model.py | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/examples/model_selection_psql/ms_model_mlp/model.py b/examples/model_selection_psql/ms_model_mlp/model.py index a717c39f4..890673622 100644 --- a/examples/model_selection_psql/ms_model_mlp/model.py +++ b/examples/model_selection_psql/ms_model_mlp/model.py @@ -79,8 +79,6 @@ def __init__(self): def forward(self, x): return se_loss(x) -#### self-defined loss end - class MSMLP(model.Model): def __init__(self, data_size=10, perceptron_size=100, num_classes=10, layer_hidden_list=[10,10,10,10]): @@ -96,3 +94,56 @@ def __init__(self, data_size=10, perceptron_size=100, num_classes=10, layer_hidd self.linear5 = layer.Linear(num_classes) self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() self.sum_error = SumErrorLayer() + + def forward(self, inputs): + y = self.linear1(inputs) + y = self.relu(y) + y = self.linear2(y) + y = self.relu(y) + y = self.linear3(y) + y = self.relu(y) + y = self.linear4(y) + y = self.relu(y) + y = self.linear5(y) + return y + + def train_one_batch(self, x, y, dist_option, spars, synflow_flag): + # print ("in train_one_batch") + out = self.forward(x) + # print ("train_one_batch x.data: \n", x.data) + # print ("train_one_batch y.data: \n", y.data) + # print ("train_one_batch out.data: \n", out.data) + if synflow_flag: + # print ("sum_error") + loss = self.sum_error(out) + else: # normal training + # print ("softmax_cross_entropy") + loss = self.softmax_cross_entropy(out, y) + # print ("train_one_batch loss.data: \n", loss.data) + + if dist_option == 'plain': + # print ("before pn_p_g_list = self.optimizer(loss)") + pn_p_g_list = self.optimizer(loss) + # print ("after pn_p_g_list = self.optimizer(loss)") + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + # print ("len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("len(pn_p_g_list[0]): \n", len(pn_p_g_list[0])) + # print ("pn_p_g_list[0][0]: \n", pn_p_g_list[0][0]) + # print ("pn_p_g_list[0][1].data: \n", pn_p_g_list[0][1].data) + # print ("pn_p_g_list[0][2].data: \n", pn_p_g_list[0][2].data) + return pn_p_g_list, out, loss + # return pn_p_g_list[0], pn_p_g_list[1], pn_p_g_list[2], out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer From 9e955b13075161fd5ea17659b1ab69dd8334bb4b Mon Sep 17 00:00:00 2001 From: liuchangshiye Date: Fri, 8 Sep 2023 14:50:23 +0800 Subject: [PATCH 24/45] Add create model function for the dynamic model --- .../ms_model_mlp/model.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/examples/model_selection_psql/ms_model_mlp/model.py b/examples/model_selection_psql/ms_model_mlp/model.py index 890673622..1e2b8191c 100644 --- a/examples/model_selection_psql/ms_model_mlp/model.py +++ b/examples/model_selection_psql/ms_model_mlp/model.py @@ -147,3 +147,49 @@ def train_one_batch(self, x, y, dist_option, spars, synflow_flag): def set_optimizer(self, optimizer): self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = MSMLP(**kwargs) + + return model + + +__all__ = ['MLP', 'create_model'] + +if __name__ == "__main__": + np.random.seed(0) + + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + model = MLP(data_size=2, perceptron_size=3, num_classes=2) + + # attach model to graph + model.set_optimizer(sgd) + model.compile([tx], is_train=True, use_graph=args.graph, sequential=True) + model.train() \ No newline at end of file From f84ebe58e9a68012d5286c8c2e6cda445dde55b7 Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Fri, 8 Sep 2023 18:26:25 +0800 Subject: [PATCH 25/45] Add training process for the dynamic model --- .../ms_model_mlp/model.py | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/examples/model_selection_psql/ms_model_mlp/model.py b/examples/model_selection_psql/ms_model_mlp/model.py index 1e2b8191c..70d1a1748 100644 --- a/examples/model_selection_psql/ms_model_mlp/model.py +++ b/examples/model_selection_psql/ms_model_mlp/model.py @@ -94,7 +94,7 @@ def __init__(self, data_size=10, perceptron_size=100, num_classes=10, layer_hidd self.linear5 = layer.Linear(num_classes) self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() self.sum_error = SumErrorLayer() - + def forward(self, inputs): y = self.linear1(inputs) y = self.relu(y) @@ -187,9 +187,38 @@ def create_model(pretrained=False, **kwargs): dest='max_epoch') args = parser.parse_args() + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # choose one precision + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]).astype(np.int32) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np_precision) + + dev = device.create_cuda_gpu_on(0) + sgd = opt.SGD(0.1, 0.9, 1e-5, dtype=singa_dtype[args.precision]) + tx = tensor.Tensor((400, 2), dev, precision) + ty = tensor.Tensor((400,), dev, tensor.int32) model = MLP(data_size=2, perceptron_size=3, num_classes=2) # attach model to graph model.set_optimizer(sgd) model.compile([tx], is_train=True, use_graph=args.graph, sequential=True) - model.train() \ No newline at end of file + model.train() + + for i in range(args.max_epoch): + tx.copy_from_numpy(data) + ty.copy_from_numpy(label) + out, loss = model(tx, ty, 'fp32', spars=None) + + if i % 100 == 0: + print("training loss = ", tensor.to_numpy(loss)[0]) \ No newline at end of file From 41e260d084d50d4c65ba7c71da43fe01badad443 Mon Sep 17 00:00:00 2001 From: zmeihui Date: Mon, 11 Sep 2023 10:08:23 +0800 Subject: [PATCH 26/45] Add autograd implementation for dynamic model creation --- .../ms_model_mlp/native.py | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 examples/model_selection_psql/ms_model_mlp/native.py diff --git a/examples/model_selection_psql/ms_model_mlp/native.py b/examples/model_selection_psql/ms_model_mlp/native.py new file mode 100644 index 000000000..a82ec3b24 --- /dev/null +++ b/examples/model_selection_psql/ms_model_mlp/native.py @@ -0,0 +1,137 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import tensor +from singa.tensor import Tensor +from singa import autograd +from singa import opt +import numpy as np +from singa import device +import argparse + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + np.random.seed(0) + + autograd.training = True + + # prepare training data in numpy array + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np.float32) + + def to_categorical(y, num_classes): + """ + Converts a class vector (integers) to binary class matrix. + + Args: + y: class vector to be converted into a matrix + (integers from 0 to num_classes). + num_classes: total number of classes. + + Returns: + A binary matrix representation of the input. + """ + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + categorical[np.arange(n), y] = 1 + return categorical + + label = to_categorical(label, 2).astype(np.float32) + print("train_data_shape:", data.shape) + print("train_label_shape:", label.shape) + + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + dev = device.create_cuda_gpu() + + inputs = Tensor(data=data, device=dev) + target = Tensor(data=label, device=dev) + + inputs = inputs.as_type(precision) + target = target.as_type(tensor.int32) + + w0_np = np.random.normal(0, 0.1, (2, 3)).astype(np_precision) + w0 = Tensor(data=w0_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0 = Tensor(shape=(3,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0.set_value(0.0) + + w1_np = np.random.normal(0, 0.1, (3, 2)).astype(np_precision) + w1 = Tensor(data=w1_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1 = Tensor(shape=(2,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1.set_value(0.0) + + sgd = opt.SGD(0.05, 0.8) + + # training process + for i in range(args.max_epoch): + x = autograd.matmul(inputs, w0) + x = autograd.add_bias(x, b0) + x = autograd.relu(x) + x = autograd.matmul(x, w1) + x = autograd.add_bias(x, b1) + loss = autograd.softmax_cross_entropy(x, target) + sgd(loss) + + if i % 100 == 0: + print("%d, training loss = " % i, tensor.to_numpy(loss)[0]) From 1d2f6e758666f4fd40779ae0ef8186a755c5bbd4 Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Tue, 12 Sep 2023 12:56:05 +0800 Subject: [PATCH 27/45] Debug the training process for training free model evaluation metric --- .../model_selection_psql/ms_mlp/train_mlp.py | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index 027e659ae..d7b21fb58 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -42,12 +42,17 @@ def __call__(self, loss): return pn_p_g_list def call_with_returns(self, loss): + print ("call_with_returns loss.data: \n", loss.data) pn_p_g_list = [] for p, g in autograd.backward(loss): if p.name is None: p.name = id(p) self.apply(p.name, p, g) pn_p_g_list.append(p.name, p, g) + print ("call with returns") + print ("p.name: \n", p.name) + print ("p.data: \n", p.data) + print ("g.data: \n", g.data) return pn_p_g_list class MSSGD(MSOptimizer): @@ -218,8 +223,8 @@ def augmentation(x, batch_size): for data_num in range(0, batch_size): offset = np.random.randint(8, size=2) x[data_num, :, :, :] = xpad[data_num, :, - offset[0]:offset[0] + x.shape[2], - offset[1]:offset[1] + x.shape[2]] + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] if_flip = np.random.randint(2) if (if_flip): x[data_num, :, :, :] = x[data_num, :, :, ::-1] @@ -271,7 +276,7 @@ def resize_dataset(x, image_size): for d in range(0, dim): X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( (image_size, image_size), Image.BILINEAR), - dtype=np.float32) + dtype=np.float32) return X @@ -333,8 +338,8 @@ def run(global_rank, sys.path.insert(0, parent) from mlp import model model = model.create_model(data_size=data_size, - num_classes=num_classes) - + num_classes=num_classes) + elif model == 'msmlp': import os, sys, inspect current = os.path.dirname( @@ -343,7 +348,7 @@ def run(global_rank, sys.path.insert(0, parent) from msmlp import model model = model.create_model(data_size=data_size, - num_classes=num_classes) + num_classes=num_classes) # For distributed training, sequential has better performance if hasattr(mssgd, "communicator"): @@ -413,34 +418,39 @@ def run(global_rank, synflow_flag = True ### step 1: all one input # Copy the patch data into input tensors - tx.copy_from_numpy(np.ones(x.shape)) + tx.copy_from_numpy(np.ones(x.shape, dtype=np.float32)) ty.copy_from_numpy(y) ### step 2: all weights turned to positive (done) ### step 3: new loss (done) - pn_p_g_list, out, loss = model(tx, ty, synflow_flag, dist_option, spars) + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) ### step 4: calculate the multiplication of weights synflow_score = 0.0 for pn_p_g_item in pn_p_g_list: print ("calculate weight param * grad parameter name: \n", pn_p_g_item[0]) - if len(pn_p_g_item[1].data.shape) == 2: # param_value.data is "weight" - synflow_score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1].data) * tensor.to_numpy(pn_p_g_item[2].data))) + if len(pn_p_g_item[1].shape) == 2: # param_value.data is "weight" + print ("pn_p_g_item[1].shape: \n", pn_p_g_item[1].shape) + synflow_score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1]) * tensor.to_numpy(pn_p_g_item[2]))) print ("synflow_score: \n", synflow_score) elif epoch == (max_epoch - 1) and b == (num_train_batch - 2): # all weights turned to positive # Copy the patch data into input tensors tx.copy_from_numpy(x) ty.copy_from_numpy(y) - pn_p_g_list, out, loss = model(tx, ty, synflow_flag, dist_option, spars) + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) train_correct += accuracy(tensor.to_numpy(out), y) train_loss += tensor.to_numpy(loss)[0] # all params turned to positive for pn_p_g_item in pn_p_g_list: print ("absolute value parameter name: \n", pn_p_g_item[0]) - pn_p_g_item[1].data = tensor.abs(pn_p_g_item[1].data) + pn_p_g_item[1] = tensor.abs(pn_p_g_item[1]) # return tensor already else: # normal train steps # Copy the patch data into input tensors tx.copy_from_numpy(x) ty.copy_from_numpy(y) - pn_p_g_list, out, loss = model(tx, ty, synflow_flag, dist_option, spars) + # print ("normal before model(tx, ty, synflow_flag, dist_option, spars)") + # print ("train_cnn tx: \n", tx) + # print ("train_cnn ty: \n", ty) + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("normal after model(tx, ty, synflow_flag, dist_option, spars)") train_correct += accuracy(tensor.to_numpy(out), y) train_loss += tensor.to_numpy(loss)[0] @@ -490,7 +500,7 @@ def run(global_rank, description='Training using the autograd and graph.') parser.add_argument( 'model', - choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'alexnet'], + choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'msmlp', 'alexnet'], default='cnn') parser.add_argument('data', choices=['mnist', 'cifar10', 'cifar100'], @@ -501,7 +511,7 @@ def run(global_rank, dest='precision') parser.add_argument('-m', '--max-epoch', - default=100, + default=10, type=int, help='maximum epochs', dest='max_epoch') From 369f0f27b526d5c3819a10d552bbfeb3ed909323 Mon Sep 17 00:00:00 2001 From: zhaojing Date: Thu, 14 Sep 2023 10:42:46 +0800 Subject: [PATCH 28/45] Training process for mlp models with varying layer sizes --- .../model_selection_psql/ms_mlp/train_mlp.py | 42 +++++++++++-------- examples/model_selection_psql/msmlp/model.py | 13 ++++++ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index d7b21fb58..9f411f04e 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -42,17 +42,17 @@ def __call__(self, loss): return pn_p_g_list def call_with_returns(self, loss): - print ("call_with_returns loss.data: \n", loss.data) + # print ("call_with_returns loss.data: \n", loss.data) pn_p_g_list = [] for p, g in autograd.backward(loss): if p.name is None: p.name = id(p) self.apply(p.name, p, g) pn_p_g_list.append(p.name, p, g) - print ("call with returns") - print ("p.name: \n", p.name) - print ("p.data: \n", p.data) - print ("g.data: \n", g.data) + # print ("call with returns") + # print ("p.name: \n", p.name) + # print ("p.data: \n", p.data) + # print ("g.data: \n", g.data) return pn_p_g_list class MSSGD(MSOptimizer): @@ -549,15 +549,23 @@ def run(global_rank, args = parser.parse_args() - mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) - run(0, - 1, - args.device_id, - args.max_epoch, - args.batch_size, - args.model, - args.data, - mssgd, - args.graph, - args.verbosity, - precision=args.precision) + DEFAULT_LAYER_CHOICES_4 = [8, 16, 24, 32] + for layer1 in DEFAULT_LAYER_CHOICES_4: + for layer2 in DEFAULT_LAYER_CHOICES_4: + for layer3 in DEFAULT_LAYER_CHOICES_4: + for layer4 in DEFAULT_LAYER_CHOICES_4: + layer_hidden_list = [layer1, layer2+1, layer3+2, layer4+3] + # print ("layer_hidden_list: \n", layer_hidden_list) + mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + run(0, + 1, + args.device_id, + layer_hidden_list, + args.max_epoch, + args.batch_size, + args.model, + args.data, + mssgd, + args.graph, + args.verbosity, + precision=args.precision) diff --git a/examples/model_selection_psql/msmlp/model.py b/examples/model_selection_psql/msmlp/model.py index be898b291..70bc2341d 100644 --- a/examples/model_selection_psql/msmlp/model.py +++ b/examples/model_selection_psql/msmlp/model.py @@ -95,14 +95,21 @@ def forward(self, inputs): return y def train_one_batch(self, x, y, synflow_flag, dist_option, spars): + # print ("in train_one_batch") out = self.forward(x) + # print ("train_one_batch x.data: \n", x.data) + # print ("train_one_batch y.data: \n", y.data) + # print ("train_one_batch out.data: \n", out.data) if synflow_flag: loss = self.sum_error(out) + # print ("sum_error") else: # normal training loss = self.softmax_cross_entropy(out, y) if dist_option == 'plain': + # print ("before pn_p_g_list = self.optimizer(loss)") pn_p_g_list = self.optimizer(loss) + # print ("after pn_p_g_list = self.optimizer(loss)") elif dist_option == 'half': self.optimizer.backward_and_update_half(loss) elif dist_option == 'partialUpdate': @@ -115,7 +122,13 @@ def train_one_batch(self, x, y, synflow_flag, dist_option, spars): self.optimizer.backward_and_sparse_update(loss, topK=False, spars=spars) + # print ("len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("len(pn_p_g_list[0]): \n", len(pn_p_g_list[0])) + # print ("pn_p_g_list[0][0]: \n", pn_p_g_list[0][0]) + # print ("pn_p_g_list[0][1].data: \n", pn_p_g_list[0][1].data) + # print ("pn_p_g_list[0][2].data: \n", pn_p_g_list[0][2].data) return pn_p_g_list, out, loss + # return pn_p_g_list[0], pn_p_g_list[1], pn_p_g_list[2], out, loss def set_optimizer(self, optimizer): self.optimizer = optimizer From 2c955ee3e4ab8bc775792a366f479ac522cc869c Mon Sep 17 00:00:00 2001 From: zhaojing Date: Fri, 15 Sep 2023 10:09:20 +0800 Subject: [PATCH 29/45] Training script for model selection --- .../ms_mlp/train_multiprocess.py | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 examples/model_selection_psql/ms_mlp/train_multiprocess.py diff --git a/examples/model_selection_psql/ms_mlp/train_multiprocess.py b/examples/model_selection_psql/ms_mlp/train_multiprocess.py new file mode 100644 index 000000000..182dd35ee --- /dev/null +++ b/examples/model_selection_psql/ms_mlp/train_multiprocess.py @@ -0,0 +1,111 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + + +from singa import singa_wrap as singa +from singa import opt +from singa import tensor +import argparse +import train_cnn +import multiprocessing + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +def run(args, local_rank, world_size, nccl_id): + sgd = opt.SGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + sgd = opt.DistOpt(sgd, nccl_id=nccl_id, local_rank=local_rank, world_size=world_size) + train_cnn.run(sgd.global_rank, sgd.world_size, sgd.local_rank, args.max_epoch, + args.batch_size, args.model, args.data, sgd, args.graph, + args.verbosity, args.dist_option, args.spars, args.precision) + + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument('model', + choices=['resnet', 'xceptionnet', 'cnn', 'mlp'], + default='cnn') + parser.add_argument('data', choices=['cifar10', 'cifar100', 'mnist'], default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=10, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + parser.add_argument('-w', + '--world-size', + default=2, + type=int, + help='number of gpus to be used', + dest='world_size') + parser.add_argument('-d', + '--dist-option', + default='plain', + choices=['plain','half','partialUpdate','sparseTopK','sparseThreshold'], + help='distibuted training options', + dest='dist_option') # currently partialUpdate support graph=False only + parser.add_argument('-s', + '--sparsification', + default='0.05', + type=float, + help='the sparsity parameter used for sparsification, between 0 to 1', + dest='spars') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + # Generate a NCCL ID to be used for collective communication + nccl_id = singa.NcclIdHolder() + + process = [] + for local_rank in range(0, args.world_size): + process.append( + multiprocessing.Process(target=run, + args=(args, local_rank, args.world_size, nccl_id))) + + for p in process: + p.start() From 957caaf36640fc4fe74a6ea1a42bf71919115703 Mon Sep 17 00:00:00 2001 From: Wu-Junran Date: Sat, 16 Sep 2023 17:43:32 +0800 Subject: [PATCH 30/45] Update the training file for dynamic models --- .../model_selection_psql/ms_mlp/train_mlp.py | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/examples/model_selection_psql/ms_mlp/train_mlp.py b/examples/model_selection_psql/ms_mlp/train_mlp.py index 9f411f04e..3c084ab11 100644 --- a/examples/model_selection_psql/ms_mlp/train_mlp.py +++ b/examples/model_selection_psql/ms_mlp/train_mlp.py @@ -349,6 +349,19 @@ def run(global_rank, from msmlp import model model = model.create_model(data_size=data_size, num_classes=num_classes) + + elif model == 'ms_model_mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from ms_model_mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes, + layer_hidden_list=layer_hidden_list) + # print ("model: \n", model) + # For distributed training, sequential has better performance if hasattr(mssgd, "communicator"): @@ -399,8 +412,8 @@ def run(global_rank, print ("num_train_batch: \n", num_train_batch) print () for b in range(num_train_batch): - if b % 200 == 0: - print ("b: \n", b) + # if b % 200 == 0: + # print ("b: \n", b) # Generate the patch data in this iteration x = train_x[idx[b * batch_size:(b + 1) * batch_size]] if model.dimension == 4: @@ -422,6 +435,7 @@ def run(global_rank, ty.copy_from_numpy(y) ### step 2: all weights turned to positive (done) ### step 3: new loss (done) + ### print ("before model forward ...") pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) ### step 4: calculate the multiplication of weights synflow_score = 0.0 @@ -430,11 +444,13 @@ def run(global_rank, if len(pn_p_g_item[1].shape) == 2: # param_value.data is "weight" print ("pn_p_g_item[1].shape: \n", pn_p_g_item[1].shape) synflow_score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1]) * tensor.to_numpy(pn_p_g_item[2]))) + print ("layer_hidden_list: \n", layer_hidden_list) print ("synflow_score: \n", synflow_score) elif epoch == (max_epoch - 1) and b == (num_train_batch - 2): # all weights turned to positive # Copy the patch data into input tensors tx.copy_from_numpy(x) ty.copy_from_numpy(y) + # print ("before model forward ...") pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) train_correct += accuracy(tensor.to_numpy(out), y) train_loss += tensor.to_numpy(loss)[0] @@ -449,6 +465,7 @@ def run(global_rank, # print ("normal before model(tx, ty, synflow_flag, dist_option, spars)") # print ("train_cnn tx: \n", tx) # print ("train_cnn ty: \n", ty) + # print ("before model forward ...") pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) # print ("normal after model(tx, ty, synflow_flag, dist_option, spars)") train_correct += accuracy(tensor.to_numpy(out), y) @@ -500,7 +517,7 @@ def run(global_rank, description='Training using the autograd and graph.') parser.add_argument( 'model', - choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'msmlp', 'alexnet'], + choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'msmlp', 'alexnet', 'ms_model_mlp'], default='cnn') parser.add_argument('data', choices=['mnist', 'cifar10', 'cifar100'], @@ -511,7 +528,7 @@ def run(global_rank, dest='precision') parser.add_argument('-m', '--max-epoch', - default=10, + default=3, type=int, help='maximum epochs', dest='max_epoch') From 593dc78ed8a7dd87f1a297e1c13efcdcf2acef94 Mon Sep 17 00:00:00 2001 From: zmeihui Date: Wed, 20 Sep 2023 15:02:02 +0800 Subject: [PATCH 31/45] Add the doap file for the project --- doap/doap_SINGA.rdf | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 doap/doap_SINGA.rdf diff --git a/doap/doap_SINGA.rdf b/doap/doap_SINGA.rdf new file mode 100644 index 000000000..9203d5009 --- /dev/null +++ b/doap/doap_SINGA.rdf @@ -0,0 +1,63 @@ + + + + + + 2023-09-06 + + Apache SINGA + + + A Distributed Deep Learning Library + Apache SINGA is an Apache top-level project for developing an open-source machine learning library. It provides a flexible architecture for scalable distributed training, is extensible to run over a wide range of hardware, and has a focus on healthcare applications. + + + C++ + + + + Apache SINGA 4.0.0 + 2023-04-07 + 4.0.0 + + + + + + + + + + + + + + + + + LUO ZHAOJING + + + + + + From 41a37727dd4bfb4d099f3d7d7ea5bcf2d36b9953 Mon Sep 17 00:00:00 2001 From: daoducanhc Date: Fri, 22 Sep 2023 13:11:15 +0800 Subject: [PATCH 32/45] Add the training script for CNN models --- .../model_selection_psql/ms_mlp/train_cnn.py | 329 ++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 examples/model_selection_psql/ms_mlp/train_cnn.py diff --git a/examples/model_selection_psql/ms_mlp/train_cnn.py b/examples/model_selection_psql/ms_mlp/train_cnn.py new file mode 100644 index 000000000..6eab096b9 --- /dev/null +++ b/examples/model_selection_psql/ms_mlp/train_cnn.py @@ -0,0 +1,329 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import singa_wrap as singa +from singa import device +from singa import tensor +from singa import opt +import numpy as np +import time +import argparse +from PIL import Image + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Calculate accuracy +def accuracy(pred, target): + # y is network output to be compared with ground truth (int) + y = np.argmax(pred, axis=1) + a = y == target + correct = np.array(a, "int").sum() + return correct + + +# Data partition according to the rank +def partition(global_rank, world_size, train_x, train_y, val_x, val_y): + # Partition training data + data_per_rank = train_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + train_x = train_x[idx_start:idx_end] + train_y = train_y[idx_start:idx_end] + + # Partition evaluation data + data_per_rank = val_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + val_x = val_x[idx_start:idx_end] + val_y = val_y[idx_start:idx_end] + return train_x, train_y, val_x, val_y + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +def resize_dataset(x, image_size): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, image_size, image_size), + dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (image_size, image_size), Image.BILINEAR), + dtype=np.float32) + return X + + +def run(global_rank, + world_size, + local_rank, + max_epoch, + batch_size, + model, + data, + sgd, + graph, + verbosity, + dist_option='plain', + spars=None, + precision='float32'): + dev = device.create_cuda_gpu_on(local_rank) # need to change to CPU device for CPU-only machines + dev.SetRandSeed(0) + np.random.seed(0) + + if data == 'cifar10': + from data import cifar10 + train_x, train_y, val_x, val_y = cifar10.load() + elif data == 'cifar100': + from data import cifar100 + train_x, train_y, val_x, val_y = cifar100.load() + elif data == 'mnist': + from data import mnist + train_x, train_y, val_x, val_y = mnist.load() + + + num_channels = train_x.shape[1] + image_size = train_x.shape[2] + data_size = np.prod(train_x.shape[1:train_x.ndim]).item() + num_classes = (np.max(train_y) + 1).item() + + if model == 'resnet': + from model import resnet + model = resnet.resnet50(num_channels=num_channels, + num_classes=num_classes) + elif model == 'xceptionnet': + from model import xceptionnet + model = xceptionnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'cnn': + from model import cnn + model = cnn.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'alexnet': + from model import alexnet + model = alexnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + # For distributed training, sequential has better performance + if hasattr(sgd, "communicator"): + DIST = True + sequential = True + else: + DIST = False + sequential = False + + if DIST: + train_x, train_y, val_x, val_y = partition(global_rank, world_size, + train_x, train_y, val_x, + val_y) + + if model.dimension == 4: + tx = tensor.Tensor( + (batch_size, num_channels, model.input_size, model.input_size), dev, + singa_dtype[precision]) + elif model.dimension == 2: + tx = tensor.Tensor((batch_size, data_size), dev, singa_dtype[precision]) + np.reshape(train_x, (train_x.shape[0], -1)) + np.reshape(val_x, (val_x.shape[0], -1)) + + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_val_batch = val_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + # Attach model to graph + model.set_optimizer(sgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + dev.SetVerbosity(verbosity) + + # Training and evaluation loop + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if global_rank == 0: + print('Starting Epoch %d:' % (epoch)) + + # Training phase + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + model.train() + for b in range(num_train_batch): + # if b % 100 == 0: + # print ("b: \n", b) + # Generate the patch data in this iteration + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + if model.dimension == 4: + x = augmentation(x, batch_size) + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + + # Copy the patch data into input tensors + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + + # Train the model + out, loss = model(tx, ty, dist_option, spars) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, sgd, reducer) + train_loss = reduce_variable(train_loss, sgd, reducer) + + if global_rank == 0: + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + # Evaluation phase + model.eval() + for b in range(num_val_batch): + x = val_x[b * batch_size:(b + 1) * batch_size] + if model.dimension == 4: + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = val_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model(tx) + test_correct += accuracy(tensor.to_numpy(out_test), y) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, sgd, reducer) + + # Output the evaluation accuracy + if global_rank == 0: + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_val_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + dev.PrintTimeProfiling() + + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument( + 'model', + choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'alexnet'], + default='cnn') + parser.add_argument('data', + choices=['mnist', 'cifar10', 'cifar100'], + default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=100, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + # Determine which gpu to use + parser.add_argument('-i', + '--device-id', + default=0, + type=int, + help='which GPU to use', + dest='device_id') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + sgd = opt.SGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + run(0, + 1, + args.device_id, + args.max_epoch, + args.batch_size, + args.model, + args.data, + sgd, + args.graph, + args.verbosity, + precision=args.precision) From a7f59a123850ae2fff7f9629dabfa1f3d1f00ede Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Sat, 23 Sep 2023 14:40:38 +0800 Subject: [PATCH 33/45] Add the training script for models using MPI --- .../model_selection_psql/ms_mlp/train_mpi.py | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 examples/model_selection_psql/ms_mlp/train_mpi.py diff --git a/examples/model_selection_psql/ms_mlp/train_mpi.py b/examples/model_selection_psql/ms_mlp/train_mpi.py new file mode 100644 index 000000000..563d4b2c5 --- /dev/null +++ b/examples/model_selection_psql/ms_mlp/train_mpi.py @@ -0,0 +1,91 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + + +from singa import singa_wrap as singa +from singa import opt +from singa import tensor +import argparse +import train_cnn + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument('model', + choices=['cnn', 'resnet', 'xceptionnet', 'mlp'], + default='cnn') + parser.add_argument('data', choices=['mnist', 'cifar10', 'cifar100'], default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=10, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + parser.add_argument('-d', + '--dist-option', + default='plain', + choices=['plain','half','partialUpdate','sparseTopK','sparseThreshold'], + help='distibuted training options', + dest='dist_option') # currently partialUpdate support graph=False only + parser.add_argument('-s', + '--sparsification', + default='0.05', + type=float, + help='the sparsity parameter used for sparsification, between 0 to 1', + dest='spars') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + sgd = opt.SGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + sgd = opt.DistOpt(sgd) + + train_cnn.run(sgd.global_rank, sgd.world_size, sgd.local_rank, args.max_epoch, + args.batch_size, args.model, args.data, sgd, args.graph, + args.verbosity, args.dist_option, args.spars, args.precision) From c7752fae974300af152be85620cd9b4776932dd0 Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Mon, 2 Oct 2023 18:50:23 +0800 Subject: [PATCH 34/45] Model class file for dynamic models --- .../pkg_model_code/model.py | 289 ++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 examples/model_selection_psql/pkg_model_code/model.py diff --git a/examples/model_selection_psql/pkg_model_code/model.py b/examples/model_selection_psql/pkg_model_code/model.py new file mode 100644 index 000000000..c94bb24d1 --- /dev/null +++ b/examples/model_selection_psql/pkg_model_code/model.py @@ -0,0 +1,289 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ============================================================================= +''' +This script includes Model class for python users +to use Computational Graph in their model. +''' + +import os +import gc +import time +import json +import zipfile +import numpy as np +from functools import wraps +from collections import Iterable + +from singa import tensor +from singa import autograd +from singa import layer +from .tensor import Tensor +from . import singa_wrap as singa + +class Model(layer.Layer, metaclass=ModelMeta): + """ Base class for your neural network models. + + Example usage:: + + import numpy as np + from singa import opt + from singa import tensor + from singa import device + from singa import autograd + from singa import layer + from singa import model + + class MyModel(model.Model): + def __init__(self): + super(MyModel, self).__init__() + + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.conv1 = layer.Conv2d(1, 20, 5, padding=0) + self.conv2 = layer.Conv2d(20, 50, 5, padding=0) + self.sgd = opt.SGD(lr=0.01) + + def forward(self, x): + y = self.conv1(x) + y = self.conv2(y) + return y + + def train_one_batch(self, x, y): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + self.sgd(loss) + return out, loss + + """ + + # save load states constant + TENSOR_DICT_FILENAME = '/tensor_dict.npz' + STATES_ATTR_FILENAME = '/states_attr.json' + MODEL_STATE_TYPE = 0 + AUX_STATE_TYPE = 1 + + def __init__(self): + """ + Initializes internal Model state + """ + super(Model, self).__init__() + + self.training = True + self.graph_mode = True + self.sequential = False + self._buffered = False + self._results = None + + def compile(self, inputs, is_train=True, use_graph=False, sequential=False): + """ Compile and initialize the model + + This function will automatically derive the shape of parameters + in each sublayer based on the shape of input placeholders. It will + also do some settings. + + Args: + inputs(list): the list of input tensors(placeholders) + is_train(bool): when is_trainis True, this model will enter + training mode, otherwise it will enter the evaluation mode + use_graph(bool): when use_graph is True, computational graph + will be used to train this model + sequential(bool): when sequential is True, model will execute ops + in the graph follow the order of joining the graph + """ + assert len(inputs) > 0 and isinstance(inputs[0], Tensor), ( + 'compile function expects PlaceHolders or Tensors') + + dev = inputs[0].device + dev.EnableGraph(True) + self.forward(*inputs) + dev.EnableGraph(False) + dev.ResetGraph() + + autograd.training = is_train + self.training = is_train + self.graph_mode = use_graph + self.sequential = sequential + + def forward(self, *input): + """Defines the computation performed in every forward propagation. + + Should be overridden by all subclasses. + + Args: + *input: the input training data for the model + + Returns: + out: the outputs of the forward propagation. + """ + raise NotImplementedError + + def train_one_batch(self, *input, **kwargs): + """Defines the computation performed in every training iteration + + Should be overridden by all subclasses. + + Args: + *input: the arguments of train_one_batch + **kwargs: the keyword arguments of train_one_batch + """ + raise NotImplementedError + + def train(self, mode=True): + """Set the model in evaluation mode. + + Args: + mode(bool): when mode is True, this model will enter training mode + """ + self.training = mode + autograd.training = mode + + def eval(self): + """Sets the model in evaluation mode. + """ + self.train(mode=False) + + def graph(self, mode=True, sequential=False): + """ Turn on the computational graph. Specify execution mode. + + Args: + mode(bool): when mode is True, model will use computational graph + sequential(bool): when sequential is True, model will execute ops + in the graph follow the order of joining the graph + """ + self.graph_mode = mode + self.sequential = sequential + + def __get_name__(self): + return self.__class__.__name__ + + def __call__(self, *input, **kwargs): + if self.training: + return self.train_one_batch(*input, **kwargs) + else: + return self.forward(*input, **kwargs) + + def save_states(self, fpath, aux_states={}): + """Save states. + + Args: + fpath: output file path (without the extension) + aux_states(dict): values are standard data types or Tensor, + e.g., epoch ID, learning rate, optimizer states + """ + assert not os.path.isfile(fpath), ( + "Failed to save states, %s is already existed." % fpath) + + states = self.get_states() + + # save states data and attr + tensor_dict = {} + states_attr = {} + for k, v in states.items(): + assert isinstance(v, tensor.Tensor), "Only tensor state is allowed" + tensor_dict[k] = tensor.to_numpy(v) + states_attr[k] = { + 'state_type': self.MODEL_STATE_TYPE, + 'shape': v.shape, + 'dtype': v.dtype + } + + for k, v in aux_states.items(): + assert isinstance(v, + tensor.Tensor), "Only tensor aux state is allowed" + tensor_dict[k] = tensor.to_numpy(v) + states_attr[k] = { + 'state_type': self.AUX_STATE_TYPE, + 'shape': v.shape, + 'dtype': v.dtype + } + + # save to files + timestamp = time.time() + tmp_dir = '/tmp/singa_save_states_%s' % timestamp + os.mkdir(tmp_dir) + tensor_dict_fp = tmp_dir + self.TENSOR_DICT_FILENAME + states_attr_fp = tmp_dir + self.STATES_ATTR_FILENAME + + np.savez(tensor_dict_fp, **tensor_dict) + + with open(states_attr_fp, 'w') as fp: + json.dump(states_attr, fp) + + compression = zipfile.ZIP_DEFLATED + with zipfile.ZipFile(fpath, mode="w") as zf: + zf.write(tensor_dict_fp, + os.path.basename(tensor_dict_fp), + compress_type=compression) + zf.write(states_attr_fp, + os.path.basename(states_attr_fp), + compress_type=compression) + + # clean up tmp files + os.remove(tensor_dict_fp) + os.remove(states_attr_fp) + os.rmdir(tmp_dir) + + def load_states(self, fpath): + """Load the model states and auxiliary states from disk. + + Usage: + m = MyModel() + m.compile(...) + aux_states = m.load_states('mymodel.zip') + + Args: + path: input file path (without the extension) + Returns: + dict + """ + + assert os.path.isfile(fpath), ( + "Failed to load states, %s is not exist." % fpath) + + timestamp = time.time() + tmp_dir = '/tmp/singa_load_states_%s' % timestamp + os.mkdir(tmp_dir) + + with zipfile.ZipFile(fpath, 'r') as zf: + zf.extractall(tmp_dir) + + tensor_dict_fp = tmp_dir + self.TENSOR_DICT_FILENAME + states_attr_fp = tmp_dir + self.STATES_ATTR_FILENAME + + with open(states_attr_fp) as f: + states_attr = json.load(f) + + tensor_dict = np.load(tensor_dict_fp) + + # restore singa tensor from numpy + model_states = dict() + aux_states = dict() + + for k in tensor_dict.files: + if states_attr[k]['state_type'] == self.MODEL_STATE_TYPE: + model_states[k] = tensor.from_numpy(tensor_dict[k]) + elif states_attr[k]['state_type'] == self.AUX_STATE_TYPE: + aux_states[k] = tensor.from_numpy(tensor_dict[k]) + + # restore model_states + self.set_states(model_states) + + # clean up tmp files + os.remove(tensor_dict_fp) + os.remove(states_attr_fp) + os.rmdir(tmp_dir) + return aux_states From 5b8d9281282088f194aaabc89e8082a5b8ba6ca6 Mon Sep 17 00:00:00 2001 From: zhaojing Date: Tue, 3 Oct 2023 17:13:40 +0800 Subject: [PATCH 35/45] Add the ModelMeta for dynamic models --- .../pkg_model_code/model.py | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/examples/model_selection_psql/pkg_model_code/model.py b/examples/model_selection_psql/pkg_model_code/model.py index c94bb24d1..1094f9347 100644 --- a/examples/model_selection_psql/pkg_model_code/model.py +++ b/examples/model_selection_psql/pkg_model_code/model.py @@ -35,6 +35,73 @@ from .tensor import Tensor from . import singa_wrap as singa +class ModelMeta(layer.LayerMeta): + + def buffer_operation(func): + + def remove_creator(tensors): + if not tensors: + return + + if isinstance(tensors, Iterable): + if isinstance(tensors, str): + return + else: + for item in tensors: + if isinstance(item, Iterable): + remove_creator(item) + elif isinstance(item, tensor.Tensor): + item.creator = None + elif isinstance(tensors, tensor.Tensor): + tensors.creator = None + + @wraps(func) + def wrapper(self, *args, **kwargs): + if self.graph_mode and self.training: + if len(args) == 0: + raise ValueError('expect at least one input tensor') + + if isinstance(args[0], list): + assert isinstance( + args[0][0], + Tensor), ('function expects PlaceHolders or Tensors') + dev = args[0][0].device + else: + assert isinstance( + args[0], + Tensor), ('function expects PlaceHolders or Tensors') + dev = args[0].device + + if not self._buffered: + # buffer operations + dev.EnableGraph(True) + self._results = func(self, *args, **kwargs) + dev.Sync() + dev.EnableGraph(False) + self._buffered = True + + # deconstruct Operations before running the entire graph + remove_creator(self._results) + + # make sure all Operations are deallocated + gc.collect() + + # run graph + dev.RunGraph(self.sequential) + return self._results + else: + return func(self, *args, **kwargs) + + return wrapper + + def __new__(cls, name, bases, attr): + if 'train_one_batch' in attr: + attr['train_one_batch'] = ModelMeta.buffer_operation( + attr['train_one_batch']) + + return super(ModelMeta, cls).__new__(cls, name, bases, attr) + + class Model(layer.Layer, metaclass=ModelMeta): """ Base class for your neural network models. From 26deb2c7d750693e6be8eb50b456e4362712786b Mon Sep 17 00:00:00 2001 From: daoducanhc Date: Thu, 5 Oct 2023 11:51:38 +0800 Subject: [PATCH 36/45] Update the ModelMeta class --- .../pkg_model_code/model.py | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/examples/model_selection_psql/pkg_model_code/model.py b/examples/model_selection_psql/pkg_model_code/model.py index 1094f9347..5e84e47ca 100644 --- a/examples/model_selection_psql/pkg_model_code/model.py +++ b/examples/model_selection_psql/pkg_model_code/model.py @@ -27,7 +27,11 @@ import zipfile import numpy as np from functools import wraps -from collections import Iterable +# from collections import Iterable +try: + from collections.abc import Iterable +except ImportError: + from collections import Iterable from singa import tensor from singa import autograd @@ -43,15 +47,21 @@ def remove_creator(tensors): if not tensors: return + # if isinstance(tensors, Iterable): + # if isinstance(tensors, str): + # return + # else: + # for item in tensors: + # if isinstance(item, Iterable): + # remove_creator(item) + # elif isinstance(item, tensor.Tensor): + # item.creator = None if isinstance(tensors, Iterable): - if isinstance(tensors, str): - return - else: - for item in tensors: - if isinstance(item, Iterable): - remove_creator(item) - elif isinstance(item, tensor.Tensor): - item.creator = None + for item in tensors: + if isinstance(item, Iterable): + remove_creator(item) + elif isinstance(item, tensor.Tensor): + item.creator = None elif isinstance(tensors, tensor.Tensor): tensors.creator = None From 8f3a7ab6c6cb9c4e2f037ab8a287142fd654e9b7 Mon Sep 17 00:00:00 2001 From: zmeihui Date: Fri, 6 Oct 2023 14:25:54 +0800 Subject: [PATCH 37/45] Add the running script for model selection --- examples/model_selection_psql/ms_mlp/run.sh | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 examples/model_selection_psql/ms_mlp/run.sh diff --git a/examples/model_selection_psql/ms_mlp/run.sh b/examples/model_selection_psql/ms_mlp/run.sh new file mode 100644 index 000000000..5e78f5f2d --- /dev/null +++ b/examples/model_selection_psql/ms_mlp/run.sh @@ -0,0 +1,26 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +#!/usr/bin/env python -W ignore::DeprecationWarning + +### Static Models +python train_mlp.py ms_model_mlp mnist + +### Dynamic Models +python train_ms_model.py ms_model_mlp mnist From 1e4e272ab78c0f292c39d82d9a8783660de6888f Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Sat, 7 Oct 2023 16:11:16 +0800 Subject: [PATCH 38/45] Add the training script for model selection --- .../ms_mlp/train_ms_model.py | 354 ++++++++++++++++++ 1 file changed, 354 insertions(+) create mode 100644 examples/model_selection_psql/ms_mlp/train_ms_model.py diff --git a/examples/model_selection_psql/ms_mlp/train_ms_model.py b/examples/model_selection_psql/ms_mlp/train_ms_model.py new file mode 100644 index 000000000..0ff6bcf44 --- /dev/null +++ b/examples/model_selection_psql/ms_mlp/train_ms_model.py @@ -0,0 +1,354 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import singa_wrap as singa +from singa import device +from singa import tensor +from singa import opt +from singa import autograd +from singa.opt import Optimizer +from singa.opt import DecayScheduler +from singa.opt import Constant +import numpy as np +import time +import argparse +from PIL import Image + +np_dtype = {"float16": np.float16, "float32": np.float32} + +# singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} +singa_dtype = {"float32": tensor.float32} + +def run(global_rank, + world_size, + local_rank, + layer_hidden_list, + max_epoch, + batch_size, + model, + data, + mssgd, + graph, + verbosity, + dist_option='plain', + spars=None, + precision='float32'): + # dev = device.create_cuda_gpu_on(local_rank) # need to change to CPU device for CPU-only machines + dev = device.get_default_device() + dev.SetRandSeed(0) + np.random.seed(0) + + if data == 'cifar10': + from data import cifar10 + train_x, train_y, val_x, val_y = cifar10.load() + elif data == 'cifar100': + from data import cifar100 + train_x, train_y, val_x, val_y = cifar100.load() + elif data == 'mnist': + from data import mnist + train_x, train_y, val_x, val_y = mnist.load() + + + num_channels = train_x.shape[1] + image_size = train_x.shape[2] + data_size = np.prod(train_x.shape[1:train_x.ndim]).item() + num_classes = (np.max(train_y) + 1).item() + + if model == 'resnet': + from model import resnet + model = resnet.resnet50(num_channels=num_channels, + num_classes=num_classes) + elif model == 'xceptionnet': + from model import xceptionnet + model = xceptionnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'cnn': + from model import cnn + model = cnn.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'alexnet': + from model import alexnet + model = alexnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + elif model == 'msmlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from msmlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + elif model == 'ms_model_mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from ms_model_mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes, + layer_hidden_list=layer_hidden_list) + # print ("model: \n", model) + + # For distributed training, sequential has better performance + if hasattr(mssgd, "communicator"): + DIST = True + sequential = True + else: + DIST = False + sequential = False + + if DIST: + train_x, train_y, val_x, val_y = partition(global_rank, world_size, + train_x, train_y, val_x, + val_y) + + if model.dimension == 4: + tx = tensor.Tensor( + (batch_size, num_channels, model.input_size, model.input_size), dev, + singa_dtype[precision]) + elif model.dimension == 2: + tx = tensor.Tensor((batch_size, data_size), dev, singa_dtype[precision]) + np.reshape(train_x, (train_x.shape[0], -1)) + np.reshape(val_x, (val_x.shape[0], -1)) + + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_val_batch = val_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + # Attach model to graph + model.set_optimizer(mssgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + dev.SetVerbosity(verbosity) + + # Training and evaluation loop + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if global_rank == 0: + print('Starting Epoch %d:' % (epoch)) + + # Training phase + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + model.train() + print ("num_train_batch: \n", num_train_batch) + print () + for b in range(num_train_batch): + if b % 100 == 0: + print ("b: \n", b) + # Generate the patch data in this iteration + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + if model.dimension == 4: + x = augmentation(x, batch_size) + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + + + synflow_flag = False + # Train the model + if epoch == (max_epoch - 1) and b == (num_train_batch - 1): ### synflow calcuation for the last batch + # print ("last epoch calculate synflow") + synflow_flag = True + ### step 1: all one input + # Copy the patch data into input tensors + tx.copy_from_numpy(np.ones(x.shape, dtype=np.float32)) + ty.copy_from_numpy(y) + ### step 2: all weights turned to positive (done) + ### step 3: new loss (done) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + ### step 4: calculate the multiplication of weights + synflow_score = 0.0 + for pn_p_g_item in pn_p_g_list: + # print ("calculate weight param * grad parameter name: \n", pn_p_g_item[0]) + if len(pn_p_g_item[1].shape) == 2: # param_value.data is "weight" + # print ("pn_p_g_item[1].shape: \n", pn_p_g_item[1].shape) + synflow_score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1]) * tensor.to_numpy(pn_p_g_item[2]))) + # print ("layer_hidden_list: \n", layer_hidden_list) + # print ("synflow_score: \n", synflow_score) + elif epoch == (max_epoch - 1) and b == (num_train_batch - 2): # all weights turned to positive + # Copy the patch data into input tensors + # print ("all weights turned to positive\n") + # print ("x: \n", x) + # print ("y: \n", y) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("after model forward ...") + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + # all params turned to positive + for pn_p_g_item in pn_p_g_list: + # print ("absolute value parameter name: \n", pn_p_g_item[0]) + pn_p_g_item[1] = tensor.abs(pn_p_g_item[1]) # tensor actually ... + else: # normal train steps + # Copy the patch data into input tensors + # print ("normal train steps\n") + # print ("x.astype(np.float32): \n", x.astype(np.float32)) + # print ("y: \n", y) + tx.copy_from_numpy(x.astype(np.float32)) + # print ("tx: \n", tx) + ty.copy_from_numpy(y) + # print ("ty: \n", ty) + # print ("normal before model(tx, ty, synflow_flag, dist_option, spars)") + # print ("train_cnn tx: \n", tx) + # print ("train_cnn ty: \n", ty) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("normal after model(tx, ty, synflow_flag, dist_option, spars)") + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, mssgd, reducer) + train_loss = reduce_variable(train_loss, mssgd, reducer) + + if global_rank == 0: + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + # Evaluation phase + model.eval() + for b in range(num_val_batch): + x = val_x[b * batch_size:(b + 1) * batch_size] + if model.dimension == 4: + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = val_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model(tx) + test_correct += accuracy(tensor.to_numpy(out_test), y) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, mssgd, reducer) + + # Output the evaluation accuracy + if global_rank == 0: + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_val_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + dev.PrintTimeProfiling() + + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument( + 'model', + choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'msmlp', 'alexnet', 'ms_model_mlp'], + default='cnn') + parser.add_argument('data', + choices=['mnist', 'cifar10', 'cifar100'], + default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=2, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + # Determine which gpu to use + parser.add_argument('-i', + '--device-id', + default=0, + type=int, + help='which GPU to use', + dest='device_id') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + # mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + + DEFAULT_LAYER_CHOICES_4 = [8, 16, 24, 32] + for layer1 in DEFAULT_LAYER_CHOICES_4: + for layer2 in DEFAULT_LAYER_CHOICES_4: + for layer3 in DEFAULT_LAYER_CHOICES_4: + for layer4 in DEFAULT_LAYER_CHOICES_4: + layer_hidden_list = [layer1, layer2+1, layer3+2, layer4+3] + mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + run(0, + 1, + args.device_id, + layer_hidden_list, + args.max_epoch, + args.batch_size, + args.model, + args.data, + mssgd, + args.graph, + args.verbosity, + precision=args.precision) + From 3b9658f0caaee9c61b89875c39327912b2f80155 Mon Sep 17 00:00:00 2001 From: zhaojing Date: Sun, 8 Oct 2023 16:25:48 +0800 Subject: [PATCH 39/45] Add data processing functions for model selection --- .../ms_mlp/train_ms_model.py | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/examples/model_selection_psql/ms_mlp/train_ms_model.py b/examples/model_selection_psql/ms_mlp/train_ms_model.py index 0ff6bcf44..b87af52bf 100644 --- a/examples/model_selection_psql/ms_mlp/train_ms_model.py +++ b/examples/model_selection_psql/ms_mlp/train_ms_model.py @@ -35,6 +35,69 @@ # singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} singa_dtype = {"float32": tensor.float32} + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Calculate accuracy +def accuracy(pred, target): + # y is network output to be compared with ground truth (int) + y = np.argmax(pred, axis=1) + a = y == target + correct = np.array(a, "int").sum() + return correct + + +# Data partition according to the rank +def partition(global_rank, world_size, train_x, train_y, val_x, val_y): + # Partition training data + data_per_rank = train_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + train_x = train_x[idx_start:idx_end] + train_y = train_y[idx_start:idx_end] + + # Partition evaluation data + data_per_rank = val_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + val_x = val_x[idx_start:idx_end] + val_y = val_y[idx_start:idx_end] + return train_x, train_y, val_x, val_y + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +def resize_dataset(x, image_size): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, image_size, image_size), + dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (image_size, image_size), Image.BILINEAR), + dtype=np.float32) + return X + def run(global_rank, world_size, local_rank, From 3ce7c3336ef4c9db70a2b5e47f13c6094bf7c5a4 Mon Sep 17 00:00:00 2001 From: zmeihui Date: Mon, 9 Oct 2023 19:07:51 +0800 Subject: [PATCH 40/45] Add the optimizer for model selection --- .../ms_mlp/train_ms_model.py | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/examples/model_selection_psql/ms_mlp/train_ms_model.py b/examples/model_selection_psql/ms_mlp/train_ms_model.py index b87af52bf..0283b91ed 100644 --- a/examples/model_selection_psql/ms_mlp/train_ms_model.py +++ b/examples/model_selection_psql/ms_mlp/train_ms_model.py @@ -32,8 +32,34 @@ np_dtype = {"float16": np.float16, "float32": np.float32} -# singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} singa_dtype = {"float32": tensor.float32} +# singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +### MSOptimizer +class MSOptimizer(Optimizer): + def __call__(self, loss): + pn_p_g_list = self.call_with_returns(loss) + # print ("optimizer1 before self.step()") + # print ("optimizer1 before print len(pn_p_g_list): \n", len(pn_p_g_list)) + self.step() + # print ("optimizer1 after print len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("optimizer1 after self.step()") + return pn_p_g_list + + def call_with_returns(self, loss): + # print ("call_with_returns before apply loss.data: \n", loss.data) + pn_p_g_list = [] + for p, g in autograd.backward(loss): + if p.name is None: + p.name = id(p) + self.apply(p.name, p, g) + # print ("call with returns") + # print ("p.name: \n", p.name) + # print ("p.data: \n", p.data) + # print ("g.data: \n", g.data) + pn_p_g_list.append([p.name, p, g]) # need iterables + # print ("call_with_returns after apply loss.data: \n", loss.data) + return pn_p_g_list # Data augmentation From 063effddf18d914c3607a90320acc2ba44b1e5b0 Mon Sep 17 00:00:00 2001 From: daoducanhc Date: Wed, 11 Oct 2023 11:49:11 +0800 Subject: [PATCH 41/45] Add the implementation of MSSGD for model selection --- .../ms_mlp/train_ms_model.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/examples/model_selection_psql/ms_mlp/train_ms_model.py b/examples/model_selection_psql/ms_mlp/train_ms_model.py index 0283b91ed..0bce6b8fd 100644 --- a/examples/model_selection_psql/ms_mlp/train_ms_model.py +++ b/examples/model_selection_psql/ms_mlp/train_ms_model.py @@ -61,6 +61,104 @@ def call_with_returns(self, loss): # print ("call_with_returns after apply loss.data: \n", loss.data) return pn_p_g_list +# MSSGD -- sub class of MSOptimizer +class MSSGD(MSOptimizer): + """Implements stochastic gradient descent (optionally with momentum). + + Nesterov momentum is based on the formula from `On the importance of initialization and momentum in deep learning`__. + + Args: + lr(float): learning rate + momentum(float, optional): momentum factor(default: 0) + weight_decay(float, optional): weight decay(L2 penalty)(default: 0) + dampening(float, optional): dampening for momentum(default: 0) + nesterov(bool, optional): enables Nesterov momentum(default: False) + + Typical usage example: + >> > from singa import opt + >> > optimizer = opt.SGD(lr=0.1, momentum=0.9) + >> > optimizer.update() + + __ http: // www.cs.toronto.edu / %7Ehinton / absps / momentum.pdf + + .. note:: + The implementation of SGD with Momentum / Nesterov subtly differs from + Sutskever et. al. and implementations in some other frameworks. + + Considering the specific case of Momentum, the update can be written as + + .. math:: + v = \rho * v + g \\ + p = p - lr * v + + where p, g, v and: math: `\rho` denote the parameters, gradient, + velocity, and momentum respectively. + + This is in contrast to Sutskever et. al. and + other frameworks which employ an update of the form + + .. math:: + v = \rho * v + lr * g \\ + p = p - v + + The Nesterov version is analogously modified. + """ + + def __init__(self, + lr=0.1, + momentum=0, + dampening=0, + weight_decay=0, + nesterov=False, + dtype=tensor.float32): + super(MSSGD, self).__init__(lr) + + # init momentum + if type(momentum) == float or type(momentum) == int: + if momentum < 0.0: + raise ValueError("Invalid momentum value: {}".format(momentum)) + self.momentum = Constant(momentum) + elif isinstance(momentum, DecayScheduler): + self.momentum = momentum + momentum = momentum.init_value + else: + raise TypeError("Wrong momentum type") + # self.dtype = dtype + # self.mom_value = self.momentum(self.step_counter).as_type(self.dtype) + self.mom_value = self.momentum(self.step_counter) + + # init dampening + if type(dampening) == float or type(dampening) == int: + self.dampening = Constant(dampening) + elif isinstance(dampening, DecayScheduler): + self.dampening = dampening + dampening = dampening.init_value + else: + raise TypeError("Wrong dampening type") + # self.dam_value = self.dampening(self.step_counter).as_type(self.dtype) + self.dam_value = self.dampening(self.step_counter) + + # init weight_decay + if type(weight_decay) == float or type(weight_decay) == int: + if weight_decay < 0.0: + raise ValueError( + "Invalid weight_decay value: {}".format(weight_decay)) + self.weight_decay = Constant(weight_decay) + elif isinstance(weight_decay, DecayScheduler): + self.weight_decay = weight_decay + else: + raise TypeError("Wrong weight_decay type") + # self.decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + self.decay_value = self.weight_decay(self.step_counter) + + # init other params + self.nesterov = nesterov + self.moments = dict() + + # check value + if nesterov and (momentum <= 0 or dampening != 0): + raise ValueError( + "Nesterov momentum requires a momentum and zero dampening") # Data augmentation def augmentation(x, batch_size): From 619d1195cd630c201635c8ec907d9bf0d94c5625 Mon Sep 17 00:00:00 2001 From: working <57171759+NLGithubWP@users.noreply.github.com> Date: Thu, 12 Oct 2023 15:40:50 +0800 Subject: [PATCH 42/45] Add the implementation of a single optimization step for model selection --- .../ms_mlp/train_ms_model.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/examples/model_selection_psql/ms_mlp/train_ms_model.py b/examples/model_selection_psql/ms_mlp/train_ms_model.py index 0bce6b8fd..3da53b257 100644 --- a/examples/model_selection_psql/ms_mlp/train_ms_model.py +++ b/examples/model_selection_psql/ms_mlp/train_ms_model.py @@ -159,6 +159,49 @@ def __init__(self, if nesterov and (momentum <= 0 or dampening != 0): raise ValueError( "Nesterov momentum requires a momentum and zero dampening") + + def apply(self, param_name, param_value, param_grad): + """Performs a single optimization step. + + Args: + param_name(String): the name of the param + param_value(Tensor): param values to be update in-place + grad(Tensor): param gradients; the values may be updated + in this function; cannot use it anymore + """ + assert param_value.shape == param_grad.shape, ("shape mismatch", + param_value.shape, + param_grad.shape) + self.device_check(param_value, self.step_counter, self.lr_value, + self.mom_value, self.dam_value, self.decay_value) + + # derive dtype from input + # assert param_value.dtype == self.dtype + + # TODO add branch operator + # if self.decay_value != 0: + if self.weight_decay.init_value != 0: + singa.Axpy(self.decay_value.data, param_value.data, param_grad.data) + + if self.momentum.init_value != 0: + if param_name not in self.moments: + flag = param_value.device.graph_enabled() + param_value.device.EnableGraph(False) + self.moments[param_name] = tensor.zeros_like(param_value) + param_value.device.EnableGraph(flag) + + buf = self.moments[param_name] + buf *= self.mom_value + alpha = 1.0 - self.dam_value + singa.Axpy(alpha.data, param_grad.data, buf.data) + + if self.nesterov: + singa.Axpy(self.mom_value.data, buf.data, param_grad.data) + else: + param_grad = buf + + minus_lr = 0.0 - self.lr_value + singa.Axpy(minus_lr.data, param_grad.data, param_value.data) # Data augmentation def augmentation(x, batch_size): From 850bcf1e6bffb794e9d1f74daafa5b850c907012 Mon Sep 17 00:00:00 2001 From: zhaojing Date: Tue, 24 Oct 2023 17:44:32 +0800 Subject: [PATCH 43/45] Add the implementation for the model selection example --- CMakeLists.txt | 6 +- LICENSE | 56 ++ .../Dockerfile | 58 ++ .../README.md | 148 ++++ .../documents/dev_guide.md | 236 ++++++ .../documents/image-20231020174425377.png | Bin 0 -> 302750 bytes .../documents/image-20231020174945226.png | Bin 0 -> 26176 bytes .../internal/cache-service/cache_service.py | 167 +++++ .../cache-service/trigger_cache_svc.py | 19 + .../internal/ml/model_selection/README.md | 271 +++++++ .../internal/ml/model_selection/config.ini | 86 +++ .../ml/model_selection/eva_service.py | 78 ++ .../model_selection/exp_result_singa/.gitkeep | 0 .../ml/model_selection/exps/README.md | 21 + .../ml/model_selection/exps/draw_img_lib.py | 706 ++++++++++++++++++ .../ml/model_selection/exps/draw_tab_lib.py | 197 +++++ .../nas_bench_tabular/0.train_one_model.py | 78 ++ .../2.seq_train_dist_online.py | 145 ++++ .../nas_bench_tabular/2.seq_train_online.py | 100 +++ .../nas_bench_tabular/4.seq_score_online.py | 116 +++ .../exps/nas_bench_tabular/measure_ecdf.py | 119 +++ .../nas_bench_tabular/measure_param_auc.py | 126 ++++ .../internal/ml/model_selection/init_env | 12 + .../internal/ml/model_selection/main.py | 60 ++ .../ml/model_selection/pg_interface.py | 617 +++++++++++++++ .../ml/model_selection/requirement.txt | 54 ++ .../scripts/anytime_img_w_baseline.sh | 42 ++ .../ml/model_selection/scripts/anytime_tab.sh | 126 ++++ .../scripts/baseline_system_img.sh | 45 ++ .../scripts/baseline_system_tab.sh | 67 ++ .../scripts/benchmark_weight_sharing.sh | 25 + .../scripts/database/load_data_to_db.sh | 67 ++ .../scripts/latency_embedding_cache.sh | 122 +++ .../latency_embedding_cache_concurrent.sh | 139 ++++ .../scripts/latency_phase1_cpu_gpu.sh | 211 ++++++ .../scripts/latency_phase1_in_db.sh | 61 ++ .../model_selection/scripts/latency_phase2.sh | 61 ++ .../scripts/micro_budget_aware_alg.sh | 44 ++ .../scripts/micro_nku_tradeoff.sh | 163 ++++ .../scripts/micro_score_metrics_relation.sh | 38 + .../scripts/micro_search_strategy.sh | 54 ++ .../nas-bench-img/convert_api_2_json.sh | 12 + .../nas-bench-img/explore_all_models.sh | 60 ++ .../scripts/nas-bench-img/score_all_models.sh | 60 ++ .../score_all_modesl_criteo.sh | 27 + .../score_all_modesl_frappe.sh | 27 + .../nas-bench-tabular/score_all_modesl_uci.sh | 28 + .../train_all_models_criteo.sh | 46 ++ .../train_all_models_criteo_distirbuted.sh | 48 ++ .../train_all_models_diabetes.sh | 47 ++ .../train_all_models_frappe.sh | 45 ++ .../nas-bench-tabular/train_one_model_dev.sh | 25 + .../train_params_tune_criteo.sh | 144 ++++ .../train_params_tune_diabetes.sh | 70 ++ .../pre_processing/pre_processing_data.sh | 47 ++ .../ml/model_selection/shared_config.py | 94 +++ .../ml/model_selection/src/__init__.py | 4 + .../ml/model_selection/src/common/constant.py | 64 ++ .../model_selection/src/common/structure.py | 89 +++ .../src/controller/__init__.py | 17 + .../src/controller/controler.py | 173 +++++ .../src/controller/core/__init__.py | 0 .../src/controller/core/metrics.py | 28 + .../src/controller/core/sample.py | 28 + .../src/controller/sampler_EA/__init__.py | 4 + .../src/controller/sampler_RL/__init__.py | 4 + .../src/controller/sampler_all/__init__.py | 4 + .../src/controller/sampler_all/seq_sampler.py | 32 + .../src/controller/sampler_bohb/bohb_or.py | 285 +++++++ .../controller/sampler_ea/regularized_ea.py | 130 ++++ .../src/controller/sampler_rand/__init__.py | 4 + .../controller/sampler_rand/random_sample.py | 22 + .../sampler_rl/reinforcement_learning.py | 48 ++ .../src/dataset_utils/__init__.py | 2 + .../download_critero_and_avazu.py | 42 ++ .../src/dataset_utils/sequence_dataloader.py | 78 ++ .../src/dataset_utils/stream_dataloader.py | 78 ++ .../src/eva_engine/__init__.py | 10 + .../src/eva_engine/coordinator.py | 98 +++ .../src/eva_engine/phase1/__init__.py | 4 + .../src/eva_engine/phase1/algo/__init__.py | 4 + .../eva_engine/phase1/algo/prune_synflow.py | 407 ++++++++++ .../eva_engine/phase1/algo/singa_ms/README.md | 2 + .../phase1/algo/singa_ms/cnn_ms/README.md | 46 ++ .../cnn_ms/autograd/cifar10_multiprocess.py | 43 ++ .../singa_ms/cnn_ms/autograd/mnist_cnn.py | 304 ++++++++ .../singa_ms/cnn_ms/autograd/mnist_dist.py | 25 + .../cnn_ms/autograd/mnist_multiprocess.py | 39 + .../cnn_ms/autograd/resnet_cifar10.py | 292 ++++++++ .../singa_ms/cnn_ms/autograd/resnet_dist.py | 87 +++ .../cnn_ms/autograd/sparsification_mnist.py | 45 ++ .../singa_ms/cnn_ms/autograd/xceptionnet.py | 303 ++++++++ .../phase1/algo/singa_ms/cnn_ms/benchmark.py | 121 +++ .../algo/singa_ms/cnn_ms/data/cifar10.py | 89 +++ .../algo/singa_ms/cnn_ms/data/cifar100.py | 81 ++ .../singa_ms/cnn_ms/data/download_cifar10.py | 49 ++ .../singa_ms/cnn_ms/data/download_cifar100.py | 26 + .../singa_ms/cnn_ms/data/download_mnist.py | 49 ++ .../phase1/algo/singa_ms/cnn_ms/data/mnist.py | 91 +++ .../algo/singa_ms/cnn_ms/model/alexnet.py | 119 +++ .../phase1/algo/singa_ms/cnn_ms/model/cnn.py | 90 +++ .../algo/singa_ms/cnn_ms/model/resnet.py | 300 ++++++++ .../algo/singa_ms/cnn_ms/model/xceptionnet.py | 311 ++++++++ .../singa_ms/cnn_ms/pkg_model_code/model.py | 357 +++++++++ .../phase1/algo/singa_ms/cnn_ms/run.sh | 38 + .../phase1/algo/singa_ms/cnn_ms/train_cnn.py | 564 ++++++++++++++ .../phase1/algo/singa_ms/cnn_ms/train_mpi.py | 91 +++ .../algo/singa_ms/cnn_ms/train_ms_model.py | 592 +++++++++++++++ .../singa_ms/cnn_ms/train_multiprocess.py | 111 +++ .../algo/singa_ms/ms_model_mlp/model.py | 226 ++++++ .../algo/singa_ms/ms_model_mlp/native.py | 137 ++++ .../phase1/algo/singa_ms/msmlp/model.py | 217 ++++++ .../phase1/algo/singa_ms/msmlp/native.py | 137 ++++ .../src/eva_engine/phase1/vote.py | 115 +++ .../src/eva_engine/phase2/__init__.py | 4 + .../src/eva_engine/phase2/algo/__init__.py | 4 + .../src/eva_engine/phase2/algo/trainer.py | 535 +++++++++++++ .../src/eva_engine/phase2/run_sr.py | 126 ++++ .../src/eva_engine/phase2/run_uniform.py | 78 ++ .../ml/model_selection/src/logger/__init__.py | 23 + .../model_selection/src/query_api/README.md | 2 + .../model_selection/src/query_api/__init__.py | 4 + .../src/query_api/img_explore_ea.py | 78 ++ .../src/query_api/img_train_baseline.py | 113 +++ .../src/query_api/interface.py | 123 +++ .../src/query_api/query_api_img.py | 277 +++++++ .../src/query_api/query_api_mlp.py | 145 ++++ .../src/query_api/singleton.py | 13 + .../src/search_space/__init__.py | 0 .../src/search_space/core/__init__.py | 4 + .../src/search_space/core/model_params.py | 23 + .../src/search_space/init_search_space.py | 37 + .../src/search_space/mlp_api/__init__.py | 4 + .../src/search_space/mlp_api/model_params.py | 16 + .../src/search_space/mlp_api/rl_policy.py | 18 + .../src/search_space/mlp_api/space.py | 625 ++++++++++++++++ .../src/search_space/utils/__init__.py | 4 + .../search_space/utils/weight_initializers.py | 78 ++ .../model_selection/src/third_pkg/__init__.py | 4 + .../src/third_pkg/darts_lib/__init__.py | 4 + .../src/third_pkg/darts_lib/genotypes.py | 18 + .../src/third_pkg/darts_lib/model.py | 291 ++++++++ .../src/third_pkg/darts_lib/util_convert.py | 109 +++ .../third_pkg/models/cell_infers/__init__.py | 5 + .../third_pkg/models/cell_searchs/__init__.py | 33 + .../models/cell_searchs/genotypes.py | 280 +++++++ .../third_pkg/models/shape_infers/__init__.py | 9 + .../models/shape_infers/shared_utils.py | 5 + .../models/shape_searchs/__init__.py | 9 + .../src/third_pkg/sp101_lib/__init__.py | 4 + .../src/third_pkg/sp101_lib/graph_util.py | 168 +++++ .../src/third_pkg/sp101_lib/model_spec.py | 325 ++++++++ .../src/third_pkg/sp101_lib/nb101_api.py | 465 ++++++++++++ .../src/third_pkg/sp201_lib/__init__.py | 42 ++ .../src/third_pkg/sp201_lib/nasbench2.py | 117 +++ .../src/third_pkg/sp201_lib/nasbench2_ops.py | 160 ++++ .../ml/model_selection/src/tools/__init__.py | 2 + .../ml/model_selection/src/tools/compute.py | 121 +++ .../model_selection/src/tools/correlation.py | 115 +++ .../ml/model_selection/src/tools/io_tools.py | 42 ++ .../model_selection/src/tools/res_measure.py | 84 +++ .../ml/model_selection/src/tools/utils.py | 454 +++++++++++ .../internal/ml/model_slicing/.gitkeep | 0 .../internal/pg_extension/.cargo/config.toml | 3 + .../internal/pg_extension/.gitignore | 6 + .../internal/pg_extension/Cargo.toml | 39 + .../pg_extension/pg_extension.control | 5 + .../pg_extension/sql/filter_phase.sql | 35 + .../pg_extension/sql/model_selection_cpu.sql | 31 + .../sql/model_selection_cpu_workloads.sql | 32 + .../pg_extension/sql/model_selection_dev.sql | 80 ++ .../sql/model_selection_trails.sql | 31 + .../sql/model_selection_trails_workloads.sql | 32 + .../pg_extension/sql/pg_extension--0.1.0.sql | 139 ++++ .../pg_extension/src/bindings/ml_register.rs | 55 ++ .../internal/pg_extension/src/bindings/mod.rs | 7 + .../pg_extension/src/bindings/model.rs | 19 + .../internal/pg_extension/src/bindings/ms.rs | 207 +++++ .../internal/pg_extension/src/lib.rs | 171 +++++ .../internal/pg_extension/test/lib.rs | 0 .../requirement.txt | 32 + setup.py | 2 +- tool/conda/singa/meta.yaml | 2 +- .../centos6/cuda10/Dockerfile.manylinux2014 | 4 +- 184 files changed, 18402 insertions(+), 7 deletions(-) create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174425377.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174945226.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exp_result_singa/.gitkeep create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/init_env create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/requirement.txt create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/README.md create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/cifar10_multiprocess.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_cnn.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_dist.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_multiprocess.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_cifar10.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_dist.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/sparsification_mnist.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/xceptionnet.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/benchmark.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar10.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar100.py create mode 100755 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar10.py create mode 100755 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar100.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_mnist.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/mnist.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/alexnet.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/cnn.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/resnet.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/xceptionnet.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/pkg_model_code/model.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/run.sh create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_cnn.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_mpi.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_ms_model.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_multiprocess.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/model.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/native.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/model.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/native.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/weight_initializers.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/graph_util.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2_ops.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_slicing/.gitkeep create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.cargo/config.toml create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/Cargo.toml create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/pg_extension.control create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/test/lib.rs create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/requirement.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f49efa69..50e67f970 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,10 +29,10 @@ LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Thirdparty) #string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VERSION}") -SET(PACKAGE_VERSION 4.0.0) # ${VERSION}) -SET(VERSION 4.0.0) +SET(PACKAGE_VERSION 4.1.0) # ${VERSION}) +SET(VERSION 4.1.0) SET(SINGA_MAJOR_VERSION 4) -SET(SINGA_MINOR_VERSION 0) +SET(SINGA_MINOR_VERSION 1) SET(SINGA_PATCH_VERSION 0) #SET(SINGA_MAJOR_VERSION ${VERSION_MAJOR}) # 0 - #SET(SINGA_MINOR_VERSION ${VERSION_MINOR}) # 0 - 9 diff --git a/LICENSE b/LICENSE index f448e8b2b..9c7ffb475 100644 --- a/LICENSE +++ b/LICENSE @@ -559,3 +559,59 @@ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=============================================================================== +SINGA bundles the following under MIT License: +examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/* + +MIT License + +Portions Copyright 2019-2021 ZomboDB, LLC. +Portions Copyright 2021-2023 Technology Concepts & Design, Inc. +Portions Copyright 2023 PgCentral Foundation, Inc. + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +=============================================================================== +SINGA bundles the following under The PostgreSQL License: +examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/* + +The PostgreSQL License + +Portions Copyright (c) 1996-2023, The PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its documentation for any +purpose, without fee, and without a written agreement is hereby granted, provided that the above +copyright notice and this paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, +SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING +OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF +THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, +AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, +UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile b/examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile new file mode 100644 index 000000000..cd622e2d7 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile @@ -0,0 +1,58 @@ +FROM ubuntu:20.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# Install Python, Vim, and necessary libraries +RUN apt-get update && \ + apt-get install -y software-properties-common wget gnupg2 lsb-release git && \ + add-apt-repository ppa:deadsnakes/ppa && \ + apt-get install -y python3.6 python3-pip vim && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Install necessary dependencies for PostgreSQL and Rust +RUN apt-get update && \ + apt-get install -y pkg-config libssl-dev libpq-dev libclang-dev curl && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Install necessary dependencies for pgrx +RUN apt-get update && \ + apt-get install -y bison flex libreadline-dev && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Create the postgres user +USER root +RUN adduser --disabled-password --gecos "" postgres && \ + mkdir /project && \ + adduser postgres sudo && \ + chown -R postgres:postgres /project + +# Switch to the postgres user andInstall Rust and init the cargo +USER postgres +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && \ + echo 'source $HOME/.cargo/env' >> $HOME/.bashrc && \ + /bin/bash -c "source $HOME/.cargo/env && cargo install cargo-pgrx --version '0.9.7' --locked" && \ + /bin/bash -c "source $HOME/.cargo/env && cargo pgrx init" + +# Set environment variables for Rust and Python +ENV PATH="/root/.cargo/bin:${PATH}" +ENV PYTHONPATH="${PYTHONPATH}:/project/TRAILS/internal/ml/model_selection" + +WORKDIR /project +COPY ./internal/ml/model_selection/requirement.txt ./requirement.txt +RUN pip install -r requirement.txt + +RUN pip install https://www.comp.nus.edu.sg/~zhaojing/files/singa-3.1.0-cp38-cp38-manylinux2014_x86_64.whl + +# appendix +USER root +RUN apt-get update && apt-get install -y \ + postgresql-client && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +USER postgres + +CMD ["tail", "-f", "/dev/null"] diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md new file mode 100644 index 000000000..cbc9749cf --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md @@ -0,0 +1,148 @@ +# Database-Native Model Selection + +​ -- based on Singa + + + +![image-20231020174425377](documents/image-20231020174425377.png) + +## Build Docker Image + +```bash +git clone https://github.com/apache/singa.git +cd singa/examples/model_selection/TRAILS-Database-Native-Model-Selection/ +docker build -t trails-singa . +``` + +## Run Docker Image +Download exp_data.zip from https://www.dropbox.com/scl/fi/xz4teosklwmfc5j4x2ug6/exp_data.zip?rlkey=5fk2ttib0zt49suyppcjhsrn2&dl=0 +and unzip the exp_data/ folder to a specific directory (path_to_exp_data_folder) +```bash +docker run -d --name trails-singa \ + --network="host" \ + -v path_to_exp_data_folder:/project/exp_data \ + trails-singa +``` + +## Start PostgreSQL Instance + +```bash +# 1. Run docker container +docker exec -it trails-singa bash +# 2. Clone the code +cd ~ +git clone https://github.com/apache/singa.git +cd singa/examples/model_selection/TRAILS-Database-Native-Model-Selection/ +# 3. Export PYTHONPATH +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +# 4. Start the RDBMS and then exit +cd internal/pg_extension +cargo pgrx run +exit +cd ../.. +# 5. Load data into RDBMS +bash internal/ml/model_selection/scripts/database/load_data_to_db.sh /project/exp_data/data/structure_data/frappe frappe +# 6. Run database server +cd internal/pg_extension +cargo pgrx run + +``` + + +## Register Stored Procedure + +```sql +CREATE OR REPLACE +PROCEDURE model_selection_sp( + dataset TEXT, --dataset name + selected_columns TEXT[], --used columns + N INTEGER, --number of models to evaluate + batch_size INTEGER, --batch size, for profiling, filtering + config_file TEXT --config file path +) +LANGUAGE plpgsql +AS $$ +DECLARE + -- global inputs/outputs + result_status TEXT; + column_list TEXT; +BEGIN + -- combine the columns into a string + column_list := array_to_string(selected_columns, ', '); + + -- 4. Run filtering phase to get top K models. + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + LIMIT %s OFFSET 0 + ) + SELECT filtering_phase( + json_agg(row_to_json(t))::text, %s, %s, %L + ) + FROM batch_rows AS t', column_list, dataset, batch_size, N, 1, config_file) INTO result_status; + RAISE NOTICE '4. run filtering phase, k models = %', result_status; + +END; $$; +``` + +# Compile the UDF + +```bash +# Try compile the UDF +DROP EXTENSION IF EXISTS pg_extension; +CREATE EXTENSION pg_extension; +``` + +If the above fails, open another terminal and go into the docker via docker exec -it trails-singa bash +Then run the following +```bash +rm /home/postgres/.pgrx/14.9/pgrx-install/share/extension/pg_extension--0.1.0.sql +vi /home/postgres/.pgrx/14.9/pgrx-install/share/extension/pg_extension--0.1.0.sql +# Copy the following to the /home/postgres/.pgrx/14.9/pgrx-install/share/extension/pg_extension--0.1.0.sql +-- src/lib.rs:66 +-- pg_extension::filtering_phase +CREATE FUNCTION "filtering_phase"( + "mini_batch" TEXT, /* alloc::string::String */ + "n" INT, /* i32 */ + "k" INT, /* i32 */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'filtering_phase_wrapper'; +``` + +Go back to the first terminal and run the following in the database server again +```bash +# Try compile the UDF +DROP EXTENSION IF EXISTS pg_extension; +CREATE EXTENSION pg_extension; +``` + +## Run Model Selection + +```sql +-- Template for calling 'model_selection_sp' stored procedure +CALL model_selection_sp( + , -- The name of the table or dataset from which data should be retrieved. + , -- An array of column names to be considered in the model selection process. + , -- Number of models to explore + , -- Batch size + -- The file path to a configuration file needed for the process. +); + + +# For example +CALL model_selection_sp( + 'frappe_train', + ARRAY['col1', 'col2', 'col3', 'label'], + 10, + 32, + '/home/postgres/singa/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini'); +``` + +# Example Result + +![image-20231020174945226](documents/image-20231020174945226.png) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md new file mode 100644 index 000000000..abb283768 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md @@ -0,0 +1,236 @@ + + + + +# Change the permission + +```bash +chmod -R 777 internal/pg_extension +chmod -R 777 TRAILS +``` + +# PSQL CMD + +```sql +psql -h localhost -p 28814 -U postgres +\c frappe +\dt +\d frappe_train +DROP TABLE frappe_train; +SELECT * FROM frappe_train LIMIT 10; +SELECT * FROM frappe_test LIMIT 10; +SELECT * FROM frappe_valid LIMIT 10; +DROP DATABASE frappe; +psql -U postgres +``` + +# Build and run the container + +```bash +docker build -t trails . + +docker run -d --name trails \ + --network="host" \ + -v $(pwd)/TRAILS:/project/TRAILS \ + -v /hdd1/xingnaili/exp_data/:/project/exp_data \ + trails + +docker exec -it trails bash +``` + +# This is in docker image already + +```bash +# if those are already on docker, skip them. +cargo install --locked cargo-pgrx +# run after package update +cargo pgrx init +cargo pgrx new my_extension +# just run this after code updates. +cargo pgrx run +``` + +# Develop + +## Load data into database. + +```bash +bash /project/TRAILS/internal/ml/model_selection/scripts/database/load_data_to_db.sh /project/exp_data/data/structure_data/frappe frappe +bash /project/TRAILS/internal/ml/model_selection/scripts/database/load_data_to_db.sh /project/exp_data/data/structure_data/uci_diabetes uci_diabetes +bash /project/TRAILS/internal/ml/model_selection/scripts/database/load_data_to_db.sh /project/exp_data/data/structure_data/criteo_full criteo +``` + +## 1. Compile + +In shell + +```bash +cd ./internal/pg_extension/ +cargo clean +rm -r /home/postgres/.pgrx/14.9/pgrx-install/lib/pg_extension.so +cargo pgrx run +rm /home/postgres/.pgrx/14.9/pgrx-install/share/extension/pg_extension--0.1.0.sql +vi /home/postgres/.pgrx/14.9/pgrx-install/share/extension/pg_extension--0.1.0.sql +paste the latest sqls +# generate schema +cargo pgrx schema >> /home/postgres/.pgrx/14.9/pgrx-install/share/extension/pg_extension--0.1.0.sql +``` + +In SQL + +```sql +DROP EXTENSION IF EXISTS pg_extension; +CREATE EXTENSION pg_extension; +``` + +## 2. Edit the config file + +Update the `nfield` in the `config.ini` file, it is == number of columns used. E.g, `ARRAY['col1', 'col2', 'col3', 'label']` => `nfield` = 3 + +## 3. Run it + +```sql +CREATE EXTENSION pg_extension; + +# Test if the UDF is there or not +SELECT * FROM pg_proc WHERE proname = 'model_selection_workloads'; + +# micro +select benchmark_filtering_phase_latency(4, '/project/TRAILS/internal/ml/model_selection/config.ini'); + +select benchmark_filtering_latency_in_db(5000, 'frappe', '/project/TRAILS/internal/ml/model_selection/config.ini'); + +select benchmark_filtering_latency_in_db(5000, 'uci_diabetes', '/project/TRAILS/internal/ml/model_selection/config.ini'); + +select benchmark_filtering_latency_in_db(4, 'criteo', '/project/TRAILS/internal/ml/model_selection/config.ini'); + +# Test coordinator +SELECT coordinator('0.08244', '168.830156', '800', false, '/project/TRAILS/internal/ml/model_selection/config.ini'); + +# this is database name, columns used, time budget, batch size, and config file +CALL model_selection_sp('dummy', ARRAY['col1', 'col2', 'col3', 'label'], '30', 32, '/project/TRAILS/internal/ml/model_selection/config.ini'); + +# end2end model selection +CALL model_selection_end2end('dummy', ARRAY['col1', 'col2', 'col3', 'label'], '15', '/project/TRAILS/internal/ml/model_selection/config.ini'); + +# filtering & refinement with workloads +CALL model_selection_workloads('dummy', ARRAY['col1', 'col2', 'col3', 'label'], 300, 3, '/project/TRAILS/internal/ml/model_selection/config.ini'); + +response = requests.post(args.refinement_url, json=data).json() + +``` + +# Test the pg-extension works using pipython + +```sql +# switch to a postgres +su postgres + +CREATE EXTENSION plpython3u; + +CREATE FUNCTION py_version() RETURNS text AS $$ +import sys +return sys.version +$$ LANGUAGE plpython3u; + +SELECT py_version(); + +CREATE OR REPLACE FUNCTION test_numpy() + RETURNS text +LANGUAGE plpython3u +AS $$ +import numpy +import torch +import sklearn +import torchvision +import tqdm +print("asdf") +return str(numpy.__version__) + " torch: " + str(torch.__version__) +$$; + +SELECT test_numpy(); + +CREATE EXTENSION my_extension; +SELECT hello_my_extension(); +``` + +# Container log + +Each line in your output represents a different process that is currently running on your PostgreSQL server. Here's what each one is doing: + +1. `/bin/sh -c service postgresql start && tail -F /var/log/postgresql/postgresq` : This is the command that was used to start your PostgreSQL server. It also includes a command to continuously display new entries from the PostgreSQL log file. + + +2. `/usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config` : This is the main PostgreSQL process. All other PostgreSQL processes are children of this process. + + +3. `postgres: 14/main: checkpointer` : The checkpointer process is responsible for making sure data changes get saved to disk regularly. This is important for database recovery in case of a crash. + + +4. `postgres: 14/main: background writer` : The background writer process is responsible for writing buffers to disk when they become dirty. This reduces the amount of work that needs to be done when a buffer is reused. + + +5. `postgres: 14/main: walwriter` : The walwriter process writes transaction logs (Write-Ahead Logs or WAL) to disk. This is also important for database recovery and replication. + + +6. `postgres: 14/main: autovacuum launcher` : The autovacuum launcher process starts autovacuum worker processes as needed. These processes automatically clean up and optimize the database. + + +7. `postgres: 14/main: stats collector` : The stats collector process collects statistics about the server's activity. This information can be viewed using the `pg_stat` family of system views. + + +8. `postgres: 14/main: logical replication launcher` : The logical replication launcher manages the worker processes that perform logical replication, copying data changes to other databases. + + +9. `tail -F /var/log/postgresql/postgresql-14-main.log` : This process is displaying the end of the PostgreSQL log file and updating as more entries are added. + + +10. `bash` : These are shell sessions, likely interactive ones you've started. + + +11. `/usr/lib/postgresql/14/bin/psql -h localhost -p 28814 pg_extension` : These are instances of the psql command line interface, connected to your database. + + +12. `postgres: postgres pg_extension 127.0.0.1(52236) CALL` : This is your currently running stored procedure. + + +13. `ps aux` : This is the command you ran to display the list of processes. + +Each process is part of the PostgreSQL database system and helps it to run efficiently and robustly. + +# MAC locally + +```bash +conda activate firmest38 +export PYTHON_SYS_EXECUTABLE=/Users/kevin/opt/anaconda3/envs/firmest38/bin/python +export DYLD_LIBRARY_PATH=/Users/kevin/opt/anaconda3/envs/firmest38/lib/:$DYLD_LIBRARY_PATH +cargo run --features python +``` + +# What cargo run do? + +Before: + +``` +postgres 1 0.1 0.0 2612 588 ? Ss 14:30 0:00 /bin/sh -c service postgresql start && tail -F /var/log/postgresql/postgresql-14-main.log +postgres 20 0.1 0.0 214688 29332 ? Ss 14:30 0:00 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf +postgres 22 0.0 0.0 214688 6120 ? Ss 14:30 0:00 postgres: 14/main: checkpointer +postgres 23 0.0 0.0 214688 6084 ? Ss 14:30 0:00 postgres: 14/main: background writer +postgres 24 0.0 0.0 214688 10352 ? Ss 14:30 0:00 postgres: 14/main: walwriter +postgres 25 0.0 0.0 215224 8864 ? Ss 14:30 0:00 postgres: 14/main: autovacuum launcher +postgres 26 0.0 0.0 69280 5184 ? Ss 14:30 0:00 postgres: 14/main: stats collector +postgres 27 0.0 0.0 215236 6972 ? Ss 14:30 0:00 postgres: 14/main: logical replication launcher +postgres 38 0.0 0.0 2548 512 ? S 14:30 0:00 tail -F /var/log/postgresql/postgresql-14-main.log +postgres 39 0.1 0.0 4112 3424 pts/0 Ss+ 14:30 0:00 bash +postgres 48 0.1 0.0 4112 3424 pts/1 Ss 14:30 0:00 bash +postgres 59 0.0 0.0 5896 2860 pts/1 R+ 14:30 0:00 ps aux +``` + +After: + + + + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174425377.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174425377.png new file mode 100644 index 0000000000000000000000000000000000000000..9e73b270d9e74c304b4b493ced7a0e39ac235824 GIT binary patch literal 302750 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%0D?k{6Mb|ad$ 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
ww^=KUTW(&iU6qaM#?2c?49)0vPkH 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�iCQ0$q#4>@bRn+4BpP>qH;zIH7pO{%cVyc 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
    9oVGzPTzfD} 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 literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174945226.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174945226.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b686d2ba71e563f2007feb6e80b2b99e91fcf8 GIT binary patch literal 26176 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 literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py new file mode 100644 index 000000000..7c6ce826e --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py @@ -0,0 +1,167 @@ +import time +import threading +import queue +import psycopg2 +from typing import Any, List, Dict, Tuple +from sanic import Sanic +from sanic.response import json +import calendar +import os +import logging + +log_logger_folder_name = "log_cache_service" +if not os.path.exists(f"./{log_logger_folder_name}"): + os.makedirs(f"./{log_logger_folder_name}") +logger = logging.getLogger(__name__) +logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(levelname)-8s %(message)s', + datefmt='%d %b %Y %H:%M:%S', + filename=f"./{log_logger_folder_name}/log_{str(calendar.timegm(time.gmtime()))}", filemode='w') + +USER = "postgres" +HOST = "127.0.0.1" +PORT = "28814" +DB_NAME = "pg_extension" +CACHE_SIZE = 10 + + +class CacheService: + def __init__(self, name_space: str, database: str, table: str, columns: List, batch_size: int, max_size: int = CACHE_SIZE): + """ + name_space: train, valid, test + database: database to use + table: which table + columns: selected cols + max_size: max batches to cache + """ + self.name_space = name_space + self.batch_size = batch_size + self.last_id = -1 + self.database = database + self.table = table + self.columns = columns + self.queue = queue.Queue(maxsize=max_size) + self.thread = threading.Thread(target=self.fetch_data, daemon=True) + self.thread.start() + + def decode_libsvm(self, columns): + map_func = lambda pair: (int(pair[0]), float(pair[1])) + # 0 is id, 1 is label + id, value = zip(*map(lambda col: map_func(col.split(':')), columns[2:])) + sample = {'id': list(id), + 'value': list(value), + 'y': int(columns[1])} + return sample + + def pre_processing(self, mini_batch_data: List[Tuple]): + """ + mini_batch_data: [('0', '0', '123:123', '123:123', '123:123',) + """ + sample_lines = len(mini_batch_data) + feat_id = [] + feat_value = [] + y = [] + + for i in range(sample_lines): + row_value = mini_batch_data[i] + sample = self.decode_libsvm(row_value) + feat_id.append(sample['id']) + feat_value.append(sample['value']) + y.append(sample['y']) + return {'id': feat_id, 'value': feat_value, 'y': y} + + def fetch_data(self): + with psycopg2.connect(database=self.database, user=USER, host=HOST, port=PORT) as conn: + while True: + try: + # fetch and preprocess data from PostgreSQL + batch, time_usg = self.fetch_and_preprocess(conn) + self.queue.put(batch) + print(f"Data is fetched, {self.name_space} queue_size={self.queue.qsize()}, time_usg={time_usg}") + logger.info(f"Data is fetched, queue_size={self.queue.qsize()}, time_usg={time_usg}") + # block until a free slot is available + time.sleep(0.1) + except psycopg2.OperationalError: + logger.exception("Lost connection to the database, trying to reconnect...") + time.sleep(5) # wait before trying to establish a new connection + conn = psycopg2.connect(database=self.database, user=USER, host=HOST, port=PORT) + + def fetch_and_preprocess(self, conn): + begin_time = time.time() + cur = conn.cursor() + # Assuming you want to get the latest 100 rows + columns_str = ', '.join(self.columns) + # Select rows greater than last_id + cur.execute(f"SELECT id, {columns_str} FROM {self.table} " + f"WHERE id > {self.last_id} ORDER BY id ASC LIMIT {self.batch_size}") + rows = cur.fetchall() + + if rows: + # Update last_id with max id of fetched rows + self.last_id = max(row[0] for row in rows) # assuming 'id' is at index 0 + else: + # If no more new rows, reset last_id to start over scan and return 'end_position' + self.last_id = -1 + return "end_position", time.time() - begin_time + + batch = self.pre_processing(rows) + return batch, time.time() - begin_time + + def get(self): + return self.queue.get() + + def is_empty(self): + return self.queue.empty() + + +app = Sanic("CacheServiceApp") + + +# start the server, this is from pg_ingerface +@app.route("/", methods=["POST"]) +async def start_service(request): + try: + columns = request.json.get('columns') + # can only be train or valid + name_space = request.json.get('name_space') + table_name = request.json.get('table_name') + batch_size = request.json.get('batch_size') + + if columns is None: + return json({"error": "No columns specified"}, status=400) + if name_space not in ["train", "valid", "test"]: + return json({"error": name_space + " is not correct"}, status=400) + + print(f"columns are {columns}, name_space = {name_space}") + + if not hasattr(app.ctx, f'{table_name}_{name_space}_cache'): + setattr(app.ctx, f'{table_name}_{name_space}_cache', + CacheService(name_space, DB_NAME, table_name, columns, batch_size, CACHE_SIZE)) + + return json("OK") + except Exception as e: + return json({"error": str(e)}, status=500) + + +# serve the data retrieve request from eva_service.py +@app.route("/", methods=["GET"]) +async def serve_get_request(request): + name_space = request.args.get('name_space') + table_name = request.args.get('table_name') + + # check if exist + if not hasattr(app.ctx, f'{table_name}_{name_space}_cache'): + return json({"error": f"{table_name}_{name_space}_cache not start yet"}, status=404) + + # get data + data = getattr(app.ctx, f'{table_name}_{name_space}_cache').get() + + # return + if data is None: + return json({"error": "No data available"}, status=404) + else: + return json(data) + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=8093) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py new file mode 100644 index 000000000..45cecdf73 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py @@ -0,0 +1,19 @@ + +import requests + +url = 'http://localhost:8093/' +columns = ['label', 'col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'col9', 'col10'] +response = requests.post( + url, json={'columns': columns, + 'name_space': "train", + 'table_name': "frappe_train", + "batch_size": 32}) +print(response.json()) + +response = requests.post( + url, json={'columns': columns, + 'name_space': "valid", + 'table_name': "frappe_valid", + "batch_size": 1024}) +print(response.json()) + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md new file mode 100644 index 000000000..9b9b7b563 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md @@ -0,0 +1,271 @@ +# TRAILS: A Database Native Model Selection System + +![image-20230702035806963](documents/imgs/image-20230702035806963.png) + +[TOC] + +# Config Environments + +```bash +# Create virtual env +conda config --set ssl_verify false +conda create -n "trails" python=3.8.10 +conda activate trails +pip install -r requirement.txt + +cd TRAILS + +# make a dir to store all results. +mkdir ../exp_data +``` + +# Reproduce the results + +## NAS-Bench-Tabular + + NAS-Bench-Tabular can be either **download** or build from scratch. + +### Download NAS-Bench-Tabular + +1. **Download** the dataset using the following link, and extract them to `exp_data` + +```bash +https://drive.google.com/file/d/1TGii9ymbmX81c9-GKWXbe_4Z64R8Btz1/view?usp=sharing +``` + +### Build NAS-Bench-Tabular + +2. Build the **NAS-Bench-Tabular** from scratch + +```python +# Construct NAS-Bench-Tabular: +## 1. Training all models. +bash internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh +bash internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh +bash internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh + +## 2. Scoring all models using all TFMEMs. +bash internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh +bash internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh +bash internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh +``` + +3. Build the **NAS-Bench-Img** from scratch + + To facilitate the experiments and query speed (NASBENCH API is slow) + + 1. We retrieve all results from NASBENCH API and store them as a json file. + 2. We score all models in NB201 and 28K models in NB101. + 3. We search with EA + Score and record the searching process in terms of + `run_id, current_explored_model, top_400 highest scored model, time_usage` + to SQLLite. + +```python +# 1. Record NASBENCH API data into json file +## This requires to install nats_bench: pip install nats_bench +bash ./internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh + +# 2. Scoring all models using all TFMEMs. +nohup bash ./internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh & + +# 3. Explore with EA ans score result and store exploring process into SQLLite +bash ./internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh + +# 4. Generate the baseline. +bash ./internal/ml/model_selection/scripts/baseline_system_img.sh +``` + +The following experiment could then query filtering phase results based on `run_id`. + +## SLO-Aware 2Phase-MS + +With the above **NAS-Bench-Tabular**, we could run various experiments. + +```bash +# 1. Generate the results for drawing the figure +## tabular data: training-base-ms +bash internal/ml/model_selection/scripts/baseline_system_tab.sh +## tabular data: training-free-ms, 2phase-ms +nohup bash internal/ml/model_selection/scripts/anytime_tab.sh & +## image data: training-base-ms, training-free-ms, 2phase-ms +nohup bash internal/ml/model_selection/scripts/anytime_img_w_baseline.sh & + +# 2. Draw figure +python internal/ml/model_selection/exps/macro/anytime_tab_draw.py +python internal/ml/model_selection/exps/macro/anytime_img_draw.py +``` + +![image-20230702035554579](documents/imgs/image-20230702035554579.png) + +## Micro: Benchmark TFMEMs + +```bash +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails +python ./internal/ml/model_selection/exps/micro/benchmark_correlation.py +``` + +![image-20230421214835152](./documents/imgs/image-20230421214835152.png) + +## Micro: Benchmark Budge-Aware Algorithm + +```bash +bash internal/ml/model_selection/scripts/micro_budget_aware_alg.sh +``` + +![image-20230724111659545](./documents/imgs/image-20230724111659545.png) + +## Micro: Benchmark N, K, U + +With ranking the models by ther TFMEM score in the filtering phase, we aim to determine + +1. Further examinng more models (**K**) with each going through less training epoch (**U**) is more easier to find good model? + or examine less but each training more epochs? +2. How many models to explore (**N**) and how many to keep (**K**) ? + +```bash +bash internal/ml/model_selection/scripts/micro_nku_tradeoff.sh +``` + +This is the experimental result conducted at the UCI Diabetes datasets. +Clearly, expore more models in refinement phase (large **K** ) is more helpful to find the a better model. +Although increasing **U** can find a better model accurately, it runs more training epochs leading to higher training cost. + +![image-20230722202555763](./documents/imgs/image-20230722202555763.png) + +Then we fix **U=1** for cost efficiency and determine N/K for higher searching effectiveness. +Clearly, K/N reaches 100 yields better scheduling result in both image and tabular dataset, thus, we set **N/K=100** in coordinator. + +![image-20230724111325368](./documents/imgs/image-20230724111325368.png) + +![image-20230722205244718](./documents/imgs/image-20230722205244718.png) + +## Micro: Device Placement & Embedding Cache + +1. To measure the time usage for filtering phase on vairous hardware, run the following + + ```bash + # Without embedding cache at the filtering phase + nohup bash internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh & + # With embedding cache at the filtering phase (faster) + nohup bash internal/ml/model_selection/scripts/latency_embedding_cache.sh & + # Draw graph + python ./internal/ml/model_selection/exps/micro/draw_filtering_latency.py + python ./internal/ml/model_selection/exps/micro/draw_filtering_memory_bar.py + python ./internal/ml/model_selection/exps/micro/draw_filtering_memory_line.py + python ./internal/ml/model_selection/exps/micro/draw_filtering_memory_cache_CPU.py + ``` + +2. Further we measure the end-2-end latency under two CPU, GPU, and Hybrid. + + ```bash + nohup bash internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh & + ``` + +## Micro: In-DB vs Out-DB filtering phase + +```bash +# run out-of db, read data via psycopg2 +bash ./internal/ml/model_selection/scripts/latency_phase1_in_db.sh + +# run in-db query, read data via SPI +select benchmark_filtering_latency_in_db(5000, 'frappe', '/project/TRAILS/internal/ml/model_selection/config.ini'); + +select benchmark_filtering_latency_in_db(5000, 'uci_diabetes', '/project/TRAILS/internal/ml/model_selection/config.ini'); + +select benchmark_filtering_latency_in_db(5000, 'criteo', '/project/TRAILS/internal/ml/model_selection/config.ini'); +``` + +## Micro: On-the-Fly Data transmission, Refinement + +```bash +# start cache service +python ./internal/cache-service/cache_service.py +python ./internal/cache-service/trigger_cache_svc.py +# consume from the cache-svc + + +``` + +## Reproduce Figure7 + +```bash +python exps/main_v2/analysis/2.\ cost_draw.py +python exps/main_v2/analysis/3.\ cost_train_based.py +``` + +![image-20230702035622198](documents/imgs/image-20230702035622198.png) + +## Reproduce Figure8 + +```bash +# draw figure 8(a) +python exps/main_v2/analysis/5.draw_IDMS_var_workloads.py +# draw figure 8(b) +python exps/main_v2/analysis/6.draw_IDMS_dataloading.py +``` + +![image-20230702035639502](documents/imgs/image-20230702035639502.png) +# Baselines + +We compare with Training-Based MS, TabNAS, and training-free MS etc. + +For image data, it already generated at the NAS-Bench-Img part, see above. + +# Appendix + +Here all experiments is on the Frappe dataset. + +1. Computational Costs + + ```bash + bash ./internal/ml/model_selection/exps/micro/resp/benchmark_cost.sh + ``` + +2. Search Cost, multiple training-free or training-based combinations (warm-up / movel proposal) + + ```bash + # get RL, RE, RS + training-based model evaluation + bash ./internal/ml/model_selection/scripts/micro_search_strategy.sh + # this will read previous file, and run warm-up/move proposal, and draw all together + bash ./internal/ml/model_selection/exps/micro/resp/benchmark_search_cost.sh + ``` + +3. How des the K influence the result? + + ```bash + python ./internal/ml/model_selection/exps/micro/resp/benchmark_k_fix_time.py + ``` + +4. Nosy in selecting top K models + + ```bash + python ./internal/ml/model_selection/exps/micro/resp/benchmark_noisy_influence.py + ``` + +5. Weight-sharing result + + ```bash + nohup bash internal/ml/model_selection/scripts/benchmark_weight_sharing.sh & + ``` + + + + + + + +# Run end2end model selection + +download the dataset and put it in the `exp_data/data/structure_data` + +``` +python main.py --budget=100 --dataset=frappe +``` + +Check the log at the `logs_default` + +![image-20230421220338391](./documents/imgs/image-20230421220338391.png) + +![image-20230421220443231](./documents/imgs/image-20230421220443231.png) + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini new file mode 100644 index 000000000..61bdf6cfc --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini @@ -0,0 +1,86 @@ +[DEFAULT] +log_name = in_db_ms +budget = 100 +device = cpu +log_folder = ./internal/debug_singa_logger +;log_folder = /project/TRAILS/log_score_time_frappe +result_dir = ./internal/ml/model_selection/exp_result_singa/ +;result_dir = /project/TRAILS/internal/ml/model_selection/exp_result_sever_cache_sql_indb/ +num_points = 12 +max_load = -1 + +[SAMPLER] +search_space = mlp_sp +population_size = 10 +sample_size = 3 +simple_score_sum = True + +[NB101] +api_loc = nasbench_only108.pkl +init_channels = 16 +bn = 1 +num_stacks = 3 +num_modules_per_stack = 3 + +[NB201] +init_w_type = none +init_b_type = none +arch_size = 1 + +[MLP] +num_layers = 4 +hidden_choice_len = 20 + +[MLP_TRAINER] +epoch = 20 +batch_size = 32 +lr = 0.002 +patience = 1 +iter_per_epoch = 200 +nfeat = 5500 +nfield = 10 +nemb = 10 +report_freq = 30 +workers = 0 + +[DATASET] +;base_dir = ../exp_data/ +base_dir = /hdd1/xingnaili/exp_data/ +dataset = frappe +num_labels = 2 + +[SEQ_TRAIN] +worker_id = 0 +total_workers = 120 +total_models_per_worker = -1 +pre_partitioned_file = ./internal/ml/model_selection/exps/sampled_data/sampled_models_all.json + +[DIS_TRAIN] +worker_each_gpu = 6 +gpu_num = 8 + +[TUNE_INTERVAL] +kn_rate = -1 + +[ANYTIME] +only_phase1 = False +is_simulate = False + + +[SERVER] +refinement_url = http://localhost:8095/ +cache_svc_url = http://localhost:8093/ + +[DB_CONFIG] +db_name = pg_extension +db_user = postgres +db_host = 127.0.0.1 +db_port = 28814 + + +[SYS_PERFORMANCE] +models_explore = -1 +# tfmem = express_flow +tfmem = synflow +embedding_cache_filtering = True +concurrency = 1 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py new file mode 100644 index 000000000..691e739ed --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py @@ -0,0 +1,78 @@ +import calendar +import os +import time +import argparse +import configparser +from sanic import Sanic +from sanic.exceptions import InvalidUsage +from sanic.response import json + +ts = calendar.timegm(time.gmtime()) +os.environ.setdefault("log_logger_folder_name", "log_eval_service") +os.environ.setdefault("log_file_name", "eval_service_" + str(ts) + ".log") +from src.logger import logger +from src.eva_engine.run_ms import RunModelSelection +from src.dataset_utils.stream_dataloader import StreamingDataLoader +from shared_config import parse_config_arguments +from typing import Any, List, Dict, Tuple + + +def refinement_phase(u: int, k_models: List, dataset_name: str, config_file: str): + """ + U: training-epoches + K-Models: k models to train + config_file: config file path + """ + args = parse_config_arguments(config_file) + args.device = "cuda:7" + train_dataloader = StreamingDataLoader( + cache_svc_url=args.cache_svc_url, table_name=f"{dataset_name}_train", name_space="train") + eval_dataloader = StreamingDataLoader( + cache_svc_url=args.cache_svc_url, table_name=f"{dataset_name}_valid", name_space="valid") + + try: + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + best_arch, best_arch_performance, _ = rms.refinement_phase( + U=u, + k_models=k_models, + train_loader=train_dataloader, + valid_loader=eval_dataloader) + finally: + train_dataloader.stop() + eval_dataloader.stop() + return {"best_arch": best_arch, "best_arch_performance": best_arch_performance} + + +app = Sanic("evaApp") + + +@app.route("/", methods=["POST"]) +async def start_refinement_phase(request): + # Check if request is JSON + if not request.json: + logger.info("Expecting JSON payload") + raise InvalidUsage("Expecting JSON payload") + + u = request.json.get('u') + k_models = request.json.get('k_models') + dataset_name = request.json.get('dataset_name') + config_file = request.json.get('config_file') + + if u is None or k_models is None or config_file is None: + logger.info(f"Missing 'u' or 'k_models' in JSON payload, {request.json}") + raise InvalidUsage("Missing 'u' or 'k_models' in JSON payload") + + result = refinement_phase(u, k_models, dataset_name, config_file) + + return json(result) + + +if __name__ == "__main__": + + result = refinement_phase( + u=1, + k_models=["8-8-8-8", "16-16-16-16"], + dataset_name="frappe", + config_file="/home/xingnaili/firmest_docker/TRAILS/internal/ml/model_selection/config.ini") + + # app.run(host="0.0.0.0", port=8095) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exp_result_singa/.gitkeep b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exp_result_singa/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md new file mode 100644 index 000000000..523566c42 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md @@ -0,0 +1,21 @@ +# Folder description + +## baseline + +We store the baseline algorithm here + +## benchmark_tfmem + +We benchmarking TFMEM here + +## macro/micro + +We benchmark the system from both macro and analysis component in micro + +## nas_bench_tabular + +We build a nas-bench-tabular dataset here + +## system + +We run the experiment here \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py new file mode 100644 index 000000000..2e3e55431 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py @@ -0,0 +1,706 @@ +import os + +from matplotlib import pyplot as plt +import seaborn as sns +import numpy as np +import palettable +from matplotlib.ticker import MaxNLocator +import numpy +from src.common.constant import Config +import matplotlib + +# lines' mark size +set_marker_size = 15 +# points' mark size +set_marker_point = 14 +# points' mark size +set_font_size = 40 +set_lgend_size = 15 +set_tick_size = 20 + +frontinsidebox = 23 + +# update tick size +matplotlib.rc('xtick', labelsize=set_tick_size) +matplotlib.rc('ytick', labelsize=set_tick_size) + +plt.rcParams['axes.labelsize'] = set_tick_size + +mark_list = ["o", "*", "<", "^", "s", "d", "D", ">", "h"] +mark_size_list = [set_marker_size, set_marker_size + 1, set_marker_size + 1, set_marker_size, + set_marker_size, set_marker_size, set_marker_size, set_marker_size + 1, set_marker_size + 2] +line_shape_list = ['-.', '--', '-', ':'] + + +# this is for draw figure3 only +def get_plot_compare_with_base_line_cfg(search_space, dataset, if_with_phase1=False): + if search_space == Config.NB201: + run_range_ = range(0, 100, 1) + if if_with_phase1: + draw_graph = draw_anytime_result_with_p1 + else: + draw_graph = draw_anytime_result + # min, this is for plot only + if dataset == Config.c10: + # C10 array + budget_array = [0.017, 0.083] + list(range(1, 350, 4)) + sub_graph_y1 = [91, 94.5] + sub_graph_y2 = [53.5, 55] + sub_graph_split = 60 + elif dataset == Config.c100: + # C10 array + budget_array = [0.017, 0.083] + list(range(1, 350, 4)) + + sub_graph_y1 = [64, 73.5] + sub_graph_y2 = [15, 16] + sub_graph_split = 20 + else: + # ImgNet X array + budget_array = [0.017, 0.083] + list(range(1, 350, 4)) + sub_graph_y1 = [33, 48] + sub_graph_y2 = [15.5, 17] + sub_graph_split = 34 + else: + # this is NB101 + C10, because only 101 has 20 run. others have 100 run. + run_range_ = range(0, 20, 1) + if if_with_phase1: + draw_graph = draw_anytime_result_one_graph_with_p1 + # budget_array = list(range(1, 16, 1)) + budget_array = numpy.arange(0.02, 15, 0.02).tolist() + else: + draw_graph = draw_anytime_result_one_graph + budget_array = [0.017, 0.083] + list(range(1, 2000, 8)) + + if dataset == Config.c10: + # C10 array + # budget_array = list(range(0, 2000, 1)) + sub_graph_y1 = [90, 94.5] + sub_graph_y2 = [52, 55] + sub_graph_split = 60 + else: + raise Exception + + return run_range_, budget_array, sub_graph_y1, sub_graph_y2, sub_graph_split, draw_graph + + +def draw_anytime_result(result_dir, y_acc_list_arr, x_T_list, + x_acc_train, y_acc_train_l, y_acc_train_m, y_acc_train_h, + annotations, lv, + name_img, dataset, + x1_lim=[], x2_lim=[], + ): + fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, dpi=100, gridspec_kw={'height_ratios': [4, 1]}) + exp = np.array(y_acc_list_arr) + sys_acc_h = np.quantile(exp, .75, axis=0) + sys_acc_m = np.quantile(exp, .5, axis=0) + sys_acc_l = np.quantile(exp, .25, axis=0) + + # plot simulate result of system + ax1.fill_between(x_T_list, sys_acc_l, sys_acc_h, alpha=0.1) + ax1.plot(x_T_list, sys_acc_m, mark_list[-1], label="TRAILS") + ax2.fill_between(x_T_list, sys_acc_l, sys_acc_h, alpha=0.1) + + # plot simulate result of train-based line + ax1.fill_between(x_acc_train, y_acc_train_l, y_acc_train_h, alpha=0.3) + ax1.plot(x_acc_train, y_acc_train_m, mark_list[-2], label="Training-based MS") + ax2.fill_between(x_acc_train, y_acc_train_l, y_acc_train_h, alpha=0.3) + + for i in range(len(annotations)): + ele = annotations[i] + if ele[1] < lv: + # convert to mins + ax2.plot(ele[2] / 60, ele[1], mark_list[i], label=ele[0], fontsize=set_marker_size) + else: + ax1.plot(ele[2] / 60, ele[1], mark_list[i], label=ele[0], fontsize=set_marker_size) + # ax2.scatter(ele[2]/60, ele[1]* 0.01, s=100, color="red") + # ax2.annotate(ele[0], (ele[2]/60, ele[1] * 0.01)) + + if len(x1_lim) > 0 and len(x2_lim) > 0: + ax1.set_ylim(x1_lim[0], x1_lim[1]) # 子图1设置y轴范围,只显示部分图 + ax2.set_ylim(x2_lim[0], x2_lim[1]) # 子图2设置y轴范围,只显示部分图 + + ax1.spines['bottom'].set_visible(False) # 关闭子图1中底部脊 + ax2.spines['top'].set_visible(False) ##关闭子图2中顶部脊 + ax2.set_xticks(range(0, 31, 1)) + + d = .85 # 设置倾斜度 + # 绘制断裂处的标记 + kwargs = dict(marker=[(-1, -d), (1, d)], markersize=set_marker_size, + linestyle='none', color='r', mec='r', mew=1, clip_on=False) + ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs) + ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs) + + plt.tight_layout() + plt.xscale("symlog") + ax1.grid() + ax2.grid() + plt.xlabel("Time Budget given by user (min)", fontsize=set_font_size) + ax1.set_ylabel(f"Test accuracy on {dataset}", fontsize=set_font_size) + ax1.legend(ncol=1, fontsize=set_lgend_size) + ax2.legend(fontsize=set_lgend_size) + # plt.show() + plt.savefig(f"{result_dir}/any_time_{name_img}.pdf", bbox_inches='tight') + + +def draw_anytime_result_one_graph(y_acc_list_arr, x_T_list, + x_acc_train, y_acc_train_l, y_acc_train_m, y_acc_train_h, + annotations, lv, + name_img, dataset, + x1_lim=[], x2_lim=[], + ): + # fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, dpi=100, gridspec_kw={'height_ratios': [5, 1]}) + exp = np.array(y_acc_list_arr) * 100 + sys_acc_h = np.quantile(exp, .75, axis=0) + sys_acc_m = np.quantile(exp, .5, axis=0) + sys_acc_l = np.quantile(exp, .25, axis=0) + + # exp_time = np.array(real_time_used_arr) + # time_mean = np.quantile(exp_time, .5, axis=0) + time_mean = x_T_list + + # plot simulate result of system + plt.fill_between(time_mean, sys_acc_l, sys_acc_h, alpha=0.1) + plt.plot(time_mean, sys_acc_m, "o-", label="TRAILS") + # plt.plot(time_mean, sys_acc_m, label="TRAILS") + + # plot simulate result of train-based line + plt.fill_between(x_acc_train, y_acc_train_l, y_acc_train_h, alpha=0.3) + plt.plot(x_acc_train, y_acc_train_m, "o-", label="Training-based MS") + # plt.plot(x_acc_train, y_acc_train_m, label="Training-based MS") + + if len(x1_lim) > 0: + plt.ylim(x1_lim[0], x1_lim[1]) # 子图1设置y轴范围,只显示部分图 + + d = .85 # 设置倾斜度 + # 绘制断裂处的标记 + kwargs = dict(marker=[(-1, -d), (1, d)], markersize=set_marker_size, + linestyle='none', color='r', mec='r', mew=1, clip_on=False) + # plt.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs) + # plt.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs) + + plt.tight_layout() + # plt.xscale("symlog") + plt.grid() + plt.xlabel("Time Budget given by user (min)", fontsize=set_font_size) + plt.ylabel(f"Test accuracy on {dataset}", fontsize=set_font_size) + plt.legend(ncol=1, fontsize=set_lgend_size) + plt.show() + # plt.savefig(f"amy_time_{name_img}.pdf", bbox_inches='tight') + + +# those two function will plot phase 1 and phase 2 +def draw_anytime_result_with_p1(result_dir, y_acc_list_arr, x_T_list, y_acc_list_arr_p1, x_T_list_p1, + x_acc_train, y_acc_train_l, y_acc_train_m, y_acc_train_h, + annotations, lv, + name_img, dataset, max_value, + x1_lim=[], x2_lim=[], + ): + fig, (ax1, ax2) = plt.subplots( + 2, 1, + sharex=True, + dpi=100, + gridspec_kw={'height_ratios': [6, 1]}) + + shade_degree = 0.2 + + # plot simulate result of train-based line + ax1.plot(x_acc_train, y_acc_train_m, mark_list[-3] + line_shape_list[0], label="Training-Based MS", + markersize=mark_size_list[-3]) + ax1.fill_between(x_acc_train, y_acc_train_l, y_acc_train_h, alpha=shade_degree) + ax2.fill_between(x_acc_train, y_acc_train_l, y_acc_train_h, alpha=shade_degree) + + # plot simulate result of system + exp = np.array(y_acc_list_arr_p1) + sys_acc_p1_h = np.quantile(exp, .75, axis=0) + sys_acc_p1_m = np.quantile(exp, .5, axis=0) + sys_acc_p1_l = np.quantile(exp, .25, axis=0) + ax1.plot(x_T_list_p1, sys_acc_p1_m, mark_list[-2] + line_shape_list[1], label="Training-Free MS", + markersize=mark_size_list[-2]) + ax1.fill_between(x_T_list_p1, sys_acc_p1_l, sys_acc_p1_h, alpha=shade_degree) + ax2.fill_between(x_T_list_p1, sys_acc_p1_l, sys_acc_p1_h, alpha=shade_degree) + + # plot simulate result of system + exp = np.array(y_acc_list_arr) + sys_acc_h = np.quantile(exp, .75, axis=0) + sys_acc_m = np.quantile(exp, .5, axis=0) + sys_acc_l = np.quantile(exp, .25, axis=0) + ax1.plot(x_T_list, sys_acc_m, mark_list[-1] + line_shape_list[2], label="2Phase-MS", markersize=mark_size_list[-1]) + ax1.fill_between(x_T_list, sys_acc_l, sys_acc_h, alpha=shade_degree) + ax2.fill_between(x_T_list, sys_acc_l, sys_acc_h, alpha=shade_degree) + + print(f"speed-up on {dataset} = {x_acc_train[-1] / x_T_list[-2]}, " + f"t_train = {x_acc_train[-1]}, t_f = {x_T_list[-2]}") + + for i in range(len(annotations)): + ele = annotations[i] + if ele[1] < lv: + # convert to mins + ax2.plot(ele[2] / 60, ele[1], mark_list[i], label=ele[0], markersize=set_marker_point) + else: + ax1.plot(ele[2] / 60, ele[1], mark_list[i], label=ele[0], markersize=set_marker_point) + # ax2.scatter(ele[2]/60, ele[1]* 0.01, s=100, color="red") + # ax2.annotate(ele[0], (ele[2]/60, ele[1] * 0.01)) + + if len(x1_lim) > 0 and len(x2_lim) > 0: + ax1.set_ylim(x1_lim[0], x1_lim[1]) # 子图1设置y轴范围,只显示部分图 + ax2.set_ylim(x2_lim[0], x2_lim[1]) # 子图2设置y轴范围,只显示部分图 + + ax1.spines['bottom'].set_visible(False) # 关闭子图1中底部脊 + ax2.spines['top'].set_visible(False) ##关闭子图2中顶部脊 + ax2.set_xticks(range(0, 31, 1)) + + d = .85 # 设置倾斜度 + # 绘制断裂处的标记 + kwargs = dict(marker=[(-1, -d), (1, d)], markersize=set_marker_size, + linestyle='none', color='r', mec='r', mew=1, clip_on=False) + ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs) + ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs) + + plt.xscale("log") + ax1.grid() + ax2.grid() + plt.xlabel(r"Response Time Threshold $T_{max}$ (min)", fontsize=set_font_size) + ax1.set_ylabel(f"Test Acc on {'In-16'}", fontsize=set_font_size) + # ax1.legend(ncol=1, fontsize=set_lgend_size) + # ax2.legend(fontsize=set_lgend_size) + + ax1.xaxis.label.set_size(set_tick_size) + ax1.yaxis.label.set_size(set_tick_size) + # ax1.set_xticks([]) + + ax2.xaxis.label.set_size(set_tick_size) + ax2.yaxis.label.set_size(set_tick_size) + + ax1.yaxis.set_major_locator(MaxNLocator(nbins=4, integer=True)) + + ax1.axhline(max_value, color='r', linestyle='-', label='Global Best Accuracy') + + tick_values = [0.01, 0.1, 1, 10, 100, 1000] + ax2.set_xticks(tick_values) + ax2.set_xticklabels([f'$10^{{{int(np.log10(val))}}}$' for val in tick_values]) + + # this is for unique hash + export_legend( + fig, + colnum=3, + unique_labels=['TE-NAS (Training-Free)', 'ENAS (Weight sharing)', + 'KNAS (Training-Free)', 'DARTS-V1 (Weight sharing)', 'DARTS-V2 (Weight sharing)', + 'Training-Based MS', 'Training-Free MS', '2Phase-MS', 'Global Best Accuracy']) + plt.tight_layout() + fig.savefig(f"{result_dir}/any_time_{name_img}_p1_from_0.1_sec.pdf", bbox_inches='tight') + + +def export_legend(ori_fig, filename="any_time_legend", colnum=9, unique_labels=[]): + fig2 = plt.figure(figsize=(5, 0.3)) + lines_labels = [ax.get_legend_handles_labels() for ax in ori_fig.axes] + lines, labels = [sum(lol, []) for lol in zip(*lines_labels)] + # grab unique labels + if len(unique_labels) == 0: + unique_labels = set(labels) + # assign labels and legends in dict + legend_dict = dict(zip(labels, lines)) + # query dict based on unique labels + unique_lines = [legend_dict[x] for x in unique_labels] + fig2.legend(unique_lines, unique_labels, loc='center', + ncol=colnum, + fancybox=True, + shadow=True, scatterpoints=1, fontsize=set_lgend_size) + fig2.tight_layout() + fig2.savefig(f"{filename}.pdf", bbox_inches='tight') + + +def draw_anytime_result_one_graph_with_p1(y_acc_list_arr, x_T_list, y_acc_list_arr_p1, x_T_list_p1, + x_acc_train, y_acc_train_l, y_acc_train_m, y_acc_train_h, + annotations, lv, + name_img, dataset, + x1_lim=[], x2_lim=[], + ): + # fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, dpi=100, gridspec_kw={'height_ratios': [5, 1]}) + + # plot simulate result of system + exp = np.array(y_acc_list_arr_p1) * 100 + sys_acc_p1_h = np.quantile(exp, .75, axis=0) + sys_acc_p1_m = np.quantile(exp, .5, axis=0) + sys_acc_p1_l = np.quantile(exp, .25, axis=0) + + plt.fill_between(x_T_list_p1, sys_acc_p1_l, sys_acc_p1_h, alpha=0.1) + plt.plot(x_T_list_p1, sys_acc_p1_m, "o-", label="TRAILS-P1") + # plt.fill_between(x_T_list_p1, sys_acc_p1_l, sys_acc_p1_h, alpha=0.1) + + exp = np.array(y_acc_list_arr) * 100 + sys_acc_h = np.quantile(exp, .75, axis=0) + sys_acc_m = np.quantile(exp, .5, axis=0) + sys_acc_l = np.quantile(exp, .25, axis=0) + + # exp_time = np.array(real_time_used_arr) + # time_mean = np.quantile(exp_time, .5, axis=0) + time_mean = x_T_list + + # plot simulate result of system + plt.fill_between(time_mean, sys_acc_l, sys_acc_h, alpha=0.1) + plt.plot(time_mean, sys_acc_m, "o-", label="TRAILS") + # plt.plot(time_mean, sys_acc_m, label="TRAILS") + + # plot simulate result of train-based line + plt.fill_between(x_acc_train, y_acc_train_l, y_acc_train_h, alpha=0.3) + plt.plot(x_acc_train, y_acc_train_m, "o-", label="Training-based MS") + # plt.plot(x_acc_train, y_acc_train_m, label="Training-based MS") + + if len(x1_lim) > 0: + plt.ylim(x1_lim[0], x1_lim[1]) # 子图1设置y轴范围,只显示部分图 + + d = .85 # 设置倾斜度 + # 绘制断裂处的标记 + kwargs = dict(marker=[(-1, -d), (1, d)], markersize=set_marker_size, + linestyle='none', color='r', mec='r', mew=1, clip_on=False) + # plt.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs) + # plt.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs) + + plt.tight_layout() + plt.xscale("symlog") + plt.grid() + plt.xlabel("Time Budget given by user (min)", fontsize=set_font_size) + plt.ylabel(f"Test accuracy on {dataset}", fontsize=set_font_size) + plt.legend(ncol=1, fontsize=set_lgend_size) + # plt.show() + plt.savefig(f"amy_time_{name_img}.pdf", bbox_inches='tight') + + +# for K, U N trade-off +def draw_grid_graph_with_budget( + acc, bt, b1, b2, + img_name: str, y_array: list, x_array: list): + """ + :param acc: Two array list + :param bt: Two array list + :param img_name: img name string + :return: + """ + + acc_new = np.array(acc) + acc = acc_new.tolist() + + mask = np.array(acc) + mask[mask > 0] = 0 + mask[mask < 0] = 1 + + bt = np.round(np.array(bt), 2).tolist() + mask2 = np.array(bt) + mask2[mask2 > 0] = 0 + mask2[mask2 < 0] = 1 + + mask3 = np.array(b1) + mask3[mask3 > 0] = 0 + mask3[mask3 < 0] = 1 + + mask4 = np.array(b2) + mask4[mask4 > 0] = 0 + mask4[mask4 < 0] = 1 + + fig, ax = plt.subplots(2, 2, figsize=(15, 14)) + + linewidths = 0.5 + sns.set(font_scale=3) + sns.heatmap( + data=acc, + vmax=99, + vmin=93, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".2f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'bottom'}, + mask=mask, + square=True, linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .5}, + ax=ax[0, 0] + ) + + sns.heatmap( + data=bt, + # vmax=, + vmin=-9, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".2f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'top'}, + mask=mask2, + square=True, linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .5}, + ax=ax[0, 1] + ) + + sns.heatmap( + data=b1, + vmax=17000, + vmin=15000, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".0f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'top'}, + mask=mask4, + square=True, linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .5}, + ax=ax[1, 0] + ) + + sns.heatmap( + data=b2, + # vmax=, + # vmin=-9, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".0f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'top'}, + mask=mask4, + square=True, linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .5}, + ax=ax[1, 1] + ) + + plt.tight_layout() + plt.xlabel("U (epoch)", fontsize=set_font_size) + plt.ylabel("K (# models)", fontsize=set_font_size) + + for i in [0, 1]: + for j in [0, 1]: + ax[i, j].set_xticklabels(x_array, fontsize=set_font_size) + ax[i, j].set_yticklabels(y_array, fontsize=set_font_size) + ax[i, j].set_xlabel("U (# epoch)", fontsize=set_font_size) + ax[i, j].set_ylabel("K (# models)", fontsize=set_font_size) + + ax[0, 0].set_title('Test Accuracy (%)', fontsize=set_font_size) + ax[0, 1].set_title(r'Time Budget $T$ (min)', fontsize=set_font_size) + ax[1, 0].set_title(r'$N$', fontsize=set_font_size) + ax[1, 1].set_title(r"$K \cdot U \cdot \log_{\eta}K$", fontsize=set_font_size) + + plt.tight_layout() + fig.subplots_adjust(wspace=0.001, hspace=0.3) + + # plt.show() + base_dr = os.getcwd() + path_gra = os.path.join(base_dr, f"{img_name}.pdf") + fig.savefig(path_gra, bbox_inches='tight') + + +def draw_grid_graph_with_budget_only_Acc_and_T( + acc, bt, b1, b2, + img_name: str, y_array: list, x_array: list): + """ + :param acc: Two array list + :param bt: Two array list + :param img_name: img name string + :return: + """ + + acc_new = np.array(acc) + acc = acc_new.tolist() + + mask = np.array(acc) + mask[mask > 0] = 0 + mask[mask < 0] = 1 + + bt = np.round(np.array(bt), 2).tolist() + mask2 = np.array(bt) + mask2[mask2 > 0] = 0 + mask2[mask2 < 0] = 1 + + mask3 = np.array(b1) + mask3[mask3 > 0] = 0 + mask3[mask3 < 0] = 1 + + mask4 = np.array(b2) + mask4[mask4 > 0] = 0 + mask4[mask4 < 0] = 1 + + fig, ax = plt.subplots(1, 2, figsize=(15, 14)) + + linewidths = 0.5 + sns.set(font_scale=2) + sns.heatmap( + data=acc, + vmax=99, + vmin=93, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".2f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'bottom'}, + mask=mask, + square=True, + linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .4}, + ax=ax[0] + ) + + sns.heatmap( + data=bt, + vmax=600, + # vmin=-9, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".2f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'top'}, + mask=mask2, + square=True, + linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .4}, + ax=ax[1] + ) + + plt.tight_layout() + plt.xlabel("U (epoch)", fontsize=set_font_size) + plt.ylabel("K (# models)", fontsize=set_font_size) + + for j in [0, 1]: + ax[j].set_xticklabels(x_array, fontsize=set_font_size) + ax[j].set_yticklabels(y_array, fontsize=set_font_size) + ax[j].set_xlabel("U (# epoch)", fontsize=set_font_size) + ax[j].set_ylabel("K (# models)", fontsize=set_font_size) + + ax[0].set_title('Test Accuracy (%)', fontsize=set_font_size) + ax[1].set_title(r'Time Budget $T$ (min)', fontsize=set_font_size) + + plt.tight_layout() + fig.subplots_adjust(wspace=0.3, hspace=0.3) + + # plt.show() + base_dr = os.getcwd() + path_gra = os.path.join(base_dr, f"{img_name}.pdf") + fig.savefig(path_gra, bbox_inches='tight') + + +def draw_grid_graph_with_budget_only_Acc( + acc, bt, b1, b2, + img_name: str, y_array: list, x_array: list): + """ + :param acc: Two array list + :param bt: Two array list + :param img_name: img name string + :return: + """ + + acc_new = np.array(acc) + acc = acc_new.tolist() + + mask = np.array(acc) + mask[mask > 0] = 0 + mask[mask < 0] = 1 + + fig = plt.figure(figsize=(7, 14)) + + linewidths = 0.5 + sns.set(font_scale=2) + sns.heatmap( + data=acc, + vmax=99, + vmin=93, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".2f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'bottom'}, + mask=mask, + square=True, + linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .4}, + ax=fig + ) + + plt.tight_layout() + plt.xlabel("U (epoch)", fontsize=set_font_size) + plt.ylabel("K (# models)", fontsize=set_font_size) + + plt.xticks(x_array, fontsize=set_font_size) + plt.yticks(y_array, fontsize=set_font_size) + + plt.title('Test Accuracy (%)', fontsize=set_font_size) + plt.tight_layout() + # fig.subplots_adjust(wspace=0.3, hspace=0.3) + # plt.show() + base_dr = os.getcwd() + path_gra = os.path.join(base_dr, f"{img_name}.pdf") + fig.savefig(path_gra, bbox_inches='tight') + + +def draw_grid_graph_with_budget_only_T( + acc, bt, b1, b2, + img_name: str, y_array: list, x_array: list): + """ + :param acc: Two array list + :param bt: Two array list + :param img_name: img name string + :return: + """ + + acc_new = np.array(acc) + acc = acc_new.tolist() + + mask = np.array(acc) + mask[mask > 0] = 0 + mask[mask < 0] = 1 + + bt = np.round(np.array(bt), 2).tolist() + mask2 = np.array(bt) + mask2[mask2 > 0] = 0 + mask2[mask2 < 0] = 1 + + mask3 = np.array(b1) + mask3[mask3 > 0] = 0 + mask3[mask3 < 0] = 1 + + mask4 = np.array(b2) + mask4[mask4 > 0] = 0 + mask4[mask4 < 0] = 1 + + fig, ax = plt.subplots(1, 2, figsize=(15, 14)) + + linewidths = 0.5 + sns.set(font_scale=2) + sns.heatmap( + data=acc, + vmax=99, + vmin=93, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".2f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'bottom'}, + mask=mask, + square=True, + linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .4}, + ax=ax[0] + ) + + sns.heatmap( + data=bt, + vmax=600, + # vmin=-9, + cmap=palettable.cmocean.diverging.Curl_10.mpl_colors, + annot=True, + fmt=".2f", + annot_kws={'size': frontinsidebox, 'weight': 'normal', 'color': 'w', 'va': 'top'}, + mask=mask2, + square=True, + linewidths=linewidths, # 每个方格外框显示,外框宽度设置 + cbar_kws={"shrink": .4}, + ax=ax[1] + ) + + plt.tight_layout() + plt.xlabel("U (epoch)", fontsize=set_font_size) + plt.ylabel("K (# models)", fontsize=set_font_size) + + for j in [0, 1]: + ax[j].set_xticklabels(x_array, fontsize=set_font_size) + ax[j].set_yticklabels(y_array, fontsize=set_font_size) + ax[j].set_xlabel("U (# epoch)", fontsize=set_font_size) + ax[j].set_ylabel("K (# models)", fontsize=set_font_size) + + ax[0].set_title('Test Accuracy (%)', fontsize=set_font_size) + ax[1].set_title(r'Time Budget $T$ (min)', fontsize=set_font_size) + + plt.tight_layout() + fig.subplots_adjust(wspace=0.3, hspace=0.3) + + # plt.show() + base_dr = os.getcwd() + path_gra = os.path.join(base_dr, f"{img_name}.pdf") + fig.savefig(path_gra, bbox_inches='tight') diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py new file mode 100644 index 000000000..146fd36ba --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py @@ -0,0 +1,197 @@ +from typing import List + +import numpy as np +from matplotlib import pyplot as plt +from matplotlib.ticker import MaxNLocator +import warnings +import matplotlib.cbook + +warnings.filterwarnings("ignore", category=matplotlib.cbook.mplDeprecation) + +# lines' mark size +set_marker_size = 1 +# points' mark size +set_marker_point = 14 +# points' mark size +set_font_size = 20 +set_lgend_size = 15 +set_tick_size = 20 + +frontinsidebox = 23 + +# update tick size +matplotlib.rc('xtick', labelsize=set_tick_size) +matplotlib.rc('ytick', labelsize=set_tick_size) + +plt.rcParams['axes.labelsize'] = set_tick_size + +mark_list = ["o", "*", "<", "^", "s", "d", "D", ">", "h"] +mark_size_list = [set_marker_size, set_marker_size + 1, set_marker_size + 1, set_marker_size, + set_marker_size, set_marker_size, set_marker_size, set_marker_size + 1, set_marker_size + 2] +line_shape_list = ['-.', '--', '-', ':'] +shade_degree = 0.2 + + +def Add_one_line(x_time_array: list, y_twod_budget: List[List], namespace: str, index, ax): + # training-based + x_ = x_time_array + y_ = y_twod_budget + + if all(isinstance(item, list) for item in x_): + expx = np.array(x_) + x_m = np.quantile(expx, .5, axis=0) + else: + x_m = x_ + + exp = np.array(y_) + exp = np.where(exp > 10, exp, exp * 100) + + y_h = np.quantile(exp, .75, axis=0) + y_m = np.quantile(exp, .5, axis=0) + y_l = np.quantile(exp, .25, axis=0) + + ax.plot(x_m, y_m, + mark_list[int(index % len(mark_list))] + line_shape_list[int(index % len(line_shape_list))], + label=namespace, + markersize=mark_size_list[int(index % len(mark_list))], + linewidth=3 + ) + + ax.fill_between(x_m, y_l, y_h, alpha=shade_degree) + return x_m + + +def draw_structure_data_anytime( + all_lines: List, + dataset: str, name_img: str, max_value, + figure_size=(6.4, 4.5), + annotations=[], + x_ticks=None, y_ticks=None, unique_labels=None): + fig, ax = plt.subplots(figsize=figure_size) + + # draw all lines + time_usage = [] + for i, each_line_info in enumerate(all_lines): + _x_array = each_line_info[0] + _y_2d_array = each_line_info[1] + _name_space = each_line_info[2] + time_arr = Add_one_line(_x_array, _y_2d_array, _name_space, i, ax) + time_usage.append(time_arr) + + # print(f"speed-up on {dataset} = {time_usage[0][-1] / time_usage[2][-2]}, " + # f"t_train = {time_usage[0][-1]}, t_f = {time_usage[2][-2]}") + + # plt.xscale("log") + # plt.grid() + # plt.xlabel(r"Time Budget $T$ (min)", fontsize=set_font_size) + # plt.ylabel(f"AUC on {dataset.upper()}", fontsize=set_font_size) + + plt.xscale("log") + ax.grid() + ax.set_xlabel(r"Response Time Threshold $T_{max}$ (min)", fontsize=set_font_size) + ax.set_ylabel(f"AUC on {dataset.upper()}", fontsize=set_font_size) + # ax.set_xscale("log") + # ax.set_xlim(0.001, 10e4) + # ax.set_ylim(x1_lim[0], x1_lim[1]) + + if y_ticks is not None: + if y_ticks[0] is not None: + ax.set_ylim(bottom=y_ticks[0]) + if y_ticks[1] is not None: + ax.set_ylim(top=y_ticks[1]) + # ax.set_ylim(y_ticks[0], y_ticks[1]) + # ax.set_yticks(y_ticks) + # ax.set_yticklabels(y_ticks) + if x_ticks is not None: + if x_ticks[0] is not None: + ax.set_xlim(left=x_ticks[0]) + if x_ticks[1] is not None: + ax.set_xlim(right=x_ticks[1]) + + ax.yaxis.set_major_locator(MaxNLocator(nbins=6, integer=False)) + + if max_value > 0: + plt.axhline(max_value, color='r', linestyle='-', label='Global Best AUC') + + for i in range(len(annotations)): + ele = annotations[i] + ax.plot(ele[2], ele[1], mark_list[i], label=ele[0], markersize=set_marker_point) + + # export_legend(fig, filename="any_time_legend", unique_labels=["Training-Based MS", "Training-Free MS", "2Phase-MS", 'Global Best AUC']) + export_legend(ori_fig=fig, colnum=5, unique_labels=unique_labels) + plt.tight_layout() + + fig.savefig(f"{name_img}.pdf", bbox_inches='tight') + + +def export_legend(ori_fig, filename="any_time_legend", colnum=9, unique_labels=None): + if unique_labels is None: + unique_labels = [] + fig2 = plt.figure(figsize=(5, 0.3)) + lines_labels = [ax.get_legend_handles_labels() for ax in ori_fig.axes] + lines, labels = [sum(lol, []) for lol in zip(*lines_labels)] + # grab unique labels + if len(unique_labels) == 0: + unique_labels = set(labels) + # assign labels and legends in dict + legend_dict = dict(zip(labels, lines)) + # query dict based on unique labels + unique_lines = [legend_dict[x] for x in unique_labels] + fig2.legend(unique_lines, unique_labels, loc='center', + ncol=colnum, + fancybox=True, + shadow=True, scatterpoints=1, fontsize=set_lgend_size) + fig2.tight_layout() + fig2.savefig(f"{filename}.pdf", bbox_inches='tight') + + +import seaborn as sns +import matplotlib.pyplot as plt + + +def plot_heatmap(data: List, fontsize: int, + x_array_name: str, y_array_name: str, + title: str, output_file: str, + decimal_places: int, + u_ticks, k_ticks, + ): + labelsize = fontsize + # Convert the data to a NumPy array + data_array = np.array(data) + + # Custom annotation function + def custom_annot(val): + return "{:.{}f}".format(val, decimal_places) if val > 0 else "" + + # Convert the custom annotations to a 2D array + annot_array = np.vectorize(custom_annot)(data_array) + + # Create a masked array to hide the cells with values less than or equal to 0 + masked_data = np.ma.masked_array(data_array, data_array <= 0) + + # Set the figure size (width, height) in inches + fig, ax = plt.subplots(figsize=(8, 4)) + + # Use the "viridis" colormap + cmap = "viridis" + + # Create a heatmap + sns.heatmap(masked_data, annot=annot_array, fmt='', cmap=cmap, mask=masked_data.mask, ax=ax, + annot_kws={"size": fontsize, "ha": "center", "va": "center"}, + xticklabels=u_ticks, yticklabels=k_ticks) + + # Set axis labels + ax.set_xlabel(x_array_name, fontsize=fontsize) + ax.set_ylabel(y_array_name, fontsize=fontsize) + + # Set x/y-axis tick size + ax.tick_params(axis='both', which='major', labelsize=labelsize) + + # Set the title + # ax.set_title(title, fontsize=fontsize) + + # Set tight layout + plt.tight_layout() + + # Save the plot to a PDF file + plt.savefig(output_file) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py new file mode 100644 index 000000000..eb0528b1b --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py @@ -0,0 +1,78 @@ +import calendar +import json +import os +import time +import traceback +from singa import device as singa_device +import numpy as np + +from exps.shared_args import parse_arguments + +if __name__ == "__main__": + + args = parse_arguments() + + # set the log name + gmt = time.gmtime() + ts = calendar.timegm(gmt) + + os.environ.setdefault("log_logger_folder_name", f"{args.log_folder}") + os.environ.setdefault("log_file_name", f"{args.log_name}_{args.dataset}_ep{args.epoch}_{ts}.log") + os.environ.setdefault("base_dir", args.base_dir) + + from src.logger import logger + from src.eva_engine.phase2.algo.trainer import ModelTrainer + from src.search_space.init_search_space import init_search_space + from src.dataset_utils.structure_data_loader import libsvm_dataloader + + search_space_ins = init_search_space(args) + search_space_ins.load() + + try: + # read the checkpoint + checkpoint_file_name = f"{args.result_dir}/train_config_tune_{args.dataset}_epo_{args.epoch}.json" + + # 1. data loader + train_loader, val_loader, test_loader = libsvm_dataloader( + args=args, + data_dir=os.path.join(args.base_dir, "data", "structure_data", args.dataset), + nfield=args.nfield, + batch_size=args.batch_size) + + # arch_id = "256-256-256-256" + arch_id = "128-128-128-128" + print(f"begin to train the {arch_id}") + + model = search_space_ins.new_architecture(arch_id) + # model.init_embedding(requires_grad=True) + if args.device == 'cpu': + dev = singa_device.get_default_device() + else: # GPU + dev = singa_device.create_cuda_gpu_on(args.local_rank) # need to change to CPU device for CPU-only machines + dev.SetRandSeed(0) + np.random.seed(0) + # model.to(args.device) + + valid_auc, total_run_time, train_log = ModelTrainer.fully_train_arch( + model=model, + use_test_acc=False, + epoch_num=args.epoch, + train_loader=train_loader, + val_loader=val_loader, + test_loader=test_loader, + args=args) + + logger.info(f' ----- model id: {arch_id}, Val_AUC : {valid_auc} Total running time: ' + f'{total_run_time}-----') + print(f' ----- model id: {arch_id}, Val_AUC : {valid_auc} Total running time: ' + f'{total_run_time}-----') + + # update the shared model eval res + logger.info(f" ---- info: {json.dumps({arch_id: train_log})}") + + print(f" ---- info: {json.dumps({arch_id: train_log})}") + + logger.info(f" Saving result to: {checkpoint_file_name}") + except: + print(traceback.format_exc()) + logger.info(traceback.format_exc()) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py new file mode 100644 index 000000000..be66279a4 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py @@ -0,0 +1,145 @@ +import argparse +import calendar +import json +import logging +import os +import time + +from exps.shared_args import parse_arguments + + +def partition_list_by_worker_id(lst, num_workers=15): + partitions = [] + for i in range(num_workers): + partitions.append([]) + for idx, item in enumerate(lst): + worker_id = idx % num_workers + partitions[worker_id].append(item) + return partitions + + +def start_one_worker(queue, args, worker_id, my_partition, search_space_ins, res): + from src.tools.io_tools import write_json, read_json + gmt = time.gmtime() + ts = calendar.timegm(gmt) + + os.environ.setdefault("log_file_name", f"{args.log_name}_{args.dataset}_wkid_{worker_id}_{ts}.log") + # import logging + logger = logging.getLogger(f"{args.dataset}_wkid_{worker_id}_{ts}") + if not os.path.exists(f"./{args.log_folder}"): + os.makedirs(f"./{args.log_folder}") + handler = logging.FileHandler(f"./{args.log_folder}/{args.log_name}_{args.dataset}_wkid_{worker_id}_{ts}.log") + formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + handler.setFormatter(formatter) + logger.addHandler(handler) + from src.eva_engine.phase2.algo.trainer import ModelTrainer + + if args.total_models_per_worker is None: + logger.info( + f" ---- begin exploring, current worker have " + f"{len(my_partition)} models. explore all those models ") + else: + logger.info(f" ---- begin exploring, current worker have " + f"{len(my_partition)} models. but explore {args.total_models_per_worker} models ") + + train_loader, val_loader, test_loader = queue.get() + + checkpoint_file_name = f"./base_line_res_{args.dataset}/train_baseline_{args.dataset}_wkid_{worker_id}.json" + visited = read_json(checkpoint_file_name) + if visited == {}: + visited = {args.dataset: {}} + logger.info(f" ---- initialize checkpointing with {visited} . ") + else: + logger.info(f" ---- recovery from checkpointing with {len(visited[args.dataset])} model. ") + + explored_arch_num = 0 + for arch_index in my_partition: + print(f"begin to train the {arch_index}") + model = search_space_ins.new_architecture(res[arch_index]).to(args.device) + valid_auc, total_run_time, train_log = ModelTrainer.fully_train_arch( + model=model, + use_test_acc=False, + epoch_num=args.epoch, + train_loader=train_loader, + val_loader=val_loader, + test_loader=test_loader, + args=args, logger=logger) + + logger.info(f' ----- model id: {res[arch_index]}, Val_AUC : {valid_auc} Total running time: ' + f'{total_run_time}-----') + + # update the shared model eval res + logger.info(f" ---- exploring {explored_arch_num} model. ") + logger.info(f" ---- info: {json.dumps({res[arch_index]: train_log})}") + visited[args.dataset][res[arch_index]] = train_log + explored_arch_num += 1 + + if args.total_models_per_worker is not None and explored_arch_num > args.total_models_per_worker: + break + + logger.info(f" Saving result to: {checkpoint_file_name}") + write_json(checkpoint_file_name, visited) + + +if __name__ == "__main__": + mp.set_start_method('spawn', force=True) + args = parse_arguments() + + # set the log name + gmt = time.gmtime() + ts = calendar.timegm(gmt) + + os.environ.setdefault("log_file_name", f"{args.log_name}_{args.dataset}_main_{ts}.log") + os.environ.setdefault("base_dir", args.base_dir) + + from src.search_space.init_search_space import init_search_space + from src.dataset_utils.structure_data_loader import libsvm_dataloader + from src.tools.io_tools import write_json, read_json + import torch.multiprocessing as mp + + search_space_ins = init_search_space(args) + search_space_ins.load() + + # 1. main process partition data and group results, + res = read_json(args.pre_partitioned_file) + + total_workers = args.worker_each_gpu * args.gpu_num + all_partition = partition_list_by_worker_id(list(res.keys()), total_workers) + + train_loader, val_loader, test_loader = libsvm_dataloader( + args=args, + data_dir=os.path.join(args.base_dir, "data", "structure_data", args.dataset), + nfield=args.nfield, + batch_size=args.batch_size) + + # 2. put the shared dataloader into the queue, + queue = mp.Queue() + + # 3. Create a list of processes to train the models + processes = [] + worker_id = 0 + for gpu_id in range(args.gpu_num): + for _ in range(args.worker_each_gpu): + if args.device != "cpu": + args.device = f"cuda:{gpu_id}" + print(f"running process {[args.device, worker_id, len(all_partition[worker_id])]}") + p = mp.Process( + target=start_one_worker, + args=(queue, args, worker_id, all_partition[worker_id], search_space_ins, res, + ) + ) + p.start() + processes.append(p) + worker_id += 1 + + # 4. send to the queue + for gpu_id in range(args.gpu_num): + for _ in range(args.worker_each_gpu): + print("putting to queue ....") + queue.put((train_loader, val_loader, test_loader)) + + print("All processing are running, waiting all to finish....") + for p in processes: + p.join() + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py new file mode 100644 index 000000000..c36803a8d --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py @@ -0,0 +1,100 @@ +import calendar +import json +import os +import time + +from exps.shared_args import parse_arguments + + +def partition_list_by_worker_id(lst, num_workers=15): + partitions = [] + for i in range(num_workers): + partitions.append([]) + for idx, item in enumerate(lst): + worker_id = idx % num_workers + partitions[worker_id].append(item) + return partitions + + +if __name__ == "__main__": + + args = parse_arguments() + + # set the log name + gmt = time.gmtime() + ts = calendar.timegm(gmt) + + os.environ.setdefault("log_logger_folder_name", f"{args.log_folder}") + os.environ.setdefault("log_file_name", f"{args.log_name}_{args.dataset}_wkid_{args.worker_id}_{ts}.log") + os.environ.setdefault("base_dir", args.base_dir) + + from src.logger import logger + from src.eva_engine.phase2.algo.trainer import ModelTrainer + from src.search_space.init_search_space import init_search_space + from src.dataset_utils.structure_data_loader import libsvm_dataloader + from src.tools.io_tools import write_json, read_json + + search_space_ins = init_search_space(args) + search_space_ins.load() + + # 1. data loader + logger.info(f" Loading data....") + train_loader, val_loader, test_loader = libsvm_dataloader( + args=args, + data_dir=os.path.join(args.base_dir, "data", "structure_data", args.dataset), + nfield=args.nfield, + batch_size=args.batch_size) + + res = read_json(args.pre_partitioned_file) + + all_partition = partition_list_by_worker_id(list(res.keys()), args.total_workers) + + if args.total_models_per_worker == -1: + logger.info( + f" ---- begin exploring, current worker have " + f"{len(all_partition[args.worker_id])} models. explore all those models ") + else: + logger.info(f" ---- begin exploring, current worker have " + f"{len(all_partition[args.worker_id])} models. but explore {args.total_models_per_worker} models ") + + # read the checkpoint + checkpoint_file_name = f"{args.result_dir}/train_baseline_{args.dataset}_wkid_{args.worker_id}.json" + visited = read_json(checkpoint_file_name) + if visited == {}: + visited = {args.dataset: {}} + logger.info(f" ---- initialize checkpointing with {visited} . ") + else: + logger.info(f" ---- recovery from checkpointing with {len(visited[args.dataset])} model. ") + + explored_arch_num = 0 + for arch_index in all_partition[args.worker_id]: + print(f"begin to train the {arch_index}") + if res[arch_index] in visited[args.dataset]: + logger.info(f" ---- model {res[arch_index]} already visited") + continue + model = search_space_ins.new_architecture(res[arch_index]) + model.init_embedding(requires_grad=True) + model.to(args.device) + valid_auc, total_run_time, train_log = ModelTrainer.fully_train_arch( + model=model, + use_test_acc=False, + epoch_num=args.epoch, + train_loader=train_loader, + val_loader=val_loader, + test_loader=test_loader, + args=args) + + logger.info(f' ----- model id: {res[arch_index]}, Val_AUC : {valid_auc} Total running time: ' + f'{total_run_time}-----') + + # update the shared model eval res + logger.info(f" ---- exploring {explored_arch_num} model. ") + logger.info(f" ---- info: {json.dumps({res[arch_index]: train_log})}") + visited[args.dataset][res[arch_index]] = train_log + explored_arch_num += 1 + + if args.total_models_per_worker != -1 and explored_arch_num > args.total_models_per_worker: + break + + logger.info(f" Saving result to: {checkpoint_file_name}") + write_json(checkpoint_file_name, visited) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py new file mode 100644 index 000000000..64226d9b9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py @@ -0,0 +1,116 @@ +import calendar +import json +import os +import random +import time +from exps.shared_args import parse_arguments +from datetime import datetime +import gc + +# import tracemalloc +# tracemalloc.start() +# +# +# def print_memory_usg(): +# snapshot = tracemalloc.take_snapshot() +# top_stats = snapshot.statistics('lineno') +# for stat in top_stats[:10]: # top 10 memory-consuming lines +# print(stat) + + +def generate_data_loader(): + if args.dataset in [Config.c10, Config.c100, Config.imgNet]: + train_loader, val_loader, class_num = dataset.get_dataloader( + train_batch_size=args.batch_size, + test_batch_size=args.batch_size, + dataset=args.dataset, + num_workers=1, + datadir=os.path.join(args.base_dir, "data")) + test_loader = val_loader + else: + train_loader, val_loader, test_loader = libsvm_dataloader( + args=args, + data_dir=os.path.join(args.base_dir, "data", "structure_data", args.dataset), + nfield=args.nfield, + batch_size=args.batch_size) + class_num = args.num_labels + + return train_loader, val_loader, test_loader, class_num + + +if __name__ == "__main__": + args = parse_arguments() + + # set the log name + gmt = time.gmtime() + ts = calendar.timegm(gmt) + os.environ.setdefault("log_logger_folder_name", f"{args.log_folder}") + os.environ.setdefault("log_file_name", args.log_name + "_" + str(ts) + ".log") + os.environ.setdefault("base_dir", args.base_dir) + + from src.common.constant import Config + from src.common.structure import ModelAcquireData + from src.controller.sampler_all.seq_sampler import SequenceSampler + from src.eva_engine.phase1.evaluator import P1Evaluator + from src.logger import logger + from src.search_space.init_search_space import init_search_space + from src.dataset_utils.structure_data_loader import libsvm_dataloader + from src.tools.io_tools import write_json, read_json + from src.dataset_utils import dataset + from src.common.constant import Config, CommonVars + + search_space_ins = init_search_space(args) + + train_loader, val_loader, test_loader, class_num = generate_data_loader() + + _evaluator = P1Evaluator(device=args.device, + num_label=args.num_labels, + dataset_name=args.dataset, + search_space_ins=search_space_ins, + train_loader=train_loader, + is_simulate=False, + metrics=args.tfmem, + enable_cache=args.embedding_cache_filtering) + + sampler = SequenceSampler(search_space_ins) + + explored_n = 0 + output_file = f"{args.result_dir}/score_{args.search_space}_{args.dataset}_batch_size_{args.batch_size}_{args.device}.json" + result = read_json(output_file) + print(f"begin to score all, currently we already explored {len(result.keys())}") + logger.info(f"begin to score all, currently we already explored {len(result.keys())}") + while True: + arch_id, arch_micro = sampler.sample_next_arch() + if arch_id is None: + logger.info("Stop exploring, meet None arch id") + break + if arch_id in result: + continue + if args.models_explore != -1 and explored_n > args.models_explore: + logger.info(f"Stop exploring, {explored_n} > {args.models_explore}") + break + # run the model selection + model_encoding = search_space_ins.serialize_model_encoding(arch_micro) + model_acquire_data = ModelAcquireData(model_id=arch_id, + model_encoding=model_encoding, + is_last=False) + data_str = model_acquire_data.serialize_model() + model_score = _evaluator.p1_evaluate(data_str) + explored_n += 1 + result[arch_id] = model_score + # print(f" {datetime.now()} finish arch = {arch_id}, model_score = {model_score}") + if explored_n % 1000 == 0: + # print_memory_usg() + # _evaluator.force_gc() + print("3. [trails] Phase 1: filter phase explored " + str(explored_n) + + "Total explored " + str(len(result)) + + " model, model_id = " + str(arch_id) + + " model_scores = " + json.dumps(model_score)) + if explored_n % 1000 == 0: + # print_memory_usg() + # _evaluator.force_gc() + logger.info("3. [trails] Phase 1: filter phase explored " + str(explored_n) + + " model, model_id = " + str(arch_id) + + " model_scores = " + json.dumps(model_score)) + write_json(output_file, result) + write_json(output_file, result) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py new file mode 100644 index 000000000..bb11058e6 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py @@ -0,0 +1,119 @@ + +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +import os +from src.tools.io_tools import read_json + +# lines' mark size +set_marker_size = 15 +# points' mark size +set_marker_point = 14 +# points' mark size +set_font_size = 25 +set_lgend_size = 15 +set_tick_size = 20 + +frontinsidebox = 23 + +# update tick size +matplotlib.rc('xtick', labelsize=set_tick_size) +matplotlib.rc('ytick', labelsize=set_tick_size) + +plt.rcParams['axes.labelsize'] = set_tick_size + +mark_list = ["o", "*", "<", "^", "s", "d", "D", ">", "h"] +mark_size_list = [set_marker_size, set_marker_size + 1, set_marker_size + 1, set_marker_size, + set_marker_size, set_marker_size, set_marker_size, set_marker_size + 1, set_marker_size + 2] +line_shape_list = ['-.', '--', '-', ':'] +shade_degree = 0.2 +base_dir = "../exp_data/" + + +def export_legend(ori_fig, filename="any_time_legend", colnum=9, unique_labels=None): + if unique_labels is None: + unique_labels = [] + fig2 = plt.figure(figsize=(5, 0.3)) + lines_labels = [ax.get_legend_handles_labels() for ax in ori_fig.axes] + lines, labels = [sum(lol, []) for lol in zip(*lines_labels)] + # grab unique labels + if len(unique_labels) == 0: + unique_labels = set(labels) + # assign labels and legends in dict + legend_dict = dict(zip(labels, lines)) + # query dict based on unique labels + unique_lines = [legend_dict[x] for x in unique_labels] + fig2.legend(unique_lines, unique_labels, loc='center', + ncol=colnum, + fancybox=True, + shadow=True, scatterpoints=1, fontsize=set_lgend_size) + fig2.tight_layout() + fig2.savefig(f"{filename}.pdf", bbox_inches='tight') + + +def draw_edcf(): + # extract train_auc and valid_auc into separate lists + for dataset, architectures in data_dict.items(): + + fig, ax = plt.subplots(figsize=(6.4, 3.5)) + print(dataset) + train_auc = [] + valid_auc = [] + for architecture, epochs in architectures.items(): + for epoch, metrics in epochs.items(): + if str(epoch_sampled[dataset]) == epoch: + train_auc.append(metrics["train_auc"]) + valid_auc.append(metrics["valid_auc"]) + break + + # calculate and plot ECDF for train_auc + sorted_train_auc = np.sort(train_auc) + y_train = np.arange(1, len(sorted_train_auc) + 1) / len(sorted_train_auc) + plt.plot(sorted_train_auc, y_train, label='Training AUC', linewidth=3, linestyle='--') + + # calculate and plot ECDF for valid_auc + sorted_valid_auc = np.sort(valid_auc) + y_valid = np.arange(1, len(sorted_valid_auc) + 1) / len(sorted_valid_auc) + plt.plot(sorted_valid_auc, y_valid, label='Validation AUC', linewidth=3, linestyle='-') + + y_m = np.quantile(sorted_valid_auc, .5, axis=0) + print("medium", y_m, "best", max(sorted_valid_auc)) + # plt.xlim(left=0.45) + + plt.grid() + plt.xlabel('Accuracy') + plt.ylabel('ECDF') + # plt.legend(loc='upper left', fontsize=set_lgend_size) + plt.tight_layout() + export_legend(ori_fig=fig, colnum=5) + fig.savefig(f"space_{dataset}.pdf", bbox_inches='tight') + + +# dataset_used = "frappe" +dataset_used = "uci_diabetes" +# dataset_used = "criteo" + + +epoch_sampled = {"frappe": 19, "uci_diabetes": 35, "criteo": 9} + +if dataset_used == "frappe": + mlp_train_frappe = os.path.join( + base_dir, + "tab_data/frappe/all_train_baseline_frappe.json") + data_dict = read_json(mlp_train_frappe) +elif dataset_used == "uci_diabetes": + mlp_train_uci_diabetes = os.path.join( + base_dir, + "tab_data/uci_diabetes/all_train_baseline_uci_160k_40epoch.json") + + data_dict = read_json(mlp_train_uci_diabetes) +elif dataset_used == "criteo": + mlp_train_criteo = os.path.join( + base_dir, + "tab_data/criteo/all_train_baseline_criteo.json") + + data_dict = read_json(mlp_train_criteo) +else: + print("err") + +draw_edcf() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py new file mode 100644 index 000000000..327b66577 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py @@ -0,0 +1,126 @@ +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +import os +from src.tools.io_tools import read_json + +# lines' mark size +set_marker_size = 15 +# points' mark size +set_marker_point = 14 +# points' mark size +set_font_size = 25 +set_lgend_size = 15 +set_tick_size = 20 +import matplotlib.ticker as ticker + +frontinsidebox = 23 + +# update tick size +matplotlib.rc('xtick', labelsize=set_tick_size) +matplotlib.rc('ytick', labelsize=set_tick_size) + +plt.rcParams['axes.labelsize'] = set_tick_size + +mark_list = ["o", "*", "<", "^", "s", "d", "D", ">", "h"] +mark_size_list = [set_marker_size, set_marker_size + 1, set_marker_size + 1, set_marker_size, + set_marker_size, set_marker_size, set_marker_size, set_marker_size + 1, set_marker_size + 2] +line_shape_list = ['-.', '--', '-', ':'] +shade_degree = 0.2 +base_dir = "../exp_data/" + + +def export_legend(ori_fig, filename="any_time_legend", colnum=9, unique_labels=None): + if unique_labels is None: + unique_labels = [] + fig2 = plt.figure(figsize=(5, 0.3)) + lines_labels = [ax.get_legend_handles_labels() for ax in ori_fig.axes] + lines, labels = [sum(lol, []) for lol in zip(*lines_labels)] + # grab unique labels + if len(unique_labels) == 0: + unique_labels = set(labels) + # assign labels and legends in dict + legend_dict = dict(zip(labels, lines)) + # query dict based on unique labels + unique_lines = [legend_dict[x] for x in unique_labels] + fig2.legend(unique_lines, unique_labels, loc='center', + ncol=colnum, + fancybox=True, + shadow=True, scatterpoints=1, fontsize=set_lgend_size) + fig2.tight_layout() + fig2.savefig(f"{filename}.pdf", bbox_inches='tight') + + +# Function to compute number of parameters for an architecture +def compute_params(architecture): + layers = [int(layer) for layer in architecture.split('-')] + params = 0 + for i in range(len(layers) - 1): + params += layers[i] * layers[i + 1] + # Add bias terms + params += sum(layers[1:]) + return params + + +# Function to convert large number into a string with 'k' for thousands +def func(x, pos): # formatter function takes tick label and tick position + if x == 0: + return f"0" + else: + s = f'{x / 1000000}M' + return s + + +def draw_parameter_performance(): + # extract train_auc and valid_auc into separate lists + for dataset, architectures in data_dict.items(): + fig, ax = plt.subplots(figsize=(6.4, 4)) + print(dataset) + param_sizes = [] + valid_auc = [] + for architecture, epochs in architectures.items(): + for epoch, metrics in epochs.items(): + if str(epoch_sampled[dataset]) == epoch: + param_sizes.append(compute_params(architecture)) + valid_auc.append(metrics["valid_auc"]) + break + + plt.scatter(param_sizes, valid_auc) + y_format = ticker.FuncFormatter(func) + ax.xaxis.set_major_formatter(y_format) + plt.grid() + plt.xlabel('Parameter Size') + plt.ylabel('Validation AUC') + # plt.legend(loc='upper left', fontsize=set_lgend_size) + plt.tight_layout() + export_legend(ori_fig=fig, colnum=5) + fig.savefig(f"para_{dataset}.jpg", bbox_inches='tight') + + +dataset_used = "frappe" +# dataset_used = "uci_diabetes" +# dataset_used = "criteo" + +epoch_sampled = {"frappe": 19, "uci_diabetes": 35, "criteo": 9} + +if dataset_used == "frappe": + mlp_train_frappe = os.path.join( + base_dir, + "tab_data/frappe/all_train_baseline_frappe.json") + data_dict = read_json(mlp_train_frappe) +elif dataset_used == "uci_diabetes": + mlp_train_uci_diabetes = os.path.join( + base_dir, + "tab_data/uci_diabetes/all_train_baseline_uci_160k_40epoch.json") + + data_dict = read_json(mlp_train_uci_diabetes) +elif dataset_used == "criteo": + mlp_train_criteo = os.path.join( + base_dir, + "tab_data/criteo/all_train_baseline_criteo.json") + + data_dict = read_json(mlp_train_criteo) +else: + print("err") + +draw_parameter_performance() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/init_env b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/init_env new file mode 100644 index 000000000..b3204ea06 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/init_env @@ -0,0 +1,12 @@ + + + + +export PYTHONPATH=$PYTHONPATH:/project/TRAILS/internal/ml/model_selection +conda activate trails + + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py new file mode 100644 index 000000000..7b9e3f788 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py @@ -0,0 +1,60 @@ +# this is the main function of model selection. + +import calendar +import os +import time +from src.common.constant import Config +from src.dataset_utils.structure_data_loader import libsvm_dataloader +from exps.shared_args import parse_arguments + + +def generate_data_loader(): + if args.dataset in [Config.c10, Config.c100, Config.imgNet]: + train_loader, val_loader, class_num = dataset.get_dataloader( + train_batch_size=args.batch_size, + test_batch_size=args.batch_size, + dataset=args.dataset, + num_workers=1, + datadir=os.path.join(args.base_dir, "data")) + test_loader = val_loader + else: + train_loader, val_loader, test_loader = libsvm_dataloader( + args=args, + data_dir=os.path.join(args.base_dir, "data", "structure_data", args.dataset), + nfield=args.nfield, + batch_size=args.batch_size) + class_num = args.num_labels + + return train_loader, val_loader, test_loader, class_num + + +def run_with_time_budget(time_budget: float): + """ + :param time_budget: the given time budget, in second + :return: + """ + + # define dataLoader, and sample a mini-batch + train_loader, val_loader, test_loader, class_num = generate_data_loader() + args.num_labels = class_num + data_loader = [train_loader, val_loader, test_loader] + + rms = RunModelSelection(args.search_space, args, is_simulate=False) + best_arch, _, _, _, _, _, _, _ = rms.select_model_online(time_budget, data_loader) + + return best_arch + + +if __name__ == "__main__": + args = parse_arguments() + + # set the log name + gmt = time.gmtime() + ts = calendar.timegm(gmt) + os.environ.setdefault("log_file_name", args.log_name + "_" + str(ts) + ".log") + os.environ.setdefault("base_dir", args.base_dir) + + from src.eva_engine.run_ms import RunModelSelection + from src.dataset_utils import dataset + + run_with_time_budget(args.budget) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py new file mode 100644 index 000000000..9f9d1b4fe --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py @@ -0,0 +1,617 @@ +import calendar +import os +import time +import requests +import json +from typing import List, Dict +import traceback +import orjson +from argparse import Namespace +from shared_config import parse_config_arguments + + +def exception_catcher(func): + def wrapper(encoded_str: str): + try: + # each functon accepts a json string + params = json.loads(encoded_str) + config_file = params.get("config_file") + + # Parse the config file + args = parse_config_arguments(config_file) + + # Set the environment variables + ts = calendar.timegm(time.gmtime()) + os.environ.setdefault("base_dir", args.base_dir) + os.environ.setdefault("log_logger_folder_name", args.log_folder) + os.environ.setdefault("log_file_name", args.log_name + "_" + str(ts) + ".log") + + # Call the original function with the parsed parameters + return func(params, args) + except Exception as e: + return orjson.dumps( + {"Errored": traceback.format_exc()}).decode('utf-8') + + return wrapper + +from torch.utils.data import Dataset +import torch +class LibsvmDataset(Dataset): + """ Dataset loader for Libsvm data format """ + + @staticmethod + def decode_libsvm(columns): + map_func = lambda pair: (int(pair[0]), float(pair[1])) + id, value = zip(*map(lambda col: map_func(col.split(':')), columns[:-1])) + sample = {'id': torch.LongTensor(id), + 'value': torch.FloatTensor(value), + 'y': float(columns[-1])} + return sample + + @staticmethod + def pre_processing(mini_batch_data: List[Dict]): + sample_lines = len(mini_batch_data) + nfields = len(mini_batch_data[0].keys()) - 1 + feat_id = torch.LongTensor(sample_lines, nfields) + feat_value = torch.FloatTensor(sample_lines, nfields) + y = torch.FloatTensor(sample_lines) + + for i in range(sample_lines): + row_value = mini_batch_data[i].values() + sample = LibsvmDataset.decode_libsvm(list(row_value)) + feat_id[i] = sample['id'] + feat_value[i] = sample['value'] + y[i] = sample['y'] + return feat_id, feat_value, y, sample_lines + + def __init__(self, mini_batch_data: List[Dict]): + self.feat_id, self.feat_value, self.y, self.nsamples = \ + LibsvmDataset.pre_processing(mini_batch_data) + + def __len__(self): + return self.nsamples + + def __getitem__(self, idx): + return {'id': self.feat_id[idx], + 'value': self.feat_value[idx], + 'y': self.y[idx]} + + +def generate_dataloader(mini_batch_data, args): + from src.logger import logger + from torch.utils.data import DataLoader + logger.info(f"Begin to preprocessing dataset") + begin_time = time.time() + dataloader = DataLoader(LibsvmDataset(mini_batch_data), + batch_size=args.batch_size, + shuffle=True) + logger.info(f"Preprocessing dataset Done ! time_usage = {time.time() - begin_time}") + return dataloader + + +@exception_catcher +def model_selection(params: dict, args: Namespace): + from src.logger import logger + logger.info(f"begin run model_selection on UDF runtime with CPU only") + + mini_batch_data = json.loads(params["mini_batch"]) + budget = float(params["budget"]) + + from src.eva_engine.run_ms import RunModelSelection + + dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + + data_loader = [dataloader, dataloader, dataloader] + + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + best_arch, best_arch_performance, time_usage, _, p1_trace_highest_score, p1_trace_highest_scored_models_id = \ + rms.select_model_online_clean( + budget=budget, + data_loader=data_loader, + only_phase1=False, + run_workers=1) + + return orjson.dumps( + {"best_arch": best_arch, + "best_arch_performance": best_arch_performance, + "time_usage": time_usage}).decode('utf-8') + + +@exception_catcher +def profiling_filtering_phase(params: dict, args: Namespace): + from src.logger import logger + logger.info(f"begin run profiling_filtering_phase CPU only") + + mini_batch_m = params["mini_batch"] + + from src.eva_engine.run_ms import RunModelSelection + + logger.info(f"begin run filtering phase at {os.getcwd()}, with {mini_batch_m}") + + mini_batch_data = json.loads(mini_batch_m) + dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + data_loader = [dataloader, dataloader, dataloader] + + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + score_time_per_model = rms.profile_filtering(data_loader=data_loader) + + return orjson.dumps({"time": score_time_per_model}).decode('utf-8') + + +@exception_catcher +def profiling_refinement_phase(params: dict, args: Namespace): + from src.logger import logger + logger.info(f"begin run profiling_refinement_phase CPU only") + + mini_batch_m = params["mini_batch"] + + from src.eva_engine.run_ms import RunModelSelection + + mini_batch_data = json.loads(mini_batch_m) + + dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + data_loader = [dataloader, dataloader, dataloader] + + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + train_time_per_epoch = rms.profile_refinement(data_loader=data_loader) + + return orjson.dumps({"time": train_time_per_epoch}).decode('utf-8') + + +@exception_catcher +def coordinator(params: dict, args: Namespace): + from src.logger import logger + logger.info(f"begin run coordinator") + # print (f"begin run coordinator") + + budget = float(params["budget"]) + score_time_per_model = float(params["score_time_per_model"]) + train_time_per_epoch = float(params["train_time_per_epoch"]) + only_phase1 = True if params["only_phase1"].lower() == "true" else False + + from src.eva_engine.run_ms import RunModelSelection + + logger.info(f"coordinator params: budget={budget}, " + f"score_time_per_model={score_time_per_model}, " + f"train_time_per_epoch={train_time_per_epoch}, " + f"only_phase1={only_phase1}") + + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + K, U, N = rms.coordination( + budget=budget, + score_time_per_model=score_time_per_model, + train_time_per_epoch=train_time_per_epoch, + only_phase1=only_phase1) + + return orjson.dumps( + {"k": K, "u": U, "n": N}).decode('utf-8') + + +@exception_catcher +def filtering_phase(params: dict, args: Namespace): + from src.logger import logger + logger.info(f"begin run filtering_phase CPU only") + + # mini_batch_m = params["mini_batch"] + n = int(params["n"]) + k = int(params["k"]) + + from src.eva_engine.run_ms import RunModelSelection + + # mini_batch_data = json.loads(mini_batch_m) + # dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + k_models, _, _, _ = rms.filtering_phase(N=n, K=k) + + return orjson.dumps({"k_models": k_models}).decode('utf-8') + + +@exception_catcher +def filtering_phase_dataLoader(params: dict, args: Namespace): + from src.logger import logger + logger.info(f"begin run filtering_phase CPU only") + # print (f"begin run filtering_phase CPU only") + + mini_batch_m = params["mini_batch"] + # print ("mini_batch_m: ", mini_batch_m) + + + n = int(params["n"]) + k = int(params["k"]) + + from src.eva_engine.run_ms import RunModelSelection + + mini_batch_data = json.loads(mini_batch_m) + dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + k_models, _, _, _ = rms.filtering_phase(N=n, K=k, train_loader=dataloader) + + return orjson.dumps({"k_models": k_models}).decode('utf-8') + + +@exception_catcher +def refinement_phase(params: dict, args: Namespace): + mini_batch_m = params["mini_batch"] + return orjson.dumps( + {"k_models": "k_models"}).decode('utf-8') + + +@exception_catcher +def model_selection_workloads(params: dict, args: Namespace): + """ + Run filtering (explore N models) and refinement phase (refine K models) for benchmarking latency. + """ + + mini_batch_m = params["mini_batch"] + n = int(params["n"]) + k = int(params["k"]) + + from src.logger import logger + logger.info(f"begin run model_selection_workloads on CPU only, explore N={n} and K={k}") + + from src.eva_engine.run_ms import RunModelSelection + + mini_batch_data = json.loads(mini_batch_m) + dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + k_models, _, _, _ = rms.filtering_phase(N=n, K=k, train_loader=dataloader) + best_arch, best_arch_performance, _ = rms.refinement_phase( + U=1, + k_models=k_models, + train_loader=dataloader, + valid_loader=dataloader) + + return orjson.dumps( + {"best_arch": best_arch, + "best_arch_performance": best_arch_performance, + }).decode('utf-8') + + +@exception_catcher +def test_io(params: dict, args: Namespace): + return orjson.dumps({"inputs are": json.dumps(params)}).decode('utf-8') + + +@exception_catcher +def model_selection_trails(params: dict, args: Namespace): + from src.logger import logger + logger.info(f"begin run model_selection_trails CPU + GPU") + + mini_batch_data = json.loads(params["mini_batch"]) + budget = float(params["budget"]) + + # 1. launch cache service + columns = list(mini_batch_data[0].keys()) + requests.post(args.cache_svc_url, + json={'columns': columns, 'name_space': "train", 'table_name': "dummy", + "batch_size": len(mini_batch_data)}) + requests.post(args.cache_svc_url, + json={'columns': columns, 'name_space': "valid", 'table_name': "dummy", + "batch_size": len(mini_batch_data)}) + + from src.eva_engine.run_ms import RunModelSelection + + # 2. profiling & coordination + dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + data_loader = [dataloader, dataloader, dataloader] + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + + begin_time = time.time() + score_time_per_model = rms.profile_filtering(data_loader) + train_time_per_epoch = rms.profile_refinement(data_loader) + K, U, N = rms.coordination(budget, score_time_per_model, train_time_per_epoch, False) + + # 3. filtering + k_models, all_models, p1_trace_highest_score, p1_trace_highest_scored_models_id = rms.filtering_phase( + N, K, train_loader=data_loader[0]) + + # 4. Run refinement pahse + data = {'u': 1, 'k_models': k_models, "table_name": "dummy", "config_file": args.config_file} + response = requests.post(args.refinement_url, json=data).json() + + best_arch, best_arch_performance = response["best_arch"], response["best_arch_performance"] + + end_time = time.time() + real_time_usage = end_time - begin_time + + return orjson.dumps( + {"best_arch": best_arch, + "best_arch_performance": best_arch_performance, + "time_usage": real_time_usage}).decode('utf-8') + + +@exception_catcher +def model_selection_trails_workloads(params: dict, args: Namespace): + """ + Run filtering (explore N models) and refinement phase (refine K models) for benchmarking latency. + """ + + begin_time = time.time() + mini_batch_data = json.loads(params["mini_batch"]) + n = int(params["n"]) + k = int(params["k"]) + + # 1. launch cache service, for both train and valid. + # todo: use real data table or others + columns = list(mini_batch_data[0].keys()) + requests.post(args.cache_svc_url, + json={'columns': columns, 'name_space': "train", 'table_name': "dummy", + "batch_size": len(mini_batch_data)}) + requests.post(args.cache_svc_url, + json={'columns': columns, 'name_space': "valid", 'table_name': "dummy", + "batch_size": len(mini_batch_data)}) + + from src.logger import logger + logger.info(f"begin run model_selection_trails_workloads CPU + GPU, explore N={n} and K={k}") + + from src.eva_engine.run_ms import RunModelSelection + + # 2. filtering + dataloader = generate_dataloader(mini_batch_data=mini_batch_data, args=args) + rms = RunModelSelection(args.search_space, args, is_simulate=args.is_simulate) + k_models, _, _, _ = rms.filtering_phase(N=n, K=k, train_loader=dataloader) + + # 3. Run refinement pahse + data = {'u': 1, 'k_models': k_models, "table_name": "dummy", "config_file": args.config_file} + response = requests.post(args.refinement_url, json=data).json() + best_arch, best_arch_performance = response["best_arch"], response["best_arch_performance"] + real_time_usage = time.time() - begin_time + + return orjson.dumps( + {"best_arch": best_arch, + "best_arch_performance": best_arch_performance, + "time_usage": real_time_usage + }).decode('utf-8') + + +# benchmarking code here +@exception_catcher +def benchmark_filtering_phase_latency(params: dict, args: Namespace): + from src.logger import logger + from src.common.structure import ModelAcquireData + from src.controller.sampler_all.seq_sampler import SequenceSampler + from src.eva_engine.phase1.evaluator import P1Evaluator + from src.search_space.init_search_space import init_search_space + from src.tools.io_tools import write_json, read_json + from src.tools.res_measure import print_cpu_gpu_usage + import torch + logger.info(f"begin run filtering_phase CPU only") + + args.models_explore = int(params["explore_models"]) + + output_file = f"{args.result_dir}/score_{args.search_space}_{args.dataset}_batch_size_{args.batch_size}_{args.device}_{args.tfmem}.json" + time_output_file = f"{args.result_dir}/time_score_{args.search_space}_{args.dataset}_batch_size_{args.batch_size}_{args.device}_{args.tfmem}.json" + res_output_file = f"{args.result_dir}/resource_score_{args.search_space}_{args.dataset}_batch_size_{args.batch_size}_{args.device}_{args.tfmem}.json" + + # start the resource monitor + stop_event, thread = print_cpu_gpu_usage(interval=0.5, output_file=res_output_file) + + db_config = { + "db_name": args.db_name, + "db_user": args.db_user, + "db_host": args.db_host, + "db_port": args.db_port, + } + + search_space_ins = init_search_space(args) + _evaluator = P1Evaluator(device=args.device, + num_label=args.num_labels, + dataset_name=args.dataset, + search_space_ins=search_space_ins, + train_loader=None, + is_simulate=False, + metrics=args.tfmem, + enable_cache=args.embedding_cache_filtering, + db_config=db_config) + + sampler = SequenceSampler(search_space_ins) + explored_n = 0 + result = read_json(output_file) + print(f"begin to score all, currently we already explored {len(result.keys())}") + logger.info(f"begin to score all, currently we already explored {len(result.keys())}") + + while True: + arch_id, arch_micro = sampler.sample_next_arch() + if arch_id is None: + break + if arch_id in result: + continue + if explored_n > args.models_explore: + break + # run the model selection + model_encoding = search_space_ins.serialize_model_encoding(arch_micro) + model_acquire_data = ModelAcquireData(model_id=arch_id, + model_encoding=model_encoding, + is_last=False) + data_str = model_acquire_data.serialize_model() + model_score = _evaluator.p1_evaluate(data_str) + explored_n += 1 + result[arch_id] = model_score + if explored_n % 50 == 0: + logger.info(f"Evaluate {explored_n} models") + print(f"Evaluate {explored_n} models") + + if _evaluator.if_cuda_avaiable(): + torch.cuda.synchronize() + + # the first two are used for warming up + _evaluator.time_usage["io_latency"] = \ + sum(_evaluator.time_usage["track_io_model_load"][2:]) + \ + sum(_evaluator.time_usage["track_io_model_release_each_50"]) + \ + sum(_evaluator.time_usage["track_io_model_init"][2:]) + \ + sum(_evaluator.time_usage["track_io_res_load"][2:]) + \ + sum(_evaluator.time_usage["track_io_data_retrievel"][2:]) + \ + sum(_evaluator.time_usage["track_io_data_preprocess"][2:]) + + _evaluator.time_usage["compute_latency"] = sum(_evaluator.time_usage["track_compute"][2:]) + _evaluator.time_usage["latency"] = _evaluator.time_usage["io_latency"] + _evaluator.time_usage["compute_latency"] + + _evaluator.time_usage["avg_compute_latency"] = \ + _evaluator.time_usage["compute_latency"] \ + / len(_evaluator.time_usage["track_compute"][2:]) + + write_json(output_file, result) + # compute time + write_json(time_output_file, _evaluator.time_usage) + + # Then, at the end of your program, you can stop the thread: + print("Done, time sleep for 10 seconds") + # wait the resource montor flush + time.sleep(10) + stop_event.set() + thread.join() + + return orjson.dumps({"Write to": time_output_file}).decode('utf-8') + + +# Micro benchmarking filterting phaes +search_space_ins = None +_evaluator = None +sampler = None + + +@exception_catcher +def in_db_filtering_state_init(params: dict, args: Namespace): + global search_space_ins, _evaluator, sampler + from src.logger import logger + from src.controller.sampler_all.seq_sampler import SequenceSampler + from src.eva_engine.phase1.evaluator import P1Evaluator + from src.search_space.init_search_space import init_search_space + + db_config = { + "db_name": args.db_name, + "db_user": args.db_user, + "db_host": args.db_host, + "db_port": args.db_port, + } + + # init once + # params["eva_results"] == "null" means it a new job + if params["eva_results"] == "null" or (search_space_ins is None and _evaluator is None and sampler is None): + logger.info(f'New job = {params["eva_results"]}, search_space_ins = {search_space_ins}') + search_space_ins = init_search_space(args) + _evaluator = P1Evaluator(device=args.device, + num_label=args.num_labels, + dataset_name=params["dataset"], + search_space_ins=search_space_ins, + train_loader=None, + is_simulate=False, + metrics=args.tfmem, + enable_cache=args.embedding_cache_filtering, + db_config=db_config, + data_retrievel="spi") + sampler = SequenceSampler(search_space_ins) + + arch_id, arch_micro = sampler.sample_next_arch() + model_encoding = search_space_ins.serialize_model_encoding(arch_micro) + + return orjson.dumps({"model_encoding": model_encoding, "arch_id": arch_id}).decode('utf-8') + + +@exception_catcher +def in_db_filtering_evaluate(params: dict, args: Namespace): + global search_space_ins, _evaluator, sampler + from src.common.structure import ModelAcquireData + from src.logger import logger + try: + if search_space_ins is None and _evaluator is None and sampler is None: + logger.info("search_space_ins, _evaluator, sampler is None") + return orjson.dumps({"error": "erroed, plz call init first"}).decode('utf-8') + + sampled_result = json.loads(params["sample_result"]) + arch_id, model_encoding = str(sampled_result["arch_id"]), str(sampled_result["model_encoding"]) + + mini_batch = json.loads(params["mini_batch"]) + if mini_batch["status"] == "error": + return orjson.dumps({"error": mini_batch["message"]}).decode('utf-8') + logger.info(f"Begin evaluate {params['model_index']}, " + f"with size of batch = {len(mini_batch['data'])}, " + f"size of columns = {len(mini_batch['data'][0])}") + model_acquire_data = ModelAcquireData(model_id=arch_id, + model_encoding=model_encoding, + is_last=False, + spi_seconds=float(params["spi_seconds"]), + spi_mini_batch=mini_batch["data"], + ) + + model_score = _evaluator._p1_evaluate_online(model_acquire_data) + logger.info(f'Done evaluate {params["model_index"]}, ' + f'with {orjson.dumps({"index": params["model_index"], "score": model_score}).decode("utf-8")}') + except: + logger.info(orjson.dumps( + {"Errored": traceback.format_exc()}).decode('utf-8')) + + return orjson.dumps( + {"Errored": traceback.format_exc()}).decode('utf-8') + + return orjson.dumps({"index": params["model_index"], "score": model_score}).decode('utf-8') + + +@exception_catcher +def records_results(params: dict, args: Namespace): + global search_space_ins, _evaluator, sampler + from src.tools.io_tools import write_json + from src.logger import logger + + try: + time_output_file = f"{args.result_dir}/time_score_{args.search_space}_{params['dataset']}_batch_size_{args.batch_size}_{args.device}_{args.tfmem}.json" + _evaluator.time_usage["io_latency"] = \ + sum(_evaluator.time_usage["track_io_model_load"][2:]) + \ + sum(_evaluator.time_usage["track_io_model_release_each_50"]) + \ + sum(_evaluator.time_usage["track_io_model_init"][2:]) + \ + sum(_evaluator.time_usage["track_io_res_load"][2:]) + \ + sum(_evaluator.time_usage["track_io_data_retrievel"][2:]) + \ + sum(_evaluator.time_usage["track_io_data_preprocess"][2:]) + + _evaluator.time_usage["compute_latency"] = sum(_evaluator.time_usage["track_compute"][2:]) + _evaluator.time_usage["latency"] = _evaluator.time_usage["io_latency"] + _evaluator.time_usage[ + "compute_latency"] + + _evaluator.time_usage["avg_compute_latency"] = \ + _evaluator.time_usage["compute_latency"] \ + / len(_evaluator.time_usage["track_compute"][2:]) + + logger.info(f"Saving time usag to {time_output_file}") + # compute time + write_json(time_output_file, _evaluator.time_usage) + except: + logger.info(orjson.dumps( + {"Errored": traceback.format_exc()}).decode('utf-8')) + + return orjson.dumps( + {"Errored": traceback.format_exc()}).decode('utf-8') + + return orjson.dumps({"Done": 1}).decode('utf-8') + + +if __name__ == "__main__": + params = {} + params["budget"] = 10 + params["score_time_per_model"] = 0.0211558125 + params["train_time_per_epoch"] = 5.122203075885773 + params["only_phase1"] = 'true' + params["config_file"] = './internal/ml/model_selection/config.ini' + print(coordinator(json.dumps(params))) + + params = {} + params[ + "mini_batch"] = '[{"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}]' + params["n"] = 10 + params["k"] = 1 + params["config_file"] = './internal/ml/model_selection/config.ini' + print(filtering_phase_dataLoader(json.dumps(params))) + + # params = {} + # params[ + # "mini_batch"] = '[{"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}]' + # params["config_file"] = './internal/ml/model_selection/config.ini' + # print(profiling_refinement_phase(json.dumps(params))) + # + # params = {} + # params["budget"] = 10 + # params[ + # "mini_batch"] = '[{"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"1"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}, {"col1":"123:123","col2":"123:123","col3":"123:123","label":"0"}]' + # params["config_file"] = './internal/ml/model_selection/config.ini' + # print(model_selection(json.dumps(params))) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/requirement.txt b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/requirement.txt new file mode 100644 index 000000000..591daefa5 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/requirement.txt @@ -0,0 +1,54 @@ +aiofiles==23.1.0 +blessed==1.20.0 +certifi==2023.7.22 +charset-normalizer==3.2.0 +ConfigSpace==0.7.1 +contourpy==1.1.0 +cycler==0.11.0 +fonttools==4.41.0 +gpustat==1.1 +html5tagger==1.3.0 +httptools==0.6.0 +idna==3.4 +importlib-resources==6.0.0 +joblib==1.3.1 +kiwisolver==1.4.4 +matplotlib==3.7.2 +more-itertools==9.1.0 +multidict==6.0.4 +numpy==1.24.4 +nvidia-ml-py==12.535.77 +orjson==3.9.2 +packaging==23.1 +palettable==3.3.3 +pandas==2.0.3 +Pillow==10.0.0 +psutil==5.9.5 +psycopg2-binary==2.9.6 +pyparsing==3.0.9 +python-dateutil==2.8.2 +pytz==2023.3 +requests==2.31.0 +sanic==23.6.0 +sanic-routing==23.6.0 +scikit-learn==1.3.0 +scipy==1.10.1 +seaborn==0.12.2 +six==1.16.0 +sklearn==0.0 +thop @ git+https://github.com/Lyken17/pytorch-OpCounter.git@43c064afb71383501e41eaef9e8c8407265cf77f +threadpoolctl==3.1.0 +torch==1.8.1 +torchaudio==0.8.1 +torchinfo==1.8.0 +torchvision==0.9.1 +tqdm==4.47.0 +tracerite==1.1.0 +typing_extensions==4.7.1 +tzdata==2023.3 +ujson==5.8.0 +urllib3==2.0.4 +uvloop==0.17.0 +wcwidth==0.2.6 +websockets==11.0.3 +zipp==3.16.2 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh new file mode 100644 index 000000000..e54e823bc --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh @@ -0,0 +1,42 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + +############## c10 dataset ############## +# run both 2phase-MS and training-free MS +python internal/ml/model_selection/exps/macro/anytime_img.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar10 \ + --num_labels 10 \ + --base_dir ../exp_data/ \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## c100 dataset ############## +python internal/ml/model_selection/exps/macro/anytime_img.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar100 \ + --num_labels 100 \ + --base_dir ../exp_data/ \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## imageNet dataset ############## +python internal/ml/model_selection/exps/macro/anytime_img.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset ImageNet16-120 \ + --num_labels 120 \ + --base_dir ../exp_data/ \ + --result_dir ./internal/ml/model_selection/exp_result/ + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh new file mode 100644 index 000000000..9811b467f --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh @@ -0,0 +1,126 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + + +############## frappe dataset ############## + +# run the 2phase-MS +python internal/ml/model_selection/exps/macro/anytime_simulate.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --batch_size 128 \ + --nfeat 5500 \ + --nfield 10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset frappe \ + --num_labels 2 \ + --only_phase1 False \ + --is_simulate True \ + --device cpu \ + --log_folder any_time_frappe \ + --result_dir ./internal/ml/model_selection/exp_result/ \ + --num_points 5 + + +# run the training-free MS +python internal/ml/model_selection/exps/macro/anytime_simulate.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --batch_size 128 \ + --nfeat 5500 \ + --nfield 10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset frappe \ + --num_labels 2 \ + --only_phase1 True \ + --is_simulate True \ + --device cpu \ + --log_folder any_time_frappe \ + --result_dir ./internal/ml/model_selection/exp_result/ \ + --num_points 5 + + +############## uci dataset ############## + +# run the 2phase-MS +python internal/ml/model_selection/exps/macro/anytime_simulate.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --batch_size 128 \ + --nfeat 369 \ + --nfield 43 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset uci_diabetes \ + --num_labels 2 \ + --only_phase1 False \ + --is_simulate True \ + --device cpu \ + --log_folder any_time_uci_diabetes \ + --result_dir ./internal/ml/model_selection/exp_result/ \ + --num_points 5 + + +# run the training-free MS +python internal/ml/model_selection/exps/macro/anytime_simulate.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --batch_size 128 \ + --nfeat 369 \ + --nfield 43 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset uci_diabetes \ + --num_labels 2 \ + --only_phase1 True \ + --is_simulate True \ + --device cpu \ + --log_folder any_time_uci_diabetes \ + --result_dir ./internal/ml/model_selection/exp_result/ \ + --num_points 5 + + +############## criteo dataset ############## + +# run the 2phase-MS +python internal/ml/model_selection/exps/macro/anytime_simulate.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 10 \ + --batch_size 128 \ + --nfeat 2100000 \ + --nfield 39 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset criteo \ + --num_labels 2 \ + --only_phase1 False \ + --is_simulate True \ + --device cpu \ + --log_folder any_time_criteo \ + --result_dir ./internal/ml/model_selection/exp_result/ \ + --num_points 5 + + +# run the training-free MS +python internal/ml/model_selection/exps/macro/anytime_simulate.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 10 \ + --batch_size 128 \ + --nfeat 2100000 \ + --nfield 39 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset criteo \ + --num_labels 2 \ + --only_phase1 True \ + --is_simulate True \ + --device cpu \ + --log_folder any_time_criteo \ + --result_dir ./internal/ml/model_selection/exp_result/ \ + --num_points 5 + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh new file mode 100644 index 000000000..52467c9b7 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh @@ -0,0 +1,45 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + +# run both training-based MS +############## c10 dataset ############## +python internal/ml/model_selection/exps/baseline/train_with_ea.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar10 \ + --num_labels 10 \ + --base_dir ../exp_data/ \ + --log_folder log_baseline_c10 \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## c100 dataset ############## +python internal/ml/model_selection/exps/baseline/train_with_ea.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar100 \ + --num_labels 100 \ + --base_dir ../exp_data/ \ + --log_folder log_baseline_c100 \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## ImgNet dataset ############## +python internal/ml/model_selection/exps/baseline/train_with_ea.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset ImageNet16-120 \ + --num_labels 120 \ + --base_dir ../exp_data/ \ + --log_folder log_baseline_imgnet \ + --result_dir ./internal/ml/model_selection/exp_result/ + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh new file mode 100644 index 000000000..c1f6d1925 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh @@ -0,0 +1,67 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + +# run both training-based MS +############## frappe dataset ############## +python internal/ml/model_selection/exps/baseline/train_with_ea.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --epoch 19 \ + --batch_size=512 \ + --lr=0.001 \ + --iter_per_epoch=200 \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --base_dir ../exp_data/ \ + --dataset frappe \ + --num_labels 2 \ + --device=cpu \ + --log_folder baseline_frappe \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## uci dataset ############## +python internal/ml/model_selection/exps/baseline/train_with_ea.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --epoch 0 \ + --batch_size=1024 \ + --lr=0.001 \ + --iter_per_epoch=200 \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --base_dir ../exp_data/ \ + --dataset uci_diabetes \ + --num_labels 2 \ + --device=cpu \ + --log_folder baseline_uci_diabetes \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## criteo dataset ############## +python internal/ml/model_selection/exps/baseline/train_with_ea.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 10 \ + --epoch 9 \ + --batch_size=1024 \ + --lr=0.001 \ + --iter_per_epoch=2000 \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --base_dir ../exp_data/ \ + --dataset criteo \ + --num_labels 2 \ + --device=cpu \ + --log_folder baseline_criteo \ + --result_dir ./internal/ml/model_selection/exp_result/ + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh new file mode 100644 index 000000000..7b13ac8c1 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh @@ -0,0 +1,25 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +python ./internal/ml/model_selection/exps/micro/resp/benchmark_weight_sharing.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=512 \ + --lr=0.001 \ + --epoch=20 \ + --iter_per_epoch=200 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --log_folder=log_frappe \ + --total_models_per_worker=-1 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh new file mode 100644 index 000000000..b7555bbe7 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +# Check for proper number of command line args +if [[ $# -ne 2 ]]; then + echo "Usage: $0 " + exit 1 +fi + +# Configurations +DATA_PATH="$1" +DB_NAME="$2" + +# Connection details +HOST="localhost" +PORT="28814" +USERNAME="postgres" +DBNAME="pg_extension" + +# Create the database +echo "Creating database..." +createdb -h $HOST -p $PORT -U $USERNAME $DBNAME + +# Define datasets to process +datasets=("train" "valid" "test") + +# Loop over each dataset +for dataset in "${datasets[@]}"; do + rm "${DATA_PATH}/${dataset}.csv" + + # 1. Identify the number of columns + num_columns=$(awk 'NF > max { max = NF } END { print max }' "${DATA_PATH}/${dataset}.libsvm") + + # 2. Create the table dynamically + create_table_cmd="CREATE TABLE ${DB_NAME}_${dataset} (id SERIAL PRIMARY KEY, label INTEGER" + + for (( i=2; i<=$num_columns; i++ )); do + create_table_cmd+=", col$(($i-1)) TEXT" + done + create_table_cmd+=");" + + echo "Creating ${dataset} table..." + echo $create_table_cmd | psql -h $HOST -p $PORT -U $USERNAME -d $DBNAME + + # 3. Transform the libsvm format to CSV + echo "Transforming ${dataset} to CSV format..." + + awk '{ + for (i = 1; i <= NF; i++) { + printf "%s", $i; # print each field as-is + if (i < NF) { + printf " "; # if its not the last field, print a space + } + } + printf "\n"; # end of line + }' "${DATA_PATH}/${dataset}.libsvm" > "${DATA_PATH}/${dataset}.csv" + + # 4. Import into PostgreSQL + columns="label" + for (( i=2; i<=$num_columns; i++ )); do + columns+=", col$(($i-1))" + done + + echo "Loading ${dataset} into PostgreSQL..." + psql -h $HOST -p $PORT -U $USERNAME -d $DBNAME -c "\COPY ${DB_NAME}_${dataset}($columns) FROM '${DATA_PATH}/${dataset}.csv' DELIMITER ' '" +done + +echo "Data load complete." diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh new file mode 100644 index 000000000..29390b0bb --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh @@ -0,0 +1,122 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ + +#criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ + +########################## CPU ############################## +# this is run on cpu, only change the device==cpu for all above + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ + +#criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh new file mode 100644 index 000000000..993e8a2a8 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh @@ -0,0 +1,139 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + +########################## CPU ############################## +# this is run on cpu, only change the device==cpu for all above + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_concurrent.py \ + --concurrency=8 \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_current_filter_cache/ \ + --log_folder=log_score_time_frappe_cache + +#criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_concurrent.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_current_filter_cache/ \ + --log_folder=log_score_time_frappe_cache + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_concurrent.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_current_filter_cache/ \ + --log_folder=log_score_time_frappe_cache + + +# here is concurrent run but no embedding cache +####################################################################################### + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_concurrent.py \ + --tfmem=express_flow \ + --models_explore=5000 \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_current_filter_no_cache/ \ + --log_folder=log_score_time_frappe_cache + +#criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_concurrent.py \ + --tfmem=express_flow \ + --models_explore=5000 \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_current_filter_no_cache/ \ + --log_folder=log_score_time_frappe_cache + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_concurrent.py \ + --tfmem=express_flow \ + --models_explore=5000 \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_filter_exp_current_filter_no_cachecache/ \ + --log_folder=log_score_time_frappe_cache + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh new file mode 100644 index 000000000..c7c6a0be4 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh @@ -0,0 +1,211 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + +#criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + + +# cifar 10 +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=10 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=cifar10 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + + +# cifar 100 +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=100 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=cifar100 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + + +# imageNet +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=120 \ + --device=cuda:0 \ + --batch_size=32 \ + --dataset=ImageNet16-120 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + +########################## CPU ############################## +# this is run on cpu, only change the device==cpu for all above + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + +# criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + + +# cifar 10 +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=10 \ + --device=cpu \ + --batch_size=32 \ + --dataset=cifar10 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + + +# cifar 100 +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=100 \ + --device=cpu \ + --batch_size=32 \ + --dataset=cifar100 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ + + +# imageNet +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency.py \ + --embedding_cache_filtering=False \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=120 \ + --device=cpu \ + --batch_size=32 \ + --dataset=ImageNet16-120 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_wo_cache/ diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh new file mode 100644 index 000000000..608fd94b6 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh @@ -0,0 +1,61 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_sql.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_cache_sql/ + +#criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_sql.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_cache_sql/ + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_sql.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_cache_sql/ diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh new file mode 100644 index 000000000..608fd94b6 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh @@ -0,0 +1,61 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + + +# frappe +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_sql.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_cache_sql/ + +#criteo +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_sql.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_cache_sql/ + +# uci +python3 ./internal/ml/model_selection/exps/micro/benchmark_filtering_latency_sql.py \ + --embedding_cache_filtering=True \ + --tfmem=express_flow \ + --models_explore=5000 \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result_sever_cache_sql/ diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh new file mode 100644 index 000000000..33e9b9de5 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh @@ -0,0 +1,44 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + +############## c10 dataset ############## +# run both 2phase-MS and training-free MS +python internal/ml/model_selection/exps/micro/benchmark_budget_aware_alg.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --dataset cifar10 \ + --epoch 200 \ + --base_dir ../exp_data/ \ + --log_name logs_default \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## c100 dataset ############## +python internal/ml/model_selection/exps/micro/benchmark_budget_aware_alg.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --dataset cifar100 \ + --epoch 200 \ + --base_dir ../exp_data/ \ + --log_name logs_default \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## imageNet dataset ############## +python internal/ml/model_selection/exps/micro/benchmark_budget_aware_alg.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --dataset ImageNet16-120 \ + --epoch 200 \ + --base_dir ../exp_data/ \ + --log_name logs_default \ + --result_dir ./internal/ml/model_selection/exp_result/ + + + +############## draw graphs ############## +python internal/ml/model_selection/exps/micro/draw_budget_aware_alg.py diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh new file mode 100644 index 000000000..ad392f625 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh @@ -0,0 +1,163 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + + +# ==================================== +# ==================================== +# determine the K and U tradeoff +# ==================================== +# ==================================== +# frappe +python internal/ml/model_selection/exps/micro/benchmark_ku.py \ + --search_space mlp_sp \ + --epoch 20 \ + --hidden_choice_len 20 \ + --dataset frappe \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +# uci +python internal/ml/model_selection/exps/micro/benchmark_ku.py \ + --search_space mlp_sp \ + --hidden_choice_len 20 \ + --epoch 5 \ + --dataset uci_diabetes \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + +# criteo +python internal/ml/model_selection/exps/micro/benchmark_ku.py \ + --search_space mlp_sp \ + --hidden_choice_len 10 \ + --epoch 10 \ + --dataset criteo \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +# c10 +python internal/ml/model_selection/exps/micro/benchmark_ku.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar10 \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +# c100 +python internal/ml/model_selection/exps/micro/benchmark_ku.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar100 \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +# imageNet +python internal/ml/model_selection/exps/micro/benchmark_ku.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset ImageNet16-120 \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + + +# ==================================== +# ==================================== +# determine the K and U tradeoff +# ==================================== +# ==================================== + + +python internal/ml/model_selection/exps/micro/benchmark_nk.py \ + --search_space mlp_sp \ + --epoch 20 \ + --hidden_choice_len 20 \ + --dataset frappe \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +#uci +python internal/ml/model_selection/exps/micro/benchmark_nk.py \ + --search_space mlp_sp \ + --hidden_choice_len 20 \ + --epoch 5 \ + --dataset uci_diabetes \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +# criteo +python internal/ml/model_selection/exps/micro/benchmark_nk.py \ + --search_space mlp_sp \ + --hidden_choice_len 10 \ + --epoch 10 \ + --dataset criteo \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + + +# c10 +python internal/ml/model_selection/exps/micro/benchmark_nk.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar10 \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +# c100 +python internal/ml/model_selection/exps/micro/benchmark_nk.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset cifar100 \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + + +# imageNet +python internal/ml/model_selection/exps/micro/benchmark_nk.py \ + --search_space nasbench201 \ + --api_loc NAS-Bench-201-v1_1-096897.pth \ + --epoch 200 \ + --dataset ImageNet16-120 \ + --base_dir ../exp_data/ \ + --only_phase1 True \ + --is_simulate True \ + --log_folder log_ku_tradeoff + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh new file mode 100644 index 000000000..1593cfe08 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh @@ -0,0 +1,38 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + + +############## Frappe ############## +# run both 2phase-MS and training-free MS +python ./internal/ml/model_selection/exps/micro/benchmark_score_metrics.py \ + --tfmem=express_flow \ + --search_space mlp_sp \ + --dataset frappe \ + --base_dir ../exp_data/ \ + --log_name logs_default \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## criteo dataset ############## +python ./internal/ml/model_selection/exps/micro/benchmark_score_metrics.py \ + --tfmem=express_flow \ + --search_space mlp_sp \ + --dataset criteo \ + --base_dir ../exp_data/ \ + --log_name logs_default \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## Uci dataset ############## +python ./internal/ml/model_selection/exps/micro/benchmark_score_metrics.py \ + --tfmem=express_flow \ + --search_space=mlp_sp \ + --dataset uci_diabetes \ + --base_dir ../exp_data/ \ + --log_name logs_default \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +############## draw graphs ############## +python ./internal/ml/model_selection/exps/micro/draw_score_metric_relation.py diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh new file mode 100644 index 000000000..4bdb01129 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh @@ -0,0 +1,54 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + +# rs +python internal/ml/model_selection/exps/baseline/train_with_random.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --epoch 19 \ + --batch_size=512 \ + --lr=0.001 \ + --iter_per_epoch=200 \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --base_dir ../exp_data/ \ + --dataset frappe \ + --num_labels 2 \ + --device=cpu \ + --log_folder baseline_frappe \ + --result_dir ./internal/ml/model_selection/exp_result/ + + +# rl +python internal/ml/model_selection/exps/baseline/train_with_rl.py + + +# re +python internal/ml/model_selection/exps/baseline/train_with_ea.py \ + --search_space mlp_sp \ + --num_layers 4 \ + --hidden_choice_len 20 \ + --epoch 19 \ + --batch_size=512 \ + --lr=0.001 \ + --iter_per_epoch=200 \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --base_dir ../exp_data/ \ + --dataset frappe \ + --num_labels 2 \ + --device=cpu \ + --log_folder baseline_frappe \ + --result_dir ./internal/ml/model_selection/exp_result/ + +# bohb +python internal/ml/model_selection/exps/baseline/train_bohb.py + +############## draw the graph ############## +python internal/ml/model_selection/exps/baseline/draw_benchmark_train_based.py --dataset frappe + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh new file mode 100644 index 000000000..1c166f68f --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh @@ -0,0 +1,12 @@ + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +# pip install nats_bench + +python internal/ml/model_selection/exps/nas_bench_img/0_characterize_gt.py +python internal/ml/model_selection/exps/nas_bench_img/0_parse_testacc_101.py +python internal/ml/model_selection/exps/nas_bench_img/0_parse_testacc_201.py + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh new file mode 100644 index 000000000..d700c2baa --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh @@ -0,0 +1,60 @@ + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +# cifar10 + nb101 +python ./internal/ml/model_selection/exps/nas_bench_img/1_explore_models_100_run.py \ + --search_space=nasbench101 \ + --api_loc=nasbench_only108.pkl \ + --base_dir=../exp_data/ \ + --dataset=cifar10 \ + --num_labels=10 \ + --device=cpu \ + --log_folder=log_img_explore_ea \ + --result_dir=./internal/ml/model_selection/exp_result/ + + +# cifar10 + nb201 +python ./internal/ml/model_selection/exps/nas_bench_img/1_explore_models_100_run.py \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=../exp_data/ \ + --dataset=cifar10 \ + --init_channels=16 \ + --num_stacks=3 \ + --num_modules_per_stack=3 \ + --num_labels=10 \ + --device=cpu \ + --log_folder=log_img_explore_ea \ + --result_dir=./internal/ml/model_selection/exp_result/ + + +# cifar100 + nb201 +python ./internal/ml/model_selection/exps/nas_bench_img/1_explore_models_100_run.py \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=../exp_data/ \ + --dataset=cifar100 \ + --init_channels=16 \ + --num_stacks=3 \ + --num_modules_per_stack=3 \ + --num_labels=100 \ + --device=cpu \ + --log_folder=log_img_explore_ea \ + --result_dir=./internal/ml/model_selection/exp_result/ + + +# imgnet + nb201 +python ./internal/ml/model_selection/exps/nas_bench_img/1_explore_models_100_run.py \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=../exp_data/ \ + --dataset=ImageNet16-120 \ + --init_channels=16 \ + --num_stacks=3 \ + --num_modules_per_stack=3 \ + --num_labels=120 \ + --device=cpu \ + --log_folder=log_img_explore_ea \ + --result_dir=./internal/ml/model_selection/exp_result/ diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh new file mode 100644 index 000000000..d4c18386b --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh @@ -0,0 +1,60 @@ + + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + + +for i in {1..4} +do + # cifar10 + nb101 +# /home/xingnaili/miniconda3/envs/trails/bin/python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ +# --models_explore=1200 \ +# --search_space=nasbench101 \ +# --api_loc=nasbench_only108.pkl \ +# --base_dir=/hdd1/xingnaili/exp_data/ \ +# --dataset=cifar10 \ +# --batch_size=32 \ +# --num_labels=10 \ +# --device=cuda:0 \ +# --log_folder=log_score_all_img10_101 \ +# --result_dir=./internal/ml/model_selection/exp_result/ + + # cifar10 + nb201 + /home/xingnaili/miniconda3/envs/trails/bin/python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ + --models_explore=1200 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset=cifar10 \ + --batch_size=32 \ + --num_labels=10 \ + --device=cpu \ + --log_folder=log_score_all_img10 \ + --result_dir=./internal/ml/model_selection/exp_result/ + + # cifar100 + nb201 + /home/xingnaili/miniconda3/envs/trails/bin/python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ + --models_explore=1200 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset=cifar100 \ + --batch_size=32 \ + --num_labels=100 \ + --device=cpu \ + --log_folder=log_score_all_img100 \ + --result_dir=./internal/ml/model_selection/exp_result/ + + # imgnet + nb201 + /home/xingnaili/miniconda3/envs/trails/bin/python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ + --models_explore=1200 \ + --search_space=nasbench201 \ + --api_loc=NAS-Bench-201-v1_1-096897.pth \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --dataset=ImageNet16-120 \ + --batch_size=32 \ + --num_labels=120 \ + --device=cpu \ + --log_folder=log_score_all_img_imgnet \ + --result_dir=./internal/ml/model_selection/exp_result/ +done \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh new file mode 100644 index 000000000..fd1a9be75 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh @@ -0,0 +1,27 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + + +nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ + --embedding_cache_filtering=True \ + --models_explore=9999 \ + --tfmem=express_flow \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_score_time_criteo > outputCriScorAll.log& + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh new file mode 100644 index 000000000..80cc39e49 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh @@ -0,0 +1,27 @@ + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ + --embedding_cache_filtering=True \ + --models_explore=159999 \ + --tfmem=express_flow \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_score_time_frappe > output.log& + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh new file mode 100644 index 000000000..9b910c1ac --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh @@ -0,0 +1,28 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ + --embedding_cache_filtering=True \ + --models_explore=159999 \ + --tfmem=express_flow \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cpu \ + --batch_size=32 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_score_time_uci > outputUciScoreALl.log& + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh new file mode 100644 index 000000000..8c2583473 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh @@ -0,0 +1,46 @@ + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +worker_id=0 +GPU_NUM=9 +worker_each_gpu=6 +total_workers=$((worker_each_gpu*GPU_NUM)) + +for((gpu_id=0; gpu_id < GPU_NUM; ++gpu_id)); do +# echo "GPU id is $gpu_id" + for((i=0; i < worker_each_gpu; ++i)); do + echo "Assign task to worker id is $worker_id" + echo "nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:$gpu_id \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=10 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --worker_id=$worker_id \ + --total_workers=$total_workers \ + --workers=0 \ + --log_folder=log_train_criteo \ + --total_models_per_worker=-1 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --pre_partitioned_file=./internal/ml/model_selection/exps/nas_bench_tabular/sampled_models_10000_models.json & ">> train_all_models_criteo_seq.sh + +# sleep 1 + worker_id=$((worker_id+1)) + done +done + + +# pkill -9 -f 2.seq_train_online.py +# run with bash internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh >criteobash & diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh new file mode 100644 index 000000000..a0de85826 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh @@ -0,0 +1,48 @@ + + +# frappe +python exps/main_v2/ground_truth/2.seq_train_dist_online.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=../exp_data/ \ + --num_labels=1 \ + --device=gpu \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=10 \ + --iter_per_epoch=100 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --total_models_per_worker=10 \ + --workers=0 \ + --worker_each_gpu=1 \ + --gpu_num=8 \ + --log_folder=LogFrappee \ + --pre_partitioned_file=./exps/main_v2/ground_truth/sampled_models_10000_models.json & + +# criteo +python exps/main_v2/ground_truth/2.seq_train_dist_online.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=../exp_data/ \ + --num_labels=1 \ + --device=gpu \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=10 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --worker_each_gpu=9 \ + --gpu_num=8 \ + --log_folder=LogCriteo \ + --pre_partitioned_file=./exps/main_v2/ground_truth/sampled_models_10000_models.json & diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh new file mode 100644 index 000000000..4f4c099d0 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh @@ -0,0 +1,47 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +worker_id=0 +GPU_NUM=8 +worker_each_gpu=4 +total_workers=$((worker_each_gpu*GPU_NUM)) + +for((gpu_id=0; gpu_id < GPU_NUM; ++gpu_id)); do + for((i=0; i < worker_each_gpu; ++i)); do + + echo "nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:$gpu_id \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=40 \ + --iter_per_epoch=200 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --worker_id=$worker_id \ + --total_workers=$total_workers \ + --workers=0 \ + --log_folder=log_train_uci \ + --total_models_per_worker=-1 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --pre_partitioned_file=./internal/ml/model_selection/exps/nas_bench_tabular/uci_left_8k_models.json > outputuci.log& ">> train_all_models_diabetes_seq.sh + + worker_id=$((worker_id+1)) + done +done + + +# pkill -9 -f ./internal/ml/model_selection/exps/nas_bench_tabular//2.seq_train_online.py +# pkill -9 -f /home/naili/miniconda3/envs/firmest_torch11/bin/python + +# run with bash internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh >ucibash & diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh new file mode 100644 index 000000000..3ffd7bc64 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh @@ -0,0 +1,45 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +worker_id=0 +GPU_NUM=8 +worker_each_gpu=16 +total_workers=$((worker_each_gpu*GPU_NUM)) + +for((gpu_id=0; gpu_id < GPU_NUM; ++gpu_id)); do +# echo "GPU id is $gpu_id" + for((i=0; i < worker_each_gpu; ++i)); do + echo "nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/home/shaofeng/naili/firmest_data/ \ + --num_labels=2 \ + --device=cuda:$gpu_id \ + --batch_size=512 \ + --lr=0.001 \ + --epoch=20 \ + --iter_per_epoch=200 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --worker_id=$worker_id \ + --total_workers=$total_workers \ + --workers=0 \ + --log_folder=log_frappe \ + --total_models_per_worker=-1 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --pre_partitioned_file=./internal/ml/model_selection/exps/nas_bench_tabular/sampled_models_all.json & ">> train_all_models_frappe_seq.sh + + sleep 1 + worker_id=$((worker_id+1)) + done +done + + +# pkill -9 -f internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh new file mode 100644 index 000000000..5115e874b --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh @@ -0,0 +1,25 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection + +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=512 \ + --lr=0.001 \ + --epoch=20 \ + --iter_per_epoch=200 \ + --dataset=frappe \ + --nfeat=5500 \ + --nfield=10 \ + --nemb=10 \ + --worker_id=0 \ + --total_workers=1 \ + --workers=1 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_frappe \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh new file mode 100644 index 000000000..ea7239169 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh @@ -0,0 +1,144 @@ +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + +# default setting. +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=5 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_criteo_train_tune >criteo_5.log & + + +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=10 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_criteo_train_tune >criteo_10.log & + + + +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:1 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=20 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_criteo_train_tune >criteo_20.log & + + + + +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:2 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=40 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_criteo_train_tune >criteo_40.log & + + + +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:3 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=60 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_criteo_train_tune >criteo_60.log & + + + +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:4 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=80 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_criteo_train_tune >criteo_80.log & + + + +python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:5 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=100 \ + --iter_per_epoch=2000 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_criteo_train_tune >criteo_100.log & + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh new file mode 100644 index 000000000..661e6b944 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh @@ -0,0 +1,70 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + +nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:0 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=3 \ + --iter_per_epoch=200 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_uci_train_tune >uci_3.log & + + + +nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:1 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=5 \ + --iter_per_epoch=200 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_uci_train_tune >uci_5.log & + + +# default setting. +nohup python ./internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py \ + --log_name=baseline_train_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=20 \ + --base_dir=../exp_data/ \ + --num_labels=2 \ + --device=cuda:2 \ + --batch_size=1024 \ + --lr=0.001 \ + --epoch=7 \ + --iter_per_epoch=200 \ + --dataset=uci_diabetes \ + --nfeat=369 \ + --nfield=43 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_uci_train_tune >uci_7.log & + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh new file mode 100644 index 000000000..64b011c63 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh @@ -0,0 +1,47 @@ + + +export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection +conda activate trails + + + + +python ./internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py \ + --models_explore=1000 \ + --log_name=score_based \ + --search_space=mlp_sp \ + --num_layers=4 \ + --hidden_choice_len=10 \ + --base_dir=/hdd1/xingnaili/exp_data/ \ + --num_labels=2 \ + --device=cuda:6 \ + --batch_size=32 \ + --dataset=criteo \ + --nfeat=2100000 \ + --nfield=39 \ + --nemb=10 \ + --workers=0 \ + --result_dir=./internal/ml/model_selection/exp_result/ \ + --log_folder=log_score_time_criteo > outputCriScorAll.log& + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py new file mode 100644 index 000000000..673174997 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py @@ -0,0 +1,94 @@ +import calendar +import os +import time +import argparse +import configparser + + +def parse_config_arguments(config_path: str): + parser = configparser.ConfigParser() + parser.read(config_path) + + args = argparse.Namespace() + + # job config under DEFAULT + args.log_name = parser.get('DEFAULT', 'log_name') + args.budget = parser.getint('DEFAULT', 'budget') + args.device = parser.get('DEFAULT', 'device') + args.log_folder = parser.get('DEFAULT', 'log_folder') + args.result_dir = parser.get('DEFAULT', 'result_dir') + args.num_points = parser.getint('DEFAULT', 'num_points') + args.max_load = parser.getint('DEFAULT', 'max_load') + + # sampler args + args.search_space = parser.get('SAMPLER', 'search_space') + args.population_size = parser.getint('SAMPLER', 'population_size') + args.sample_size = parser.getint('SAMPLER', 'sample_size') + args.simple_score_sum = parser.getboolean('SAMPLER', 'simple_score_sum') + + # nb101 args + args.api_loc = parser.get('NB101', 'api_loc') + args.init_channels = parser.getint('NB101', 'init_channels') + args.bn = parser.getint('NB101', 'bn') + args.num_stacks = parser.getint('NB101', 'num_stacks') + args.num_modules_per_stack = parser.getint('NB101', 'num_modules_per_stack') + + # nb201 args + args.init_w_type = parser.get('NB201', 'init_w_type') + args.init_b_type = parser.get('NB201', 'init_b_type') + args.arch_size = parser.getint('NB201', 'arch_size') + + # mlp args + args.num_layers = parser.getint('MLP', 'num_layers') + args.hidden_choice_len = parser.getint('MLP', 'hidden_choice_len') + + # mlp_trainer args + args.epoch = parser.getint('MLP_TRAINER', 'epoch') + args.batch_size = parser.getint('MLP_TRAINER', 'batch_size') + args.lr = parser.getfloat('MLP_TRAINER', 'lr') + args.patience = parser.getint('MLP_TRAINER', 'patience') + args.iter_per_epoch = parser.getint('MLP_TRAINER', 'iter_per_epoch') + args.nfeat = parser.getint('MLP_TRAINER', 'nfeat') + args.nfield = parser.getint('MLP_TRAINER', 'nfield') + args.nemb = parser.getint('MLP_TRAINER', 'nemb') + args.report_freq = parser.getint('MLP_TRAINER', 'report_freq') + args.workers = parser.getint('MLP_TRAINER', 'workers') + + # dataset args + args.base_dir = parser.get('DATASET', 'base_dir') + args.dataset = parser.get('DATASET', 'dataset') + args.num_labels = parser.getint('DATASET', 'num_labels') + + # seq_train args + args.worker_id = parser.getint('SEQ_TRAIN', 'worker_id') + args.total_workers = parser.getint('SEQ_TRAIN', 'total_workers') + args.total_models_per_worker = parser.getint('SEQ_TRAIN', 'total_models_per_worker') + args.pre_partitioned_file = parser.get('SEQ_TRAIN', 'pre_partitioned_file') + + # dis_train args + args.worker_each_gpu = parser.getint('DIS_TRAIN', 'worker_each_gpu') + args.gpu_num = parser.getint('DIS_TRAIN', 'gpu_num') + + # tune_interval args + args.kn_rate = parser.getint('TUNE_INTERVAL', 'kn_rate') + + # anytime args + args.only_phase1 = parser.getboolean('ANYTIME', 'only_phase1') + args.is_simulate = parser.getboolean('ANYTIME', 'is_simulate') + + # system performance exps + args.models_explore = parser.getint('SYS_PERFORMANCE', 'models_explore') + args.tfmem = parser.get('SYS_PERFORMANCE', 'tfmem') + args.embedding_cache_filtering = parser.getboolean('SYS_PERFORMANCE', 'embedding_cache_filtering') + args.concurrency = parser.getint('SYS_PERFORMANCE', 'concurrency') + + args.refinement_url = parser.get('SERVER', 'refinement_url') + args.cache_svc_url = parser.get('SERVER', 'cache_svc_url') + + # db config + args.db_name = parser.get('DB_CONFIG', 'db_name') + args.db_user = parser.get('DB_CONFIG', 'db_user') + args.db_host = parser.get('DB_CONFIG', 'db_host') + args.db_port = parser.get('DB_CONFIG', 'db_port') + + return args \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py new file mode 100644 index 000000000..4d91cd366 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py @@ -0,0 +1,64 @@ + + +class CommonVars: + + # SAMPLER + TEST_SAMPLER = "sequence" + RANDOM_SAMPLER = "random" + RL_SAMPLER = "rl" + EA_SAMPLER = "ea" + BOHB_SAMPLER = "bohb" + + # EVALUATOR + ExpressFlow = "express_flow" + + GRAD_NORM = "grad_norm" + GRAD_PLAIN = "grad_plain" + + JACOB_CONV = "jacob_conv" + NAS_WOT = "nas_wot" + + NTK_CONDNUM = "ntk_cond_num" + NTK_TRACE = "ntk_trace" + NTK_TRACE_APPROX = "ntk_trace_approx" + + PRUNE_FISHER = "fisher" + PRUNE_GRASP = "grasp" + PRUNE_SNIP = "snip" + PRUNE_SYNFLOW = "synflow" + + WEIGHT_NORM = "weight_norm" + + ALL_EVALUATOR = "all_matrix" + + # SEARCH SPACE + NASBENCH101 = "nas-bench-101" + NASBENCH201 = "nas-bench-201" + + # correlation coefficient metrics + KendallTau = "KendallTau" + Spearman = "Spearman" + Pearson = "Pearson" + AvgCorrelation = "average_correlation" + AllCorrelation = "all_correlation" + + +class Config: + + MLPSP = "mlp_sp" + NB101 = "nasbench101" + NB201 = "nasbench201" + DARTS = "darts" + NDS = "NDS" + + # vision dataset + c10_valid = "cifar10-valid" + c10 = "cifar10" + c100 = "cifar100" + imgNet = "ImageNet16-120" + + # struct dataset + Frappe = "frappe" + Criteo = "criteo" + UCIDataset = "uci_diabetes" + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py new file mode 100644 index 000000000..cf8f30e9e --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py @@ -0,0 +1,89 @@ +import json + + +class ModelEvaData: + """ + Eva worker send score to search strategy + """ + + def __init__(self, model_id: str = None, model_score: dict = None): + if model_score is None: + model_score = {} + self.model_id = model_id + self.model_score = model_score + + def serialize_model(self) -> str: + data = {"model_id": self.model_id, + "model_score": self.model_score} + return json.dumps(data) + + @classmethod + def deserialize(cls, data_str: str): + data = json.loads(data_str) + res = cls( + data["model_id"], + data["model_score"]) + return res + + +class ModelAcquireData: + """ + Eva worker get model from search strategy + The serialize/deserialize is for good scalability. The project can be decouple into multiple service + """ + + def __init__(self, model_id: str, model_encoding: str, is_last: bool = False, + spi_seconds=None, spi_mini_batch=None): + self.is_last = is_last + self.model_id = model_id + self.model_encoding = model_encoding + + # this is when using spi + self.spi_seconds = spi_seconds + self.spi_mini_batch = spi_mini_batch + + def serialize_model(self) -> str: + data = {"is_last": self.is_last, + "model_id": self.model_id, + "model_encoding": self.model_encoding, + "spi_seconds": self.spi_seconds, + "spi_mini_batch": self.spi_mini_batch} + + return json.dumps(data) + + @classmethod + def deserialize(cls, data_str: str): + data = json.loads(data_str) + res = cls( + data["model_id"], + data["model_encoding"], + data["is_last"], + data["spi_mini_batch"], + data["spi_seconds"]) + return res + + +class ClientStruct: + """ + Client get data + """ + + def __init__(self, budget: float, dataset: str): + self.budget = budget + self.dataset = dataset + + @classmethod + def deserialize(cls, data_str: str): + data = json.loads(data_str) + res = cls( + data["budget"], + data["dataset"] + ) + return res + + +if __name__ == "__main__": + data = ModelEvaData("1", {"a": 1, "b": 2}) + data_str = data.serialize_model() + res = ModelEvaData.deserialize(data_str) + print(res) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py new file mode 100644 index 000000000..25e4ea30d --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py @@ -0,0 +1,17 @@ + + +from src.common.constant import CommonVars +from src.controller.sampler_ea.regularized_ea import RegularizedEASampler +from src.controller.sampler_all.seq_sampler import SequenceSampler +from src.controller.sampler_rl.reinforcement_learning import RLSampler +from src.controller.sampler_rand.random_sample import RandomSampler +from src.controller.sampler_all.seq_sampler import SequenceSampler + +sampler_register = { + CommonVars.TEST_SAMPLER: SequenceSampler, + # CommonVars.RANDOM_SAMPLER: RandomSampler, + CommonVars.RANDOM_SAMPLER: SequenceSampler, + CommonVars.RL_SAMPLER: RLSampler, + CommonVars.EA_SAMPLER: RegularizedEASampler, +} + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py new file mode 100644 index 000000000..c3d4036dc --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py @@ -0,0 +1,173 @@ +import time + +from src.controller.core.sample import Sampler +from src.third_pkg.models import CellStructure + + +class ModelScore: + def __init__(self, model_id, score): + self.model_id = model_id + self.score = score + + def __repr__(self): + return "m_{}_s_{}".format(self.model_id, self.score) + + +# for binary insert +def binary_insert_get_rank(rank_list: list, new_item: ModelScore) -> int: + """ + Insert the new_item to rank_list, then get the rank of it. + :param rank_list: + :param new_item: + :return: + """ + index = search_position(rank_list, new_item) + # search the position to insert into + rank_list.insert(index, new_item) + return index + + +# O(logN) search the position to insert into +def search_position(rank_list_m: list, new_item: ModelScore): + if len(rank_list_m) == 0: + return 0 + left = 0 + right = len(rank_list_m) - 1 + while left + 1 < right: + mid = int((left + right) / 2) + if rank_list_m[mid].score <= new_item.score: + left = mid + else: + right = mid + + # consider the time. + if rank_list_m[right].score <= new_item.score: + return right + 1 + elif rank_list_m[left].score <= new_item.score: + return left + 1 + else: + return left + + +class SampleController(object): + """ + Controller control the sample-score flow in the 1st phase. + It records the results in the history. + """ + + def __init__(self, search_strategy: Sampler): + # Current ea is better than others. + self.search_strategy = search_strategy + + # the large the index, the better the model + self.ranked_models = [] + + # when simple_score_sum=False, records the model's score of each algorithm, + # use when simple_score_sum=True, record the model's sum score + self.history = {} + + def sample_next_arch(self) -> (str, CellStructure): + """ + Return a generator + :return: + """ + return self.search_strategy.sample_next_arch(self.ranked_models) + + def fit_sampler(self, arch_id: str, alg_score: dict, simple_score_sum: bool = False) -> float: + """ + :param arch_id: + :param alg_score: {alg_name1: score1, alg_name2: score2} + :param simple_score_sum: if simply sum multiple scores (good performing), + or sum over their rank (worse performing) + :return: + """ + if simple_score_sum or len(alg_score.keys()) == 1: + score = self._use_pure_score_as_final_res(arch_id, alg_score) + else: + score = self._use_vote_rank_as_final_res(arch_id, alg_score) + self.search_strategy.fit_sampler(score) + return score + + def _use_vote_rank_as_final_res(self, model_id: str, alg_score: dict): + """ + :param model_id: + :param alg_score: {alg_name1: score1, alg_name2: score2} + """ + # todo: bug: only all scores' under all arg is greater than previous one, then treat it as greater. + for alg in alg_score: + if alg not in self.history: + self.history[alg] = [] + + # add model and score to local list + for alg, score in alg_score.items(): + binary_insert_get_rank(self.history[alg], ModelScore(model_id, score)) + + new_rank_score = self._re_rank_model_id(model_id, alg_score) + return new_rank_score + + def _use_pure_score_as_final_res(self, model_id: str, alg_score: dict): + # get the key and sum the score of various alg + score_sum_key = "_".join(list(alg_score.keys())) + if score_sum_key not in self.history: + self.history[score_sum_key] = [] + final_score = 0 + for alg in alg_score: + final_score += float(alg_score[alg]) + # insert and get rank + index = binary_insert_get_rank(self.history[score_sum_key], ModelScore(model_id, final_score)) + self.ranked_models.insert(index, model_id) + return final_score + + def _re_rank_model_id(self, model_id: str, alg_score: dict): + # todo: re-rank everything, to make it self.ranked_models more accurate. + model_new_rank_score = {} + current_explored_models = 0 + for alg, score in alg_score.items(): + for rank_index in range(len(self.history[alg])): + current_explored_models = len(self.history[alg]) + ms_ins = self.history[alg][rank_index] + # rank = index + 1, since index can be 0 + if ms_ins.model_id in model_new_rank_score: + model_new_rank_score[ms_ins.model_id] += rank_index + 1 + else: + model_new_rank_score[ms_ins.model_id] = rank_index + 1 + + for ele in model_new_rank_score.keys(): + model_new_rank_score[ele] = model_new_rank_score[ele] / current_explored_models + + self.ranked_models = [k for k, v in sorted(model_new_rank_score.items(), key=lambda item: item[1])] + new_rank_score = model_new_rank_score[model_id] + return new_rank_score + + def get_current_top_k_models(self, k=-1): + """ + The model is already scored by: low -> high + :param k: + :return: + """ + if k == -1: + # retur all models + return self.ranked_models + else: + return self.ranked_models[-k:] + + +if __name__ == "__main__": + + rank_list = [] + begin = time.time() + score_list = [1, 2, 3, 1, 2] + for i in range(5): + ms = ModelScore(i, score_list[i]) + binary_insert_get_rank(rank_list, ms) + print(rank_list) + print(time.time() - begin) + + rank_list = [] + begin = time.time() + score_list = [1, 1, 1, 1, 1] + for i in range(5): + ms = ModelScore(i, score_list[i]) + binary_insert_get_rank(rank_list, ms) + print(rank_list) + print(time.time() - begin) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py new file mode 100644 index 000000000..78a6d86eb --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py @@ -0,0 +1,28 @@ +from enum import Enum, auto + + +class Metric(Enum): + RAW = auto() + ALL = auto() + + TRAIN_ACCURACY = auto() + VAL_ACCURACY = auto() + TEST_ACCURACY = auto() + + TRAIN_LOSS = auto() + VAL_LOSS = auto() + TEST_LOSS = auto() + + TRAIN_TIME = auto() + VAL_TIME = auto() + TEST_TIME = auto() + + FLOPS = auto() + LATENCY = auto() + PARAMETERS = auto() + EPOCH = auto() + HP = auto() + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py new file mode 100644 index 000000000..a4b304ce6 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py @@ -0,0 +1,28 @@ +from abc import abstractmethod + +from src.search_space.core.model_params import ModelMicroCfg +from src.search_space.core.space import SpaceWrapper + + +class Sampler: + + def __init__(self, space: SpaceWrapper): + self.space = space + + @abstractmethod + def sample_next_arch(self, sorted_model: list) -> (str, ModelMicroCfg): + """ + Sample next architecture, + :param sorted_model: the scoted model, + :return: + """ + raise NotImplementedError + + @abstractmethod + def fit_sampler(self, score: float): + """ + Fit the sampler with architecture's score. + :param score: + :return: + """ + raise NotImplementedError diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py new file mode 100644 index 000000000..0dfdc5e07 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py @@ -0,0 +1,32 @@ +import random + +from src.controller.core.sample import Sampler +from src.search_space.core.model_params import ModelMicroCfg +from src.search_space.core.space import SpaceWrapper + + +class SequenceSampler(Sampler): + + def __init__(self, space: SpaceWrapper): + super().__init__(space) + + self.arch_gene = self.space.sample_all_models() + + def sample_next_arch(self, sorted_model: list = None) -> (str, ModelMicroCfg): + """ + Sample one random architecture, can sample max 10k architectures. + :return: arch_id, architecture + """ + + try: + arch_id, arch_micro = self.arch_gene.__next__() + return arch_id, arch_micro + except Exception as e: + if "StopIteration" in str(e): + print("the end") + return None, None + else: + raise e + + def fit_sampler(self, score: float): + pass diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py new file mode 100644 index 000000000..97266f6ef --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py @@ -0,0 +1,285 @@ +################################################## +# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2020 # +################################################################### +# BOHB: Robust and Efficient Hyperparameter Optimization at Scale # +# required to install hpbandster ################################## +# pip install hpbandster ################################## +################################################################### +# OMP_NUM_THREADS=4 python exps/NATS-algos/bohb.py --search_space tss --dataset cifar10 --num_samples 4 --random_fraction 0.0 --bandwidth_factor 3 --rand_seed 1 +# OMP_NUM_THREADS=4 python exps/NATS-algos/bohb.py --search_space sss --dataset cifar10 --num_samples 4 --random_fraction 0.0 --bandwidth_factor 3 --rand_seed 1 +################################################################### +import os, sys, time, random, argparse, collections +from copy import deepcopy + +from src.tools.env_tools import prepare_seed +from src.logger import logger + +from models import CellStructure, get_search_spaces + +# BOHB: Robust and Efficient Hyperparameter Optimization at Scale, ICML 2018 +import ConfigSpace +from hpbandster.optimizers.bohb import BOHB +import hpbandster.core.nameserver as hpns +from hpbandster.core.worker import Worker + +from nats_bench import create + + +def time_string(): + ISOTIMEFORMAT = "%Y-%m-%d %X" + string = "[{:}]".format(time.strftime(ISOTIMEFORMAT, time.gmtime(time.time()))) + return string + + +def get_topology_config_space(search_space, max_nodes=4): + cs = ConfigSpace.ConfigurationSpace() + # edge2index = {} + for i in range(1, max_nodes): + for j in range(i): + node_str = "{:}<-{:}".format(i, j) + cs.add_hyperparameter( + ConfigSpace.CategoricalHyperparameter(node_str, search_space) + ) + return cs + + +def get_size_config_space(search_space): + cs = ConfigSpace.ConfigurationSpace() + for ilayer in range(search_space["numbers"]): + node_str = "layer-{:}".format(ilayer) + cs.add_hyperparameter( + ConfigSpace.CategoricalHyperparameter(node_str, search_space["candidates"]) + ) + return cs + + +def config2topology_func(max_nodes=4): + def config2structure(config): + genotypes = [] + for i in range(1, max_nodes): + xlist = [] + for j in range(i): + node_str = "{:}<-{:}".format(i, j) + op_name = config[node_str] + xlist.append((op_name, j)) + genotypes.append(tuple(xlist)) + return CellStructure(genotypes) + + return config2structure + + +def config2size_func(search_space): + def config2structure(config): + channels = [] + for ilayer in range(search_space["numbers"]): + node_str = "layer-{:}".format(ilayer) + channels.append(str(config[node_str])) + return ":".join(channels) + + return config2structure + + +class MyWorker(Worker): + def __init__(self, *args, convert_func=None, dataset=None, api=None, **kwargs): + super().__init__(*args, **kwargs) + self.convert_func = convert_func + self._dataset = dataset + self._api = api + self.total_times = [] + self.trajectory = [] + + def compute(self, config, budget, **kwargs): + arch = self.convert_func(config) + accuracy, latency, time_cost, total_time = self._api.simulate_train_eval( + arch, self._dataset, iepoch=int(budget) - 1, hp="12" + ) + self.trajectory.append((accuracy, arch)) + self.total_times.append(total_time) + return {"loss": 100 - accuracy, "info": self._api.query_index_by_arch(arch)} + + +def main(xargs, api): + import torch + torch.set_num_threads(4) + prepare_seed(xargs.rand_seed) + + logger.info("{:} use api : {:}".format(time_string(), api)) + api.reset_time() + search_space = get_search_spaces(xargs.search_space, "nats-bench") + if xargs.search_space == "tss": + cs = get_topology_config_space(search_space) + config2structure = config2topology_func() + else: + cs = get_size_config_space(search_space) + config2structure = config2size_func(search_space) + + hb_run_id = "0" + + NS = hpns.NameServer(run_id=hb_run_id, host="localhost", port=0) + ns_host, ns_port = NS.start() + num_workers = 1 + + workers = [] + for i in range(num_workers): + w = MyWorker( + nameserver=ns_host, + nameserver_port=ns_port, + convert_func=config2structure, + dataset=xargs.dataset, + api=api, + run_id=hb_run_id, + id=i, + ) + w.run(background=True) + workers.append(w) + + start_time = time.time() + bohb = BOHB( + configspace=cs, + run_id=hb_run_id, + eta=3, + min_budget=1, + max_budget=12, + nameserver=ns_host, + nameserver_port=ns_port, + num_samples=xargs.num_samples, + random_fraction=xargs.random_fraction, + bandwidth_factor=xargs.bandwidth_factor, + ping_interval=10, + min_bandwidth=xargs.min_bandwidth, + ) + + results = run(xargs.n_iters, min_n_workers=num_workers) + + bohb.shutdown(shutdown_workers=True) + NS.shutdown() + + # print('There are {:} runs.'.format(len(results.get_all_runs()))) + # workers[0].total_times + # workers[0].trajectory + current_best_index = [] + for idx in range(len(workers[0].trajectory)): + trajectory = workers[0].trajectory[: idx + 1] + arch = max(trajectory, key=lambda x: x[0])[1] + current_best_index.append(api.query_index_by_arch(arch)) + + best_arch = max(workers[0].trajectory, key=lambda x: x[0])[1] + logger.log( + "Best found configuration: {:} within {:.3f} s".format( + best_arch, workers[0].total_times[-1] + ) + ) + info = api.query_info_str_by_arch( + best_arch, "200" if xargs.search_space == "tss" else "90" + ) + logger.log("{:}".format(info)) + logger.log("-" * 100) + logger.close() + + return logger.log_dir, current_best_index, workers[0].total_times + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + "BOHB: Robust and Efficient Hyperparameter Optimization at Scale" + ) + parser.add_argument( + "--dataset", + default="cifar10", + type=str, + choices=["cifar10", "cifar100", "ImageNet16-120"], + help="Choose between Cifar10/100 and ImageNet-16.", + ) + # general arg + parser.add_argument( + "--search_space", + default="tss", + type=str, + choices=["tss", "sss"], + help="Choose the search space.", + ) + parser.add_argument( + "--time_budget", + type=int, + default=20000, + help="The total time cost budge for searching (in seconds).", + ) + parser.add_argument( + "--loops_if_rand", type=int, default=500, help="The total runs for evaluation." + ) + # BOHB + parser.add_argument( + "--strategy", + default="sampling", + type=str, + nargs="?", + help="optimization strategy for the acquisition function", + ) + parser.add_argument( + "--min_bandwidth", + default=0.3, + type=float, + nargs="?", + help="minimum bandwidth for KDE", + ) + parser.add_argument( + "--num_samples", + default=64, + type=int, + nargs="?", + help="number of samples for the acquisition function", + ) + parser.add_argument( + "--random_fraction", + default=0.33, + type=float, + nargs="?", + help="fraction of random configurations", + ) + parser.add_argument( + "--bandwidth_factor", + default=3, + type=int, + nargs="?", + help="factor multiplied to the bandwidth", + ) + parser.add_argument( + "--n_iters", + default=300, + type=int, + nargs="?", + help="number of iterations for optimization method", + ) + # log + parser.add_argument( + "--save_dir", + type=str, + default="./output/search", + help="Folder to save checkpoints and log.", + ) + parser.add_argument("--rand_seed", type=int, default=-1, help="manual seed") + args = parser.parse_args() + + api = create(None, args.search_space, fast_mode=False, verbose=False) + + args.save_dir = os.path.join( + "{:}-{:}".format(args.save_dir, args.search_space), + "{:}-T{:}".format(args.dataset, args.time_budget), + "BOHB", + ) + print("save-dir : {:}".format(args.save_dir)) + + import torch + if args.rand_seed < 0: + save_dir, all_info = None, collections.OrderedDict() + for i in range(args.loops_if_rand): + print("{:} : {:03d}/{:03d}".format(time_string(), i, args.loops_if_rand)) + args.rand_seed = random.randint(1, 100000) + save_dir, all_archs, all_total_times = main(args, api) + all_info[i] = {"all_archs": all_archs, "all_total_times": all_total_times} + save_path = save_dir / "results.pth" + print("save into {:}".format(save_path)) + torch.save(all_info, save_path) + else: + main(args, api) + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py new file mode 100644 index 000000000..d8a862a1f --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py @@ -0,0 +1,130 @@ +import collections +from src.search_space.core.model_params import ModelMicroCfg +from src.controller.core.sample import Sampler +import random +from src.search_space.core.space import SpaceWrapper + + +class Model(object): + def __init__(self): + self.arch = None + self.score = None + + def __str__(self): + """Prints a readable version of this bitstring.""" + return "{:}".format(self.arch) + + +class RegularizedEASampler(Sampler): + + def __init__(self, space: SpaceWrapper, population_size: int, sample_size: int): + super().__init__(space) + + self.population_size = population_size + # list of object, + self.population = collections.deque() + # list of str, for duplicate checking + self.population_model_ids = collections.deque() + + self.space = space + self.sample_size = sample_size + self.current_sampled = 0 + + # id here is to match the outside value. + self.current_arch_id = None + self.current_arch_micro = None + + # use the visited to reduce the collapse + self.visited = {} + self.max_mutate_time = 2 + self.max_mutate_sampler_time = 2 + + def sample_next_arch(self, sorted_model_ids: list) -> (str, ModelMicroCfg): + """ + This function performs one evolution cycle. It produces a model and removes another. + Models are sampled randomly from the current population. If the population size is less than the + desired population size, a random architecture is added to the population. + + :param sorted_model_ids: List of model ids sorted based on some criterion (not used here directly). + :return: Tuple of the architecture id and the architecture configuration (micro). + """ + # Case 1: If population hasn't reached desired size, add random architectures + if len(self.population) < self.population_size: + while True: + arch_id, arch_micro = self.space.random_architecture_id() + # Ensure that EA population has no repeated value + if str(arch_id) not in self.population_model_ids: + break + self.current_arch_micro = arch_micro + self.current_arch_id = arch_id + return arch_id, arch_micro + + # Case 2: If population has reached desired size, evolve population + else: + cur_mutate_sampler_time = 0 + is_found_new = False + + # Keep attempting mutations for a maximum of 'max_mutate_sampler_time' times + while cur_mutate_sampler_time < self.max_mutate_sampler_time: + cur_mutate_time = 0 + + # Randomly select a sample of models from the population + sample = [] + sample_ids = [] + while len(sample) < self.sample_size: + candidate = random.choice(list(self.population)) + candidate_id = self.population_model_ids[self.population.index(candidate)] + sample.append(candidate) + sample_ids.append(candidate_id) + + # Select the best parent from the sample (based on the order in sorted_model_ids) + parent_id = max(sample_ids, key=lambda _id: sorted_model_ids.index(str(_id))) + parent = sample[sample_ids.index(parent_id)] + + # Try to mutate the parent up to 'max_mutate_time' times + while cur_mutate_time < self.max_mutate_time: + arch_id, arch_micro = self.space.mutate_architecture(parent.arch) + + # If the mutated architecture hasn't been visited or we've visited all possible architectures, stop + if arch_id not in self.visited or len(self.space) == len(self.visited): + self.visited[arch_id] = True + is_found_new = True + break + cur_mutate_time += 1 + + # If we've found a new architecture, stop sampling + if is_found_new: + break + + cur_mutate_sampler_time += 1 + + # If we've hit the maximum number of mutation attempts, do nothing + if cur_mutate_time * cur_mutate_sampler_time == self.max_mutate_time * self.max_mutate_sampler_time: + pass + + # Update current architecture details + self.current_arch_micro = arch_micro + self.current_arch_id = arch_id + + return arch_id, arch_micro + + def fit_sampler(self, score: float): + # if it's in Initialize stage, add to the population with random models. + if len(self.population) < self.population_size: + model = Model() + model.arch = self.current_arch_micro + model.score = score + self.population.append(model) + self.population_model_ids.append(self.current_arch_id) + + # if it's in mutation stage + else: + child = Model() + child.arch = self.current_arch_micro + child.score = score + + self.population.append(child) + self.population_model_ids.append(self.current_arch_id) + # Remove the oldest model. + self.population.popleft() + self.population_model_ids.popleft() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py new file mode 100644 index 000000000..fb927cf3e --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py @@ -0,0 +1,22 @@ +from src.controller.core.sample import Sampler +from src.search_space.core.space import SpaceWrapper +from src.search_space.core.model_params import ModelMicroCfg + + +class RandomSampler(Sampler): + + def __init__(self, space: SpaceWrapper): + super().__init__(space) + self.visited = [] + + def sample_next_arch(self, sorted_model: list = None) -> (str, ModelMicroCfg): + while True: + arch_id, model_micro = self.space.random_architecture_id() + + if arch_id not in self.visited: + self.visited.append(arch_id) + return str(arch_id), model_micro + + def fit_sampler(self, score: float): + # random sampler can skip this. + pass diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py new file mode 100644 index 000000000..bdd49e375 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py @@ -0,0 +1,48 @@ + +from src.controller.core.sample import Sampler +from src.search_space.core.space import SpaceWrapper +from src.search_space.core.model_params import ModelMicroCfg +from src.third_pkg.models import CellStructure + + +class ExponentialMovingAverage(object): + """Class that maintains an exponential moving average.""" + + def __init__(self, momentum): + self._numerator = 0 + self._denominator = 0 + self._momentum = momentum + + def update(self, value): + self._numerator = ( + self._momentum * self._denominator + (1 - self._momentum) * value + ) + self._denominator = self._momentum * self._denominator + (1 - self._momentum) + + def value(self): + """Return the current value of the moving average""" + return self._numerator / self._denominator + + +class RLSampler(Sampler): + + def __init__(self, space: SpaceWrapper, args): + + super().__init__(space) + + self.policy = self.space.get_reinforcement_learning_policy(args.rl_learning_rate) + # update policy's parameters + self.baseline = ExponentialMovingAverage(args.rl_EMA_momentum) + self.log_prob = 0 + + def sample_next_arch(self, max_nodes: int) -> (str, ModelMicroCfg): + while True: + self.log_prob, action = self.policy.select_action() + arch_struct = self.policy.generate_arch(action) + arch_id = self.space.arch_to_id(arch_struct) + yield arch_id, arch_struct + + def fit_sampler(self, score: float): + reward = score + self.baseline.update(reward) + self.policy.update_policy(reward, self.baseline.value(), self.log_prob) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py new file mode 100644 index 000000000..139597f9c --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py @@ -0,0 +1,2 @@ + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py new file mode 100644 index 000000000..418a71f83 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py @@ -0,0 +1,42 @@ +# adapted from AFN-AAAI-20 +import os +import zipfile +import urllib.request +from tqdm import tqdm + + +class DownloadProgressBar(tqdm): + def update_to(self, b=1, bsize=1, tsize=None): + if tsize is not None: + self.total = tsize + self.update(b * bsize - self.n) + + +def download(url, output_path): + with DownloadProgressBar(unit='B', unit_scale=True, + miniters=1, desc=url.split('/')[-1]) as t: + urllib.request.urlretrieve(url, filename=output_path, reporthook=t.update_to) + + +if __name__ == "__main__": + # if not os.path.exists('../data/avazu/'): + # os.mkdir('../data/avazu/') + # print("Begin to download avazu data, the total size is 683MB...") + # download('https://worksheets.codalab.org/rest/bundles/0xf5ab597052744680b1a55986557472c7/contents/blob/', '../data/avazu/avazu.zip') + # print("Unzipping avazu dataset...") + # with zipfile.ZipFile('../data/avazu/avazu.zip', 'r') as zip_ref: + # zip_ref.extractall('../data/avazu/') + # print("Done.") + + if not os.path.exists('../exp_data/data/structure_data/criteo/'): + os.mkdir('../exp_data/data/structure_data/criteo/') + print("Begin to download criteo data, the total size is 3GB...") + + output_path = '../exp_data/data/structure_data/criteo/criteo.zip' + if not os.path.exists(output_path): + download('https://worksheets.codalab.org/rest/bundles/0x8dca5e7bac42470aa445f9a205d177c6/contents/blob/', + output_path) + print("Unzipping criteo dataset...") + with zipfile.ZipFile('../exp_data/data/structure_data/criteo/criteo.zip', 'r') as zip_ref: + zip_ref.extractall('../exp_data/data/structure_data/criteo/') + print("Done.") diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py new file mode 100644 index 000000000..4bb494c96 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py @@ -0,0 +1,78 @@ +import queue +import threading +import requests +import time +from src.logger import logger + + +class SquenceDataLoader: + """ + This will preoritically query data from cache-service + """ + + def __init__(self, cache_svc_url, table_name, name_space): + self.last_fetch_time = 0 + self.table_name = table_name + # train, valid, test + self.name_space = name_space + self.end_signal = "end_position" + self.cache_svc_url = cache_svc_url + self.data_queue = queue.Queue(maxsize=10) + self.stop_event = threading.Event() + self.thread = threading.Thread(target=self.fetch_data, daemon=True) + self.thread.start() + + def fetch_data(self): + while not self.stop_event.is_set(): + response = requests.get( + f'{self.cache_svc_url}/', + params={ + 'table_name': self.table_name, + 'name_space': self.name_space}) + + if response.status_code == 200: + batch = response.json() + + # in trianing, we use iteraiton-per-epoch to control the end + if batch == self.end_signal: + if self.name_space == "valid": + # end_signal in inference, stop ! + logger.info("[StreamingDataLoader]: last iteration in valid is meet!") + self.data_queue.put({self.end_signal: True}) + else: + # end_signal in trianing, then keep training + continue + else: + import torch + # convert to tensor again + id_tensor = torch.LongTensor(batch['id']) + value_tensor = torch.FloatTensor(batch['value']) + y_tensor = torch.FloatTensor(batch['y']) + data_tensor = {'id': id_tensor, 'value': value_tensor, 'y': y_tensor} + self.data_queue.put(data_tensor) + else: + print(response.json()) + time.sleep(5) + + def __iter__(self): + return self + + def __next__(self): + print("compute time = ", time.time() - self.last_fetch_time) + self.last_fetch_time = time.time() + if self.data_queue.empty() and not self.thread.is_alive(): + raise StopIteration + else: + data = self.data_queue.get(block=True) + if self.end_signal in data: + raise StopIteration + else: + return data + + def __len__(self): + return self.data_queue.qsize() + + def stop(self): + self.stop_event.set() + self.thread.join() + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py new file mode 100644 index 000000000..3c2abe7a3 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py @@ -0,0 +1,78 @@ +import queue +import threading +import requests +import time +from src.logger import logger + + +class StreamingDataLoader: + """ + This will preoritically query data from cache-service + """ + + def __init__(self, cache_svc_url, table_name, name_space): + self.last_fetch_time = 0 + self.table_name = table_name + # train, valid, test + self.name_space = name_space + self.end_signal = "end_position" + self.cache_svc_url = cache_svc_url + self.data_queue = queue.Queue(maxsize=10) + self.stop_event = threading.Event() + self.thread = threading.Thread(target=self.fetch_data, daemon=True) + self.thread.start() + + def fetch_data(self): + while not self.stop_event.is_set(): + response = requests.get( + f'{self.cache_svc_url}/', + params={ + 'table_name': self.table_name, + 'name_space': self.name_space}) + + if response.status_code == 200: + batch = response.json() + + # in trianing, we use iteraiton-per-epoch to control the end + if batch == self.end_signal: + if self.name_space == "valid": + # end_signal in inference, stop ! + logger.info("[StreamingDataLoader]: last iteration in valid is meet!") + self.data_queue.put({self.end_signal: True}) + else: + # end_signal in trianing, then keep training + continue + else: + # convert to tensor again + import torch + id_tensor = torch.LongTensor(batch['id']) + value_tensor = torch.FloatTensor(batch['value']) + y_tensor = torch.FloatTensor(batch['y']) + data_tensor = {'id': id_tensor, 'value': value_tensor, 'y': y_tensor} + self.data_queue.put(data_tensor) + else: + print(response.json()) + time.sleep(5) + + def __iter__(self): + return self + + def __next__(self): + print("compute time = ", time.time() - self.last_fetch_time) + self.last_fetch_time = time.time() + if self.data_queue.empty() and not self.thread.is_alive(): + raise StopIteration + else: + data = self.data_queue.get(block=True) + if self.end_signal in data: + raise StopIteration + else: + return data + + def __len__(self): + return self.data_queue.qsize() + + def stop(self): + self.stop_event.set() + self.thread.join() + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py new file mode 100644 index 000000000..ca0cf5344 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py @@ -0,0 +1,10 @@ +from src.common.constant import * +from src.eva_engine.phase1.algo.prune_synflow import SynFlowEvaluator + +# evaluator mapper to register many existing evaluation algorithms +evaluator_register = { + + # prune based + CommonVars.PRUNE_SYNFLOW: SynFlowEvaluator(), + +} diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py new file mode 100644 index 000000000..331aec57a --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py @@ -0,0 +1,98 @@ +from src.common.constant import Config +from src.eva_engine.phase2.run_sh import BudgetAwareControllerSH +from src.logger import logger +from src.search_space.core.space import SpaceWrapper + +eta = 3 + + +def min_budget_calculation(search_space_ins: SpaceWrapper, dataset: str, + N_K_ratio: int, sh: BudgetAwareControllerSH, t1_: float): + # Calculate the minimum budget requirements for both phases + K_max = int(len(search_space_ins) / N_K_ratio) + + if search_space_ins.name == Config.NB101: + U_options = [4, 12, 16, 108] + elif search_space_ins.name == Config.NB201: + U_options = list(range(1, 200)) + elif search_space_ins.name == Config.MLPSP: + # TODO: This is for benchmark only + if dataset == Config.Frappe: + MaxEpochTrained = 20 + elif dataset == Config.Criteo: + MaxEpochTrained = 10 + elif dataset == Config.UCIDataset: + MaxEpochTrained = 40 + else: + raise NotImplementedError + U_options = list(range(1, MaxEpochTrained)) + else: + raise NotImplementedError + + U_min = U_options[0] + min_budget_required_both_phase = sh.pre_calculate_time_required(K=1, U=U_min)[1] + N_K_ratio * t1_ + + return K_max, U_options, U_min, min_budget_required_both_phase + + +def schedule(dataset: str, sh: BudgetAwareControllerSH, T_: float, t1_: float, t2_: float, w_: int, + search_space_ins: SpaceWrapper, N_K_ratio: int, + only_phase1: bool = False): + """ + :param dataset + :param sh: BudgetAwareControllerSH instnace + :param T_: user given time budget + :param t1_: time to score one model + :param t2_: time to train one model + :param w_: number of workers, for parallelly running. + :param search_space_ins: search spcae instance + :param N_K_ratio: N/K = N_K_ratio + :param only_phase1: Only use filtering phase. + """ + if T_ < 1: + raise ValueError('Total time budget must be greater than 1 second') + + K_max, U_options, U_min, min_budget_required_both_phase = min_budget_calculation( + search_space_ins, dataset, N_K_ratio, sh, t1_) + + # collection of (best_K, best_U, best_N) + history = [] + + # Calculate phase 1 + time_used = t1_ + enable_phase2_at_least = sh.pre_calculate_time_required(K=2, U=U_min)[1] + 2 * N_K_ratio * t1_ + + if only_phase1 or enable_phase2_at_least > T_: + # all time give to phase1, explore n models + N_only = min(int(T_ / t1_), len(search_space_ins)) + history.extend([(1, U_min, i) for i in range(1, N_only + 1) if i * t1_ <= T_]) + if not history: + raise ValueError( + f' [trails] Only p1, Budget {T_} is too small, it\'s at least >= {time_used} with current worker, ' + f'{t1_}, {t2_}, eta') + + # Calculate phase 2, start from min U, if user given budget is larger enough, then evaluat each mode with more epoch + else: + # record all possible K, U pair meeting the SLO ( time used < T) + for K_ in range(2, min(int(T_ / t1_), K_max) + 1): + N_ = K_ * N_K_ratio + for U in U_options: + time_used = sh.pre_calculate_time_required(K=K_, U=U)[1] + N_ * t1_ + if time_used > T_: + break + else: + history.append((K_, U, N_)) + if not history: + raise ValueError( + f' [trails] Budget {T_} is too small, it\'s at least >= {min_budget_required_both_phase}' + f' with current worker, {t1_}, {t2_}, eta') + + best_K, best_U, best_N = history[-1] + N_scored = best_N + B1_time_used = N_scored * t1_ + B2_all_epoch, B2_time_used = sh.pre_calculate_time_required(K=best_K, U=best_U) + + logger.info( + f' [trails] The schedule result: when T = {T_} second, N = {N_scored}, K = {best_K}, best_U = {best_U}, ' + f'time_used = {B1_time_used + B2_time_used}') + return best_K, best_U, N_scored, B1_time_used, B2_time_used, B2_all_epoch diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py new file mode 100644 index 000000000..8f3373c44 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py @@ -0,0 +1,407 @@ +from src.eva_engine.phase1.algo.alg_base import Evaluator +from src.common.constant import Config + +from singa import singa_wrap as singa +from singa import device as singa_device +from singa import tensor +from singa import opt +from singa import autograd +from singa.opt import Optimizer +from singa.opt import DecayScheduler +from singa.opt import Constant +import numpy as np +import time +import argparse +from PIL import Image +from numpy import linalg as LA + +np_dtype = {"float16": np.float16, "float32": np.float32} + +# singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} +singa_dtype = {"float32": tensor.float32} + +### MSOptimizer +class MSOptimizer(Optimizer): + def __call__(self, loss): + pn_p_g_list = self.call_with_returns(loss) + # print ("optimizer1 before self.step()") + # print ("optimizer1 before print len(pn_p_g_list): \n", len(pn_p_g_list)) + self.step() + # print ("optimizer1 after print len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("optimizer1 after self.step()") + return pn_p_g_list + + def call_with_returns(self, loss): + # print ("call_with_returns before apply loss.data: \n", loss.data) + pn_p_g_list = [] + for p, g in autograd.backward(loss): + if p.name is None: + p.name = id(p) + self.apply(p.name, p, g) + # print ("call with returns") + # print ("p.name: \n", p.name) + # print ("p.data: \n", p.data) + # print ("g.data: \n", g.data) + pn_p_g_list.append([p.name, p, g]) # need iterables + # print ("call_with_returns after apply loss.data: \n", loss.data) + return pn_p_g_list + +# MSSGD -- actually no change of code +class MSSGD(MSOptimizer): + """Implements stochastic gradient descent (optionally with momentum). + + Nesterov momentum is based on the formula from `On the importance of initialization and momentum in deep learning`__. + + Args: + lr(float): learning rate + momentum(float, optional): momentum factor(default: 0) + weight_decay(float, optional): weight decay(L2 penalty)(default: 0) + dampening(float, optional): dampening for momentum(default: 0) + nesterov(bool, optional): enables Nesterov momentum(default: False) + + Typical usage example: + >> > from singa import opt + >> > optimizer = opt.SGD(lr=0.1, momentum=0.9) + >> > optimizer.update() + + __ http: // www.cs.toronto.edu / %7Ehinton / absps / momentum.pdf + + .. note:: + The implementation of SGD with Momentum / Nesterov subtly differs from + Sutskever et. al. and implementations in some other frameworks. + + Considering the specific case of Momentum, the update can be written as + + .. math:: + v = \rho * v + g \\ + p = p - lr * v + + where p, g, v and: math: `\rho` denote the parameters, gradient, + velocity, and momentum respectively. + + This is in contrast to Sutskever et. al. and + other frameworks which employ an update of the form + + .. math:: + v = \rho * v + lr * g \\ + p = p - v + + The Nesterov version is analogously modified. + """ + + def __init__(self, + lr=0.1, + momentum=0, + dampening=0, + weight_decay=0, + nesterov=False, + dtype=tensor.float32): + super(MSSGD, self).__init__(lr) + + # init momentum + if type(momentum) == float or type(momentum) == int: + if momentum < 0.0: + raise ValueError("Invalid momentum value: {}".format(momentum)) + self.momentum = Constant(momentum) + elif isinstance(momentum, DecayScheduler): + self.momentum = momentum + momentum = momentum.init_value + else: + raise TypeError("Wrong momentum type") + # self.dtype = dtype + # self.mom_value = self.momentum(self.step_counter).as_type(self.dtype) + self.mom_value = self.momentum(self.step_counter) + + # init dampening + if type(dampening) == float or type(dampening) == int: + self.dampening = Constant(dampening) + elif isinstance(dampening, DecayScheduler): + self.dampening = dampening + dampening = dampening.init_value + else: + raise TypeError("Wrong dampening type") + # self.dam_value = self.dampening(self.step_counter).as_type(self.dtype) + self.dam_value = self.dampening(self.step_counter) + + # init weight_decay + if type(weight_decay) == float or type(weight_decay) == int: + if weight_decay < 0.0: + raise ValueError( + "Invalid weight_decay value: {}".format(weight_decay)) + self.weight_decay = Constant(weight_decay) + elif isinstance(weight_decay, DecayScheduler): + self.weight_decay = weight_decay + else: + raise TypeError("Wrong weight_decay type") + # self.decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + self.decay_value = self.weight_decay(self.step_counter) + + # init other params + self.nesterov = nesterov + self.moments = dict() + + # check value + if nesterov and (momentum <= 0 or dampening != 0): + raise ValueError( + "Nesterov momentum requires a momentum and zero dampening") + + def apply(self, param_name, param_value, param_grad): + """Performs a single optimization step. + + Args: + param_name(String): the name of the param + param_value(Tensor): param values to be update in-place + grad(Tensor): param gradients; the values may be updated + in this function; cannot use it anymore + """ + assert param_value.shape == param_grad.shape, ("shape mismatch", + param_value.shape, + param_grad.shape) + self.device_check(param_value, self.step_counter, self.lr_value, + self.mom_value, self.dam_value, self.decay_value) + + # derive dtype from input + # assert param_value.dtype == self.dtype + + # TODO add branch operator + # if self.decay_value != 0: + if self.weight_decay.init_value != 0: + singa.Axpy(self.decay_value.data, param_value.data, param_grad.data) + + if self.momentum.init_value != 0: + if param_name not in self.moments: + flag = param_value.device.graph_enabled() + param_value.device.EnableGraph(False) + self.moments[param_name] = tensor.zeros_like(param_value) + param_value.device.EnableGraph(flag) + + buf = self.moments[param_name] + buf *= self.mom_value + alpha = 1.0 - self.dam_value + singa.Axpy(alpha.data, param_grad.data, buf.data) + + if self.nesterov: + singa.Axpy(self.mom_value.data, buf.data, param_grad.data) + else: + param_grad = buf + + minus_lr = 0.0 - self.lr_value + singa.Axpy(minus_lr.data, param_grad.data, param_value.data) + + def step(self): + # increment step counter, lr and moment + # print ("before super step") + super().step() + # print ("after super step") + # print ("before custiomized step") + # mom_value = self.momentum(self.step_counter).as_type(self.dtype) + # dam_value = self.dampening(self.step_counter).as_type(self.dtype) + # decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + mom_value = self.momentum(self.step_counter) + dam_value = self.dampening(self.step_counter) + decay_value = self.weight_decay(self.step_counter) + self.mom_value.copy_from(mom_value) + self.dam_value.copy_from(dam_value) + self.decay_value.copy_from(decay_value) + # print ("after customized step") + + def get_states(self): + states = super().get_states() + if self.mom_value > 0: + states[ + 'moments'] = self.moments # a dict for 1st order moments tensors + return states + + def set_states(self, states): + super().set_states(states) + if 'moments' in states: + self.moments = states['moments'] + self.mom_value = self.momentum(self.step_counter) + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Calculate accuracy +def accuracy(pred, target): + # y is network output to be compared with ground truth (int) + y = np.argmax(pred, axis=1) + a = y == target + correct = np.array(a, "int").sum() + return correct + + +# Data partition according to the rank +def partition(global_rank, world_size, train_x, train_y, val_x, val_y): + # Partition training data + data_per_rank = train_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + train_x = train_x[idx_start:idx_end] + train_y = train_y[idx_start:idx_end] + + # Partition evaluation data + data_per_rank = val_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + val_x = val_x[idx_start:idx_end] + val_y = val_y[idx_start:idx_end] + return train_x, train_y, val_x, val_y + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +def resize_dataset(x, image_size): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, image_size, image_size), + dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (image_size, image_size), Image.BILINEAR), + dtype=np.float32) + return X + +import torch +class SynFlowEvaluator(Evaluator): + + def __init__(self): + super().__init__() + + def evaluate(self, arch, device, batch_data: object, batch_labels: torch.Tensor, space_name: str) -> float: + """ + This is implementation of paper + "Pruning neural networks without any data by iteratively conserving synaptic flow" + The score takes 5 steps: + 1. For each layer, for each parameter, calculate the absolute value |0| + 2. Use a single all-one-vector with dim = [1, c, h, w] to run a forward, + Since only consider linear and Con2d operation, the forward output is multiple( [ |0l| for l in L] ) + 3. New loss function R = sum(output), and then run backward + 4. for each layer, calculate Sl = Hadamard product( df/dw, w), where Sij=aij×bij + 5. score = sum( [ Sl for l in layers ] ) + Comments: + 1. this is data-Agnostic + 2. only compute on a single example + """ + + ### singa configs + mssgd = MSSGD(lr=0.005, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype['float32']) + device_id = 0 + max_epoch = 1 + model = arch + graph = True + verbosity = 0 + dist_option='plain' + spars=None + precision = 'float32' + global_rank = 0 + world_size = 1 + + ### singa setups + # print ("device: \n", device) + if device == 'cpu': + dev = singa_device.get_default_device() + else: # GPU + dev = singa_device.create_cuda_gpu_on(local_rank) # need to change to CPU device for CPU-only machines + dev.SetRandSeed(0) + np.random.seed(0) + + # For distributed training, sequential has better performance + if hasattr(mssgd, "communicator"): + DIST = True + sequential = True + else: + DIST = False + sequential = False + + model.train() + + ### process batch_data + x = batch_data.cpu().numpy() # Size([1, 100]) and all ones + x = x.astype(np_dtype[precision]) + y = np.ones(x.shape[0], dtype=np.int32) + if model.dimension == 2: # input data dimension + tx = tensor.Tensor(x.shape, dev, singa_dtype[precision]) + ty = tensor.Tensor((x.shape[0],), dev, tensor.int32) + + model.set_optimizer(mssgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + dev.SetVerbosity(verbosity) + + + # 1. Convert params to their abs. + synflow_flag = True ### just change the model to the absolute value + tx.copy_from_numpy(x) # dtype=np.float32 + ty.copy_from_numpy(y) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("---------------------------------------") + # print ("before absolute prune_synflow !!!nemb input vector!!! tensor.to_numpy(loss)[0]: ", tensor.to_numpy(loss)[0]) + # print ("before absolute prune_synflow !!!nemb input vector!!! tensor.to_numpy(loss): ", tensor.to_numpy(loss)) + # train_correct += accuracy(tensor.to_numpy(out), y) + # train_loss += tensor.to_numpy(loss)[0] + # all params turned to positive + for pn_p_g_item in pn_p_g_list: + # print ("absolute value parameter name: \n", pn_p_g_item[0]) + param_np = tensor.to_numpy(pn_p_g_item[1]) + # print ("param_np shape: \n", param_np.shape) + # print ("param_np sqrt norm: \n", np.sqrt(LA.norm(param_np)/param_np.size)) + # print ("before abs np.min(tensor.to_numpy(pn_p_g_item[1])): \n", np.min(tensor.to_numpy(pn_p_g_item[1]))) + pn_p_g_item[1] = tensor.abs(pn_p_g_item[1]) # tensor actually .. + # print ("after abs np.min(tensor.to_numpy(pn_p_g_item[1])): \n", np.min(tensor.to_numpy(pn_p_g_item[1]))) + # print ("after abs pn_p_g_item[1][0]: \n", pn_p_g_item[1][0]) + + # 2. Compute gradients with input of one dummy example ( 1-vector with dimension [1, c, h, w] ) + # 3.R = sum(output) + # 4. Select the gradients that we want to use for search/prune + # 5. Sum over all parameter's results to get the final score. + # score = sum([grad.sum() for grad in grads_abs]) + + # print ("calculate synflow") + synflow_flag = True + ### step 1: all one input + # Copy the patch data into input tensors + # tx.copy_from_numpy(np.ones(x.shape, dtype=np.float32)) + tx.copy_from_numpy(x) # dtype=np.float32 # actually it is all ones ... --> np.ones(x.shape, dtype=np.float32) + ty.copy_from_numpy(y) + ### step 2: all weights turned to positive (done) + ### step 3: new loss (done) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("prune_synflow !!!nemb input vector!!! synflow step tensor.to_numpy(loss)[0]: ", tensor.to_numpy(loss)[0]) + ### step 4: calculate the multiplication of weights + score = 0.0 + for pn_p_g_item in pn_p_g_list: + # print ("calculate weight param * grad parameter name: \n", pn_p_g_item[0]) + if len(pn_p_g_item[1].shape) == 2: # param_value.data is "weight" + # print ("pn_p_g_item[1].shape: \n", pn_p_g_item[1].shape) + # print ("tensor.to_numpy(pn_p_g_item[1][0]): ", tensor.to_numpy(pn_p_g_item[1][0])) + # print ("calculate synflow parameter name: \n", pn_p_g_item[0]) + # print ("should be positive np.min(tensor.to_numpy(pn_p_g_item[1])): ", np.min(tensor.to_numpy(pn_p_g_item[1]))) + # print ("weight should be positive tensor.to_numpy(pn_p_g_item[1][0])[0, :10]: ", tensor.to_numpy(pn_p_g_item[1][0])[0, :10]) + # print ("gradients tensor.to_numpy(pn_p_g_item[2][0])[0, :10]: ", tensor.to_numpy(pn_p_g_item[2][0])[0, :10]) + # print () + score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1]) * tensor.to_numpy(pn_p_g_item[2]))) + # print ("layer_hidden_list: \n", layer_hidden_list) + # print ("prune_synflow !!!one-hot input vector!!! absolute step tensor.to_numpy(loss)[0]: ", tensor.to_numpy(loss)[0]) + print ("score: \n", score) + + return score diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md new file mode 100644 index 000000000..90e0d8e17 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md @@ -0,0 +1,2 @@ +(1) copy cnn_ms/pkg_model_code/model.py to ~/miniconda3/lib/python3.6/site-packages/singa/model.py +(2) enter cnn_ms/ and run "python train_ms_model.py ms_model_mlp mnist" diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/README.md new file mode 100644 index 000000000..b081affa7 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/README.md @@ -0,0 +1,46 @@ + + +# Image Classification using Convolutional Neural Networks + +Examples inside this folder show how to train CNN models using +SINGA for image classification. + +* `data` includes the scripts for preprocessing image datasets. + Currently, MNIST, CIFAR10 and CIFAR100 are included. + +* `model` includes the CNN model construction codes by creating + a subclass of `Module` to wrap the neural network operations + of each model. Then computational graph is enabled to optimized + the memory and efficiency. + +* `autograd` includes the codes to train CNN models by calling the + [neural network operations](../../python/singa/autograd.py) imperatively. + The computational graph is not created. + +* `train_cnn.py` is the training script, which controls the training flow by + doing BackPropagation and SGD update. + +* `train_multiprocess.py` is the script for distributed training on a single + node with multiple GPUs; it uses Python's multiprocessing module and NCCL. + +* `train_mpi.py` is the script for distributed training (among multiple nodes) + using MPI and NCCL for communication. + +* `benchmark.py` tests the training throughput using `ResNet50` as the workload. \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/cifar10_multiprocess.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/cifar10_multiprocess.py new file mode 100644 index 000000000..4b3cb0f43 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/cifar10_multiprocess.py @@ -0,0 +1,43 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from resnet_cifar10 import * +import multiprocessing +import sys + +if __name__ == '__main__': + + # Generate a NCCL ID to be used for collective communication + nccl_id = singa.NcclIdHolder() + + # Configure the number of GPUs to be used + world_size = int(sys.argv[1]) + + # Testing the experimental partial-parameter update asynchronous training + partial_update = True + + process = [] + for local_rank in range(0, world_size): + process.append( + multiprocessing.Process(target=train_cifar10, + args=(True, local_rank, world_size, nccl_id, + partial_update))) + + for p in process: + p.start() \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_cnn.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_cnn.py new file mode 100644 index 000000000..16752ceab --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_cnn.py @@ -0,0 +1,304 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import singa_wrap as singa +from singa import autograd +from singa import layer +from singa import tensor +from singa import device +from singa import opt +import numpy as np +import os +import sys +import gzip +import codecs +import time + + +class CNN: + + def __init__(self): + self.conv1 = layer.Conv2d(1, 20, 5, padding=0) + self.conv2 = layer.Conv2d(20, 50, 5, padding=0) + self.linear1 = layer.Linear(4 * 4 * 50, 500) + self.linear2 = layer.Linear(500, 10) + self.pooling1 = layer.MaxPool2d(2, 2, padding=0) + self.pooling2 = layer.MaxPool2d(2, 2, padding=0) + self.relu1 = layer.ReLU() + self.relu2 = layer.ReLU() + self.relu3 = layer.ReLU() + self.flatten = layer.Flatten() + + def forward(self, x): + y = self.conv1(x) + y = self.relu1(y) + y = self.pooling1(y) + y = self.conv2(y) + y = self.relu2(y) + y = self.pooling2(y) + y = self.flatten(y) + y = self.linear1(y) + y = self.relu3(y) + y = self.linear2(y) + return y + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'The MNIST dataset does not exist. Please download the mnist dataset using download_mnist.py (e.g. python3 download_mnist.py)' + ) + sys.exit(0) + return dirpath + + +def load_dataset(): + train_x_path = '/tmp/train-images-idx3-ubyte.gz' + train_y_path = '/tmp/train-labels-idx1-ubyte.gz' + valid_x_path = '/tmp/t10k-images-idx3-ubyte.gz' + valid_y_path = '/tmp/t10k-labels-idx1-ubyte.gz' + + train_x = read_image_file(check_dataset_exist(train_x_path)).astype( + np.float32) + train_y = read_label_file(check_dataset_exist(train_y_path)).astype( + np.float32) + valid_x = read_image_file(check_dataset_exist(valid_x_path)).astype( + np.float32) + valid_y = read_label_file(check_dataset_exist(valid_y_path)).astype( + np.float32) + return train_x, train_y, valid_x, valid_y + + +def read_label_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2049 + length = get_int(data[4:8]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=8).reshape((length)) + return parsed + + +def get_int(b): + return int(codecs.encode(b, 'hex'), 16) + + +def read_image_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2051 + length = get_int(data[4:8]) + num_rows = get_int(data[8:12]) + num_cols = get_int(data[12:16]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=16).reshape( + (length, 1, num_rows, num_cols)) + return parsed + + +def to_categorical(y, num_classes): + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + categorical[np.arange(n), y] = 1 + categorical = categorical.astype(np.float32) + return categorical + + +def accuracy(pred, target): + y = np.argmax(pred, axis=1) + t = np.argmax(target, axis=1) + a = y == t + return np.array(a, "int").sum() + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +# Function to sychronize SINGA TENSOR initial model parameters +def synchronize(tensor, dist_opt): + dist_opt.all_reduce(tensor.data) + dist_opt.wait() + tensor /= dist_opt.world_size + + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, offset[0]:offset[0] + 28, + offset[1]:offset[1] + 28] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Data partition +def data_partition(dataset_x, dataset_y, global_rank, world_size): + data_per_rank = dataset_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + return dataset_x[idx_start:idx_end], dataset_y[idx_start:idx_end] + + +def train_mnist_cnn(DIST=False, + local_rank=None, + world_size=None, + nccl_id=None, + spars=0, + topK=False, + corr=True): + + # Define the hypermeters for the mnist_cnn + max_epoch = 10 + batch_size = 64 + sgd = opt.SGD(lr=0.005, momentum=0.9, weight_decay=1e-5) + + # Prepare training and valadiation data + train_x, train_y, test_x, test_y = load_dataset() + IMG_SIZE = 28 + num_classes = 10 + train_y = to_categorical(train_y, num_classes) + test_y = to_categorical(test_y, num_classes) + + # Normalization + train_x = train_x / 255 + test_x = test_x / 255 + + if DIST: + # For distributed GPU training + sgd = opt.DistOpt(sgd, + nccl_id=nccl_id, + local_rank=local_rank, + world_size=world_size) + dev = device.create_cuda_gpu_on(sgd.local_rank) + + # Dataset partition for distributed training + train_x, train_y = data_partition(train_x, train_y, sgd.global_rank, + sgd.world_size) + test_x, test_y = data_partition(test_x, test_y, sgd.global_rank, + sgd.world_size) + world_size = sgd.world_size + else: + # For single GPU + dev = device.create_cuda_gpu() + world_size = 1 + + # Create model + model = CNN() + + tx = tensor.Tensor((batch_size, 1, IMG_SIZE, IMG_SIZE), dev, tensor.float32) + ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_test_batch = test_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + if DIST: + #Sychronize the initial parameters + autograd.training = True + x = np.random.randn(batch_size, 1, IMG_SIZE, + IMG_SIZE).astype(np.float32) + y = np.zeros(shape=(batch_size, num_classes), dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model.forward(tx) + loss = autograd.softmax_cross_entropy(out, ty) + for p, g in autograd.backward(loss): + synchronize(p, sgd) + + # Training and evaulation loop + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if ((DIST == False) or (sgd.global_rank == 0)): + print('Starting Epoch %d:' % (epoch)) + + # Training phase + autograd.training = True + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + for b in range(num_train_batch): + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + x = augmentation(x, batch_size) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model.forward(tx) + loss = autograd.softmax_cross_entropy(out, ty) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + if DIST: + if (spars == 0): + sgd.backward_and_update(loss, threshold=50000) + else: + sgd.backward_and_sparse_update(loss, + spars=spars, + topK=topK, + corr=corr) + else: + sgd(loss) + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, sgd, reducer) + train_loss = reduce_variable(train_loss, sgd, reducer) + + # Output the training loss and accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + # Evaluation phase + autograd.training = False + for b in range(num_test_batch): + x = test_x[b * batch_size:(b + 1) * batch_size] + y = test_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model.forward(tx) + test_correct += accuracy(tensor.to_numpy(out_test), y) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, sgd, reducer) + + # Output the evaluation accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_test_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + +if __name__ == '__main__': + + DIST = False + train_mnist_cnn(DIST=DIST) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_dist.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_dist.py new file mode 100644 index 000000000..3586127c4 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_dist.py @@ -0,0 +1,25 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from mnist_cnn import * + +if __name__ == '__main__': + + DIST = True + train_mnist_cnn(DIST=DIST) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_multiprocess.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_multiprocess.py new file mode 100644 index 000000000..f51344ff0 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/mnist_multiprocess.py @@ -0,0 +1,39 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from mnist_cnn import * +import multiprocessing +import sys + +if __name__ == '__main__': + + # Generate a NCCL ID to be used for collective communication + nccl_id = singa.NcclIdHolder() + + # Number of GPUs to be used + world_size = int(sys.argv[1]) + + process = [] + for local_rank in range(0, world_size): + process.append( + multiprocessing.Process(target=train_mnist_cnn, + args=(True, local_rank, world_size, nccl_id))) + + for p in process: + p.start() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_cifar10.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_cifar10.py new file mode 100644 index 000000000..754173699 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_cifar10.py @@ -0,0 +1,292 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +try: + import pickle +except ImportError: + import cPickle as pickle + +from singa import singa_wrap as singa +from singa import autograd +from singa import tensor +from singa import device +from singa import opt +from PIL import Image +import numpy as np +import os +import sys +import time + + +def load_dataset(filepath): + with open(filepath, 'rb') as fd: + try: + cifar10 = pickle.load(fd, encoding='latin1') + except TypeError: + cifar10 = pickle.load(fd) + image = cifar10['data'].astype(dtype=np.uint8) + image = image.reshape((-1, 3, 32, 32)) + label = np.asarray(cifar10['labels'], dtype=np.uint8) + label = label.reshape(label.size, 1) + return image, label + + +def load_train_data(dir_path='cifar-10-batches-py', num_batches=5): + labels = [] + batchsize = 10000 + images = np.empty((num_batches * batchsize, 3, 32, 32), dtype=np.uint8) + for did in range(1, num_batches + 1): + fname_train_data = dir_path + "/data_batch_{}".format(did) + image, label = load_dataset(check_dataset_exist(fname_train_data)) + images[(did - 1) * batchsize:did * batchsize] = image + labels.extend(label) + images = np.array(images, dtype=np.float32) + labels = np.array(labels, dtype=np.int32) + return images, labels + + +def load_test_data(dir_path='cifar-10-batches-py'): + images, labels = load_dataset(check_dataset_exist(dir_path + "/test_batch")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'Please download the cifar10 dataset using download_data.py (e.g. python ~/singa/examples/cifar10/download_data.py py)' + ) + sys.exit(0) + return dirpath + + +def normalize_for_resnet(train_x, test_x): + mean = [0.4914, 0.4822, 0.4465] + std = [0.2023, 0.1994, 0.2010] + train_x /= 255 + test_x /= 255 + for ch in range(0, 2): + train_x[:, ch, :, :] -= mean[ch] + train_x[:, ch, :, :] /= std[ch] + test_x[:, ch, :, :] -= mean[ch] + test_x[:, ch, :, :] /= std[ch] + return train_x, test_x + + +def resize_dataset(x, IMG_SIZE): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, IMG_SIZE, IMG_SIZE), dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (IMG_SIZE, IMG_SIZE), Image.BILINEAR), + dtype=np.float32) + return X + + +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, offset[0]:offset[0] + 32, + offset[1]:offset[1] + 32] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +def accuracy(pred, target): + y = np.argmax(pred, axis=1) + t = np.argmax(target, axis=1) + a = y == t + return np.array(a, "int").sum() + + +def to_categorical(y, num_classes): + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + for i in range(0, n): + categorical[i, y[i]] = 1 + categorical = categorical.astype(np.float32) + return categorical + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +# Function to sychronize SINGA TENSOR initial model parameters +def synchronize(tensor, dist_opt): + dist_opt.all_reduce(tensor.data) + dist_opt.wait() + tensor /= dist_opt.world_size + + +# Data partition +def data_partition(dataset_x, dataset_y, global_rank, world_size): + data_per_rank = dataset_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + return dataset_x[idx_start:idx_end], dataset_y[idx_start:idx_end] + + +def train_cifar10(DIST=False, + local_rank=None, + world_size=None, + nccl_id=None, + partial_update=False): + + # Define the hypermeters for the train_cifar10 + sgd = opt.SGD(lr=0.005, momentum=0.9, weight_decay=1e-5) + max_epoch = 5 + batch_size = 32 + + train_x, train_y = load_train_data() + test_x, test_y = load_test_data() + train_x, test_x = normalize_for_resnet(train_x, test_x) + IMG_SIZE = 224 + num_classes = 10 + + if DIST: + # For distributed GPU training + sgd = opt.DistOpt(sgd, + nccl_id=nccl_id, + local_rank=local_rank, + world_size=world_size) + dev = device.create_cuda_gpu_on(sgd.local_rank) + + # Dataset partition for distributed training + train_x, train_y = data_partition(train_x, train_y, sgd.global_rank, + sgd.world_size) + test_x, test_y = data_partition(test_x, test_y, sgd.global_rank, + sgd.world_size) + world_size = sgd.world_size + else: + # For single GPU + dev = device.create_cuda_gpu() + world_size = 1 + + from resnet import resnet50 + model = resnet50(num_classes=num_classes) + + tx = tensor.Tensor((batch_size, 3, IMG_SIZE, IMG_SIZE), dev, tensor.float32) + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_test_batch = test_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + if DIST: + # Sychronize the initial parameters + autograd.training = True + x = np.random.randn(batch_size, 3, IMG_SIZE, + IMG_SIZE).astype(np.float32) + y = np.zeros(shape=(batch_size,), dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model(tx) + loss = autograd.softmax_cross_entropy(out, ty) + param = [] + for p, _ in autograd.backward(loss): + synchronize(p, sgd) + param.append(p) + + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if ((DIST == False) or (sgd.global_rank == 0)): + print('Starting Epoch %d:' % (epoch)) + + # Training phase + autograd.training = True + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + for b in range(num_train_batch): + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + x = augmentation(x, batch_size) + x = resize_dataset(x, IMG_SIZE) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model(tx) + loss = autograd.softmax_cross_entropy(out, ty) + train_correct += accuracy(tensor.to_numpy(out), + to_categorical(y, num_classes)).astype( + np.float32) + train_loss += tensor.to_numpy(loss)[0] + if not partial_update: + sgd.backward_and_update(loss) + else: + sgd.backward_and_partial_update(loss) + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, sgd, reducer) + train_loss = reduce_variable(train_loss, sgd, reducer) + + # Output the training loss and accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + if partial_update: + # Sychronize parameters before evaluation phase + for p in param: + synchronize(p, sgd) + + # Evaulation phase + autograd.training = False + for b in range(num_test_batch): + x = test_x[b * batch_size:(b + 1) * batch_size] + x = resize_dataset(x, IMG_SIZE) + y = test_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model(tx) + test_correct += accuracy(tensor.to_numpy(out_test), + to_categorical(y, num_classes)) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, sgd, reducer) + + # Output the evaluation accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_test_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + +if __name__ == '__main__': + + DIST = False + train_cifar10(DIST=DIST) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_dist.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_dist.py new file mode 100644 index 000000000..6f9b56cee --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/resnet_dist.py @@ -0,0 +1,87 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# the code is modified from +# https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py + +from singa import autograd +from singa import tensor +from singa import device +from singa import opt + +import numpy as np +from tqdm import trange + +if __name__ == "__main__": + sgd = opt.SGD(lr=0.1, momentum=0.9, weight_decay=1e-5) + sgd = opt.DistOpt(sgd) + + if (sgd.global_rank == 0): + print("Start intialization...........", flush=True) + + dev = device.create_cuda_gpu_on(sgd.local_rank) + + from resnet import resnet50 + model = resnet50() + + niters = 100 + batch_size = 32 + IMG_SIZE = 224 + + tx = tensor.Tensor((batch_size, 3, IMG_SIZE, IMG_SIZE), dev) + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + autograd.training = True + x = np.random.randn(batch_size, 3, IMG_SIZE, IMG_SIZE).astype(np.float32) + y = np.random.randint(0, 1000, batch_size, dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + + import time + + dev.Sync() + start = time.time() + fd = 0 + softmax = 0 + update = 0 + with trange(niters) as t: + for _ in t: + dev.Sync() + tick = time.time() + x = model(tx) + dev.Sync() + fd += time.time() - tick + tick = time.time() + loss = autograd.softmax_cross_entropy(x, ty) + dev.Sync() + softmax += time.time() - tick + sgd.backward_and_update(loss) + + dev.Sync() + end = time.time() + throughput = float(sgd.world_size * niters * batch_size) / (end - start) + titer = (end - start) / float(niters) + tforward = float(fd) / float(niters) + tsoftmax = float(softmax) / float(niters) + tbackward = titer - tforward - tsoftmax + + if (sgd.global_rank == 0): + print("\nThroughput = {} per second".format(throughput), flush=True) + print("Total={}, forward={}, softmax={}, backward={}".format( + titer, tforward, tsoftmax, tbackward), + flush=True) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/sparsification_mnist.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/sparsification_mnist.py new file mode 100644 index 000000000..315605acd --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/sparsification_mnist.py @@ -0,0 +1,45 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from mnist_cnn import * +import multiprocessing +import sys + +if __name__ == '__main__': + + # Generate a NCCL ID to be used for collective communication + nccl_id = singa.NcclIdHolder() + + # Number of GPUs to be used + world_size = int(sys.argv[1]) + + # Use sparsification with parameters + topK = False # When topK = False, Sparsification based on a constant absolute threshold + corr = True # If True, uses local accumulate gradient for the correction + sparsThreshold = 0.05 # The constant absolute threshold for sparsification + + process = [] + for local_rank in range(0, world_size): + process.append( + multiprocessing.Process(target=train_mnist_cnn, + args=(True, local_rank, world_size, nccl_id, + sparsThreshold, topK, corr))) + + for p in process: + p.start() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/xceptionnet.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/xceptionnet.py new file mode 100644 index 000000000..8fb23d8cb --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/autograd/xceptionnet.py @@ -0,0 +1,303 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +from singa import autograd +from singa import tensor +from singa import device +from singa import layer +from singa import opt + +import numpy as np +from tqdm import trange + +# the code is modified from +# https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/xception.py + + +class Block(layer.Layer): + + def __init__(self, + in_filters, + out_filters, + reps, + strides=1, + padding=0, + start_with_relu=True, + grow_first=True): + super(Block, self).__init__() + + if out_filters != in_filters or strides != 1: + self.skip = layer.Conv2d(in_filters, + out_filters, + 1, + stride=strides, + padding=padding, + bias=False) + self.skipbn = layer.BatchNorm2d(out_filters) + else: + self.skip = None + + self.layers = [] + + filters = in_filters + if grow_first: + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(in_filters, + out_filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(out_filters)) + filters = out_filters + + for i in range(reps - 1): + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(filters, + filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(filters)) + + if not grow_first: + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(in_filters, + out_filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(out_filters)) + + if not start_with_relu: + self.layers = self.layers[1:] + else: + self.layers[0] = layer.ReLU() + + if strides != 1: + self.layers.append(layer.MaxPool2d(3, strides, padding + 1)) + + self.register_layers(*self.layers) + + self.add = layer.Add() + + def forward(self, x): + y = self.layers[0](x) + for layer in self.layers[1:]: + if isinstance(y, tuple): + y = y[0] + y = layer(y) + + if self.skip is not None: + skip = self.skip(x) + skip = self.skipbn(skip) + else: + skip = x + y = self.add(y, skip) + return y + + +__all__ = ['Xception'] + + +class Xception(layer.Layer): + """ + Xception optimized for the ImageNet dataset, as specified in + https://arxiv.org/pdf/1610.02357.pdf + """ + + def __init__(self, num_classes=1000): + """ Constructor + Args: + num_classes: number of classes + """ + super(Xception, self).__init__() + self.num_classes = num_classes + + self.conv1 = layer.Conv2d(3, 32, 3, 2, 0, bias=False) + self.bn1 = layer.BatchNorm2d(32) + self.relu1 = layer.ReLU() + + self.conv2 = layer.Conv2d(32, 64, 3, 1, 1, bias=False) + self.bn2 = layer.BatchNorm2d(64) + self.relu2 = layer.ReLU() + # do relu here + + self.block1 = Block(64, + 128, + 2, + 2, + padding=0, + start_with_relu=False, + grow_first=True) + self.block2 = Block(128, + 256, + 2, + 2, + padding=0, + start_with_relu=True, + grow_first=True) + self.block3 = Block(256, + 728, + 2, + 2, + padding=0, + start_with_relu=True, + grow_first=True) + + self.block4 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block5 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block6 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block7 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + + self.block8 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block9 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block10 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block11 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + + self.block12 = Block(728, + 1024, + 2, + 2, + start_with_relu=True, + grow_first=False) + + self.conv3 = layer.SeparableConv2d(1024, 1536, 3, 1, 1) + self.bn3 = layer.BatchNorm2d(1536) + self.relu3 = layer.ReLU() + + # Relu Layer + self.conv4 = layer.SeparableConv2d(1536, 2048, 3, 1, 1) + self.bn4 = layer.BatchNorm2d(2048) + + self.relu4 = layer.ReLU() + self.globalpooling = layer.MaxPool2d(10, 1) + self.flatten = layer.Flatten() + self.fc = layer.Linear(2048, num_classes) + + def features(self, input): + x = self.conv1(input) + x = self.bn1(x) + x = self.relu1(x) + + x = self.conv2(x) + x = self.bn2(x) + x = self.relu2(x) + + x = self.block1(x) + x = self.block2(x) + x = self.block3(x) + x = self.block4(x) + x = self.block5(x) + x = self.block6(x) + x = self.block7(x) + x = self.block8(x) + x = self.block9(x) + x = self.block10(x) + x = self.block11(x) + x = self.block12(x) + + x = self.conv3(x) + x = self.bn3(x) + x = self.relu3(x) + + x = self.conv4(x) + x = self.bn4(x) + return x + + def logits(self, features): + x = self.relu4(features) + x = self.globalpooling(x) + x = self.flatten(x) + x = self.fc(x) + return x + + def forward(self, input): + x = self.features(input) + x = self.logits(x) + return x + + +if __name__ == '__main__': + model = Xception(num_classes=1000) + print('Start intialization............') + dev = device.create_cuda_gpu_on(0) + #dev = device.create_cuda_gpu() + + niters = 20 + batch_size = 16 + IMG_SIZE = 299 + sgd = opt.SGD(lr=0.1, momentum=0.9, weight_decay=1e-5) + + tx = tensor.Tensor((batch_size, 3, IMG_SIZE, IMG_SIZE), dev) + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + autograd.training = True + x = np.random.randn(batch_size, 3, IMG_SIZE, IMG_SIZE).astype(np.float32) + y = np.random.randint(0, 1000, batch_size, dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + + with trange(niters) as t: + for _ in t: + x = model(tx) + loss = autograd.softmax_cross_entropy(x, ty) + sgd(loss) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/benchmark.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/benchmark.py new file mode 100644 index 000000000..9f69feee0 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/benchmark.py @@ -0,0 +1,121 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# the code is modified from +# https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py + +from singa import opt +from singa import device +from singa import tensor + +import argparse +import time +import numpy as np +from tqdm import trange + + +def train_resnet(DIST=True, graph=True, sequential=False, verbosity=0): + + # Define the hypermeters for the train_resnet + niters = 100 + batch_size = 32 + sgd = opt.SGD(lr=0.1, momentum=0.9, weight_decay=1e-5) + + IMG_SIZE = 224 + + # For distributed training, sequential has better throughput in the current version + if DIST == True: + sgd = opt.DistOpt(sgd) + world_size = sgd.world_size + local_rank = sgd.local_rank + global_rank = sgd.global_rank + sequential = True + else: + local_rank = 0 + world_size = 1 + global_rank = 0 + sequential = False + + dev = device.create_cuda_gpu_on(local_rank) + + tx = tensor.Tensor((batch_size, 3, IMG_SIZE, IMG_SIZE), dev) + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + x = np.random.randn(batch_size, 3, IMG_SIZE, IMG_SIZE).astype(np.float32) + y = np.random.randint(0, 1000, batch_size, dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + + dev.SetVerbosity(verbosity) + dev.SetSkipIteration(5) + + # Construct the model + from model import resnet + model = resnet.resnet50(num_channels=3, num_classes=1000) + + model.train() + model.set_optimizer(sgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + + # Train model + dev.Sync() + start = time.time() + with trange(niters) as t: + for _ in t: + model(tx, ty, dist_option='fp32', spars=None) + + dev.Sync() + end = time.time() + titer = (end - start) / float(niters) + throughput = float(niters * batch_size * world_size) / (end - start) + if global_rank == 0: + print("\nThroughput = {} per second".format(throughput), flush=True) + print("TotalTime={}".format(end - start), flush=True) + print("Total={}".format(titer), flush=True) + dev.PrintTimeProfiling() + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser( + description='Throughput test using Resnet 50') + parser.add_argument('--dist', + '--enable-dist', + default='False', + action='store_true', + help='enable distributed training', + dest='DIST') + parser.add_argument('--no-graph', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('--verbosity', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + train_resnet(DIST=args.DIST, + graph=args.graph, + sequential=False, + verbosity=args.verbosity) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar10.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar10.py new file mode 100644 index 000000000..5caaf30f4 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar10.py @@ -0,0 +1,89 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +try: + import pickle +except ImportError: + import cPickle as pickle + +import numpy as np +import os +import sys + + +def load_dataset(filepath): + with open(filepath, 'rb') as fd: + try: + cifar10 = pickle.load(fd, encoding='latin1') + except TypeError: + cifar10 = pickle.load(fd) + image = cifar10['data'].astype(dtype=np.uint8) + image = image.reshape((-1, 3, 32, 32)) + label = np.asarray(cifar10['labels'], dtype=np.uint8) + label = label.reshape(label.size, 1) + return image, label + + +def load_train_data(dir_path='/tmp/cifar-10-batches-py', num_batches=5): # need to save to specific local directories + labels = [] + batchsize = 10000 + images = np.empty((num_batches * batchsize, 3, 32, 32), dtype=np.uint8) + for did in range(1, num_batches + 1): + fname_train_data = dir_path + "/data_batch_{}".format(did) + image, label = load_dataset(check_dataset_exist(fname_train_data)) + images[(did - 1) * batchsize:did * batchsize] = image + labels.extend(label) + images = np.array(images, dtype=np.float32) + labels = np.array(labels, dtype=np.int32) + return images, labels + + +def load_test_data(dir_path='/tmp/cifar-10-batches-py'): # need to save to specific local directories + images, labels = load_dataset(check_dataset_exist(dir_path + "/test_batch")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'Please download the cifar10 dataset using python data/download_cifar10.py' + ) + sys.exit(0) + return dirpath + + +def normalize(train_x, val_x): + mean = [0.4914, 0.4822, 0.4465] + std = [0.2023, 0.1994, 0.2010] + train_x /= 255 + val_x /= 255 + for ch in range(0, 2): + train_x[:, ch, :, :] -= mean[ch] + train_x[:, ch, :, :] /= std[ch] + val_x[:, ch, :, :] -= mean[ch] + val_x[:, ch, :, :] /= std[ch] + return train_x, val_x + +def load(): + train_x, train_y = load_train_data() + val_x, val_y = load_test_data() + train_x, val_x = normalize(train_x, val_x) + train_y = train_y.flatten() + val_y = val_y.flatten() + return train_x, train_y, val_x, val_y diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar100.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar100.py new file mode 100644 index 000000000..88b943f07 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/cifar100.py @@ -0,0 +1,81 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +try: + import pickle +except ImportError: + import cPickle as pickle + +import numpy as np +import os +import sys + + +def load_dataset(filepath): + with open(filepath, 'rb') as fd: + try: + cifar100 = pickle.load(fd, encoding='latin1') + except TypeError: + cifar100 = pickle.load(fd) + image = cifar100['data'].astype(dtype=np.uint8) + image = image.reshape((-1, 3, 32, 32)) + label = np.asarray(cifar100['fine_labels'], dtype=np.uint8) + label = label.reshape(label.size, 1) + return image, label + + +def load_train_data(dir_path='/tmp/cifar-100-python'): + images, labels = load_dataset(check_dataset_exist(dir_path + "/train")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def load_test_data(dir_path='/tmp/cifar-100-python'): + images, labels = load_dataset(check_dataset_exist(dir_path + "/test")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'Please download the cifar100 dataset using python data/download_cifar100.py' + ) + sys.exit(0) + return dirpath + + +def normalize(train_x, val_x): + mean = [0.4914, 0.4822, 0.4465] + std = [0.2023, 0.1994, 0.2010] + train_x /= 255 + val_x /= 255 + for ch in range(0, 2): + train_x[:, ch, :, :] -= mean[ch] + train_x[:, ch, :, :] /= std[ch] + val_x[:, ch, :, :] -= mean[ch] + val_x[:, ch, :, :] /= std[ch] + return train_x, val_x + + +def load(): + train_x, train_y = load_train_data() + val_x, val_y = load_test_data() + train_x, val_x = normalize(train_x, val_x) + train_y = train_y.flatten() + val_y = val_y.flatten() + return train_x, train_y, val_x, val_y diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar10.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar10.py new file mode 100755 index 000000000..8e4467921 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar10.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import print_function +from future import standard_library +standard_library.install_aliases() +import urllib.request, urllib.parse, urllib.error +import tarfile +import os +import sys + + +def extract_tarfile(filepath): + if os.path.exists(filepath): + print('The tar file does exist. Extracting it now..') + with tarfile.open(filepath, 'r') as f: + f.extractall('/tmp/') # need to specify a local directory + print('Finished!') + sys.exit(0) + + +def do_download(dirpath, gzfile, url): + print('Downloading CIFAR from %s' % (url)) + urllib.request.urlretrieve(url, gzfile) + extract_tarfile(gzfile) + print('Finished!') + + +if __name__ == '__main__': + dirpath = '/tmp/' # need to specify a local directory + gzfile = dirpath + 'cifar-10-python.tar.gz' + url = 'http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz' + do_download(dirpath, gzfile, url) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar100.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar100.py new file mode 100755 index 000000000..5f1e21b78 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_cifar100.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from download_cifar10 import do_download + +if __name__ == '__main__': + dirpath = '/tmp/' # need to specify a local directory + gzfile = dirpath + 'cifar-100-python.tar.gz' + url = 'http://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz' + do_download(dirpath, gzfile, url) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_mnist.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_mnist.py new file mode 100644 index 000000000..65acb0e28 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/download_mnist.py @@ -0,0 +1,49 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import os +import urllib.request + + +def check_exist_or_download(url): + + download_dir = '/tmp/' + name = url.rsplit('/', 1)[-1] + filename = os.path.join(download_dir, name) + + if not os.path.isfile(filename): + print("Downloading %s" % url) + urllib.request.urlretrieve(url, filename) + else: + print("Already Downloaded: %s" % url) + + +if __name__ == '__main__': + + #url of the mnist dataset + train_x_url = 'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz' + train_y_url = 'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz' + valid_x_url = 'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz' + valid_y_url = 'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz' + + #download the mnist dataset + check_exist_or_download(train_x_url) + check_exist_or_download(train_y_url) + check_exist_or_download(valid_x_url) + check_exist_or_download(valid_y_url) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/mnist.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/mnist.py new file mode 100644 index 000000000..b25bf5e67 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/data/mnist.py @@ -0,0 +1,91 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import numpy as np +import os +import sys +import gzip +import codecs + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'The MNIST dataset does not exist. Please download the mnist dataset using python data/download_mnist.py' + ) + sys.exit(0) + return dirpath + + +def load_dataset(): + train_x_path = '/tmp/train-images-idx3-ubyte.gz' # need to change to local disk + train_y_path = '/tmp/train-labels-idx1-ubyte.gz' # need to change to local disk + valid_x_path = '/tmp/t10k-images-idx3-ubyte.gz' # need to change to local disk + valid_y_path = '/tmp/t10k-labels-idx1-ubyte.gz' # need to change to local disk + + train_x = read_image_file(check_dataset_exist(train_x_path)).astype( + np.float32) + train_y = read_label_file(check_dataset_exist(train_y_path)).astype( + np.float32) + valid_x = read_image_file(check_dataset_exist(valid_x_path)).astype( + np.float32) + valid_y = read_label_file(check_dataset_exist(valid_y_path)).astype( + np.float32) + return train_x, train_y, valid_x, valid_y + + +def read_label_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2049 + length = get_int(data[4:8]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=8).reshape((length)) + return parsed + + +def get_int(b): + return int(codecs.encode(b, 'hex'), 16) + + +def read_image_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2051 + length = get_int(data[4:8]) + num_rows = get_int(data[8:12]) + num_cols = get_int(data[12:16]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=16).reshape( + (length, 1, num_rows, num_cols)) + return parsed + + +def normalize(train_x, val_x): + train_x /= 255 + val_x /= 255 + return train_x, val_x + + +def load(): + train_x, train_y, val_x, val_y = load_dataset() + train_x, val_x = normalize(train_x, val_x) + train_x = train_x.astype(np.float32) + val_x = val_x.astype(np.float32) + train_y = train_y.astype(np.int32) + val_y = val_y.astype(np.int32) + return train_x, train_y, val_x, val_y diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/alexnet.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/alexnet.py new file mode 100644 index 000000000..cad7b1e3f --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/alexnet.py @@ -0,0 +1,119 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model + + +class AlexNet(model.Model): + + def __init__(self, num_classes=10, num_channels=1): + super(AlexNet, self).__init__() + self.num_classes = num_classes + self.input_size = 224 + self.dimension = 4 + self.conv1 = layer.Conv2d(num_channels, 64, 11, stride=4, padding=2) + self.conv2 = layer.Conv2d(64, 192, 5, padding=2) + self.conv3 = layer.Conv2d(192, 384, 3, padding=1) + self.conv4 = layer.Conv2d(384, 256, 3, padding=1) + self.conv5 = layer.Conv2d(256, 256, 3, padding=1) + self.linear1 = layer.Linear(4096) + self.linear2 = layer.Linear(4096) + self.linear3 = layer.Linear(num_classes) + self.pooling1 = layer.MaxPool2d(2, 2, padding=0) + self.pooling2 = layer.MaxPool2d(2, 2, padding=0) + self.pooling3 = layer.MaxPool2d(2, 2, padding=0) + self.avg_pooling1 = layer.AvgPool2d(3, 2, padding=0) + self.relu1 = layer.ReLU() + self.relu2 = layer.ReLU() + self.relu3 = layer.ReLU() + self.relu4 = layer.ReLU() + self.relu5 = layer.ReLU() + self.relu6 = layer.ReLU() + self.relu7 = layer.ReLU() + self.flatten = layer.Flatten() + self.dropout1 = layer.Dropout() + self.dropout2 = layer.Dropout() + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + def forward(self, x): + y = self.conv1(x) + y = self.relu1(y) + y = self.pooling1(y) + y = self.conv2(y) + y = self.relu2(y) + y = self.pooling2(y) + y = self.conv3(y) + y = self.relu3(y) + y = self.conv4(y) + y = self.relu4(y) + y = self.conv5(y) + y = self.relu5(y) + y = self.pooling3(y) + y = self.avg_pooling1(y) + y = self.flatten(y) + y = self.dropout1(y) + y = self.linear1(y) + y = self.relu6(y) + y = self.dropout2(y) + y = self.linear2(y) + y = self.relu7(y) + y = self.linear3(y) + return y + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a AlexNet model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created AlexNet model. + + """ + model = AlexNet(**kwargs) + + return model + + +__all__ = ['AlexNet', 'create_model'] diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/cnn.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/cnn.py new file mode 100644 index 000000000..3877e83af --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/cnn.py @@ -0,0 +1,90 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model + + +class CNN(model.Model): + + def __init__(self, num_classes=10, num_channels=1): + super(CNN, self).__init__() + self.num_classes = num_classes + self.input_size = 28 + self.dimension = 4 + self.conv1 = layer.Conv2d(num_channels, 20, 5, padding=0, activation="RELU") + self.conv2 = layer.Conv2d(20, 50, 5, padding=0, activation="RELU") + self.linear1 = layer.Linear(500) + self.linear2 = layer.Linear(num_classes) + self.pooling1 = layer.MaxPool2d(2, 2, padding=0) + self.pooling2 = layer.MaxPool2d(2, 2, padding=0) + self.relu = layer.ReLU() + self.flatten = layer.Flatten() + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + def forward(self, x): + y = self.conv1(x) + y = self.pooling1(y) + y = self.conv2(y) + y = self.pooling2(y) + y = self.flatten(y) + y = self.linear1(y) + y = self.relu(y) + y = self.linear2(y) + return y + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = CNN(**kwargs) + + return model + + +__all__ = ['CNN', 'create_model'] diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/resnet.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/resnet.py new file mode 100644 index 000000000..28b5f9949 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/resnet.py @@ -0,0 +1,300 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# the code is modified from +# https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py + +from singa import layer +from singa import model + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return layer.Conv2d( + in_planes, + out_planes, + 3, + stride=stride, + padding=1, + bias=False, + ) + + +class BasicBlock(layer.Layer): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = layer.BatchNorm2d(planes) + self.conv2 = conv3x3(planes, planes) + self.bn2 = layer.BatchNorm2d(planes) + self.relu1 = layer.ReLU() + self.add = layer.Add() + self.relu2 = layer.ReLU() + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu1(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out = self.add(out, residual) + out = self.relu2(out) + + return out + + +class Bottleneck(layer.Layer): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = layer.Conv2d(inplanes, planes, 1, bias=False) + self.bn1 = layer.BatchNorm2d(planes) + self.relu1 = layer.ReLU() + self.conv2 = layer.Conv2d(planes, + planes, + 3, + stride=stride, + padding=1, + bias=False) + self.bn2 = layer.BatchNorm2d(planes) + self.relu2 = layer.ReLU() + self.conv3 = layer.Conv2d(planes, + planes * self.expansion, + 1, + bias=False) + self.bn3 = layer.BatchNorm2d(planes * self.expansion) + + self.add = layer.Add() + self.relu3 = layer.ReLU() + + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu1(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu2(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out = self.add(out, residual) + out = self.relu3(out) + + return out + + +__all__ = [ + 'ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152' +] + + +class ResNet(model.Model): + + def __init__(self, block, layers, num_classes=10, num_channels=3): + self.inplanes = 64 + super(ResNet, self).__init__() + self.num_classes = num_classes + self.input_size = 224 + self.dimension = 4 + self.conv1 = layer.Conv2d(num_channels, + 64, + 7, + stride=2, + padding=3, + bias=False) + self.bn1 = layer.BatchNorm2d(64) + self.relu = layer.ReLU() + self.maxpool = layer.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1, layers1 = self._make_layer(block, 64, layers[0]) + self.layer2, layers2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3, layers3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4, layers4 = self._make_layer(block, 512, layers[3], stride=2) + self.avgpool = layer.AvgPool2d(7, stride=1) + self.flatten = layer.Flatten() + self.fc = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + self.register_layers(*layers1, *layers2, *layers3, *layers4) + + def _make_layer(self, block, planes, blocks, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + conv = layer.Conv2d( + self.inplanes, + planes * block.expansion, + 1, + stride=stride, + bias=False, + ) + bn = layer.BatchNorm2d(planes * block.expansion) + + def _downsample(x): + return bn(conv(x)) + + downsample = _downsample + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes)) + + def forward(x): + for layer in layers: + x = layer(x) + return x + + return forward, layers + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = self.flatten(x) + x = self.fc(x) + + return x + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def resnet18(pretrained=False, **kwargs): + """Constructs a ResNet-18 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + + Returns: + The created ResNet-18 model. + """ + model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) + + return model + + +def resnet34(pretrained=False, **kwargs): + """Constructs a ResNet-34 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + + Returns: + The created ResNet-34 model. + """ + model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) + + return model + + +def resnet50(pretrained=False, **kwargs): + """Constructs a ResNet-50 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + + Returns: + The created ResNet-50 model. + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) + + return model + + +def resnet101(pretrained=False, **kwargs): + """Constructs a ResNet-101 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + + Returns: + The created ResNet-101 model. + """ + model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) + + return model + + +def resnet152(pretrained=False, **kwargs): + """Constructs a ResNet-152 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + + Returns: + The created ResNet-152 model. + """ + model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) + + return model + + +__all__ = [ + 'ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152' +] diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/xceptionnet.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/xceptionnet.py new file mode 100644 index 000000000..34440ab9d --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/model/xceptionnet.py @@ -0,0 +1,311 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +# the code is modified from +# https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/xception.py + +from singa import layer +from singa import model + + +class Block(layer.Layer): + + def __init__(self, + in_filters, + out_filters, + reps, + strides=1, + padding=0, + start_with_relu=True, + grow_first=True): + super(Block, self).__init__() + + if out_filters != in_filters or strides != 1: + self.skip = layer.Conv2d(in_filters, + out_filters, + 1, + stride=strides, + padding=padding, + bias=False) + self.skipbn = layer.BatchNorm2d(out_filters) + else: + self.skip = None + + self.layers = [] + + filters = in_filters + if grow_first: + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(in_filters, + out_filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(out_filters)) + filters = out_filters + + for i in range(reps - 1): + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(filters, + filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(filters)) + + if not grow_first: + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(in_filters, + out_filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(out_filters)) + + if not start_with_relu: + self.layers = self.layers[1:] + else: + self.layers[0] = layer.ReLU() + + if strides != 1: + self.layers.append(layer.MaxPool2d(3, strides, padding + 1)) + + self.register_layers(*self.layers) + + self.add = layer.Add() + + def forward(self, x): + y = self.layers[0](x) + for layer in self.layers[1:]: + if isinstance(y, tuple): + y = y[0] + y = layer(y) + + if self.skip is not None: + skip = self.skip(x) + skip = self.skipbn(skip) + else: + skip = x + y = self.add(y, skip) + return y + + +class Xception(model.Model): + """ + Xception optimized for the ImageNet dataset, as specified in + https://arxiv.org/pdf/1610.02357.pdf + """ + + def __init__(self, num_classes=10, num_channels=3): + """ Constructor + Args: + num_classes: number of classes + """ + super(Xception, self).__init__() + self.num_classes = num_classes + self.input_size = 299 + self.dimension = 4 + + self.conv1 = layer.Conv2d(num_channels, 32, 3, 2, 0, bias=False) + self.bn1 = layer.BatchNorm2d(32) + self.relu1 = layer.ReLU() + + self.conv2 = layer.Conv2d(32, 64, 3, 1, 1, bias=False) + self.bn2 = layer.BatchNorm2d(64) + self.relu2 = layer.ReLU() + # do relu here + + self.block1 = Block(64, + 128, + 2, + 2, + padding=0, + start_with_relu=False, + grow_first=True) + self.block2 = Block(128, + 256, + 2, + 2, + padding=0, + start_with_relu=True, + grow_first=True) + self.block3 = Block(256, + 728, + 2, + 2, + padding=0, + start_with_relu=True, + grow_first=True) + + self.block4 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block5 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block6 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block7 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + + self.block8 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block9 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block10 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block11 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + + self.block12 = Block(728, + 1024, + 2, + 2, + start_with_relu=True, + grow_first=False) + + self.conv3 = layer.SeparableConv2d(1024, 1536, 3, 1, 1) + self.bn3 = layer.BatchNorm2d(1536) + self.relu3 = layer.ReLU() + + # do relu here + self.conv4 = layer.SeparableConv2d(1536, 2048, 3, 1, 1) + self.bn4 = layer.BatchNorm2d(2048) + + self.relu4 = layer.ReLU() + self.globalpooling = layer.MaxPool2d(10, 1) + self.flatten = layer.Flatten() + self.fc = layer.Linear(num_classes) + + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + def features(self, input): + x = self.conv1(input) + x = self.bn1(x) + x = self.relu1(x) + + x = self.conv2(x) + x = self.bn2(x) + x = self.relu2(x) + + x = self.block1(x) + x = self.block2(x) + x = self.block3(x) + x = self.block4(x) + x = self.block5(x) + x = self.block6(x) + x = self.block7(x) + x = self.block8(x) + x = self.block9(x) + x = self.block10(x) + x = self.block11(x) + x = self.block12(x) + + x = self.conv3(x) + x = self.bn3(x) + x = self.relu3(x) + + x = self.conv4(x) + x = self.bn4(x) + return x + + def logits(self, features): + x = self.relu4(features) + x = self.globalpooling(x) + x = self.flatten(x) + x = self.fc(x) + return x + + def forward(self, x): + x = self.features(x) + x = self.logits(x) + return x + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a Xceptionnet model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created Xceptionnet model. + """ + model = Xception(**kwargs) + + return model + + +__all__ = ['Xception', 'create_model'] diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/pkg_model_code/model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/pkg_model_code/model.py new file mode 100644 index 000000000..98884584f --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/pkg_model_code/model.py @@ -0,0 +1,357 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ============================================================================= +''' +This script includes Model class for python users +to use Computational Graph in their model. +''' + +import os +import gc +import time +import json +import zipfile +import numpy as np +from functools import wraps +from collections import Iterable + +from singa import tensor +from singa import autograd +from singa import layer +from .tensor import Tensor +from . import singa_wrap as singa + + +class ModelMeta(layer.LayerMeta): + + def buffer_operation(func): + + def remove_creator(tensors): + if not tensors: + return + + if isinstance(tensors, Iterable): + if isinstance(tensors, str): + return + else: + for item in tensors: + if isinstance(item, Iterable): + remove_creator(item) + elif isinstance(item, tensor.Tensor): + item.creator = None + elif isinstance(tensors, tensor.Tensor): + tensors.creator = None + + @wraps(func) + def wrapper(self, *args, **kwargs): + if self.graph_mode and self.training: + if len(args) == 0: + raise ValueError('expect at least one input tensor') + + if isinstance(args[0], list): + assert isinstance( + args[0][0], + Tensor), ('function expects PlaceHolders or Tensors') + dev = args[0][0].device + else: + assert isinstance( + args[0], + Tensor), ('function expects PlaceHolders or Tensors') + dev = args[0].device + + if not self._buffered: + # buffer operations + dev.EnableGraph(True) + self._results = func(self, *args, **kwargs) + dev.Sync() + dev.EnableGraph(False) + self._buffered = True + + # deconstruct Operations before running the entire graph + remove_creator(self._results) + + # make sure all Operations are deallocated + gc.collect() + + # run graph + dev.RunGraph(self.sequential) + return self._results + else: + return func(self, *args, **kwargs) + + return wrapper + + def __new__(cls, name, bases, attr): + if 'train_one_batch' in attr: + attr['train_one_batch'] = ModelMeta.buffer_operation( + attr['train_one_batch']) + + return super(ModelMeta, cls).__new__(cls, name, bases, attr) + + +class Model(layer.Layer, metaclass=ModelMeta): + """ Base class for your neural network models. + + Example usage:: + + import numpy as np + from singa import opt + from singa import tensor + from singa import device + from singa import autograd + from singa import layer + from singa import model + + class MyModel(model.Model): + def __init__(self): + super(MyModel, self).__init__() + + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.conv1 = layer.Conv2d(1, 20, 5, padding=0) + self.conv2 = layer.Conv2d(20, 50, 5, padding=0) + self.sgd = opt.SGD(lr=0.01) + + def forward(self, x): + y = self.conv1(x) + y = self.conv2(y) + return y + + def train_one_batch(self, x, y): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + self.sgd(loss) + return out, loss + + """ + + # save load states constant + TENSOR_DICT_FILENAME = '/tensor_dict.npz' + STATES_ATTR_FILENAME = '/states_attr.json' + MODEL_STATE_TYPE = 0 + AUX_STATE_TYPE = 1 + + def __init__(self): + """ + Initializes internal Model state + """ + super(Model, self).__init__() + + self.training = True + self.graph_mode = True + self.sequential = False + self._buffered = False + self._results = None + + def compile(self, inputs, is_train=True, use_graph=False, sequential=False): + """ Compile and initialize the model + + This function will automatically derive the shape of parameters + in each sublayer based on the shape of input placeholders. It will + also do some settings. + + Args: + inputs(list): the list of input tensors(placeholders) + is_train(bool): when is_trainis True, this model will enter + training mode, otherwise it will enter the evaluation mode + use_graph(bool): when use_graph is True, computational graph + will be used to train this model + sequential(bool): when sequential is True, model will execute ops + in the graph follow the order of joining the graph + """ + assert len(inputs) > 0 and isinstance(inputs[0], Tensor), ( + 'compile function expects PlaceHolders or Tensors') + + dev = inputs[0].device + dev.EnableGraph(True) + self.forward(*inputs) + dev.EnableGraph(False) + dev.ResetGraph() + + autograd.training = is_train + self.training = is_train + self.graph_mode = use_graph + self.sequential = sequential + + def forward(self, *input): + """Defines the computation performed in every forward propagation. + + Should be overridden by all subclasses. + + Args: + *input: the input training data for the model + + Returns: + out: the outputs of the forward propagation. + """ + raise NotImplementedError + + def train_one_batch(self, *input, **kwargs): + """Defines the computation performed in every training iteration + + Should be overridden by all subclasses. + + Args: + *input: the arguments of train_one_batch + **kwargs: the keyword arguments of train_one_batch + """ + raise NotImplementedError + + def train(self, mode=True): + """Set the model in evaluation mode. + + Args: + mode(bool): when mode is True, this model will enter training mode + """ + self.training = mode + autograd.training = mode + + def eval(self): + """Sets the model in evaluation mode. + """ + self.train(mode=False) + + def graph(self, mode=True, sequential=False): + """ Turn on the computational graph. Specify execution mode. + + Args: + mode(bool): when mode is True, model will use computational graph + sequential(bool): when sequential is True, model will execute ops + in the graph follow the order of joining the graph + """ + self.graph_mode = mode + self.sequential = sequential + + def __get_name__(self): + return self.__class__.__name__ + + def __call__(self, *input, **kwargs): + if self.training: + return self.train_one_batch(*input, **kwargs) + else: + return self.forward(*input, **kwargs) + + def save_states(self, fpath, aux_states={}): + """Save states. + + Args: + fpath: output file path (without the extension) + aux_states(dict): values are standard data types or Tensor, + e.g., epoch ID, learning rate, optimizer states + """ + assert not os.path.isfile(fpath), ( + "Failed to save states, %s is already existed." % fpath) + + states = self.get_states() + + # save states data and attr + tensor_dict = {} + states_attr = {} + for k, v in states.items(): + assert isinstance(v, tensor.Tensor), "Only tensor state is allowed" + tensor_dict[k] = tensor.to_numpy(v) + states_attr[k] = { + 'state_type': self.MODEL_STATE_TYPE, + 'shape': v.shape, + 'dtype': v.dtype + } + + for k, v in aux_states.items(): + assert isinstance(v, + tensor.Tensor), "Only tensor aux state is allowed" + tensor_dict[k] = tensor.to_numpy(v) + states_attr[k] = { + 'state_type': self.AUX_STATE_TYPE, + 'shape': v.shape, + 'dtype': v.dtype + } + + # save to files + timestamp = time.time() + tmp_dir = '/tmp/singa_save_states_%s' % timestamp + os.mkdir(tmp_dir) + tensor_dict_fp = tmp_dir + self.TENSOR_DICT_FILENAME + states_attr_fp = tmp_dir + self.STATES_ATTR_FILENAME + + np.savez(tensor_dict_fp, **tensor_dict) + + with open(states_attr_fp, 'w') as fp: + json.dump(states_attr, fp) + + compression = zipfile.ZIP_DEFLATED + with zipfile.ZipFile(fpath, mode="w") as zf: + zf.write(tensor_dict_fp, + os.path.basename(tensor_dict_fp), + compress_type=compression) + zf.write(states_attr_fp, + os.path.basename(states_attr_fp), + compress_type=compression) + + # clean up tmp files + os.remove(tensor_dict_fp) + os.remove(states_attr_fp) + os.rmdir(tmp_dir) + + def load_states(self, fpath): + """Load the model states and auxiliary states from disk. + + Usage: + m = MyModel() + m.compile(...) + aux_states = m.load_states('mymodel.zip') + + Args: + path: input file path (without the extension) + Returns: + dict + """ + + assert os.path.isfile(fpath), ( + "Failed to load states, %s is not exist." % fpath) + + timestamp = time.time() + tmp_dir = '/tmp/singa_load_states_%s' % timestamp + os.mkdir(tmp_dir) + + with zipfile.ZipFile(fpath, 'r') as zf: + zf.extractall(tmp_dir) + + tensor_dict_fp = tmp_dir + self.TENSOR_DICT_FILENAME + states_attr_fp = tmp_dir + self.STATES_ATTR_FILENAME + + with open(states_attr_fp) as f: + states_attr = json.load(f) + + tensor_dict = np.load(tensor_dict_fp) + + # restore singa tensor from numpy + model_states = dict() + aux_states = dict() + + for k in tensor_dict.files: + if states_attr[k]['state_type'] == self.MODEL_STATE_TYPE: + model_states[k] = tensor.from_numpy(tensor_dict[k]) + elif states_attr[k]['state_type'] == self.AUX_STATE_TYPE: + aux_states[k] = tensor.from_numpy(tensor_dict[k]) + + # restore model_states + self.set_states(model_states) + + # clean up tmp files + os.remove(tensor_dict_fp) + os.remove(states_attr_fp) + os.rmdir(tmp_dir) + return aux_states diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/run.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/run.sh new file mode 100644 index 000000000..a536a1e81 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/run.sh @@ -0,0 +1,38 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +#!/usr/bin/env python -W ignore::DeprecationWarning + +### mnist +python train_cnn.py mlp mnist +python train_cnn.py cnn mnist +python train_cnn.py resnet mnist +python train_cnn.py alexnet mnist + +### cifar10 +python train_cnn.py mlp cifar10 +python train_cnn.py cnn cifar10 +python train_cnn.py resnet cifar10 +python train_cnn.py alexnet cifar10 + +### cifar100 +python train_cnn.py mlp cifar100 +python train_cnn.py cnn cifar100 +python train_cnn.py resnet cifar100 +python train_cnn.py alexnet cifar100 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_cnn.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_cnn.py new file mode 100644 index 000000000..c17e1b6c4 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_cnn.py @@ -0,0 +1,564 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import singa_wrap as singa +from singa import device +from singa import tensor +from singa import opt +from singa import autograd +from singa.opt import Optimizer +from singa.opt import DecayScheduler +from singa.opt import Constant +import numpy as np +import time +import argparse +from PIL import Image + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +### MSOptimizer +class MSOptimizer(Optimizer): + def __call__(self, loss): + pn_p_g_list = self.call_with_returns(loss) + self.step() + return pn_p_g_list + + def call_with_returns(self, loss): + # print ("call_with_returns loss.data: \n", loss.data) + pn_p_g_list = [] + for p, g in autograd.backward(loss): + if p.name is None: + p.name = id(p) + self.apply(p.name, p, g) + # print ("call with returns") + # print ("p.name: \n", p.name) + # print ("p.data: \n", p.data) + # print ("g.data: \n", g.data) + pn_p_g_list.append([p.name, p, g]) # need iterables + return pn_p_g_list + +# MSSGD -- actually no change of code +class MSSGD(MSOptimizer): + """Implements stochastic gradient descent (optionally with momentum). + + Nesterov momentum is based on the formula from `On the importance of initialization and momentum in deep learning`__. + + Args: + lr(float): learning rate + momentum(float, optional): momentum factor(default: 0) + weight_decay(float, optional): weight decay(L2 penalty)(default: 0) + dampening(float, optional): dampening for momentum(default: 0) + nesterov(bool, optional): enables Nesterov momentum(default: False) + + Typical usage example: + >> > from singa import opt + >> > optimizer = opt.SGD(lr=0.1, momentum=0.9) + >> > optimizer.update() + + __ http: // www.cs.toronto.edu / %7Ehinton / absps / momentum.pdf + + .. note:: + The implementation of SGD with Momentum / Nesterov subtly differs from + Sutskever et. al. and implementations in some other frameworks. + + Considering the specific case of Momentum, the update can be written as + + .. math:: + v = \rho * v + g \\ + p = p - lr * v + + where p, g, v and: math: `\rho` denote the parameters, gradient, + velocity, and momentum respectively. + + This is in contrast to Sutskever et. al. and + other frameworks which employ an update of the form + + .. math:: + v = \rho * v + lr * g \\ + p = p - v + + The Nesterov version is analogously modified. + """ + + def __init__(self, + lr=0.1, + momentum=0, + dampening=0, + weight_decay=0, + nesterov=False, + dtype=tensor.float32): + super(MSSGD, self).__init__(lr, dtype) + + # init momentum + if type(momentum) == float or type(momentum) == int: + if momentum < 0.0: + raise ValueError("Invalid momentum value: {}".format(momentum)) + self.momentum = Constant(momentum) + elif isinstance(momentum, DecayScheduler): + self.momentum = momentum + momentum = momentum.init_value + else: + raise TypeError("Wrong momentum type") + self.mom_value = self.momentum(self.step_counter).as_type(self.dtype) + + # init dampening + if type(dampening) == float or type(dampening) == int: + self.dampening = Constant(dampening) + elif isinstance(dampening, DecayScheduler): + self.dampening = dampening + dampening = dampening.init_value + else: + raise TypeError("Wrong dampening type") + self.dam_value = self.dampening(self.step_counter).as_type(self.dtype) + + # init weight_decay + if type(weight_decay) == float or type(weight_decay) == int: + if weight_decay < 0.0: + raise ValueError( + "Invalid weight_decay value: {}".format(weight_decay)) + self.weight_decay = Constant(weight_decay) + elif isinstance(weight_decay, DecayScheduler): + self.weight_decay = weight_decay + else: + raise TypeError("Wrong weight_decay type") + self.decay_value = self.weight_decay(self.step_counter).as_type( + self.dtype) + + # init other params + self.nesterov = nesterov + self.moments = dict() + + # check value + if nesterov and (momentum <= 0 or dampening != 0): + raise ValueError( + "Nesterov momentum requires a momentum and zero dampening") + + def apply(self, param_name, param_value, param_grad): + """Performs a single optimization step. + + Args: + param_name(String): the name of the param + param_value(Tensor): param values to be update in-place + grad(Tensor): param gradients; the values may be updated + in this function; cannot use it anymore + """ + assert param_value.shape == param_grad.shape, ("shape mismatch", + param_value.shape, + param_grad.shape) + self.device_check(param_value, self.step_counter, self.lr_value, + self.mom_value, self.dam_value, self.decay_value) + + # derive dtype from input + assert param_value.dtype == self.dtype + + # TODO add branch operator + # if self.decay_value != 0: + if self.weight_decay.init_value != 0: + singa.Axpy(self.decay_value.data, param_value.data, param_grad.data) + + if self.momentum.init_value != 0: + if param_name not in self.moments: + flag = param_value.device.graph_enabled() + param_value.device.EnableGraph(False) + self.moments[param_name] = tensor.zeros_like(param_value) + param_value.device.EnableGraph(flag) + + buf = self.moments[param_name] + buf *= self.mom_value + alpha = 1.0 - self.dam_value + singa.Axpy(alpha.data, param_grad.data, buf.data) + + if self.nesterov: + singa.Axpy(self.mom_value.data, buf.data, param_grad.data) + else: + param_grad = buf + + minus_lr = 0.0 - self.lr_value + singa.Axpy(minus_lr.data, param_grad.data, param_value.data) + + def step(self): + # increment step counter, lr and moment + super().step() + mom_value = self.momentum(self.step_counter).as_type(self.dtype) + dam_value = self.dampening(self.step_counter).as_type(self.dtype) + decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + self.mom_value.copy_from(mom_value) + self.dam_value.copy_from(dam_value) + self.decay_value.copy_from(decay_value) + + def get_states(self): + states = super().get_states() + if self.mom_value > 0: + states[ + 'moments'] = self.moments # a dict for 1st order moments tensors + return states + + def set_states(self, states): + super().set_states(states) + if 'moments' in states: + self.moments = states['moments'] + self.mom_value = self.momentum(self.step_counter) + + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Calculate accuracy +def accuracy(pred, target): + # y is network output to be compared with ground truth (int) + y = np.argmax(pred, axis=1) + a = y == target + correct = np.array(a, "int").sum() + return correct + + +# Data partition according to the rank +def partition(global_rank, world_size, train_x, train_y, val_x, val_y): + # Partition training data + data_per_rank = train_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + train_x = train_x[idx_start:idx_end] + train_y = train_y[idx_start:idx_end] + + # Partition evaluation data + data_per_rank = val_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + val_x = val_x[idx_start:idx_end] + val_y = val_y[idx_start:idx_end] + return train_x, train_y, val_x, val_y + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +def resize_dataset(x, image_size): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, image_size, image_size), + dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (image_size, image_size), Image.BILINEAR), + dtype=np.float32) + return X + + +def run(global_rank, + world_size, + local_rank, + max_epoch, + batch_size, + model, + data, + mssgd, + graph, + verbosity, + dist_option='plain', + spars=None, + precision='float32'): + # dev = device.create_cuda_gpu_on(local_rank) # need to change to CPU device for CPU-only machines + dev = device.get_default_device() + dev.SetRandSeed(0) + np.random.seed(0) + + if data == 'cifar10': + from data import cifar10 + train_x, train_y, val_x, val_y = cifar10.load() + elif data == 'cifar100': + from data import cifar100 + train_x, train_y, val_x, val_y = cifar100.load() + elif data == 'mnist': + from data import mnist + train_x, train_y, val_x, val_y = mnist.load() + + + num_channels = train_x.shape[1] + image_size = train_x.shape[2] + data_size = np.prod(train_x.shape[1:train_x.ndim]).item() + num_classes = (np.max(train_y) + 1).item() + + if model == 'resnet': + from model import resnet + model = resnet.resnet50(num_channels=num_channels, + num_classes=num_classes) + elif model == 'xceptionnet': + from model import xceptionnet + model = xceptionnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'cnn': + from model import cnn + model = cnn.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'alexnet': + from model import alexnet + model = alexnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + elif model == 'msmlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from msmlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + # For distributed training, sequential has better performance + if hasattr(mssgd, "communicator"): + DIST = True + sequential = True + else: + DIST = False + sequential = False + + if DIST: + train_x, train_y, val_x, val_y = partition(global_rank, world_size, + train_x, train_y, val_x, + val_y) + + if model.dimension == 4: + tx = tensor.Tensor( + (batch_size, num_channels, model.input_size, model.input_size), dev, + singa_dtype[precision]) + elif model.dimension == 2: + tx = tensor.Tensor((batch_size, data_size), dev, singa_dtype[precision]) + np.reshape(train_x, (train_x.shape[0], -1)) + np.reshape(val_x, (val_x.shape[0], -1)) + + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_val_batch = val_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + # Attach model to graph + model.set_optimizer(mssgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + dev.SetVerbosity(verbosity) + + # Training and evaluation loop + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if global_rank == 0: + print('Starting Epoch %d:' % (epoch)) + + # Training phase + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + model.train() + print ("num_train_batch: \n", num_train_batch) + print () + for b in range(num_train_batch): + if b % 200 == 0: + print ("b: \n", b) + # Generate the patch data in this iteration + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + if model.dimension == 4: + x = augmentation(x, batch_size) + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + + + synflow_flag = False + # Train the model + if epoch == (max_epoch - 1) and b == (num_train_batch - 1): ### synflow calcuation for the last batch + print ("last epoch calculate synflow") + synflow_flag = True + ### step 1: all one input + # Copy the patch data into input tensors + tx.copy_from_numpy(np.ones(x.shape, dtype=np.float32)) + ty.copy_from_numpy(y) + ### step 2: all weights turned to positive (done) + ### step 3: new loss (done) + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + ### step 4: calculate the multiplication of weights + synflow_score = 0.0 + for pn_p_g_item in pn_p_g_list: + print ("calculate weight param * grad parameter name: \n", pn_p_g_item[0]) + if len(pn_p_g_item[1].shape) == 2: # param_value.data is "weight" + print ("pn_p_g_item[1].shape: \n", pn_p_g_item[1].shape) + synflow_score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1]) * tensor.to_numpy(pn_p_g_item[2]))) + print ("synflow_score: \n", synflow_score) + elif epoch == (max_epoch - 1) and b == (num_train_batch - 2): # all weights turned to positive + # Copy the patch data into input tensors + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + # all params turned to positive + for pn_p_g_item in pn_p_g_list: + print ("absolute value parameter name: \n", pn_p_g_item[0]) + pn_p_g_item[1] = tensor.abs(pn_p_g_item[1]) # tensor actually ... + else: # normal train steps + # Copy the patch data into input tensors + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + # print ("normal before model(tx, ty, synflow_flag, dist_option, spars)") + # print ("train_cnn tx: \n", tx) + # print ("train_cnn ty: \n", ty) + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("normal after model(tx, ty, synflow_flag, dist_option, spars)") + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, mssgd, reducer) + train_loss = reduce_variable(train_loss, mssgd, reducer) + + if global_rank == 0: + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + # Evaluation phase + model.eval() + for b in range(num_val_batch): + x = val_x[b * batch_size:(b + 1) * batch_size] + if model.dimension == 4: + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = val_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model(tx) + test_correct += accuracy(tensor.to_numpy(out_test), y) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, mssgd, reducer) + + # Output the evaluation accuracy + if global_rank == 0: + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_val_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + dev.PrintTimeProfiling() + + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument( + 'model', + choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'msmlp', 'alexnet'], + default='cnn') + parser.add_argument('data', + choices=['mnist', 'cifar10', 'cifar100'], + default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=3, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + # Determine which gpu to use + parser.add_argument('-i', + '--device-id', + default=0, + type=int, + help='which GPU to use', + dest='device_id') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + run(0, + 1, + args.device_id, + args.max_epoch, + args.batch_size, + args.model, + args.data, + mssgd, + args.graph, + args.verbosity, + precision=args.precision) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_mpi.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_mpi.py new file mode 100644 index 000000000..563d4b2c5 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_mpi.py @@ -0,0 +1,91 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + + +from singa import singa_wrap as singa +from singa import opt +from singa import tensor +import argparse +import train_cnn + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument('model', + choices=['cnn', 'resnet', 'xceptionnet', 'mlp'], + default='cnn') + parser.add_argument('data', choices=['mnist', 'cifar10', 'cifar100'], default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=10, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + parser.add_argument('-d', + '--dist-option', + default='plain', + choices=['plain','half','partialUpdate','sparseTopK','sparseThreshold'], + help='distibuted training options', + dest='dist_option') # currently partialUpdate support graph=False only + parser.add_argument('-s', + '--sparsification', + default='0.05', + type=float, + help='the sparsity parameter used for sparsification, between 0 to 1', + dest='spars') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + sgd = opt.SGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + sgd = opt.DistOpt(sgd) + + train_cnn.run(sgd.global_rank, sgd.world_size, sgd.local_rank, args.max_epoch, + args.batch_size, args.model, args.data, sgd, args.graph, + args.verbosity, args.dist_option, args.spars, args.precision) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_ms_model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_ms_model.py new file mode 100644 index 000000000..8cdda8fe1 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_ms_model.py @@ -0,0 +1,592 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import singa_wrap as singa +from singa import device +from singa import tensor +from singa import opt +from singa import autograd +from singa.opt import Optimizer +from singa.opt import DecayScheduler +from singa.opt import Constant +import numpy as np +import time +import argparse +from PIL import Image + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +### MSOptimizer +class MSOptimizer(Optimizer): + def __call__(self, loss): + pn_p_g_list = self.call_with_returns(loss) + self.step() + return pn_p_g_list + + def call_with_returns(self, loss): + # print ("call_with_returns loss.data: \n", loss.data) + pn_p_g_list = [] + for p, g in autograd.backward(loss): + if p.name is None: + p.name = id(p) + self.apply(p.name, p, g) + # print ("call with returns") + # print ("p.name: \n", p.name) + # print ("p.data: \n", p.data) + # print ("g.data: \n", g.data) + pn_p_g_list.append([p.name, p, g]) # need iterables + return pn_p_g_list + +# MSSGD -- actually no change of code +class MSSGD(MSOptimizer): + """Implements stochastic gradient descent (optionally with momentum). + + Nesterov momentum is based on the formula from `On the importance of initialization and momentum in deep learning`__. + + Args: + lr(float): learning rate + momentum(float, optional): momentum factor(default: 0) + weight_decay(float, optional): weight decay(L2 penalty)(default: 0) + dampening(float, optional): dampening for momentum(default: 0) + nesterov(bool, optional): enables Nesterov momentum(default: False) + + Typical usage example: + >> > from singa import opt + >> > optimizer = opt.SGD(lr=0.1, momentum=0.9) + >> > optimizer.update() + + __ http: // www.cs.toronto.edu / %7Ehinton / absps / momentum.pdf + + .. note:: + The implementation of SGD with Momentum / Nesterov subtly differs from + Sutskever et. al. and implementations in some other frameworks. + + Considering the specific case of Momentum, the update can be written as + + .. math:: + v = \rho * v + g \\ + p = p - lr * v + + where p, g, v and: math: `\rho` denote the parameters, gradient, + velocity, and momentum respectively. + + This is in contrast to Sutskever et. al. and + other frameworks which employ an update of the form + + .. math:: + v = \rho * v + lr * g \\ + p = p - v + + The Nesterov version is analogously modified. + """ + + def __init__(self, + lr=0.1, + momentum=0, + dampening=0, + weight_decay=0, + nesterov=False, + dtype=tensor.float32): + super(MSSGD, self).__init__(lr, dtype) + + # init momentum + if type(momentum) == float or type(momentum) == int: + if momentum < 0.0: + raise ValueError("Invalid momentum value: {}".format(momentum)) + self.momentum = Constant(momentum) + elif isinstance(momentum, DecayScheduler): + self.momentum = momentum + momentum = momentum.init_value + else: + raise TypeError("Wrong momentum type") + self.mom_value = self.momentum(self.step_counter).as_type(self.dtype) + + # init dampening + if type(dampening) == float or type(dampening) == int: + self.dampening = Constant(dampening) + elif isinstance(dampening, DecayScheduler): + self.dampening = dampening + dampening = dampening.init_value + else: + raise TypeError("Wrong dampening type") + self.dam_value = self.dampening(self.step_counter).as_type(self.dtype) + + # init weight_decay + if type(weight_decay) == float or type(weight_decay) == int: + if weight_decay < 0.0: + raise ValueError( + "Invalid weight_decay value: {}".format(weight_decay)) + self.weight_decay = Constant(weight_decay) + elif isinstance(weight_decay, DecayScheduler): + self.weight_decay = weight_decay + else: + raise TypeError("Wrong weight_decay type") + self.decay_value = self.weight_decay(self.step_counter).as_type( + self.dtype) + + # init other params + self.nesterov = nesterov + self.moments = dict() + + # check value + if nesterov and (momentum <= 0 or dampening != 0): + raise ValueError( + "Nesterov momentum requires a momentum and zero dampening") + + def apply(self, param_name, param_value, param_grad): + """Performs a single optimization step. + + Args: + param_name(String): the name of the param + param_value(Tensor): param values to be update in-place + grad(Tensor): param gradients; the values may be updated + in this function; cannot use it anymore + """ + assert param_value.shape == param_grad.shape, ("shape mismatch", + param_value.shape, + param_grad.shape) + self.device_check(param_value, self.step_counter, self.lr_value, + self.mom_value, self.dam_value, self.decay_value) + + # derive dtype from input + assert param_value.dtype == self.dtype + + # TODO add branch operator + # if self.decay_value != 0: + if self.weight_decay.init_value != 0: + singa.Axpy(self.decay_value.data, param_value.data, param_grad.data) + + if self.momentum.init_value != 0: + if param_name not in self.moments: + flag = param_value.device.graph_enabled() + param_value.device.EnableGraph(False) + self.moments[param_name] = tensor.zeros_like(param_value) + param_value.device.EnableGraph(flag) + + buf = self.moments[param_name] + buf *= self.mom_value + alpha = 1.0 - self.dam_value + singa.Axpy(alpha.data, param_grad.data, buf.data) + + if self.nesterov: + singa.Axpy(self.mom_value.data, buf.data, param_grad.data) + else: + param_grad = buf + + minus_lr = 0.0 - self.lr_value + singa.Axpy(minus_lr.data, param_grad.data, param_value.data) + + def step(self): + # increment step counter, lr and moment + super().step() + mom_value = self.momentum(self.step_counter).as_type(self.dtype) + dam_value = self.dampening(self.step_counter).as_type(self.dtype) + decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + self.mom_value.copy_from(mom_value) + self.dam_value.copy_from(dam_value) + self.decay_value.copy_from(decay_value) + + def get_states(self): + states = super().get_states() + if self.mom_value > 0: + states[ + 'moments'] = self.moments # a dict for 1st order moments tensors + return states + + def set_states(self, states): + super().set_states(states) + if 'moments' in states: + self.moments = states['moments'] + self.mom_value = self.momentum(self.step_counter) + + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Calculate accuracy +def accuracy(pred, target): + # y is network output to be compared with ground truth (int) + y = np.argmax(pred, axis=1) + a = y == target + correct = np.array(a, "int").sum() + return correct + + +# Data partition according to the rank +def partition(global_rank, world_size, train_x, train_y, val_x, val_y): + # Partition training data + data_per_rank = train_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + train_x = train_x[idx_start:idx_end] + train_y = train_y[idx_start:idx_end] + + # Partition evaluation data + data_per_rank = val_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + val_x = val_x[idx_start:idx_end] + val_y = val_y[idx_start:idx_end] + return train_x, train_y, val_x, val_y + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +def resize_dataset(x, image_size): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, image_size, image_size), + dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (image_size, image_size), Image.BILINEAR), + dtype=np.float32) + return X + + +def run(global_rank, + world_size, + local_rank, + layer_hidden_list, + max_epoch, + batch_size, + model, + data, + mssgd, + graph, + verbosity, + dist_option='plain', + spars=None, + precision='float32'): + # dev = device.create_cuda_gpu_on(local_rank) # need to change to CPU device for CPU-only machines + dev = device.get_default_device() + dev.SetRandSeed(0) + np.random.seed(0) + + if data == 'cifar10': + from data import cifar10 + train_x, train_y, val_x, val_y = cifar10.load() + elif data == 'cifar100': + from data import cifar100 + train_x, train_y, val_x, val_y = cifar100.load() + elif data == 'mnist': + from data import mnist + train_x, train_y, val_x, val_y = mnist.load() + + + num_channels = train_x.shape[1] + image_size = train_x.shape[2] + data_size = np.prod(train_x.shape[1:train_x.ndim]).item() + num_classes = (np.max(train_y) + 1).item() + + if model == 'resnet': + from model import resnet + model = resnet.resnet50(num_channels=num_channels, + num_classes=num_classes) + elif model == 'xceptionnet': + from model import xceptionnet + model = xceptionnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'cnn': + from model import cnn + model = cnn.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'alexnet': + from model import alexnet + model = alexnet.create_model(num_channels=num_channels, + num_classes=num_classes) + elif model == 'mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + elif model == 'msmlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from msmlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes) + + elif model == 'ms_model_mlp': + import os, sys, inspect + current = os.path.dirname( + os.path.abspath(inspect.getfile(inspect.currentframe()))) + parent = os.path.dirname(current) + sys.path.insert(0, parent) + from ms_model_mlp import model + model = model.create_model(data_size=data_size, + num_classes=num_classes, + layer_hidden_list=layer_hidden_list) + # print ("model: \n", model) + + # For distributed training, sequential has better performance + if hasattr(mssgd, "communicator"): + DIST = True + sequential = True + else: + DIST = False + sequential = False + + if DIST: + train_x, train_y, val_x, val_y = partition(global_rank, world_size, + train_x, train_y, val_x, + val_y) + + if model.dimension == 4: + tx = tensor.Tensor( + (batch_size, num_channels, model.input_size, model.input_size), dev, + singa_dtype[precision]) + elif model.dimension == 2: + tx = tensor.Tensor((batch_size, data_size), dev, singa_dtype[precision]) + np.reshape(train_x, (train_x.shape[0], -1)) + np.reshape(val_x, (val_x.shape[0], -1)) + + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_val_batch = val_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + # Attach model to graph + model.set_optimizer(mssgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + dev.SetVerbosity(verbosity) + + # Training and evaluation loop + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if global_rank == 0: + print('Starting Epoch %d:' % (epoch)) + + # Training phase + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + model.train() + print ("num_train_batch: \n", num_train_batch) + print () + for b in range(num_train_batch): + # if b % 200 == 0: + # print ("b: \n", b) + # Generate the patch data in this iteration + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + if model.dimension == 4: + x = augmentation(x, batch_size) + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + + + synflow_flag = False + # Train the model + if epoch == (max_epoch - 1) and b == (num_train_batch - 1): ### synflow calcuation for the last batch + print ("last epoch calculate synflow") + synflow_flag = True + ### step 1: all one input + # Copy the patch data into input tensors + tx.copy_from_numpy(np.ones(x.shape, dtype=np.float32)) + ty.copy_from_numpy(y) + ### step 2: all weights turned to positive (done) + ### step 3: new loss (done) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + ### step 4: calculate the multiplication of weights + synflow_score = 0.0 + for pn_p_g_item in pn_p_g_list: + print ("calculate weight param * grad parameter name: \n", pn_p_g_item[0]) + if len(pn_p_g_item[1].shape) == 2: # param_value.data is "weight" + print ("pn_p_g_item[1].shape: \n", pn_p_g_item[1].shape) + synflow_score += np.sum(np.absolute(tensor.to_numpy(pn_p_g_item[1]) * tensor.to_numpy(pn_p_g_item[2]))) + print ("layer_hidden_list: \n", layer_hidden_list) + print ("synflow_score: \n", synflow_score) + elif epoch == (max_epoch - 1) and b == (num_train_batch - 2): # all weights turned to positive + # Copy the patch data into input tensors + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + # all params turned to positive + for pn_p_g_item in pn_p_g_list: + print ("absolute value parameter name: \n", pn_p_g_item[0]) + pn_p_g_item[1] = tensor.abs(pn_p_g_item[1]) # tensor actually ... + else: # normal train steps + # Copy the patch data into input tensors + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + # print ("normal before model(tx, ty, synflow_flag, dist_option, spars)") + # print ("train_cnn tx: \n", tx) + # print ("train_cnn ty: \n", ty) + # print ("before model forward ...") + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("normal after model(tx, ty, synflow_flag, dist_option, spars)") + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, mssgd, reducer) + train_loss = reduce_variable(train_loss, mssgd, reducer) + + if global_rank == 0: + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + # Evaluation phase + model.eval() + for b in range(num_val_batch): + x = val_x[b * batch_size:(b + 1) * batch_size] + if model.dimension == 4: + if (image_size != model.input_size): + x = resize_dataset(x, model.input_size) + x = x.astype(np_dtype[precision]) + y = val_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model(tx) + test_correct += accuracy(tensor.to_numpy(out_test), y) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, mssgd, reducer) + + # Output the evaluation accuracy + if global_rank == 0: + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_val_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + dev.PrintTimeProfiling() + + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument( + 'model', + choices=['cnn', 'resnet', 'xceptionnet', 'mlp', 'msmlp', 'alexnet', 'ms_model_mlp'], + default='cnn') + parser.add_argument('data', + choices=['mnist', 'cifar10', 'cifar100'], + default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=2, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + # Determine which gpu to use + parser.add_argument('-i', + '--device-id', + default=0, + type=int, + help='which GPU to use', + dest='device_id') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + # mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + + DEFAULT_LAYER_CHOICES_4 = [8, 16, 24, 32] + for layer1 in DEFAULT_LAYER_CHOICES_4: + for layer2 in DEFAULT_LAYER_CHOICES_4: + for layer3 in DEFAULT_LAYER_CHOICES_4: + for layer4 in DEFAULT_LAYER_CHOICES_4: + layer_hidden_list = [layer1, layer2+1, layer3+2, layer4+3] + # print ("layer_hidden_list: \n", layer_hidden_list) + mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + run(0, + 1, + args.device_id, + layer_hidden_list, + args.max_epoch, + args.batch_size, + args.model, + args.data, + mssgd, + args.graph, + args.verbosity, + precision=args.precision) + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_multiprocess.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_multiprocess.py new file mode 100644 index 000000000..182dd35ee --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/cnn_ms/train_multiprocess.py @@ -0,0 +1,111 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + + +from singa import singa_wrap as singa +from singa import opt +from singa import tensor +import argparse +import train_cnn +import multiprocessing + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +def run(args, local_rank, world_size, nccl_id): + sgd = opt.SGD(lr=args.lr, momentum=0.9, weight_decay=1e-5, dtype=singa_dtype[args.precision]) + sgd = opt.DistOpt(sgd, nccl_id=nccl_id, local_rank=local_rank, world_size=world_size) + train_cnn.run(sgd.global_rank, sgd.world_size, sgd.local_rank, args.max_epoch, + args.batch_size, args.model, args.data, sgd, args.graph, + args.verbosity, args.dist_option, args.spars, args.precision) + + +if __name__ == '__main__': + # Use argparse to get command config: max_epoch, model, data, etc., for single gpu training + parser = argparse.ArgumentParser( + description='Training using the autograd and graph.') + parser.add_argument('model', + choices=['resnet', 'xceptionnet', 'cnn', 'mlp'], + default='cnn') + parser.add_argument('data', choices=['cifar10', 'cifar100', 'mnist'], default='mnist') + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=10, + type=int, + help='maximum epochs', + dest='max_epoch') + parser.add_argument('-b', + '--batch-size', + default=64, + type=int, + help='batch size', + dest='batch_size') + parser.add_argument('-l', + '--learning-rate', + default=0.005, + type=float, + help='initial learning rate', + dest='lr') + parser.add_argument('-w', + '--world-size', + default=2, + type=int, + help='number of gpus to be used', + dest='world_size') + parser.add_argument('-d', + '--dist-option', + default='plain', + choices=['plain','half','partialUpdate','sparseTopK','sparseThreshold'], + help='distibuted training options', + dest='dist_option') # currently partialUpdate support graph=False only + parser.add_argument('-s', + '--sparsification', + default='0.05', + type=float, + help='the sparsity parameter used for sparsification, between 0 to 1', + dest='spars') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-v', + '--log-verbosity', + default=0, + type=int, + help='logging verbosity', + dest='verbosity') + + args = parser.parse_args() + + # Generate a NCCL ID to be used for collective communication + nccl_id = singa.NcclIdHolder() + + process = [] + for local_rank in range(0, args.world_size): + process.append( + multiprocessing.Process(target=run, + args=(args, local_rank, args.world_size, nccl_id))) + + for p in process: + p.start() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/model.py new file mode 100644 index 000000000..454b382d5 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/model.py @@ -0,0 +1,226 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model +from singa import tensor +from singa import opt +from singa import device +from singa.autograd import Operator +from singa.layer import Layer +from singa import singa_wrap as singa +import argparse +import numpy as np + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +#### self-defined loss begin + +### from autograd.py +class SumError(Operator): + + def __init__(self): + super(SumError, self).__init__() + # self.t = t.data + + def forward(self, x): + # self.err = singa.__sub__(x, self.t) + self.data_x = x + # sqr = singa.Square(self.err) + # loss = singa.SumAll(sqr) + loss = singa.SumAll(x) + # self.n = 1 + # for s in x.shape(): + # self.n *= s + # loss /= self.n + return loss + + def backward(self, dy=1.0): + # dx = self.err + dev = device.get_default_device() + dx = tensor.Tensor(self.data_x.shape, dev, singa_dtype['float32']) + dx.copy_from_numpy(np.ones(self.data_x.shape)) + # dx *= float(2 / self.n) + dx *= dy + return dx + +def se_loss(x): + # assert x.shape == t.shape, "input and target shape different: %s, %s" % ( + # x.shape, t.shape) + return SumError()(x)[0] + +### from layer.py +class SumErrorLayer(Layer): + """ + Generate a MeanSquareError operator + """ + + def __init__(self): + super(SumErrorLayer, self).__init__() + + def forward(self, x): + return se_loss(x) + +#### self-defined loss end + +class MSMLP(model.Model): + + def __init__(self, data_size=10, perceptron_size=100, num_classes=10, layer_hidden_list=[10,10,10,10]): + super(MSMLP, self).__init__() + self.num_classes = num_classes + self.dimension = 2 + + self.relu = layer.ReLU() + self.linear1 = layer.Linear(layer_hidden_list[0]) + self.linear2 = layer.Linear(layer_hidden_list[1]) + self.linear3 = layer.Linear(layer_hidden_list[2]) + self.linear4 = layer.Linear(layer_hidden_list[3]) + self.linear5 = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.sum_error = SumErrorLayer() + + def forward(self, inputs): + y = self.linear1(inputs) + y = self.relu(y) + y = self.linear2(y) + y = self.relu(y) + y = self.linear3(y) + y = self.relu(y) + y = self.linear4(y) + y = self.relu(y) + y = self.linear5(y) + return y + + def train_one_batch(self, x, y, dist_option, spars, synflow_flag): + # print ("in train_one_batch") + out = self.forward(x) + # print ("train_one_batch x.data: \n", x.data) + # print ("train_one_batch y.data: \n", y.data) + # print ("train_one_batch out.data: \n", out.data) + if synflow_flag: + # print ("sum_error") + loss = self.sum_error(out) + else: # normal training + # print ("softmax_cross_entropy") + loss = self.softmax_cross_entropy(out, y) + # print ("train_one_batch loss.data: \n", loss.data) + + if dist_option == 'plain': + # print ("before pn_p_g_list = self.optimizer(loss)") + pn_p_g_list = self.optimizer(loss) + # print ("after pn_p_g_list = self.optimizer(loss)") + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + # print ("len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("len(pn_p_g_list[0]): \n", len(pn_p_g_list[0])) + # print ("pn_p_g_list[0][0]: \n", pn_p_g_list[0][0]) + # print ("pn_p_g_list[0][1].data: \n", pn_p_g_list[0][1].data) + # print ("pn_p_g_list[0][2].data: \n", pn_p_g_list[0][2].data) + return pn_p_g_list, out, loss + # return pn_p_g_list[0], pn_p_g_list[1], pn_p_g_list[2], out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = MSMLP(**kwargs) + + return model + + +__all__ = ['MLP', 'create_model'] + +if __name__ == "__main__": + np.random.seed(0) + + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # choose one precision + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]).astype(np.int32) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np_precision) + + dev = device.create_cuda_gpu_on(0) + sgd = opt.SGD(0.1, 0.9, 1e-5, dtype=singa_dtype[args.precision]) + tx = tensor.Tensor((400, 2), dev, precision) + ty = tensor.Tensor((400,), dev, tensor.int32) + model = MLP(data_size=2, perceptron_size=3, num_classes=2) + + # attach model to graph + model.set_optimizer(sgd) + model.compile([tx], is_train=True, use_graph=args.graph, sequential=True) + model.train() + + for i in range(args.max_epoch): + tx.copy_from_numpy(data) + ty.copy_from_numpy(label) + out, loss = model(tx, ty, 'fp32', spars=None) + + if i % 100 == 0: + print("training loss = ", tensor.to_numpy(loss)[0]) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/native.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/native.py new file mode 100644 index 000000000..a82ec3b24 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/ms_model_mlp/native.py @@ -0,0 +1,137 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import tensor +from singa.tensor import Tensor +from singa import autograd +from singa import opt +import numpy as np +from singa import device +import argparse + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + np.random.seed(0) + + autograd.training = True + + # prepare training data in numpy array + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np.float32) + + def to_categorical(y, num_classes): + """ + Converts a class vector (integers) to binary class matrix. + + Args: + y: class vector to be converted into a matrix + (integers from 0 to num_classes). + num_classes: total number of classes. + + Returns: + A binary matrix representation of the input. + """ + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + categorical[np.arange(n), y] = 1 + return categorical + + label = to_categorical(label, 2).astype(np.float32) + print("train_data_shape:", data.shape) + print("train_label_shape:", label.shape) + + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + dev = device.create_cuda_gpu() + + inputs = Tensor(data=data, device=dev) + target = Tensor(data=label, device=dev) + + inputs = inputs.as_type(precision) + target = target.as_type(tensor.int32) + + w0_np = np.random.normal(0, 0.1, (2, 3)).astype(np_precision) + w0 = Tensor(data=w0_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0 = Tensor(shape=(3,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0.set_value(0.0) + + w1_np = np.random.normal(0, 0.1, (3, 2)).astype(np_precision) + w1 = Tensor(data=w1_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1 = Tensor(shape=(2,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1.set_value(0.0) + + sgd = opt.SGD(0.05, 0.8) + + # training process + for i in range(args.max_epoch): + x = autograd.matmul(inputs, w0) + x = autograd.add_bias(x, b0) + x = autograd.relu(x) + x = autograd.matmul(x, w1) + x = autograd.add_bias(x, b1) + loss = autograd.softmax_cross_entropy(x, target) + sgd(loss) + + if i % 100 == 0: + print("%d, training loss = " % i, tensor.to_numpy(loss)[0]) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/model.py new file mode 100644 index 000000000..c0f0b7b4e --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/model.py @@ -0,0 +1,217 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model +from singa import tensor +from singa import opt +from singa import device +from singa.autograd import Operator +from singa.layer import Layer +from singa import singa_wrap as singa +import argparse +import numpy as np + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +#### self-defined loss begin + +### from autograd.py +class SumError(Operator): + + def __init__(self): + super(SumError, self).__init__() + # self.t = t.data + + def forward(self, x): + # self.err = singa.__sub__(x, self.t) + self.data_x = x + # sqr = singa.Square(self.err) + # loss = singa.SumAll(sqr) + loss = singa.SumAll(x) + # self.n = 1 + # for s in x.shape(): + # self.n *= s + # loss /= self.n + return loss + + def backward(self, dy=1.0): + # dx = self.err + dev = device.get_default_device() + dx = tensor.Tensor(self.data_x.shape, dev, singa_dtype['float32']) + dx.copy_from_numpy(np.ones(self.data_x.shape)) + # dx *= float(2 / self.n) + dx *= dy + return dx + +def se_loss(x): + # assert x.shape == t.shape, "input and target shape different: %s, %s" % ( + # x.shape, t.shape) + return SumError()(x)[0] + +### from layer.py +class SumErrorLayer(Layer): + """ + Generate a MeanSquareError operator + """ + + def __init__(self): + super(SumErrorLayer, self).__init__() + + def forward(self, x): + return se_loss(x) + +#### self-defined loss end + +class MSMLP(model.Model): + + def __init__(self, data_size=10, perceptron_size=100, num_classes=10): + super(MSMLP, self).__init__() + self.num_classes = num_classes + self.dimension = 2 + + self.relu = layer.ReLU() + self.linear1 = layer.Linear(perceptron_size) + self.linear2 = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.sum_error = SumErrorLayer() + + def forward(self, inputs): + y = self.linear1(inputs) + y = self.relu(y) + y = self.linear2(y) + return y + + def train_one_batch(self, x, y, dist_option, spars, synflow_flag): + # print ("in train_one_batch") + out = self.forward(x) + # print ("train_one_batch x.data: \n", x.data) + # print ("train_one_batch y.data: \n", y.data) + # print ("train_one_batch out.data: \n", out.data) + if synflow_flag: + # print ("sum_error") + loss = self.sum_error(out) + else: # normal training + # print ("softmax_cross_entropy") + loss = self.softmax_cross_entropy(out, y) + # print ("train_one_batch loss.data: \n", loss.data) + + if dist_option == 'plain': + # print ("before pn_p_g_list = self.optimizer(loss)") + pn_p_g_list = self.optimizer(loss) + # print ("after pn_p_g_list = self.optimizer(loss)") + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + # print ("len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("len(pn_p_g_list[0]): \n", len(pn_p_g_list[0])) + # print ("pn_p_g_list[0][0]: \n", pn_p_g_list[0][0]) + # print ("pn_p_g_list[0][1].data: \n", pn_p_g_list[0][1].data) + # print ("pn_p_g_list[0][2].data: \n", pn_p_g_list[0][2].data) + return pn_p_g_list, out, loss + # return pn_p_g_list[0], pn_p_g_list[1], pn_p_g_list[2], out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = MSMLP(**kwargs) + + return model + + +__all__ = ['MLP', 'create_model'] + +if __name__ == "__main__": + np.random.seed(0) + + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # choose one precision + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]).astype(np.int32) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np_precision) + + dev = device.create_cuda_gpu_on(0) + sgd = opt.SGD(0.1, 0.9, 1e-5, dtype=singa_dtype[args.precision]) + tx = tensor.Tensor((400, 2), dev, precision) + ty = tensor.Tensor((400,), dev, tensor.int32) + model = MLP(data_size=2, perceptron_size=3, num_classes=2) + + # attach model to graph + model.set_optimizer(sgd) + model.compile([tx], is_train=True, use_graph=args.graph, sequential=True) + model.train() + + for i in range(args.max_epoch): + tx.copy_from_numpy(data) + ty.copy_from_numpy(label) + out, loss = model(tx, ty, 'fp32', spars=None) + + if i % 100 == 0: + print("training loss = ", tensor.to_numpy(loss)[0]) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/native.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/native.py new file mode 100644 index 000000000..a82ec3b24 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/msmlp/native.py @@ -0,0 +1,137 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import tensor +from singa.tensor import Tensor +from singa import autograd +from singa import opt +import numpy as np +from singa import device +import argparse + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + np.random.seed(0) + + autograd.training = True + + # prepare training data in numpy array + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np.float32) + + def to_categorical(y, num_classes): + """ + Converts a class vector (integers) to binary class matrix. + + Args: + y: class vector to be converted into a matrix + (integers from 0 to num_classes). + num_classes: total number of classes. + + Returns: + A binary matrix representation of the input. + """ + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + categorical[np.arange(n), y] = 1 + return categorical + + label = to_categorical(label, 2).astype(np.float32) + print("train_data_shape:", data.shape) + print("train_label_shape:", label.shape) + + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + dev = device.create_cuda_gpu() + + inputs = Tensor(data=data, device=dev) + target = Tensor(data=label, device=dev) + + inputs = inputs.as_type(precision) + target = target.as_type(tensor.int32) + + w0_np = np.random.normal(0, 0.1, (2, 3)).astype(np_precision) + w0 = Tensor(data=w0_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0 = Tensor(shape=(3,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0.set_value(0.0) + + w1_np = np.random.normal(0, 0.1, (3, 2)).astype(np_precision) + w1 = Tensor(data=w1_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1 = Tensor(shape=(2,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1.set_value(0.0) + + sgd = opt.SGD(0.05, 0.8) + + # training process + for i in range(args.max_epoch): + x = autograd.matmul(inputs, w0) + x = autograd.add_bias(x, b0) + x = autograd.relu(x) + x = autograd.matmul(x, w1) + x = autograd.add_bias(x, b1) + loss = autograd.softmax_cross_entropy(x, target) + sgd(loss) + + if i % 100 == 0: + print("%d, training loss = " % i, tensor.to_numpy(loss)[0]) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py new file mode 100644 index 000000000..35dfb9d6f --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py @@ -0,0 +1,115 @@ +from src.eva_engine.phase1.algo.alg_base import Evaluator +from .utils.autograd_hacks import * +from src.common.constant import Config + +class VoteEvaluator(Evaluator): + + def __init__(self): + super().__init__() + + def evaluate(self, arch: nn.Module, device, batch_data: object, batch_labels: torch.Tensor, space_name: str) -> float: + """ + This is simply sum over all weigth's norm to calculate models performance + :param arch: + :param device: CPU or GPU + :param batch_data: + :param batch_labels: + :return: + """ + + pass + + +def vote_between_two_arch(arch1_info: dict, arch2_info: dict, metric: list, space: str): + """ + Return which architecture is better, + :param arch1_info: + :param arch2_info: + :param metric: + :param space: + :return: + """ + left_vote = 0 + right_vote = 0 + for m_name in metric: + # if this metrics vote to left + if vote_to_left[space](m_name, + float(arch1_info["scores"][m_name]["score"]), + float(arch2_info["scores"][m_name]["score"])): + left_vote += 1 + else: + right_vote += 1 + + if left_vote > right_vote: + return arch1_info["architecture_id"] + else: + return arch2_info["architecture_id"] + + +def compare_score_201(m_name: str, s1: float, s2: float) -> bool: + """ + Return if s1 is better than s2, + :param m_name: + :param s1: + :param s2: + :return: if s1 is better than s2 + """ + if m_name == "grad_norm": + return s1 > s2 + if m_name == "grad_plain": + return s1 < s2 + if m_name == "ntk_cond_num": + return s1 < s2 + if m_name == "ntk_trace": + return s1 > s2 + if m_name == "ntk_trace_approx": + return s1 > s2 + if m_name == "fisher": + return s1 > s2 + if m_name == "grasp": + return s1 > s2 + if m_name == "snip": + return s1 > s2 + if m_name == "synflow": + return s1 > s2 + if m_name == "weight_norm": + return s1 > s2 + if m_name == "nas_wot": + return s1 > s2 + + +def compare_score_101(m_name: str, s1: float, s2: float) -> bool: + """ + Return if s1 is better than s2, + :param m_name: + :param s1: + :param s2: + :return: if s1 is better than s2 + """ + if m_name == "grad_norm": + return s1 < s2 + if m_name == "grad_plain": + return s1 < s2 + if m_name == "ntk_cond_num": + return s1 < s2 + if m_name == "ntk_trace": + return s1 < s2 + if m_name == "ntk_trace_approx": + return s1 < s2 + if m_name == "fisher": + return s1 < s2 + if m_name == "grasp": + return s1 > s2 + if m_name == "snip": + return s1 < s2 + if m_name == "synflow": + return s1 > s2 + if m_name == "weight_norm": + return s1 > s2 + if m_name == "nas_wot": + return s1 > s2 + + +vote_to_left = {} +vote_to_left["101"] = compare_score_101 +vote_to_left["201"] = compare_score_201 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py new file mode 100644 index 000000000..39ddf2d7e --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py @@ -0,0 +1,535 @@ +import time + +from src.tools import utils + +from singa import singa_wrap as singa +from singa import device as singa_device +from singa import tensor +from singa import opt +from singa import autograd +from singa.opt import Optimizer +from singa.opt import DecayScheduler +from singa.opt import Constant +import numpy as np +import time +import argparse +from PIL import Image + +np_dtype = {"float16": np.float16, "float32": np.float32} + +# singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} +singa_dtype = {"float32": tensor.float32} + +### MSOptimizer +class MSOptimizer(Optimizer): + def __call__(self, loss): + pn_p_g_list = self.call_with_returns(loss) + # print ("optimizer1 before self.step()") + # print ("optimizer1 before print len(pn_p_g_list): \n", len(pn_p_g_list)) + self.step() + # print ("optimizer1 after print len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("optimizer1 after self.step()") + return pn_p_g_list + + def call_with_returns(self, loss): + # print ("call_with_returns before apply loss.data: \n", loss.data) + pn_p_g_list = [] + for p, g in autograd.backward(loss): + if p.name is None: + p.name = id(p) + self.apply(p.name, p, g) + # print ("call with returns") + # print ("p.name: \n", p.name) + # print ("p.data: \n", p.data) + # print ("g.data: \n", g.data) + pn_p_g_list.append([p.name, p, g]) # need iterables + # print ("call_with_returns after apply loss.data: \n", loss.data) + return pn_p_g_list + +class MSSGD(MSOptimizer): + """Implements stochastic gradient descent (optionally with momentum). + + Nesterov momentum is based on the formula from `On the importance of initialization and momentum in deep learning`__. + + Args: + lr(float): learning rate + momentum(float, optional): momentum factor(default: 0) + weight_decay(float, optional): weight decay(L2 penalty)(default: 0) + dampening(float, optional): dampening for momentum(default: 0) + nesterov(bool, optional): enables Nesterov momentum(default: False) + + Typical usage example: + >> > from singa import opt + >> > optimizer = opt.SGD(lr=0.1, momentum=0.9) + >> > optimizer.update() + + __ http: // www.cs.toronto.edu / %7Ehinton / absps / momentum.pdf + + .. note:: + The implementation of SGD with Momentum / Nesterov subtly differs from + Sutskever et. al. and implementations in some other frameworks. + + Considering the specific case of Momentum, the update can be written as + + .. math:: + v = \rho * v + g \\ + p = p - lr * v + + where p, g, v and: math: `\rho` denote the parameters, gradient, + velocity, and momentum respectively. + + This is in contrast to Sutskever et. al. and + other frameworks which employ an update of the form + + .. math:: + v = \rho * v + lr * g \\ + p = p - v + + The Nesterov version is analogously modified. + """ + + def __init__(self, + lr=0.1, + momentum=0, + dampening=0, + weight_decay=0, + nesterov=False, + dtype=tensor.float32): + super(MSSGD, self).__init__(lr) + + # init momentum + if type(momentum) == float or type(momentum) == int: + if momentum < 0.0: + raise ValueError("Invalid momentum value: {}".format(momentum)) + self.momentum = Constant(momentum) + elif isinstance(momentum, DecayScheduler): + self.momentum = momentum + momentum = momentum.init_value + else: + raise TypeError("Wrong momentum type") + # self.dtype = dtype + # self.mom_value = self.momentum(self.step_counter).as_type(self.dtype) + self.mom_value = self.momentum(self.step_counter) + + # init dampening + if type(dampening) == float or type(dampening) == int: + self.dampening = Constant(dampening) + elif isinstance(dampening, DecayScheduler): + self.dampening = dampening + dampening = dampening.init_value + else: + raise TypeError("Wrong dampening type") + # self.dam_value = self.dampening(self.step_counter).as_type(self.dtype) + self.dam_value = self.dampening(self.step_counter) + + # init weight_decay + if type(weight_decay) == float or type(weight_decay) == int: + if weight_decay < 0.0: + raise ValueError( + "Invalid weight_decay value: {}".format(weight_decay)) + self.weight_decay = Constant(weight_decay) + elif isinstance(weight_decay, DecayScheduler): + self.weight_decay = weight_decay + else: + raise TypeError("Wrong weight_decay type") + # self.decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + self.decay_value = self.weight_decay(self.step_counter) + + # init other params + self.nesterov = nesterov + self.moments = dict() + + # check value + if nesterov and (momentum <= 0 or dampening != 0): + raise ValueError( + "Nesterov momentum requires a momentum and zero dampening") + + def apply(self, param_name, param_value, param_grad): + """Performs a single optimization step. + + Args: + param_name(String): the name of the param + param_value(Tensor): param values to be update in-place + grad(Tensor): param gradients; the values may be updated + in this function; cannot use it anymore + """ + assert param_value.shape == param_grad.shape, ("shape mismatch", + param_value.shape, + param_grad.shape) + self.device_check(param_value, self.step_counter, self.lr_value, + self.mom_value, self.dam_value, self.decay_value) + + # derive dtype from input + # assert param_value.dtype == self.dtype + + # TODO add branch operator + # if self.decay_value != 0: + if self.weight_decay.init_value != 0: + singa.Axpy(self.decay_value.data, param_value.data, param_grad.data) + + if self.momentum.init_value != 0: + if param_name not in self.moments: + flag = param_value.device.graph_enabled() + param_value.device.EnableGraph(False) + self.moments[param_name] = tensor.zeros_like(param_value) + param_value.device.EnableGraph(flag) + + buf = self.moments[param_name] + buf *= self.mom_value + alpha = 1.0 - self.dam_value + singa.Axpy(alpha.data, param_grad.data, buf.data) + + if self.nesterov: + singa.Axpy(self.mom_value.data, buf.data, param_grad.data) + else: + param_grad = buf + + minus_lr = 0.0 - self.lr_value + singa.Axpy(minus_lr.data, param_grad.data, param_value.data) + + def step(self): + # increment step counter, lr and moment + # print ("before super step") + super().step() + # print ("after super step") + # print ("before custiomized step") + # mom_value = self.momentum(self.step_counter).as_type(self.dtype) + # dam_value = self.dampening(self.step_counter).as_type(self.dtype) + # decay_value = self.weight_decay(self.step_counter).as_type(self.dtype) + mom_value = self.momentum(self.step_counter) + dam_value = self.dampening(self.step_counter) + decay_value = self.weight_decay(self.step_counter) + self.mom_value.copy_from(mom_value) + self.dam_value.copy_from(dam_value) + self.decay_value.copy_from(decay_value) + # print ("after customized step") + + def get_states(self): + states = super().get_states() + if self.mom_value > 0: + states[ + 'moments'] = self.moments # a dict for 1st order moments tensors + return states + + def set_states(self, states): + super().set_states(states) + if 'moments' in states: + self.moments = states['moments'] + self.mom_value = self.momentum(self.step_counter) + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, + offset[0]:offset[0] + x.shape[2], + offset[1]:offset[1] + x.shape[2]] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Calculate accuracy +def accuracy(pred, target): + # y is network output to be compared with ground truth (int) + y = np.argmax(pred, axis=1) + # print ("in accuracy y shape: ", y.shape) + # print ("in accuracy target shape: ", target.shape) + a = y == target + correct = np.array(a, "int").sum() + return correct + + +# Data partition according to the rank +def partition(global_rank, world_size, train_x, train_y, val_x, val_y): + # Partition training data + data_per_rank = train_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + train_x = train_x[idx_start:idx_end] + train_y = train_y[idx_start:idx_end] + + # Partition evaluation data + data_per_rank = val_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + val_x = val_x[idx_start:idx_end] + val_y = val_y[idx_start:idx_end] + return train_x, train_y, val_x, val_y + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +def resize_dataset(x, image_size): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, image_size, image_size), + dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (image_size, image_size), Image.BILINEAR), + dtype=np.float32) + return X + +from torch.utils.data import DataLoader +class ModelTrainer: + + @classmethod + def fully_train_arch(cls, + model, + use_test_acc: bool, + epoch_num, + train_loader: DataLoader, + val_loader: DataLoader, + test_loader: DataLoader, + args, + logger=None + ) -> (float, float, dict): + """ + Args: + model: + use_test_acc: + epoch_num: how many epoch, set by scheduler + train_loader: + val_loader: + test_loader: + args: + Returns: + """ + + if logger is None: + from src.logger import logger + logger = logger + + start_time, best_valid_auc = time.time(), 0. + + num_labels = args.num_labels + lr = args.lr + iter_per_epoch = args.iter_per_epoch + # report_freq = args.report_freq + # given_patience = args.patience + + # assign new values + args.epoch_num = epoch_num + + # for multiple classification + + # optimizer + precision = 'float32' + mssgd = MSSGD(lr=args.lr, momentum=0.9, weight_decay=1e-4, dtype=singa_dtype[precision]) + device_id = 0 + max_epoch = epoch_num + graph = True + verbosity = 0 + dist_option='plain' + spars=None + global_rank = 0 + world_size = 1 + + # training params + if args.device == 'cpu': + dev = singa_device.get_default_device() + else: # GPU + dev = singa_device.create_cuda_gpu_on(args.local_rank) # need to change to CPU device for CPU-only machines + dev.SetRandSeed(0) + + # For distributed training, sequential has better performance + if hasattr(mssgd, "communicator"): + DIST = True + sequential = True + else: + DIST = False + sequential = False + + info_dic = {} + valid_auc = -1 + valid_loss = 0 + + ### singa data + tx = tensor.Tensor((args.batch_size, args.nfeat), dev, singa_dtype[precision]) + ty = tensor.Tensor((args.batch_size,), dev, tensor.int32) + ### singa data + + model.set_optimizer(mssgd) + model.compile([tx], is_train=True, use_graph=graph, sequential=sequential) + dev.SetVerbosity(verbosity) + + # Training and evaluation loop + for epoch in range(max_epoch): + start_time = time.time() + logger.info(f'Epoch [{epoch:3d}/{epoch_num:3d}]') + # np.random.shuffle(idx) + + if global_rank == 0: + print('Starting Epoch %d:' % (epoch)) + + # Training phase + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + model.train() + # print ("num_train_batch: \n", num_train_batch) + # print () + batch_idx = 0 + # for b in range(num_train_batch): + for batch_idx, batch in enumerate(train_loader): + if batch_idx % 50 == 0: + print ("trainer.py train batch_idx: \n", batch_idx) + # Generate the batch data in this iteration + # x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + # if model.dimension == 4: + # x = augmentation(x, batch_size) + # if (image_size != model.input_size): + # x = resize_dataset(x, model.input_size) + # x = x.astype(np_dtype[precision]) + # y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + + y = batch['y'].cpu().numpy() + batch['id'] = batch['id'].cpu().numpy().astype(int) + # batch['value'] = batch['value'].to(args.device) + x = np.zeros((batch['id'].shape[0], args.nfeat), dtype=np.float32) + # print ("target shape: ", target.shape) + # print ("target: ", target) + # print ("batch['id'] shape: ", batch['id'].shape) + # print ("batch['id']: ", batch['id']) + # print ("batch['value'] shape: ", batch['value'].shape) + # print ("batch['value']: ", batch['value']) + # print ("batch['id'].cpu().numpy().astype(int): \n", batch['id'].cpu().numpy().astype(int)) + for i in range(batch['id'].shape[0]): + x[i][batch['id'][i]] = (np.float32)(1.0) + x = x.astype(dtype=np.float32) + y = y.astype(dtype=np.int32) + + if x.shape[0] != args.batch_size: # last batch not processing + continue + + synflow_flag = False + # Train the model + # if True: # normal train steps + # Copy the patch data into input tensors + # print ("normal train steps\n") + # print ("x.astype(np.float32): \n", x.astype(np.float32)) + # print ("y: \n", y) + tx = tensor.Tensor(x.shape, dev, singa_dtype[precision]) + ty = tensor.Tensor((y.shape[0],), dev, tensor.int32) + tx.copy_from_numpy(x) # dtype=np.float32 + # print ("tx: \n", tx) + ty.copy_from_numpy(y) + # print ("ty: \n", ty) + # print ("normal before model(tx, ty, synflow_flag, dist_option, spars)") + # print ("train_cnn tx: \n", tx) + # print ("train_cnn ty: \n", ty) + # print ("trainer.py train before model forward ...") + # print ("model: ", model) + pn_p_g_list, out, loss = model(tx, ty, dist_option, spars, synflow_flag) + # print ("trainer.py train normal after model(tx, ty, synflow_flag, dist_option, spars)") + # print ("trainer.py train tx shape: ", tx.shape) + # print ("trainer.py train ty shape: ", ty.shape) + # print ("trainer.py train out.shape: ", out.shape) + # print ("trainer.py train out: ", out) + # print ("trainer.py train y shape: ", y.shape) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, mssgd, reducer) + train_loss = reduce_variable(train_loss, mssgd, reducer) + + if global_rank == 0: + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (batch_idx * args.batch_size * world_size)), + flush=True) + print ("train total batch_idx: ", batch_idx) + train_metric = train_correct / (batch_idx * args.batch_size * world_size) + + # Evaluation phase + model.eval() + batch_idx = 0 + # for b in range(num_val_batch): + # print ("evaluation begins") + for batch_idx, batch in enumerate(test_loader): + # print ("trainer.py test batch_idx: \n", batch_idx) + # x = val_x[b * batch_size:(b + 1) * batch_size] + # if model.dimension == 4: + # if (image_size != model.input_size): + # x = resize_dataset(x, model.input_size) + # x = x.astype(np_dtype[precision]) + # y = val_y[b * batch_size:(b + 1) * batch_size] + # batch['value'] = batch['value'].cpu().numpy().astype(np_dtype[precision]) + # x = batch['value'].cpu().numpy().astype(np_dtype[precision]) + + y = batch['y'].cpu().numpy() + batch['id'] = batch['id'].cpu().numpy().astype(int) + # batch['value'] = batch['value'].to(args.device) + x = np.zeros((batch['id'].shape[0], args.nfeat), dtype=np.float32) + # print ("target shape: ", target.shape) + # print ("target: ", target) + # print ("batch['id'] shape: ", batch['id'].shape) + # print ("batch['id']: ", batch['id']) + # print ("batch['value'] shape: ", batch['value'].shape) + # print ("batch['value']: ", batch['value']) + # print ("batch['id'].cpu().numpy().astype(int): \n", batch['id'].cpu().numpy().astype(int)) + for i in range(batch['id'].shape[0]): + x[i][batch['id'][i]] = (np.float32)(1.0) + # print ("x[1]: \n", x[1]) + x = x.astype(dtype=np.float32) + y = y.astype(dtype=np.int32) + + if x.shape[0] != (args.batch_size * 8): # last batch not processing + # print ("trainer.py test batch_idx: ", batch_idx) + # print ("trainer.py test x.shape: ", x.shape) + continue + + tx = tensor.Tensor(x.shape, dev, singa_dtype[precision]) + ty = tensor.Tensor((y.shape[0],), dev, tensor.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + # print ("trainer.py test tx shape: ", tx.shape) + out_test = model(tx) + # print ("trainer.py test out_test shape: ", out_test.shape) + # print ("trainer.py test y shape: ", y.shape) + # print ("trainer.py out_test: ", out_test) + # print ("trainer.py y: ", y) + test_correct += accuracy(tensor.to_numpy(out_test), y) + # print ("test_correct: ", test_correct) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, mssgd, reducer) + + # Output the evaluation accuracy + if global_rank == 0: + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (batch_idx * args.batch_size * 8 * world_size), + time.time() - start_time), + flush=True) + # print ("test all batch_idx: ", batch_idx) + test_metric = test_correct / (batch_idx * args.batch_size * 8 * world_size) + + + info_dic[epoch] = { + "train_metric": str(train_metric[0]), + "test_metric": str(test_metric[0]), + "train_loss": str(train_loss[0]), + # "valid_loss": valid_loss, + "train_test_total_time": str(time.time() - start_time)} + + dev.PrintTimeProfiling() + + # return valid_auc, time.time() - start_time, info_dic + print ("info_dic: ", info_dic) + return test_metric, time.time() - start_time, info_dic diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py new file mode 100644 index 000000000..d723fe7b1 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py @@ -0,0 +1,126 @@ +from copy import copy +from src.common.constant import Config + + +class BudgetAwareControllerSR: + def __init__(self, evaluator, time_per_epoch, max_unit=200): + """ + :param evaluator: + :param max_unit: for 201, it's 200, for 101 it's 108 + """ + self._evaluator = evaluator + self.max_unit_per_model = max_unit + self.time_per_epoch = time_per_epoch + self.name = "SUCCREJCT" + + def schedule_budget_per_model_based_on_T(self, space_name, fixed_time_budget, K_): + # for benchmarking only phase 2 + + # try different K and U combinations + # only consider 15625 arches in this paper + # min_budget_required: when K = 1, N = min_budget_required * 1 + if space_name == Config.NB101: + U_options = [4, 12, 16, 108] + else: + U_options = list(range(1, 200)) + + history = [] + + for U in U_options: + expected_time_used = self.pre_calculate_epoch_required(K_, U) * self.time_per_epoch + if expected_time_used > fixed_time_budget: + break + else: + history.append(U) + if len(history) == 0: + raise f"{fixed_time_budget} is too small for current config" + return history[-1] + + def pre_calculate_epoch_required(self, K, U): + """ + :param K: candidates lists + :param U: min resource each candidate needs + :return: + """ + total_epoch_each_rounds = K * U + min_budget_required = 0 + + previous_epoch = None + while True: + cur_cand_num = K + if cur_cand_num == 1: + break + # number of each res given to each cand, pick lower bound + epoch_per_model = int(total_epoch_each_rounds / cur_cand_num) + if previous_epoch is None: + previous_epoch = epoch_per_model + elif previous_epoch == epoch_per_model: + # which means the epoch don't increase, no need to re-evaluate each component + K = cur_cand_num - 1 + continue + + if epoch_per_model >= self.max_unit_per_model: + epoch_per_model = self.max_unit_per_model + # evaluate each arch + min_budget_required += epoch_per_model * cur_cand_num + # sort from min to max + if epoch_per_model == self.max_unit_per_model: + # each model is fully evaluated, just return top 1 + K = 1 + else: + # only keep 1/eta, pick lower bound + K = cur_cand_num - 1 + return min_budget_required + + def run_phase2(self, U: int, candidates_m: list): + """ + :param candidates_m: candidates lists + :param U: min resource each candidate needs + :return: + """ + # print(f" *********** begin BudgetAwareControllerSR with U={U}, K={len(candidates_m)} ***********") + candidates = copy(candidates_m) + total_epoch_each_rounds = len(candidates) * U + min_budget_required = 0 + previous_epoch = None + scored_cand = None + while True: + cur_cand_num = len(candidates) + if cur_cand_num == 1: + break + total_score = [] + # number of each res given to each cand, pick lower bound + epoch_per_model = int(total_epoch_each_rounds / cur_cand_num) + + if previous_epoch is None: + previous_epoch = epoch_per_model + elif previous_epoch == epoch_per_model: + # which means the epoch don't increase, no need to re-evaluate each component + num_keep = cur_cand_num - 1 + candidates = [ele[0] for ele in scored_cand[-num_keep:]] + continue + + if epoch_per_model >= self.max_unit_per_model: + epoch_per_model = self.max_unit_per_model + + # print(f"[successive_reject]: {cur_cand_num} model left, " + # f"and evaluate each model with {epoch_per_model} epoch") + # evaluate each arch + for cand in candidates: + score = self._evaluator.p2_evaluate(cand, epoch_per_model) + total_score.append((cand, score)) + min_budget_required += epoch_per_model + # sort from min to max + scored_cand = sorted(total_score, key=lambda x: x[1]) + + if epoch_per_model == self.max_unit_per_model: + # each model is fully evaluated, just return top 1 + candidates = [scored_cand[-1][0]] + else: + # only keep m-1, remove the worst one + num_keep = cur_cand_num - 1 + candidates = [ele[0] for ele in scored_cand[-num_keep:]] + + return candidates[0], None, min_budget_required + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py new file mode 100644 index 000000000..c770c4280 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py @@ -0,0 +1,78 @@ + + +from copy import copy +from random import randint +from src.common.constant import Config + + +# UniformAllocation +class UniformAllocation: + + def __init__(self, evaluator, time_per_epoch, max_unit=200): + """ + :param evaluator: + :param max_unit: for 201, it's 200, for 101 it's 108 + """ + self._evaluator = evaluator + self.max_unit_per_model = max_unit + self.time_per_epoch = time_per_epoch + self.name = "UNIFORM" + + def schedule_budget_per_model_based_on_T(self, space_name, fixed_time_budget, K_): + # for benchmarking only phase 2 + + # try different K and U combinations + # only consider 15625 arches in this paper + # min_budget_required: when K = 1, N = min_budget_required * 1 + if space_name == Config.NB101: + U_options = [4, 12, 16, 108] + else: + U_options = list(range(1, 200)) + + history = [] + + for U in U_options: + expected_time_used = self.pre_calculate_epoch_required(K_, U) * self.time_per_epoch + if expected_time_used > fixed_time_budget: + break + else: + history.append(U) + return history[-1] + + def pre_calculate_epoch_required(self, K, U): + """ + :param B: total budget for phase 2 + :param U: mini unit computation for each modle + :param candidates_m: + :return: + """ + return K*U + + def run_phase2(self, U: int, candidates_m: list): + """ + :param U: mini unit computation for each modle + :param candidates_m: + :return: + """ + + # print(f" *********** begin uniformly_allocate with U={U}, K={len(candidates_m)} ***********") + + candidates = copy(candidates_m) + min_budget_required = 0 + + if U >= self.max_unit_per_model: + U = self.max_unit_per_model + + # print(f"[uniformly_allocate]: uniformly allocate {U} epoch to each model") + + total_score = [] + for cand in candidates: + score = self._evaluator.p2_evaluate(cand, U) + total_score.append((cand, score)) + min_budget_required += U + # sort from min to max + scored_cand = sorted(total_score, key=lambda x: x[1]) + candidate = scored_cand[-1][0] + return candidate, None, min_budget_required + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py new file mode 100644 index 000000000..8d2e16d4e --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py @@ -0,0 +1,23 @@ +import logging +import os + +if os.environ.get("log_logger_folder_name") == None: + log_logger_folder_name = "logs_default" + if not os.path.exists(f"./{log_logger_folder_name}"): + os.makedirs(f"./{log_logger_folder_name}") +else: + log_logger_folder_name = os.environ.get("log_logger_folder_name") + if not os.path.exists(log_logger_folder_name): + os.makedirs(log_logger_folder_name) + +logger = logging.getLogger(__name__) + +if os.environ.get("log_file_name") == None: + log_name = f"{log_logger_folder_name}/test.log" +else: + log_name = f"{log_logger_folder_name}/" + os.environ.get("log_file_name") + +logging.basicConfig(level=logging.INFO, + format='%(asctime)s %(levelname)-8s %(message)s', + datefmt='%d %b %Y %H:%M:%S', + filename=log_name, filemode='w') diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md new file mode 100644 index 000000000..a22a70e9a --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md @@ -0,0 +1,2 @@ + +This is used to parse the local json file which is the result of the all experiments \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py new file mode 100644 index 000000000..1b074a1e7 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py @@ -0,0 +1,78 @@ +import json +import os +import sqlite3 +import traceback + +from src.common.constant import Config + +base_folder_dir = os.environ.get("base_dir") +if base_folder_dir is None: base_folder_dir = os.getcwd() +base_dir = os.path.join(base_folder_dir, "img_data", "ground_truth") +print("local api running at {}".format(base_dir)) + +# sum score is better +tf_smt_file_NB101C10 = os.path.join(base_dir, "TFMEM_101_c10_100run_8k_models_score_sum") +tf_smt_file_NB201C10 = os.path.join(base_dir, "TFMEM_201_c10_100run_score_sum") +tf_smt_file_NB201C100 = os.path.join(base_dir, "TFMEM_201_c100_100run_score_sum") +tf_smt_file_NB201Img = os.path.join(base_dir, "TFMEM_201_imgNet_100run_score_sum") + +# rank is not as good as sum +# tf_smt_file_NB201C10 = os.path.join(base_dir, "TFMEM_201_c10_100run_rank_bugs") +# tf_smt_file_NB201C100 = os.path.join(base_dir, "TFMEM_201_c100_200run_rank") +# tf_smt_file_NB201Img = os.path.join(base_dir, "TFMEM_201_imgNet_200run_rank") + +con = None +cur = None + + +# fetch result from simulated result +def fetch_from_db(space_name, dataset, run_id_m, N_m): + """ + :param run_id_m: run_id 100 max + :param B1_m: number of models evaluted + :return: + """ + global con + global cur + if con is None: + if space_name == Config.NB201: + if dataset == Config.c10: + tf_smt_used = tf_smt_file_NB201C10 + elif dataset == Config.c100: + tf_smt_used = tf_smt_file_NB201C100 + elif dataset == Config.imgNet: + tf_smt_used = tf_smt_file_NB201Img + else: + print(f"{dataset} is Not implemented") + raise + elif space_name == Config.NB101: + if dataset == Config.c10: + tf_smt_used = tf_smt_file_NB101C10 + else: + print(f"{dataset}Not implemented") + raise + else: + print(f"{space_name} is Not implemented") + raise + + print(tf_smt_used) + con = sqlite3.connect(tf_smt_used) + cur = con.cursor() + + res = cur.execute( + "SELECT * FROM simulateExp WHERE run_num = {} and model_explored = {}".format(run_id_m, N_m)) + fetch_res = res.fetchone() + + try: + arch_id = fetch_res[2] + candidates = json.loads(fetch_res[3]) + current_time = float(fetch_res[4]) + except: + print(traceback.format_exc()) + raise f"res is None when using run_id ={run_id_m} and bm = {N_m}" + + return arch_id, candidates, current_time + + +if __name__ == '__main__': + print(fetch_from_db(Config.NB201, Config.c10, 3, 10)) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py new file mode 100644 index 000000000..54848af6f --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py @@ -0,0 +1,113 @@ + + +import os +import numpy as np +from src.common.constant import Config +from src.tools.io_tools import read_json + +base_dir_folder = os.environ.get("base_dir") +if base_dir_folder is None:base_dir_folder = os.getcwd() +base_dir = os.path.join(base_dir_folder, "img_data") + +print("gt_api running at {}".format(base_dir)) +train_base201_c10 = os.path.join(base_dir, "train_based_201_c10.json") +train_base201_c100 = os.path.join(base_dir, "train_based_201_c100.json") +train_base201_img = os.path.join(base_dir, "train_based_201_img.json") + +train_base101_c10 = os.path.join(base_dir, "train_based_101_c10_100run_24k_models.json") + + +def post_processing_train_base_result(search_space, dataset, x_max_value: int = None): + + if search_space == Config.NB201 and dataset == Config.c10: + data = read_json(train_base201_c10) + + elif search_space == Config.NB201 and dataset == Config.c100: + data = read_json(train_base201_c100) + elif search_space == Config.NB201 and dataset == Config.imgNet: + data = read_json(train_base201_img) + + elif search_space == Config.NB101 and dataset == Config.c10: + data = read_json(train_base101_c10) + else: + print(f"Cannot read dataset {dataset} of file") + raise + + # data is in form of + """ + data[run_id] = {} + data[run_id]["arch_id_list"] + data[run_id]["current_best_acc"] + data[run_id]["x_axis_time"] + """ + + acc_got_row = [] + time_used_row = [] + min_arch_across_all_run = 15625 + for run_id in data: + acc_got_row.append(data[run_id]["current_best_acc"]) + time_used_row.append(data[run_id]["x_axis_time"]) + if len(data[run_id]["current_best_acc"]) < min_arch_across_all_run: + min_arch_across_all_run = len(data[run_id]["current_best_acc"]) + + # for each run, only use min_arch_across_all_run + for i in range(len(acc_got_row)): + acc_got_row[i] = acc_got_row[i][:min_arch_across_all_run] + time_used_row[i] = time_used_row[i][:min_arch_across_all_run] + + acc_got = np.array(acc_got_row) + time_used = np.array(time_used_row) + + if data['0']["current_best_acc"][-1] < 1: + acc_got = acc_got * 100 + + acc_l = np.quantile(acc_got, 0.25, axis=0) + acc_m = np.quantile(acc_got, 0.5, axis=0) + acc_h = np.quantile(acc_got, 0.75, axis=0) + + time_l = np.quantile(time_used, 0.25, axis=0) + time_m = np.quantile(time_used, 0.5, axis=0).tolist() + time_h = np.quantile(time_used, 0.75, axis=0) + + x_list = [ele/60 for ele in time_m] + y_list_low = acc_l[:len(x_list)] + y_list_m = acc_m[:len(x_list)] + y_list_high = acc_h[:len(x_list)] + + # if the x array max value is provided. + if x_max_value is not None: + final_x_list = [] + final_x_list_low = [] + final_x_list_m = [] + final_x_list_high = [] + for i in range(len(x_list)): + if x_list[i] <= x_max_value: + final_x_list.append(x_list[i]) + final_x_list_low.append(y_list_low[i]) + final_x_list_m.append(y_list_m[i]) + final_x_list_high.append(y_list_high[i]) + else: + break + return final_x_list, final_x_list_low, final_x_list_m, final_x_list_high + else: + return x_list, y_list_low.tolist(), y_list_m.tolist(), y_list_high.tolist() + + +if __name__ == "__main__": + search_space = Config.NB201 + dataset = Config.c100 + x_list, y_list_low, y_list_m, y_list_high = post_processing_train_base_result(search_space, dataset) + + from matplotlib import pyplot as plt + + plt.fill_between(x_list, y_list_low, y_list_high, alpha=0.1) + plt.plot(x_list, y_list_m, "-*", label="Training-based") + + plt.xscale("symlog") + plt.grid() + plt.xlabel("Time Budget given by user (mins)") + plt.ylabel("Test Accuracy") + plt.legend() + plt.show() + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py new file mode 100644 index 000000000..20cccabe9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py @@ -0,0 +1,123 @@ +# query ground truth +from src.common.constant import Config, CommonVars +from src.query_api.query_api_img import Gt201, Gt101 +from src.query_api.query_api_mlp import GTMLP +from src.query_api.query_api_img import ImgScoreQueryApi +from typing import * + + +def profile_NK_trade_off(dataset): + """ + This is get from the profling result. + We try various N/K combinations, and find this is better. + """ + if dataset == Config.c10: + return 85 + elif dataset == Config.c100: + return 85 + elif dataset == Config.imgNet: + return 130 + else: + return 30 + + +class SimulateTrain: + + def __init__(self, space_name: str): + """ + :param space_name: NB101 or NB201, MLP + """ + self.space_name = space_name + self.api = None + + # get the test_acc and time usage to train of this arch_id + def get_ground_truth(self, arch_id: str, dataset: str, epoch_num: int = None, total_epoch: int = 200): + """ + :param arch_id: + :param dataset: + :param epoch_num: which epoch's performance to return + :param total_epoch: + """ + if self.space_name == Config.NB101: + self.api = Gt101() + acc, time_usage = self.api.get_c10_test_info(arch_id, dataset, epoch_num) + return acc, time_usage + + elif self.space_name == Config.NB201: + self.api = Gt201() + if total_epoch == 200: + acc, time_usage = self.api.query_200_epoch(arch_id, dataset, epoch_num) + else: # 12 + acc, time_usage = self.api.query_12_epoch(arch_id, dataset, epoch_num) + return acc, time_usage + + elif self.space_name == Config.MLPSP: + self.api = GTMLP(dataset) + acc, time_usage = self.api.get_valid_auc(arch_id, epoch_num) + return acc, time_usage + + else: + raise NotImplementedError + + # get the high acc of k arch with highest score + def get_high_acc_top_10(self, top10): + all_top10_acc = [] + time_usage = 0 + for arch_id in top10: + score_, time_usage_ = self.get_ground_truth(arch_id) + all_top10_acc.append(score_) + time_usage += time_usage_ + return max(all_top10_acc), time_usage + + def get_best_arch_id(self, top10): + cur_best = 0 + res = None + for arch_id in top10: + acc, _ = self.get_ground_truth(arch_id) + if acc > cur_best: + cur_best = acc + res = arch_id + return res + + def query_all_model_ids(self, dataset): + if self.space_name == Config.NB101: + self.api = Gt101() + elif self.space_name == Config.NB201: + self.api = Gt201() + elif self.space_name == Config.MLPSP: + self.api = GTMLP(dataset) + return self.api.get_all_trained_model_ids() + + +class SimulateScore: + def __init__(self, space_name: str, dataset_name: str): + """ + :param space_name: NB101 or NB201, MLP + :param dataset_name: NB101 or NB201, MLP + """ + self.space_name = space_name + if self.space_name == Config.MLPSP: + self.api = GTMLP(dataset_name) + else: + self.api = ImgScoreQueryApi(self.space_name, dataset_name) + + # get the test_acc and time usage to train of this arch_id + def query_tfmem_rank_score(self, arch_id) -> Dict: + # todo: here we use the global rank, other than dymalically update the rank + # todo: so, we directly return the rank_score, instead of the mutilpel_algs score + # return {"nas_wot": self.api.get_metrics_score(arch_id, dataset)["nas_wot"], + # "synflow": self.api.get_metrics_score(arch_id, dataset)["synflow"], + # } + return self.api.get_global_rank_score(arch_id) + + def query_all_tfmem_score(self, arch_id) -> Dict: + """ + return {alg_name: score} + """ + return self.api.api_get_score(arch_id) + + def query_all_model_ids(self, dataset) -> List: + """ + return all models_ids as a list + """ + return self.api.get_all_scored_model_ids() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py new file mode 100644 index 000000000..87b466e6b --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py @@ -0,0 +1,277 @@ +import os +import random +from src.common.constant import Config +from src.tools.io_tools import read_json, write_json +from src.query_api.singleton import Singleton +from src.tools.io_tools import read_pickle +from src.tools.compute import generate_global_rank + + +base_dir_folder = os.environ.get("base_dir") +if base_dir_folder is None: base_dir_folder = os.getcwd() +base_dir = os.path.join(base_dir_folder, "img_data") +print("local api running at {}".format(base_dir)) + +# todo: move all those to a config file +# score result +pre_score_path_101C10 = os.path.join(base_dir, "score_101_15k_c10_128.json") +pre_score_path_201C10 = os.path.join(base_dir, "score_201_15k_c10_bs32_ic16.json") +pre_score_path_201C100 = os.path.join(base_dir, "score_201_15k_c100_bs32_ic16.json") +pre_score_path_201IMG = os.path.join(base_dir, "score_201_15k_imgNet_bs32_ic16.json") + +# expreflow +expreflow_score_path_101C10 = os.path.join(base_dir, "score_nasbench101_cifar10_batch_size_32_cpu.json") +# expreflow_score_path_201C10 = os.path.join(base_dir, "score_nasbench201_cifar10_batch_size_32_cpu.json") +# expreflow_score_path_201C100 = os.path.join(base_dir, "score_nasbench201_cifar100_batch_size_32_cpu.json") +# expreflow_score_path_201IMG = os.path.join(base_dir, "score_nasbench201_ImageNet16-120_batch_size_32_cpu.json") + +expreflow_score_path_201C10 = os.path.join(base_dir_folder, "score_scale_traj_width/score_nasbench201_cifar10_batch_size_32_cpu.json") +expreflow_score_path_201C100 = os.path.join(base_dir_folder, "score_scale_traj_width/score_nasbench201_cifar100_batch_size_32_cpu.json") +expreflow_score_path_201IMG = os.path.join(base_dir_folder, "score_scale_traj_width/score_nasbench201_ImageNet16-120_batch_size_32_cpu.json") + +# training accuracy result. +gt201 = os.path.join(base_dir, "ground_truth/201_allEpoch_info") +gt101 = os.path.join(base_dir, "ground_truth/101_allEpoch_info_json") +gt101P = os.path.join(base_dir, "ground_truth/nasbench1_accuracy.p") +id_to_hash_path = os.path.join(base_dir, "ground_truth/nb101_id_to_hash.json") + + +# We pre-compute the time usage, and get a range, +# Then we randomly pick one value from the range each time +def guess_score_time(search_space_m, dataset): + if search_space_m == Config.NB101: + return Gt101.guess_score_time() + if search_space_m == Config.NB201: + return Gt201.guess_score_time(dataset) + + +def guess_train_one_epoch_time(search_space_m, dataset): + if search_space_m == Config.NB101: + return Gt101().guess_train_one_epoch_time() + if search_space_m == Config.NB201: + return Gt201().guess_train_one_epoch_time(dataset) + + +class ImgScoreQueryApi: + # Multiton pattern + # use those algoroithm => new tfmem + default_alg_name_list = ["nas_wot", "synflow"] + _instances = {} + + def __new__(cls, search_space_name: str, dataset: str): + if (search_space_name, dataset) not in cls._instances: + instance = super(ImgScoreQueryApi, cls).__new__(cls) + instance.search_space_name, instance.dataset = search_space_name, dataset + + # read pre-scored file path + if search_space_name == Config.NB201: + if dataset == Config.c10: + instance.pre_score_path = pre_score_path_201C10 + instance.express_score_path = expreflow_score_path_201C10 + elif dataset == Config.c100: + instance.pre_score_path = pre_score_path_201C100 + instance.express_score_path = expreflow_score_path_201C100 + elif dataset == Config.imgNet: + instance.pre_score_path = pre_score_path_201IMG + instance.express_score_path = expreflow_score_path_201IMG + if search_space_name == Config.NB101: + instance.pre_score_path = pre_score_path_101C10 + instance.express_score_path = expreflow_score_path_101C10 + + instance.data = read_json(instance.pre_score_path) + express_score_data = read_json(instance.express_score_path) + for arch_id in express_score_data: + if arch_id in instance.data: + instance.data[arch_id].update(express_score_data[arch_id]) + else: + instance.data[arch_id] = express_score_data[arch_id] + + instance.global_rank = generate_global_rank( + instance.data, instance.default_alg_name_list) + + cls._instances[(search_space_name, dataset)] = instance + return cls._instances[(search_space_name, dataset)] + + def api_get_score(self, arch_id: str, tfmem: str = None): + # retrieve score from pre-scored file + if tfmem is None: + return self.data[arch_id] + else: + return {tfmem: float(self.data[arch_id][tfmem])} + + def update_existing_data(self, arch_id, alg_name, score_str): + """ + Add new arch's inf into data + :param arch_id: + :param alg_name: + :param score_str: + :return: + """ + if str(arch_id) not in self.data: + self.data[str(arch_id)] = {} + else: + self.data[str(arch_id)] = self.data[str(arch_id)] + self.data[str(arch_id)][alg_name] = '{:f}'.format(score_str) + + def is_arch_and_alg_inside_data(self, arch_id, alg_name): + if arch_id in self.data and alg_name in self.data[arch_id]: + return True + else: + return False + + def is_arch_inside_data(self, arch_id): + if arch_id in self.data: + return True + else: + return False + + def get_len_data(self): + return len(self.data) + + def save_latest_data(self): + """ + update the latest score data + """ + write_json(self.pre_score_path, self.data) + + def get_all_scored_model_ids(self): + return list(self.data.keys()) + + def get_global_rank_score(self, arch_id): + return self.global_rank[arch_id] + + +class Gt201(metaclass=Singleton): + + @classmethod + def guess_score_time(cls, dataset=Config.c10): + return random.randint(3315, 4502) * 0.0001 + + def __init__(self): + self.data201 = read_json(gt201) + + def get_c10valid_200epoch_test_info(self, arch_id: int): + """ + cifar10-valid means train with train set, valid with validation dataset + Thus, acc is lower than train with train+valid. + :param arch_id: + :return: + """ + return self.query_200_epoch(str(arch_id), Config.c10_valid) + + def get_c10_200epoch_test_info(self, arch_id: int): + """ + cifar10-valid means train with train set, valid with validation dataset + Thus, acc is lower than train with train+valid. + :param arch_id: + :return: + """ + return self.query_200_epoch(str(arch_id), Config.c10) + + def get_c100_200epoch_test_info(self, arch_id: int): + return self.query_200_epoch(str(arch_id), Config.c100) + + def get_imgNet_200epoch_test_info(self, arch_id: int): + return self.query_200_epoch(str(arch_id), Config.imgNet) + + def query_200_epoch(self, arch_id: str, dataset, epoch_num: int = 199): + if epoch_num is None or epoch_num > 199: + epoch_num = 199 + arch_id = str(arch_id) + t_acc = self.data201[arch_id]["200"][dataset][str(epoch_num)]["test_accuracy"] + time_usage = self.data201[arch_id]["200"][dataset][str(epoch_num)]["time_usage"] + return t_acc, time_usage + + def query_12_epoch(self, arch_id: str, dataset, epoch_num: int = 11): + if epoch_num is None or epoch_num > 11: + epoch_num = 11 + arch_id = str(arch_id) + t_acc = self.data201[arch_id]["12"][dataset][str(epoch_num)]["test_accuracy"] + time_usage = self.data201[arch_id]["12"][dataset][str(epoch_num)]["time_usage"] + return t_acc, time_usage + + def count_models(self): + return len(self.data201) + + def guess_train_one_epoch_time(self, dataset): + if dataset == Config.c10: + dataset = Config.c10_valid + # pick the max value over 5k arch training time, it's 40 + # res = 0 + # for arch_id in range(15624): + # _, time_usage = self.query_200_epoch(str(arch_id), dataset, 1) + # if time_usage > res: + # res = time_usage + # return res + return 40 + + def get_all_trained_model_ids(self): + # 201 all data has the same model set. + return list(self.data201.keys()) + + +class Gt101(metaclass=Singleton): + + @classmethod + def guess_score_time(cls): + return random.randint(1169, 1372) * 0.0001 + + def __init__(self): + self.data101_from_zerocost = read_pickle(gt101P) + self.id_to_hash_map = read_json(id_to_hash_path) + self.data101_full = read_json(gt101) + + def get_c10_test_info(self, arch_id: str, dataset: str = Config.c10, epoch_num: int = 108): + """ + Default use 108 epoch for c10, this is the largest epoch number. + :param dataset: + :param arch_id: architecture id + :param epoch_num: query the result of the specific epoch number + :return: + """ + if dataset != Config.c10: + raise "NB101 only have c10 results" + + if epoch_num is None or epoch_num > 108: + epoch_num = 108 + elif epoch_num > 36: + epoch_num = 36 + elif epoch_num > 12: + epoch_num = 12 + elif epoch_num > 4: + epoch_num = 4 + else: + epoch_num = 4 + arch_id = str(arch_id) + # this is acc from zero-cost paper, which only record 108 epoch' result [test, valid, train] + # t_acc = self.data101_from_zerocost[self.id_to_hash_map[arch_id]][0] + # this is acc from parse_testacc_101.py, + t_acc = self.data101_full[arch_id][Config.c10][str(epoch_num)]["test-accuracy"] + time_usage = self.data101_full[arch_id][Config.c10][str(epoch_num)]["time_usage"] + # print(f"[Debug]: Acc different = {t_acc_usage - t_acc}") + return t_acc, time_usage + + def count_models(self): + return len(self.data101_from_zerocost) + + def guess_train_one_epoch_time(self): + # only have information for 4 epoch + d = dict.fromkeys(self.data101_full) + keys = random.sample(list(d), 15000) + + # pick the max value over 5k arch training time + res = 0 + for rep_time in range(15000): + arch_id = keys[rep_time] + _, time_usage = self.get_c10_test_info(arch_id=arch_id, dataset=Config.c10, epoch_num=4) + if time_usage > res: + res = time_usage + return res + + def get_all_trained_model_ids(self): + return list(self.data101_full.keys()) + + +if __name__ == "__main__": + lapi = ImgScoreQueryApi(Config.NB101, Config.c10) + lapi.get_len_data() diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py new file mode 100644 index 000000000..08854c5f8 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py @@ -0,0 +1,145 @@ +import os +from src.common.constant import Config +from src.tools.compute import generate_global_rank +from src.tools.io_tools import read_json + +base_dir = os.environ.get("base_dir") +if base_dir is None: base_dir = os.getcwd() +print("base_dir is {}".format(base_dir)) + +# todo: move all those to a config file +# MLP related ground truth +mlp_train_frappe = os.path.join(base_dir, "tab_data/frappe/all_train_baseline_frappe.json") +mlp_train_uci_diabetes = os.path.join(base_dir, "tab_data/uci_diabetes/all_train_baseline_uci_160k_40epoch.json") +mlp_train_criteo = os.path.join(base_dir, "tab_data/criteo/all_train_baseline_criteo.json") + +# score result +mlp_score_frappe = os.path.join(base_dir, "tab_data/frappe/score_frappe_batch_size_32_local_finish_all_models.json") +# mlp_score_frappe = os.path.join(base_dir, "tab_data/frappe/score_frappe_batch_size_32_nawot_synflow.json") +mlp_score_uci = os.path.join(base_dir, "tab_data/uci_diabetes/score_uci_diabetes_batch_size_32_all_metrics.json") +mlp_score_criteo = os.path.join(base_dir, "tab_data/criteo/score_criteo_batch_size_32.json") + +# 0.8028456677612497 +# todo: here is for debug expressFlow only +exp_mlp_score_frappe = os.path.join(base_dir, "score_scale_traj_width/score_mlp_sp_frappe_batch_size_32_cpu.json") +exp_mlp_score_uci = os.path.join(base_dir, "score_scale_traj_width/score_mlp_sp_uci_diabetes_batch_size_32_cpu.json") +exp_mlp_score_criteo = os.path.join(base_dir, "score_scale_traj_width/score_mlp_sp_criteo_batch_size_32_cpu.json") + +# todo here we use weigth sharing. +mlp_score_frappe_weight_share = os.path.join(base_dir, "tab_data/weight_share_nas_frappe.json") + +# pre computed result +score_one_model_time_dict = { + "cpu": { + Config.Frappe: 0.0211558125, + Config.UCIDataset: 0.015039052631578948, + Config.Criteo: 0.6824370454545454 + }, + "gpu": { + Config.Frappe: 0.013744457142857143, + Config.UCIDataset: 0.008209692307692308, + Config.Criteo: 0.6095493157894737 + } +} + +train_one_epoch_time_dict = { + "cpu": { + Config.Frappe: 5.122203075885773, + Config.UCIDataset: 4.16297769, + Config.Criteo: 422 + }, + "gpu": { + Config.Frappe: 2.8, + Config.UCIDataset: 1.4, + Config.Criteo: 125 + } +} + + +class GTMLP: + _instances = {} + # use those algoroithm => new tfmem + default_alg_name_list = ["nas_wot", "synflow"] + device = "cpu" + + def __new__(cls, dataset: str): + if dataset not in cls._instances: + instance = super(GTMLP, cls).__new__(cls) + instance.dataset = dataset + if dataset == Config.Frappe: + instance.mlp_train_path = mlp_train_frappe + instance.mlp_score_path = mlp_score_frappe + instance.mlp_score_path_expressflow = exp_mlp_score_frappe + instance.mlp_score_path_weight_share = mlp_score_frappe_weight_share + elif dataset == Config.Criteo: + instance.mlp_train_path = mlp_train_criteo + instance.mlp_score_path = mlp_score_criteo + instance.mlp_score_path_expressflow = exp_mlp_score_criteo + instance.mlp_score_path_weight_share = "./not_exist" + elif dataset == Config.UCIDataset: + instance.mlp_train_path = mlp_train_uci_diabetes + instance.mlp_score_path = mlp_score_uci + instance.mlp_score_path_expressflow = exp_mlp_score_uci + instance.mlp_score_path_weight_share = "./not_exist" + instance.mlp_train = read_json(instance.mlp_train_path) + instance.mlp_score = read_json(instance.mlp_score_path) + + # todo: here we combine two json dict, remove later + mlp_score_expressflow = read_json(instance.mlp_score_path_expressflow) + for arch_id in mlp_score_expressflow: + if arch_id in instance.mlp_score: + instance.mlp_score[arch_id].update(mlp_score_expressflow[arch_id]) + + mlp_score_weight_share = read_json(instance.mlp_score_path_weight_share) + for arch_id in mlp_score_weight_share: + if arch_id in instance.mlp_score: + instance.mlp_score[arch_id].update({"weight_share": mlp_score_weight_share[arch_id]}) + + instance.mlp_global_rank = generate_global_rank( + instance.mlp_score, instance.default_alg_name_list) + + cls._instances[dataset] = instance + return cls._instances[dataset] + + def get_all_trained_model_ids(self): + return list(self.mlp_train[self.dataset].keys()) + + def get_all_scored_model_ids(self): + return list(self.mlp_score.keys()) + + def get_score_one_model_time(self, device: str): + _train_time_per_epoch = score_one_model_time_dict[device].get(self.dataset) + if _train_time_per_epoch is None: + raise NotImplementedError + return _train_time_per_epoch + + def get_train_one_epoch_time(self, device: str): + _train_time_per_epoch = train_one_epoch_time_dict[device].get(self.dataset) + if _train_time_per_epoch is None: + raise NotImplementedError + return _train_time_per_epoch + + def get_valid_auc(self, arch_id: str, epoch_num: int): + # todo: due to the too many job contention on server, the time usage may not valid. + time_usage = (int(epoch_num) + 1) * self.get_train_one_epoch_time(self.device) + if self.dataset == Config.Frappe: + if epoch_num is None or epoch_num >= 20: epoch_num = 19 + t_acc = self.mlp_train[self.dataset][arch_id][str(epoch_num)]["valid_auc"] + return t_acc, time_usage + elif self.dataset == Config.Criteo: + if epoch_num is None or epoch_num >= 10: epoch_num = 9 + t_acc = self.mlp_train[self.dataset][arch_id][str(epoch_num)]["valid_auc"] + return t_acc, time_usage + elif self.dataset == Config.UCIDataset: + if epoch_num is None or epoch_num >= 40: epoch_num = 39 + t_acc = self.mlp_train[self.dataset][arch_id][str(epoch_num)]["valid_auc"] + return t_acc, time_usage + else: + raise NotImplementedError + + def api_get_score(self, arch_id: str) -> dict: + score_dic = self.mlp_score[arch_id] + return score_dic + + def get_global_rank_score(self, arch_id): + return self.mlp_global_rank[arch_id] diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py new file mode 100644 index 000000000..eab587122 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py @@ -0,0 +1,13 @@ +import threading + + +class Singleton(type): + _instances = {} + _lock = threading.Lock() + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + with cls._lock: + if cls not in cls._instances: + cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py new file mode 100644 index 000000000..b3f2150e8 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py @@ -0,0 +1,23 @@ +class ModelMacroCfg: + """ + Macro search space config + Search Space basic init, use bn or not, input features, output labels, etc. + """ + + def __init__(self, num_labels): + """ + Args: + num_labels: output labels. + """ + self.num_labels = num_labels + + +class ModelMicroCfg: + """ + Micro space cfg + Identifier for each model, connection patter, operations etc. + encoding = serialized(ModelMicroCfg) + """ + + def __init__(self): + pass diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py new file mode 100644 index 000000000..037ca12e7 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py @@ -0,0 +1,37 @@ +import os +from src.common.constant import Config +from src.search_space.core.space import SpaceWrapper +from src.query_api.query_api_img import ImgScoreQueryApi + +def init_search_space(args) -> SpaceWrapper: + """ + :param args: + :param loapi: Local score API, records all scored arch, 101 use it to detect which arch is scored. + :return: + """ + # elif args.search_space == Config.MLPSP: + if args.search_space == Config.MLPSP: + from .mlp_api.space import MlpSpace + from .mlp_api.model_params import MlpMacroCfg + from .mlp_api.space import DEFAULT_LAYER_CHOICES_20, DEFAULT_LAYER_CHOICES_10 + print ("src/search_space/init_search_space.py config.MLPSP") + if args.hidden_choice_len == 10: + model_cfg = MlpMacroCfg( + args.nfield, + args.nfeat, + args.nemb, + args.num_layers, + args.num_labels, + DEFAULT_LAYER_CHOICES_10) + else: + model_cfg = MlpMacroCfg( + args.nfield, + args.nfeat, + args.nemb, + args.num_layers, + args.num_labels, + DEFAULT_LAYER_CHOICES_20) + + return MlpSpace(model_cfg) + else: + raise Exception diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py new file mode 100644 index 000000000..2c6b9482d --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py @@ -0,0 +1,16 @@ +from src.search_space.core.model_params import ModelMacroCfg + + +class MlpMacroCfg(ModelMacroCfg): + + def __init__(self, nfield: int, nfeat: int, nemb: int, + num_layers: int, + num_labels: int, + layer_choices: list): + super().__init__(num_labels) + + self.nfield = nfield + self.nfeat = nfeat + self.nemb = nemb + self.layer_choices = layer_choices + self.num_layers = num_layers diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py new file mode 100644 index 000000000..207773d05 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py @@ -0,0 +1,18 @@ +from src.search_space.core.rl_policy import RLPolicyBase + + +class RLMlpSPaceTopology(RLPolicyBase): + def __init__(self, search_space, rl_learning_rate, max_nodes=4): + super().__init__() + + def generate_arch(self, config): + pass + + def select_action(self): + pass + + def _sample_new_cfg(self): + pass + + def update_policy(self, reward, baseline_values, log_prob): + pass diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py new file mode 100644 index 000000000..6668c0265 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py @@ -0,0 +1,625 @@ +import copy +import itertools +import random +import time +from copy import deepcopy +from typing import Generator + +from src.common.constant import Config, CommonVars +from src.eva_engine import evaluator_register +from src.eva_engine.phase2.algo.trainer import ModelTrainer +from src.logger import logger +from src.search_space.core.model_params import ModelMicroCfg, ModelMacroCfg +from src.search_space.core.space import SpaceWrapper +from src.search_space.mlp_api.model_params import MlpMacroCfg +from src.query_api.interface import profile_NK_trade_off +from src.query_api.query_api_mlp import GTMLP + +from singa import layer +from singa import model +from singa import tensor +from singa import opt +from singa import device +from singa.autograd import Operator +from singa.layer import Layer +from singa import singa_wrap as singa +import argparse +import numpy as np + +# Useful constants + +DEFAULT_LAYER_CHOICES_20 = [8, 16, 24, 32, # 8 + 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, # 16 + 384, 512] +DEFAULT_LAYER_CHOICES_10 = [8, 16, 32, + 48, 96, 112, 144, 176, 240, + 384] + + +np_dtype = {"float16": np.float16, "float32": np.float32} + +# singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} +singa_dtype = {"float32": tensor.float32} + +class MlpMicroCfg(ModelMicroCfg): + + @classmethod + def builder(cls, encoding: str): + return MlpMicroCfg([int(ele) for ele in encoding.split("-")]) + + def __init__(self, hidden_layer_list: list): + super().__init__() + self.hidden_layer_list = hidden_layer_list + + def __str__(self): + return "-".join(str(x) for x in self.hidden_layer_list) + +#### self-defined loss begin + +### from autograd.py +class SumError(Operator): + + def __init__(self): + super(SumError, self).__init__() + # self.t = t.data + + def forward(self, x): + # self.err = singa.__sub__(x, self.t) + self.data_x = x + # print ("SumError forward x: ", x) + # print ("SumError forward x.L2(): ", x.L2()) + # print ("SumError forward x shape(): ", x.shape()) + # sqr = singa.Square(self.err) + # loss = singa.SumAll(sqr) + loss = singa.SumAll(x) + # self.n = 1 + # for s in x.shape(): + # self.n *= s + # loss /= self.n + return loss + + def backward(self, dy=1.0): + # dx = self.err + dev = device.get_default_device() + # print ("backward self.data_x.shape(): ", self.data_x.shape()) + dx = tensor.Tensor(self.data_x.shape(), dev, singa_dtype['float32']) + dx.copy_from_numpy(np.ones(self.data_x.shape(), dtype=np.float32)) + # print ("SumError backward dx data: ", dx.data) + # dx *= float(2 / self.n) + dx.data *= float(dy) + return dx.data + +def se_loss(x): + # assert x.shape == t.shape, "input and target shape different: %s, %s" % ( + # x.shape, t.shape) + return SumError()(x)[0] + +### from layer.py +class SumErrorLayer(Layer): + """ + Generate a MeanSquareError operator + """ + + def __init__(self): + super(SumErrorLayer, self).__init__() + + def forward(self, x): + return se_loss(x) + +#### self-defined loss end + +class SINGADNNModel(model.Model): + + def __init__(self, nfield: int, nfeat: int, nemb: int, + hidden_layer_list: list, dropout_rate: float, + noutput: int, use_bn: bool = True): + # def __init__(self, data_size=10, perceptron_size=100, num_classes=10, layer_hidden_list=[10,10,10,10]): + super(SINGADNNModel, self).__init__() + # self.num_classes = num_classes + self.dimension = 2 # data dimension = 2 + + self.mlp_ninput = nfield * nemb + self.nfeat = nfeat + + layer_hidden_list = [] + for index, layer_size in enumerate(hidden_layer_list): + layer_hidden_list.append(layer_size) + self.relu = layer.ReLU() + self.linear1 = layer.Linear(layer_hidden_list[0]) + # print ("linear1.in_features: ", self.linear1.in_features) + # print ("linear1.out_features: ", self.linear1.out_features) + self.linear2 = layer.Linear(layer_hidden_list[1]) + # print ("linear2.in_features: ", self.linear2.in_features) + # print ("linear2.out_features: ", self.linear2.out_features) + self.linear3 = layer.Linear(layer_hidden_list[2]) + # print ("linear3.in_features: ", self.linear3.in_features) + # print ("linear3.out_features: ", self.linear3.out_features) + self.linear4 = layer.Linear(layer_hidden_list[3]) + # print ("linear4.in_features: ", self.linear4.in_features) + # print ("linear4.out_features: ", self.linear4.out_features) + self.linear5 = layer.Linear(noutput) + # print ("linear5.in_features: ", self.linear5.in_features) + # print ("linear5.out_features: ", self.linear5.out_features) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + self.sum_error = SumErrorLayer() + # for weight-sharing + self.is_masked_subnet = False + self.hidden_layer_list = hidden_layer_list + # Initialize subnet mask with ones + self.subnet_mask = [np.ones(size) for size in hidden_layer_list] + + def forward(self, inputs): + # print ("in space.py forward") + # print ("in space.py inputs shape: ", inputs.shape) + y = self.linear1(inputs) + y = self.relu(y) + y = self.linear2(y) + y = self.relu(y) + y = self.linear3(y) + y = self.relu(y) + y = self.linear4(y) + y = self.relu(y) + y = self.linear5(y) + return y + + def generate_all_ones_embedding(self): + """ + Only for the MLP + Returns: + """ + import torch + # batch_data = torch.ones(1, self.mlp_ninput).double() # embedding + batch_data = torch.ones(1, self.nfeat).double() # one-hot + # print ("batch_data shape: ", batch_data.shape) + return batch_data + + def sample_subnet(self, arch_id: str, device: str): + # arch_id e.g., '128-128-128-128' + sizes = list(map(int, arch_id.split('-'))) + self.is_masked_subnet = True + # randomly mask neurons in the layers. + + for idx, size in enumerate(sizes): + # Create a mask of ones and zeros with the required length + mask = np.concatenate([ + np.ones(size), + np.zeros(self.hidden_layer_list[idx] - size)], + dim=0) + # Shuffle the mask to randomize which neurons are active + mask = mask[np.random.permutation(mask.size(0))] + self.subnet_mask[idx] = mask + + def train_one_batch(self, x, y, dist_option, spars, synflow_flag): + # print ("space.py in train_one_batch") + out = self.forward(x) + # print ("train_one_batch out shape: ", out.shape) + # print ("train_one_batch tensor.to_numpy(out): ", tensor.to_numpy(out)) + # print ("space.py train_one_batch x.shape: \n", x.shape) + # print ("train_one_batch y.data: \n", y.data) + # print ("space.py train_one_batch out.shape: \n", out.shape) + if synflow_flag: + # print ("train_one_batch sum_error") + loss = self.sum_error(out) + # print ("sum_error loss data: ", loss.data) + else: # normal training + # print ("train_one_batch softmax_cross_entropy") + loss = self.softmax_cross_entropy(out, y) + # print ("softmax_cross_entropy loss.data: ", loss.data) + # print ("train_one_batch loss.data: \n", loss.data) + + if dist_option == 'plain': + # print ("before pn_p_g_list = self.optimizer(loss)") + pn_p_g_list = self.optimizer(loss) + # print ("after pn_p_g_list = self.optimizer(loss)") + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + # print ("len(pn_p_g_list): \n", len(pn_p_g_list)) + # print ("len(pn_p_g_list[0]): \n", len(pn_p_g_list[0])) + # print ("pn_p_g_list[0][0]: \n", pn_p_g_list[0][0]) + # print ("pn_p_g_list[0][1].data: \n", pn_p_g_list[0][1].data) + # print ("pn_p_g_list[0][2].data: \n", pn_p_g_list[0][2].data) + return pn_p_g_list, out, loss + # return pn_p_g_list[0], pn_p_g_list[1], pn_p_g_list[2], out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = SINGADNNModel(**kwargs) + + return model + + +__all__ = ['SINGADNNModel', 'create_model'] + +from torch.utils.data import DataLoader +class MlpSpace(SpaceWrapper): + def __init__(self, modelCfg: MlpMacroCfg): + super().__init__(modelCfg, Config.MLPSP) + + def load(self): + pass + + @classmethod + def serialize_model_encoding(cls, arch_micro: ModelMicroCfg) -> str: + assert isinstance(arch_micro, MlpMicroCfg) + return str(arch_micro) + + @classmethod + def deserialize_model_encoding(cls, model_encoding: str) -> ModelMicroCfg: + return MlpMicroCfg.builder(model_encoding) + + @classmethod + def new_arch_scratch(cls, arch_macro: ModelMacroCfg, arch_micro: ModelMicroCfg, bn: bool = True): + assert isinstance(arch_micro, MlpMicroCfg) + assert isinstance(arch_macro, MlpMacroCfg) + # mlp = DNNModel( + mlp = SINGADNNModel( + nfield=arch_macro.nfield, + nfeat=arch_macro.nfeat, + nemb=arch_macro.nemb, + hidden_layer_list=arch_micro.hidden_layer_list, + dropout_rate=0, + noutput=arch_macro.num_labels, + use_bn=bn, + ) + return mlp + + def new_arch_scratch_with_default_setting(self, model_encoding: str, bn: bool): + model_micro = MlpSpace.deserialize_model_encoding(model_encoding) + return MlpSpace.new_arch_scratch(self.model_cfg, model_micro, bn) + + def new_architecture(self, arch_id: str): + assert isinstance(self.model_cfg, MlpMacroCfg) + """ + Args: + arch_id: arch id is the same as encoding. + Returns: + """ + arch_micro = MlpSpace.deserialize_model_encoding(arch_id) + assert isinstance(arch_micro, MlpMicroCfg) + # print ("src/search_space/mlp_api/space.py new_architecture") + # print ("src/search_space/mlp_api/space.py arch_micro:\n", arch_micro) + # mlp = DNNModel( + mlp = SINGADNNModel( + nfield=self.model_cfg.nfield, + nfeat=self.model_cfg.nfeat, + nemb=self.model_cfg.nemb, + hidden_layer_list=arch_micro.hidden_layer_list, + dropout_rate=0, + noutput=self.model_cfg.num_labels) + return mlp + + def new_architecture_with_micro_cfg(self, arch_micro: ModelMicroCfg): + assert isinstance(arch_micro, MlpMicroCfg) + assert isinstance(self.model_cfg, MlpMacroCfg) + # mlp = DNNModel( + mlp = SINGADNNModel( + nfield=self.model_cfg.nfield, + nfeat=self.model_cfg.nfeat, + nemb=self.model_cfg.nemb, + hidden_layer_list=arch_micro.hidden_layer_list, + dropout_rate=0, + noutput=self.model_cfg.num_labels) + return mlp + + def profiling_score_time( + self, dataset: str, + train_loader: DataLoader = None, val_loader: DataLoader = None, + args=None, is_simulate: bool = False): + assert isinstance(self.model_cfg, MlpMacroCfg) + + device = "cpu" + if is_simulate: + gtmlp = GTMLP(dataset) + # todo, we use hybird here. + # those are from the pre-calculator + _train_time_per_epoch = gtmlp.get_score_one_model_time("cpu") + score_time = _train_time_per_epoch + else: + + # get a random batch. + import torch + batch = iter(train_loader).__next__() + target = batch['y'].type(torch.LongTensor) + batch['id'] = batch['id'].to(device) + batch['value'] = batch['value'].to(device) + target = target.to(device) + # .reshape(target.shape[0], self.model_cfg.num_labels). + + # pick the largest net to train + # super_net = DNNModel( + super_net = SINGADNNModel( + nfield=args.nfield, + nfeat=args.nfeat, + nemb=args.nemb, + hidden_layer_list=[DEFAULT_LAYER_CHOICES_20[-1]] * self.model_cfg.num_layers, + dropout_rate=0, + noutput=self.model_cfg.num_labels) + super_net.init_embedding(requires_grad=False) + super_net.to(device) + # measure score time, + score_time_begin = time.time() + naswot_score, _ = evaluator_register[CommonVars.NAS_WOT].evaluate_wrapper( + arch=super_net, + device=device, + batch_data=batch, + batch_labels=target) + + # re-init hte net + del super_net + # super_net = DNNModel( + super_net = SINGADNNModel( + nfield=args.nfield, + nfeat=args.nfeat, + nemb=args.nemb, + hidden_layer_list=[DEFAULT_LAYER_CHOICES_20[-1]] * self.model_cfg.num_layers, + dropout_rate=0, + noutput=self.model_cfg.num_labels, + use_bn=False) + super_net.init_embedding(requires_grad=False) + super_net.to(device) + synflow_score, _ = evaluator_register[CommonVars.PRUNE_SYNFLOW].evaluate_wrapper( + arch=super_net, + device=device, + batch_data=batch, + batch_labels=target) + + score_time = time.time() - score_time_begin + + # re-init hte net + del super_net + return score_time + + def profiling_train_time(self, dataset: str, + train_loader: DataLoader = None, val_loader: DataLoader = None, + args=None, is_simulate: bool = False): + + device = args.device + + if is_simulate: + gtmlp = GTMLP(dataset) + # todo, find a ideal server, and use 512 model to profile. + # those are from the pre-calculator + _train_time_per_epoch = gtmlp.get_train_one_epoch_time(device) + else: + # super_net = DNNModel( + super_net = SINGADNNModel( + nfield=args.nfield, + nfeat=args.nfeat, + nemb=args.nemb, + hidden_layer_list=[DEFAULT_LAYER_CHOICES_20[-1]] * self.model_cfg.num_layers, + dropout_rate=0, + noutput=self.model_cfg.num_labels) + super_net.init_embedding(requires_grad=True) + super_net.to(device) + # only train for ony iteratin to evaluat the time usage. + targs = copy.deepcopy(args) + valid_auc, train_time_epoch, train_log = ModelTrainer.fully_train_arch( + model=super_net, + use_test_acc=False, + epoch_num=1, + train_loader=train_loader, + val_loader=val_loader, + test_loader=val_loader, + args=targs) + del super_net + _train_time_per_epoch = train_time_epoch + + return _train_time_per_epoch + + def profiling(self, dataset: str, + train_loader: DataLoader = None, val_loader: DataLoader = None, + args=None, is_simulate: bool = False) -> (float, float, int): + + assert isinstance(self.model_cfg, MlpMacroCfg) + device = args.device + + if is_simulate: + gtmlp = GTMLP(dataset) + # todo, we use hybird here. + # those are from the pre-calculator + _train_time_per_epoch = gtmlp.get_score_one_model_time("cpu") + score_time = _train_time_per_epoch + else: + import torch + # get a random batch. + batch = iter(train_loader).__next__() + target = batch['y'].type(torch.LongTensor) + batch['id'] = batch['id'].to(device) + batch['value'] = batch['value'].to(device) + target = target.to(device) + # .reshape(target.shape[0], self.model_cfg.num_labels). + + # pick the largest net to train + # super_net = DNNModel( + super_net = SINGADNNModel( + nfield=args.nfield, + nfeat=args.nfeat, + nemb=args.nemb, + hidden_layer_list=[DEFAULT_LAYER_CHOICES_20[-1]] * self.model_cfg.num_layers, + dropout_rate=0, + noutput=self.model_cfg.num_labels) + super_net.init_embedding(requires_grad=False) + super_net.to(device) + + # measure score time, + score_time_begin = time.time() + naswot_score, _ = evaluator_register[CommonVars.NAS_WOT].evaluate_wrapper( + arch=super_net, + device=device, + batch_data=batch, + batch_labels=target) + + # re-init hte net + del super_net + # super_net = DNNModel( + super_net = SINGADNNModel( + nfield=args.nfield, + nfeat=args.nfeat, + nemb=args.nemb, + hidden_layer_list=[DEFAULT_LAYER_CHOICES_20[-1]] * self.model_cfg.num_layers, + dropout_rate=0, + noutput=self.model_cfg.num_labels, + use_bn=False) + super_net.init_embedding(requires_grad=False) + super_net.to(device) + + synflow_score, _ = evaluator_register[CommonVars.PRUNE_SYNFLOW].evaluate_wrapper( + arch=super_net, + device=device, + batch_data=batch, + batch_labels=target) + + score_time = time.time() - score_time_begin + + # re-init hte net + del super_net + + if is_simulate: + gtmlp = GTMLP(dataset) + # todo, find a ideal server, and use 512 model to profile. + # those are from the pre-calculator + _train_time_per_epoch = gtmlp.get_train_one_epoch_time(device) + else: + # super_net = DNNModel( + super_net = SINGADNNModel( + nfield=args.nfield, + nfeat=args.nfeat, + nemb=args.nemb, + hidden_layer_list=[DEFAULT_LAYER_CHOICES_20[-1]] * self.model_cfg.num_layers, + dropout_rate=0, + noutput=self.model_cfg.num_labels) + super_net.init_embedding(requires_grad=True) + super_net.to(device) + + # only train for ony iteratin to evaluat the time usage. + targs = copy.deepcopy(args) + valid_auc, train_time_epoch, train_log = ModelTrainer.fully_train_arch( + model=super_net, + use_test_acc=False, + epoch_num=1, + train_loader=train_loader, + val_loader=val_loader, + test_loader=val_loader, + args=targs) + del super_net + _train_time_per_epoch = train_time_epoch + + # todo: this is pre-defined by using img Dataset, suppose each epoch only train 200 iterations + score_time_per_model = score_time + train_time_per_epoch = _train_time_per_epoch + if args.kn_rate != -1: + n_k_ratio = args.kn_rate + else: + n_k_ratio = profile_NK_trade_off(dataset) + print(f"Profiling results: score_time_per_model={score_time_per_model}," + f" train_time_per_epoch={train_time_per_epoch}") + logger.info(f"Profiling results: score_time_per_model={score_time_per_model}," + f" train_time_per_epoch={train_time_per_epoch}") + return score_time_per_model, train_time_per_epoch, n_k_ratio + + def micro_to_id(self, arch_struct: ModelMicroCfg) -> str: + assert isinstance(arch_struct, MlpMicroCfg) + return str(arch_struct.hidden_layer_list) + + def __len__(self): + assert isinstance(self.model_cfg, MlpMacroCfg) + return len(self.model_cfg.layer_choices) ** self.model_cfg.num_layers + + def get_arch_size(self, arch_micro: ModelMicroCfg) -> int: + assert isinstance(arch_micro, MlpMicroCfg) + result = 1 + for ele in arch_micro.hidden_layer_list: + result = result * ele + return result + + def sample_all_models(self) -> Generator[str, ModelMicroCfg, None]: + assert isinstance(self.model_cfg, MlpMacroCfg) + # 2-dimensional matrix for the search spcae + space = [] + for _ in range(self.model_cfg.num_layers): + space.append(self.model_cfg.layer_choices) + + # generate all possible combinations + combinations = itertools.product(*space) + + # encoding each of them + while True: + # debug only + # yield "8-16-32-64", MlpMicroCfg([8, 16, 32, 64]) + ele = combinations.__next__() + model_micro = MlpMicroCfg(list(ele)) + model_encoding = str(model_micro) + yield model_encoding, model_micro + + def random_architecture_id(self) -> (str, ModelMicroCfg): + assert isinstance(self.model_cfg, MlpMacroCfg) + arch_encod = [] + for _ in range(self.model_cfg.num_layers): + layer_size = random.choice(self.model_cfg.layer_choices) + arch_encod.append(layer_size) + + model_micro = MlpMicroCfg(arch_encod) + # this is the model id == str(model micro) + model_encoding = str(model_micro) + return model_encoding, model_micro + + '''Below is for EA''' + + def mutate_architecture(self, parent_arch: ModelMicroCfg) -> (str, ModelMicroCfg): + assert isinstance(parent_arch, MlpMicroCfg) + assert isinstance(self.model_cfg, MlpMacroCfg) + child_layer_list = deepcopy(parent_arch.hidden_layer_list) + + # 1. choose layer index + chosen_hidden_layer_index = random.choice(list(range(len(child_layer_list)))) + + # 2. choose size of the layer index, increase the randomness + while True: + cur_layer_size = child_layer_list[chosen_hidden_layer_index] + mutated_layer_size = random.choice(self.model_cfg.layer_choices) + if mutated_layer_size != cur_layer_size: + child_layer_list[chosen_hidden_layer_index] = mutated_layer_size + new_model = MlpMicroCfg(child_layer_list) + return str(new_model), new_model + + def mutate_architecture_move_proposal(self, parent_arch: ModelMicroCfg): + assert isinstance(parent_arch, MlpMicroCfg) + assert isinstance(self.model_cfg, MlpMacroCfg) + child_layer_list = deepcopy(parent_arch.hidden_layer_list) + + all_combs = set() + # 1. choose layer index + for chosen_hidden_layer_index in list(range(len(child_layer_list))): + + # 2. choose size of the layer index, increase the randomness + while True: + cur_layer_size = child_layer_list[chosen_hidden_layer_index] + mutated_layer_size = random.choice(self.model_cfg.layer_choices) + if mutated_layer_size != cur_layer_size: + child_layer_list[chosen_hidden_layer_index] = mutated_layer_size + new_model = MlpMicroCfg(child_layer_list) + all_combs.add((str(new_model), new_model)) + break + + return list(all_combs) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/weight_initializers.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/weight_initializers.py new file mode 100644 index 000000000..de1c54442 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/weight_initializers.py @@ -0,0 +1,78 @@ +# Copyright 2021 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +def init_net(net, w_type, b_type): + """ + Init network with various algorithms + :param net: + :param w_type: + :param b_type: + :return: + """ + if w_type == 'none': + pass + elif w_type == 'xavier': + net.apply(_init_weights_vs) + elif w_type == 'kaiming': + net.apply(_init_weights_he) + elif w_type == 'zero': + net.apply(_init_weights_zero) + else: + raise NotImplementedError(f'init_type={w_type} is not supported.') + + if b_type == 'none': + pass + elif b_type == 'xavier': + net.apply(_init_bias_vs) + elif b_type == 'kaiming': + net.apply(_init_bias_he) + elif b_type == 'zero': + net.apply(_init_bias_zero) + else: + raise NotImplementedError(f'init_type={b_type} is not supported.') + +import torch.nn as nn + +def _init_weights_vs(m): + if type(m) == nn.Linear or type(m) == nn.Conv2d: + nn.init.xavier_normal_(m.weight) + + +def _init_bias_vs(m): + if type(m) == nn.Linear or type(m) == nn.Conv2d: + if m.bias is not None: + nn.init.xavier_normal_(m.bias) + + +def _init_weights_he(m): + if type(m) == nn.Linear or type(m) == nn.Conv2d: + nn.init.kaiming_normal_(m.weight) + + +def _init_bias_he(m): + if type(m) == nn.Linear or type(m) == nn.Conv2d: + if m.bias is not None: + nn.init.kaiming_normal_(m.bias) + + +def _init_weights_zero(m): + if type(m) == nn.Linear or type(m) == nn.Conv2d: + m.weight.data.fill_(.0) + + +def _init_bias_zero(m): + if type(m) == nn.Linear or type(m) == nn.Conv2d: + if m.bias is not None: + m.bias.data.fill_(.0) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py new file mode 100644 index 000000000..6b53055cb --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py @@ -0,0 +1,18 @@ +from collections import namedtuple + + +Genotype = namedtuple('Genotype', 'normal normal_concat reduce reduce_concat') + +PRIMITIVES = [ + 'none', + 'max_pool_3x3', + 'avg_pool_3x3', + 'skip_connect', + 'sep_conv_3x3', + 'sep_conv_5x5', + 'dil_conv_3x3', + 'dil_conv_5x5' +] + +NUM_VERTICES = 4 +NUM_OPS = 7 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py new file mode 100644 index 000000000..02081a6b8 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py @@ -0,0 +1,291 @@ + +from operations import * +from .utils import drop_path + + +class Cell(nn.Module): + + def __init__(self, genotype, C_prev_prev, C_prev, C, reduction, reduction_prev): + super(Cell, self).__init__() + # print(C_prev_prev, C_prev, C) + + if reduction_prev: + self.preprocess0 = FactorizedReduce(C_prev_prev, C) + else: + self.preprocess0 = ReLUConvBN(C_prev_prev, C, 1, 1, 0) + self.preprocess1 = ReLUConvBN(C_prev, C, 1, 1, 0) + + if reduction: + op_names, indices = zip(*genotype.reduce) + concat = genotype.reduce_concat + else: + op_names, indices = zip(*genotype.normal) + concat = genotype.normal_concat + self._compile(C, op_names, indices, concat, reduction) + + def _compile(self, C, op_names, indices, concat, reduction): + assert len(op_names) == len(indices) + self._steps = len(op_names) // 2 + self._concat = concat + self.multiplier = len(concat) + + self._ops = nn.ModuleList() + for name, index in zip(op_names, indices): + stride = 2 if reduction and index < 2 else 1 + op = OPS[name](C, stride, True) + self._ops += [op] + self._indices = indices + + def forward(self, s0, s1, drop_prob): + s0 = self.preprocess0(s0) + s1 = self.preprocess1(s1) + + states = [s0, s1] + for i in range(self._steps): + h1 = states[self._indices[2 * i]] + h2 = states[self._indices[2 * i + 1]] + op1 = self._ops[2 * i] + op2 = self._ops[2 * i + 1] + h1 = op1(h1) + h2 = op2(h2) + if self.training and drop_prob > 0.: + if not isinstance(op1, Identity): + h1 = drop_path(h1, drop_prob) + if not isinstance(op2, Identity): + h2 = drop_path(h2, drop_prob) + s = h1 + h2 + states += [s] + return torch.cat([states[i] for i in self._concat], dim=1) + + +class AuxiliaryHeadCIFAR(nn.Module): + + def __init__(self, C, num_classes): + """assuming input size 8x8""" + super(AuxiliaryHeadCIFAR, self).__init__() + self.features = nn.Sequential( + nn.ReLU(inplace=True), + # image size = 2 x 2 + nn.AvgPool2d(5, stride=3, padding=0, count_include_pad=False), + nn.Conv2d(C, 128, 1, bias=False), + nn.BatchNorm2d(128), + nn.ReLU(inplace=True), + nn.Conv2d(128, 768, 2, bias=False), + nn.BatchNorm2d(768), + nn.ReLU(inplace=True) + ) + self.classifier = nn.Linear(768, num_classes) + + def forward(self, x): + x = self.features(x) + x = self.classifier(x.view(x.size(0), -1)) + return x + + +class AuxiliaryHeadTinyImageNet(nn.Module): + + def __init__(self, C, num_classes): + """assuming input size 8x8""" + super(AuxiliaryHeadTinyImageNet, self).__init__() + self.features = nn.Sequential( + nn.ReLU(inplace=False), + # image size = 2 x 2 + nn.AvgPool2d(5, stride=3, padding=0, count_include_pad=False), + nn.Conv2d(C, 128, 1, bias=False), + nn.BatchNorm2d(128), + nn.ReLU(inplace=False), + nn.Conv2d(128, 768, 2, bias=False), + nn.BatchNorm2d(768), + nn.ReLU(inplace=False) + ) + self.classifier = nn.Linear(768, num_classes) + + def forward(self, x): + x = self.features(x) + x = self.classifier(x.view(x.size(0), -1)) + return x + + +class AuxiliaryHeadImageNet(nn.Module): + + def __init__(self, C, num_classes): + """assuming input size 14x14""" + super(AuxiliaryHeadImageNet, self).__init__() + self.features = nn.Sequential( + nn.ReLU(inplace=True), + nn.AvgPool2d(5, stride=2, padding=0, count_include_pad=False), + nn.Conv2d(C, 128, 1, bias=False), + nn.BatchNorm2d(128), + nn.ReLU(inplace=True), + nn.Conv2d(128, 768, 2, bias=False), + # NOTE: This batchnorm was omitted in my earlier implementation due to a typo. + # Commenting it out for consistency with the experiments in the paper. + # nn.BatchNorm2d(768), + nn.ReLU(inplace=True) + ) + self.classifier = nn.Linear(768, num_classes) + + def forward(self, x): + x = self.features(x) + x = self.classifier(x.view(x.size(0), -1)) + return x + + +class NetworkCIFAR(nn.Module): + + def __init__(self, C, num_classes, layers, auxiliary, genotype): + super(NetworkCIFAR, self).__init__() + self._layers = layers + self._auxiliary = auxiliary + + stem_multiplier = 3 + C_curr = stem_multiplier * C + self.stem = nn.Sequential( + nn.Conv2d(3, C_curr, 3, padding=1, bias=False), + nn.BatchNorm2d(C_curr) + ) + + C_prev_prev, C_prev, C_curr = C_curr, C_curr, C + self.cells = nn.ModuleList() + reduction_prev = False + for i in range(layers): + if i in [layers // 3, 2 * layers // 3]: + C_curr *= 2 + reduction = True + else: + reduction = False + cell = Cell(genotype, C_prev_prev, C_prev, + C_curr, reduction, reduction_prev) + reduction_prev = reduction + self.cells += [cell] + C_prev_prev, C_prev = C_prev, cell.multiplier * C_curr + if i == 2 * layers // 3: + C_to_auxiliary = C_prev + + if auxiliary: + self.auxiliary_head = AuxiliaryHeadCIFAR( + C_to_auxiliary, num_classes) + self.global_pooling = nn.AdaptiveAvgPool2d(1) + self.classifier = nn.Linear(C_prev, num_classes) + + def forward(self, input): + logits_aux = None + s0 = s1 = self.stem(input) + for i, cell in enumerate(self.cells): + s0, s1 = s1, cell(s0, s1, self.drop_path_prob) + if i == 2 * self._layers // 3: + if self._auxiliary and self.training: + logits_aux = self.auxiliary_head(s1) + out = self.global_pooling(s1) + logits = self.classifier(out.view(out.size(0), -1)) + return logits, logits_aux + + +class NetworkTinyImageNet(nn.Module): + + def __init__(self, C, num_classes, layers, auxiliary, genotype): + super(NetworkTinyImageNet, self).__init__() + self._layers = layers + self._auxiliary = auxiliary + + stem_multiplier = 3 + C_curr = stem_multiplier * C + self.stem = nn.Sequential( + nn.Conv2d(3, C_curr, 3, stride=2, padding=1, bias=False), + nn.BatchNorm2d(C_curr) + ) + + C_prev_prev, C_prev, C_curr = C_curr, C_curr, C + self.cells = nn.ModuleList() + reduction_prev = False + for i in range(layers): + if i in [layers // 3, 2 * layers // 3]: + C_curr *= 2 + reduction = True + else: + reduction = False + cell = Cell(genotype, C_prev_prev, C_prev, + C_curr, reduction, reduction_prev) + reduction_prev = reduction + self.cells += [cell] + C_prev_prev, C_prev = C_prev, cell.multiplier * C_curr + if i == 2 * layers // 3: + C_to_auxiliary = C_prev + + if auxiliary: + self.auxiliary_head = AuxiliaryHeadCIFAR( + C_to_auxiliary, num_classes) + self.global_pooling = nn.AdaptiveAvgPool2d(1) + self.classifier = nn.Linear(C_prev, num_classes) + + def forward(self, input): + logits_aux = None + s0 = s1 = self.stem(input) + for i, cell in enumerate(self.cells): + s0, s1 = s1, cell(s0, s1, self.drop_path_prob) + if i == 2 * self._layers // 3: + if self._auxiliary and self.training: + logits_aux = self.auxiliary_head(s1) + out = self.global_pooling(s1) + logits = self.classifier(out.view(out.size(0), -1)) + return logits, logits_aux + + +class NetworkImageNet(nn.Module): + + def __init__(self, C, num_classes, layers, auxiliary, genotype): + super(NetworkImageNet, self).__init__() + self._layers = layers + self._auxiliary = auxiliary + + self.stem0 = nn.Sequential( + nn.Conv2d(3, C // 2, kernel_size=3, + stride=2, padding=1, bias=False), + nn.BatchNorm2d(C // 2), + nn.ReLU(inplace=True), + nn.Conv2d(C // 2, C, 3, stride=2, padding=1, bias=False), + nn.BatchNorm2d(C), + ) + + self.stem1 = nn.Sequential( + nn.ReLU(inplace=True), + nn.Conv2d(C, C, 3, stride=2, padding=1, bias=False), + nn.BatchNorm2d(C), + ) + + C_prev_prev, C_prev, C_curr = C, C, C + + self.cells = nn.ModuleList() + reduction_prev = True + for i in range(layers): + if i in [layers // 3, 2 * layers // 3]: + C_curr *= 2 + reduction = True + else: + reduction = False + cell = Cell(genotype, C_prev_prev, C_prev, + C_curr, reduction, reduction_prev) + reduction_prev = reduction + self.cells += [cell] + C_prev_prev, C_prev = C_prev, cell.multiplier * C_curr + if i == 2 * layers // 3: + C_to_auxiliary = C_prev + + if auxiliary: + self.auxiliary_head = AuxiliaryHeadImageNet( + C_to_auxiliary, num_classes) + self.global_pooling = nn.AvgPool2d(7) + self.classifier = nn.Linear(C_prev, num_classes) + + def forward(self, input): + logits_aux = None + s0 = self.stem0(input) + s1 = self.stem1(s0) + for i, cell in enumerate(self.cells): + s0, s1 = s1, cell(s0, s1, self.drop_path_prob) + if i == 2 * self._layers // 3: + if self._auxiliary and self.training: + logits_aux = self.auxiliary_head(s1) + out = self.global_pooling(s1) + logits = self.classifier(out.view(out.size(0), -1)) + return logits, logits_aux diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py new file mode 100644 index 000000000..bd4f2ddf0 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py @@ -0,0 +1,109 @@ + +from scipy.special import softmax +from .genotypes import * + + +def genotype(weights, steps=4, multiplier=4): + def _parse(weights): + gene = [] + n = 2 + start = 0 + for i in range(steps): + end = start + n + W = weights[start:end].copy() + edges = sorted(range(i + 2), key=lambda x: -max( + W[x][k] for k in range(len(W[x])) if k != PRIMITIVES.index('none')))[:2] + for j in edges: + k_best = None + for k in range(len(W[j])): + if k != PRIMITIVES.index('none'): + if k_best is None or W[j][k] > W[j][k_best]: + k_best = k + gene.append((PRIMITIVES[k_best], j)) + start = end + n += 1 + return gene + + gene_normal = _parse(softmax(weights[0], axis=-1)) + gene_reduce = _parse(softmax(weights[1], axis=-1)) + + concat = range(2 + steps - multiplier, steps + 2) + genotype = Genotype( + normal=gene_normal, normal_concat=concat, + reduce=gene_reduce, reduce_concat=concat + ) + return genotype + + +# from naslib +def convert_genotype_to_compact(genotype): + """Converts Genotype to the compact representation""" + OPS = [ + "max_pool_3x3", + "avg_pool_3x3", + "skip_connect", + "sep_conv_3x3", + "sep_conv_5x5", + "dil_conv_3x3", + "dil_conv_5x5", + ] + compact = [] + + for i, cell_type in enumerate(["normal", "reduce"]): + cell = eval("genotype." + cell_type) + compact.append([]) + + for j in range(8): + compact[i].append((cell[j][1], OPS.index(cell[j][0]))) + + compact_tuple = (tuple(compact[0]), tuple(compact[1])) + return compact_tuple + + +# from naslib +def convert_compact_to_genotype(compact): + """Converts the compact representation to a Genotype""" + OPS = [ + "max_pool_3x3", + "avg_pool_3x3", + "skip_connect", + "sep_conv_3x3", + "sep_conv_5x5", + "dil_conv_3x3", + "dil_conv_5x5", + ] + genotype = [] + + for i in range(2): + cell = compact[i] + genotype.append([]) + + for j in range(8): + genotype[i].append((OPS[cell[j][1]], cell[j][0])) + + return Genotype( + normal=genotype[0], + normal_concat=[2, 3, 4, 5], + reduce=genotype[1], + reduce_concat=[2, 3, 4, 5], + ) + # TODO: need to check with Colin and/or Arber + # return Genotype( + # normal = genotype[0], + # normal_concat = [2, 3, 4, 5, 6], + # reduce = genotype[1], + # reduce_concat = [4, 5, 6] + # ) + + +# from naslib +def make_compact_mutable(compact): + # convert tuple to list so that it is mutable + arch_list = [] + for cell in compact: + arch_list.append([]) + for pair in cell: + arch_list[-1].append([]) + for num in pair: + arch_list[-1][-1].append(num) + return arch_list diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py new file mode 100644 index 000000000..ac1a183d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py @@ -0,0 +1,5 @@ +##################################################### +# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019.01 # +##################################################### +from .tiny_network import TinyNetwork +from .nasnet_cifar import NASNetonCIFAR diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py new file mode 100644 index 000000000..0d770cb80 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py @@ -0,0 +1,33 @@ +################################################## +# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019 # +################################################## +# The macro structure is defined in NAS-Bench-201 +from .search_model_darts import TinyNetworkDarts +from .search_model_gdas import TinyNetworkGDAS +from .search_model_setn import TinyNetworkSETN +from .search_model_enas import TinyNetworkENAS +from .search_model_random import TinyNetworkRANDOM +from .generic_model import GenericNAS201Model +from .genotypes import Structure as CellStructure, architectures as CellArchitectures + +# NASNet-based macro structure +from .search_model_gdas_nasnet import NASNetworkGDAS +from .search_model_gdas_frc_nasnet import NASNetworkGDAS_FRC +from .search_model_darts_nasnet import NASNetworkDARTS + + +nas201_super_nets = { + "DARTS-V1": TinyNetworkDarts, + "DARTS-V2": TinyNetworkDarts, + "GDAS": TinyNetworkGDAS, + "SETN": TinyNetworkSETN, + "ENAS": TinyNetworkENAS, + "RANDOM": TinyNetworkRANDOM, + "generic": GenericNAS201Model, +} + +nasnet_super_nets = { + "GDAS": NASNetworkGDAS, + "GDAS_FRC": NASNetworkGDAS_FRC, + "DARTS": NASNetworkDARTS, +} diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py new file mode 100644 index 000000000..eaf085470 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py @@ -0,0 +1,280 @@ +################################################## +# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019 # +################################################## +from copy import deepcopy + + +def get_combination(space, num): + combs = [] + for i in range(num): + if i == 0: + for func in space: + combs.append([(func, i)]) + else: + new_combs = [] + for string in combs: + for func in space: + xstring = string + [(func, i)] + new_combs.append(xstring) + combs = new_combs + return combs + + +class Structure: + def __init__(self, genotype): + assert isinstance(genotype, list) or isinstance( + genotype, tuple + ), "invalid class of genotype : {:}".format(type(genotype)) + self.node_num = len(genotype) + 1 + self.nodes = [] + self.node_N = [] + for idx, node_info in enumerate(genotype): + assert isinstance(node_info, list) or isinstance( + node_info, tuple + ), "invalid class of node_info : {:}".format(type(node_info)) + assert len(node_info) >= 1, "invalid length : {:}".format(len(node_info)) + for node_in in node_info: + assert isinstance(node_in, list) or isinstance( + node_in, tuple + ), "invalid class of in-node : {:}".format(type(node_in)) + assert ( + len(node_in) == 2 and node_in[1] <= idx + ), "invalid in-node : {:}".format(node_in) + self.node_N.append(len(node_info)) + self.nodes.append(tuple(deepcopy(node_info))) + + def tolist(self, remove_str): + # convert this class to the list, if remove_str is 'none', then remove the 'none' operation. + # note that we re-order the input node in this function + # return the-genotype-list and success [if unsuccess, it is not a connectivity] + genotypes = [] + for node_info in self.nodes: + node_info = list(node_info) + node_info = sorted(node_info, key=lambda x: (x[1], x[0])) + node_info = tuple(filter(lambda x: x[0] != remove_str, node_info)) + if len(node_info) == 0: + return None, False + genotypes.append(node_info) + return genotypes, True + + def node(self, index): + assert index > 0 and index <= len(self), "invalid index={:} < {:}".format( + index, len(self) + ) + return self.nodes[index] + + def tostr(self): + strings = [] + for node_info in self.nodes: + string = "|".join([x[0] + "~{:}".format(x[1]) for x in node_info]) + string = "|{:}|".format(string) + strings.append(string) + return "+".join(strings) + + def check_valid(self): + nodes = {0: True} + for i, node_info in enumerate(self.nodes): + sums = [] + for op, xin in node_info: + if op == "none" or nodes[xin] is False: + x = False + else: + x = True + sums.append(x) + nodes[i + 1] = sum(sums) > 0 + return nodes[len(self.nodes)] + + def to_unique_str(self, consider_zero=False): + # this is used to identify the isomorphic cell, which rerquires the prior knowledge of operation + # two operations are special, i.e., none and skip_connect + nodes = {0: "0"} + for i_node, node_info in enumerate(self.nodes): + cur_node = [] + for op, xin in node_info: + if consider_zero is None: + x = "(" + nodes[xin] + ")" + "@{:}".format(op) + elif consider_zero: + if op == "none" or nodes[xin] == "#": + x = "#" # zero + elif op == "skip_connect": + x = nodes[xin] + else: + x = "(" + nodes[xin] + ")" + "@{:}".format(op) + else: + if op == "skip_connect": + x = nodes[xin] + else: + x = "(" + nodes[xin] + ")" + "@{:}".format(op) + cur_node.append(x) + nodes[i_node + 1] = "+".join(sorted(cur_node)) + return nodes[len(self.nodes)] + + def check_valid_op(self, op_names): + for node_info in self.nodes: + for inode_edge in node_info: + # assert inode_edge[0] in op_names, 'invalid op-name : {:}'.format(inode_edge[0]) + if inode_edge[0] not in op_names: + return False + return True + + def __repr__(self): + return "{name}({node_num} nodes with {node_info})".format( + name=self.__class__.__name__, node_info=self.tostr(), **self.__dict__ + ) + + def __len__(self): + return len(self.nodes) + 1 + + def __getitem__(self, index): + return self.nodes[index] + + @staticmethod + def str2structure(xstr): + if isinstance(xstr, Structure): + return xstr + assert isinstance(xstr, str), "must take string (not {:}) as input".format( + type(xstr) + ) + nodestrs = xstr.split("+") + genotypes = [] + for i, node_str in enumerate(nodestrs): + inputs = list(filter(lambda x: x != "", node_str.split("|"))) + for xinput in inputs: + assert len(xinput.split("~")) == 2, "invalid input length : {:}".format( + xinput + ) + inputs = (xi.split("~") for xi in inputs) + input_infos = tuple((op, int(IDX)) for (op, IDX) in inputs) + genotypes.append(input_infos) + return Structure(genotypes) + + @staticmethod + def str2fullstructure(xstr, default_name="none"): + assert isinstance(xstr, str), "must take string (not {:}) as input".format( + type(xstr) + ) + nodestrs = xstr.split("+") + genotypes = [] + for i, node_str in enumerate(nodestrs): + inputs = list(filter(lambda x: x != "", node_str.split("|"))) + for xinput in inputs: + assert len(xinput.split("~")) == 2, "invalid input length : {:}".format( + xinput + ) + inputs = (xi.split("~") for xi in inputs) + input_infos = list((op, int(IDX)) for (op, IDX) in inputs) + all_in_nodes = list(x[1] for x in input_infos) + for j in range(i): + if j not in all_in_nodes: + input_infos.append((default_name, j)) + node_info = sorted(input_infos, key=lambda x: (x[1], x[0])) + genotypes.append(tuple(node_info)) + return Structure(genotypes) + + @staticmethod + def gen_all(search_space, num, return_ori): + assert isinstance(search_space, list) or isinstance( + search_space, tuple + ), "invalid class of search-space : {:}".format(type(search_space)) + assert ( + num >= 2 + ), "There should be at least two nodes in a neural cell instead of {:}".format( + num + ) + all_archs = get_combination(search_space, 1) + for i, arch in enumerate(all_archs): + all_archs[i] = [tuple(arch)] + + for inode in range(2, num): + cur_nodes = get_combination(search_space, inode) + new_all_archs = [] + for previous_arch in all_archs: + for cur_node in cur_nodes: + new_all_archs.append(previous_arch + [tuple(cur_node)]) + all_archs = new_all_archs + if return_ori: + return all_archs + else: + return [Structure(x) for x in all_archs] + + +class Struct101(Structure): + def __init__(self, arch_id, genotype): + super().__init__(genotype) + self.arch_id = arch_id + + +ResNet_CODE = Structure( + [ + (("nor_conv_3x3", 0),), # node-1 + (("nor_conv_3x3", 1),), # node-2 + (("skip_connect", 0), ("skip_connect", 2)), + ] # node-3 +) + +AllConv3x3_CODE = Structure( + [ + (("nor_conv_3x3", 0),), # node-1 + (("nor_conv_3x3", 0), ("nor_conv_3x3", 1)), # node-2 + (("nor_conv_3x3", 0), ("nor_conv_3x3", 1), ("nor_conv_3x3", 2)), + ] # node-3 +) + +AllFull_CODE = Structure( + [ + ( + ("skip_connect", 0), + ("nor_conv_1x1", 0), + ("nor_conv_3x3", 0), + ("avg_pool_3x3", 0), + ), # node-1 + ( + ("skip_connect", 0), + ("nor_conv_1x1", 0), + ("nor_conv_3x3", 0), + ("avg_pool_3x3", 0), + ("skip_connect", 1), + ("nor_conv_1x1", 1), + ("nor_conv_3x3", 1), + ("avg_pool_3x3", 1), + ), # node-2 + ( + ("skip_connect", 0), + ("nor_conv_1x1", 0), + ("nor_conv_3x3", 0), + ("avg_pool_3x3", 0), + ("skip_connect", 1), + ("nor_conv_1x1", 1), + ("nor_conv_3x3", 1), + ("avg_pool_3x3", 1), + ("skip_connect", 2), + ("nor_conv_1x1", 2), + ("nor_conv_3x3", 2), + ("avg_pool_3x3", 2), + ), + ] # node-3 +) + +AllConv1x1_CODE = Structure( + [ + (("nor_conv_1x1", 0),), # node-1 + (("nor_conv_1x1", 0), ("nor_conv_1x1", 1)), # node-2 + (("nor_conv_1x1", 0), ("nor_conv_1x1", 1), ("nor_conv_1x1", 2)), + ] # node-3 +) + +AllIdentity_CODE = Structure( + [ + (("skip_connect", 0),), # node-1 + (("skip_connect", 0), ("skip_connect", 1)), # node-2 + (("skip_connect", 0), ("skip_connect", 1), ("skip_connect", 2)), + ] # node-3 +) + +architectures = { + "resnet": ResNet_CODE, + "all_c3x3": AllConv3x3_CODE, + "all_c1x1": AllConv1x1_CODE, + "all_idnt": AllIdentity_CODE, + "all_full": AllFull_CODE, +} diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py new file mode 100644 index 000000000..9c305ffda --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py @@ -0,0 +1,9 @@ +##################################################### +# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019.01 # +##################################################### +from .InferCifarResNet_width import InferWidthCifarResNet +from .InferImagenetResNet import InferImagenetResNet +from .InferCifarResNet_depth import InferDepthCifarResNet +from .InferCifarResNet import InferCifarResNet +from .InferMobileNetV2 import InferMobileNetV2 +from .InferTinyCellNet import DynamicShapeTinyNet diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py new file mode 100644 index 000000000..86ab94924 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py @@ -0,0 +1,5 @@ +def parse_channel_info(xstring): + blocks = xstring.split(" ") + blocks = [x.split("-") for x in blocks] + blocks = [[int(_) for _ in x] for x in blocks] + return blocks diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py new file mode 100644 index 000000000..15e226087 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py @@ -0,0 +1,9 @@ +################################################## +# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019 # +################################################## +from .SearchCifarResNet_width import SearchWidthCifarResNet +from .SearchCifarResNet_depth import SearchDepthCifarResNet +from .SearchCifarResNet import SearchShapeCifarResNet +from .SearchSimResNet_width import SearchWidthSimResNet +from .SearchImagenetResNet import SearchShapeImagenetResNet +from .generic_size_tiny_cell_model import GenericNAS301Model diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py new file mode 100644 index 000000000..fd40910d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py @@ -0,0 +1,4 @@ + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/graph_util.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/graph_util.py new file mode 100644 index 000000000..b3e8194f0 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/graph_util.py @@ -0,0 +1,168 @@ +# Copyright 2019 The Google Research Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utility functions used by generate_graph.py.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import hashlib +import itertools + +import numpy as np + + +def gen_is_edge_fn(bits): + """Generate a boolean function for the edge connectivity. + + Given a bitstring FEDCBA and a 4x4 matrix, the generated matrix is + [[0, A, B, D], + [0, 0, C, E], + [0, 0, 0, F], + [0, 0, 0, 0]] + + Note that this function is agnostic to the actual matrix dimension due to + order in which elements are filled out (column-major, starting from least + significant bit). For example, the same FEDCBA bitstring (0-padded) on a 5x5 + matrix is + [[0, A, B, D, 0], + [0, 0, C, E, 0], + [0, 0, 0, F, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]] + + Args: + bits: integer which will be interpreted as a bit mask. + + Returns: + vectorized function that returns True when an edge is present. + """ + + def is_edge(x, y): + """Is there an edge from x to y (0-indexed)?""" + if x >= y: + return 0 + # Map x, y to index into bit string + index = x + (y * (y - 1) // 2) + return (bits >> index) % 2 == 1 + + return np.vectorize(is_edge) + + +def is_full_dag(matrix): + """Full DAG == all vertices on a path from vert 0 to (V-1). + + i.e. no disconnected or "hanging" vertices. + + It is sufficient to check for: + 1) no rows of 0 except for row V-1 (only output vertex has no out-edges) + 2) no cols of 0 except for col 0 (only input vertex has no in-edges) + + Args: + matrix: V x V upper-triangular adjacency matrix + + Returns: + True if the there are no dangling vertices. + """ + shape = np.shape(matrix) + + rows = matrix[:shape[0] - 1, :] == 0 + rows = np.all(rows, axis=1) # Any row with all 0 will be True + rows_bad = np.any(rows) + + cols = matrix[:, 1:] == 0 + cols = np.all(cols, axis=0) # Any col with all 0 will be True + cols_bad = np.any(cols) + + return (not rows_bad) and (not cols_bad) + + +def num_edges(matrix): + """Computes number of edges in adjacency matrix.""" + return np.sum(matrix) + + +def hash_module(matrix, labeling): + """Computes a graph-invariance MD5 hash of the matrix and label pair. + + Args: + matrix: np.ndarray square upper-triangular adjacency matrix. + labeling: list of int labels of length equal to both dimensions of + matrix. + + Returns: + MD5 hash of the matrix and labeling. + """ + vertices = np.shape(matrix)[0] + in_edges = np.sum(matrix, axis=0).tolist() + out_edges = np.sum(matrix, axis=1).tolist() + + assert len(in_edges) == len(out_edges) == len(labeling) + hashes = list(zip(out_edges, in_edges, labeling)) + hashes = [hashlib.md5(str(h).encode('utf-8')).hexdigest() for h in hashes] + # Computing this up to the diameter is probably sufficient but since the + # operation is fast, it is okay to repeat more times. + for _ in range(vertices): + new_hashes = [] + for v in range(vertices): + in_neighbors = [hashes[w] for w in range(vertices) if matrix[w, v]] + out_neighbors = [hashes[w] for w in range(vertices) if matrix[v, w]] + new_hashes.append(hashlib.md5( + (''.join(sorted(in_neighbors)) + '|' + + ''.join(sorted(out_neighbors)) + '|' + + hashes[v]).encode('utf-8')).hexdigest()) + hashes = new_hashes + fingerprint = hashlib.md5(str(sorted(hashes)).encode('utf-8')).hexdigest() + + return fingerprint + + +def permute_graph(graph, label, permutation): + """Permutes the graph and labels based on permutation. + + Args: + graph: np.ndarray adjacency matrix. + label: list of labels of same length as graph dimensions. + permutation: a permutation list of ints of same length as graph dimensions. + + Returns: + np.ndarray where vertex permutation[v] is vertex v from the original graph + """ + # vertex permutation[v] in new graph is vertex v in the old graph + forward_perm = zip(permutation, list(range(len(permutation)))) + inverse_perm = [x[1] for x in sorted(forward_perm)] + edge_fn = lambda x, y: graph[inverse_perm[x], inverse_perm[y]] == 1 + new_matrix = np.fromfunction(np.vectorize(edge_fn), + (len(label), len(label)), + dtype=np.int8) + new_label = [label[inverse_perm[i]] for i in range(len(label))] + return new_matrix, new_label + + +def is_isomorphic(graph1, graph2): + """Exhaustively checks if 2 graphs are isomorphic.""" + matrix1, label1 = np.array(graph1[0]), graph1[1] + matrix2, label2 = np.array(graph2[0]), graph2[1] + assert np.shape(matrix1) == np.shape(matrix2) + assert len(label1) == len(label2) + + vertices = np.shape(matrix1)[0] + # Note: input and output in our constrained graphs always map to themselves + # but this script does not enforce that. + for perm in itertools.permutations(range(0, vertices)): + pmatrix1, plabel1 = permute_graph(matrix1, label1, perm) + if np.array_equal(pmatrix1, matrix2) and plabel1 == label2: + return True + + return False diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py new file mode 100644 index 000000000..5713fb584 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py @@ -0,0 +1,325 @@ +import copy +import hashlib +import itertools + +import numpy as np + +# Graphviz is optional and only required for visualization. +try: + import graphviz # pylint: disable=g-import-not-at-top +except ImportError: + pass + +INPUT = "input" +OUTPUT = "output" +CONV3X3 = "conv3x3-bn-relu" +CONV1X1 = "conv1x1-bn-relu" +MAXPOOL3X3 = "maxpool3x3" +OPS = [CONV3X3, CONV1X1, MAXPOOL3X3] + +NUM_VERTICES = 7 +OP_SPOTS = NUM_VERTICES - 2 +MAX_EDGES = 9 + + +class NASBench101ModelSpec(object): + """Model specification given adjacency matrix and labeling.""" + + def __init__(self, matrix, ops, data_format='channels_last'): + """Initialize the module spec. + + Args: + matrix: ndarray or nested list with shape [V, V] for the adjacency matrix. + ops: V-length list of labels for the base ops used. The first and last + elements are ignored because they are the input and output vertices + which have no operations. The elements are retained to keep consistent + indexing. + data_format: channels_last or channels_first. + + Raises: + ValueError: invalid matrix or ops + """ + if not isinstance(matrix, np.ndarray): + matrix = np.array(matrix) + shape = np.shape(matrix) + if len(shape) != 2 or shape[0] != shape[1]: + raise ValueError('matrix must be square') + if shape[0] != len(ops): + raise ValueError('length of ops must match matrix dimensions') + if not is_upper_triangular(matrix): + raise ValueError('matrix must be upper triangular') + + # Both the original and pruned matrices are deep copies of the matrix and + # ops so any changes to those after initialization are not recognized by the + # spec. + self.original_matrix = copy.deepcopy(matrix) + self.original_ops = copy.deepcopy(ops) + + self.matrix = copy.deepcopy(matrix) + self.ops = copy.deepcopy(ops) + self.valid_spec = True + self._prune() + + self.data_format = data_format + + def _prune(self): + """Prune the extraneous parts of the graph. + + General procedure: + 1) Remove parts of graph not connected to input. + 2) Remove parts of graph not connected to output. + 3) Reorder the vertices so that they are consecutive after steps 1 and 2. + + These 3 steps can be combined by deleting the rows and columns of the + vertices that are not reachable from both the input and output (in reverse). + """ + num_vertices = np.shape(self.original_matrix)[0] + + # DFS forward from input + visited_from_input = set([0]) + frontier = [0] + while frontier: + top = frontier.pop() + for v in range(top + 1, num_vertices): + if self.original_matrix[top, v] and v not in visited_from_input: + visited_from_input.add(v) + frontier.append(v) + + # DFS backward from output + visited_from_output = set([num_vertices - 1]) + frontier = [num_vertices - 1] + while frontier: + top = frontier.pop() + for v in range(0, top): + if self.original_matrix[v, top] and v not in visited_from_output: + visited_from_output.add(v) + frontier.append(v) + + # Any vertex that isn't connected to both input and output is extraneous to + # the computation graph. + extraneous = set(range(num_vertices)).difference( + visited_from_input.intersection(visited_from_output)) + + # If the non-extraneous graph is less than 2 vertices, the input is not + # connected to the output and the spec is invalid. + if len(extraneous) > num_vertices - 2: + self.matrix = None + self.ops = None + self.valid_spec = False + return + + self.matrix = np.delete(self.matrix, list(extraneous), axis=0) + self.matrix = np.delete(self.matrix, list(extraneous), axis=1) + for index in sorted(extraneous, reverse=True): + del self.ops[index] + + def hash_spec(self, canonical_ops): + """Computes the isomorphism-invariant graph hash of this spec. + + Args: + canonical_ops: list of operations in the canonical ordering which they + were assigned (i.e. the order provided in the config['available_ops']). + + Returns: + MD5 hash of this spec which can be used to query the dataset. + """ + # Invert the operations back to integer label indices used in graph gen. + labeling = [-1] + [canonical_ops.index(op) for op in self.ops[1:-1]] + [-2] + return hash_module(self.matrix, labeling) + + def visualize(self): + """Creates a dot graph. Can be visualized in colab directly.""" + num_vertices = np.shape(self.matrix)[0] + g = graphviz.Digraph() + g.node(str(0), 'input') + for v in range(1, num_vertices - 1): + g.node(str(v), self.ops[v]) + g.node(str(num_vertices - 1), 'output') + + for src in range(num_vertices - 1): + for dst in range(src + 1, num_vertices): + if self.matrix[src, dst]: + g.edge(str(src), str(dst)) + + return g + + @classmethod + def random_sample_one_architecture(cls, dataset_api: dict, min_size=7): + """ + This will sample a random architecture and update the edges in the + naslib object accordingly. + From the NASBench repository: + one-hot adjacency matrix + draw [0,1] for each slot in the adjacency matrix + """ + while True: + matrix = np.random.choice([0, 1], size=(NUM_VERTICES, NUM_VERTICES)) + matrix = np.triu(matrix, 1) + ops = np.random.choice(OPS, size=min_size).tolist() + ops[0] = INPUT + ops[-1] = OUTPUT + spec = dataset_api["api"].ModelSpec(matrix=matrix, ops=ops) + if not dataset_api["nb101_data"].is_valid(spec): + continue + + spec = NASBench101ModelSpec(matrix, ops) + # only sample model with 7 nodes. + if len(spec.matrix) == min_size: + break + + return spec + + +def is_upper_triangular(matrix): + """True if matrix is 0 on diagonal and below.""" + for src in range(np.shape(matrix)[0]): + for dst in range(0, src + 1): + if matrix[src, dst] != 0: + return False + + return True + + +def gen_is_edge_fn(bits): + """Generate a boolean function for the edge connectivity. + + Given a bitstring FEDCBA and a 4x4 matrix, the generated matrix is + [[0, A, B, D], + [0, 0, C, E], + [0, 0, 0, F], + [0, 0, 0, 0]] + + Note that this function is agnostic to the actual matrix dimension due to + order in which elements are filled out (column-major, starting from least + significant bit). For example, the same FEDCBA bitstring (0-padded) on a 5x5 + matrix is + [[0, A, B, D, 0], + [0, 0, C, E, 0], + [0, 0, 0, F, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]] + + Args: + bits: integer which will be interpreted as a bit mask. + + Returns: + vectorized function that returns True when an edge is present. + """ + + def is_edge(x, y): + """Is there an edge from x to y (0-indexed)?""" + if x >= y: + return 0 + # Map x, y to index into bit string + index = x + (y * (y - 1) // 2) + return (bits >> index) % 2 == 1 + + return np.vectorize(is_edge) + + +def is_full_dag(matrix): + """Full DAG == all vertices on a path from vert 0 to (V-1). + + i.e. no disconnected or "hanging" vertices. + + It is sufficient to check for: + 1) no rows of 0 except for row V-1 (only output vertex has no out-edges) + 2) no cols of 0 except for col 0 (only input vertex has no in-edges) + + Args: + matrix: V x V upper-triangular adjacency matrix + + Returns: + True if the there are no dangling vertices. + """ + shape = np.shape(matrix) + + rows = matrix[:shape[0] - 1, :] == 0 + rows = np.all(rows, axis=1) # Any row with all 0 will be True + rows_bad = np.any(rows) + + cols = matrix[:, 1:] == 0 + cols = np.all(cols, axis=0) # Any col with all 0 will be True + cols_bad = np.any(cols) + + return (not rows_bad) and (not cols_bad) + + +def num_edges(matrix): + """Computes number of edges in adjacency matrix.""" + return np.sum(matrix) + + +def hash_module(matrix, labeling): + """Computes a graph-invariance MD5 hash of the matrix and label pair. + + Args: + matrix: np.ndarray square upper-triangular adjacency matrix. + labeling: list of int labels of length equal to both dimensions of + matrix. + + Returns: + MD5 hash of the matrix and labeling. + """ + vertices = np.shape(matrix)[0] + in_edges = np.sum(matrix, axis=0).tolist() + out_edges = np.sum(matrix, axis=1).tolist() + + assert len(in_edges) == len(out_edges) == len(labeling) + hashes = list(zip(out_edges, in_edges, labeling)) + hashes = [hashlib.md5(str(h).encode('utf-8')).hexdigest() for h in hashes] + # Computing this up to the diameter is probably sufficient but since the + # operation is fast, it is okay to repeat more times. + for _ in range(vertices): + new_hashes = [] + for v in range(vertices): + in_neighbors = [hashes[w] for w in range(vertices) if matrix[w, v]] + out_neighbors = [hashes[w] for w in range(vertices) if matrix[v, w]] + new_hashes.append(hashlib.md5( + (''.join(sorted(in_neighbors)) + '|' + + ''.join(sorted(out_neighbors)) + '|' + + hashes[v]).encode('utf-8')).hexdigest()) + hashes = new_hashes + fingerprint = hashlib.md5(str(sorted(hashes)).encode('utf-8')).hexdigest() + + return fingerprint + + +def permute_graph(graph, label, permutation): + """Permutes the graph and labels based on permutation. + + Args: + graph: np.ndarray adjacency matrix. + label: list of labels of same length as graph dimensions. + permutation: a permutation list of ints of same length as graph dimensions. + + Returns: + np.ndarray where vertex permutation[v] is vertex v from the original graph + """ + # vertex permutation[v] in new graph is vertex v in the old graph + forward_perm = zip(permutation, list(range(len(permutation)))) + inverse_perm = [x[1] for x in sorted(forward_perm)] + edge_fn = lambda x, y: graph[inverse_perm[x], inverse_perm[y]] == 1 + new_matrix = np.fromfunction(np.vectorize(edge_fn), + (len(label), len(label)), + dtype=np.int8) + new_label = [label[inverse_perm[i]] for i in range(len(label))] + return new_matrix, new_label + + +def is_isomorphic(graph1, graph2): + """Exhaustively checks if 2 graphs are isomorphic.""" + matrix1, label1 = np.array(graph1[0]), graph1[1] + matrix2, label2 = np.array(graph2[0]), graph2[1] + assert np.shape(matrix1) == np.shape(matrix2) + assert len(label1) == len(label2) + + vertices = np.shape(matrix1)[0] + # Note: input and output in our constrained graphs always map to themselves + # but this script does not enforce that. + for perm in itertools.permutations(range(0, vertices)): + pmatrix1, plabel1 = permute_graph(matrix1, label1, perm) + if np.array_equal(pmatrix1, matrix2) and plabel1 == label2: + return True + + return False diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py new file mode 100644 index 000000000..a0a09f053 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py @@ -0,0 +1,465 @@ + + + +"""This is a NAS-Bench-101 version which is tensorflow independent. + +Before using this API, download the data files from the links in the README. + +Usage: + # Load the data from file (this will take some time) + nasbench = api.NASBench('/path/to/pickle/or/shelve') + + # Create an Inception-like module (5x5 convolution replaced with two 3x3 + # convolutions). + model_spec = api.ModelSpec( + # Adjacency matrix of the module + matrix=[[0, 1, 1, 1, 0, 1, 0], # input layer + [0, 0, 0, 0, 0, 0, 1], # 1x1 conv + [0, 0, 0, 0, 0, 0, 1], # 3x3 conv + [0, 0, 0, 0, 1, 0, 0], # 5x5 conv (replaced by two 3x3's) + [0, 0, 0, 0, 0, 0, 1], # 5x5 conv (replaced by two 3x3's) + [0, 0, 0, 0, 0, 0, 1], # 3x3 max-pool + [0, 0, 0, 0, 0, 0, 0]], # output layer + # Operations at the vertices of the module, matches order of matrix + ops=[INPUT, CONV1X1, CONV3X3, CONV3X3, CONV3X3, MAXPOOL3X3, OUTPUT]) + + + # Query this model from dataset + data = nasbench.query(model_spec) + +Adjacency matrices are expected to be upper-triangular 0-1 matrices within the +defined search space (7 vertices, 9 edges, 3 allowed ops). The first and last +operations must be 'input' and 'output'. The other operations should be from +config['available_ops']. Currently, the available operations are: + CONV3X3 = "conv3x3-bn-relu" + CONV1X1 = "conv1x1-bn-relu" + MAXPOOL3X3 = "maxpool3x3" + +When querying a spec, the spec will first be automatically pruned (removing +unused vertices and edges along with ops). If the pruned spec is still out of +the search space, an OutOfDomainError will be raised, otherwise the data is +returned. + +The returned data object is a dictionary with the following keys: + - module_adjacency: numpy array for the adjacency matrix + - module_operations: list of operation labels + - trainable_parameters: number of trainable parameters in the model + - training_time: the total training time in seconds up to this point + - train_accuracy: training accuracy + - validation_accuracy: validation_accuracy + - test_accuracy: testing accuracy + +Instead of querying the dataset for a single run of a model, it is also possible +to retrieve all metrics for a given spec, using: + + fixed_stats, computed_stats = nasbench.get_metrics_from_spec(model_spec) + +The fixed_stats is a dictionary with the keys: + - module_adjacency + - module_operations + - trainable_parameters + +The computed_stats is a dictionary from epoch count to a list of metric +dicts. For example, computed_stats[108][0] contains the metrics for the first +repeat of the provided model trained to 108 epochs. The available keys are: + - halfway_training_time + - halfway_train_accuracy + - halfway_validation_accuracy + - halfway_test_accuracy + - final_training_time + - final_train_accuracy + - final_validation_accuracy + - final_test_accuracy +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import random +import time +import shelve +import hashlib +import _pickle as pickle +import numpy as np + + +class OutOfDomainError(Exception): + """Indicates that the requested graph is outside of the search domain.""" + + +class NASBench(object): + """User-facing API for accessing the NASBench dataset.""" + + def __init__(self, dataset_file, seed=None, data_format='pickle'): + """Initialize dataset, this should only be done once per experiment. + + Args: + dataset_file: path to .tfrecord file containing the dataset. + seed: random seed used for sampling queried models. Two NASBench objects + created with the same seed will return the same data points when queried + with the same models in the same order. By default, the seed is randomly + generated. + """ + self.config = { + 'module_vertices': 7, + 'max_edges': 9, + 'num_repeats': 3, + 'available_ops': ['conv3x3-bn-relu', 'conv1x1-bn-relu', 'maxpool3x3'], + } + random.seed(seed) + + print('Loading dataset from file... This may take a few minutes...') + start = time.time() + + # Stores the fixed statistics that are independent of evaluation (i.e., + # adjacency matrix, operations, and number of parameters). + # hash --> metric name --> scalar + self.fixed_statistics = {} + + # Stores the statistics that are computed via training and evaluating the + # model on CIFAR-10. Statistics are computed for multiple repeats of each + # model at each max epoch length. + # hash --> epochs --> repeat index --> metric name --> scalar + self.computed_statistics = {} + + # Valid queriable epoch lengths. {4, 12, 36, 108} for the full dataset or + # {108} for the smaller dataset with only the 108 epochs. + self.valid_epochs = set() + + # open the database + if data_format == 'shelve': + with shelve.open(dataset_file, 'r') as shelf: + for module_hash in shelf: + # Parse the data from the data file. + fixed_statistics, computed_statistics = shelf[module_hash] + + self.fixed_statistics[module_hash] = fixed_statistics + self.computed_statistics[module_hash] = computed_statistics + + self.valid_epochs.update(set(computed_statistics.keys())) + elif data_format == 'pickle': + with open(dataset_file, 'rb') as f: + data = pickle.load(f) + for module_hash, stats in data.items(): + self.fixed_statistics[module_hash] = stats[0] + self.computed_statistics[module_hash] = stats[1] + + self.valid_epochs.update(set(stats[1].keys())) + else: + raise Exception('Data format not supported') + + elapsed = time.time() - start + print('Loaded dataset in %d seconds' % elapsed) + + self.history = {} + self.training_time_spent = 0.0 + self.total_epochs_spent = 0 + + def query(self, model_spec, epochs=108, stop_halfway=False): + """Fetch one of the evaluations for this model spec. + + Each call will sample one of the config['num_repeats'] evaluations of the + model. This means that repeated queries of the same model (or isomorphic + models) may return identical metrics. + + This function will increment the budget counters for benchmarking purposes. + See self.training_time_spent, and self.total_epochs_spent. + + This function also allows querying the evaluation metrics at the halfway + point of training using stop_halfway. Using this option will increment the + budget counters only up to the halfway point. + + Args: + model_spec: ModelSpec object. + epochs: number of epochs trained. Must be one of the evaluated number of + epochs, [4, 12, 36, 108] for the full dataset. + stop_halfway: if True, returned dict will only contain the training time + and accuracies at the halfway point of training (num_epochs/2). + Otherwise, returns the time and accuracies at the end of training + (num_epochs). + + Returns: + dict containing the evaluated data for this object. + + Raises: + OutOfDomainError: if model_spec or num_epochs is outside the search space. + """ + if epochs not in self.valid_epochs: + raise OutOfDomainError('invalid number of epochs, must be one of %s' + % self.valid_epochs) + + fixed_stat, computed_stat = self.get_metrics_from_spec(model_spec) + sampled_index = random.randint(0, self.config['num_repeats'] - 1) + computed_stat = computed_stat[epochs][sampled_index] + + data = {} + data['module_adjacency'] = fixed_stat['module_adjacency'] + data['module_operations'] = fixed_stat['module_operations'] + data['trainable_parameters'] = fixed_stat['trainable_parameters'] + + if stop_halfway: + data['training_time'] = computed_stat['halfway_training_time'] + data['train_accuracy'] = computed_stat['halfway_train_accuracy'] + data['validation_accuracy'] = computed_stat['halfway_validation_accuracy'] + data['test_accuracy'] = computed_stat['halfway_test_accuracy'] + else: + data['training_time'] = computed_stat['final_training_time'] + data['train_accuracy'] = computed_stat['final_train_accuracy'] + data['validation_accuracy'] = computed_stat['final_validation_accuracy'] + data['test_accuracy'] = computed_stat['final_test_accuracy'] + + self.training_time_spent += data['training_time'] + if stop_halfway: + self.total_epochs_spent += epochs // 2 + else: + self.total_epochs_spent += epochs + + return data + + def is_valid(self, model_spec): + """Checks the validity of the model_spec. + + For the purposes of benchmarking, this does not increment the budget + counters. + + Args: + model_spec: ModelSpec object. + + Returns: + True if model is within space. + """ + try: + self._check_spec(model_spec) + except OutOfDomainError: + return False + + return True + + def get_budget_counters(self): + """Returns the time and budget counters.""" + return self.training_time_spent, self.total_epochs_spent + + def reset_budget_counters(self): + """Reset the time and epoch budget counters.""" + self.training_time_spent = 0.0 + self.total_epochs_spent = 0 + + def hash_iterator(self): + """Returns iterator over all unique model hashes.""" + return self.fixed_statistics.keys() + + def get_metrics_from_hash(self, module_hash): + """Returns the metrics for all epochs and all repeats of a hash. + + This method is for dataset analysis and should not be used for benchmarking. + As such, it does not increment any of the budget counters. + + Args: + module_hash: MD5 hash, i.e., the values yielded by hash_iterator(). + + Returns: + fixed stats and computed stats of the model spec provided. + """ + fixed_stat = copy.deepcopy(self.fixed_statistics[module_hash]) + computed_stat = copy.deepcopy(self.computed_statistics[module_hash]) + return fixed_stat, computed_stat + + def get_metrics_from_spec(self, model_spec): + """Returns the metrics for all epochs and all repeats of a model. + + This method is for dataset analysis and should not be used for benchmarking. + As such, it does not increment any of the budget counters. + + Args: + model_spec: ModelSpec object. + + Returns: + fixed stats and computed stats of the model spec provided. + """ + self._check_spec(model_spec) + module_hash = self._hash_spec(model_spec) + return self.get_metrics_from_hash(module_hash) + + def _check_spec(self, model_spec): + """Checks that the model spec is within the dataset.""" + if not model_spec.valid_spec: + raise OutOfDomainError('invalid spec, provided graph is disconnected.') + + num_vertices = len(model_spec.ops) + num_edges = np.sum(model_spec.matrix) + + if num_vertices > self.config['module_vertices']: + raise OutOfDomainError('too many vertices, got %d (max vertices = %d)' + % (num_vertices, config['module_vertices'])) + + if num_edges > self.config['max_edges']: + raise OutOfDomainError('too many edges, got %d (max edges = %d)' + % (num_edges, self.config['max_edges'])) + + if model_spec.ops[0] != 'input': + raise OutOfDomainError('first operation should be \'input\'') + if model_spec.ops[-1] != 'output': + raise OutOfDomainError('last operation should be \'output\'') + for op in model_spec.ops[1:-1]: + if op not in self.config['available_ops']: + raise OutOfDomainError('unsupported op %s (available ops = %s)' + % (op, self.config['available_ops'])) + + def _hash_spec(self, model_spec): + """Returns the MD5 hash for a provided model_spec.""" + return model_spec.hash_spec(self.config['available_ops']) + + +class ModelSpec(object): + """Model specification given adjacency matrix and labeling.""" + + def __init__(self, matrix, ops, data_format='channels_last'): + """Initialize the module spec. + + Args: + matrix: ndarray or nested list with shape [V, V] for the adjacency matrix. + ops: V-length list of labels for the base ops used. The first and last + elements are ignored because they are the input and output vertices + which have no operations. The elements are retained to keep consistent + indexing. + data_format: channels_last or channels_first. + + Raises: + ValueError: invalid matrix or ops + """ + if not isinstance(matrix, np.ndarray): + matrix = np.array(matrix) + shape = np.shape(matrix) + if len(shape) != 2 or shape[0] != shape[1]: + raise ValueError('matrix must be square') + if shape[0] != len(ops): + raise ValueError('length of ops must match matrix dimensions') + if not is_upper_triangular(matrix): + raise ValueError('matrix must be upper triangular') + + # Both the original and pruned matrices are deep copies of the matrix and + # ops so any changes to those after initialization are not recognized by the + # spec. + self.original_matrix = copy.deepcopy(matrix) + self.original_ops = copy.deepcopy(ops) + + self.matrix = copy.deepcopy(matrix) + self.ops = copy.deepcopy(ops) + self.valid_spec = True + self._prune() + + self.data_format = data_format + + def _prune(self): + """Prune the extraneous parts of the graph. + + General procedure: + 1) Remove parts of graph not connected to input. + 2) Remove parts of graph not connected to output. + 3) Reorder the vertices so that they are consecutive after steps 1 and 2. + + These 3 steps can be combined by deleting the rows and columns of the + vertices that are not reachable from both the input and output (in reverse). + """ + num_vertices = np.shape(self.original_matrix)[0] + + # DFS forward from input + visited_from_input = set([0]) + frontier = [0] + while frontier: + top = frontier.pop() + for v in range(top + 1, num_vertices): + if self.original_matrix[top, v] and v not in visited_from_input: + visited_from_input.add(v) + frontier.append(v) + + # DFS backward from output + visited_from_output = set([num_vertices - 1]) + frontier = [num_vertices - 1] + while frontier: + top = frontier.pop() + for v in range(0, top): + if self.original_matrix[v, top] and v not in visited_from_output: + visited_from_output.add(v) + frontier.append(v) + + # Any vertex that isn't connected to both input and output is extraneous to + # the computation graph. + extraneous = set(range(num_vertices)).difference( + visited_from_input.intersection(visited_from_output)) + + # If the non-extraneous graph is less than 2 vertices, the input is not + # connected to the output and the spec is invalid. + if len(extraneous) > num_vertices - 2: + self.matrix = None + self.ops = None + self.valid_spec = False + return + + self.matrix = np.delete(self.matrix, list(extraneous), axis=0) + self.matrix = np.delete(self.matrix, list(extraneous), axis=1) + for index in sorted(extraneous, reverse=True): + del self.ops[index] + + def hash_spec(self, canonical_ops): + """Computes the isomorphism-invariant graph hash of this spec. + + Args: + canonical_ops: list of operations in the canonical ordering which they + were assigned (i.e. the order provided in the config['available_ops']). + + Returns: + MD5 hash of this spec which can be used to query the dataset. + """ + # Invert the operations back to integer label indices used in graph gen. + labeling = [-1] + [canonical_ops.index(op) for op in self.ops[1:-1]] + [-2] + return hash_module(self.matrix, labeling) + + +def is_upper_triangular(matrix): + """True if matrix is 0 on diagonal and below.""" + for src in range(np.shape(matrix)[0]): + for dst in range(0, src + 1): + if matrix[src, dst] != 0: + return False + + return True + + +def hash_module(matrix, labeling): + """Computes a graph-invariance MD5 hash of the matrix and label pair. + + Args: + matrix: np.ndarray square upper-triangular adjacency matrix. + labeling: list of int labels of length equal to both dimensions of + matrix. + + Returns: + MD5 hash of the matrix and labeling. + """ + vertices = np.shape(matrix)[0] + in_edges = np.sum(matrix, axis=0).tolist() + out_edges = np.sum(matrix, axis=1).tolist() + + assert len(in_edges) == len(out_edges) == len(labeling) + hashes = list(zip(out_edges, in_edges, labeling)) + hashes = [hashlib.md5(str(h).encode('utf-8')).hexdigest() for h in hashes] + # Computing this up to the diameter is probably sufficient but since the + # operation is fast, it is okay to repeat more times. + for _ in range(vertices): + new_hashes = [] + for v in range(vertices): + in_neighbors = [hashes[w] for w in range(vertices) if matrix[w, v]] + out_neighbors = [hashes[w] for w in range(vertices) if matrix[v, w]] + new_hashes.append(hashlib.md5( + (''.join(sorted(in_neighbors)) + '|' + + ''.join(sorted(out_neighbors)) + '|' + + hashes[v]).encode('utf-8')).hexdigest()) + hashes = new_hashes + fingerprint = hashlib.md5(str(sorted(hashes)).encode('utf-8')).hexdigest() + + return fingerprint + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py new file mode 100644 index 000000000..15d694009 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py @@ -0,0 +1,42 @@ +##################################################### +# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019.08 # +##################################################### +from .api_utils import ArchResults, ResultsCount +from .api_201 import NASBench201API + +# NAS_BENCH_201_API_VERSION="v1.1" # [2020.02.25] +# NAS_BENCH_201_API_VERSION="v1.2" # [2020.03.09] +# NAS_BENCH_201_API_VERSION="v1.3" # [2020.03.16] +NAS_BENCH_201_API_VERSION="v2.0" # [2020.06.30] + + +def test_api(path): + """This is used to test the API of NAS-Bench-201.""" + api = NASBench201API(path) + num = len(api) + for i, arch_str in enumerate(api): + print ('{:5d}/{:5d} : {:}'.format(i, len(api), arch_str)) + indexes = [1, 2, 11, 301] + for index in indexes: + print('\n--- index={:} ---'.format(index)) + api.show(index) + # show the mean loss and accuracy of an architecture + info = api.query_meta_info_by_index(index) # This is an instance of `ArchResults` + res_metrics = info.get_metrics('cifar10', 'train') # This is a dict with metric names as keys + cost_metrics = info.get_compute_costs('cifar100') # This is a dict with metric names as keys, e.g., flops, params, latency + + # get the detailed information + results = api.query_by_index(index, 'cifar100') # a dict of all trials for 1st net on cifar100, where the key is the seed + print ('There are {:} trials for this architecture [{:}] on cifar100'.format(len(results), api[1])) + for seed, result in results.items(): + print ('Latency : {:}'.format(result.get_latency())) + print ('Train Info : {:}'.format(result.get_train())) + print ('Valid Info : {:}'.format(result.get_eval('x-valid'))) + print ('Test Info : {:}'.format(result.get_eval('x-test'))) + # for the metric after a specific epoch + print ('Train Info [10-th epoch] : {:}'.format(result.get_train(10))) + config = api.get_net_config(index, 'cifar10') + print ('config={:}'.format(config)) + index = api.query_index_by_arch('|nor_conv_3x3~0|+|nor_conv_3x3~0|avg_pool_3x3~1|+|skip_connect~0|nor_conv_3x3~1|skip_connect~2|') + api.show(index) + print('TEST NAS-BENCH-201 DONE.') diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2.py new file mode 100644 index 000000000..e845b6442 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2.py @@ -0,0 +1,117 @@ +# Copyright 2021 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +from .nasbench2_ops import * + + +def gen_searchcell_mask_from_arch_str(arch_str): + nodes = arch_str.split('+') + nodes = [node[1:-1].split('|') for node in nodes] + nodes = [[op_and_input.split('~') for op_and_input in node] for node in nodes] + + keep_mask = [] + for curr_node_idx in range(len(nodes)): + for prev_node_idx in range(curr_node_idx+1): + _op = [edge[0] for edge in nodes[curr_node_idx] if int(edge[1]) == prev_node_idx] + assert len(_op) == 1, 'The arch string does not follow the assumption of 1 connection between two nodes.' + for _op_name in OPS.keys(): + keep_mask.append(_op[0] == _op_name) + return keep_mask + + +def get_model_from_arch_str(arch_str, num_classes, bn=True, init_channels=16): + keep_mask = gen_searchcell_mask_from_arch_str(arch_str) + net = NAS201Model(arch_str=arch_str, num_classes=num_classes, use_bn=bn, keep_mask=keep_mask, stem_ch=init_channels) + return net + + +def get_super_model(num_classes, use_bn=True): + net = NAS201Model(arch_str=arch_str, num_classes=num_classes, use_bn=use_bn) + return net + + +class NAS201Model(nn.Module): + + def __init__(self, arch_str, num_classes, use_bn=True, keep_mask=None, stem_ch=16): + super(NAS201Model, self).__init__() + self.arch_str=arch_str + self.num_classes=num_classes + self.use_bn= use_bn + self.stem_ch = stem_ch + + self.stem = stem(out_channels=stem_ch, use_bn=use_bn) + self.stack_cell1 = nn.Sequential(*[SearchCell(in_channels=stem_ch, out_channels=stem_ch, stride=1, affine=False, track_running_stats=False, use_bn=use_bn, keep_mask=keep_mask) for i in range(5)]) + self.reduction1 = reduction(in_channels=stem_ch, out_channels=stem_ch*2) + self.stack_cell2 = nn.Sequential(*[SearchCell(in_channels=stem_ch*2, out_channels=stem_ch*2, stride=1, affine=False, track_running_stats=False, use_bn=use_bn, keep_mask=keep_mask) for i in range(5)]) + self.reduction2 = reduction(in_channels=stem_ch*2, out_channels=stem_ch*4) + self.stack_cell3 = nn.Sequential(*[SearchCell(in_channels=stem_ch*4, out_channels=stem_ch*4, stride=1, affine=False, track_running_stats=False, use_bn=use_bn, keep_mask=keep_mask) for i in range(5)]) + self.top = top(in_dims=stem_ch*4, num_classes=num_classes, use_bn=use_bn) + + def forward(self, x): + x = self.stem(x) + + x = self.stack_cell1(x) + x = self.reduction1(x) + + x = self.stack_cell2(x) + x = self.reduction2(x) + + x = self.stack_cell3(x) + + x = self.top(x) + return x + + def get_prunable_copy(self, bn=False): + model_new = get_model_from_arch_str(self.arch_str, self.num_classes, use_bn=bn, init_channels=self.stem_ch) + + #TODO this is quite brittle and doesn't work with nn.Sequential when bn is different + # it is only required to maintain initialization -- maybe init after get_punable_copy? + model_new.load_state_dict(self.state_dict(), strict=False) + model_new.train() + + return model_new + + +def get_arch_str_from_model(net): + search_cell = net.stack_cell1[0].options + keep_mask = net.stack_cell1[0].keep_mask + num_nodes = net.stack_cell1[0].num_nodes + + nodes = [] + idx = 0 + for curr_node in range(num_nodes -1): + edges = [] + for prev_node in range(curr_node+1): # n-1 prev nodes + for _op_name in OPS.keys(): + if keep_mask[idx]: + edges.append(f'{_op_name}~{prev_node}') + idx += 1 + node_str = '|'.join(edges) + node_str = f'|{node_str}|' + nodes.append(node_str) + arch_str = '+'.join(nodes) + return arch_str + + +if __name__ == "__main__": + arch_str = '|nor_conv_3x3~0|+|none~0|none~1|+|avg_pool_3x3~0|nor_conv_3x3~1|nor_conv_3x3~2|' + + n = get_model_from_arch_str(arch_str=arch_str, num_classes=10) + print(n.stack_cell1[0]) + + arch_str2 = get_arch_str_from_model(n) + print(arch_str) + print(arch_str2) + print(f'Are the two arch strings same? {arch_str == arch_str2}') diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2_ops.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2_ops.py new file mode 100644 index 000000000..efcdba322 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/nasbench2_ops.py @@ -0,0 +1,160 @@ +# Copyright 2021 Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +import torch.nn as nn + +class ReLUConvBN(nn.Module): + + def __init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation, affine, track_running_stats=True, use_bn=True, name='ReLUConvBN'): + super(ReLUConvBN, self).__init__() + self.name = name + if use_bn: + self.op = nn.Sequential( + nn.ReLU(inplace=False), + nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, bias=not affine), + nn.BatchNorm2d(out_channels, affine=affine, track_running_stats=track_running_stats) + ) + else: + self.op = nn.Sequential( + nn.ReLU(inplace=False), + nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, bias=not affine) + ) + + def forward(self, x): + return self.op(x) + +class Identity(nn.Module): + def __init__(self, name='Identity'): + self.name = name + super(Identity, self).__init__() + + def forward(self, x): + return x + +class Zero(nn.Module): + + def __init__(self, stride, name='Zero'): + self.name = name + super(Zero, self).__init__() + self.stride = stride + + def forward(self, x): + if self.stride == 1: + return x.mul(0.) + return x[:,:,::self.stride,::self.stride].mul(0.) + +class POOLING(nn.Module): + def __init__(self, kernel_size, stride, padding, name='POOLING'): + super(POOLING, self).__init__() + self.name = name + self.avgpool = nn.AvgPool2d(kernel_size=kernel_size, stride=1, padding=1, count_include_pad=False) + + def forward(self, x): + return self.avgpool(x) + + +class reduction(nn.Module): + def __init__(self, in_channels, out_channels): + super(reduction, self).__init__() + self.residual = nn.Sequential( + nn.AvgPool2d(kernel_size=2, stride=2, padding=0), + nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0, bias=False)) + + self.conv_a = ReLUConvBN(in_channels=in_channels, out_channels=out_channels, kernel_size=3, stride=2, padding=1, dilation=1, affine=True, track_running_stats=True) + self.conv_b = ReLUConvBN(in_channels=out_channels, out_channels=out_channels, kernel_size=3, stride=1, padding=1, dilation=1, affine=True, track_running_stats=True) + + def forward(self, x): + basicblock = self.conv_a(x) + basicblock = self.conv_b(basicblock) + residual = self.residual(x) + return residual + basicblock + +class stem(nn.Module): + def __init__(self, out_channels, use_bn=True): + super(stem, self).__init__() + if use_bn: + self.net = nn.Sequential( + nn.Conv2d(in_channels=3, out_channels=out_channels, kernel_size=3, padding=1, bias=False), + nn.BatchNorm2d(out_channels)) + else: + self.net = nn.Sequential( + nn.Conv2d(in_channels=3, out_channels=out_channels, kernel_size=3, padding=1, bias=False) + ) + + def forward(self, x): + return self.net(x) + +class top(nn.Module): + def __init__(self, in_dims, num_classes, use_bn=True): + super(top, self).__init__() + if use_bn: + self.lastact = nn.Sequential(nn.BatchNorm2d(in_dims), nn.ReLU(inplace=True)) + else: + self.lastact = nn.ReLU(inplace=True) + self.global_pooling = nn.AdaptiveAvgPool2d(1) + self.classifier = nn.Linear(in_dims, num_classes) + + def forward(self, x): + x = self.lastact(x) + x = self.global_pooling(x) + x = x.view(x.size(0), -1) + logits = self.classifier(x) + return logits + + +class SearchCell(nn.Module): + + def __init__(self, in_channels, out_channels, stride, affine, track_running_stats, use_bn=True, num_nodes=4, keep_mask=None): + super(SearchCell, self).__init__() + self.num_nodes = num_nodes + self.options = nn.ModuleList() + for curr_node in range(self.num_nodes-1): + for prev_node in range(curr_node+1): + for _op_name in OPS.keys(): + op = OPS[_op_name](in_channels, out_channels, stride, affine, track_running_stats, use_bn) + self.options.append(op) + + if keep_mask is not None: + self.keep_mask = keep_mask + else: + self.keep_mask = [True]*len(self.options) + + def forward(self, x): + outs = [x] + + idx = 0 + for curr_node in range(self.num_nodes-1): + edges_in = [] + for prev_node in range(curr_node+1): # n-1 prev nodes + for op_idx in range(len(OPS.keys())): + if self.keep_mask[idx]: + edges_in.append(self.options[idx](outs[prev_node])) + idx += 1 + node_output = sum(edges_in) + outs.append(node_output) + + return outs[-1] + + + +OPS = { + 'none' : lambda in_channels, out_channels, stride, affine, track_running_stats, use_bn: Zero(stride, name='none'), + 'avg_pool_3x3' : lambda in_channels, out_channels, stride, affine, track_running_stats, use_bn: POOLING(3, 1, 1, name='avg_pool_3x3'), + 'nor_conv_3x3' : lambda in_channels, out_channels, stride, affine, track_running_stats, use_bn: ReLUConvBN(in_channels, out_channels, 3, 1, 1, 1, affine, track_running_stats, use_bn, name='nor_conv_3x3'), + 'nor_conv_1x1' : lambda in_channels, out_channels, stride, affine, track_running_stats, use_bn: ReLUConvBN(in_channels, out_channels, 1, 1, 0, 1, affine, track_running_stats, use_bn, name='nor_conv_1x1'), + 'skip_connect' : lambda in_channels, out_channels, stride, affine, track_running_stats, use_bn: Identity(name='skip_connect'), +} + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py new file mode 100644 index 000000000..139597f9c --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py @@ -0,0 +1,2 @@ + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py new file mode 100644 index 000000000..98169c985 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py @@ -0,0 +1,121 @@ + + +# for binary insert +from typing import List +import numpy as np + + +def binary_insert_get_rank(rank_list: list, new_item: List) -> int: + """ + Insert the new_item to rank_list, then get the rank of it. + :param rank_list: 0: id, 1: score + :param new_item: + :return: + """ + index = search_position(rank_list, new_item) + # search the position to insert into + rank_list.insert(index, new_item) + return index + + +# O(logN) search the position to insert into +def search_position(rank_list_m: list, new_item: List): + if len(rank_list_m) == 0: + return 0 + left = 0 + right = len(rank_list_m) - 1 + while left + 1 < right: + mid = int((left + right) / 2) + if rank_list_m[mid][1] <= new_item[1]: + left = mid + else: + right = mid + + # consider the time. + if rank_list_m[right][1] <= new_item[1]: + return right + 1 + elif rank_list_m[left][1] <= new_item[1]: + return left + 1 + else: + return left + + +def generate_global_rank(ml_data_score_dic: dict, alg_name_list: List) -> dict: + """ + ml_data_score_dic: { model_id: {alg: score1, alg2: score2} } + return: { model_id: {alg1_alg2: rank_score} } + """ + + history = {} + for alg in alg_name_list: + history[alg] = [] + + for arch_id, arch_score in ml_data_score_dic.items(): + # add model and score to local list + for alg, score in arch_score.items(): + if alg in alg_name_list: + binary_insert_get_rank(history[alg], [str(arch_id), float(score)]) + + # convert multiple scores into rank value + model_new_rank_score = {} + current_explored_models = 0 + for alg in alg_name_list: + current_explored_models = len(history[alg]) + for rank_index in range(len(history[alg])): + ms_ins = history[alg][rank_index] + # rank = index + 1, since index can be 0 + if ms_ins[0] in model_new_rank_score: + model_new_rank_score[ms_ins[0]] += rank_index + 1 + else: + model_new_rank_score[ms_ins[0]] = rank_index + 1 + + for ele in model_new_rank_score.keys(): + model_new_rank_score[ele] = \ + {"_".join(list(alg_name_list)): model_new_rank_score[ele] / current_explored_models} + + return model_new_rank_score + + +def log_scale_x_array(num_points, max_minute, base=10) -> list: + """ + return a list of mins in log scale distance. + """ + # Set the minimum and maximum values for the log scale + min_val = 1 # 1 second + max_val = max_minute * 60 # 1440 minutes converted to seconds + + # Generate the log scale values + log_vals = np.logspace(np.log10(min_val), np.log10(max_val), num=num_points, base=base) + + # Convert the log scale values to minutes + log_vals_min = log_vals / 60 + + # Print the log scale values in minutes + + return log_vals_min.tolist() + + +def sample_in_log_scale(lst: List, num_points: int) -> List: + indices = np.logspace(0, np.log10(len(lst) - 1), num_points + num_points // 2, dtype=int) + # Remove any duplicate indices + indices = np.unique(indices) + return list(indices) + + +def sample_in_log_scale_new(lstM: List, num_points: int) -> List: + lst = np.array(lstM) + # Create an evenly spaced array in the log scale domain + evenly_spaced_log_x = np.linspace(np.log10(lst.min()), np.log10(lst.max()), num_points) + # Convert the new array back to the original scale + evenly_spaced_x = 10 ** evenly_spaced_log_x + # Find the indices of the sampled points in the original x-array + indices = [np.abs(lst - point).argmin() for point in evenly_spaced_x] + return indices + + +def sample_in_line_scale(lst: List, num_points: int) -> List: + indices = np.linspace(0, len(lst) - 1, num_points, dtype=int) + # Remove any duplicate indices + indices = np.unique(indices) + return list(indices) + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py new file mode 100644 index 000000000..038a59387 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py @@ -0,0 +1,115 @@ +from scipy import stats +from src.common.constant import CommonVars +import numpy as np +from src.logger import logger +from sklearn import metrics + + +class CorCoefficient: + + @staticmethod + def measure(x1: list, x2: list, measure_metrics: str = CommonVars.AllCorrelation) -> dict: + """ + Measure the correlation coefficient between x1 and x2 + It requires that each dataset be normally distributed. + :param x1: list1 + :param x2: list2 + :param measure_metrics: str + :return: correlation, + Like other correlation coefficients, this one varies between -1 and +1 with 0 implying no correlation. + Correlations of -1 or +1 imply an exact linear relationship + """ + + result = {} + if measure_metrics == CommonVars.KendallTau: + correlation, p_value = stats.kendalltau(x1, x2, nan_policy='omit') + result[CommonVars.KendallTau] = correlation + elif measure_metrics == CommonVars.Spearman: + correlation, p_value = stats.spearmanr(x1, x2, nan_policy='omit') + result[CommonVars.Spearman] = correlation + elif measure_metrics == CommonVars.Pearson: + correlation, p_value = stats.pearsonr(x1, x2) + result[CommonVars.Pearson] = correlation + elif measure_metrics == CommonVars.AvgCorrelation: + # calculate average over all + correlation1, p_value = stats.kendalltau(x1, x2, nan_policy='omit') + correlation2, p_value = stats.spearmanr(x1, x2, nan_policy='omit') + correlation3, p_value = stats.pearsonr(x1, x2) + correlation = (correlation1 + correlation2 + correlation3) / 3 + result[CommonVars.AvgCorrelation] = correlation + elif measure_metrics == CommonVars.AllCorrelation: + correlation1, p_value = stats.kendalltau(x1, x2, nan_policy='omit') + correlation2, p_value = stats.spearmanr(x1, x2, nan_policy='omit') + correlation3, p_value = stats.pearsonr(x1, x2) + correlation4 = (correlation1 + correlation2 + correlation3) / 3 + result[CommonVars.KendallTau] = correlation1 + result[CommonVars.Spearman] = correlation2 + result[CommonVars.Pearson] = correlation3 + result[CommonVars.AvgCorrelation] = correlation4 + else: + raise NotImplementedError(measure_metrics + " is not implemented") + + return result + + @staticmethod + def compare(ytest, test_pred): + ytest = np.array(ytest) + test_pred = np.array(test_pred) + METRICS = [ + "mae", + "rmse", + "pearson", + "spearman", + "kendalltau", + "kt_2dec", + "kt_1dec", + "precision_10", + "precision_20", + "full_ytest", + "full_testpred", + ] + metrics_dict = {} + + try: + metrics_dict["mae"] = np.mean(abs(test_pred - ytest)) + metrics_dict["rmse"] = metrics.mean_squared_error( + ytest, test_pred, squared=False + ) + metrics_dict["pearson"] = np.abs(np.corrcoef(ytest, test_pred)[1, 0]) + metrics_dict["spearman"] = stats.spearmanr(ytest, test_pred)[0] + metrics_dict["kendalltau"] = stats.kendalltau(ytest, test_pred)[0] + metrics_dict["kt_2dec"] = stats.kendalltau( + ytest, np.round(test_pred, decimals=2) + )[0] + metrics_dict["kt_1dec"] = stats.kendalltau( + ytest, np.round(test_pred, decimals=1) + )[0] + print("ytest = ", ytest) + print("test_pred = ", test_pred) + for k in [10, 20]: + top_ytest = np.array( + [y > sorted(ytest)[max(-len(ytest), -k - 1)] for y in ytest] + ) + top_test_pred = np.array( + [ + y > sorted(test_pred)[max(-len(test_pred), -k - 1)] + for y in test_pred + ] + ) + metrics_dict["precision_{}".format(k)] = ( + sum(top_ytest & top_test_pred) / k + ) + metrics_dict["full_ytest"] = ytest.tolist() + metrics_dict["full_testpred"] = test_pred.tolist() + + except: + for metric in METRICS: + metrics_dict[metric] = float("nan") + if np.isnan(metrics_dict["pearson"]) or not np.isfinite( + metrics_dict["pearson"] + ): + logger.info("Error when computing metrics. ytest and test_pred are:") + logger.info(ytest) + logger.info(test_pred) + + return metrics_dict diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py new file mode 100644 index 000000000..09cb8d9e6 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py @@ -0,0 +1,42 @@ +import json +import pickle +import os.path + + +def read_json(file_name): + print(f"Loading {file_name}...") + is_exist = os.path.exists(file_name) + if is_exist: + with open(file_name, 'r') as readfile: + data = json.load(readfile) + return data + else: + print(f"{file_name} is not exist") + return {} + + +def write_json(file_name, data): + print(f"writting {file_name}...") + with open(file_name, 'w') as outfile: + outfile.write(json.dumps(data)) + + +def read_pickle(file_name): + print(f"Loading pickel {file_name}...") + with open(file_name, 'rb') as f: + data = pickle.load(f) + return data + + +def write_pickle(file_name, data): + print(f"writing pickle {file_name}...") + with open('filename.pickle', 'wb') as handle: + pickle.dump(data, handle, protocol=pickle.HIGHEST_PROTOCOL) + + +if __name__ == "__main__": + a = {1:1} + write_json("./asdf.json", a) + b = {2:2323} + write_json("./asdf.json", b) + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py new file mode 100644 index 000000000..ffec80cd4 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py @@ -0,0 +1,84 @@ +import os +import psutil +import gpustat +import threading +import time +from src.tools.io_tools import write_json +import sys + +def print_cpu_gpu_usage(interval=1, output_file="path_to_folder", stop_event=None): + def print_usage(): + print("Starting to print usage") # Debugging print + # Get current process + main_process = psutil.Process(os.getpid()) + + # Create an empty dictionary to store metrics + metrics = {'cpu_usage': [], 'memory_usage': [], 'gpu_usage': []} + + while not stop_event.is_set(): + cpu_percent = 0 + mem_usage_mb = 0 + main_process.cpu_percent() + for process in main_process.children(recursive=True): # Include all child processes + try: + cpu_percent += process.cpu_percent() + mem_usage_mb += process.memory_info().rss / (1024 ** 2) + except psutil.NoSuchProcess: + # Process does not exist, so add 0 to cpu_percent and mem_usage_mb + pass + cpu_percent += main_process.cpu_percent() + mem_usage_mb += main_process.memory_info().rss / (1024 ** 2) + + metrics['cpu_usage'].append(cpu_percent) + metrics['memory_usage'].append(mem_usage_mb) + + try: + gpu_stats = gpustat.GPUStatCollection.new_query() + for gpu in gpu_stats: + metrics['gpu_usage'].append((gpu.index, gpu.utilization, gpu.memory_used)) + except Exception as e: + pass + # print(f"Exception encountered when fetching GPU stats: {e}") + + # If it's time to write metrics to a file, do so + if len(metrics['cpu_usage']) % 40 == 0: + write_json(output_file, metrics) + + time.sleep(interval) + + print("Stop monitering, flust to disk") + write_json(output_file, metrics) + + stop_event = stop_event or threading.Event() + thread = threading.Thread(target=print_usage) + thread.start() + return stop_event, thread + +def get_variable_memory_size(obj): + # If it's a PyTorch tensor and on the GPU + import torch + if torch.is_tensor(obj) and obj.is_cuda: + return obj.element_size() * obj.nelement() + else: + return sys.getsizeof(obj) + +def print_memory_usage(): + # Get current process + main_process = psutil.Process(os.getpid()) + # Create an empty dictionary to store metrics + metrics = {'cpu_usage': [], 'memory_usage': []} + cpu_percent = 0 + mem_usage_mb = 0 + main_process.cpu_percent() + for process in main_process.children(recursive=True): # Include all child processes + try: + cpu_percent += process.cpu_percent() + mem_usage_mb += process.memory_info().rss / (1024 ** 2) + except psutil.NoSuchProcess: + # Process does not exist, so add 0 to cpu_percent and mem_usage_mb + pass + cpu_percent += main_process.cpu_percent() + mem_usage_mb += main_process.memory_info().rss / (1024 ** 2) + metrics['cpu_usage'].append(cpu_percent) + metrics['memory_usage'].append(mem_usage_mb) + print(metrics) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py new file mode 100644 index 000000000..70acf26a7 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py @@ -0,0 +1,454 @@ +import math +import os +import random +import sys +import time +import warnings + +import numpy +import numpy as np +import shutil +import logging + +warnings.filterwarnings("error") + + +def timeSince(since=None, s=None): + if s is None: + s = int(time.time() - since) + m = math.floor(s / 60) + s %= 60 + h = math.floor(m / 60) + m %= 60 + return '%dh %dm %ds' % (h, m, s) + + +class AvgrageMeter(object): + """Computes and stores the average and current value""" + + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + +import torch +def get_correct_num(y, target): + pred_label = torch.argmax(y, dim=1) + return (target == pred_label).sum().item() + + +def accuracy(output, target, topk=(1,)): + 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) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +class Cutout(object): + def __init__(self, length): + self.length = length + + def __call__(self, img): + h, w = img.size(1), img.size(2) + mask = np.ones((h, w), np.float32) + y = np.random.randint(h) + x = np.random.randint(w) + + y1 = np.clip(y - self.length // 2, 0, h) + y2 = np.clip(y + self.length // 2, 0, h) + x1 = np.clip(x - self.length // 2, 0, w) + x2 = np.clip(x + self.length // 2, 0, w) + + mask[y1:y2, x1:x2] = 0. + mask = torch.from_numpy(mask) + mask = mask.expand_as(img) + img *= mask + return img + +import torchvision.transforms as transforms +def _data_transforms_cifar10(args): + CIFAR_MEAN = [0.49139968, 0.48215827, 0.44653124] + CIFAR_STD = [0.24703233, 0.24348505, 0.26158768] + + train_transform = transforms.Compose([ + transforms.RandomCrop(32, padding=4), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize(CIFAR_MEAN, CIFAR_STD), + ]) + if args.cutout: + train_transform.transforms.append(Cutout(args.cutout_length)) + + valid_transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize(CIFAR_MEAN, CIFAR_STD), + ]) + return train_transform, valid_transform + +import torchvision.datasets as dset +def _get_cifar10(args): + train_transform, valid_transform = _data_transforms_cifar10(args) + train_data = dset.CIFAR10( + root=args.data, train=True, download=True, transform=train_transform + ) + valid_data = dset.CIFAR10( + root=args.data, train=False, download=True, transform=valid_transform + ) + + train_queue = torch.utils.data.DataLoader( + train_data, + batch_size=args.batch_size, + shuffle=True, + pin_memory=True, + num_workers=4, + ) + + valid_queue = torch.utils.data.DataLoader( + valid_data, + batch_size=args.batch_size, + shuffle=False, + pin_memory=True, + num_workers=4, + ) + return train_queue, valid_queue + + +def _get_dist_cifar10(args): + train_transform, valid_transform = _data_transforms_cifar10(args) + train_data = dset.CIFAR10( + root=args.data, train=True, download=True, transform=train_transform + ) + valid_data = dset.CIFAR10( + root=args.data, train=False, download=True, transform=valid_transform + ) + + sampler = torch.utils.data.distributed.DistributedSampler( + train_data, num_replicas=args.gpu_num, rank=args.local_rank) + + train_queue = torch.utils.data.DataLoader( + train_data, + batch_size=args.batch_size // args.gpu_num, + pin_memory=True, + num_workers=4, + drop_last=True, + sampler=sampler + ) + + valid_queue = torch.utils.data.DataLoader( + valid_data, + batch_size=args.batch_size, + shuffle=False, + pin_memory=True, + num_workers=4, + ) + return train_queue, valid_queue, sampler + + +def _get_dist_imagenet(args): + traindir = os.path.join(args.data_dir, 'train') + valdir = os.path.join(args.data_dir, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = dset.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ColorJitter( + brightness=0.4, + contrast=0.4, + saturation=0.4, + hue=0.2), + transforms.ToTensor(), + normalize, + ])) + + sampler = torch.utils.data.distributed.DistributedSampler( + train_dataset, num_replicas=args.gpu_num, rank=args.local_rank) + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size // args.gpu_num, num_workers=max(args.gpu_num * 2, 4), + pin_memory=True, drop_last=True, sampler=sampler) + + val_loader = torch.utils.data.DataLoader( + dset.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=False, + num_workers=4, pin_memory=True) + + return train_loader, val_loader, sampler + + +def _data_transforms_cifar100(args): + CIFAR_MEAN = [0.5070751592371323, 0.48654887331495095, 0.4409178433670343] + CIFAR_STD = [0.2673342858792401, 0.2564384629170883, 0.27615047132568404] + + train_transform = transforms.Compose([ + transforms.RandomCrop(32, padding=4), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + transforms.Normalize(CIFAR_MEAN, CIFAR_STD), + ]) + if args.cutout: + train_transform.transforms.append(Cutout(args.cutout_length)) + + valid_transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize(CIFAR_MEAN, CIFAR_STD), + ]) + return train_transform, valid_transform + + +def _get_cifar100(args): + train_transform, valid_transform = _data_transforms_cifar100(args) + train_data = dset.CIFAR100( + root=args.data, train=True, download=True, transform=train_transform + ) + valid_data = dset.CIFAR100( + root=args.data, train=False, download=True, transform=valid_transform + ) + + train_queue = torch.utils.data.DataLoader( + train_data, + batch_size=args.batch_size, + shuffle=True, + pin_memory=True, + num_workers=4, + ) + + valid_queue = torch.utils.data.DataLoader( + valid_data, + batch_size=args.batch_size, + shuffle=False, + pin_memory=True, + num_workers=4, + ) + return train_queue, valid_queue + + +def _get_imagenet_tiny(args): + traindir = os.path.join(args.data, 'train') + validdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize( + mean=[0.4802, 0.4481, 0.3975], + std=[0.2302, 0.2265, 0.2262] + ) + train_transform = transforms.Compose([ + transforms.RandomCrop(64, padding=4), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ]) + if args.cutout: + train_transform.transforms.append(Cutout(args.cutout_length)) + + train_data = dset.ImageFolder( + traindir, + train_transform + ) + valid_data = dset.ImageFolder( + validdir, + transforms.Compose([ + transforms.ToTensor(), + normalize, + ]) + ) + + train_queue = torch.utils.data.DataLoader( + train_data, batch_size=args.batch_size, shuffle=True, pin_memory=True, num_workers=4) + + valid_queue = torch.utils.data.DataLoader( + valid_data, batch_size=args.batch_size // 2, shuffle=False, pin_memory=True, num_workers=4) + return train_queue, valid_queue + + +def count_parameters_in_MB(model): + return np.sum([np.prod(v.size()) for v in model.parameters()]) / 1e6 + + +def count_parameters(model): + """ + Get element number of all parameters matrix. + :param model: + :return: + """ + return sum([torch.numel(v) for v in model.parameters()]) + + +def save(model, model_path): + torch.save(model.state_dict(), model_path) + + +def load(model, model_path): + model.load_state_dict(torch.load(model_path)) + + +def load_ckpt(ckpt_path): + print(f'=> loading checkpoint {ckpt_path}...') + try: + checkpoint = torch.load(ckpt_path) + except: + print(f"=> fail loading {ckpt_path}..."); + exit() + return checkpoint + + +def save_ckpt(ckpt, file_dir, file_name='model.ckpt', is_best=False): + if not os.path.exists(file_dir): os.makedirs(file_dir) + ckpt_path = os.path.join(file_dir, file_name) + torch.save(ckpt, ckpt_path) + if is_best: shutil.copyfile(ckpt_path, os.path.join(file_dir, f'best_{file_name}')) + + +def drop_path(x, drop_prob, dims=(0,)): + from torch.autograd import Variable + var_size = [1 for _ in range(x.dim())] + for i in dims: + var_size[i] = x.size(i) + if drop_prob > 0.: + keep_prob = 1. - drop_prob + mask = Variable(torch.cuda.FloatTensor(*var_size).bernoulli_(keep_prob)) + x.div_(keep_prob) + x.mul_(mask) + return x + + +def create_exp_dir(path, scripts_to_save=None): + if not os.path.exists(path): + os.makedirs(path) + print('Experiment dir : {}'.format(path)) + + if scripts_to_save is not None: + os.makedirs(os.path.join(path, 'tools')) + for script in scripts_to_save: + dst_file = os.path.join(path, 'tools', os.path.basename(script)) + shutil.copyfile(script, dst_file) + + +class Performance(object): + def __init__(self, path): + self.path = path + self.data = None + + def update(self, alphas_normal, alphas_reduce, val_loss): + import torch.nn.functional as F + a_normal = F.softmax(alphas_normal, dim=-1) + # print("alpha normal size: ", a_normal.data.size()) + a_reduce = F.softmax(alphas_reduce, dim=-1) + # print("alpha reduce size: ", a_reduce.data.size()) + data = np.concatenate([a_normal.data.view(-1), + a_reduce.data.view(-1), + np.array([val_loss.data])]).reshape(1, -1) + if self.data is not None: + self.data = np.concatenate([self.data, data], axis=0) + else: + self.data = data + + def save(self): + np.save(self.path, self.data) + + +def logger(log_dir, need_time=True, need_stdout=False): + log = logging.getLogger(__name__) + log.setLevel(logging.DEBUG) + fh = logging.FileHandler(log_dir) + fh.setLevel(logging.DEBUG) + formatter = logging.Formatter(fmt='%(asctime)s %(message)s', datefmt='%m/%d/%Y-%I:%M:%S') + if need_stdout: + ch = logging.StreamHandler(sys.stdout) + ch.setLevel(logging.DEBUG) + log.addHandler(ch) + if need_time: + fh.setFormatter(formatter) + if need_stdout: + ch.setFormatter(formatter) + log.addHandler(fh) + return log + +import torch.nn as nn +class CrossEntropyLabelSmooth(nn.Module): + + def __init__(self, num_classes, epsilon): + super(CrossEntropyLabelSmooth, self).__init__() + self.num_classes = num_classes + self.epsilon = epsilon + self.logsoftmax = nn.LogSoftmax(dim=1) + + def forward(self, inputs, targets): + log_probs = self.logsoftmax(inputs) + targets = torch.zeros_like(log_probs).scatter_(1, targets.unsqueeze(1), 1) + targets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes + loss = (-targets * log_probs).mean(0).sum() + return loss + + +def roc_auc_compute_fn(y_pred, y_target): + """ IGNITE.CONTRIB.METRICS.ROC_AUC """ + try: + from sklearn.metrics import roc_auc_score + except ImportError: + raise RuntimeError("This contrib module requires sklearn to be installed.") + + if y_pred.requires_grad: + y_pred = y_pred.detach() + + if y_target.is_cuda: + y_target = y_target.cpu() + if y_pred.is_cuda: + y_pred = y_pred.cpu() + + y_true = y_target.numpy() + y_pred = y_pred.numpy() + try: + return roc_auc_score(y_true, y_pred) + except ValueError: + # print('ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.') + return 0. + + +def load_checkpoint(args): + try: + return torch.load(args.resume) + except RuntimeError: + raise RuntimeError(f"Fail to load checkpoint at {args.resume}") + + +def save_checkpoint(ckpt, is_best, file_dir, file_name='model.ckpt'): + if not os.path.exists(file_dir): + os.makedirs(file_dir) + ckpt_name = "{0}{1}".format(file_dir, file_name) + torch.save(ckpt, ckpt_name) + if is_best: shutil.copyfile(ckpt_name, "{0}{1}".format(file_dir, 'best_' + file_name)) + + +def seed_everything(seed=2022): + ''' [reference] https://gist.github.com/KirillVladimirov/005ec7f762293d2321385580d3dbe335 ''' + random.seed(seed) + os.environ['PYTHONHASHSEED'] = str(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.backends.cudnn.deterministic = True diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_slicing/.gitkeep b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_slicing/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.cargo/config.toml b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.cargo/config.toml new file mode 100644 index 000000000..9dd8fcf87 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.cargo/config.toml @@ -0,0 +1,3 @@ +[target.'cfg(target_os="macos")'] +# Postgres symbols won't be available until runtime +rustflags = ["-Clink-arg=-Wl,-undefined,dynamic_lookup"] \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore new file mode 100644 index 000000000..3906c3324 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +.idea/ +/target +*.iml +**/*.rs.bk +Cargo.lock diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/Cargo.toml b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/Cargo.toml new file mode 100644 index 000000000..5c3e74739 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "pg_extension" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[features] +default = ["pg14", "python"] +python = ["pyo3"] +pg11 = ["pgrx/pg11", "pgrx-tests/pg11" ] +pg12 = ["pgrx/pg12", "pgrx-tests/pg12" ] +pg13 = ["pgrx/pg13", "pgrx-tests/pg13" ] +pg14 = ["pgrx/pg14", "pgrx-tests/pg14" ] +pg15 = ["pgrx/pg15", "pgrx-tests/pg15" ] +pg_test = [] + +[dependencies] +pgrx = "=0.9.7" +pgrx-pg-sys = "=0.9.7" +serde_json = { version = "1.0.85", features = ["preserve_order"] } +pyo3 = { version = "0.17", features = ["auto-initialize"], optional = true } +once_cell = "1.8.0" +log = "0.4.14" +serde = "1.0" +serde_derive = "1.0" + +[dev-dependencies] +pgrx-tests = "=0.9.7" + +[profile.dev] +panic = "unwind" + +[profile.release] +panic = "unwind" +opt-level = 3 +lto = "fat" +codegen-units = 1 \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/pg_extension.control b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/pg_extension.control new file mode 100644 index 000000000..a28d2e9d8 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/pg_extension.control @@ -0,0 +1,5 @@ +comment = 'pg_extension: Created by pgrx' +default_version = '@CARGO_VERSION@' +module_pathname = '$libdir/pg_extension' +relocatable = false +superuser = true \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql new file mode 100644 index 000000000..173999b43 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql @@ -0,0 +1,35 @@ + + +CREATE OR REPLACE +PROCEDURE model_selection_sp( + dataset TEXT, --dataset name + selected_columns TEXT[], --used columns + N INTEGER, --number of models to evaluate + batch_size INTEGER, --batch size, for profiling, filtering + config_file TEXT --config file path +) +LANGUAGE plpgsql +AS $$ +DECLARE + -- global inputs/outputs + result_status TEXT; + column_list TEXT; +BEGIN + -- combine the columns into a string + column_list := array_to_string(selected_columns, ', '); + + -- 4. Run filtering phase to get top K models. + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + LIMIT %s OFFSET 0 + ) + SELECT filtering_phase( + json_agg(row_to_json(t))::text, %s, %s, %L + ) + FROM batch_rows AS t', column_list, dataset, batch_size, N, 1, config_file) INTO result_status; + RAISE NOTICE '4. run filtering phase, k models = %', result_status; + +END; $$; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql new file mode 100644 index 000000000..366d88d6d --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql @@ -0,0 +1,31 @@ + + +CREATE OR REPLACE +PROCEDURE model_selection_end2end( + dataset TEXT, --dataset name + selected_columns TEXT[], --used columns + budget TEXT, --user given time budget + config_file TEXT --config file path +) +LANGUAGE plpgsql +AS $$ +DECLARE + -- global inputs/outputs + result_status TEXT; + column_list TEXT; + +BEGIN + -- combine the columns into a string + column_list := array_to_string(selected_columns, ', '); + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + ) + SELECT model_selection( + json_agg(row_to_json(t))::text, %L, %L + ) + FROM batch_rows AS t', column_list, dataset, budget, config_file) INTO result_status; + RAISE NOTICE '1. model_selection result: %', result_status; +END; $$; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql new file mode 100644 index 000000000..835c627d9 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql @@ -0,0 +1,32 @@ + + +CREATE OR REPLACE +PROCEDURE model_selection_workloads( + dataset TEXT, --dataset name + selected_columns TEXT[], --used columns + N INTEGER, --explore N models + K INTEGER, --keep K models + config_file TEXT --config file path +) +LANGUAGE plpgsql +AS $$ +DECLARE + -- global inputs/outputs + result_status TEXT; + column_list TEXT; + +BEGIN + -- combine the columns into a string + column_list := array_to_string(selected_columns, ', '); + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + ) + SELECT model_selection_workloads( + json_agg(row_to_json(t))::text, %s, %s, %L + ) + FROM batch_rows AS t', column_list, dataset, N, K, config_file) INTO result_status; + RAISE NOTICE '1. model_selection result: %', result_status; +END; $$; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql new file mode 100644 index 000000000..12a4fdd4c --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql @@ -0,0 +1,80 @@ + + +CREATE OR REPLACE +PROCEDURE model_selection_sp( + dataset TEXT, --dataset name + selected_columns TEXT[], --used columns + budget TEXT, --user given time budget + batch_size INTEGER, --batch size, for profiling, filtering + config_file TEXT --config file path +) +LANGUAGE plpgsql +AS $$ +DECLARE + -- global inputs/outputs + result_status TEXT; + column_list TEXT; + + -- UDF outputs + score_time TEXT; + train_time TEXT; + coordinator_k integer; + coordinator_u integer; + coordinator_n integer; +BEGIN + -- combine the columns into a string + column_list := array_to_string(selected_columns, ', '); + + -- 1. Profiling time to score a model with TFMEM + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + LIMIT %s OFFSET 0 + ) + SELECT profiling_filtering_phase( + json_agg(row_to_json(t))::text, %L + ) + FROM batch_rows AS t', column_list, dataset, batch_size, config_file) INTO result_status; + score_time := json_extract_path_text(result_status::json, 'time'); + RAISE NOTICE '1. profiling_filtering_phase, get score_time: %', score_time; + + -- 2. Profiling time of training a model for one epoch + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + LIMIT %s OFFSET 0 + ) + SELECT profiling_refinement_phase( + json_agg(row_to_json(t))::text, %L + ) + FROM batch_rows AS t', column_list, dataset, batch_size, config_file) INTO result_status; + train_time := json_extract_path_text(result_status::json, 'time'); + RAISE NOTICE '2. profiling_refinement_phase, get train_time: %', train_time; + + -- 3. Coordinator to get N, K ,U + EXECUTE format('SELECT "coordinator"(%L, %L, %L, false, %L)', score_time, train_time, budget, config_file) INTO result_status; + + coordinator_k := (json_extract_path_text(result_status::json, 'k'))::integer; + coordinator_u := (json_extract_path_text(result_status::json, 'u'))::integer; + coordinator_n := (json_extract_path_text(result_status::json, 'n'))::integer; + RAISE NOTICE '3. coordinator result: k = %, u = %, n = %', coordinator_k, coordinator_u, coordinator_n; + + -- 4. Run filtering phase to get top K models. + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + LIMIT %s OFFSET 0 + ) + SELECT filtering_phase( + json_agg(row_to_json(t))::text, %s, %s, %L + ) + FROM batch_rows AS t', column_list, dataset, batch_size, coordinator_n, coordinator_k, config_file) INTO result_status; + RAISE NOTICE '4. run filtering phase, k models = %', result_status; + +END; $$; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql new file mode 100644 index 000000000..24cbd6078 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql @@ -0,0 +1,31 @@ + + +CREATE OR REPLACE +PROCEDURE model_selection_end2end( + dataset TEXT, --dataset name + selected_columns TEXT[], --used columns + budget TEXT, --user given time budget + config_file TEXT --config file path +) +LANGUAGE plpgsql +AS $$ +DECLARE + -- global inputs/outputs + result_status TEXT; + column_list TEXT; + +BEGIN + -- combine the columns into a string + column_list := array_to_string(selected_columns, ', '); + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + ) + SELECT model_selection_trails( + json_agg(row_to_json(t))::text, %L, %L + ) + FROM batch_rows AS t', column_list, dataset, budget, config_file) INTO result_status; + RAISE NOTICE '1. model_selection result: %', result_status; +END; $$; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql new file mode 100644 index 000000000..89c0db153 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql @@ -0,0 +1,32 @@ + + +CREATE OR REPLACE +PROCEDURE model_selection_workloads( + dataset TEXT, --dataset name + selected_columns TEXT[], --used columns + N INTEGER, --explore N models + K INTEGER, --keep K models + config_file TEXT --config file path +) +LANGUAGE plpgsql +AS $$ +DECLARE + -- global inputs/outputs + result_status TEXT; + column_list TEXT; + +BEGIN + -- combine the columns into a string + column_list := array_to_string(selected_columns, ', '); + EXECUTE format(' + WITH batch_rows AS ( + SELECT %s + FROM %I + ORDER BY RANDOM() + ) + SELECT model_selection_trails_workloads( + json_agg(row_to_json(t))::text, %s, %s, %L + ) + FROM batch_rows AS t', column_list, dataset, N, K, config_file) INTO result_status; + RAISE NOTICE '1. model_selection result: %', result_status; +END; $$; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql new file mode 100644 index 000000000..c096c0031 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql @@ -0,0 +1,139 @@ +/* +This file is auto generated by pgrx. + +The ordering of items is not stable, it is driven by a dependency graph. +*/ + +-- src/lib.rs:80 +-- pg_extension::refinement_phase +CREATE FUNCTION "refinement_phase"( + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'refinement_phase_wrapper'; + +-- src/lib.rs:31 +-- pg_extension::profiling_refinement_phase +CREATE FUNCTION "profiling_refinement_phase"( + "mini_batch" TEXT, /* alloc::string::String */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'profiling_refinement_phase_wrapper'; + +-- src/lib.rs:16 +-- pg_extension::profiling_filtering_phase +CREATE FUNCTION "profiling_filtering_phase"( + "mini_batch" TEXT, /* alloc::string::String */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'profiling_filtering_phase_wrapper'; + +-- src/lib.rs:66 +-- pg_extension::filtering_phase +CREATE FUNCTION "filtering_phase"( + "mini_batch" TEXT, /* alloc::string::String */ + "n" INT, /* i32 */ + "k" INT, /* i32 */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'filtering_phase_wrapper'; + +-- src/lib.rs:46 +-- pg_extension::coordinator +CREATE FUNCTION "coordinator"( + "time_score" TEXT, /* alloc::string::String */ + "time_train" TEXT, /* alloc::string::String */ + "time_budget" TEXT, /* alloc::string::String */ + "only_phase1" bool, /* bool */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'coordinator_wrapper'; + + +-- src/lib.rs:110 +-- pg_extension::model_selection_workloads +CREATE FUNCTION "model_selection_workloads"( + "mini_batch" TEXT, /* alloc::string::String */ + "n" INT, /* i32 */ + "k" INT, /* i32 */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'model_selection_workloads_wrapper'; + +-- src/lib.rs:138 +-- pg_extension::model_selection_trails_workloads +CREATE FUNCTION "model_selection_trails_workloads"( + "mini_batch" TEXT, /* alloc::string::String */ + "n" INT, /* i32 */ + "k" INT, /* i32 */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'model_selection_trails_workloads_wrapper'; + +-- src/lib.rs:125 +-- pg_extension::model_selection_trails +CREATE FUNCTION "model_selection_trails"( + "mini_batch" TEXT, /* alloc::string::String */ + "time_budget" TEXT, /* alloc::string::String */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'model_selection_trails_wrapper'; + +-- src/lib.rs:94 +-- pg_extension::model_selection +CREATE FUNCTION "model_selection"( + "mini_batch" TEXT, /* alloc::string::String */ + "time_budget" TEXT, /* alloc::string::String */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'model_selection_wrapper'; + +-- src/lib.rs:153 +-- pg_extension::benchmark_filtering_phase_latency +CREATE FUNCTION "benchmark_filtering_phase_latency"( + "explore_models" INT, /* i32 */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'benchmark_filtering_phase_latency_wrapper'; + + +-- src/lib.rs:152 +-- pg_extension::benchmark_filtering_phase_latency +CREATE FUNCTION "benchmark_filtering_phase_latency"( + "explore_models" INT, /* i32 */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'benchmark_filtering_phase_latency_wrapper'; + +-- src/lib.rs:163 +-- pg_extension::benchmark_filtering_latency_in_db +CREATE FUNCTION "benchmark_filtering_latency_in_db"( + "explore_models" INT, /* i32 */ + "dataset" TEXT, /* alloc::string::String */ + "config_file" TEXT /* alloc::string::String */ +) RETURNS TEXT /* alloc::string::String */ + IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE c /* Rust */ +AS 'MODULE_PATHNAME', 'benchmark_filtering_latency_in_db_wrapper'; + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs new file mode 100644 index 000000000..d10720301 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs @@ -0,0 +1,55 @@ +use log::error; +use once_cell::sync::Lazy; +use pyo3::prelude::*; +use pyo3::types::PyTuple; + + +pub fn run_python_function( + py_module: &Lazy>, + parameters: &String, + function_name: &str, +) -> serde_json::Value { + let parameters_str = parameters.to_string(); + let results = Python::with_gil(|py| -> String { + let run_script: Py = py_module.getattr(py, function_name).unwrap().into(); + let result = run_script.call1( + py, + PyTuple::new( + py, + &[parameters_str.into_py(py)], + ), + ); + let result = match result { + Err(e) => { + let traceback = e.traceback(py).unwrap().format().unwrap(); + error!("{traceback} {e}"); + format!("{traceback} {e}") + } + Ok(o) => o.extract(py).unwrap(), + }; + result + }); + + serde_json::from_str(&results).unwrap() +} + + +/* + Python Module Path for Model Selection + */ +pub static PY_MODULE: Lazy> = Lazy::new(|| { + Python::with_gil(|py| -> Py { + let src = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../ml/model_selection/pg_interface.py" + )); + PyModule::from_code(py, src, "", "").unwrap().into() + }) +}); + + + + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs new file mode 100644 index 000000000..70be9ec7e --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs @@ -0,0 +1,7 @@ + + +#[cfg(feature = "python")] +pub mod ms; +mod ml_register; +mod model; + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs new file mode 100644 index 000000000..af09a5c82 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs @@ -0,0 +1,19 @@ + +use serde::{Serialize, Deserialize}; + + +#[derive(Debug, Serialize, Deserialize)] +pub(crate) struct Frappe { + pub(crate) id: i32, + pub(crate) label: i32, + pub(crate) col1: String, + pub(crate) col2: String, + pub(crate) col3: String, + pub(crate) col4: String, + pub(crate) col5: String, + pub(crate) col6: String, + pub(crate) col7: String, + pub(crate) col8: String, + pub(crate) col9: String, + pub(crate) col10: String, +} diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs new file mode 100644 index 000000000..21fb5f65c --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs @@ -0,0 +1,207 @@ +use serde_json::json; +use std::collections::HashMap; +use pgrx::prelude::*; +use crate::bindings::ml_register::PY_MODULE; +use crate::bindings::ml_register::run_python_function; +use std::time::{Instant, Duration}; + + +pub fn profiling_filtering_phase( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "profiling_filtering_phase") +} + + +pub fn profiling_refinement_phase( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "profiling_refinement_phase") +} + + +pub fn coordinator( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "coordinator") +} + + +pub fn filtering_phase( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "filtering_phase_dataLoader") +} + + +pub fn refinement_phase() -> serde_json::Value { + let task = "refinement_phase".to_string(); + run_python_function(&PY_MODULE, &task, "refinement_phase") +} + + +// this two are filtering + refinement in UDF runtime +pub fn model_selection( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "model_selection") +} + + +pub fn model_selection_workloads( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "model_selection_workloads") +} + + +// this two are filtering + refinement in GPU server +pub fn model_selection_trails( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "model_selection_trails") +} + + +pub fn model_selection_trails_workloads( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "model_selection_trails_workloads") +} + +// micro benchmarks + +pub fn benchmark_filtering_phase_latency( + task: &String +) -> serde_json::Value { + run_python_function(&PY_MODULE, task, "benchmark_filtering_phase_latency") +} + +pub fn benchmark_filtering_latency_in_db( + explore_models: i32, dataset: &String, config_file: &String) -> serde_json::Value { + + let overall_start_time = Instant::now(); + + let database_name = "pg_extension"; + let mut last_id = 0; + let mut eva_results = serde_json::Value::Null; // Initializing the eva_results + + for i in 1..explore_models { + + // Step 1: Initialize State in Python + let mut task_map = HashMap::new(); + task_map.insert("config_file", config_file.clone()); + task_map.insert("dataset", dataset.clone()); + task_map.insert("eva_results", eva_results.to_string()); + let task_json = json!(task_map).to_string(); + + // here it cache a state + let sample_result = run_python_function( + &PY_MODULE, + &task_json, + "in_db_filtering_state_init"); + + // 2. query data via SPI + let start_time = Instant::now(); + let results: Result>, String> = Spi::connect(|client| { + let query = format!("SELECT * FROM {}_train WHERE id > {} ORDER BY id ASC LIMIT 32", dataset, last_id); + let mut cursor = client.open_cursor(&query, None); + let table = match cursor.fetch(32) { + Ok(table) => table, + Err(e) => return Err(e.to_string()), // Convert the error to a string and return + }; + + let mut mini_batch = Vec::new(); + + for row in table.into_iter() { + let mut each_row = Vec::new(); + // add primary key + let col0 = match row.get::(1) { + Ok(Some(val)) => { + // Update last_id with the retrieved value + if val > 100000{ + last_id = 0; + }else{ + last_id = val + } + val.to_string() + } + Ok(None) => "".to_string(), // Handle the case when there's no valid value + Err(e) => e.to_string(), + }; + each_row.push(col0); + // add label + let col1 = match row.get::(2) { + Ok(val) => val.map(|i| i.to_string()).unwrap_or_default(), + Err(e) => e.to_string(), + }; + each_row.push(col1); + // add fields + let texts: Vec = (3..row.columns()+1) + .filter_map(|i| { + match row.get::<&str>(i) { + Ok(Some(s)) => Some(s.to_string()), + Ok(None) => None, + Err(e) => Some(e.to_string()), // Convert error to string + } + }).collect(); + each_row.extend(texts); + mini_batch.push(each_row) + } + // return + Ok(mini_batch) + }); + // serialize the mini-batch data + let tup_table = match results { + Ok(data) => { + serde_json::json!({ + "status": "success", + "data": data + }) + } + Err(e) => { + serde_json::json!({ + "status": "error", + "message": format!("Error while connecting: {}", e) + }) + } + }; + + let end_time = Instant::now(); + let elapsed_time = end_time.duration_since(start_time); + let elapsed_seconds = elapsed_time.as_secs_f64(); + + // Step 3: model evaluate in Python + let mut eva_task_map = HashMap::new(); + eva_task_map.insert("config_file", config_file.clone()); + eva_task_map.insert("sample_result", sample_result.to_string()); + let mini_batch_json = tup_table.to_string(); + eva_task_map.insert("mini_batch", mini_batch_json); + eva_task_map.insert("spi_seconds", elapsed_seconds.to_string()); + eva_task_map.insert("model_index", i.to_string()); + + let eva_task_json = json!(eva_task_map).to_string(); // Corrected this line + + eva_results = run_python_function( + &PY_MODULE, + &eva_task_json, + "in_db_filtering_evaluate"); + } + + let mut record_task_map = HashMap::new(); + record_task_map.insert("config_file", config_file.clone()); + record_task_map.insert("dataset", dataset.clone()); + let record_task_json = json!(record_task_map).to_string(); + run_python_function( + &PY_MODULE, + &record_task_json, + "records_results"); + + let overall_end_time = Instant::now(); + let overall_elapsed_time = overall_end_time.duration_since(overall_start_time); + let overall_elapsed_seconds = overall_elapsed_time.as_secs_f64(); + + // Step 4: Return to PostgresSQL + return serde_json::json!(overall_elapsed_seconds.to_string()); +} + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs new file mode 100644 index 000000000..cb99ed832 --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs @@ -0,0 +1,171 @@ +use pgrx::prelude::*; +pgrx::pg_module_magic!(); +use serde_json::json; +use std::collections::HashMap; + +pub mod bindings; +extern crate serde_derive; + +/* + * @param mini_batch: mini_batch of data. Assume all columns are string type in + * libsvm codding + */ +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "profiling_filtering_phase")] +#[allow(unused_variables)] +pub fn profiling_filtering_phase(mini_batch: String, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("mini_batch", mini_batch); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::profiling_filtering_phase(&task_json).to_string() +} + +/* + * @param mini_batch: training for one iteration. + * libsvm codding + */ +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "profiling_refinement_phase")] +#[allow(unused_variables)] +pub fn profiling_refinement_phase(mini_batch: String, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("mini_batch", mini_batch); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::profiling_refinement_phase(&task_json).to_string() +} + +/* + * @param mini_batch: training for one iteration. + * libsvm codding + */ +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "coordinator")] +#[allow(unused_variables)] +pub fn coordinator(time_score: String, time_train: String, time_budget: String, only_phase1: bool, + config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("budget", time_budget); + task_map.insert("score_time_per_model", time_score); + task_map.insert("train_time_per_epoch", time_train); + task_map.insert("only_phase1", only_phase1.to_string()); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::coordinator(&task_json).to_string() +} + + +/* + * @param mini_batch: mini_batch of data. Assume all columns are string type in + * libsvm codding + */ +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "filtering_phase")] +#[allow(unused_variables)] +pub fn filtering_phase(mini_batch: String, n: i32, k: i32, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("mini_batch", mini_batch); + task_map.insert("n", n.to_string()); + task_map.insert("k", k.to_string()); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::filtering_phase(&task_json).to_string() +} + + +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "refinement_phase")] +#[allow(unused_variables)] +pub fn refinement_phase(config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::refinement_phase().to_string() +} + + +/* + End-2-End model selection, All in UDF runtime. + */ +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "model_selection")] +#[allow(unused_variables)] +pub fn model_selection(mini_batch: String, time_budget: String, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("mini_batch", mini_batch); + task_map.insert("budget", time_budget); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::model_selection(&task_json).to_string() +} + +/* + * @param mini_batch: mini_batch of data. Assume all columns are string type in + * libsvm codding + */ +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "model_selection_workloads")] +#[allow(unused_variables)] +pub fn model_selection_workloads(mini_batch: String, n: i32, k: i32, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("mini_batch", mini_batch); + task_map.insert("n", n.to_string()); + task_map.insert("k", k.to_string()); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::model_selection_workloads(&task_json).to_string() +} + + +// this two are filtering + refinement in GPU server +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "model_selection_trails")] +#[allow(unused_variables)] +pub fn model_selection_trails(mini_batch: String, time_budget: String, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("mini_batch", mini_batch); + task_map.insert("budget", time_budget); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::model_selection_trails(&task_json).to_string() +} + + +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "model_selection_trails_workloads")] +#[allow(unused_variables)] +pub fn model_selection_trails_workloads(mini_batch: String, n: i32, k: i32, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("mini_batch", mini_batch); + task_map.insert("n", n.to_string()); + task_map.insert("k", k.to_string()); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::model_selection_trails_workloads(&task_json).to_string() +} + +// micro benchmarks +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "benchmark_filtering_phase_latency")] +#[allow(unused_variables)] +pub fn benchmark_filtering_phase_latency(explore_models: i32, config_file: String) -> String { + let mut task_map = HashMap::new(); + task_map.insert("explore_models", explore_models.to_string()); + task_map.insert("config_file", config_file); + let task_json = json!(task_map).to_string(); + crate::bindings::ms::benchmark_filtering_phase_latency(&task_json).to_string() +} + +#[cfg(feature = "python")] +#[pg_extern(immutable, parallel_safe, name = "benchmark_filtering_latency_in_db")] +#[allow(unused_variables)] +pub fn benchmark_filtering_latency_in_db( + explore_models: i32, dataset: String, config_file: String) -> String { + crate::bindings::ms::benchmark_filtering_latency_in_db(explore_models, &dataset, &config_file).to_string() +} + + + + + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/test/lib.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/test/lib.rs new file mode 100644 index 000000000..e69de29bb diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/requirement.txt b/examples/model_selection/TRAILS-Database-Native-Model-Selection/requirement.txt new file mode 100644 index 000000000..ab233d87b --- /dev/null +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/requirement.txt @@ -0,0 +1,32 @@ +ConfigSpace==0.7.1 +contourpy==1.1.0 +cycler==0.11.0 +fonttools==4.41.0 +importlib-resources==6.0.0 +joblib==1.3.1 +kiwisolver==1.4.4 +matplotlib==3.7.2 +more-itertools==9.1.0 +numpy==1.24.4 +orjson==3.9.2 +packaging==23.1 +palettable==3.3.3 +pandas==2.0.3 +Pillow==10.0.0 +pyparsing==3.0.9 +python-dateutil==2.8.2 +pytz==2023.3 +scikit-learn==1.3.0 +scipy==1.10.1 +seaborn==0.12.2 +six==1.16.0 +sklearn==0.0 +threadpoolctl==3.1.0 +torch==1.8.1 +torchaudio==0.8.1 +torchvision==0.9.1 +tqdm==4.47.0 +typing_extensions==4.7.1 +tzdata==2023.3 +zipp==3.16.2 +requests==2.31.0 diff --git a/setup.py b/setup.py index b3147e57e..cfd87d611 100644 --- a/setup.py +++ b/setup.py @@ -83,7 +83,7 @@ from datetime import date # stable version -VERSION = '4.0.0' +VERSION = '4.1.0' # get the git hash # git_hash = subprocess.check_output(["git", "describe"]).strip().split('-')[-1][1:] # comment the next line to build wheel for stable version diff --git a/tool/conda/singa/meta.yaml b/tool/conda/singa/meta.yaml index 5a01ef3a9..5bcc36212 100644 --- a/tool/conda/singa/meta.yaml +++ b/tool/conda/singa/meta.yaml @@ -20,7 +20,7 @@ # https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html#templating-with-jinja # {% set data = load_setup_py_data(setup_file='../../../python/singa/setup.py', from_recipe_dir=True) %} -{% set version = "4.0.0" %} +{% set version = "4.1.0" %} package: name: singa diff --git a/tool/docker/devel/centos6/cuda10/Dockerfile.manylinux2014 b/tool/docker/devel/centos6/cuda10/Dockerfile.manylinux2014 index 1472c9fc9..107e3465c 100644 --- a/tool/docker/devel/centos6/cuda10/Dockerfile.manylinux2014 +++ b/tool/docker/devel/centos6/cuda10/Dockerfile.manylinux2014 @@ -60,8 +60,8 @@ RUN /opt/python/cp38-cp38/bin/pip install numpy # install cuda and cudnn # Refer to https://gitlab.com/nvidia/container-images/cuda/-/tree/master/dist for other cuda and cudnn versions # 10.2-base-centos7 -RUN NVIDIA_GPGKEY_SUM=d1be581509378368edeec8c1eb2958702feedf3bc3d17011adbf24efacce4ab5 && \ - curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub | sed '/^Version/d' > /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA && \ +RUN NVIDIA_GPGKEY_SUM=d0664fbbdb8c32356d45de36c5984617217b2d0bef41b93ccecd326ba3b80c87 && \ + curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/D42D0685.pub | sed '/^Version/d' > /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA && \ echo "$NVIDIA_GPGKEY_SUM /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA" | sha256sum -c --strict - COPY cuda.repo /etc/yum.repos.d/cuda.repo ENV CUDA_VERSION 10.2.89 From daa9c173d1b2720a07d34148745bee6f3376fa0d Mon Sep 17 00:00:00 2001 From: zhaojing Date: Wed, 25 Oct 2023 10:50:22 +0800 Subject: [PATCH 44/45] Update license headers for v4.1.0 --- NOTICE | 2 + examples/malaria_cnn/data/malaria.py | 18 ++ examples/malaria_cnn/model/cnn.py | 19 +- examples/malaria_cnn/model/mlp.py | 19 +- examples/malaria_cnn/run.sh | 20 +- .../Dockerfile | 18 ++ .../README.md | 19 ++ .../documents/dev_guide.md | 20 +- .../internal/cache-service/cache_service.py | 19 ++ .../cache-service/trigger_cache_svc.py | 17 ++ .../internal/ml/model_selection/README.md | 19 ++ .../internal/ml/model_selection/config.ini | 18 ++ .../ml/model_selection/eva_service.py | 18 ++ .../model_selection/exp_result_singa/.gitkeep | 0 .../ml/model_selection/exps/README.md | 19 ++ .../ml/model_selection/exps/draw_img_lib.py | 18 ++ .../ml/model_selection/exps/draw_tab_lib.py | 18 ++ .../nas_bench_tabular/0.train_one_model.py | 18 ++ .../2.seq_train_dist_online.py | 18 ++ .../nas_bench_tabular/2.seq_train_online.py | 18 ++ .../nas_bench_tabular/4.seq_score_online.py | 18 ++ .../exps/nas_bench_tabular/measure_ecdf.py | 17 ++ .../nas_bench_tabular/measure_param_auc.py | 18 ++ .../internal/ml/model_selection/main.py | 18 ++ .../ml/model_selection/pg_interface.py | 18 ++ .../scripts/anytime_img_w_baseline.sh | 18 +- .../ml/model_selection/scripts/anytime_tab.sh | 18 +- .../scripts/baseline_system_img.sh | 18 +- .../scripts/baseline_system_tab.sh | 18 +- .../scripts/benchmark_weight_sharing.sh | 18 +- .../scripts/database/load_data_to_db.sh | 18 ++ .../scripts/latency_embedding_cache.sh | 18 +- .../latency_embedding_cache_concurrent.sh | 18 +- .../scripts/latency_phase1_cpu_gpu.sh | 18 +- .../scripts/latency_phase1_in_db.sh | 18 +- .../model_selection/scripts/latency_phase2.sh | 18 +- .../scripts/micro_budget_aware_alg.sh | 18 +- .../scripts/micro_nku_tradeoff.sh | 18 +- .../scripts/micro_score_metrics_relation.sh | 18 +- .../scripts/micro_search_strategy.sh | 18 +- .../nas-bench-img/convert_api_2_json.sh | 17 ++ .../nas-bench-img/explore_all_models.sh | 17 ++ .../scripts/nas-bench-img/score_all_models.sh | 19 +- .../score_all_modesl_criteo.sh | 18 +- .../score_all_modesl_frappe.sh | 17 ++ .../nas-bench-tabular/score_all_modesl_uci.sh | 18 +- .../train_all_models_criteo.sh | 17 ++ .../train_all_models_criteo_distirbuted.sh | 18 +- .../train_all_models_diabetes.sh | 18 +- .../train_all_models_frappe.sh | 18 +- .../nas-bench-tabular/train_one_model_dev.sh | 18 +- .../train_params_tune_criteo.sh | 18 ++ .../train_params_tune_diabetes.sh | 18 +- .../pre_processing/pre_processing_data.sh | 18 +- .../ml/model_selection/shared_config.py | 18 ++ .../ml/model_selection/src/__init__.py | 21 +- .../ml/model_selection/src/common/constant.py | 18 +- .../model_selection/src/common/structure.py | 18 ++ .../src/controller/__init__.py | 18 +- .../src/controller/controler.py | 18 ++ .../src/controller/core/__init__.py | 17 ++ .../src/controller/core/metrics.py | 18 ++ .../src/controller/core/sample.py | 18 ++ .../src/controller/sampler_EA/__init__.py | 21 +- .../src/controller/sampler_RL/__init__.py | 20 +- .../src/controller/sampler_all/__init__.py | 21 +- .../src/controller/sampler_all/seq_sampler.py | 18 ++ .../src/controller/sampler_bohb/bohb_or.py | 285 ------------------ .../controller/sampler_ea/regularized_ea.py | 18 ++ .../src/controller/sampler_rand/__init__.py | 21 +- .../controller/sampler_rand/random_sample.py | 18 ++ .../sampler_rl/reinforcement_learning.py | 17 ++ .../src/dataset_utils/__init__.py | 19 +- .../download_critero_and_avazu.py | 19 +- .../src/dataset_utils/sequence_dataloader.py | 18 ++ .../src/dataset_utils/stream_dataloader.py | 18 ++ .../src/eva_engine/__init__.py | 18 ++ .../src/eva_engine/coordinator.py | 18 ++ .../src/eva_engine/phase1/__init__.py | 21 +- .../src/eva_engine/phase1/algo/__init__.py | 20 +- .../eva_engine/phase1/algo/prune_synflow.py | 18 ++ .../eva_engine/phase1/algo/singa_ms/README.md | 20 +- .../src/eva_engine/phase1/vote.py | 18 ++ .../src/eva_engine/phase2/__init__.py | 21 +- .../src/eva_engine/phase2/algo/__init__.py | 21 +- .../src/eva_engine/phase2/algo/trainer.py | 18 ++ .../src/eva_engine/phase2/run_sr.py | 18 ++ .../src/eva_engine/phase2/run_uniform.py | 18 +- .../ml/model_selection/src/logger/__init__.py | 18 ++ .../model_selection/src/query_api/README.md | 18 ++ .../model_selection/src/query_api/__init__.py | 21 +- .../src/query_api/img_explore_ea.py | 18 ++ .../src/query_api/img_train_baseline.py | 18 +- .../src/query_api/interface.py | 18 ++ .../src/query_api/query_api_img.py | 18 ++ .../src/query_api/query_api_mlp.py | 18 ++ .../src/query_api/singleton.py | 18 ++ .../src/search_space/__init__.py | 17 ++ .../src/search_space/core/__init__.py | 21 +- .../src/search_space/core/model_params.py | 18 ++ .../src/search_space/init_search_space.py | 18 ++ .../src/search_space/mlp_api/__init__.py | 21 +- .../src/search_space/mlp_api/model_params.py | 18 ++ .../src/search_space/mlp_api/rl_policy.py | 18 ++ .../src/search_space/mlp_api/space.py | 18 ++ .../src/search_space/utils/__init__.py | 20 +- .../model_selection/src/third_pkg/__init__.py | 20 +- .../src/third_pkg/darts_lib/__init__.py | 21 +- .../src/third_pkg/darts_lib/genotypes.py | 18 ++ .../src/third_pkg/darts_lib/model.py | 17 ++ .../src/third_pkg/darts_lib/util_convert.py | 17 ++ .../third_pkg/models/cell_infers/__init__.py | 5 - .../third_pkg/models/cell_searchs/__init__.py | 33 -- .../models/cell_searchs/genotypes.py | 280 ----------------- .../third_pkg/models/shape_infers/__init__.py | 9 - .../models/shape_infers/shared_utils.py | 5 - .../models/shape_searchs/__init__.py | 9 - .../src/third_pkg/sp101_lib/__init__.py | 21 +- .../src/third_pkg/sp101_lib/model_spec.py | 18 ++ .../src/third_pkg/sp101_lib/nb101_api.py | 24 +- .../src/third_pkg/sp201_lib/__init__.py | 42 --- .../ml/model_selection/src/tools/__init__.py | 19 +- .../ml/model_selection/src/tools/compute.py | 18 +- .../model_selection/src/tools/correlation.py | 18 ++ .../ml/model_selection/src/tools/io_tools.py | 18 ++ .../model_selection/src/tools/res_measure.py | 18 ++ .../ml/model_selection/src/tools/utils.py | 18 ++ .../internal/ml/model_slicing/.gitkeep | 0 .../internal/pg_extension/.gitignore | 6 - .../pg_extension/sql/filter_phase.sql | 21 +- .../pg_extension/sql/model_selection_cpu.sql | 21 +- .../sql/model_selection_cpu_workloads.sql | 21 +- .../pg_extension/sql/model_selection_dev.sql | 21 +- .../sql/model_selection_trails.sql | 21 +- .../sql/model_selection_trails_workloads.sql | 21 +- .../pg_extension/sql/pg_extension--0.1.0.sql | 21 ++ .../pg_extension/src/bindings/ml_register.rs | 21 ++ .../internal/pg_extension/src/bindings/mod.rs | 21 +- .../pg_extension/src/bindings/model.rs | 20 ++ .../internal/pg_extension/src/bindings/ms.rs | 21 ++ .../internal/pg_extension/src/lib.rs | 21 ++ .../internal/pg_extension/test/lib.rs | 21 ++ 142 files changed, 2322 insertions(+), 787 deletions(-) delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exp_result_singa/.gitkeep delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_slicing/.gitkeep delete mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore diff --git a/NOTICE b/NOTICE index 4c824f1a6..b3db801e3 100644 --- a/NOTICE +++ b/NOTICE @@ -30,3 +30,5 @@ developers of Apache SINGA under Apache License, Version 2.0. ./doc/_static/images/sgd.png ./doc/_static/images/singa.png ./doc/_static/images/singav1-sw.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174425377.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174945226.png diff --git a/examples/malaria_cnn/data/malaria.py b/examples/malaria_cnn/data/malaria.py index 9c0c1bcac..46422b739 100644 --- a/examples/malaria_cnn/data/malaria.py +++ b/examples/malaria_cnn/data/malaria.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + try: import pickle except ImportError: diff --git a/examples/malaria_cnn/model/cnn.py b/examples/malaria_cnn/model/cnn.py index 159604888..856adb7e7 100644 --- a/examples/malaria_cnn/model/cnn.py +++ b/examples/malaria_cnn/model/cnn.py @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# from singa import layer from singa import model @@ -74,4 +91,4 @@ def create_model(**kwargs): return model -__all__ = ['CNN', 'create_model'] \ No newline at end of file +__all__ = ['CNN', 'create_model'] diff --git a/examples/malaria_cnn/model/mlp.py b/examples/malaria_cnn/model/mlp.py index 502fad512..5f46bc321 100644 --- a/examples/malaria_cnn/model/mlp.py +++ b/examples/malaria_cnn/model/mlp.py @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# from singa import layer from singa import model @@ -65,4 +82,4 @@ def create_model(**kwargs): return model -__all__ = ['MLP', 'create_model'] \ No newline at end of file +__all__ = ['MLP', 'create_model'] diff --git a/examples/malaria_cnn/run.sh b/examples/malaria_cnn/run.sh index 6e7e2deb2..14718208b 100644 --- a/examples/malaria_cnn/run.sh +++ b/examples/malaria_cnn/run.sh @@ -1,2 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ### malaria dataset -python train_cnn.py cnn malaria -dir pathToDataset \ No newline at end of file +python train_cnn.py cnn malaria -dir pathToDataset diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile b/examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile index cd622e2d7..9a14cff85 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/Dockerfile @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md index cbc9749cf..31cbf703d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/README.md @@ -1,3 +1,22 @@ + + # Database-Native Model Selection ​ -- based on Singa diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md index abb283768..b2d0874eb 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md @@ -1,6 +1,20 @@ - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # Change the permission diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py index 7c6ce826e..87479a704 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/cache_service.py @@ -1,3 +1,22 @@ + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import time import threading import queue diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py index 45cecdf73..2631abeab 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/cache-service/trigger_cache_svc.py @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# import requests diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md index 9b9b7b563..3025139f1 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/README.md @@ -1,3 +1,22 @@ + + # TRAILS: A Database Native Model Selection System ![image-20230702035806963](documents/imgs/image-20230702035806963.png) diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini index 61bdf6cfc..e7235b1d4 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/config.ini @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + [DEFAULT] log_name = in_db_ms budget = 100 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py index 691e739ed..f3f5b4575 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/eva_service.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import calendar import os import time diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exp_result_singa/.gitkeep b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exp_result_singa/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md index 523566c42..2adc07d97 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/README.md @@ -1,3 +1,22 @@ + + # Folder description ## baseline diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py index 2e3e55431..7d4acb3e2 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_img_lib.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import os from matplotlib import pyplot as plt diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py index 146fd36ba..6c30cc06b 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/draw_tab_lib.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from typing import List import numpy as np diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py index eb0528b1b..9a19f007d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/0.train_one_model.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import calendar import json import os diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py index be66279a4..e515647ec 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_dist_online.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import argparse import calendar import json diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py index c36803a8d..cc1b44481 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/2.seq_train_online.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import calendar import json import os diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py index 64226d9b9..5d6c16ec0 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/4.seq_score_online.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import calendar import json import os diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py index bb11058e6..645f72f43 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_ecdf.py @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# import numpy as np import matplotlib diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py index 327b66577..0ff674823 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/exps/nas_bench_tabular/measure_param_auc.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import numpy as np import matplotlib import matplotlib.pyplot as plt diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py index 7b9e3f788..38357f304 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/main.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + # this is the main function of model selection. import calendar diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py index 9f9d1b4fe..98317c08a 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/pg_interface.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import calendar import os import time diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh index e54e823bc..aef381053 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_img_w_baseline.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh index 9811b467f..3bfb947d5 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/anytime_tab.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh index 52467c9b7..20d667917 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_img.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh index c1f6d1925..41a2d0056 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/baseline_system_tab.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh index 7b13ac8c1..d1c2db5b2 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/benchmark_weight_sharing.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh index b7555bbe7..dc7e0172f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/database/load_data_to_db.sh @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + #!/bin/bash # Check for proper number of command line args diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh index 29390b0bb..e9068a2bd 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh index 993e8a2a8..f7eb18954 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_embedding_cache_concurrent.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh index c7c6a0be4..65aabd3c8 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_cpu_gpu.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh index 608fd94b6..84406263d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase1_in_db.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh index 608fd94b6..84406263d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/latency_phase2.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh index 33e9b9de5..f91ae3ce1 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_budget_aware_alg.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh index ad392f625..6aec7c195 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_nku_tradeoff.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh index 1593cfe08..3e55e9e3d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_score_metrics_relation.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh index 4bdb01129..4b9f37566 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/micro_search_strategy.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh index 1c166f68f..8d71ff283 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/convert_api_2_json.sh @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh index d700c2baa..aea5ff9e7 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/explore_all_models.sh @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh index d4c18386b..1e7e9bf3b 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-img/score_all_models.sh @@ -1,5 +1,20 @@ - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh index fd1a9be75..004ecb1a6 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_criteo.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh index 80cc39e49..81d4ff12a 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_frappe.sh @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh index 9b910c1ac..99dfe0e4d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/score_all_modesl_uci.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh index 8c2583473..3d11671c8 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo.sh @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh index a0de85826..39e770124 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_criteo_distirbuted.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # frappe python exps/main_v2/ground_truth/2.seq_train_dist_online.py \ diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh index 4f4c099d0..397836405 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_diabetes.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh index 3ffd7bc64..8d4af9eac 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_all_models_frappe.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh index 5115e874b..86e36c2f5 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_one_model_dev.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh index ea7239169..a3ea08790 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_criteo.sh @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh index 661e6b944..697816e24 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/nas-bench-tabular/train_params_tune_diabetes.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh index 64b011c63..a54caf042 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/scripts/pre_processing/pre_processing_data.sh @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# export PYTHONPATH=$PYTHONPATH:./internal/ml/model_selection conda activate trails diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py index 673174997..f40ac15d6 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/shared_config.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import calendar import os import time diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py index 4d91cd366..36227ec38 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/constant.py @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# class CommonVars: diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py index cf8f30e9e..521f45f1e 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/common/structure.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import json diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py index 25e4ea30d..222757523 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/__init__.py @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# from src.common.constant import CommonVars from src.controller.sampler_ea.regularized_ea import RegularizedEASampler diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py index c3d4036dc..2770a72ee 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/controler.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import time from src.controller.core.sample import Sampler diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/__init__.py index e69de29bb..4e04c2b3b 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/__init__.py @@ -0,0 +1,17 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py index 78a6d86eb..77eeea32d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/metrics.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from enum import Enum, auto diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py index a4b304ce6..b48066925 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/core/sample.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from abc import abstractmethod from src.search_space.core.model_params import ModelMicroCfg diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_EA/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py index fd40910d9..01d705720 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_RL/__init__.py @@ -1,4 +1,18 @@ - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py index 0dfdc5e07..4eaf04ff3 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_all/seq_sampler.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import random from src.controller.core.sample import Sampler diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py deleted file mode 100644 index 97266f6ef..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_bohb/bohb_or.py +++ /dev/null @@ -1,285 +0,0 @@ -################################################## -# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2020 # -################################################################### -# BOHB: Robust and Efficient Hyperparameter Optimization at Scale # -# required to install hpbandster ################################## -# pip install hpbandster ################################## -################################################################### -# OMP_NUM_THREADS=4 python exps/NATS-algos/bohb.py --search_space tss --dataset cifar10 --num_samples 4 --random_fraction 0.0 --bandwidth_factor 3 --rand_seed 1 -# OMP_NUM_THREADS=4 python exps/NATS-algos/bohb.py --search_space sss --dataset cifar10 --num_samples 4 --random_fraction 0.0 --bandwidth_factor 3 --rand_seed 1 -################################################################### -import os, sys, time, random, argparse, collections -from copy import deepcopy - -from src.tools.env_tools import prepare_seed -from src.logger import logger - -from models import CellStructure, get_search_spaces - -# BOHB: Robust and Efficient Hyperparameter Optimization at Scale, ICML 2018 -import ConfigSpace -from hpbandster.optimizers.bohb import BOHB -import hpbandster.core.nameserver as hpns -from hpbandster.core.worker import Worker - -from nats_bench import create - - -def time_string(): - ISOTIMEFORMAT = "%Y-%m-%d %X" - string = "[{:}]".format(time.strftime(ISOTIMEFORMAT, time.gmtime(time.time()))) - return string - - -def get_topology_config_space(search_space, max_nodes=4): - cs = ConfigSpace.ConfigurationSpace() - # edge2index = {} - for i in range(1, max_nodes): - for j in range(i): - node_str = "{:}<-{:}".format(i, j) - cs.add_hyperparameter( - ConfigSpace.CategoricalHyperparameter(node_str, search_space) - ) - return cs - - -def get_size_config_space(search_space): - cs = ConfigSpace.ConfigurationSpace() - for ilayer in range(search_space["numbers"]): - node_str = "layer-{:}".format(ilayer) - cs.add_hyperparameter( - ConfigSpace.CategoricalHyperparameter(node_str, search_space["candidates"]) - ) - return cs - - -def config2topology_func(max_nodes=4): - def config2structure(config): - genotypes = [] - for i in range(1, max_nodes): - xlist = [] - for j in range(i): - node_str = "{:}<-{:}".format(i, j) - op_name = config[node_str] - xlist.append((op_name, j)) - genotypes.append(tuple(xlist)) - return CellStructure(genotypes) - - return config2structure - - -def config2size_func(search_space): - def config2structure(config): - channels = [] - for ilayer in range(search_space["numbers"]): - node_str = "layer-{:}".format(ilayer) - channels.append(str(config[node_str])) - return ":".join(channels) - - return config2structure - - -class MyWorker(Worker): - def __init__(self, *args, convert_func=None, dataset=None, api=None, **kwargs): - super().__init__(*args, **kwargs) - self.convert_func = convert_func - self._dataset = dataset - self._api = api - self.total_times = [] - self.trajectory = [] - - def compute(self, config, budget, **kwargs): - arch = self.convert_func(config) - accuracy, latency, time_cost, total_time = self._api.simulate_train_eval( - arch, self._dataset, iepoch=int(budget) - 1, hp="12" - ) - self.trajectory.append((accuracy, arch)) - self.total_times.append(total_time) - return {"loss": 100 - accuracy, "info": self._api.query_index_by_arch(arch)} - - -def main(xargs, api): - import torch - torch.set_num_threads(4) - prepare_seed(xargs.rand_seed) - - logger.info("{:} use api : {:}".format(time_string(), api)) - api.reset_time() - search_space = get_search_spaces(xargs.search_space, "nats-bench") - if xargs.search_space == "tss": - cs = get_topology_config_space(search_space) - config2structure = config2topology_func() - else: - cs = get_size_config_space(search_space) - config2structure = config2size_func(search_space) - - hb_run_id = "0" - - NS = hpns.NameServer(run_id=hb_run_id, host="localhost", port=0) - ns_host, ns_port = NS.start() - num_workers = 1 - - workers = [] - for i in range(num_workers): - w = MyWorker( - nameserver=ns_host, - nameserver_port=ns_port, - convert_func=config2structure, - dataset=xargs.dataset, - api=api, - run_id=hb_run_id, - id=i, - ) - w.run(background=True) - workers.append(w) - - start_time = time.time() - bohb = BOHB( - configspace=cs, - run_id=hb_run_id, - eta=3, - min_budget=1, - max_budget=12, - nameserver=ns_host, - nameserver_port=ns_port, - num_samples=xargs.num_samples, - random_fraction=xargs.random_fraction, - bandwidth_factor=xargs.bandwidth_factor, - ping_interval=10, - min_bandwidth=xargs.min_bandwidth, - ) - - results = run(xargs.n_iters, min_n_workers=num_workers) - - bohb.shutdown(shutdown_workers=True) - NS.shutdown() - - # print('There are {:} runs.'.format(len(results.get_all_runs()))) - # workers[0].total_times - # workers[0].trajectory - current_best_index = [] - for idx in range(len(workers[0].trajectory)): - trajectory = workers[0].trajectory[: idx + 1] - arch = max(trajectory, key=lambda x: x[0])[1] - current_best_index.append(api.query_index_by_arch(arch)) - - best_arch = max(workers[0].trajectory, key=lambda x: x[0])[1] - logger.log( - "Best found configuration: {:} within {:.3f} s".format( - best_arch, workers[0].total_times[-1] - ) - ) - info = api.query_info_str_by_arch( - best_arch, "200" if xargs.search_space == "tss" else "90" - ) - logger.log("{:}".format(info)) - logger.log("-" * 100) - logger.close() - - return logger.log_dir, current_best_index, workers[0].total_times - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - "BOHB: Robust and Efficient Hyperparameter Optimization at Scale" - ) - parser.add_argument( - "--dataset", - default="cifar10", - type=str, - choices=["cifar10", "cifar100", "ImageNet16-120"], - help="Choose between Cifar10/100 and ImageNet-16.", - ) - # general arg - parser.add_argument( - "--search_space", - default="tss", - type=str, - choices=["tss", "sss"], - help="Choose the search space.", - ) - parser.add_argument( - "--time_budget", - type=int, - default=20000, - help="The total time cost budge for searching (in seconds).", - ) - parser.add_argument( - "--loops_if_rand", type=int, default=500, help="The total runs for evaluation." - ) - # BOHB - parser.add_argument( - "--strategy", - default="sampling", - type=str, - nargs="?", - help="optimization strategy for the acquisition function", - ) - parser.add_argument( - "--min_bandwidth", - default=0.3, - type=float, - nargs="?", - help="minimum bandwidth for KDE", - ) - parser.add_argument( - "--num_samples", - default=64, - type=int, - nargs="?", - help="number of samples for the acquisition function", - ) - parser.add_argument( - "--random_fraction", - default=0.33, - type=float, - nargs="?", - help="fraction of random configurations", - ) - parser.add_argument( - "--bandwidth_factor", - default=3, - type=int, - nargs="?", - help="factor multiplied to the bandwidth", - ) - parser.add_argument( - "--n_iters", - default=300, - type=int, - nargs="?", - help="number of iterations for optimization method", - ) - # log - parser.add_argument( - "--save_dir", - type=str, - default="./output/search", - help="Folder to save checkpoints and log.", - ) - parser.add_argument("--rand_seed", type=int, default=-1, help="manual seed") - args = parser.parse_args() - - api = create(None, args.search_space, fast_mode=False, verbose=False) - - args.save_dir = os.path.join( - "{:}-{:}".format(args.save_dir, args.search_space), - "{:}-T{:}".format(args.dataset, args.time_budget), - "BOHB", - ) - print("save-dir : {:}".format(args.save_dir)) - - import torch - if args.rand_seed < 0: - save_dir, all_info = None, collections.OrderedDict() - for i in range(args.loops_if_rand): - print("{:} : {:03d}/{:03d}".format(time_string(), i, args.loops_if_rand)) - args.rand_seed = random.randint(1, 100000) - save_dir, all_archs, all_total_times = main(args, api) - all_info[i] = {"all_archs": all_archs, "all_total_times": all_total_times} - save_path = save_dir / "results.pth" - print("save into {:}".format(save_path)) - torch.save(all_info, save_path) - else: - main(args, api) - diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py index d8a862a1f..62126bef6 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_ea/regularized_ea.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import collections from src.search_space.core.model_params import ModelMicroCfg from src.controller.core.sample import Sampler diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py index fb927cf3e..8c3125446 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rand/random_sample.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from src.controller.core.sample import Sampler from src.search_space.core.space import SpaceWrapper from src.search_space.core.model_params import ModelMicroCfg diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py index bdd49e375..a65eed36e 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/controller/sampler_rl/reinforcement_learning.py @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# from src.controller.core.sample import Sampler from src.search_space.core.space import SpaceWrapper diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py index 139597f9c..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/__init__.py @@ -1,2 +1,17 @@ - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py index 418a71f83..19989db39 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/download_critero_and_avazu.py @@ -1,4 +1,21 @@ -# adapted from AFN-AAAI-20 +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import os import zipfile import urllib.request diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py index 4bb494c96..9a6587e9e 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/sequence_dataloader.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import queue import threading import requests diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py index 3c2abe7a3..f39499f33 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/dataset_utils/stream_dataloader.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import queue import threading import requests diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py index ca0cf5344..e5ddb1e19 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/__init__.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from src.common.constant import * from src.eva_engine.phase1.algo.prune_synflow import SynFlowEvaluator diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py index 331aec57a..8142a5cd6 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/coordinator.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from src.common.constant import Config from src.eva_engine.phase2.run_sh import BudgetAwareControllerSH from src.logger import logger diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py index fd40910d9..01d705720 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/__init__.py @@ -1,4 +1,18 @@ - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py index 8f3373c44..1c671febd 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/prune_synflow.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from src.eva_engine.phase1.algo.alg_base import Evaluator from src.common.constant import Config diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md index 90e0d8e17..b7c96e884 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/algo/singa_ms/README.md @@ -1,2 +1,18 @@ -(1) copy cnn_ms/pkg_model_code/model.py to ~/miniconda3/lib/python3.6/site-packages/singa/model.py -(2) enter cnn_ms/ and run "python train_ms_model.py ms_model_mlp mnist" + diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py index 35dfb9d6f..1f1ee1f39 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase1/vote.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from src.eva_engine.phase1.algo.alg_base import Evaluator from .utils.autograd_hacks import * from src.common.constant import Config diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py index 39ddf2d7e..259ebea6d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/algo/trainer.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import time from src.tools import utils diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py index d723fe7b1..e5610c89c 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_sr.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from copy import copy from src.common.constant import Config diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py index c770c4280..02c9b8e70 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/eva_engine/phase2/run_uniform.py @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# from copy import copy from random import randint diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py index 8d2e16d4e..29d916802 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/logger/__init__.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import logging import os diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md index a22a70e9a..568528670 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/README.md @@ -1,2 +1,20 @@ + This is used to parse the local json file which is the result of the all experiments \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py index 1b074a1e7..b03299774 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_explore_ea.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import json import os import sqlite3 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py index 54848af6f..7b8150516 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/img_train_baseline.py @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# import os import numpy as np diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py index 20cccabe9..d2d335cee 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/interface.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + # query ground truth from src.common.constant import Config, CommonVars from src.query_api.query_api_img import Gt201, Gt101 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py index 87b466e6b..dd3f4ca9c 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_img.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import os import random from src.common.constant import Config diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py index 08854c5f8..affeacaa4 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/query_api_mlp.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import os from src.common.constant import Config from src.tools.compute import generate_global_rank diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py index eab587122..24814b119 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/query_api/singleton.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import threading diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/__init__.py index e69de29bb..4e04c2b3b 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/__init__.py @@ -0,0 +1,17 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# \ No newline at end of file diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py index b3f2150e8..811bf71c7 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/core/model_params.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + class ModelMacroCfg: """ Macro search space config diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py index 037ca12e7..8d46ebdbd 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/init_search_space.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import os from src.common.constant import Config from src.search_space.core.space import SpaceWrapper diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py index 2c6b9482d..7edf35e1d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/model_params.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from src.search_space.core.model_params import ModelMacroCfg diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py index 207773d05..e3372525d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/rl_policy.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from src.search_space.core.rl_policy import RLPolicyBase diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py index 6668c0265..8336750ae 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/mlp_api/space.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import copy import itertools import random diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py index fd40910d9..01d705720 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/search_space/utils/__init__.py @@ -1,4 +1,18 @@ - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py index fd40910d9..01d705720 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/__init__.py @@ -1,4 +1,18 @@ - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py index 6b53055cb..fa9400186 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/genotypes.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from collections import namedtuple diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py index 02081a6b8..f8be9a9dd 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/model.py @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# from operations import * from .utils import drop_path diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py index bd4f2ddf0..fee590530 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/darts_lib/util_convert.py @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# from scipy.special import softmax from .genotypes import * diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py deleted file mode 100644 index ac1a183d9..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_infers/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -##################################################### -# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019.01 # -##################################################### -from .tiny_network import TinyNetwork -from .nasnet_cifar import NASNetonCIFAR diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py deleted file mode 100644 index 0d770cb80..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -################################################## -# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019 # -################################################## -# The macro structure is defined in NAS-Bench-201 -from .search_model_darts import TinyNetworkDarts -from .search_model_gdas import TinyNetworkGDAS -from .search_model_setn import TinyNetworkSETN -from .search_model_enas import TinyNetworkENAS -from .search_model_random import TinyNetworkRANDOM -from .generic_model import GenericNAS201Model -from .genotypes import Structure as CellStructure, architectures as CellArchitectures - -# NASNet-based macro structure -from .search_model_gdas_nasnet import NASNetworkGDAS -from .search_model_gdas_frc_nasnet import NASNetworkGDAS_FRC -from .search_model_darts_nasnet import NASNetworkDARTS - - -nas201_super_nets = { - "DARTS-V1": TinyNetworkDarts, - "DARTS-V2": TinyNetworkDarts, - "GDAS": TinyNetworkGDAS, - "SETN": TinyNetworkSETN, - "ENAS": TinyNetworkENAS, - "RANDOM": TinyNetworkRANDOM, - "generic": GenericNAS201Model, -} - -nasnet_super_nets = { - "GDAS": NASNetworkGDAS, - "GDAS_FRC": NASNetworkGDAS_FRC, - "DARTS": NASNetworkDARTS, -} diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py deleted file mode 100644 index eaf085470..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/cell_searchs/genotypes.py +++ /dev/null @@ -1,280 +0,0 @@ -################################################## -# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019 # -################################################## -from copy import deepcopy - - -def get_combination(space, num): - combs = [] - for i in range(num): - if i == 0: - for func in space: - combs.append([(func, i)]) - else: - new_combs = [] - for string in combs: - for func in space: - xstring = string + [(func, i)] - new_combs.append(xstring) - combs = new_combs - return combs - - -class Structure: - def __init__(self, genotype): - assert isinstance(genotype, list) or isinstance( - genotype, tuple - ), "invalid class of genotype : {:}".format(type(genotype)) - self.node_num = len(genotype) + 1 - self.nodes = [] - self.node_N = [] - for idx, node_info in enumerate(genotype): - assert isinstance(node_info, list) or isinstance( - node_info, tuple - ), "invalid class of node_info : {:}".format(type(node_info)) - assert len(node_info) >= 1, "invalid length : {:}".format(len(node_info)) - for node_in in node_info: - assert isinstance(node_in, list) or isinstance( - node_in, tuple - ), "invalid class of in-node : {:}".format(type(node_in)) - assert ( - len(node_in) == 2 and node_in[1] <= idx - ), "invalid in-node : {:}".format(node_in) - self.node_N.append(len(node_info)) - self.nodes.append(tuple(deepcopy(node_info))) - - def tolist(self, remove_str): - # convert this class to the list, if remove_str is 'none', then remove the 'none' operation. - # note that we re-order the input node in this function - # return the-genotype-list and success [if unsuccess, it is not a connectivity] - genotypes = [] - for node_info in self.nodes: - node_info = list(node_info) - node_info = sorted(node_info, key=lambda x: (x[1], x[0])) - node_info = tuple(filter(lambda x: x[0] != remove_str, node_info)) - if len(node_info) == 0: - return None, False - genotypes.append(node_info) - return genotypes, True - - def node(self, index): - assert index > 0 and index <= len(self), "invalid index={:} < {:}".format( - index, len(self) - ) - return self.nodes[index] - - def tostr(self): - strings = [] - for node_info in self.nodes: - string = "|".join([x[0] + "~{:}".format(x[1]) for x in node_info]) - string = "|{:}|".format(string) - strings.append(string) - return "+".join(strings) - - def check_valid(self): - nodes = {0: True} - for i, node_info in enumerate(self.nodes): - sums = [] - for op, xin in node_info: - if op == "none" or nodes[xin] is False: - x = False - else: - x = True - sums.append(x) - nodes[i + 1] = sum(sums) > 0 - return nodes[len(self.nodes)] - - def to_unique_str(self, consider_zero=False): - # this is used to identify the isomorphic cell, which rerquires the prior knowledge of operation - # two operations are special, i.e., none and skip_connect - nodes = {0: "0"} - for i_node, node_info in enumerate(self.nodes): - cur_node = [] - for op, xin in node_info: - if consider_zero is None: - x = "(" + nodes[xin] + ")" + "@{:}".format(op) - elif consider_zero: - if op == "none" or nodes[xin] == "#": - x = "#" # zero - elif op == "skip_connect": - x = nodes[xin] - else: - x = "(" + nodes[xin] + ")" + "@{:}".format(op) - else: - if op == "skip_connect": - x = nodes[xin] - else: - x = "(" + nodes[xin] + ")" + "@{:}".format(op) - cur_node.append(x) - nodes[i_node + 1] = "+".join(sorted(cur_node)) - return nodes[len(self.nodes)] - - def check_valid_op(self, op_names): - for node_info in self.nodes: - for inode_edge in node_info: - # assert inode_edge[0] in op_names, 'invalid op-name : {:}'.format(inode_edge[0]) - if inode_edge[0] not in op_names: - return False - return True - - def __repr__(self): - return "{name}({node_num} nodes with {node_info})".format( - name=self.__class__.__name__, node_info=self.tostr(), **self.__dict__ - ) - - def __len__(self): - return len(self.nodes) + 1 - - def __getitem__(self, index): - return self.nodes[index] - - @staticmethod - def str2structure(xstr): - if isinstance(xstr, Structure): - return xstr - assert isinstance(xstr, str), "must take string (not {:}) as input".format( - type(xstr) - ) - nodestrs = xstr.split("+") - genotypes = [] - for i, node_str in enumerate(nodestrs): - inputs = list(filter(lambda x: x != "", node_str.split("|"))) - for xinput in inputs: - assert len(xinput.split("~")) == 2, "invalid input length : {:}".format( - xinput - ) - inputs = (xi.split("~") for xi in inputs) - input_infos = tuple((op, int(IDX)) for (op, IDX) in inputs) - genotypes.append(input_infos) - return Structure(genotypes) - - @staticmethod - def str2fullstructure(xstr, default_name="none"): - assert isinstance(xstr, str), "must take string (not {:}) as input".format( - type(xstr) - ) - nodestrs = xstr.split("+") - genotypes = [] - for i, node_str in enumerate(nodestrs): - inputs = list(filter(lambda x: x != "", node_str.split("|"))) - for xinput in inputs: - assert len(xinput.split("~")) == 2, "invalid input length : {:}".format( - xinput - ) - inputs = (xi.split("~") for xi in inputs) - input_infos = list((op, int(IDX)) for (op, IDX) in inputs) - all_in_nodes = list(x[1] for x in input_infos) - for j in range(i): - if j not in all_in_nodes: - input_infos.append((default_name, j)) - node_info = sorted(input_infos, key=lambda x: (x[1], x[0])) - genotypes.append(tuple(node_info)) - return Structure(genotypes) - - @staticmethod - def gen_all(search_space, num, return_ori): - assert isinstance(search_space, list) or isinstance( - search_space, tuple - ), "invalid class of search-space : {:}".format(type(search_space)) - assert ( - num >= 2 - ), "There should be at least two nodes in a neural cell instead of {:}".format( - num - ) - all_archs = get_combination(search_space, 1) - for i, arch in enumerate(all_archs): - all_archs[i] = [tuple(arch)] - - for inode in range(2, num): - cur_nodes = get_combination(search_space, inode) - new_all_archs = [] - for previous_arch in all_archs: - for cur_node in cur_nodes: - new_all_archs.append(previous_arch + [tuple(cur_node)]) - all_archs = new_all_archs - if return_ori: - return all_archs - else: - return [Structure(x) for x in all_archs] - - -class Struct101(Structure): - def __init__(self, arch_id, genotype): - super().__init__(genotype) - self.arch_id = arch_id - - -ResNet_CODE = Structure( - [ - (("nor_conv_3x3", 0),), # node-1 - (("nor_conv_3x3", 1),), # node-2 - (("skip_connect", 0), ("skip_connect", 2)), - ] # node-3 -) - -AllConv3x3_CODE = Structure( - [ - (("nor_conv_3x3", 0),), # node-1 - (("nor_conv_3x3", 0), ("nor_conv_3x3", 1)), # node-2 - (("nor_conv_3x3", 0), ("nor_conv_3x3", 1), ("nor_conv_3x3", 2)), - ] # node-3 -) - -AllFull_CODE = Structure( - [ - ( - ("skip_connect", 0), - ("nor_conv_1x1", 0), - ("nor_conv_3x3", 0), - ("avg_pool_3x3", 0), - ), # node-1 - ( - ("skip_connect", 0), - ("nor_conv_1x1", 0), - ("nor_conv_3x3", 0), - ("avg_pool_3x3", 0), - ("skip_connect", 1), - ("nor_conv_1x1", 1), - ("nor_conv_3x3", 1), - ("avg_pool_3x3", 1), - ), # node-2 - ( - ("skip_connect", 0), - ("nor_conv_1x1", 0), - ("nor_conv_3x3", 0), - ("avg_pool_3x3", 0), - ("skip_connect", 1), - ("nor_conv_1x1", 1), - ("nor_conv_3x3", 1), - ("avg_pool_3x3", 1), - ("skip_connect", 2), - ("nor_conv_1x1", 2), - ("nor_conv_3x3", 2), - ("avg_pool_3x3", 2), - ), - ] # node-3 -) - -AllConv1x1_CODE = Structure( - [ - (("nor_conv_1x1", 0),), # node-1 - (("nor_conv_1x1", 0), ("nor_conv_1x1", 1)), # node-2 - (("nor_conv_1x1", 0), ("nor_conv_1x1", 1), ("nor_conv_1x1", 2)), - ] # node-3 -) - -AllIdentity_CODE = Structure( - [ - (("skip_connect", 0),), # node-1 - (("skip_connect", 0), ("skip_connect", 1)), # node-2 - (("skip_connect", 0), ("skip_connect", 1), ("skip_connect", 2)), - ] # node-3 -) - -architectures = { - "resnet": ResNet_CODE, - "all_c3x3": AllConv3x3_CODE, - "all_c1x1": AllConv1x1_CODE, - "all_idnt": AllIdentity_CODE, - "all_full": AllFull_CODE, -} diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py deleted file mode 100644 index 9c305ffda..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -##################################################### -# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019.01 # -##################################################### -from .InferCifarResNet_width import InferWidthCifarResNet -from .InferImagenetResNet import InferImagenetResNet -from .InferCifarResNet_depth import InferDepthCifarResNet -from .InferCifarResNet import InferCifarResNet -from .InferMobileNetV2 import InferMobileNetV2 -from .InferTinyCellNet import DynamicShapeTinyNet diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py deleted file mode 100644 index 86ab94924..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_infers/shared_utils.py +++ /dev/null @@ -1,5 +0,0 @@ -def parse_channel_info(xstring): - blocks = xstring.split(" ") - blocks = [x.split("-") for x in blocks] - blocks = [[int(_) for _ in x] for x in blocks] - return blocks diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py deleted file mode 100644 index 15e226087..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/models/shape_searchs/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -################################################## -# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019 # -################################################## -from .SearchCifarResNet_width import SearchWidthCifarResNet -from .SearchCifarResNet_depth import SearchDepthCifarResNet -from .SearchCifarResNet import SearchShapeCifarResNet -from .SearchSimResNet_width import SearchWidthSimResNet -from .SearchImagenetResNet import SearchShapeImagenetResNet -from .generic_size_tiny_cell_model import GenericNAS301Model diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py index fd40910d9..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/__init__.py @@ -1,4 +1,17 @@ - - - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py index 5713fb584..5d5992119 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/model_spec.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import copy import hashlib import itertools diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py index a0a09f053..0990d13ce 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp101_lib/nb101_api.py @@ -1,7 +1,23 @@ - - - -"""This is a NAS-Bench-101 version which is tensorflow independent. +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +"""This is a NAS-Bench-101 version. Before using this API, download the data files from the links in the README. diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py deleted file mode 100644 index 15d694009..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/third_pkg/sp201_lib/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -##################################################### -# Copyright (c) Xuanyi Dong [GitHub D-X-Y], 2019.08 # -##################################################### -from .api_utils import ArchResults, ResultsCount -from .api_201 import NASBench201API - -# NAS_BENCH_201_API_VERSION="v1.1" # [2020.02.25] -# NAS_BENCH_201_API_VERSION="v1.2" # [2020.03.09] -# NAS_BENCH_201_API_VERSION="v1.3" # [2020.03.16] -NAS_BENCH_201_API_VERSION="v2.0" # [2020.06.30] - - -def test_api(path): - """This is used to test the API of NAS-Bench-201.""" - api = NASBench201API(path) - num = len(api) - for i, arch_str in enumerate(api): - print ('{:5d}/{:5d} : {:}'.format(i, len(api), arch_str)) - indexes = [1, 2, 11, 301] - for index in indexes: - print('\n--- index={:} ---'.format(index)) - api.show(index) - # show the mean loss and accuracy of an architecture - info = api.query_meta_info_by_index(index) # This is an instance of `ArchResults` - res_metrics = info.get_metrics('cifar10', 'train') # This is a dict with metric names as keys - cost_metrics = info.get_compute_costs('cifar100') # This is a dict with metric names as keys, e.g., flops, params, latency - - # get the detailed information - results = api.query_by_index(index, 'cifar100') # a dict of all trials for 1st net on cifar100, where the key is the seed - print ('There are {:} trials for this architecture [{:}] on cifar100'.format(len(results), api[1])) - for seed, result in results.items(): - print ('Latency : {:}'.format(result.get_latency())) - print ('Train Info : {:}'.format(result.get_train())) - print ('Valid Info : {:}'.format(result.get_eval('x-valid'))) - print ('Test Info : {:}'.format(result.get_eval('x-test'))) - # for the metric after a specific epoch - print ('Train Info [10-th epoch] : {:}'.format(result.get_train(10))) - config = api.get_net_config(index, 'cifar10') - print ('config={:}'.format(config)) - index = api.query_index_by_arch('|nor_conv_3x3~0|+|nor_conv_3x3~0|avg_pool_3x3~1|+|skip_connect~0|nor_conv_3x3~1|skip_connect~2|') - api.show(index) - print('TEST NAS-BENCH-201 DONE.') diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py index 139597f9c..3df60b02f 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/__init__.py @@ -1,2 +1,17 @@ - - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py index 98169c985..0400ef546 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/compute.py @@ -1,4 +1,20 @@ - +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# # for binary insert from typing import List diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py index 038a59387..eb227f5c3 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/correlation.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + from scipy import stats from src.common.constant import CommonVars import numpy as np diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py index 09cb8d9e6..e657b9e04 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/io_tools.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import json import pickle import os.path diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py index ffec80cd4..93270ae31 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/res_measure.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import os import psutil import gpustat diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py index 70acf26a7..8e4232caa 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/src/tools/utils.py @@ -1,3 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + import math import os import random diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_slicing/.gitkeep b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_slicing/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore deleted file mode 100644 index 3906c3324..000000000 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.DS_Store -.idea/ -/target -*.iml -**/*.rs.bk -Cargo.lock diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql index 173999b43..0fbfc05ae 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/filter_phase.sql @@ -1,4 +1,23 @@ - +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ CREATE OR REPLACE PROCEDURE model_selection_sp( diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql index 366d88d6d..bcbf5c0fc 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu.sql @@ -1,4 +1,23 @@ - +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ CREATE OR REPLACE PROCEDURE model_selection_end2end( diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql index 835c627d9..882be67f4 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_cpu_workloads.sql @@ -1,4 +1,23 @@ - +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ CREATE OR REPLACE PROCEDURE model_selection_workloads( diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql index 12a4fdd4c..6a7297547 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_dev.sql @@ -1,4 +1,23 @@ - +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ CREATE OR REPLACE PROCEDURE model_selection_sp( diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql index 24cbd6078..3d91da501 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails.sql @@ -1,4 +1,23 @@ - +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ CREATE OR REPLACE PROCEDURE model_selection_end2end( diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql index 89c0db153..aaf62c63d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/model_selection_trails_workloads.sql @@ -1,4 +1,23 @@ - +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ CREATE OR REPLACE PROCEDURE model_selection_workloads( diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql index c096c0031..434082d9d 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/sql/pg_extension--0.1.0.sql @@ -1,3 +1,24 @@ +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ + /* This file is auto generated by pgrx. diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs index d10720301..5ca539653 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ml_register.rs @@ -1,3 +1,24 @@ +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ + use log::error; use once_cell::sync::Lazy; use pyo3::prelude::*; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs index 70be9ec7e..4e976d605 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/mod.rs @@ -1,4 +1,23 @@ - +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ #[cfg(feature = "python")] pub mod ms; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs index af09a5c82..61268fea4 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/model.rs @@ -1,3 +1,23 @@ +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ use serde::{Serialize, Deserialize}; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs index 21fb5f65c..ca946aa09 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/bindings/ms.rs @@ -1,3 +1,24 @@ +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ + use serde_json::json; use std::collections::HashMap; use pgrx::prelude::*; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs index cb99ed832..5ff49a708 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/src/lib.rs @@ -1,3 +1,24 @@ +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ + use pgrx::prelude::*; pgrx::pg_module_magic!(); use serde_json::json; diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/test/lib.rs b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/test/lib.rs index e69de29bb..bb91c2981 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/test/lib.rs +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/pg_extension/test/lib.rs @@ -0,0 +1,21 @@ +/************************************************************ +* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +* +*************************************************************/ + From b25cd9226997af41b6070f521aca745e4e8ce3b3 Mon Sep 17 00:00:00 2001 From: zmeihui Date: Wed, 25 Oct 2023 17:27:52 +0800 Subject: [PATCH 45/45] Add the release notes for v4.1.0 --- NOTICE | 11 ++++++ RELEASE_NOTES | 37 ++++++++++++++++++ .../documents/dev_guide.md | 35 +++++++++-------- .../imgs/image-20230421214835152.png | Bin 0 -> 334613 bytes .../imgs/image-20230421220338391.png | Bin 0 -> 198916 bytes .../imgs/image-20230421220443231.png | Bin 0 -> 163980 bytes .../imgs/image-20230702035554579.png | Bin 0 -> 284014 bytes .../imgs/image-20230702035622198.png | Bin 0 -> 108797 bytes .../imgs/image-20230702035639502.png | Bin 0 -> 79366 bytes .../imgs/image-20230702035806963.png | Bin 0 -> 151276 bytes .../imgs/image-20230722202555763.png | Bin 0 -> 149863 bytes .../imgs/image-20230722205244718.png | Bin 0 -> 230631 bytes .../imgs/image-20230724111325368.png | Bin 0 -> 202344 bytes .../imgs/image-20230724111659545.png | Bin 0 -> 164741 bytes 14 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421214835152.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220338391.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220443231.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035554579.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035622198.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035639502.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035806963.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230722202555763.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230722205244718.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111325368.png create mode 100644 examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111659545.png diff --git a/NOTICE b/NOTICE index b3db801e3..a94d16e65 100644 --- a/NOTICE +++ b/NOTICE @@ -32,3 +32,14 @@ developers of Apache SINGA under Apache License, Version 2.0. ./doc/_static/images/singav1-sw.png ./examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174425377.png ./examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/image-20231020174945226.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421214835152.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220338391.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220443231.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035554579.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035622198.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035639502.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035806963.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230722202555763.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230722205244718.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111325368.png +./examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111659545.png \ No newline at end of file diff --git a/RELEASE_NOTES b/RELEASE_NOTES index bbe67726a..7a1f0eab4 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -1,3 +1,40 @@ +Release Notes - SINGA - Version singa-4.1.0 + +SINGA is a distributed deep learning library. + +This release includes following changes: + + * New examples + * Add an example for malaria detection using cell images. + * Add an example for structured data learning. + + * Add support for models running on top of RDBMS + * Add support for in-database model definition and selection in RDBMS. + * Implement training-free model evaluation metrics for in-database model selection. + * Implement a coordinator to balance between training-free and training-based model evaluations + for in-database model selection. + + * Enhance distributed training + * Add implementations for the sum error loss. + * Improve the optimizer to return model gradients. + * Improve the iterative checking for tensors and strings in the ModelMeta class. + + * Enhance example code + * Add support for flexible setting of training configurations for models, e.g., learning rates, + weight decay, momentum, etc. + * Add implementations for dynamic models with varying layer sizes. + + * Update the website + * Add illustrations for database integration. + * Update users of Apache SINGA. + + * Fix bugs + * Update the NVIDIA_GPGKEY in the Dockerfile for building wheel files. + * Update the versions of dependencies in the wheel file. + * Fix the collections module in the model.py file. + +---------------------------------------------------------------------------------------------- + Release Notes - SINGA - Version singa-4.0.0 SINGA is a distributed deep learning library. diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md index b2d0874eb..3b0927a83 100644 --- a/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md +++ b/examples/model_selection/TRAILS-Database-Native-Model-Selection/documents/dev_guide.md @@ -1,20 +1,21 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# + # Change the permission diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421214835152.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421214835152.png new file mode 100644 index 0000000000000000000000000000000000000000..06a86f9537664b6a17eae2a77dc5ee5f2ffc822f GIT binary patch literal 334613 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

    gWJXf~Dv?A1wr6;z?HF(|0C_vy2x0*zC3Gr}c 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�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 C2tqCZ literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220338391.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220338391.png new file mode 100644 index 0000000000000000000000000000000000000000..dde2a761b39fb3c5a9506a27528d3d2ab0901563 GIT binary patch literal 198916 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

    q9&;f%RQd0npIKiRIT3>R4AsLiyZ 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ÿiZm>0% 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 literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220443231.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230421220443231.png new file mode 100644 index 0000000000000000000000000000000000000000..c94d59cfdfad019a132e472f9c28fd85f219d85d GIT binary patch literal 163980 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 P00000NkvXXu0mjf%bp&= literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035554579.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035554579.png new file mode 100644 index 0000000000000000000000000000000000000000..387f3ce49229b7ae9c837a7be3dd57a66d473c24 GIT binary patch literal 284014 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�VDrq~N&rMdnE6eFQbC--D_q3; z{iZs#*W)HXCLVOLjSVeX#sxf(0Nk+n|kw zDfQU!usX1FJkC_3*3Gtt)LRo(nJkN2<)P|2m@jm7*ex~6k?G#j{z^=GM2%z-W+ATN zcP3SB!VAE!({@jmYaK%GP>RvkcWvi7J<`H`Td;0`PPFx^ynT3i(FZR~4Xl>F zAwoA}tw2G98TEmWcJ$xtqC`;0w6?xR8=aoOXFNBinTf(1p8<5?vVhCwxIoEeG|_eG zolpocoGsVuF>;w$+LmrbsiL!fj!*RFTQNL5%zEIY4d9eY^r|z^4)a@e$#e$dJbTc2 zKhp~}yXV6Ao3&$jL`rLb?5z!>8u35_uRcv07ErBY^AwMYDF$5^ue9Nk+!%G0Cra&3 zKHGkEZ}~nf$R%6Y6tcyC2(YjQ>^6D~d44ML#-!jSu?jwd3!Mjvtpsb{BP3aOPr`B6 zCE2n!egj9Y1F40vl@2M%e1h7-YS(Ng^`?z3C*NhHQeH8%qcFg3_=D+m9yK@{6ES|3 z@_!l-f)(zs#mlsLjyx3J)W~ZUhNNZd4L1c7`^;X61U(zpZP( z`8Ztvrt+^eTJU;U`*Gk0)&4%VygvFsP>M6^={~PX#n3I2+=jGM!|-NRK7VU!Dk^+E zHRqdZ+ZUHJw2gR!pBWI-?1g}5h(e=(63y(Q%Q?8V1rW7Eb%4knm(~1Kf101R_2F# zP-8XYT4Ivn`D~A=k_3?O8Ok1q^Gw{GA-l`-FFMSL{@2}0KrM`2^tfdNCpJcJ< zTGE^P+9)43S7nY7A*O6iXk7Ws1L zds&0++18w3#qdg|lVnL^I}l~08Yn@H9xaK?nx+w^RtEm5roBFTvM$lqD z=Vj#X+w1GBplo|QUq5Mnzmb+yaR1hc+w`DlQ%(o(1Ao#kI-VLkst#0`DYYZ*mj90h z?V+3C5kD(lP_5TZGX2b|Y*{0Du+2xwQCTnJ-BpTK#_pJR_G^iQABzw&3wQ1}KsIFM zsiVcw6V?C~#Y!&DUmF<|M>(nqrrAiYB9~Cg<6tV_l&d_}Rg^Ar4pfXgy}ofX;sl80 zA{pj9RhZJr!@}&H2t*KvVjt@wKkk$=fAqkRg1)GFpkbOxAlv+il92_l@}l{$;Ec$(Yf;bRz=vdA+(>{@%>hH~q1*%K<@vZ!1dZp26~aDKlOS zfdVZ@J*#^6MPHpDLFh!D^?sOqtad-YA4^NK0pz8?%960{l=H)T;Tw%O)+-pUK)MZe zALc88fAsYH2lGey zv3DSSu@rJ0z;VGo`kB2n@g(3uK5q?Z1I%^G=m$mk8*9ur zM}GsbV<_DAt|-=h834%vF@gm&}J|^X$LM zcV!=Gs>&4IN8vcHTHlRwz7zN;0mS}ir5*kOLH}fqiNns_RhX{_lZQMNg z$CmZJW6PeP∨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

    jr%u~;5Y9SgA62jI@e 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%0A0j}$k{){0{Bl{Kg2 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%0Dw;jehvYS&$|X$aOfEd2~&700Si zmZTjxELBF#?8Y8k_y&mCRK*k>%f-=mpIVQ53mGh{q>N#83WV&EQbI_Jd*~%8;dqck zT{?C26bzIJaoUgN8GC2_;wwmTuT@`sBCSRM0mJ)~FH@E7BKE6z*_}R&1O)Qo?|83| zOHwNZ_bTug^!VI4VBbs7rTvTC_BDN#moba=O+z2ojhN$9#cBiK))N(oKB_z%0tb7Q zkBanS$IIH~J^>B(w(a^y?#cC(-4qkzA+{&jMqQW(Qb=*y!`Xgw^0)B{bgeQ8RsGTT zA%qCBy+%D;*`%1`ZHm=55>g9ZEs+ji8zHd@twMKDz_Rz}K+#(9^_A$@)1rq4G zMJgkc58`^#PQj3!@c!W3WJ<88NmOa1H@=%#Jqmfy6!SI{@zVO#m4ne8wAC#39soy9 zF@xjwD`Y<>`3x^Rxh(oQ3DsuVLEk0GE!x#68#l)Dot38QrIWK}2}Mz(C6*|E>*^6= zruFnl@zeL{E4~44oAt?W0-kdzeMT2-_hU zH!Sn{mz>@NYx%Um@yigxiAHsC#|Z=3T@e*stN=0(pJFtrZ@`a0f>0Tq^3U&_#FU*v zWtba1EXSw%b0^zQjXkj{ia|;yjeL?OOuw-AJ_W|_Di1O@Ju)3Nu%7hQh%`OHkqF_P z3p6G6B~yc1daHSs|HcySa)4)| z9k4&0PG!&E{YqMIZ{9ZIvQ@1#+^r46{4{!{o7n5^VNL4sY*18|gjseXt=IF1E9@8TI>E6Cr$ z&pFV(Ndrl+3iT8dBxEb&EDj6Cwwg}eK=GzfEQ@ZvI4-lF2F;n|0dtMbDfY=UE@R$Q ze6`Fkwzlyo&BUme2x%4=*c8#I1c9)DxM^#DT^5WAnp>Yag(ohO$ate23D`NrQL$m! z2mU=(&?qN_u(Eg$D*JeYh=>fA;3J5wr$>xln+3R3dVG>HOqvh9%37;z|F#|No3aBY z2oIEl4_*$RVmDu~TAtAjrYMEGEMTNe4^)HKKEEq+(ZhM13R)=q6Md3qYiq@zLNfT- z%r8^$s{8li(^&g6Y2>~$ZS2dk$(b8dH7#vnF9VVXTnpN6y&+`v@ZKd?&_Z5W-UX#D)?V1p$BWkJ_FTqB3th=0bh(UG|60e?R zj3>M~AQ)Lo#X@iZ*$UDuQaDT+` z__h$1vW;OW`WY{#Zz=oa*yl`rE#xWXQ~*o7`%-}k?)p?*icfpWQ=X$fnXg?XV6mNT z^r>Q%4^r8GLGms!^q(rs*G8+izcApS1@E)S7fIeN^CfO)djDYM-~WQ}9|%X!ktp>4 zOIRQZ{v0W{+f@bp_5I+#j{{8`{w6H&nEM3&3v90@LIxo^iMl6?{%vdNFK*uuxpVvP r6o8jNr1zKTvKgBH%2;?G)Aa{MTtA^NziZ;z6XZipNfTJ9U>fp2t15(w literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035622198.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035622198.png new file mode 100644 index 0000000000000000000000000000000000000000..c63e58598fe9918c8bd7a1fceed09a19d497f2d5 GIT binary patch literal 108797 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 jXza+ZEFi<{U2UyrZ=5g@)h9)q4 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 BUIhRE literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035639502.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035639502.png new file mode 100644 index 0000000000000000000000000000000000000000..0422e108b730cd56c3fcbc3bdb3e4b5f01957dbc GIT binary patch literal 79366 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

    HhXx2Bz@t*CDH90SL7N0SF3(SDYPfxn z;5VGDj|GiLl1bj7rO&-Ca}ApVYUb6q``fMO(X;Xfr>gu~^DuJeSwDSzSPcbMrg&UuP5EClU`*1kCfBl82_qIjwOGQOd>bBMXF_GcNcghU5 zQ4kJ6ut{H)xB`w|a4@D;?#p^DX&F?gl_~CcG6kVLbNX1&+^d8mgqjot4$11 zS84%6{oh@^>5#WrU_@KW`P(Sg34cRQ=9pLH8G9dJ(KOJRzgR^B=16uX7ZO%E({A*7r)5EDqxB@i zW*3^Gk|MS3KWEYP+FDv_uCAOZ$;o4Rk`cRIDAa|YxU47OQK4{LqcC)RD${e(Z>dAQ-C+Xq%KtGfkQ@FBVwd2Log|eTc#$Jcle!Wmyk-m_i}b3oiD9Pjr+5#~5*Hugj^)TPa2qT)~TDGDc;uXUMz>Vj{2p9iE7M zyB31IYj@qga{hO8GM1F<%^^!`bGdd!K0I0Mqfy|4X9l+|o)SEnyw`kF;W?1Q28H7+ za7m(8^ib_bRy0&AGi)Vb>=$@=bxX_C#>z!jNbcV6qm!F`e>B1U^?7LFs8m;Sx%Vs0 zKjE|q7D!Rf?irW375+GXc<3O>2sQSDgAn7C-b>K1u(01nJfRtf^x!|Dz>v_?I*Lm_ z8%Y$AdSyR8aR*|gurV3S<>b*AuFI*$vDzPd5)RqHJ2FBxy{K;y&084D+enW3Sfd=5ex;Deo{aZFk|Ts{AY0eeu71b)EQS1vs1 z;zjBNeh}H&J8JE<;|L?0k(<9xV6El$fFtkXdcBmP5fSjBn8;{WjwNHhqsa8|)KntE z!I;tU@$pwCeEf5|;b?q3J^p<`b8anFgo+N{1Wl^=RpL5R(^Bu`l0vomdjECGaWIrk zOGcywC3d3&%+Aiv_S-_5re|j-^Lir6ii_X;z=y-SOq#XSyLlf+gM(ISb8#0I>Pkvm zc1e)JIP$V5s`5M=CeuaZ!KlSQ_Ra`q`uEyLG|No#EH#iLE6R~tTmy0REd087aAsR3 zOO(f9At+_>8sxO%MC#?-@jQ`HQF(K7x}N?X=2uuT61-%xZH>;Wl|Y}Jk!*#}w^JoH zwv>w99oE%*9>B4u@R+;Nz(@C%%?}F0E0ngM;gkLr0z9U#*Vjl) z7h@94ax1ndRl18wpR3ixqcU*bteGBU0h)Rr&O!fE?_n7>-dYDqNzdyZp83F_poyH$ zq)}Xo!QldoElx>E8E7jW5GLlx%uEA100fN=Fj9A;1f_Q0i34L2qpRu0xw9BD!OYqZaJ8e ze#rJ-Q3DY(wIyyVJjX5f_^@$EJ()U@k*A`i^jIXTaHGRKYEsq~YCdRG4{=ng?dI|B z75cDgPErQHE3IMR!xgvx?d78)N7iS*=USV^k?)r{Wy+c#vb zQc_Ze64N8f`bP?{Him~e!6~)U{QO{-HYC?KY^TY|$z48S0`A*5kt`Tnuu!q{LAqzc z4o=B6N@r|1JJCIzEa9+_5J_nKfmz*+JL$K*{46RYrW0A=zG(sX)DFPu@TAeP-(l#i zhj6B@-gfeZXHwf%szGviV{2e|}8X(g*tAQQo;6*{KjCY{hPFWvH2gqvt^UXosYi-w$T1N?zvp1V7{Fd@DW$`hT|n z?tCtZpbpSYGVzD7%d%UT$aeiHV)vIbj5$gTkpn)G|`h=x1=HGH<^UplQ@q z=c9QM8|8?+Q^T6a18F?0`4vt84IXF}DOB%(m=FUdKk9>^kRf6!WW^rS7EE8xw=TFO z;d^X~A4z`^m$r%s7lkvL`G~^nV|DEpqVV*R{sE-0U+O& z@1-?)p$i8;HC5A1v5&+x;H5fcwKXZeEj|q0CaH`9G~B*si&GQInaY}~qn!>(cYb`W zQi?YlMWj^6uB^4E4Jrm$6qAqOx$XvRm>Il!j)0J`$Y{ZJK}fj0<951A^U-OrDG@lH z(Q&e~)>qtnb&5Op?Lbk}GeUTEq=)~ER8XoDel$E6*-$?wUj z&=2q6H3}2vfq&5-E4vydz7{oMH$6`4F`W<@kJfh&BOq`&chL4sgansf) z;3Hb|4xHq|*H$uE_&RL_Gy z-edI)6KcP`AMtLN6#LVKt@$FDE#QxrMU8MK66M!AhF%(_pbJQ*d#L?_?r;DNnD{ja z6w$>karb8E!7_tf;5Yb21iL04im}5vI#}xdNjV)O;(se4lH6DI95S_C2d% z<`b$~y|1$c}NW(VIoiab&=szAb`GxlIuZg1$Bz zNqC-&6W*j(bHQU4y)sPd*7Zi-$Ftqon{aWw6-I3tI5^0dtipw33*8Fkzbv41F{EG7 zIeh|MAISNf82e8_=9w=HIuW0!A5T%X#=|H8f=0s@P`~d!XJ*r&VUI3U1QloWk1jr$ zYVCYqGdUF^qw@Pc;_Z28akY6DCbI}@@Gd~S ziYj&hdN;^#%hBp{5;(6wPqcYC#9XDx2k;S~AkB|{>R!>KxF`{OkTWcVmb&5w!kKGL zB4nSqf1+M4aA>H^YbH6*Ph;IZi*I$5wfFN;ZRPAzN=W? z=FKpPN`w#%sBxgVIh}vCE1jbW3Lp#h4;7WQvo4Q9??l~8RVjVpU%%?d%4!8~OIsse zy>s}e%ST=~IoQZq=4gp|6~(*a#I@-^10KpCkpxV~)wdUB=SvnaGQXU)e>g`@C02hq zLhQJ`E-{p39zhqh%6jU#DE#lOPl2(t#N%p?++4B69%lt^$Ts$#rqEv309 zsB9Xo^(JKMba8#78bYTY)75iHE?f>K(QvSO$+Wq+oBS)^ zTjF)o$;tspRiag#MWk4y+3%PG>ID>9jDcW27RE7&D(Pf5`HNYd1umz0SvFKdgi#5CGZv#Z8_ z2yqARq^)hOKqmt}ANLc%Xn!pH=f40pEXidyS5m)saBKM5%{tHJ=I~a+Qy)@vDK=-+ zB%Fh=+E{X446z z*C`W~6F~WmugD*{@E8+$n&OtbG=Ek_vtSB{^})n z#iD7;Y8pYrmvo0JAsPc3)5l$3HYQ@Po06GtGh4~4XBw;K7C#yL9q}*_izfmv-$EJ( zwGo^FgD=^(b=mMNynbcyyt*2OZ%*4_o$L3QAW|b-9BqR*HYXN2Ik|mgph_icSs!XO z3{{{I{dDGW^QBmxeN~%RHB)+gNKR9dil}0jjqMP!_h~muy~bqAr#z9IaD*KHESXcq zxV}e3=ZYr?n-%xH_E$w&zhK}y)ZWUZ%t7Lt;}I{rDyHJ=1-$4emE7H4%~$0@N{7cq zq6*+G%R*H@V;o0o$IVoY>3R;vV3zSD0ur1-+m7&23{RH|SeN$pv@okkqW+i~-KogJ zfwJU_V0f);saD@{^9Gg{cW^TV*8K|udoG={+s=&G4$?n1nlJq8bP>U}|7Q}0;^M6J zik?$qPtKkF&h|ux|KH30le1o&SLlRVe3paAT#Cxlk2=<3(>dT}a z7aq7gtax`Qq`9iQ7AAJ7C#twx0eqNq_qvg&azJkfU6cAIQQ2BP&X?bgNn$hMy`!0Y zXl7au6Li3jD!}wvFYDtarXS>Z%?FypHq)Qr+kn{3g*ZBnuZ#{djz1F?so`CFT@q*MM&L+^a&tXVTwNv+F zr>2A)GQ3{?*P?G%{JcKxep2y_{Y6*^d&3Te7STLf%;9i6n_~aKM}DQLb?mO%>pqYI z?YAB`q}>sF^HJ3Qu_cq1{|$<#BL$8q_&ulWjgBywa-g<3i!Tondy)bv7>nFyW@Cvn z$a?cOgYKD`AqKngwq&@TGcN-#W5TjI^!6Q!CVBCQbWmyCAVTLkuEXK>+?V0J*IhVs zLrJ2ETg@TIh!dYaNbR}U=HOr$+fTmkd`Yxb0!l~4|t>H3BbOLYzp zUk*My)U?Iyua+^SvLGeX;kc}-E>)`F7c;*z`HexP_F7NQSUwLgh&PqnWwOe1o^(|{ zA-nn3(+Y8ZI}@KuZFs?$L2HU<QCQ`h%jUGV}>2%a)A97yPwIaKKuo3!HqGfUzf=Fg|cRNo6niJV2`^6R)x23K#nhB)FA)PUh| zWPqJwRT$$C$e2?lskZ^HhW1lefn-m77x_B+T;Q94bw{2qOpT$kvi+PrNi=HtuH;QX zso|qX(EB2y0GipL#wS@PH1rDgH&ORnC?uzDI){tp3%0>pXZL&<=cHWkp_(DZW%4-S zURw*#%rq!>umunlp1(}?Yky7J*|G|}txTu=mB`HPh0%l@TJGmy_;Al>X7^FWpkaby za+QIPFP#>#vN35^BqimYhQ0i|*apQv{raEE+9E$}Djm6d$8EOajT&o#a*vFxs{QP@ zuj=Ed_#3G!65ypRazHB$JD*4umk(n|j}921gM z3*9tOp!hk;V+(EgV4yGdG~o;#E3|Dj>qgqG`Zx+m;WuSqW8LO(#JKQL4d2$98BfWs zNjy%`viWTsoH8EuNdM=nzcE=t?5pRN)Sdb3o6~)~pyk|7JJWmY9Q{@L7YIR7SuZaI zTK$XY5<`iwj|PFKdHX7apYJo#KJ_V6yT7${U-O+i?2>)2oZ=@?}JLi}bq2+=@OVux}9FHu;_I(RQGph|elmOi1 z(d7BY#2y8W8?JD=M+N7)!Lw_y2`y&o8oN)uZ0Y%b*~OuOG5qiM&Rl?xM?#N zUN_A;gsW+6_K;_Ci6zYbj2v9RkvD4H34d{SMz1zov3(5i-Q;y}aq0~~f)lhcJ8!qI zIFR@qAW!Jo3QYy4B>a8GUg&_^s~H4^@3oh-GpMbJ?xSz~c-(-5ES-QUCp&k-2q zr)erhq#06RRnbo~0+Ob1FRmC5-$$;e`^8S(K%3=*wB*_kVUet_*0Cx_5Q7&99Wq{& zk81!JQ<2Mlz`n)sl6)sGdb&C}4bSdSr`W zt5)_$tf=amOZ(r;a z6xme3MaLZO4)wN$7@C=x3lsFEMq=qwuJrY}Ybx=&x&3j58k~^~fkc`Cry>XOCuRSac1n?Cs&kTTQk=t|sdg9`ZUwYiV~=BP$c04m=3g4?nqF;^(gOa$gbC<(%k zlcFWEG8K9rkJKr0Bq9z&m&P@B@xO+Ebxi6Z6wRXswcz5 z2oA2U2!Gykj!ECE`zXc`9E5;aT3a6IjYa8D=({v{g~r3I|O7fRS-gB?S$Zh=yS-dz33I7%K~oHrWiWi8>vJzCCR~NXqnz6v+NFr(4)j&p>RLa{}jk|1od+y%IuW9<3X@3eQ?^_A0 zc5Kq@uXK{D-LJz@JeYes57S#Tz8{@_)-=>l?E5HG$NwQyc8LBajzBU&EWLeSR^4aqmazod|DCj-;WM)&sV$uk;uGoUk;Sqp7M`Zg3|EDHp&w-navAR z(HuV&07bUYTV5A|%{|~1az;i5OG>JHW&4XD!$F5Du~4fJg-&&r7)}%dEvgPWQo0(R zS(NoUaSCnzlm@EfLsEsiqCAUVZfzAxsUiAnQQH=_Y$i8(wSM*llY_Mw^?9%ON&4XouPHH(VG~!TiC?7 zqAn`4`NIYCEle%f@V_*ClOD{Qp`t4M~x3csm|irNvS@|Cf~T#D*tsFQjf9Kgp{y zms**5uR4vsU0PKXC0Z4zVnl0uA;SnQnZR4Q-jOM&v&cEFsV-JX)&AILdHa?lyv_f~ z+o1W=x7PKo?k7$EqBxb^6)PTe`hBIpeRz<{ zBNrF%_c9Ved=aPluP&hq$2Y(buWYjxu=*>hsAyMsueq;4T!$IbUfGZ9R_f)65OcJj zBTxwY1ECjGHR>`cTuuUn%y4M=CN;q_nbJ^pWj#kqw&>J`%B?qxIp)j6^V`B3nY>86 z*F?6(IoS@%Xi4+^(Zm(R2o@h|jH{|c0TPJ7mO*$nEX~-P8D!M*zMrtKuP<9zPfSoo zLLF=p_S#Is!XY-w#d9p4BOPW=D5OC4-yDbh!E!~}roLUb4?>S&ooy*c<|wwZgQKQP=E|SS_)twy5ywAim z-pWJ%`p?8Ow-X?D9AKKSBc_q zyEFUPUuIv2bZlYvD1cDR)ReB-o4McOx!nVCh-Z@c9DSCbpFg*V#)kKz=hOvu zy_YhqLW5i?gy;ra1;8e@v`wf!Twj)(#lBuzP)wSQEqR!UA{+l>Z2W`~Jx*P`d3`v0 z{k!dKW+3)W89>B~AAI=v@Vnr+rqj5H$Mg1NA;FuEe%L98_4 z9Bf^Ya8Bv4E?aI~xokD2+4%OwyNvasud`Lw0;AF84xeVFCASRKb7E+XL6g$q2#}Z| z!uX|Q@$v|mf~f;i2I8TZ`q&1jfMudF%w>tYE;bsiXbcJS8#|=rWqU4jELnE_RhMITcC3WGil?jO&6G=>HXh zFWWaToqEJ?;3Dw-Q+k?}$k!@|`Qdfo&T(P@Papj6)gM~B`Qsxa`58RcuY%#c-r$LZ z!C~MU+gyg2ArArcrAa(n3l0+qsOH02m%YO=i~uHO)&9tP`F(lYNmng06wRk%{wVkL z@{9c#HR^N;oM(`fPAv!r0;qKX%?o} z${En7YfOon%1I(8xt&_(CBbB+mkZaLkkAeBH&>2=EuS1+h;u!Jv;=W{`8#UQsMJ|c zQix8%)4m;ubieFS{bOJoavh7IZv^KT$g_PV24asYW*;h8gi`7B5gq>2^qfYfflhQK z0T`pR|LTnBCTq0B+7#k0pFoJ`yCh;ohX&w?T9?bs`18>cUS6$nnkT8< z@9}Wk#mG`wk+1jDYf?qA@J_*)EOmJOqTYKUEA=Su{P*Bi$nB#@BeVmK|LO4Oj4e~i z!}3SCuMjF(13Y%i5Ui!tgPcx0j)3DA77$0%!5D(Ejz$A^9G`&m^;<$BqM27Y!%}<1 zTn}j1x3^B-?_%hT5!J!B9z_7-Z=CGALN|QU;Vxv*Yqw6zm5yMAmj;TBn>7C7djpQ) z@ren>osX+PsElHNwE=)ZQpsS`6EAZishirZ-re1GpX~&{)U49fLL$jTDrAH3DZL+- zDo$SI^+0i3>FtP4#WYlac?dHnOo_*3hFMG~=BA86JAK2ynv=u-h^cXR?kum0;uVIl z3C?M4b?IiEqX91s@UH7>daIDQxw+_umOJkz;(pJM^j*2{8&q}jkZJ%&@o`3oG zci--CrpWdA=?~6d<9`S8xoKKWO>WM65ewM)l#ER*Roz2<3sIG5`ifEiXxA2xsiBw| zFvf^M-3eC7u1d6YV|pYI#Mqcp((vI==kvF?t8yWVzqdX1nknspTyPtHx^Xu;XiLE*u>RO6>zxIOOTHscYD&@?3oF@t3WC@iwl zgbBye|1x>}MO>DjFXhDw45E7i*`Cy4fJ0}lhxk$WcZ;-@9H&v~$y?w+=*6w&%utR& zFNtOo@bX(yxA@YieoTWbHO!!z(DCvsg>D zZflc%Hhs`nncoV=m1Dp!_Jm zKnC7s1ounWI|Y6R7?GmaQ_|O6h&ZKi=vp+aK&P$}1ozgC3XN1ufF~B#V=-!1B?10Z z4{eNA%xiu%{`<(bAna0#u@Mc!C3Y(RY&_fJTHCARQp82q&*CE~HPpo=kvTGWh%@vQ zs~3ScJ+#MpE8a{}9#gtA{&z)7OF9cHs~rFmTer=boQs@;L@zzW`Sz`3z*>LRVWFAF zLUd`@YHewC=9*`++9jkl+z1?8JN~qtlWrE}y);{#9VNQG=0G5iWmo_|Hu}Xz>V!m1 zWqW3>&g6hWCpm^)m_lG+(%hF4!a$Y--4Z_S((jiB&RrBXw(xRdK{0 zIoF1Hw313xG>lg)*ap3yZWiZlZ0-BW=}fmaYua~6GShPu&ZtBR_9$a~z=(P_6PUc5 zb^WtjM{9rEFJX2QiJV3Szgv(mU+VuDegrXTd#=+k-`Mo1Ugvmd7@FDi+;Tqc7fb{; zDoahnwYdR!Q@7Uyqyzd=cQ$7+xrY&_OUsNxU0%W+Hhz|MNLt_#&op$1jRPIvUe$R2 znW zx+ExHL9hCVHvR_DQ2hZku=!EqWgjt!jKsMK1TM5v=kQM^vdk`WwNeR>pNvf zG%DhW_66<`m^+kT%hOP>#QIH(`YT*R6}|Q^aFi=z210n<7Hmw8=UOD-S5%f;tNlEJ zUrz}e>JNT&>;{_*zeJ1yf9-mk7U{{m_J*2{TeAMTl3x!S&tf3``VdBybklR&B~{=P z=(w#0)R*USryS*ZAo)p__b8E71QCuR#>RZXSb%G;9}wsl$S4(u1r@c|^m;O35=|`# z5uhkxAqnul%2=UTFw%%22{qF@>&kPf0b)#1sYjf1b-X`Z913?92^1fexI=(w$j+ zM~}R+{oRhKSRnN_DKYWZJnByxNTT>ltK;yu4@=raTU%y#ch|L_@WT{fFtWQ7Sb7O7 zOwi!={N*ok<_}Jf;ACuKh=S2tgN2mw?%#%ZT=P4KE-qX>@haHrJHIz{mQo~|DPb!d zShg=;z_6O+(Zy;5(j-mDeb8?~%pOv&L&LJJNU6Ax^i20MY;y7d5UQr4B0Aqy&?|50 zqu$TH+izH;WBl7{07|168_R;z)!&^{l)Ng|l7T2G4D{IC>)|VAMlTWM^ExO|56(Mx zAOe$Dw=2<8<|RUh``W_8VRHws!ZwYk0RviG)4LdRO*(-3G&ZBT zeM%x{+nbL9*dH}r`}hSKbD})^YtM7Vlq`C_76l5<2lh&fJ|QcdGEZn^B_&A%;>AvU zQIF^vQO)8z3EN{q8z-x7$sAKOO9Y|Cyzm7_A2%TGH*65Kb?q^)dYX(sj^oSdGsLyZ z1UwWZ!7p8=`Nu1-tG($rpWE{^m)MNk^^lbUU`G(3{I@SNdg2EdDZl}b2e{GN8?!QC zlmc3^SKFFpqAlT-dF_NjT2z3=CzS!!Y+s~Ntqn*9?CV#~X{<}j>R`=%oK+Zw1y|^1 zaiiDuBl?gXTdjB%VsAW-7K!f0VIbH3vts>Sm58z0$03 zp%|}`ZI4f6Ob><8-Z}j0i);kaq&?hQdS*^z3RsPS+9A-`-hEo{3=PPJvaQ46&@ST2}PBDqTn|qKW{v;~?3^_TS~zK(-w^CmVLmBYsIn zZlfV#E8rm%AlN$CF`ZVvE$GTo%Zzh1q4BljtQ&L}$g=_x4k7MvEVkUe(!m1wVyUxY z{j*%gWa+{+Gk(nG4&*Z$O9W-@jOsa+u8n%^z__jk04dYB*)8GV6V&}m`M!iJB^JPkq^L=8g&E!2rOP$#Jj7W`LvNP3lll1l5cQ`I05_Dt`^VztY75oZb5$_5wj_a z1ei@YS`TP@{<9;#xbz@W$tn1>plquUv~CMd9s)xTfNQBCQ_Cb5s>NR78gz%yM|7s= zRk?^uFr(!B>;rJ$U$Dr4&LXOF*By*{2!zk6H1X=GR(;Mo{F9zcYh8q-40SwZs*X~D z8)B|iFEAPij{_o}8~y7b>`4>Ht`@zpHalwA1(r{R>A`}(r{ODi!!H5$@;y3+Mufgp zt?kHx)GffAp%V3?LO2Fj6IDdaFD#U6^Pg8178e6Z;Y5RYcw#@5X_~aEm(#i>434~> zIs3EAW1sf@-2tgA*lF~G7kI0VF9D08QDMc6G7%B=sjil|TAWqt839Y-PpDC;U}SWT*`JHDjtu?AAb;xz9ug!&jdA&8k0FYi?MjmXa3a^QYSw8|QjKd*t z{MpOa0XU1SpI6_`rj|X{^Y(MT2S?I zK(_O)VYBY0zQDP*KV9lK`P@{if^DolONM}5A5nOhg`vixifa1;d}5wg?|H5NINxF^ zaca=%$%%F}2erJtr+^Rk(=-Y?1fHYPQQOXzPs%|-dNjQYKsXw@?UA?vfg?j3oYRS# zTxR{Ut%{WXhWf7m{3P+Cts?knBx8z*k|O@a;T?-_z?M+~+%{XThO}h9lo4!j z@zEatvS&*=`?plZCB7xqL!+x*-Y9Pk4A+$=`&-c>IUZ_qbnlhHxCJVxUZZkF4}~nbxU2Dnt9BzO=4i%mdsGh`W;1IM74EC~PmQG!%2(K`-zv=1D(=hcCKbe$o);T?iDaOLg zi=oYv-BBv;$F9!6&J1(YxT~F->CuvArzb_MHJ^*vbAqt3%|ML2#B>>PF#aa! zbeIL<-0U%KSAvrBs7K3BvmfU#1za4Jcy*yJz-y!e88k+$?=6*!KmVOP+Qqp*?GRm? z)BGSg@ApjwIQHXx{)G_Te<0s5GL)R&(#=dtkx7YF0e^jkyJE=*m7FL-%O?582Yu=z zD)b~ESW));v1^)Kn6q=|x^7pE4$6L5<0{xR zY|Zw4;Ku2+X|uP))=GP<{3siC&oX01y7e6M!jObC;!mg8`OU0!2Z32> zvw6SlGe_$CA9N-B`b$bX+7bJY|qy zj5~Q|n{J-BWh-i}#X?pV8M5AxbqqwT2$C60P~dZgYh9ChU1!$OHk zEJeko47HTz`v<)$*^;w`rSX;n0$lodvJt8FEelI+q$^ARbm!6D&&6CQMQvuoE^8$5 z3|DOg)`)!^zP^4}Kj?JudC+IbtH#<$H->D$bSc^CD9R;15;VqM$7hgx!i0A4pU^Zs zoabt+Y6H0YSc+m(jpb+4AuCW-b zp<*j6m_pE)vJmhoGd;7XK@k2LZzlCZ)zbjTt+_d8ZsrN4Q&l5&Bp19Ulj$P@tN@xo zn1QzGp0U91yr;Rb@!;LVi4A7bpY)wq#;r@TI8|{|jJqmSa<+UDL3d^->mDQ#r{0Xv zG#nb}a?b6#Brx%a*sT=tyY7+4dNP3cw8bR=5>tX`#py>Bo1i=2SS!)Xeid*x7>AH< z6m43`hjN80D9?4)4=vsQCnf7)rCwc7Z9VJ-%KZGj;}6_dwu)-G=0cWG%?Uw|2|H)= zbT|=H63XcTl+pju0{W!5ErN19H`xSz8sx+eOqZN4ho zrA%A1tek${@L2m}nRdD6H%;a8+-064rFY)|RItZ4zXjumcctudLQ)P66^{q<;+o#E zW7z)B59>^?snrc;5VPhHQF1Acf6zWEH}9C1{}UPp$)Ow3`+Pg3OvOz1_ux8erElz! zS2}->83+nJaN(XU*w+<7QYF<-47@CA9Y6!YgXrdydi@eV@zar|VN%l5%D~n!(|mTN z)HzK;)}K@S1eDi)xDh zB=rR0)!rj*W8f#QfYa0W+$0&<8Y3taz5JG?Tp65>hh39M(6Sk%xYJlemJ5r<>X@$W zs0kZq3kY^v_HVKT!L>roSGbtyV2wm?bx57jKtNWaUBRZXMI-LFu)a-WLDNlBzSWIu z-Z@dubE{g8)%t-m?8>AFqN@Z01RdSUj9P=;KvXL2B3jZPo7ZptT8_c}d)j#R6U?rB zn;NlbQ?HsyiH2fZ0dLz7&2r%=9*uyh&tmwXJs7{7e|s&QY8{e@H({GG5|4sA&xc?T zbxJU`EPpRyIF$0E5fYnnd7#w{nu$5Xxudz4>pivJx}PiFkX z_Ldo`UR~rOC( zd?gyK9U`U7Eg}1i=P7o7{(0J?%2%9IuDgf!)1&C^P;a`50+tpX5_eoG_{Sg6XDpx0 zUl90MR*rjBdoVb;^Qo;f=?^WL@+Z;)LTedgY$~zJ`Y-6zgj6fK)LW1=G}v ztpRR33TQL}^Z<#tWP>n90qqYm!ZNu`84t!t|MXLsJrxzSt-K?*9}bEt$~X*~OsFLJ z)=XR40a!tbii%|Y|BjjyUs*Vnd zZ0V%Ag@ya)WZ&=C539I5Q+j%qJ^iK#?&D zc-a`fir%IhwKz)ZXw&l@=lJ~AKzw9~RXMghi&lwG zrv04V+iAn$Dp_4&cuQHWt5M^+E})2c90;CDT1R3TJgnxTsbz39@6#oQ5rN>L1?NxM zJJfk>kq&tALu2t@?$%c3;n;Q}0}2MR%P#vIp{qY?6zh3Zm7={^F~Z{!fA(>XUWrs+ zJc~GdymZU=jrgl@3V3cA=ZZQGi?g(m>m&yMNL?NS+@Sm@qxThDc8WM)BAf#RgI=ma zyw|iEC#`#z3|;(G&L)ZYqQmUlch$S|aE(#Ym?M&EP7H9TpA>meKc{`^yPe0baK%b=Z^z zk?a9$B2JM(cmqHsLbGs2)m=FIbSjiQ(59Rkq(-*Z^Z6QozJpI{-^D=RA9t8^oWgQ3 z>8H|M4vu5dAV++1wuoyz$APcEwf&hJX`vXlfV26gLaEHij@)Yh*9MN`Qoupkd1u}4 zMpGvpGzky;>1_pPu#`DzLsi>BsvXkd*3T`#g=~c`DjT|snoP1$D{nnb%mO(`Cw=@K ze8T_-o#*D;)(ws(x^|#mJ*v#X9qnT)r648M&;o0VnueW`C`mexj6Z)h-v-*|@^X6X zpdB^dm_h4?rBq9L`E7y3hgFf63!xIio!HaZzKIB3eD^^?RubAsrzD6Kmx3q+z2M)l zfm?QhGhht$Vn)rQYYhBH6JN$Lo;FbL+xSJ-SSEyyC=jyg^zfxPoA@D5rdf8Ro3JS6 zJwE!bgjvvem&8Y$7NYcY9+yhr0haF&n{H(nOx6Dh5(QE<11`?yCiFYRMy#P zlH+?h%-}&N?98f-H&g> zuA+b1byubrHA!xj)G(|TZ@G&Ot`;;gnRuKPufWI8(VH~u>}GFttGhR_dhN5B_vSm+ z2z<1PCp?H5)kjJbJLU$#gw%{>Se2MbsTdk3JxJ7*3N_Rke3(uO{WKxtx^9bzrYWWTnd?~kQvvAsz()vN}bOO-$7_?^ik*c>vsUP|J zFYPxZ?sf@$(d8y z-)A~x`&;yL`V)_#F^ZoD;vhZP>1>Fi9oC-t?hBU_SQ1iw@tO2lr+dj#6aDlC(3ZO! z|4uh{w7%ab(@UNP876*S=tivMQ9qsUFRV4v;pR7&a3IgZfqe>0RQOV(HGz{icb&ar z2*F$$t4rs!B5%dZW61qjNG^kI8+(ceTS(hcc2jC159Lh|uf?h{vHJ>wJRp>6B|Is=_OVb30 z);tRd+WLVw_jPgiu@W5EV=)RIOv<#eq*u^{$D$NZWxu@RZ0Ab!!1!(lOF+PMm(S1C zp@+|?{89D2N)C_YC(#LITEnp*gCO~T3C8Ce&rciWv;U^T#Tw1_gA#BGs#~Ac2*mMv zJDZ08)ct}_{rOQ#!h!cyS1Qgq_qoG2t&B|=c7=(aA{(7tU=_SAF*9mK^b{F8r!mj$ zY$4G!O(s0}FE#s+`MY6{HxAi&`Eu_F`t?ln+S-Im!Niz6xKoTdjd?gzagtC>7SxK! zDf}ttO`a)lUGnrO3e+Nral7zn_bqK3sl_{L0cdiiH~Hf-s_`F$6_hE0M7$NpKS9K> z1q6u>(yr7fGKe`>}~2sc^KO}F z3p-PB(+7N7a@A6qy}s9*avR;Tx!O;=CjW}`roW0{kk&w<{5OI#{QbL^EpShCjmf75 zsv)}Y%M~R$z&?rWi^UaGD|HKoMh%dRirL5BC~s6pld1Ii&oW@bTC7fQ*eTO3f@3^~ zxdYtFA`O#gi#^UgPjfn6q^f}@PWp`I6zZ-rk@eh=x<7WPg)TDKNvL%E>6Pci57Oyj zNsNtU2NUyxheI6-E_e_;tygt&6OHYw9eEvHU8Rp7*UF((_6*K2U?F8POt1i2D1kJC zhp@;nnT8I2zMy)}Gv2s}^B6jNT0dj{@vX}$>3b68)CFA44e82TSKAsT>sxy`$lY7I z-JeSJ9po$95X8$c4s&JGH>~++a*f^z(r@5%b=c9)P;+n)Va|ud60*5*r{F04%xm36 z!6H16Rsi>A=aq10!CN#rP5atDPF)i=(EQgRSy$XQEu3p2IAk$v#CbPIQ*r}&A0ws^ zrizPfl=OSmNZaqq8?jYNX)!-9>tK#sYbVU2rM@*i&KmIhbwXRKdTqDbB)F>_c*^>X zKRaU_I#e#?Tf`;#3)q>{^4Kf>*qeF(Z)Z5^5(?amY_UjmEw^!{z){FAt=&AX74!6rA^?@rimG;fSG5?zSi zb6_K%GvehPw~vO%_p;L&$!Z zmA7cMT^*L&(6wIYPKtJJ(3~1q#;}*k5^-)J`pVhmCKfRk95=Z0!sd=?+%gq1&%llO zUDUr^#~`ev2)-h$P5w^!t4CFAQ8$Ni`&+*w1a#g0bq}A915e&|i|hc0VJkn0jd^4c185Zp-*SA=FywG#7^ckzlbkABTgU z{500WTcMNz)1g9Law#8AN_A5Bu{#&<3~BcyK?Ox@$bWmO{=F}+=w^VQjG?##KpH!M zM2kURKSE-M;b0XrqN}Yv)Yli%emTO5am`7Pk+3QL&>)`lC(nqZ0QyhPv`-38g{Fx7(*9Su9SBs9mAuO9~MLITe_b)HQW3K*_VF$)L8BYDl;T`%Lm--t*V*jRbC%? zlV&ytd}wL+hQTWJi}z*=H&WP1nWtoAkh5A*q6HoXcdy?T=8KRfCVj6+mdkea6y^ zhegaZEd$x^o$u7H{s-q~G7*})s()XIwIrccWn~(>EKh%=N8qUhka}LWF6{z_ z!K-Ke4jaLZlJEWoLPA2?nuA>u*Sku0xYn;D zyfmfz2U~_KhtAdJKry^6`U%QK7J9C3hM@FFMLmPXGP5Xd?qrul;v)Z9T`Yf_pXTNJ zL6Py3gr0hP#mSNGL#gnS>BD3$h2a1WmJutIY3RGKwQ@PplB<}2Q#RU`+aJ7&%8EDG zwg_al%xr1J1K?7;42D(FQJ+W&7my_A>EFu`b?JNOzvIqS-&eK%kK0tEfCWz33)t4P zb9b?AAMdvUX+|dZ^7St~o52k|N+{nW#PUM(PhKs3_>El5#QCP%PeY53 z%F2M4JtF?o6~amf2FyEYFh_U;(O&77Qdy|0>?Y37Pju(UMc?5^9I>_MS>fvT;|1ir zaX{$cG;fyc5?NE_G%9H)OoWvcyt<|xyCJvkXZ^W7_Ti-K?#QXO$ZZpI$~o@iv`}J! z(@6!8Br6s9$pNrqnE6lVgTJ8HQK87y7?0FH7B|b9`P<)XZI%St3oA_yX}>PH&BvG} z7EJ#%6ELa0B}1ZX%%f#|DG_zP-PZV>Iw*N?6VZ2-J`0DSF$CTl+)ZpS)t%>LAF$dO z6OY1l{%&psk7C8gy&ANvB~ zj1grfjuD9A?|IL2gyXz+`tHi6FYg)UA1rg95-qX6r98K7Rn-@ew3i2rozckHwqn+?n(C(>!l1jXHbv(EsUp=$L`QTE@bUpO8_Z&o^Ck-27>DKK7pmBnUQ* zN81^6gqIC>E@#z8K(St$2e$Dj=X5Eph$W)a!;^4R?zvAHwm#B(mrGHS`yob$XOc+5 z94CBTlG<q4|AfS+cY0B1;mBI9Ep zJr8$h!vV8$G_Y|ja!*QsHZ_$X8(_06ab?4bRCf#gVSkhzaMDj-JMWaW!EJ215)%Qc zG1G+yPKG8sunqDjVR`KflWI9 z=tydN{W2N`t0#PwU!%#ugF$~t>F?Bf1m?+xQu-Fm4vTc?ph)8cUmn@-SZ>)~)Dy&| zXJ8zn2spui9q=3tWzb~iZK?LB#PZ%cWxKWd{;eNz(__8IFKW}f6{H;rOgxne;ipq} zvb|DrNP}NS-stl1f`c|Az$hhkIvO_P#J!-(;H31rnIDw3Khggn2A)<4!^K77^Vih{ z9T)a8KzcpdoefxHm_Pp&fMyHTNamr)flYqQ)M(@NROUSDdzo^X0}U$10c?U*2toOX z{cIz+jZLFwIUThLB|Mcn70Yq)MfjME@|;T1#6@w|iPUM) zmrg1=7#c)P1G)aEhq8CEhXjn@R@N;;3>_OReS-CK)0ME~xWKA?UsFqU zvym1*&nh~=y>z=>MbdL4JAqjij(d?Wjn&kr)k2RJ6>1=Cauq5NUsGPLN$x8bv^1HJ zq^^X(8pD-1PFfYKEtZRb^|0Cb0H}hne_qjGU?cV`c95}~UY=4%+Ra7!1b1Ar{j)U8*tYd>nfY^I*4L6r$IzB3aWNO{ zUA>2arhqCknTG&S(l`60E_cF`RVtWn`Hc;=;X4vu$GWKT!9x}<9D4v&tK+i~#lI3jiG#93vg%&->2=!Oon*qNr2hJXr6k8H@aP=%^B2JVQt1JZGk$ zSUhueQlqH zGIqIVHoR4wJ@2Be6`j#$_gzScs?7+5T=#I0l|)B7j(jhoA&tysk@WNHcpU!z7#Wqy zEg9sj|JiHQaEIdam+(EJUJkiK&JnK!`OyQ^g62xFTs3(`_RHpR%r`WAJ@MY=*CA1; zNI!u^cFns$aZsF3zX}8fM(6N}_~U&Wep4#Q4;(bQ=)Nsfx413QZDNyQ#=MxSU>i!+ zkRddme}o4KHm;+cQl>nOTQE|N%Q_*;6&j#Gobv{SRmVrTttuIEIHBZIsdK0AXZYf( zwbpfiW#hw~Yn@;DDj}@cX$y{kMpG+E_R{g@{125)Gn$}+vIXHUdZaua9L~OBC&@?8vN%@E@OEG>C_|9DOB&FZkkPy(_$}QJGW+1&v`TYpxG0R{z=7N z*}zrA)Y8YgI4cctg)x|zvblDgmddUK76Td7 zw>)7^&;!Gb`_y}dd3-sw60WS2Sa>(i?K5o^Q-n9q0*JDqsb_v?KFUNTWN?I({y>bQ zTs+8>aUZ|5zLk`aNRJ|+D;>R9J1WmfVlsmJVf==VBlm_eluOD7D_}w3J%VAWL%hZ4 z!{)A9mNvDf0Q~OP9&$}%^D}QwY*Afft<3_dyK`&$fQ#E7x`60_LX1qr^J#F3N1<-! z_C_2Vi>hm1rE9c@=l3Sm{?&xHPM_|uAI)1t>V|*eq;x)dZ|F(-2WlJsEq;0WfXpHe zY{xdfO27?BlKe*K~5VS1AJ!$#K8M5 z>)SV1Hn9aFc*vW?o_oAJEI{_+kr00m{!BbHNe>pOZ0>-ytK|63lftE>&SGXS-<3v47%Qo5*!7qnDEgy*B{7$Y_P zqG-XJcFkdbUHu(|una%s&MfhUd6#;wd&_s<)NybrIvZii6^!jw-=Vzzvj(M{pQbwR z{mOF8#x2f^LxR?g2?@Y3Y(KX@(S#M!H)X6lA13he0G9kj|lp6r@2E zkVgFe=l87jyqj0E*4%5Z`#NWz&)%oGc%=-JOk(mWO4tgO$l70?sZfVJ{`z;~Yt7*q zW`(J@$?^X-f?xd4DV<Gqx(P;&uV(^>&OeHg6`tYj`PPk|}pVj(o> zyB%FSejE;~#57g8ns(5-E^3r`EF0(B!P(WQprbF_0_K}6DsdSN{m$w#!~;#W@C+Da zf9Wu53Wl*_Q&NGf)IBvdgXxgho;OL8Tf><=RseYTCZ3lNJ7&yLXetZXPhnjQ_=DhI zF?pG${6vrLh2JDz*~>3}Pc0uTZsLg)2^*bj7$cNlKA7HOb3T?Kx>cTbjMbl%!*q#%Ac1bj*MUFD8 z_ohIe0qm>zp|zYJI_Tsv!y&}uU25-zOdWw&v|Yf<5c|mszQ>t)3Psr^VOz!SVwIDx zdZ-&LLoi=Fd>~X)+MEk^C7rM}6?2hAJi5v3Yf0I% zr=R8|z^`n8%e`MvLG@Js6A1syzu{5AKRAVo>W;R+KUmD6hisLkdPB7N)YSy(_QoEp zs8jXqW~yc#MUEFiTswW5-^W3aQNc~3+b)YvsgW?}vYRrePjPRC@*fT0HAw$w2j)E! z4RGDLQ5`;SwJe{?3Y7@=J@brjIo!M7e|t8Ock-xZI1oJhCdzsPyD0qnc3CdsgRX=& zcMZ+(O9wl-)lNh?ccAJlN~ZOnWfjN#pB-m5p!aOO+M`{GqnX(_HqSb^SHs&8hC|4 z)7r->3f5OprXfX$N}Je}XlZ`5)6ry0Uu7KYOtaF^<#*SHKK+_R@13-YRI96Zc+wZy`jiTV%ghX{v#WY3qN&(o_3D|GAA$)UD7Yo}>MMJ$@ zo3anNHW{$8qkwLP3Rh2~k3T==aGSk1+QY{}=n*Zs7+lDrI{(~twSnE4<;x{Q5G*N1 z@kb6b`~}BfVp{qFqMprE%t3QsygFS;(=_mKTJl?9o*vzCIG{u0Ct3;LJ?vj2K`j!M z6ZpK==bxMrtGVlDf*>nWAcO+e@ObKAMW~3G4*}MQd|K*Q*W0J|8jpVup1*!;eXX^KrS4Cv=$^J#&aUIDIo7t9|2Dcm-f@^~=bCcN zr#gwrKPh?JTSR55yrs@|9}+K`)8<#Ph-P+`U_=Y=6E-9@Z60d#^OM72ja1%M$?vx>&f)$fsiDay1u)nf ztTE>wvtTR)F;|Ggi`~88wRb&oN%n$iGKf|z&oS)c02$*w&IdH|m=Bjtj{-b@hicte zG3It-?mWKzdI87gO#3wn8f1@G4iY<$Va_ch4QF`g5TEBcIDqg{08evd~@t`TWnIXng1S;e~t*5>f>PWvcL&X@ar-{u}0mKQs08&~`u z$~}4nm;5sES)^MGHP5%lw`la9To6RU;u2iJP6f}9=A?3<9!L)R9KmIRb+~XXJK_X| zVZ@pz8%xcU{Zg?H?J?Hrh(7gw(elu?wVedK$!ug^euBu|G9#pdH zr%8$eyVS5h{nJamg$ODha|9wKsn_G&rs=v(#sc@K%-Hw@DM%o!B1^BNQKO=8Uafb! z(#*mI*&Lzt(WinZ$sTT@ees?S6VYy#4` zUiNPQ;_;Wc;ce&nhhG8@Hd=3dani(`vAP7;ky@z>;A*|o&^0;sfxt<1qR-snQP(m) zP!HhKE9QpOsOv%yd{MTkz+#!mUti4mwM{E#b+=*`X$B0CnE#eRJ=_A&(#h(Z_U^P* zj0qElbnt2TDo`!Plf@Q{EB>5^5Ev^M;)KS}@an$UzRrvCih)NozR$}4$Q|Y(G9Mjr zcrI3QflM~-`p>6b{1&)|dKi#a1UYeB;QU%K6aMddkl}|`ax>Nu%FF6rTPJ3f!TYlk zJLHa5fBU?$n)Qxvm6`RRuZfce-%&!VOwZ+KgON(I2lRXG&)HFQ6e7|bMtkQ35*uQEjnlC`79NeGy zT<5u+M~AFImxl(ukoDT28trs#9v8W`2uD`jWq>;{%(dd6bm^7ns!GI6tN6A}<jYG@367XXXzw4o?JHLjZ!E8tVv#IVDX3)J~ zu=v9sCW6=BFQ^I?2B6rx8bS}QjEsA!F1$7V4VFy(SGe2Ji!f%oZ>RaP=rM?-HVR(f zEH50ECxz`Rx!hMhdv!xTP5QR!592zKLHsW@=4etkO}qMa*g2`oB9UEcB}-Vjism#q znwlzpyS~1$Ix2CZ08fOb^j|pET6qX|V*)%7WgsPmcm2pYw`C17%z*f+jP*Tx{)t(C#Pa12lsFS>P9m znL4GKaim9GV%5=*nYZxMhJ5}z$tk36@1}#bBe-&)a3fvmg#4TE?_Y$8#Cfw}s|bZ9 z+CAKPdNj9eylN4+nu@9S7fDp1kAOyBLAiMD(N3l~oa2&ikG**9cUK;2=j6~3A)=pY z@v*%WxzQ<#d_A4NUcb|G%KfvsIyw9>A74ayBj}^7=5kv|1z$^R1R4?P`B{G4mQfhx=ZCq{181bseLuEkK~~hzE$}a1f6vU= zNY|jLPfg*Mb`TDoG@_#wBgKjA)}jzK(bYvZny{?Ol7e*3&q&c0CB$!B&+b`^J`v{L z>p#{{Eoxw8%(L!~0|aU7(pg8c(sKeXoJgwJ`WXUuPmJ1Imy7Hpp^7F2JfYwMars|P zzwi_s!fF=A?5(rJ{T9~_&A-zd>YAR67dNgTw*;ep_2{K|ARwyHf@kyxPiC7`Mp>)n z0}$F%TGqHGU@^dJ^KVy*cG~Z!qZWn!3!m1W$M3d{5qg@L7*93CH~k5!>FoQlg_PJM z`13o*Fv7CUx0{$mTgX@|@rm?zkYLNZx+uukU`lXo^-RFn^|!(mz@od@ytMc)I~yLJ zf>bq9#>i8uyX~8Q&nScwSQ-2N`WKj(XltsaUj}uI-Hx^#+qtZ_*S!_I_criR6#9;M z`R^?9Z`XS8PI@bPuw_JbN@Z!rRHG!Fz_DStt(QVh82w~x+UAfU`)w1;A8I^kW8HwM zduRsSHo_zW2s_}QOS9hILrQAwyhR3js6|@`sJ^M=SDS-KXS>$UHc`3&EdBUKa98s@ zS4dR1Psr%Lj2^4EVA~1MliCZi{2Mp?p!@GlImuZZjm>5Rma|}Z_S*=Hz{TCvF($;A(j2E;%i>9ETSza9zAz3QFh(_lsv`e&Rn@qWZZ?4h7n2nT zYFNXbE>phJWt5v!s|9|;Q1Ca(OV9h`v`fy!U?DCw;Iz_Fv=IQw89+R+!)0)_Bg!=K zJl%?MT#cOG$d}p3;D~!B6jR{-`>;Y;0-!9B;beXMJCy4FPBAo*x&@nc`UYqfc)t0D zb*>`s7GBir4QHZZyAR;b44I^sCN_B3iZ=~e&Vm?`R>n@zwx)09j7#y1EeBiya)ew& zn3Nh{3YXd){h}q?7A!5J55B`ON+P;t=rrb^o@#fMbz;uTFLR!pj<~)n7ggBa1KqRW zRyXb+xEcmPNjMgbCDe2QyRRkJ;;iMu^)5CXQ&_sI5$0C0OIFWiUm;8>Q*`f!BPUuf z6|i7ed|W6VE~&(4(YV2V%lyq)ptYyEhRdTyoe36>Oc5kf&7ZDY0MKqL*vXoZMOS=w z)+?cJOL_tFGzabCEzf2Tj7o!6Z;?ylMTwI2p5C4m%>e#^g;!g|_m{^vX8|$>)6>x_*?!SEaqd__%qX zO;PqF8Dp&566E!DNna8qdj!LElk)YOlX4Cw{66xy4ck_LCq$ziqQog9KL+KXag zcs!s>Z$t#wKsH*nl>CDV!efFi>vt~Sa;)Q$gj1f_(&6z+0BPFTNkJ&Uz`%RfwZTW6 zu$Er|wLZ-^Hp!R!GsZ~uPrmKke2%Fq|7i`YxPWVSkC8fN45w37`ztT8IO)%^+p9Mt9L6&p8;3Ly%L9H zM0ssR1Ux_F5@37whW20~rYYOSy{2*+JbN|Hjx(Qj?OO)hVZ>Bx#wQ#D6)g^vS`9cT z`VkcaAG}$$)#jP&aj!kAIPr!Cq745Z|7{u&Ta83Y?F$Ye@4(Nz3SRZBvOkYJVqf3S zioHrg*YP{rzfB_E-7b2=5Cw^)+D$U0HeYxMko!5fDsEj&s5L1|B2nAFqJnA-=kfP^ z#?WGu0-!jd^h#dIJpz$)FP_UQHXs)#Evidxf< z>&kXqiJmhHl)mTFX|~5()}M+Qs}t%{ngAB6)P?C;f{W|#eqzH-Szul-$t^*a+Db*B z4s8S-z|%@mSd#&f%mtyz%Oqo3-JKuPeoN)ZLZrABL>EQPKoKw~dN=u&SY?Fh>rifo+7{lmUTev`awUbfu*ujj4B?27qZ-pajw zcoOkhk;)a_T<=HeWxh9j_iBY@Yxh@cvaVJt@4n@q=K2@L65|=$*_}Pb5E_IgaX~N* z4S8tDY1az*d4~KMsm2Dv6-d0EDtf?0sMgK7by|(gxu+q7y6;|% zCu;QEJCOfRH>E_;pW0p@<9Y^_Yt0mf zq7thUMr1k4aC3}mn)-c8aqqb6OU0vtI366@5R!%~#ei49MmMPes-GQ-|S z-DhG~}q^ZAzxMeJxdyYD98u*2CTIM5II!uX#Db=~kfXiL zLVFhZ@qbeACyICkYMG5-Kop`LA#AuUiPs)Ng4Og_6 z`H0tF&_`*&YO4}p^$BL8g@{#9WYF6~1~mY%HvbdPU<$VlFw9s7+wx3gQJ|+UHj}=6 zR4(uE_=2Jxv)d)Oin|mK&G-xA>0RZ9)TI%q8u)jd_UWu`|!b5)06DrK?&718z(olSUuBAEN ztUAIZJX~j>XGDSrHRRG3P-Z|&MbU!M7u9cI?4RY_vaP(cE-y!)=zyMm6)B|wo{|v= zNL71cj1retu?8f{Oi!XuB`Ze+{2ZWqhQ>l`!+VMWA3v^})eyhlx*Zj9{xCJ=9`OT?7jM`wanlC7?xdT0sB3ljB_>5kfA3F+0}m$ zU}B@82uL&p-~Gw$F1_wfx?y1sn{0TtEdjdhRUgw!IX>xgz`j8%PSnnOK;w2Az-~fI z(%J29&OF1@_4>=1iQroC8kb;rHvmet$0~|BKQjQt$DhU_waZ*QxHwz^)A%8UbA`AF z%wRxCI*AN*&)EO)Ehd_!TJ}u|s#PtEU=`GI1u1yD5==Wt{w6TCzxNEk8)?@#-df}E4?Oa2 z-y=^NkAF{xC}#L!)|mhFkp6}!N}sB3!%8(~^k6cW{1tYy7+V(2h{yDOi(X+8OXK!o zcAiNq^KPo9;)Pm;Y6oYH?t&NtN+^(ob31G=&56ySyHQ$Y?kR+2Lh^a41KHMGk%&>c zl=6f7R@+8Xs?y|NiLRHK`iT(Bpl)@x48#K=$D7CL7Zg`uR~2Ib&&Hwm#kBf z?R>q&(7~xfX{{Hp9_RLK7Zr>g30Qk;_nw2StlNJMnLEW9C&V)>ogOkb3}G)=GpDXKUnMoi~dT-;nqBF1e{U< zR>ws6UbDlTlbv+OqnlMRyc@RhOU8F8RlTBkx@-T#1wc{#UNsJt#GWFBF6z?hvqIOo z%b#Gn2}WuLuXz5m7y~QVg<+((kUD2$#=d^+aCbf2&zJ#wUQc2Z?TnX3z(&H{rp~@e zH16A=nN68f588k}69xRB%d=WZx6>DXKI-Qw59!M+IWS4vnRWL}SpXV=ww{X}Y^8`Q z8~~japnyZgz64b*><)?(wfA&#WUffrA?o~RgkH{-khEy$U_WDD&n|2CW~-zVgxS~A9bsXhg4{eyU{b5s&%0axj)c{oaFjQuRA zoW4qt2_khC1J6cZsdPd8`CtXAIGz?6xml|i?$$7dY6yFL;XpTXz@IVdp$;U?81#E0 z>qVk7X-CKtLZ7bYS*?c;vZQfZE9 zaegDtj~KVwkCOQ_$ORZ-@vYr&MF!$pT{R?H3dxHHM2h75x=&B4U+C*$B^&fP@#`#R zUfHO{(2einfIDvU;c5P94z)W6J_ka$i0$64U)sD+aSgP6Z0r1?R~S3!hc`*a)lF&c zCJg2T1*GBcpSN_(sJ^N;2l!i)d>}=sPk(YQa;|2O6J@{jAw>b~9^AE?(`JGzq)bu0 zGAhXrGsP2Jh<g{>H9=Wc3? z-BNkp&dh74xgjpC$PZ#Yf9d+^6M-ec@8$}(P{54|Gr@{eS!pc}*S0UG(0PPhlHel- zTsvcnhQvI@LNJms{;~NMbXse2DV+{ctY6Yr`;4;To4FoT{MrHK6X$~^#vQ@-m@C5+Te;%Gq#!RQYuB!)B8z*B>VkUVRLX{3hfkW0+#Xu}W6 z{?y(5vSo%;(Iuz0hXuo+jP2Z)mZ9o{wrtH)Cs@{{g7D{Da^DxR%V9C>P?Z7)`tJ$W>s~i@Wb) zGw`)-cq0j=P5>Pt|J2L*a>>3H9cpkfam+c?JZ{&=Wpn-Pq09z=-2=I-#Y6qYX{qD~ zRV$2=PJtwp{w!Jcs{F8@!YfABnFTR=8qwYD28GIPW`CjE7F+lFrmxcKY?fHd$gaw;4o3y= zxHdWIbXSD1p@#NpFRzyR^~OL?Nr+J^@)t8680YJ=G<4sr2=BfF2~nA2@kM}a6~K77 z5_+OQ74BI1)TX>52Q1TLhSN}IEE=+aX=n2Fd*$RRySsP&mJfl{FGmF$Etp`ZUwB{g zmRPkqf2G8<)H^MLg~Q>5qN7y2XKLLVYN&Mddw|o83R~P=?0>)C91P0StR*AVyO&R? zm?i{kl)m8S3E~*X7jD?x&{kA z+t@BiKOCmf9&7&0Wc}A|HM)$dlk&}TZY8hDlI-;7tb{TYdO+temtFsZ7RD<8y3F`f z3flYcc7tDLbQCoooYSwGfrb7l>I^O8>zSiN~O3L06EB^0D=p;5*Cyny~v2@&7z`^=b1amjan zSLxw}=3x|zb~E+H_&;*Xh>yNFb@WfS&L!CxNs^vmAC4S|B0~C zwy?yOce7?*&cBSEC|FVbPPU#?wjl40`EUFh80y`d z{lCV#S_M1p-Voa+o>kl-ukqX%2-RlFCwv0)fVY*h)%ER-yQ03wK%!!{lib?2z9OPo z2~oZm!qqnZnIM276@kxm0fu0s2f~z+Pvmc>-tFz5= zBtEMOaX+}e(AQugxVkR#ABk%YU9()LgTTead?^Ov4{OkSk+SfIs8c2Yq9J!BS@gSJ zE(ddwPjIxCDuZ@$Jmx<1opwg$L;Yvm5t<1Fds838lzP_;h(C|ybORl)+oN<6BknqVXEk&P3LHFzHR|}2C%?1 zH5eKRS#Ki>fR<;k3C9ckps~$ex2F_#sY#INQ{IUzclv6dd7p4^mmND{LcsTZpYhn5 zK5D*}M$8z%&zLogxj#1t(?TWvJyz(JZ2v9&S+oXE$6?oV{SQs3q(qBu%&O{F4wTr_ zKUN&9l~s!uZDM=shyJ2;G01DqDv2rwwg>sckPBS6Al*qNW6dtb^Iu0q058(2VcL)- zT*MX{gckL)c}2kV3WAFxKT3Qj$_v|w&}cIh&Ce31rsf@?ybp<5-NU%=_E4lQ3h>d` z)cjhF04!v5Um>uxFe;z!tf&h+`(qx2j=M(Im`Vt=R&Q%JaUwgc{~B)1(*AIzIFj%8 zieK4-;bkoPFM$yWJIh;)=l0}jz(krKNic1r^VcGAdD2~uZ(q4#4yNtzG~j(UxqXo?Si0AgN-5AW`# zd37*@4%Sj~EWPI=b##WB%@Os&$|qpBoXfzhb*^Ovw^M*`Mlr5gAu``trFR*NWi$C4 z@C*Ra=6{0P&okBby)tDJE~?7j0!5ul-wy2I9LR`R!&Zw%{|h!Sh?hZ>Z)~AJ=r&Iw zpw}@!rqQVujA{#GbBUCXI^~K2B~Cyb)6mBTw{kJXA+LupsRL5lB!ZXgFT_7!UnO~7{vjH)9%x|9d7H?#oJ{_H zU!B6S^^jtZ;#=a$DnaKOMCeemX^Byc$IM}xyW7FIQVna_c2_0s}5S+zPoZjFfngcB> z2{ozn#WNQ^jq6oSBZaByd&e^D*_7AjLAqW7)4v1xYM^NVR01vz7UISG_R4xMTixg| z)J-qG*3&Os0nb+WES9XPYtSYyE07DX^+Tgi*GR-!HJ=#0B>P9|k%o@>H53CfwxMHM zPPi%hvQXU(bKBZ{Ihnrz)m=I;NBLA;NhEdN@nwpDO(uDzmf+zfffwv?bY|>T?#3eK5RS zgW!ZUajDd=Wk88y@)P+p@A!56pMp`Rv)bXu>cT=vGa5*Cn3s}~xomK`4uLEYiPy^b z0YQ1dI5iW_e<^{?^TvCBsCfx@LEjT151V_=5C48)M42|@LDS2v0f-|DKToLbD0s3( z)|n;1GY7fk^HQfL6bO-m(;}x>jjS2~jS+GA**;(XQh;KOoOWoGuXcj9GrtIL!c$E? zV2r+JG~iqT+SW##7PZKWLx$6f!y~;A0aGVBZ`QT553DU}gV!2wx~%1-DI@N%Y-8j_ zk79Xb6ZTw;2OW*f(M6or$bZP|22!-BCL)b|4eMFDfMCBo8Sa$h^_NPx(*B0t5c%bj z(sF8pO~f6WrbmdfW<;9w{{LvH$`$K=Wx6pJ{hB$>|ON0iT1!sGy#yc!}#rg zIanPc5&xuCONNawMQHENk^Kb{)4p%qz#~;W}jW*MZw0uemi=`N;j8-#DAx0Q2)kN z&6n;1dUrMrsm-1n9tA*T{X6H`xEu6sYkx?5f?y#iVXl|$Jp^yZ#W^#FT4r(QdBf?* z_mEIhhFZ(xhXGP_)z-tC$DAL>EID8cz|BHge5u3YzArPMm5V9{vrOW}NRUriTD(My zDw~(N3JeM50+y0@MW*5gkf&Z-2OXGqE?adi-;7+XUSmE+Vif`+&b201@>s+scoR*k;BIR3>?EhA@?lmv1pq zOnK<9=+QaAD4yq0C(lgaxS?EFp!Ih_QNpI5+?fN%9~pA^OiY>`vohxu_<=``U4RA| z@-;a>Px971iMNJ~&KswEv=$%MBe$+j*6HI+yx1NBf0A&){3+HO}F=5oCLOp*Z`VKS)0; zXT*UF9r~2`*vW{t%Fawp+WZILE9n__^(}Atj-NR!0Hr5dZ~pa5hO59v zV59H)lm`e+1VH)zGcjM} z{br`8eB@yMzCLl6Y`oQdj|x`1YbNHKT(c#`pE*m}f^Dv0NlQwL8TvcI53EKE@Lcpv z+}CZB!ytk!>7@_e@;G1DxdXmHG$>>N$-1_&33b3H5gpNu^t5uAJkR7< z>P#u7_8p$FA}}V=(QwifJBpT4czfWwK`=?uQ91pR@d*^{CNc)Z@?-d=avXj$85DC=rjV&1sVl_><;BvI zOj6BpW!Mi;3EjiKA-k4ymGp|&KYFZ$SVPjxCYizL1gl7J;*bxFLoWDqyYry4Vk(a#ir6-<;P9&g8@!0DzgnXKfgG43#-{Fvd=CM zzNsBP23tX+KnA%H(qeS~_Ns*Ra4*k&+$ZIP1u= z@%bk;EYEQAHEFC6X8A?__WWDey4nvhp$`~IB-Asu;2<2v&+m3x5VgdB2~tJVb?Z70 zRd-eAH=W{o>Jxpb2=X`bJ3|T8j4ou@3T|xOM`(S!434lU(N8obT^BfutusP=^1iZr zf}afo*lC-@@#}vf(wWpS%j{GHk6nsjd(L)=tPbKeay9e%jRR#(Uw@~+P!-8)8Z=N- zyr4B9hgPuP-tWCT@m?TZ#)6tWe3R;5ey3;`Mj(UG^Ut%oGX2gQ#Q8H~f3%c^A$NUU zP8imR1yf^zIoc|&k&XlJpZg3>&Fjf_Glz?W

    6J9nB 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 S4))KGA9-mNsWORg0sjGO)#j1_ literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035806963.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230702035806963.png new file mode 100644 index 0000000000000000000000000000000000000000..c33bee185937bc62d047427c87ba650541080c7c GIT binary patch literal 151276 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 a`vp-jkHCJ4t=Rzd{gV`x6R8n02>4&+E*WwF literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230722202555763.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230722202555763.png new file mode 100644 index 0000000000000000000000000000000000000000..527d1eb848a77584a8872acee1a9967acea40748 GIT binary patch literal 149863 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

    hz!~G`&N|R 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≦g$ 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

    ft$DdvxhOgc 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

    )daS%G;8{H5w$jE_|MQ7GRdWZ*)bBR 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 z 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

    ;A(df*VvP128 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 literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111325368.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111325368.png new file mode 100644 index 0000000000000000000000000000000000000000..8637aaee7f67d4dc3a99a0f223b5645068387799 GIT binary patch literal 202344 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

    nntp3`-6i=8%dhJ5O*G*UKckaWvV0ZT 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 literal 0 HcmV?d00001 diff --git a/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111659545.png b/examples/model_selection/TRAILS-Database-Native-Model-Selection/internal/ml/model_selection/documents/imgs/image-20230724111659545.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb081d4e2a90e125f753533138ed36bb9d84fdb GIT binary patch literal 164741 zcmaI8byOQoyg!T;LeU@vio1J};u747Qz-6*;8NTn!Ci{G6!$`L_aa4tTXA=P>3Prn z>-XGy&g`De?ChS*WaK*^3G|b)4945{Z{gtJFyv%GYH)CG)ZyR|SOCbcIWL$W{ovr> z#jGVIKgmf-Qhai03-kW5VDD)^cNibF&r9!l|Xv1@z^ zJ&KRioNoqw5zG!~D51sFHM!S;aA9?EKhtXp;o*zpG3C{m<;CiqeZ|dHEj*>6fz%wq zYWPAI@mDT*k?4_;M1*4N7^+Wq$owQkef-!arGkWnir)hQ`G6)1CxnF8EG9;4USZhk ze^Actxj9JWnPpkzg9ZK1h!q^a*8qdZ+A;$ITwyOS**!#r^E^a^&jv3qFE`h(C$`rn zYVYfGSR;mmUK)kAU7i1YZBl-79XSgnB{-(nYXBU4m^B>I>lOU#@&5IAZTTF8|H*ly zo`d*5*9a{CZqDT0PQ$^8!O4NdHNL?gwxQ;HkxF}hT6wZqy$MOLegiO8h}G=Dgva~z z8H6nZl9C~Px=fFAB$2TU74K8+RCSb$(=@|HT1bJTO1DMDmY_gexLNYKo2##b}rj@A1`fMDPAd4pWKdTg!%&@|9iTW d=yvqN-%0T?-DL6F= z0{^cv1>#~RU*E^pL;tTr8ffAkxVwjk_0iFoHa0dF>>@Tq%jfNM8eTwb`2QybOi_IL z{Mnj^heu0a|7i6`S($vk$&(HmwDbwkAzCN>VY${k0t~Ak($&*z%VDBy5S@UWzx#jR z^O_TIh$|*0r6Ki+^n+C_2D!-6{=q?AwrUzlO}7-KTauiFV2*&(mMpP=O9_FFLTmp*RVI~s-9&v(%>2@l?GLSrbBV8B zUag!0T_qrW{mehJv-h#~(#(kqb(p>BxC}{Ac|^6twUbG;=dEw0Uj{zB@Yu}WT4}ma7hVEn6_sMtC++cP zht^0rlLj@UY5&(|91emDWKw_dhB|jcikJHW2U^UgAUAu73Be=h`9T!@>`61klD-FbgDZ=or`~!6d3A3OZV!g zlK;2IsXnP8bxW3h>&H}oPGQsEUsWiJ|6Cr~JHygFll$La{I#d%%mXM2Fp0Q&WeRxt z_!jT44k9YvdN5b@&iu;NlKx3o-SBfPxpL8hxT)c<05hrKfA?+qa4{dBHp6$drKLlS zcFVeIt|J!amvCjaQ!_R9QJu3zyk55J@?IugOz8_8Q_-vT@lk{tbN1V+{r_E?Pb^3} zGD&;S1&xioi;ZBt8a&~X?ZnjY?pwngi%5<9lvk5)PGCwg?2UZM_VshC%T}5C`flC6 z3E(Xw)Ut)Y6`TJ#Cnl1?lS%gll?n(5MDA)7_P&k`y1#k$5y73wMOt24f0EoT9{aBU zhAXwtjLh2BEoSMOD62H!UT53p)0Dg$TF~H>`me!#p8y9eD;OUie`b*u-(lr!$We)T zJ4YNarY!3-gIen6AhEyU&Ua^}(Rkv-w13{9cNE>hcGjx!>5A|&=D!CYM2s9&R`G~h z>}W+430sZaV_Uy<8`^ZJL|@?M(!w#5I=i`JYQ|hYt#wX!SKy-Mxqc89>{=<03!Rq%L@y|AdW0y9)x_S z{S8~3bB0=zsFeOHA8bxqEzcJP-hu$7A9VFIpX?mHeHGJ*MZB9aNCjq8auqZUp2#xc zo#};Q;$}z^vN2-E^103|N z;#6h3S4OIp^)Gz_6;Kth8T_n^eP1hKq#v4df4R8Ak+EC!XoK-bY`}JVILU3*=Vswz zLi8jP)7NA5Va0MM%gfHpaw|*qx$@7ZSR%JM!WX05!f2-C4xRArk5B>fgV~C@Mf;BB zlOFMb7;=01Z137C=e#3BuOpt;?PNXMg<5mDk=Xq(PSgH*D1DYy7@4P4nbOk<|1}x` zTfJqr&urGW4OFkIKiWQFVdFHJ@AcRIM6wN2>_`9ZR?LI{vwX z*->~Ogt?XNM9PZ3D2oYdpx>1Hwe<!{ol%v5^=pB#kX=w#bn;ct1f+r(?}pFPOMBU-wNc3BY*mvV(7cDNOSJ> zbT#MW>p&~o97leHd&l$P!|fxc;9+&ag7LH!`^$Ms$89?zaqSC1$88@e>`ws-1Y0QMc0gK>iCn9x3>$=XZBjA*V-}f?~yx}RciipQiX~X&PEXMD$)uiJi z7WvEVKt9>mup?vgO4rH@MI7^7A}RPbeCn9?4WRr79u&vM}M>*drh^lYKsUrpiQxa8xl{vyWlpbp*Weod0S` zV#>oE-83woA5ntSr>TKF{d`$0dUuUI5PluXn{-VXhtWCNZGHcz%6A*whf1GeWO&<6 zV0(YLC#adR`Rnd)y1}QyHY`LgeoR#ybJXqLJ(~4u-}~uoJt==r zBB#ikGr};OR!BlLxBKO!jF$|H@560J>8hT6+xCT|Vt;!)!I5A`pK~DwIwtouu9xHU z-Ol3K0C_ft=plUc93qy`ZyRD6VSc-B#st8xrD%D)CN=_4r-^LQ)ylSOm&OlKr^hIqQnB6OZ0yE$bKZPn|ft$lgTpeXaMmtLes{R2Ii{poiYx$ity zEr(SQMm{*^I|Kb)C@;b)w5x9gG!Toj-HB|hP}O=Yu-eWA0HuehytAjC$68d-Q%(b3 zFz|`9?}Z1}hoD0yqo+^kt6a|WNsE-s*LDKY*iNq*XQ+Rv8z8F$iHf(rMcK#UQB{6q zMRu111fjddq3j6AOYmE)0f|X);@U~*_3eyBS9&^~`FCz5FDdVtiq!ZH2_(QpLCIeT zz9dwu?UN(ms6T|YI*s{v&i;K3ow{0=vC>VVW|~W%hA@ZRUSktitU}Kbo&rFbx@|9o ztL<9ICU%B!Mk**&h-hy9#5AVo2AYvtEi8>H8NnH&VC?RN+5Fb)`i+;_gnAIfGkTOTi%;EjXj#-wr^)9 zt8#fgc6fUuJwqQx{Pe+DqewYk0%h?vVpDdwqPzYoZ?h8 z9OD^Fz}{<{q1M|;9nIg}{;h_pS@tK6G{ zMm)L5gIsJxjE%V#XGe8^skeHcOh9B5|8-U8@77Q!EyC4=-?Q_>R7(4n<-p~i<6t1MpqH`(Y_<46M}4Z|0h$)!kZy zAEhDZ$$KkK=25uWYzSx7pm;dcEA8nUW#Sb1V<(Ep?}Ij}hfW`ISb&BH&4VyW*y@?E zTEms?fbhg&%E-ibUFHS-bNOX()t&5 z?dU!$mPz=%@KTp*2#3X6R#GZ{Rb{IAM0tPz141_*KHY(-xeDv;n2M_qy^8A`?h3oA zgt4+e7B^Su)SNk z$r=k=g1zI>$#CU&Wjs0fU0gOx2baw(%L#-F5R@=dFN0hJ@!a7a$2oe7=u;msgahVK z7wI^QvcDD2iX{h=9=%5l-fB8&f4E;DulM8kM1Kop#Lx4@KC4C@y%gJ0NP^sMrPe@y zInphNjykLf4nt(m(pMk*(blscx9Hu&SHgvr^Cs$>6bt(-Kyna_JxG&k^iU%xma8NT zfJ^c%6_+to-vmZI*$$HK5vrD|4*lqc$HqU0&f$kXoVr;jm7n zZ26G~m}ER0^fkzr@-_JRA$qk?A7S;$1ycukJ$>iv%D~gz)Emi=;_|caq&HW)`x) z#`>i>1f#`gxhI6`D1Jy7MqU8>44ks7Kg6lM0Ao{OeuqiU-;sXBwm2l|zs#pMTHO_W zxPf_aUuu)d_u;@NCE>d*mCNC1xc4XC*r&R6p-F}TWxf<#Bpz$@dgG@mlT1pKze$e@ z?kdI|tp6+!@6x!|IpZUp0gZ}nk~&5?Csw(u2UoW2GqIP|vgiL%^eWCs*wF*_<$ZwCA6whw?{Pi(&UO_NSSx zMKRVWqDAgt`(?~`IG%P~H&iWziCpH^A1NF@FWjS(Q-OhRt8*_&`3KMeRMJL*M1*Ut z^TA+qIih6Z+X25v8TJyKpOLa%oF0x@CFE5a&}~kgDG0pG`NsT`9z;aGP@z+wadv6e zjJ^FKW4Y~AOYinLV)k#*ExiJu{0CpF<(psM+S-~QiA1mb#uIyNWshPrD<{nc7`9J< zhr5PUvy=r+?401NYmUh&it^UTX8F7){S9QOPJhU@%C6x%-8}s+gN?;6o_mGDefj0( zDB)2?9!#*}d5|GlT%>=viqF1!`|88%w0z>5gDp+M_qkiEE)tb{B``MJD&o@s9NwLA z{syj(Cvx6k47`SgZuJ%dBf3uCiMp(xx^yM|A*m0^{%AvRM?iJ}T-5JjC+xH9T@MnyzJIU^v^T7?R ztnx{1pB{nGUI3lH9i#;0ktjx-tj3Pg=jAXyC4%ptEbNi6L@7?bk`#Sdn7EHtv_Hs> zc8nG!C5bZK$@wn zp>Go9{#@Lk*u1iDk!{K|9bFx+dy}|W_8o!UdmRreEc%)U5{YgQ%p;2{Ovuo_1)5%8 zI^THSSz#>*rhX2L(CL_JfMT^mRB$kvZPdB2Lr;^wdXgW#9Va;G!nqp4lc9PK{T8WG zzlk1PgE5UFhmJ6wCA`SierrNbw4f(Aem&1WpFn<)w()3TY6S6IW8qd0=&H2$y+}7G z&lweGp<^ojjm&C1r6(aqArNu(;t=i_Z!9Ys$XGS60$SC8+7PXiJV=4Qe5;l%d%EQ86U!GP`LuPI_IUS@r(ylWDXpwi+F@^`osptHr?aieZUiULT z+4x8Jh@$B89Q;Yj9|Vs+iUa0RYx=4tXG5N+9e~;JDEq%131(zD_}ySuDbh$)8sL!%DZn|uA>NB9 zpbDXll-(2?P+2}vxI4%M3{Nu?HAo}T#gRvgX09=ivI+!%EY2hnDdQsnte^!@o)iNg zDQ&Pu(d{NWwc8p9H|d84GSX6xzSU$CxZW$8& zhJ5K`O>erjPJ|%Te*}q9&=qce>9ds9_?B2|b@pKSV80*S?3Hb!zSC+Yg`>(?4>Wwa zpL?2lW>8gtRI;FmwJLf^n%Q{g9Z3hHsrVM_2hkq!$BC-qJk+{*qhiR7vDlB9s(qVG!#lz`VHkx`5f3LvUaTYS-Q3>T{#v3PRjxIiw9#Y$y!2 z^3`U!rNqz2vVHjlmf7fZaeg~C_1xOf)|chs)z0eFy}v#k-I(tt*roK8ZFa?T#WtA# ziv-xKkxZS-F83B}m5B2D&1t>)C>ujT?;5^>)1(YN7f!3fVziGDFW{PX8MI26n>MIM zbpjoaQ8BKLTtKN$qOpZTv`nP*ZPa^wKJ!!80)0(>G4`mCP`-pG8_|2mBqLreh&>8+HXHR3-Z|f5s4R0Ue zMPU;xT0aIk`=oA)@2TrNUyO24;ApK^;sHg*(*2juF zP#kM0zrT+EsbVl5CKu^+SZ4Jw!w1q5Ti16I1?rNLK?Fj3^?l)`prNAl688LV#Xibm z017#floBD1UzN%;#mYcBagT=TS8dyDmICNUZ-+DKMl>zE-sZ5Bmaw(`kL4Y+A6dUT zG|}IK@y97OmmZn!#0+jO_Tmi#bD?N|9S`D~xq3X)JiK(+PvWzrG=nR2p4k-S(YAAh$Bt4nGSw z5a~j(H|3LkbG7JzHco&J!WUfPbiVnEk?cm4)#iZ}ohSJ!^?TEsqa$Z+?PBnJNc16=8+BV<4>(aEiqSS5v(}-3_L&w38KmG_oa2i_u z84F_fhYJRYueQPx=>wg5Li7k~*l*LW-smCe+#il6LYN9dg@$6%?2N5LPJMFQxD^7@ zeCN#{Sq{mtoO|aetb%;ufZbp0K@zwX-$z#&>RU>MLX?blJQPCo4U#I+0k50Y^mAb8 z>tYjfvL!8xLAdG|xc?8kM={W~OMjnG<$>2Y=Vb>l+5#d;no(hjPR2lj3X`!vq$ZPR zaVS}ad0t@C1xKw=apTrdFrfgGRc9#(IZUE*!aHLtKtHk3c01p|C+sP#Q_`!R=O*;r zJN?=fn*N#F1FinfGWjtt=ysHQ;&%5SBxt+pjhDP5p)-ge$!~ie$rIDIN{6$M7tPEM029hQYm{OTJ$mPst z(mdaHYk&m~xlfiqV{3pyOF)6nEFXQ3Ea*ZJ$?p&ch5rs+8DG77g~N(4Yfy2aMux?_ z6K}q~=$mm~)xh*~pGrF|myaA0pV6F&<%u!MP)yiu?dvqW zhMwHCuDOqz-oIv%YAm*#rjNjkJX$?Q1G4Z|4A!It4kEt>0t-1Mre;z81ZvAYMRp+B zu~$US+Zg)EeE8*wUH(&)WkOX4QH6O8xX3eXP!UN6=?{lVW>xJL7rB67WGK~JWSMuI zK_waj+Gzk{%I{Ey8Eo_3#CJvGVS{tFf1sG`q;avkw^X&#t`ZAjvReC530SzZjvypu z8n}mD>?S+PX>b}>2!j~Nu88^}_tBFb9^p7^|LfQKYbh1IX++W5qA*`GFxqiVbc4Na zO1g6CB^f-7;FwR%;a77uHgd$rNj6UGpw#!sW)hcPd3$#YCCtjq5=@vRs9o`enp2-& z*og0BJ|Z7Ef9pFYa9v|_TYbJAbqzo2ZFd|`!x_C_6OvVsLvoVL8G&VXF2E@D;?ddx z#poiOoyvK_=CMowlb?g!h64prc@t(28N8Du2{+*q~@T3&=cP^Dcl9iMI{74G>4R!fC>QHISr&~R2 zeP~@ruhdd#oarp9StfmkZ=^3BDlm!h1XPNQlBP_eDzqT)BDPz=5kjX}Q-C4}O?yo$b_(@44^c(aWJTMT;#^}i6_{c;F{q*-r2t3oixIU0CpG6d> z@VQD1L3(7Lw~cmN@d@{8jWR;~ao~83g@Ecp!o0-E zTtaL_)J%dk(+7Z@BT8VQ3G5m=3^aT`PifE280UQJN{poRNO0dsvmf4>^21es5vJ=S z`Vsv!jvVZ5m~VuZWN-U3wLuIHm5LGdEK!`dlJ(FTTRW{(Vin~jf)@Vtm5a}*dgb`8 zlX9*n-UhI~(s8z3@~zL4QlI_iHCo<$`AaT;RkVE3&9zvqng4swX=K(7@D)US9;^To zKqtc@?w-WL`aY;-@Z?G&pbhEef2N#-f{83%&r~~m=et{GUD3}A>dQj!#?hrJu zqRDuy?V`G5XsSGoc97l(w6q2QWFhcRmH)un4Ytj59<&miLwulYt|PzF!U-UKZFjrH zL(reQ*~h_`&ljem4aq5X&T(bR8m7rnX* z3QJ;U->T)YN4*whI-p{Ps1$|g*i40oxH%PcvHpMy?9AbuiPr#@_~F>S;~-mCWf9+k z#H<79ry!Nv2NuDg92rA$V)2fT1gI~8uGNwcvW7&Jg;~`DU$|Lby8W5TQ8_62>A$FR ztO*u9U62N_-f~~;Ot8BOl^K!&264v_&CDkS16Y;7*Smr4N74jDEw6j$6~6JaD&|?c z2ED8=hatcIF|E`nbKCqfq$0_1>Krg@NSbEHI+t{|x+pd+@z9$@OOcXB`#6B<@jeTX>eTrGhu@u?8EkOl$uRa9ZO zYzwX$Yq~aP|NN&QO^X{Gt*Me}s+sTZoAasLG;uy{<>rp>^_x)muON_R2B#;_cTMOWwRcs1K>fML*xl8-+AMN-4w1IFlM#2yE)E zL-^eMWl0YivA}twG|mINtWZ&ZJ+~IvEb$Z}f6CG_W6hHwglw8by=R8V5D= zCcQHI;R$d@+)vN11l(K`^E@R?8@b>2VR7}oost(-5bsc}TD9IZL@0+WkiI)Dw=HjU zKH>{a^E&tBae`Gox6iId(RMyM3+ZLsi4VI|>>F;(dA_gRWNU)hZz7{QQ%wHqdUw8Q zf2R;(97YH-_~}%5!+e_1jEqLvg_Z8}M^pPwJXFJcg9O*(3#QFRk;!Cshl1jf%Dq%F z-}I@WUd>Q)`GN^6_@p9zKILn@dvkG}-PhV3f~tllExY59+}cKaY>idjwgtKvlC4Nr zlOF9O^o<$LAn@!=9B;MVfSz?v<2$bfVIiA6fp_p#)y9Z6wuVj1Gm}AeTH|WM*c(fG z#o5QjpOAquQhh|mV}BraOv(IC0MDi+CxtR4FW-)}Kr}ZT^^cgZNQxZgWT^zC_v}Q$ zjA`WT(A- zHb`>pne2V$z2RVh+kKIpP#4CtUFI?E9&>9zDq zIfjOr)d-p_-M3JBi^qK)ZjPuM8aN^VBS_%T*BnBMRcibbX5?MX8 z<61fK?j|L%&&OlfUq2aHlLerFSUA)lx5kV7qXEmeK}saqyjNN4wZ7Z`j!*&JJ_ z7Q!1Ae+}vxsvimPLh~KJ+LRp*`t&c_ZH66F6sch)qkg+h!oS`M)Ks?OO5Xs@Q6heQ zm2Ek0IBe|caJId?^5qwSM5;WXq79^X&fTB-!%HFYkU&Vd4{1daH8h{3R|9F$rB@?Z zLx3uB$|O}XPrdiq1vyQESRlk@obarz6WRwU&8SkuH7_)clOns4W5+ zsrzJRf6kXG>{hL8!nM#H5FNcpkC6W8qsc37XZ76u+KN|r^l_P1;`4y#smBM{@zaBB zPE9C6u2V`=S@ybc9ig^;X{?E$G`%l^?~3@;WROjrXzw?+HtR!!6G9PFtb={|m1o>x z+pmQAjxUq#{9K&_SoDY|uAn|!+^neLFJ%nBAqE?ad0M zWYw6GnRJRsOPYA<)=wf`H8XnQlseXpsw zEi~np>Jge^UtSirStyi-;7R9o1*zQ0HPz<4?|)!h=bk) z2QP_eqJOvrUqcy-Fw@T@g>}av#7C67qy)w(-t2hwHhC9Q+{cMh8456F zO09ApFSuB7e|*;schG#k&q`^_^=CgASNSw>xC@0mgEwL&8f`)nOL*q_aYyu_5DyYu z=-hMZCom7vm~<@4u#HHCtp&ps3IRKEDYW?ZnUU%}qSP9l{Qly2YLhJjM4sHh?1Y1{*7 zWw+onsDC8Kbm+D{As(%NkWJWUr>9H??m54fkz!SHZ`#7=e;|q99kctZo(c(xP}Qs; zmVkQ3C6&zQQk6UtMsC71&OI$j_;Cj{Zm-~0RrR{7hF142qO3##g(m|D^NyYSkzVlt zD}QQ>lfz37lTp3i=f=6pKzX@eTa9vRv&xI8ht zwks`BKrn?K082lQt)9BRf?qokSDc@vI37W2E899{BmdJ7vq5mQ_ZrC|HdPCRi>?gU zn0vZ3d(=Be-y&2NPlm|ACyJtPh~_@UGz8@15Q=8r*7}L9Ey5pQChh+~lHRQdS*WvI z{A`)IZ7E$7P4m=qN}={#R6##^O;z-CKiAPXltBOBfw03A?_@KMhNpMeOcsHy)^-etqY$_J#`xbhk>>$l0o_X#FuE8*2^2H76xpaLi zu2|?jUl+mN&R=2fC?Q%YI^J;Z9nw6}RwvnS45@M=(ao@)<7`h4p-= zuAo_rBd^J)Om_hpjM6$eyC==UOVqVB?kEz;p^^{d!jq+hLPd^Sg2r18fQNX#flf;F zXa-WUya?O!{bqe>#*7LOZW6Yrjvf{aT_OE(irw1Wa1i5-4W3-wZq?)!?(A_WghcS#ItvsK9&>wD|GaR~Q zkMo0Z*fVrsbJQ_HQ&^|Jc_}M5T-Hi((&W?o*02<+Ir<*6U+%J>+R_50$Nh?wXqiG9 z1G#G3Eh>98dI#sP<{kEpBv$Se`78d(VjeHG&I?Hr17ulYO39WKQ>hU0JbRW5qdceVT(Lt9M143eDr|K4 zqtLJM_@!{a?0x#7?G#z1ZxX(s%*-~GA?z85DE&EVr1iI&m5r5s(a*3^PRO`FIhYV0 z05F;}@Tw5Lo;UTyj^Oo!>QUc^i9Y6@4Aim^4(v{V^c3zcl1kX!px!~hGpc@>UQqfW zjg++G_&hRD@wa0>BS{Xur?*NZYl4(kln$v^I)^Yb7h|boD2@jVG7h!31 zlx`ue7>F?1&#+H}WX}O}h&nUO*{C_KU2cHt8lKWcdC$RnRM_0LJpz4uFT>>vPy?t& zc!%*2;+(uENX3(BF2JQoFD+ylPC!aUCM$&k$PJ5D^9Jb@d3^1-1ZZHa_U&WcB`)%R zEeNvtxct2U-;QY=b0~9USlqPSttw&k`Y`(Zc?W&WV1Ie(v@B8XGL2=a|WLi|>F^<&mkn6?kBTBCeF-+G0^o&Adsk}Ve8+3tW z9$gSCjbS;1@~-5G;5NVx{T49{OeG7{^m}<&ec;h_BqWOcb-(|kjoXun|1sxj%w zO=%{^%Dh(tM}*oJDS$!cPp=t5>N}tRxgNxq>jlKzbmX+C4M)ZW)8^JR%q(9R!=*vFzICYk- z2wl>9J}|dZKMXvVnw1M^M5rV&yzGEH4xzR!Ef6YtC6Ok-sg-Y6fn41_3I#b zijNYKX7v+kD&`*iP;iU+PMIHBm>0(Q_2&k)`cOXmwAOBFNSp~3LbLL2Fvm7oZXil9 zWqZ7eVKG-60jU|4{@xPBJkIC78^zU)%od7D=Iu1NKr67fi#7SkS{Bt8)n!ur;W&sv zMM<8ZL`1qiXG3>`BhLegrRzi1F&Q$?GPFebgDY48HUzE2U*Pq$wp@83b~-VphX7vo zwLA9b3O1i*M!Pvdqw-1Bto-qZxU@CojUkP3cvKQK7&SvO-OblQ+Y(ly^D$htW`OHb zzG8uEepM0f)ZR7BAd&ir`p>Gfo)PidiQtch{7JtY-dSq{eSn13+@PmbrxDg?ZXJb?bYazjpokM%G0 z_Lqedu0c>)rr-Qm>G880Ne>FO9v>I#Wyw_@)ZGwBmwm}Ac z8jRRRg_Iv1)Y8}71y67oSE%g|zH((c3XOQUJ6OaqtP}!CNUQ%eC%*lPWdhD3yY#VZ z!KuR$0U!BaNkTk?Ct^hM!U9-h0V=xF^gd8S)NzK4_p8pv>Ejnf!VNN! zo8!H^pX1fpF)`~hr|2e3$Zx_3sBvk5X_7k>gml+ZyN5qghaGnxtL>Pmf71vkC|+3( zo0NY$@M8(|3rrON!#

    shJ6wyFB0HNWCFQ#ZJN(h>QGm@+v<3oGY;t=zKb);yd-K z*6}6-#faRl1&P2IiPNw>l znLdRWLiaYy)3=V@nbbvinQ(z-gugpIw#fQQ%~;1ZpkDmAuWlB~UJYAZ)O0B`H7d>| zYe)V$$~f|F<4URk$S~HCs>2~9zN?ElvDbrY>TeMFW6n{>%X1dFTWCP_K~+b4m`!dX zpXSG1Z6lOG3JHB3NzSj?w3;IK`mffFQ&b}qY!)DP5I>Y$LNryx(e^EZEkGw{3=@&7 zX0h;o)VE&n%!CR4&FhIb;WKF$K{qDXT4?5=6qVooBjxX4aoOY%DvI1092V5dT;JTM zolFtLM$tdapkrh<+Zc|B)mN%c_0@+EC9k-+6A2fWK~MhS&$!@McVfONDW>hA9op=5 zJEdu?wyG|)Qb}Yy?Rx1VdL-kRXen&I`$qpr5J@|(I~&~U4Xo)ltD@yMy!(8SfsLfMVLaT zVxpPc`)Bdsi7SZ$+{s)}psLm^f7{db;&iyOg4@!mFsTaF2t=BWeVki8yp%k1`=|3x zsL~Z10u;4*cXl|Jy5hPM7yMg>tqES{>wsqg5rOGs!8HC5?qj59i}vJ(Gf)_%L{oH5 z9OP$AgmXv{cX@de)RCy9n}|p}$Ys@4l^@NLAiYwUxJ!)fI-*-#@X8bZl)VX2qI48` z#IXIAc+hoH?l+v(87(|jJ3tBdq-2znt~{ihZ%O|1hZ12QOy{SjhPA&;%axK!W?e+4 z&#eowE}aC^PTDSJu>8up7)r3}PloBg90D#(sry8EVc$}J+kFm)6l4$z7Nwql!V^H_ zpA*svQUwJsnJ7R;Sz^cE7j^*$e)cia3^SKe%7_&@_p1T;Q!*5gyhl-v0o5x)=N!0zHkIGHK zong;C$RwMf8M%knLZlD+HkJlH4|H0Cy>8g>>KBnBjRzk#ZA00 zH!^tc#%1)osqx8593Qzwd5K@jYUMm@&zv zBJSOqmF4t;w7=l-OSq zlu40nS2cqWWq(U*jh%00ej$2)%VA{~&EDd<>MBj%^(jkDHBTzu$d9q}!OJGI>OsVj zl#|FCtsKlOfc)n$yqDhwTw*eCh^RmUVr*Oe$Kx%z?6eZqbFy=pBNj~ zkkXD6#o#{^h971Rr-!s8Ra|Bo!>N5@Mcl;?VOKdT>7hbcA5<)hp+Xw-eX z&62FC+)FjS;+>G{@xA?RZTI!X%jWjVR->C7dw@d>gcz!-FMUt;Z7rall!Zi#%F#hL zh`O5-cu||Qi{z*XYW!Shao4jU_RnU~Xf_mYYo5@w+37hUd~>-$p&~`c=^05OkAenI zxr|5h?HU7U0>Bi)3%!!5V=Pjm8&(eHP_6QordfaF1}9=#7~<}vnUf9%0o@D$G?9n6 z_{B5`CqM`FJDdG-ry0|*j} zxtbgiT>k?C287Ze@xtg}4Etm}>xXKV*D;y1MA1F92=x2|_&b?kpzrJA!q)L9R~=@& z=(4gdFCz4bdN{{IV4#1fKeV==hsBZbqR~EPA72IUoIwMY`WhAG<+ZBE0g-idWM&VMixYQ(ArBcL zI&2H~kr1hL885j90-hT3ARWa8dP?0XHg0uF-Zu~8GZqkOGs8o*7WGy}=BF>g0=5WH zUk>i#jSDo7X>ysRf(gZLOit5{f6j?OTRPXGRi(6=s9T8|)Wrcs5d_@8Of!mvYtCtS z`u(vW<20xi02My1ON>fRE(0-;^%dYU`{&A;^5q;kPE=PuYsVP~VD6#>Y^P-qMCWQ` zy+T*XJ09%2y0{8_qf!vEj#V?kr&w!VkI}Vqv@+1IXwp~K)kR|88ij8@mGY|6)Zn*{ zlNx_scq#&6h6?&+_VXpZ{UK*gTcOc!j%tv`hN8&~zX7(e*P`gKeIk}4_NI)>Tk4^5 zpghRZP})5|kurUe3f<)LvkIyOjR3PtHFgn{Ln$dR_Rj03-eNXR%3F+LC)EWTo2)jI zUnEmCerNLzc{D*S$0VAw#x}z^lGPL{^Dk5iQF?A3O3K;$X59l)N@!NnS=oc+QLK=D^Jdj{# zcSrQ)r{93JN)q3I2{BBY%=WBx^=Z8Q)%Z&Ph4}lGtjfdhFz*7IhZ-z|Q+D4oH1^Xt z!KINjM1Z7E%N$wkOx#8KoX4`y2dHDZ1`y=? z&{!MFtL>55^3?k_9|`-4KJ3C1%=d-8__?hWeALoZH85fF(eIT*b|Wl_;5rgP!o_wa z%2U`=;VyX>-0KjHt=@C^=6;X{X7dPfxnG(`x}O(vh=s`Fc&tfs-cC@c;nA`~ zvwEfN8zSdFu=5(Cb^*oaNjOW!qci`I{&e42U1@aJvUgSg$d&yL$OMfQu<|R z^g_%qCY3QTFnnENcXMs&&`HhBd-18m{S{CGfW0ok1GdSu!~@;8xQ=&|F}^c`&Xo7z zgBnx+(62Y}0>)j&TV4VM5gCeMMaEL&~ zq2rXK37`%6M5i?t>Qn}(m{7o5`dH1#)Wf3F6LTIfvh5YD>hKoIv-G_a8YGC~-Bp#} z5w%9DC#1Q*EmTrg5O>wW2+L{_+6+nrRZE=alXi3VSu6bQq^QTCRH-MAW(y=$-u)NS zwC?6bJhoFxFyN(Z){-6=o9Z1uUo87pBNrzDbjS*V{pIvh7*tV;{Ig$86~3PXuvO*% zKla`-Dz0tW-^PLjf(8rj8Z5zsH}0C?t^tC(Yvb_g_`|%wkg8@zGHG8g_RW)n<>Y4n~Bm^cK6t2i^Agg{dBy(KP0G_L}VOHo~YF(vu z26MG7C!#N<5lkY$RK4oS3wi^D95!~lS(9`MB5O&jQBkq;W(nTEklW^*!jc1s;ge?aE&2UvuAMmu*p<$e)5x$ zZNzN5?V^@uGqra|5SO{|5Auw+US%YkLGwMYqH9pZXp?n8R?Nn?m1wz>z5+n^jJGz( za}-9YHOfHfSl^n^1x_ShL~ud*5aH5rB$F3qQELJ2wsg*qe2F8s*N^bV0K-yy1L>ej z7Myx5jh5IK?slz+027o8p7RJEt-A+9K&mx93~)3J0ep_k3;GBG$+{6oC!zP2s}_!g z;KB;IMe`2F5nej$njU^{3u|&4O8BsAG*F42^R&94{vmm78-Z7$e6-@6NC35gSZ@F8 z#-$A##NmZ=*L>?lCgg=oCNqXLN7^!=j=H5sT@~zIjjN+N=X=LiftBx>KvRKI(Il6Q zu*UaYyh^sFW*@qQGZ@vF1$AHwg(D-&jjz$Eobf9wsg2_rSqZ;13tz+L(`CTjU8?aWzoES+A`MBho zfQW02^^0;}>PjhC+Ee=n=}F^$m;&fa3OF4_pIDigeE~gR&9V{;!Cn;Wg}s42n&ta| zHIS!RFJb_7G)V`JW=!t%T2MC#WgrCN$`i#S)M}?u^%^ulzFqTOdJtn#6eejtu9rW)d)m(mTRr@W2z=OMPyo5SuEKYVV(r0}vK@(ddS@(z&+76$4A5iJCz;73BpAYuSkU40!SL63=IRR z-iK+f+l!8XHnDN`bxlL`Ornxi`99FD7uK*^IL~FikJYePDv(uGMq>#hDU{kpeQb&# zvp|p7hIxmXjfsp^Wl?~oZy89iR?yamAxu!9C{GmlA=P3n+=a9&UWE5{4gqG2wn`3f z)Y~8zr6oic8D5Au!=HU&`>CV*MAF@|1cgfkSsdZ`bsX!)FQAWATp!8oaU7Ao7Txfr zVQjk~>)q=G%R}NLpr|EEFAHywP-S@Di1VzeHyKu20gC)Sc{Z<2@|vn6G|NVyyFO-4 zWQJT)iCV~-zX7{_Q*xD5TaIw!+4fxP*-hH-U`%vW>~_RiSuj_$7T%@g2U=l-#s1T# ziroUcFVyASpAG)dQm7>BprQ%;0xfLObvaxt)<9DqD)cVVdyg%)AcRN6c^fpkacsU) z-T2;=w$y{dxiCV?c^E0vY3*eOPdAF%@%2_VnELK|K?9 zbp60uyjJ*t?zK|=#3dC+d0DJzKlJjVYGDEzu<*6}xazLzws>ysa@*^6GEt*@9zf7|{fc~Q26!VlBi0QbBiL~Ta1+Sv zBANb#b5>_^kyhHb$8x}o9Iuyl#PRSVxHj#(f7Ei!0dChhkYQEauOSKjf^X5OwCf`* zj`8~%AQp)U?|92Pr?fBs_{<*BJiUg!v{U#?JaQqWlB)X8pfLgKp(;qjz?}CVoqSA8 z`c>)~Dca@%^y0%jE zn7k6l%;5f{r-c=l7*{$6zyc211<@F>6Gay#$?PcG(kMps1|F}U0hlR31JAR8Hs-R)tHp3 zb-h!1C<|WW^{{9oiOSs+ZoE0a59dUd9p%z zJhF*sXGCd17MO1fraarFN?mbomJ#tQQY^1_ZXz#i=Gz6!AOT`tJsw3K24wm577#Bv zbB!6pK^%u&KR=v78HoS1h}HWWKl2tM+)QApYf~NA?`ORSK zo~Gb8JE@L8n3O5WKx!bk)Skjh*(vHF$<-tl|7NR3oyp$$88)Nlw!_}3lGW@J@o9Pa z<-lcJTX#QyTf%gK{$rckEU-ss;nnS}yve6L;(S2h3hR2Ohj!OTH#8(D+2j`;=-UsWw1fdVGMOK8w*b{3Y+UA>(XyJnnWc#?Zs;tp<4BIEkfL|m6r!XW;R z;Brs`VZNV{xLzbfK_AbDFl+_NtS`U#-7gzx(J%6P0>L1M!xrzeUF7xF)icxdc*p1(-jbu6Py)G&LW^8R?-akaT=Rz3AZu$a zS)e>xCzdtzB(e9qbBp5+pioZm zf9=AyDeY6Iy@|4D62_HMuV$%eY5WaC873B0H;5p$D&H%K)I5xWQ7tn9KX8aXBoy3SbF>L0m z^s|oir~{$|6c{SBJCww-CwrIT?i`{z|5O~)eYo;>UqCtQzTLJz+iW){k6LgJ zwZQoLX!*%Kmjsp?6pE-V~68GLWdZ%uymOc3M9wAuT3?iEs8JR#9}hh=4zG`Mk! zL?5-~WpYXv>1lpjeil`8jzj0`<)9blh{O#j9RZhdg8a@!*_-(LK!@aq-WlVRs;+O? z4RJNkd;>Zd^l7=^4bwX_*_Z-<6Eekb1gdBx<76Co@qRcyPF<_Lr0K$5^nWe-oo;>D zZrPCNSDMsZ4A2pW`rugnXkh+TLu}(yg)w52A&J|BkP;&)94-qbMg1%FcNfaiIGAfM zC+7>+3st45L`qn3#A4Tex!;#1usy#1aoH)$bf~EKTZxgb)P=Sq2ur1>r+AxzlJm$h z*su>mTSmn*D+k+EYOrRv&&Et(Sy4bAjXcorXG|d0ojPvW#Z#O>k2>pg$UcYBGi;B| z+rg95RsGyOmQ^ArTHUL=YN8q?%y`41pD$y*(YoWO-DI_i6-Ew(uAn9n|H0|lZj;_K zzxh%l8$?_xw1jQHd-Ne}gk~0gR{XF@t~b6$a_^3o5$VQJ!SE&ajcUpm?DN%wHaiq2 zTkVfuP><^?zI^=b!AQAJs=?d&qDrlJmh`3VkLN8Wbqs*S?7=SPEX|decLDBLk(hYl z-La*f@?wS?+)^#iV4ckz-YvBk{zvWIf?q=}WWfzFt%14)xs!qyo`|dNaW9@Dzd?DDUttNIW~M ze~vPYFsWX+eg=P{-6%#pi1s}z6j7U9F0cVXI=G2>{IcEy)HxOpt1@(rID#wVEC}R{MZ|z~Wb@&e{4QD%#9Oe9 zd$~hGyD2R&NJYKxUn)(w7DzHG5neyP`J#pGL+2^vBg?H&TT+%oC#guz0olm94(3!( zy(INpqsEC5pg4H^y>PRAoi;Cy{uz5xf|&P=ttHST;V8$(&9dZe8FM1eAjE5w$~5_SW8ajOLFBFoZs37u z_&RG;J$B%*ktRT6=vAnC>@XcC4*afp$;0HD0rZ9O2^S`u2QX?D8s8LJK6w8uX@mO1 z6mS)UPA%HkHkX(!pY`#54SHNj1Q2-&0(i#sz6EG*o;Js!^iLHnr-tj3@#9oJ75V3%$mIC-PE806&}fR? zG63TD`BSL;*+t9VDYwm*NA`#exD{$+k(Fh)rUo7BYMJ|L2v1#@ys4fm^KZi0OB~o@ zwHn(ao5p3c_j>L{IWFPXy@@i}DnDK|{slItvnTN1(25rubt$m+ER zq?#t>+;11y=xRnB$4kk03%ew%tb%wLMDPDXM&zaGy!8TP_bJQ1kM|FGI`8fx2dAnu zh?ODl2;%6}2Lzp{OM)l5{^XwU-ihnB?a_Qej`@!2L=>=ic@5y=8+D*o!KOt+0T(G1L{-v*& z3eTo?pR}1z%#TGtURz#ID+|R|Is)|cPyccYfj-vPkV(yzBuFKs=GIVs>xD=?{-4){ zqwIY9u-+587$-?;>6OiH9D=WirBtGr!-7@sHdfaH@Ze_%FBppJP@^eX^ZxcV);wr{^D&^q*e=U=R|Md+$+tXJ0FlaNM2NxGtLsN54UsqQbPp@fEb^svQ{S8PIz}i{E zWo2dcN4#7?ZRrhGi4#xol0OKS3)80w16_(#C)MIW&Z`V3ZnI6>16_!O@JpP>Df8GHN@L! z;vis1Yh!)ArmAW}zG}p6WZAF(VFUmC5i<%V-_p^sb~gArGPTU|VVpolE~>xWqESNX zOJ(I%fYry3`O>Bst0<{H6&n%`e1*nbKExk4MDT7J>1T~Ivz zWNFEMPEiaEeOU~xl`B*+f}0NOm}xAM%B`pv3Be#crcxpFM;?d3BcY!wmxC&10N7^{ zj7;@IS;F6&L?Yn2PI0`$?H1jynOgN1q{~cioA;4H&TQTfGc2x-`WSdFpVB zl$p^0*lm>nxhzuVm&$)LA9@=&aIxG0U1#+CQ1wAkNNCb50A`*4Q6x|KdqG<6N2adw z@wZ(#)q5l~0s|s0>#F*Xv$t_zyWhWB;{Se(VBtMXVUReKLIzg=9IDhu>q9pey?2kW z@q+Xn&!xF{GzDNQh!VWsCVY=`)yCcgSK+u!);DKc4{wHH$m{+HEq`Y;FS-3O!(`qv zvKF7x$$*M%m%fgRs_lcZsIYB{Pl$nqYwANto~;0&S^+MinQRKn1xC>;0gpO;F?HoK zQy=@%+rPB~8hJkpbxIX16)dfRNJ8T$Vx24~*{Khz#2W_j_Iv-li(eZi3Wu1D|uxKl|l)>--Fk>&Nu$MlltE&qHST+4p68JMV{KwK$L&?3u41SfJ z(=+8msv+pSuO=oXuBNV}dseHz4&y@esM(Q-3TsQAy?Hspe{#+62%r~#V-!pcb56~v?xZ3nSDjxZ9!~5CyA7D z`_>9qBTUz{602GMorCemrV^fFz@RnXlhhLnK|7^n%t=ytLfWM(&)bTOaeOobyz!!} zFz(;3BYJi?K=03?jzJdV;{cemd9lF%;YWvJg-r=(G}Zqebo`Iy=|A`s_9Ti){;&6m z1N^bWyMwaYzq_6PFiBw(z|~SwO``v;E&b!gEhzx}%$w~zt@-!x*QX(na{vY#7iWp| zca!(eAv;h5frfard7t^e2O7*YV9bMqb$@Gt{~R*!QwWJR*LD6sCI~DCjM>CwLFB&= zIhPo)g4YAJ6?}lg{C~!&f4u^t1r|34$I<@|iT{2@DH^yH$v-vUXZ^i_|6%NufUUeD zOal}u|8;`sC4pNpeEPY3wRcN1q%@WGJxpJvR9mFI900rkSfhRf$^t7C{aHpV&B44{*y#Z zjs+VuHC_IG5$KFHeZtk^gJRyDN%5cd;@F(;j`JT)jE@^WVKx5%&-&b2YF8Qff6-~0 zkccL>d}H>#3g{D9Lg(F#4TAQQMH<^@J{9m!g)Z&{+|Nv)0E@}E<+%CdsO#;&t)3j% z#sEvKI-561`#;tgv44NRM23)WJO0}o&tqQJ0EILT8j6hMWIXM!c6rNoJuh6KM~zS$ zOy%-iPrb737ichhr_KEX1!n;E( z=4Ki$1jVTys=LFYlAz`Xb)RVB85}P)xpY0lKRoA`MIs;hOY9bAzy!R`b8}_qzb;{V zez?!?!>`?+ki$>7TS+qSI(!u}KnWGZ3`VDMxLEN#sSgQ3gaX|uwvOB1=MA-^ziE{L zSuMX;&OQdEHn3l?1(Gn?dWg@Tk;6ZqR!MWJ=>7VCIFwvDl)C!*`C-TJr!jIK6HugUhA{U*Bsy1f9gH)_jz!caD42Yclm#UtQhQ zxIgmLh`B>jo|(G};1jaW)Uc{TH6xN}5CF0~_J!So-k%qLo(y>P00B)0tA*#~y!qnyv^Sow_4AGQ`Tz8T^q{Am z#p&l#xj&Z_VA5l#u%vv>zkhH;OGlqjuCxl779VFmOE*gbiT4vB{sVUsc&fajd1%G^ zN*4;y7uTqycvk>OoH5Xy9a3Lcca0=XQBj-#w#wpjF7wUBjVnd21yHjMKL9Lhw(o=c z(|Ys%ov~W?#7~v%>?g&Ea~)28tp~oJ%z4=K-9J1$-zxkJu- zoypc?bkHrbE_=h{H_%;ZNcdnJ#<$hV*Ypami)+91jRZlf<-MMpDwKRag@$w_9A(gV zRAHQayZqTGcNMkOX>X+Z>82WZPirFW5EE$sCmi3%xx1f2bPFjqRnIm<<)xF2u3jus zGZ|kCj0>)FuK>cW`S!M>9`=NzflphB-MsRBOgOY`#jBkh;;Xkajn<9JF2kE_mM2u~ zoHl9;N`D#?kZ#=ObOJf{;ljttdeh^i!|kWlG0gpHM0zaK^xeI)HKJ$pE(P^4ag^fx{vM$j>%--s{*0~7DC^#-~V8=dt%phsxj>?XQW_&}}Rd3ghyG{lEt##C777J_Zb2zq({U3RwV)lvR zc*qEO*%#d zY`fU-V-czrSeT|3`16g__uF4{$2xRjkS5yCKmQ{y5l%*41GCkW*`JMxVO*%5VPUG! zfT)UBevVB|PtUK1k{ydHf#k5!4*(SM$EWs^`!m?jU--;NG7}H79CS!Mf`7eYl8Yi> z?`9R~Jb!#rxRJVVV(|m8bC(5ltW-{|osq1Mp(HM;tf<|C0Jq5o=%9~aoosdgeRp+p zM+f@a`g??5&ne@rWjyh%SGFJVR$qOeRu6T4X%l{8cm_;95!~~*8^E`(DvY1>>9(9P z3mmb&!P9eFeE0+!WJ*?9RF}@f$&oCrqt(MnU%XAPCk0n#FPjc zL(&h#B|_NUoLCKs5ghbLJq5aU;Vz5b5vBwd1 z17r$j>})B~B#g(eQY7~*Kk=rZt!#H!Od{I-*c{f7m3tj?pi%$VtqDCWoSdm{hfiC~ z@z?8(2-h+!RXuwUz^YXd>dUs6Jn`D$_jx6#fY?ogRaPJowP2|aLJku1k(BCX-;?dm z>%x+F`C_u%{r%I%*WVf^cUkq1@4NsiWjgD`5KwIV%dYBH3WhzA;bMTy_fA1l)M86S z1vua0?aV9FS0u`Lp!Moi;8+psna`S+Pf{!J%r$(FvpSY?+6*ZXFE&$v!)GV#0gCRV zy>#UAo=}YUQy=)&>Y{)GsR`Wa_-PzQ?jO4jayTH*#4@l{{nNbyp>bCc?v43K9sfz| z8$&FB{AKe92&{gl!14h6{G-~O`_K5QJ^i0;JZ|?&7N3amv-!pg0+UCWl4-P1K+rc2 z_|%_N(k1d4+rGy7`D&UR2FuOP5B#KBxW(fXYiInES73`5q93)jGun=3h}wXV-r6~= z0uO>%J-6i{^1%1sMF6*>J&LckyuI4p-LD#{Pz7e2Pr>tnfHh##&f5Y5tkEo)%NE1pl)yZbwcmdhEQmk|9^z8 zLTX`?-Em1W8-Od)g0J?3bbXAapP{44zX&0+{iR$kNo*f<1TgXi0vO_o4jlo`KanUS zMhDQsq@Lq-CJkN3@U?)RbaXsMZNY=>bb;`&?0vP&<@@0ESQYj}ft*>JF;+kSFf>{C z0+bsHvjM?>{$&#Lx%Q&=XGq&OEq<+~t0D@ib2Y9Wj4WG{?I?MoFZ1@A)uw6cg@n90 zJ}wG~4yD?Q%e;2!E2&)t*5_;MdnYSo+P5E#TP(I%ajs&Z(T~l}%vaG>)APq~hg}|5 z?$b^dmdbrojPnMw7PUSP&&Q9*4}UID#|S@&8K%#0zja)g+P5u~IIyxA+RlR>eE=ZU zFWNZ%V;AOsh$UPKU|7Swzp7cI14(1KzSsq@fZOi@$b8+$il%;{FWC$?pkz{y-8`4| zVEhGGBx1~#j2QZ@E-ZLNv^fz>8Zt_qN`QV!wk%V~NXfK{@#^g$E4STKNGCMU9LL#f z?(x3}1*{PRws#WKa(*3Dp+RR|U&ra0S5@D$tSzWjY3}H4hrq|r_XX(Xx2;&VwEc7( z7CnkcJR;e`Z>uUB3N*<#-tK$Q6`TDWBqXH*7cLfXwLGF>We%#d@W#~*qZWbly(E~U za21x#@qZk!6dxa<{?ccKHt?>$xM}bc{!ypU?N5Rbcak zLfs;GpidG6GIJn_Yj8QzB1;=OgC%x+N@Umkk#3Q+`$$!DfJ71*?+{NhjPGdI$~8Y1 zM=^_hZi7+@OA$*W={8h26o*KAfzSG*V+LmW1T!N>wWOQ?8>)QFs zmBNkFV@oKiExtIGSc{NrM4{f>3pfT}S+~O+CW)qGqNi=AOaE^jebCescGu;k?dmp^ zoZ7>|x+0>No<@QAqg%B?N^#0ox|`VmM%K6E@v>f$B!yYXoxY?X*+bJoJUEc##9?y#p!w zo~?L(){>2-`Z0xwI`3C=F54xG2)x&4s^8PJDiVp{0+BEpR26vpIy{E`1(kvDa6c(@ zulgzD;;vt-gzRQe(&GW0Y*&?{72EmgOsLp&;oTE#=Y?ZE8sx=dF*V`JN-ozK*IWn4dCohCf&;Z@+@ypADetT+mo-c&nX2wAZ*`RbE;# zB&}JV8Ovw&ONofv1f&q1QyW-=t~E(p>%xs26733GqJdvs4L}&wc@52`Vm)3sy!_R) z|HXpmYH{iQYf;l=NF;$xPl)+rwr0CmQ_k}hvcR&oY2A)L9*(h~Ae`1Mi)SL9*1cGF zf<}O+L>n)fHdQSKBzSBrkL(1c%Y7AF@V5^wQhu8@_bGyudlj$F;tGM4Bspbqwe#z^ zK=!`Da!1W#P>mFeUi+!oaXAGD&5%=#2cj=jdw^q0c1n`A=yt9g=9`_%^{xCMpAzU4 zkJHjGSMYA9RuRBpQ7PR<8~Mi6^ju*O2bZl?UH^|LE{kjON13X$c1Ae3FSd!k_xth< zeXp7IdFN2<6qJ65Q&KwbgY6p@=cJo>ylkWQ_~x^YDV}F(&!+MYl*i&MKlCSaX*ak; zOslL&rDNsdi8e`NJ1)}xR8t9Z$d(q~5p|15^(BbNv%GR^+*LtmU7!|b4LG4e` z-5;AAlPMe9d8qEbVPxj`>L{SBce0y*+)(C`YqrwT#fb5sP(m7%c-x*4!E%hJfThxi zTBeL%Xakr+c!;p=ySaQw`*TJ(N+o0jpl8mmnSD`|K6)rt3{LLolgoJIXOZBZygDj> z7JSIWbj`GL=kikau}Y7eAjKI}QZ``>`{g(Xt}smv8-#>u;$^anGfPMAw`7KRaoJ zO@X;Ka)J+0A2H=F97#@DuBP-#-s1bXtBd|K)YAjQ`$4x*hYLH6QVcFRVxiAn7EspP zusqelJgQ(_*hEm9kuaUlN55zb-`Ru!0y&tcvPGw~5*8?T3B{=y%bPDZT#fmNDX&M~ z)o3cGzLXmG*sG!?lWJzVrcb;G@ACX1OSaKC#RC-2I7DaTfUi(Ot3Dm_ptZ6kc(F7p)ep(`$9QmuIp zKMBQBA-ta*^bMFiEKnh86lxXLy+sH*|JM`3&0s%$pCOcDYZ=BKA{5tE;R1F+Vy$zS2JCn@_DP0)-j9OtX( z?j$j&%kbmuI$ZhbGfj)P)BpRC?Pd&&w{r0jRc6Cix|&97{m1ji>Z|OoDAS$#T~XT3 zOvjNd$Mm%9Qo!?S_Eiyu*0?r1C?u3I}>6=BYDykuX8%pS+2pY`HQ_0;wsRTrm(4?7CMDh}XQ#k1oC_N~wn_ZaE69 z=QRI}ixiM{Nes18OL_mYpZW5ew9oQexL2@Iof?>9Ci@y=lLuA^Z{f5hgyGaFRGq^g zlk>jMy+HPVC0{hr{+}{ce0g%H#uL}*#j>wq48BOt(ClyS+1U)Erw*^cTUD1nHOER=@I@S&w=q zNyd;Z5GEr1XjLb@V9t*@;rK~lrE{>I{bFsKZG;f0ldQu0Kd0UwG(3mPmwDlK{mV*y zpYhjjeYkH9pS-!|*}8@hc6;)FEoayT!o7Tl`~II%lwAuP0_M-`0wo!fAqTVVoh!L#el;o)9f=-6_;oo=AIE5M%Yc3T>k=VS0^a9mAG(to zzJ;hWG{?*%=#@X+la1oU?s5aS!e5O7)67&pX(Q+6wo6T<=Jh2NsJK*FJSjbz_L`cax(wn9sZuNmnmtV@E=zH5Br^a2e;A1YBi;K^&Q7* z>c=PGkf%N5Ai{H$roC+hA2tGik(xXy2ip8Tu$pq=N&%&_dxCd%6K93g6l<)K4b!OR zL-m99lTpJ0M$IXW#7ltIz4N>4;KE^M2%MQoJZH^y;rg!SrFzO|GGx#<UD98QsVKrCzseN!eg%|K70*RxTI_!! z0-gKt;&4LMFsr5Ijgz>jV_*=HjjmWr>>j*{KDQl?Dv%hVb*ifD07 z+wA}8SPZFbw*cN$1VV!u)UCB1Zl z>b_11Ys)zwYtEFL`c{yiR`b1)JchA+b;6l4#VZ8^tqy~#B`Rm$I4d@UZzSw4Z$Oyn zd~T0M{*-E;;+2Yudd;tPa@(fj=?$&R&_h=g8L`%Gh%UcV9i|7dR}%MUb{|ry^M-(3 zVb{f@DLUW~eSBRRA!XmD5PaN4&n=sr5AdF3E#j{MY zprAk|?G~sW6ciPis&l9}cyA5i*01jES@IA^)490rPceuif8@A8u{b9p0tru4_p++T zK^RJwx#l$6+;osj*HYCTXr>vJiy!TeQcS|5+~QtJ6u z>bG5OWWRdJ_xaS8?{xTdDQ1k0Q%>l;9zAx4cboXX1CF&Z0`SU($-Xe$@b(347Xz z%>TzYMj$)Fs>++YY_0e*cWO2Nt51sT6^?7aCBw&+&8WJv)}r@**kB-Rk{Vb(@6r}R z{EnV_aM|-=0ihr(pvhXf%mK}Chu}_NHITg#yLh3EE$MA{E_gkwNNw803a%qLpZ30= zyWRgu*Dup`bI|c{z~gdAu)V$gtDor8+Ly+a?)U9yxSKmWKgaUKsy<}5?xIjIfp#%` ze!(N>5yoIU*HcI}x0foLo12d>FGtp?ImzEugioeiQC9tYK&+S0q6nH#UZ zIaC{4ehLU2&tXk5`oi2WY#i_)Rxg8#d+3&GnITCg!RW~|_joa&$j!u~5k9kOIA?{IM%4ipN-ixovB}#3J&`pAltJmY# zKf7T2LY}mlP0?w-|Td_Ut>tZH7`#Ofm-uLa6#WLv!Y^TnuXl?WxOAZV*KF5JJE#qSg+ci zsmgPI=WH=#{^&oh98bciNErAL-9L{XIZB5vuQ~MR8i7oPG@7c-$2r2nGFnxf^ZQr; z>{-+fw71dI(|6*x|9Xa;rlq6v`DNagTzN_&6nOl>q@q6YFg!Fwy4YfEY-RQQX;VEu zIT^T<<4Xz;509z7Cy{=gFT>Yys81R{;d{Cv?zJbYAO7);=-KgV2U*8&{*FMv!+xC^ zM+LlKxL<6kiajS`*O&w}KgE|1E*~bXC|(%uc4Fyyak4;#P71lE3bakF_^gE4RQ@G` zDk_C|;UyZ|(GPqYm89^_!=P`6M%(HX5lUO-bzl5X#l3cVV8xTeMC*B`gUbAR;0Uo+ zge}yqh7=NB9MNz5HYa7tUMg7v%wiI68Wm3^xcX4O84#^ z`2v%RvEl{ATRiRp@}0c~J4m;DbOwJ_(E1IOxQFv1_3Hb($j81iLoY*u$qJOEoP(a@ z{dlR=X8W| z_>FAK2igeK%kB&>Ur~sfx2!z1diiM{X4&0UFcr;i+1Tu=330hit-KF+P%PTYJxm^O zE|0o%yxQ_JV|VRDwW!Hk$~L#LhECq$#79>twACO;b41}jODYdyk=l=Nc56}*AS{u# z49p~=itFo>g@lGyn~#!a@&N6Hkeb-o1RH8a#q4)sK&^WXpsl(c)z41t45NyKFCbiW9+$AvVy+XPPJ$aP}hRhP&Zm?s_9(VbI}F=YBCU&{o4(xv?=|@=*T6 zmB$hyBeT;aE0OB)>&oq|qFAXB*1F|CZ*t2(*gOg&{oW!ie6~77d(y-!;_1B^K*_u~ z+)`b>??1LX=Nv6S~Fk_sZjnXbVk+-EGJGA$QB-TOf`u}ttiYS^?y z<`Jv0HCobHM+?UboEqkCJco&aq|xGdv+m+I>haFU)Fv&WWqjtCIxkf&(0_9EXJc$| z7qq2@vZ6+l4Pff!P6s<`VfFM6xrn35qFD{*mF#l~AaSOp$9@uaqKZ#uWw_tk+QJB% zn%n+;cBbahikT%EEd!V&V|}Jvo8wglr6P^^BXC^lSD8_K4$f(LsfyI_OBN{gkcRXT ze&5mALvgddhwma1EXti|^R-$(nG*gqS$@b@1}pF$Kcm2KCt*K3Bl7X+irD)tJ*UJI zv(rFPJS=3kwj2|)a0y)bqZme&U@2WnAOpEpXVg&86Z+hAC0#fo0k6AQ=dpTXYr>~N z6wvN)9>agyAzdott52Dym5D8y=&(hXG^Qk|m)Rru@Qe1iIIMVBrpM{)B=|=eJpx5+HzhSnjUCZtpTY?EvTh?|&u0N-g z=ZvG6&2z__ZxZyu;!c|o+9uX8ag$SSX>y{!STQKo}{)_(3vXMgz*$8e#L5hnbr8*L+Xk zoOV)Xd*w7|b;9!>OJb!b#Fh8Uk+3d84p1fqBw18u6mw{-7pn) z|6&0M=7?DRcCN-&arWVm`K+*1|n|+9cpx^}qCj_c)#Fc^7u$#<=(UM9< z^U+Jym;;r4gbJoA5Ss9yFO%R=!__XD(${sZ#8-KKtx~I*wsX@kJfhiBsilMNNc~kB zPsjw`=@;$Y>d9a%4ZBlHRGg7G<4WumN zkD9`u0YZS<^lN2%2FrWw6lBe>SsA_k3afA|F_|=JZo%v`r79)1k;qBce12H{c5h^H z)ZEd_!cG(vd{X#G8&hO~o%d%C+KOEBb8P8lA5N@}aqn-{*~W3%;-i@=WixmU1@-4J zLk=GaYH1XT@TpXUT6q<_8_6!?Td2iDcjMnQjL*)aI8R*pJhvr}jE+9_m=1fd`J*J||Z`inwF(qUuZ;^tQeL{e$80!;PHO&j%lD zVjYca(?y7_s1Yl3EGTa|;9Ro5P}>6wv&cUO-<=f|xtEAoGL;pF+>$mXw=j{PlOk!i zfFOB|lP#j9g7lnq$&6eOVr!tW7~`h%V_eKRPEW7L@k;r~LZqMob!&#P*yKx&0&@o| zme4l^(n-v;aW-7&DHj7Z=TY?9gc1z5SWe6Mp^~xM-XS$im$U@VApj~?wj@>gUTR=T!&R+jE60uAz zL)N9Bv!7Bx+nTZ7cOvk2TVU$xRj1yPBDQmK%K7W?v|hy|@v>f3PK&I5-7D`_pL@*F zHHAY(&OF9dVzQI^eyOq%2bB*})9Ea!MCg;Mx-W;*rli{KH>m9n=+4V4&61#EhdS8C zXL7G@wY=l5UrUrJtcLDA(4?lLt8As27Vg6(m5ne2@r2lkaGs&I?4f4R6#mj0*zSU+ z%XvQ+KJ{Uy-aKAzss6Mom{j&yU+MiKDJkh`KOZFJ{WFUD)gJ-x$Ob5S}3)3D^zjHK{A@S>j_Ix*1mY;GJ;0<@*6qAp6}g&@7fRU zRkff`Vq!gFiZff#WFi_0mMzWn*#q@(9SXKU5k{;VDQ6tcDudUX^>=NVy$a6y=MVYF zQg*n=61YqDNLr#6@7%zw<{vi0nrYDdi*ivLcPf9fkktytml_rq4A}psd=BQlLV$mC zM?Ab5k6jGgZnb^+AzT{t1q%TJ|E*&9-k(^Nbkr>!Q?ORnP=}a0j;|ku;Wy^lu;qhd z4r9UmkJWM>H6}C%8k=FW_+0l_K3B+-dwi!q4=(Q77<;)e>+f7X=Lu0Mvcr_X@v?bnaVuEC8fs0CYI8=@uk_aLM{tX#deua zx=;HjOBvQUnf&FS2ei#Ts+K9U8b=F4eZpL^XM%LD3^IqtpN&$}>Rwfs>=UZ(aDVc^ z2$#xous3?Z-lj}3WJui(YB_gL`nY3u)g9*Ti0*AG{dwiL!iKi1X6N(KLVu+sL-EST zyi-qRCEoBcwj*CFO_BB+gvgue3=+eQSyUDIVU*RiHVmvo{s>Gu7__+l-V?gT2Ks>* z$YWO#?*cbkx0;84;Xal}{BdAcat=vB9DA%1rvtI+_e+iz=oK0Wu(+}SFERQ{JUqrEGX;fcO2(a?9o!p6@seJ; z3o5c3WCuq_?#1BOU+8)*fo>8HaQK@UEzNi3W#PfvQb9gjO!{3nzju;O%47SO1l0P_ z*WUYHyeHFoId~1644Y$MXNMUT6=k(peN?=m8St{p7bt`UG`-xy7S(P%rz9^^Lm|*r zapoJzRYvB%%10tCA&M47B7PS0K0)yWT;qD8hgjP7rqSMggBTTGi5Cz2nA$7xW0>lW zTHpN6_ygLA(f8GuinE^<#b-aPy;QmsW)Sme81DlpQqQinE!=NiRW8|2(5iDHzP^!n zw(OEmn)p=1a@Ocnknol|GxhdU!w*&7s$L`Y!z&e{5p*&`7ZE}|+b?46_v4=otTVOU zlcyfon5HG}!j_LUZWF=I%W4EMKUlh~Ir1Cc#teAAfD^#tmmTM#9HA-WVFrKhLCqle zwV2Xx_GGuSsI$v!?xlAKBGj9(+wtcgkiRWh>fxJ;vJlGGlq@j|b5-*Q2V2b+ ze^aASL89A>^Oy{?3`hEWBU(tyv?#wJFBCv95C!r4#pl{%M*va0i6OzHsN;dWI=guD z%oD9EubhqZFtBKgm%vfg7#{0jD1DTJqE%`lR#SBQ8->#XM0CU(D{kgzwl+?=WzjLVl*J1BRA7{p^LI z@QXu`>YmZTFTz)w%^OsVK^B18MJ4}vnA^>nY0}IipmfY{Y9a&_X?(p2YG8Hck3%~u zCNhFJiYg2Wob2p*Tr3E=ZV(yACY`T9X;el=hP+HkQ;5)pH|*77`?)H3Qo!@Fv|CFh zQ)a3ppF>l+7^oqfv(K1#ZZt8T3{#Qlm5aj33I&6b1V3~2fAGCxQuOZv1=? zgFV4*@5#F7yM~?DOE|EsKMl?PA5m|?7FGAg3o9VfU4oKBgLFwZLo-22hk%lbgmiZd z3?0%lLzhTNH#{^*3kV2;bk`aF=RMc^3Fex;*IIkszxAot^O>8Q z1(~N^Wrwl5;*}9DQ?m%Ayzl_!X5ip@s1Sc7!|IE$dZ*2#!o2m5^J zfML!2wIlvXHJ7|WW@Ewb2&o%=^dD$NS;l%$iwuWnE+Y1_(v83!4gY`=5Vzc|KIw)(Q~^cp$sZb_l{XP zq1`Ak1nGbe7Qp&LlG)zJ>}(k12ns(lk{xPz&gf=Pi!%WKvaBB4=x)MoF4Sy(rQc;< z_64U8lC^9QskBQHHGT2L@I&<2w_qIojAI?&_6*9+jk`ar3wV(MiEGtNo61Ofx|Bqe z=0k#RHY4RvMNDc-M;VOwH!%=gDyeVw3ucF&ogG~ty&nvui+N#9(aO0zoabB1(@(y`4D|1&|-5mSBHk5um(GE{B#BptU`!I`}WV1$FMh^X)?wKOEMT z!?IB4>iXCQON*q1#*?cTxVmA(fx46BpBBS$2HXe_jitF~Gy=jCy^N1adL}>9s;EjF zWGdljc4}SgfM#fEBEslBOTtVJ|9KP6nlgk4R0)PiR<=A6YBoX`WW?BA{v(3COPh;c z`kJB%rWev@IHBolqQaZ~Epw(cG#g3?fd+w$w~o^HIIouyP!_TQMKmqk49!`k^d$2e zA%6qB?6TEo7#M$k!A^~Tcj*H_UM(E{*GZo^o1&7sh=A{JW`t%r-wK_Z1&za&*(haV=d{}8#JQ#f2`mNphy`zQ|Nj_Ymr@sr_?DP@q zvKN+de&rC#_kiAz42R*N>OtSAE$XS=_A+!(w4oIA41u1z4?zzL7naKp8rA#v;sodG zPX2qRhyUaDm>H>bwDk&W6KxqY+|;<97hk|@aBz~|2)^o&oO}C+jx}j0wNi@KoH6(# zW-R`E#Hy6Of=Rh1V;jIfpUc-D@BZVe{4X}#Vd<)_g)7=G8B8@XJySA#cV-8P;zbu< zJh*Qz13EO<`P+hhKLB%U$n=GDIFG#8DElAm&wRNS1wT_#+?k+Z;;{Nlv~FG@1*xEfm%+7y zoa~{Jqc3ata`A5seeE4{TkCq}dlX~d^G@dE1qJ0Gp;3JlYhclRj1M$&wz9JFr|PcJ zHB-W-GJ}Q2f#CauSN7 z$cgq!HQ3aecyj7I854+g7sK<_{pbegR8XX1!`lZXcxR6H%tq0IyO)+d{MVP02R7vO zYW4nutznB<2vfvP!2I~bDZO8tCwdIBAjJAD)6>6~?!B3%bCU(oDIdQ7ohN^9>yz3+ zn{GS0$Qe5!8Vrn8yStj{jZoTEnbqm54PvB30U%o861RO5R`qG~DJM|D^M*Ai)MYR3 zL&k%`*KKwHk9kP(m64sR0Ew8LnvZmyjiO>>VUc46NdyFyDy({wP8Cy3SeV^PX&*z~ ztON2$FLLa5=7L6PIdIo7?WeK+RH6yNc9vp^SM#OILZ{yX7caXhail$o-oXs9#)i{oQu@{&$IuCH?)$>Zaz+n8egQ#z-7b zfgEV&s~wJ@(oqezJ=wTQ3h3-1_+SA&-TITIo>Qlk8qXFbRtSjReR~vByuk_`r!d#0 zz9U8xn~4fVgCC;nH*K~6_{>0$tK%gu8Lo7P+O}vpX9C4Hae}XpCjKsxySjXsDdpK` zom~S^=K8qLSrL=|5-->}-u=j>qsX*_=>-3?oZx!8Fw`g@K&?xU^s`>+{|*S5xL{o5 zBz(#yxzC>O^SPsfZNI%E<>4Es?D%Vdd#i(w>N++1Mw(C+i|b$BO#?@yB!<3I9L(5Z zchu9icg$;)f>*r~R41=cqQ!Gj38FfUsmsIrv8d6RQ08CkNfMg{2PIf;KgXl{5I{U@Pj0#6E)p@`yQm9YZln$0?vcy3*(WCF?d5q`qOz3dfMC! zo!>K2P@$LntVx<8EiFA{4Vk>UI9N^C=ufbot27-LOL)LAGd4znZt~DJA)F)5Me`Ld zE-s21&RkSOL&LBv=!SG%A5!{PL~pEb^7ilU?%~x~fLZa8hVjGnbPBTr9W5<=e121t zH`L0r&F{~cFopn@O_w~L4luLbnKlTH!*A9t95s#ax%7SEFWZjxwe&OU9r&H$l`+mt z)sJNj1xf(qePSAUM6EIsl(Amb1~TYssxvnmOx7S9L z$zdC*@G5=3JLAU1I&!Q=R8Ur~)`h@x$j9~TwK(2w??A&=ugnVRm^;r~K>dNHP2-tv zBIEW66 z3+Xiz?M}$dAaG_fmI=xt14DU^>BV_dmh^?h*8Ef@ix|3)&Jks3&4_Y^sUqbK)-zFa zRu2OT$n-1)KtQCMNfR@8Ucl!rAu(1))ua|~o@>8NKye@q0AJnVj}dWYg+V-|zvbZo zPdeZXlZy|p%T;9vW2ONEQO583Qh{eD8+&h27e7YN+0`c=hb&d*aJHT@66AXkrgxh) z#^k-IpSS}oD{P_VB-O{`S}chKSfQGPz#uB@PtE%TSViMA1)fwJF?YnzUy>>e?!U`a zOQ+Y#iu?O2`LN|G57r4QnB7 zt#848MkL^7+M*o%GA~VxC!+(qYFXmImcI3#H07A$l+vHl{#(-c(wp%uyLeYIpjo=rcLr-R`$ayAiT{46*-I zUvoGn^Bc=O(WPWx{Y_LV#VeB+g*iJlw%%|6Y=injs^LrQN8ecQK5A9Nij`ikc%0oHUW!o4gMWe$mi3p#&*m=Z#ELNHY zYM%P+ztulmjm=W+H{rKrG$#f91HU+QcOeZ%eVNBUke`V=FwDzD?Kt~0J1w@pp)64L zdVq3T^Sy2xnU4g0FynuXgsIC_9g_ol9DM^j&crUzsb$i(fXDOohK2EIDgq>u(R`QC z5UU&Cn73o-CuG21>$<)6mGwI%Gc+^k+2L<`6-eH_Tzc4HS2bMe@K5b4)6tHva~5wm zm>Em~$OmdN4|^-pRp0hJtm>zH6{WhHaXHLC{-kknpe2Kb{4zq9I)3*a zf;#USU?!QZG(bS46?!q@j4#~54H#T^phpoL8_s~oJozVUuQeIxSkunYqcYdp>KPw{ zWsaja33T@{>4ync*yMjI7h-mA7gDZ~c%3|{&$Y*-!V#I2H)S?rw%U&P@8|FZioT<+P!x6rrerkp|rBfgrdoZmZZ*pmKd7Nl>6o%m({ zc$O!;xZ_c7?DtvAq6cIwXm%Zw#BNrcZrXhNz~)6R8>v?$=xcw7H}ya~Zss71+k_26 zo%$wXk{E0($4<-Q9MXsGg04&kK#5W!y33s8DoSdG%acwXhT>7- z8a33_RA|h+kHXC!@G^doP*IfUjQJ=6LbecZ?Y0e__+L3<7lwV;?HyK?8bzy81^^OH zV-W{?2BaC*n%95cQ;xBTek16&;IU=;HKd*1k{eMBRGS_d)AI@C16~Ff`q}0b4KAHfWzoc1D}ujg;+=WGjz5_;T;oz93fLng?K;cfLIZnF zj-?r|?5kZF||_&ku+4irzO33$>?bO zf3=r#Fp@+=_fM8MjqG1slO3nr?s3itym`o!-Z{n%H>v z;o;LBcu~VlMGJd6#n{!Innl#?{f!C`Ay^@^to8bDfdVD-+0=8q3DYE7rCs+YnEucw zT*A^MtkA#6A4MQ2j#Sja)QZ=47JB0dT;v}y4fMT0=s2@)x_YgSYBxqN7pg_CSa?e+Jc}z(>iM)tRw3Yuq@i_7g z9zn;i@W}kuNKs5*@k_C&ffV8RZe87yXc6W9mMkorXto7%5jhE};xj3I9-dkMXuvKo zo+(V}Q}za0E1WI2)B89nS1>VlzEA8dD)OS$<~*l93O?T{mziN0QUu20$fQXg4# z^`&T?YwGqDAaO+V!2{F7x~$MK?w}x#`~CBoakb;!A$Q8?iAg~wVEj9+}wQAy}eTmyzbZj z2ul4;&~H@|JZ870MDx(Ah~-kijcd-@Gs4Uu6t(o@i4@NzpvaLeLQ+8COv$tI5E-ot z@6y?EZ2hDXHLW5k)6h=R!u8RDX(#I}Zf7q)$pmNYR7hh>f=l!TouEJNls=2FFUuP# zZ8D7|5+|v@65byMsvyZHz%jcuAgz(Rpg$|}jSqRr5Ru&kglkPPRLKEA_SLZ=9yPqd z)vZc_2+ER`v){WfR4laO9b{hj6pg^T3&H(>xglaL&&!j;2hv<)-cijDGUUU(Qnk`w z7aJ#<{NB3?SAAu)!MBr_h|mlZoB3CeSr>En+a)9W)BNO5gJPwMQrP!Rao!>#@H3O_ z8tX@udA4D59&HehsvHF-8U=5OexKT1U(w8$=FEZ_r|{*)F8(4zyq4ND3HZEsbtpv# zV}Q1e0=N|r73Uztqdy_^E659>f_aL=?zL^%_XOHzzH! zi~@tep9Id1v9YVEtpL3{rUh|eY^n^%okiDZ1baHw*e%;K`cVBs++hr>Fhy*>5mdwm zSKAcGH!tPjn3_sY(w`(_rS*1>C_U&5*jb#Y#K~}sNkWq08$qwzicf55#9w5?ROD4{ zlDH;&i5XUN264dBxN6s#(WbDV40$##L&7G_(RW*k0ud`i`p+NiZdC*+1%pf>)XU+C zNPuSCt1;Ohqcdi1WUOm(?5SP_(IP2LKGd-Qa3PirHb=XITFvNZ1f?KE{e=2YqD_|GNUD;q6KNHZXhjk zb}EBEeGQzR1)r+0Mj210nBM8U0{Q4XDuysfNhr5_);V4iv?bi{v^cuw%1+`gVQ$L- zZ*g#&|702T*x~w7DvLDhla~cKaOtpn?WbFz<*>Tc>ATzs%6VYQPM8(22~s+9(rlPy zpfxt>NTtIi{}k+ukDwX0r9BLNPjPV3Hb}AFaGuh20gT7%r%5GX_9n3!WJ`|V(Dlp4 zy3mWGg%Q`5b1F29L|gAQx^~=cAkWsQnW0i3Vu1$P614_rXcCuAvDZhzZ~?@+f&`be zwD@Pj{Gef^gaW}zTrZCrq|Jm=n()*gy=B?;)YqOK-1HPqPoBM;+AJ-+BR#zGi@!9K z$YrJjMg-Wqq-4@p{h;Pj4O{XX2j1skeq6-AwX|T6z-6A71saT1uGBTGQj&>OMHW>h zcJ#EDv#J-A3?Dn}=T_cDB_foevD`Yf>GN*6s(_GUUBlEz^!Po4@m+;XDl#$)$tS~*CnOY2?_)jq1&1dK82W0r*Vi|k%-#j-SoxV4h zTn>oqN45BF0U7k1WPI=Vt?iDv3#4fndjx;z#^ zY%5Cdv{<4XQ9HrK`@-N~h8Czub>j-9(ai2rNffEta|}>mZNNEwWxQ$Vj173_1f=CJ zq{a5zPo5#wD~^&($XiRT`$_hSHy4m$HR1AZESck#8&S=#N&XUQ_Ud18WThIXzzacM z!%4qanogB#E;g(&(lZp}R0DcM&ja{Q%CDlOM3ODy8q#aQRz#D`FKyQ=C2Rb8(7Ksg z58%{AG6kgq1P8n@eUgzow|l_hhPr%xuajGxP@5}-kK{V2Sf0Ie-Je;%RpJ-K;cgnF zVu2)h#{3$Mal6=Rqzs_`xgGgbf{NvQS~W&1N_DpnbQ9H*dHM?Mrv6hz*<&*{+5j@5 z0Gj>$XNsSHSosx?9ZA@>5e-L1+`U0xfjUa!0!#>GPT`W93JmbH{@gYMPu>4R_)YV z#$4h%I`514$_(*rw8(uOfENF}h*DF*^`?JDxX47pKTxY}KA{f53}XbY9N_O!JkS7=BH-PI#Qk!_i=Yb*}a;FOn2Nphlmox+Dqj>B5&Ok(ofD5h7~r*XpANvSx&&)AD;$i})!#@ag? z4mg7$Nr?ar7QrN56p&snWLe${?r`^ZR*tf`CKx`p7(dQ%x(7b`d5ED9OgWiWcSJIi z82dgt-I67_dl)z!LAR-we3GZG7=j?2bBgNsUtY##0zT+li_} z0RD793$d34%-@5~F(-nJGM2XCe)x-jiZw7A4m*0m zaSVb95*t*6)Nhw%P)y*`Pqpj$vzp=Wqo_u3r5n5}b&$)F^AZAc>8g26h6=~2Bue~A zW+$So6*)a7rO52z@=}TG=2REXRkWn-OsqB&84&6?wu2Z9AjF*6O4h_J1&M@ddGAbs z`IOo#$8Grhs-i9SZ|&=!^Z0z795$4nH=I}MN?a+n()q=)PB<~1EJM`7D~g$8#XjgaMGfywPn z+u<@DV+VIMn410O$9yQ@r_wn&W_Nw>+<#@#vE3f*KxP=$KnEM(7Xj|ChksY$%vx>o zji4NL6`fG^H(9LDi?eCUUYD0L_>wzb@)RKrF@7J`(0ey8xU$YXT+JFxKx?QE2yZFG z`YRI|G)5?DnHhPT5WKr`s`E_O^|PIh_27)m^!@%m7HenD`52HY;XiG2rGryeMFR<5+}MhN1gk=v7;-&Vf2S~bX7OuJr*nm!@ldc zU7#nbck;h|UVr@_khI?UE+crR?~aDFWIvaVFJ=`w|aKHW7g zNnL>BELcFfGXj#(#(&J@oL~+$v+zIf?h4FL7wUm^u_=?n@~KkY)RUk5bbQ-lG3CRa zMS|)@n|+YFB7&|zq;0ndv8Rd&f&4B8uaacw^h`m~<_n8K)SgLd4gCU&qglC;91sMB zn&Vo*S;tWQ7~t@NJlTj#Do3-FVb^juK#ZrN^u?hVYgMCEX*bUkvdq>|ymB#w+$#g5 zZGn^sbe3i5lpthF%7ffO`j#90vwuj65fD?#v(TlbNFtv)B#6htg6DUf)=856Gf>I5 zs001k#6-w;CYOoD{2A9&Wh8uw#}@pM>}j{d`yOo){maOB)RVJAcexVhvX0H}ybOp+ zE#1&~$>DHljUST!POk)Qh;pl6Gtw7aRmBf%fM@;P6Ler0ENV~ez!dUKX$D1hS!qYk zP>B@eBQk~tREpUe_&C&b$PaLtLMyJvt(W+ z7#!8Gj{j=i%ERGoU;{d%9?es|lF7U%bfIJ@;-$6YPc&M-@t+bg9A9*=LRtaZ zhkI=gXC)-kEAaPvF!cZn9c1M5>O~4&5$z!*Lakeal0FF^-8YN-VjHObmjv-(gNS^v z)HO9<>SesAfRkkD^uvBub0pBCDm(yO=G}2?wCN{&Dl?e4N_=FZEWaw`YBt5ArVTQp zXQ&vGxcm}RcsAifDcsBSs)1tTIG4!pUyp-lz=|Pr$k`!2k9F)^)ve^p&Rzbo z2xY)+LuMk1o~!~B>?u&gA8bNy;D)+VEI7HeN9~_*;+bY8g@%eWoYFIK^>O?HP}zk@ z93c};+kIj)7)M+glANoOb6AqW`y~Nk@fa5Y1e9=ni;wucBD%7AibYQsu3mYac=QrS# z&910Kq7Myikfw^-0ey@&D<*>sx96?iG5yn8?wja)H*VUL z_QTjj!@xKm2}!-P_{IB{p=kgEj|ZW+S4^WIStgb1=o7RX%H~1N*oi7ig>R-7w)s-e zdDGqPf#oKDUb@t2VVr|tr8n<$RlyUlvD*dP9t=5}*0i`4MCKF}8el>fpWp6Oh0XiF zl6clg!_d@pHF{xiO-1y(TY5E)`LCPr`cEb_2l8)+9$BLo$pv?$yS(~ox$Q|1{5`K% zC9 z6|*~z$rITS;W({8@3;~u^_jf7;RFDy83_HUYHQdWu2w3Mc(o|0ZeTp z#@bybpGhj!nD&USo9)s;Jfj>t%a4n>jPX~2&&j(s*{%y8vr@ltr6oM2C;@cxGjO7$ zOmW-Qa~(TgG^cMTHI1gKsGUDAX)X#6W>odr_pO#xm2$SaW@9!ZA?zigAWY=TY_gZ--cRF{m!r{s$)PH*ll+(@igru+#cC95kY!g+0OEOutNQa740O%M`-VTa z{$8V{^Br1b#;D+^|7G}veuO&Ce)Da|!w$h3tUvBx(@4NBW|H;&MY`m#h~6L)Gqjx8 zp;>xfe83~goQe<6l2ahmV@~yj4o?h|ejj&2oBz<)ZD0gdlA3mT6VFK~kYo3Yi1roY`}RhiNoNZ!$Jd z@%blU7E|+PJ1>>8Z)X30EOeBGad+fNS(WRGF|z?!2u)9pX(pZHa^>VNnL8IHJ2#imVb3}6U(y4y;-@6>-- zQddLGCFZpgrU^-qwaVILO1`J9>jE>p+E`xXq@Vv|@x6Nofbvb%MROj(K(EC}L4F^u zcq5lwaV=l50h`66eht`$hF49R$5J|7C1r3KZ2VxR!E;m_n&r3f&p^5|7|d8heSES_ z7Y?mppW!A?tjX`n5VayT{9t{NodADQ%?kEE?Pmnc<)Tim-cRTHeq0!d*ex49Vnf3? zY9nj;5r58(hBbE{_?Bo}RJwF;55;7RUb`jTCZ}9C9{4gCsQkCS`Cr1C9AQl72f4eZ zP5FwNr%3k$7I`WbRcj?=Vu`wudI1Er$X>!gUrVcp~+nFE2FuZMS9rSvoc_-Z= zuvbDW0@Wf~%jOQfaBg-T>8JiwGGzJEo!LU}Lg9(*Anv+p#Ix6RJ5hCSnNwfp68ERw zUMiQIQcKGeeGezW#Uk00uEI0Vl+24LzNf(ze*g9_+b1S^?qVgU&EKx29Judk;wv<8 z**{(2E~cMmU==0lwoqUJ4DnQGI1m<+oGk;9aq2ZsjtJ;XU-q?>TYQOmhGjGI zUZk^^&UIsG+~`ziwJ-lVSsWCAr!3KXx@tu`3eLouQdrQgcHG@eIzd?kB_ay2c=L6v zRX6FOzw+Y&`=7CC@wtEQ!-B`+D)%>r9uPa{0zSXLL<3k6# zH{Q#Wt0TV%T|%)5oS;*oFbJta-| z9M+jVwkYX^3GhAH*y_vY7wzb85_O@QR(NSg)f?t8c85bj?ea$He#eVg_Nl|08pqXH zAMm;ncUvrXZ*U;_3FWe0-gQIjSUp;K#Asbz{nfyOd&HEFQ!+XyWw~f@T2qqKBS08q zk?<+mtNg@~Jr|u?AcPh)?T|S%&Rw{@BRj-spt;3BBBdjnO)4&Z;?;Q3Pmq|gJL?*) za&rTLo8W#m5M{FOb@}kY4QsCdPpODooC8=Jij@!RwR*#KZowdJRCe+n==eGY&%imd zO4+ui2d{AD$y61?so1K1u=QEh5u2Tu58F!rA74J8Nh97unv24>oNkKB=vI|_A?fdx z{KiWbSAv6=Cea``MY`Mf<$R8*T>p-?@6Vs=yxO}Gv*i9$%u39iFC&klMK}v5EAfVT z))2~2w;{U15WHjEd^z^aNyZUfgqPOHnn4L(6od@b?DX`h9_l}>&h|q^tedeZ@EJ+S zuR@5nexj!B5o*mO(yNvKcdbu_v^kPcQ{;Mu|2EiuSiIF;OL4?}i0*Hca5tMY`$F z|9skaXG|yQLZkeJ^QExzf z4Ws;*0KPNoYU<+{Ov_i)T_&T$s0rlqoL;AoS__*03(zsLh*oli`dbeTTI9(FXDQMz zy|9Vxq}QiBF+Nx`pCH#hGh*JkPJC+q)u*AKx=ZqNAMEWlLM*cTZM)nR6+(IACNEJ( zR8q*^5K~U@<1SGtTdL8#WX4+$SNDdJWSf6=6S29P>^lS#O_JW$5IlcDZtJ&OE@T%pL zKWmSV2klW^C(V#vjYlgg^|omaS8Y-ElrTi$Nyy96q88qmuJuqcH7n=XzYmG(Qb_kN z)&ImZ)fZB#kR)lfd`w!ZIf~yqg9+CK*sAuk2~+Uu_9Q^vBk6Oi106 zz**ft&>vJ4%|Vj@yhF$i-3ce`eQJSyT2K)xc64YRqc@(5tn$l5R|M82@`C~*6{aga zZq*NC4_#C=!@}%!9eoux22RMnHL2bt>a@@IED3VBBqdkyU%=p*>D*X~39Jg{biCsk7!a-fGsoCdJ5eqZwyIo>As(lNmILcn>%`V_<X2N{9UuB3Mbp&Yx-dr@{3K$^}F0ZlX+j`%SU$)e1z% z$J+ie4vtKU8)*NsvWpi;5S4|OJFdD1yFs~U5|RA@!z^TEBJ2qO*NV*0Mv}1<&1#p1 z4YDkO!ZFRWa%6O`%v8RLb`Q;7@5Cqn7ntv<_NGe)r*nLMpM4j>;8c(cc4h)KCYz&T z`**VX8K;&jLHTY8&>lY?1%TMoESHG}zo%8|^9qL!gRrv|Z z1*tT08b=5!pWXVJ$q(!^h)r)e0b=6@m}X6e6RuW*O`2lw9+%o3y}f_Bg96lWA#D{u zmZxeT3}tqS*4K8(N99nePAQGxjM<6`q5Zf_2AiaoFnFGgmu~#h;9SLF&$w^TSZxMU(#>xDOAs54$yBnfG+Ng^ z^}4g1PBC&tEn?rCUMI&LJESNr%T;Y=?pf#)vPZDOS0G;)ji((jv(yF(3Y13q3WKYk zv2j^x+48Jp!~xP15wKzih!}ilwjfEWqk8>cAt3|Zir9;tI=+N*CqZmG#Ubm`#>;=L zo^RBBZXa{yN=Qk_&<6D|gx$~AqZ%8xS>$s&FV5=-q1AEkZUq$3Qpb1LD+)#Tv~Yx=a-%GJ}A+bXmpRP73iopNeiyfY`C$s=Yzl@b=oyd(GgTW zVWcc9(x#p;Pw3=-xNZLnGO@*peBRb0b+CNHX-&kyu0hDPRSlA6A2O`LK;yyHP<{&M zSN|^y0INJZ_Q1Ki+s-nn{4Mzq-W~tQ2amGhS?Xs66eu1C3$BOP+Rpz9nd{x>F*vWm z(E^lE!In}ZPI1a8b>)w?o?c&=z79_Bdq|zx3uC+p z3nU4F6*QPJmBjA4X6Ho34_B#K;a;P&FaCV;*-|TL*6lHxqq?STNcAXas?Q0-8S)CL zxhJ@Gyu%YJHkSe^!*(Lk8c^YNY{0kVxCkQ2NnG^yKV7lAtCFc z%~uC>Bg0t9Fs=!-{tjv#~CBiTh^oS10-pR zxF2^7q}+dSQlVNG)IS*ekE?YaulZl& zm_t8ABP@VS3fl|qUT?O|PQEIw`#>qDHcm45+}fla%zv3@q%Ig!Y+L|vJgYoSoTTeD=WAzqjFF2MAMr_~4H9Nz45fl2 z7bo~cppgsdj(l9xehsPl0MC<1k48<9ZHO{bcp+}&&XCspmdf%qun`;4)s=IdJ8(YOC#IgDe3L?+a6!*JP zKAI&(h_xb|D-`v5CGk&6!I}KFOE+5p!|ZD1J>-8BLJ{`UO=Jc*u#KmrDd8DH{o}9& zlfb7e|KqzUPtX)@Tbff;U?fh-R!F+F08+g#R-uG#4>m~n!W~$UT7zohVCQ~OSHw+t zEl>OH?2x@SQ;Bf#q}t-0X~=mBG28vZVmK_Ra?a|Qu=eX<%N}|lE-mV4PT~_U2ZLE{p`npRG?WA!`LB9 zp<0p<(ujq^om**4dXxdu-uJ5weTzwC4s_pV99()WmghdAS$b8n{uHODdbw@l^{rq}8wz!lC zzztWrx{e@J>y|CH*zbdjTN{6Mcrfz2fCe0qP5xh@w1Vw(g^@lwGcE-;@|iXXy-uaK zPyU1nKYnnMk(?OD2P!PpQNL{r36EocHqv=p& zLpfClh?3`kU_V7yyLfjko+ICn5_>scD-1xPPyciw03c~PrlAS}&T@-V5T)tVP{P2#&GAHSEnSVZ= zDJma?aD0wf2X_0l@O_3&sd6MN_mAST8{DRH>Ych{IRo$%c*87u$ic|+})M?TyGZ< z9x?=3{zi>KAd=W$UeX3B64f_^P9R_Yjb;?gW%{VtCj~g5>C?Uo_ z$=;2A3aaLOi*amm4Z`R%ml!jwkclz`LW-O)-S;?W*wS0fS%&Fue+Hf1a%AqjJQ zfe)gD8CLLq(8ZfU&tL*S_{$+E7%8R82Bn%2HiWYNYYxEC!yo?`sX60x!$d-$3|X=- ze3kN3Y0$bm&gMhMR$zNGep8E?ve^bY-@rg&ItArG=Fy!fQ-jgIitXQ6$a{ZqOujhb zVvhw1MaQ6mvFcaiR4huF7@sr*ncdBNJ zR5v9Ob`sM|b&+>+GgF9!02iY#(Rz8)Vb8*c6#xdd2@&^yjh#!Mf_HA62y*d-qnd#{ zXO6T%G#H&0Bw#R@hJnGrW&VTc^z`&s1jpx(v?j+BC+q9XmFDg7=*A*Tv`^mF*7nct zu7anh7}^F*4Au4iUOlY$kLE>wLN|LnmErIJ6`B@Xe>54p3|m1pKNF!%#@=V-Z8># z(CoyA1#tf4-Su7IPrkXM+PoZa0!b*sq{l1DQ=NJHc3)s~bH%WK9TWzqTR`VYqK~Pc z{*URkH?P3b%yDvkj3joQEPAE8sWMo%kiyq`aIW6c+O~{=L{S4HJ(xKn9F)>{&l+nK z)GA>`ksU~d3xe;Oj}Y*cW5u$YX7L;H^6NJUiu@A>P7{^5Pps;fo|OJ|{d4Ecf~Am8 zf=y9K&RM`BSJ4J`hhRr-rnNwzatlB(cKFn+1c6fvfVja zbmKdtzKjHw(XhZy&49%rJHuu(yC9_LM7_9v*32UpuSS5O z5dWCB=XG~B2k(NI#i)O35ETbF-Rf=gCtT{+Z#!1+mRAL`IwHZP z+VT{2Xwx%USYVJ)DG}^#Trcls&x(0>+itg4i4VSP)LiL|`UaE|Nlbf4?O;Ff$JwV^Fb%=gjIJ-JORTWjN-SlP1TFS=Y4ES#ssG z#2STmpf5#_$72u4xToO%gB5kLf;Eq*1)-8F0E*e~VpMiDMXUjVX2?z_Hv$e<&;}!W z8i)+~BmoOpbgcwOjoImKtE86f(6u!0zT3n_sZB>?r?;4g6>mL}ljVuDF?>9Q87*;e zj=b-0y_FO3n2b$L1OE1yS#!37okut@A5`v`0+S+({U>FyKN!3i_=IBRpJRKL{1Mq_v3a-Z-k`T% zc5#{zTpmols{Gxb`%gHe0vPV!uPVF#x(2`L4+Y}G5t@0zo^4nf%cMC&4-`G8{j@=& z=ztGhCRNsk_Npr4yocLu0ZGZ2M~7dTv%8%gHo8L!`!OFE-4YEgUR~Tj?@xt89&T?h zQ5nM`Dv>7hB_!48h7rMBbf20nH6tD6*etr0ixl0jkjo4S*fj80_O5Y!nC@qs<0Fd< zjPgem$Gf-wJlFe_dZ4;`$}g?Qt(yWaIVZE6C3+z!bBg7FVL67-y22p6F7k0}8w&}3 zOa578VZyNH$3qkb6uI@*Hvr6HAy5&ws&xA2OxeZP2-1_>!eI))ljy1ScUC`l!x8wDh!rE}*bpw41q{Z{Evt1WvB-eB}{Wafj_GOr7gI!#>5KDZsdtCpGS$R!r@1y ztPp*lx}Cc{Rm`5P)5R9A$CSfxGB$1YRZl5~vhwmHU=~*szVdXCgRZRDnL-E!_=H;e zdKcEkMfvzX0X!B{l5&VM>g(6jKRc^gU}1D0AD?F*LjZCa8RS&GX-`2`b%@4`NPn$L zO)LII1TrE&ZIj!$Ye15pdo63oGBmQ=9LV9@Q!u~qEy3l(>>GfhxtYK3wi7BWkyb%M z3L5ji%tgZMc(h8T3EA&jfQset*^?^GK-`FXg~xLSgf7Qu)tGFF@^y`VsEFNO3atO| zQ^GGbB9H$hQWuJ(Yl)r3=I%lG`pzeYypoAA5iP7Ww*EKl}j=RtpoDrQw53cP|EDZeITgF#odCc$)LLN~_P3 zPW?IP&T1a6Yfvkbk5lCUGOp?y28W=Ks3-z*nUj+PlQ(Gec(@Pz{2F?zeerLhywSR$ zx@JA*pDM07<6CNK>YqzXbRSKnV*9P+R9aSCu7auJPxGTSbH{luEG`G!HI*tS!@}4&|UT zg&C!UT6(r^w5e-ax7i&s_xu9@+?ROK&@3{?GM$~LH|kcwD-E4ffiJH<+LeV0dE6~I zCZ1kP5QX5pH<|mp%-K1bo2ozka&Gov>OUc^vg*i~Af3nimlPeMWPrZMHpg)oe93nIOe=tebM>(SGi7&iMRSS+xjjLU#*z;+QK5iw8{0) z*!|wvq!W4?f$Hnpr_We+hFC#Wv)HOnPz?i<3^gVv zCnwLS(H$VS>Z+C;#T!Sy)3h@~cPu*%2v=)I^XdLLiN23QRoNK8x(Q!t>U%_}ET?5@{KpctyVd)GlL~s4e!Y zmA&LvS4m5Lev-U5r1G1uj6HLkB7Y z6Q&aC+VI!sS5K-_|6M)=pLbxYR@b*)pD+Cy-n)@zjz6DD;TlelZ(Aj#c9thl!vcqd zCnc4p0KtRd>Jgov!b3q^9EfM~40w1N-?8K3Pvs7nKzoQx0efqi9Q;K6Q-neZ4A@rroFG5=;#pa%Qdg@gjpHxfAYL)(daRI&0Dl% zz`t(BbG{1Z@Ng7z^t9TA3!x*Kzvo2ESO(uY`aLiwN)~6Uj(+fx$Kr^FE{!K40O(yO z0*ZJH7$|LPGtHvenkfWNFOe!|b%|Uj!!E(G!AXl}eMrVUc^3<>Z*xUuildIoxt-$ufR3 zzg%(`#?wiUXZSF{E zzhv-(G6A>s!grrO83y)dgNV%Qg{}DqYcagBF67 z(cf95jw?NTp=*^DQ_%~lr}A5*Af?93gMU@i++F6`ye1@VgheA|B>wSi%2?eYl^H&e ztc(tXVBo9|Ti(|JZ#2KO_X;(<&WolUwOM-)FRla|+q?H-8&VL;`QW>;cvpH=sP!oZWaFvwVA)RM_7LKGQq}&IgkWY zhUm}PuU4TM+-!8dmS}I{@h&3tzEv$MGo0u61DRVK z+}!Q|S^h>aTPG+izc*a4`TzeKvIA(Hleil3A*QT>(E+-7M4IPA5nc73m0N{oG}2E= zr+7CGaZL3)@YXjS9k@+dEmWe#ODOiiNhmGP;^3F6Q-Lu7v^jJk?Q)Lw6Pm&;HH|S8 zfESC~GXL=C{NX8hK8i8T29C}i; zM*2RoOnxMlF4eAuHpadTZ(k7~uwOY4iW~g20>888JL8Ndug6Z1l z>uzlmLIop^h~sG=`iq>9_=WrI2}+~$;qHL5?xg)7u;!Tg-_8zXpq9Dr1_3nC1If2{M+-kKYz4hhc_T_pQE%|8k`($51K`p z;k$P@6jja^y*ObYR#=lH&l2U-44W`g^y9bKJCWK_eptVekx>R;ZQJbK=ESwu1lR6@ zu+{NZ;qA_?hG*f4);8^KT#s;YgA-irnKq$Y(+(aSOg{GwkcTwel`xF8x~6*5 zzFSs@sp*%R`@iY-1uJWx(k2i8 z*n)}$W2x^gfW>Y6roawhm(*2G(9TF#^AU4Xk!!4A`qzP@jvq1M?UDg>TEwKhdTW~P zO$f!;LlQPFzm*;O1vGB5l31y@Tyn~oFhr^xN*_pR|0~X*&LbFZ*++mIkbN93K1ZoD zN(b!!VFQp0-_bxOyJ8@Us0$xyNsAlE zZ*I>sr9016;V3dNw9^1FgeD(`9|hPeN>POIqpwB;A;r_NpQIn^M>zI3tb8GlrcLzb z(0fPsX75(#DipF=JGdYsR1}?6s|dd27L@4~YD3eL@iMz^P-ZZ}gui0)pP+G2T zh0QpKOpHkv%g0Q zFvs)__9I@OckD%lOxbkJ3}OPCA0sdl;t18<(QOnC9DGw7!=UCE5HBp%DM$CLZT(S2 z-GrBW;#^%PH)*4ve6F~4OI*pk{7fy<$TzN+L+Lt|8R*ct-jzkMMGsou?HJ8)%Xg=Q zv#L$q-CS_GK~Yi%t-Cx*`4B>RUT8`s^kkH%qyOJYR*e4syCQZT9>azG-QCoatuf0c z(S8LAe5uzhTBHrpf(@;%%-8f{VQ43X3k&-x6axk47XIev7Pl;@_y0xXtfQUeQW!Xu zVhbz34|8@=ElpNrPFAmh(q<`t>S!{|)hTDvDH+q9VhkRG8uQ^zLjTCuBl%xa(WW+N z^*!Y?o<6`#R+l%3QvU9a$@OIlJ=zfh0#j)sWB9mj_-M8Sopn=@4rm5I&p~$pH+(h# zJgA)xjeMVA0R`0jGb1Xoy^5(_C#1ZgO_x=a+>A+uTiyOpm_= zY{pSXClS)+DV5Tyl1OK;aSehrInNbCYi>1Ff|z7ItLUz@O!^h-P>xl(bdpb)euK_f z;??sUC-qWu%ga{>(q!D)R^z)_e=q!5Zif`f2T~aniOZtu2qaE0pIr<@>O1W&@6rYc6LI8tGeN5-4F{RN|EYqsM@1Qk7Q z&k$K$>7)>Mh9a$G-+wB2lz9DXzj2C4+v6Z-gD-oSvt>SAwqY9l`0iVf`<^aC_&|LQ z+NNZ7nOJI5EXSX^utU`jf+plsOJeEN@Jz8+prart_Vhn;kYA}b(RX{V$mh%^iW;X1 zRi~JL-^k6=W#BDm@~`oR@q+Q7U{?p??;HABDFsjhH#*gfUZ4h(qdPhm6 zvB@~hc2~V~o-8Q5Pl8VgMf3?u3mE4paC#@2wYhwp{v1ReKPV}J_*fWy(VylUSaYNx zK~BS_JvL#3Qq@Ydk0QW(=I_d?k2v8qq7)l;YL$OW?WTs6#*D<$mxYciHcQWQ!6ZfnTje?m!ubY zTM7kT#A^?8c>C4xh6O5S=_ezEOR}H@(~1VDsZcX1g%$(}+O~_02s(qN)?b*Fr}FUC zoRxYiVlHrKlPZr@e@kAu^D*|gG+efLw4C*J&GYL;Ax&G`i;c4vws0vQHBS zd%uShXkQG(gCF5j6$1)ZEa-*`uW&hbeW#*R46^gFCe^N|^tyrU;-Qfqtdx zv<3LXerXqpI#H!XLp;L*J20v=zDibv_Gkyy$Q|0EPljrf%$ zUg-H=#i7dYC=gLJwX1TKmT5IGy{qP?Q}ZbJt^?PSzkvwpDq36zK4c7fcS1UL&?3ULP8S4TC zS8=ZsY&eJSO;&>!T$%>IEuB?YsL#x{UW+Z0SpDL#QG}lU5$XTTkUZ2D1;3N__7JhJ z2g)h8rZ*uwlWG*GDfj?1cF@kaBbUowa@pEm_?@w^J%tN4&{x@+=pt zN6A&P7@?xet<=tkljl$V6O#>eH0!+lA^{S$BRLV3ERxbW2nx=lb6$iOHy$3jf^s zWJKu(ZnL+s&6#5iJXgoN&k-RHT2x(+1;e8LeaR}V?q;>t*LJ9^Q}bXoKsF1*z(N@D z<)o6mKYLYC@^GqL8rb-ErCKvIT7e}jhou^UG+Qv zx^p>madDwa+$kRhsK~UN(z{ttr5Mj|FI4^;HqH1D_C+dsLv=Q?6nGWAW>=b~NJTr=G zzYzDAop?t~e6o;dWfAX03f|U9B#;KaZ(8>HlX1xL4|wXBvD`&7^-nxFcrzVPwSdA7 z^`)?vr?|D6)RFZBsF`-pvIE3CuiNIVv7^Ed!)Hipc(*|nv?z-~k4!2Zn*I%?u5=Q? zknqY<9*LGjz96uzrNmb>9d}u-=w6b3CI|6(t0=F(M!GM-+chNh)@7Lp;uE%mNktt@ zng2cHhm5kxgPh=0_A@Vsh*^;i41kOj^IuHZ`po0Cz5W6nm`6b%n&k|{Z`hHn!09$x zLW&2rKuT{|SFZ@GtsECAFk1tFy%vG)5jR zRc_h{nFzkm9-%-g`^+QKly=gsB1~_qM(=nuZewG|$yK8s-}vrt>RQMnp0Y;afWT9X z;s@H#`a`p+92(rR*+iH3Yf*xB(wcJkCm=2&4J}^V)9aDU7KKmeebIb>=BfTMBfL z-cQ}3J#eC7yaTCFg?8f4u%9-lpPzUBIbh;bhVY3uObGbc>7Kp_je+`jXj$KDU~x%7 zUb3)XEYH`GsZafbSfm92YU$co-%QUW@z@uRU*-c&kMWR~s%~wpP1--uDa$}THjLXS45Wz-c z;8mWn5Qc9bZDEi;uwnlXg^Fa9W%79|jtGE+F*1{>-LgLaJI162{e}g zJCiz13z{;TJ-g<5(QPu_4`hR*p&RAsa5FM)gufVVjpVL#nhS(%=YJ!Ah2dW6^8z@g zKH<-f=fr#^@>`0Ja;K4|A+AK0jyS+Ij!vBk1I-^%c*ZpS}4r$n` z%-l_nty*(=>oga_Gt~UVmOGc||MY{${eX)Og0K~-(&im=1p8V?xqx0d?F~%S3Xvl0 zlB9?^M1#WMO-50LO;GdY9r_te?HAe z%uyTptwh!4-L%YIqt7l^v~Q8X)eFuZ`a5@QCe!{ulPJ(^J|JO87ALg4{K?UI`P2E= z<$z-Gn_EQc0uwIuG9LvAs(1=QsW{u=*iS8rzQ-3*F2AeWf)>z-N-#{>^32uNDbN4( z1?S0CAm3)3t820KwRF0qAaskx`8YyiR8ujuUe-@qi(b_Jx5Nx|fzR`)rTF7zwHcp9 z2Co5oTFeJcjDOY%$i!YW=E9VZTQ@T!)h-sSB=svhSu{MIOK=2B$Kk&(%@Y~t(?UY@ zHVbNsRHwY6K#P9zBZL(_(?J!+;EXPP3cJha7+wDvp`CgBzqn%AJ`#rL&66k_8~#sf z(=_%3Ssvk=%Z!0KCapTFUk5fL@u#YAr>eGVhaG$~v zJzD$F9Z&mgP?hY~UY|#ZZZy6}=%4}E4u^`zFu`C&oG z@oNXgiEy-i?m~6KADlubDCm3dhOB?=o#n*g@cEip4}^+$~kAHmp6AsGrI31L_d z_05~TUu~4~nt?u_t@L7lipEN<{nH70tO*k*3!8OPLgh=L=}hUrMOt!9Z@Rp#b|$N@ z$1L5Uq3kuB9&3sJl;X#HwRI9VGj zuaMk6gBUp#@R4|a@33y$CSaVOBG`%H!DNXZFLaQ*@Uy0t`r!!BxoKvf-jL{-f1h*g z3ueGQ-qN*RM_hjd>EZKxW1FCcMrW0ti_EY}udy;*i(gmXk6v7UH;OTd{K?az;=&dz zJE2nixT{HlU2QTUBTSp5rb)AFO!-7R&P2BGwWjc!1GG&CAiN1C^R%WQUgJ=lGWT%M z=}=8-MhXm={+=PHAYo>&@j8>u_*cZTx3S984#5_EFWsB35Ew>is{yr(k zc%oHC6$kFTEiW&JS5#;K#NA%vW$~yVjKEU{VuDw{xB9l$*nO=|7IR#&^xHR6Y#f|k zyLvSflPo9{`uTT$Zs_NmgM)*N{Cv8s%* zE8tFShx!BwfyGp0o`8me(%h~}gL`=6DO7d;Ub^XKCSQumm5J-2e5^-K)d?3bJ)}FW z>tkEK8gdB@7irqI1pB*b9={y=N}I!^rWSe}(%H;8Rw`lgI#Q%$461rq&k5ovaJv<$ z4t8}b`o13ee+TN9Qd|b!LMjg$#hvh)??E~GX!%z!)u8Fe5>-m5+B6CZ#j9ufUwmgj zw(6Y!(cAPHIH#DZYpoUh7o}|AhzCWEF#6bIX38KVA(^Foz;7GA748WpH1A?49E4)% z2t`9l5rBWAPV!_#!1MOfBP%zTylH{k#l@x0YfHQ3pyQ?#iFB}#7osE>iY8-Q2Xdi< zZ4Z{(V{QZf0#6IT_Mw(Jux_lZtZXxuF9n1^-zuITEc5>O@dE;ZFabWLv?%%@<3_h- z9wnujito*IYK!FsL9c`EPYO68nc-Z~R@MC;hjZIKdvQeZ-zhLv%N#o=Pc4X?dsZ-# zcZls0POXafVv~rA?EeCj8Zay#^Y4O(;Y&QbE10gCb1V-3=n^Fs+4{tr5T&k=x*wrT1_qbp1ZdZ?WJ(Od9e!j|tAac#N;|wkM^CSAw`6#M z-0r&f|6aFjm*u1}ozB);djkD<_+`LqG+SwPHPMAy^Q&wMO*#bVu8TN`;W74mqdVeh z%x9LPEPHoqkahuJ%((*c-B|$-UNR8WJqJ|f^K?yt00sF9a5n||Ei5d(r+uZ)fB9%} zx?SkJ%h4^OV%BaUO!=0h+-ow868lbIF0A?P=u{20M2DNX}0Ia1s7 zwxAie#vuKIS#9Lzb27r`P_4?8bMx2`6qT*0HSD*QM>$n=T4><-ll`SSL{L4&;z|Vf zm(xT3Sw53N0~0IvmWtb>0e#>#roFWyDQx2|S8|$!{>iwRqi0T|1`j9LpYKn)PM24( zpS!%pY_LfmD|%fkTyx)8KWgy&loN=F_19f;3tJBA!j6XGRC5}Msm~{Kg88Qs-QR$OkV)rJyxYLZm<%t#%FXzA&~5}<99w!}Q26b`L3+XcX*ud^2M~*W z&h+#?XUGus_OYuq+~T#Bh7ZHsud^K{FVYBwIZhn}U3{za+)#ILaOjH9QyWF67xz}p z4>(pcn129PTX*T|zYpNLvz4x}qCe*m*yg*H^e)SF}3}>1Uc%Eh(EmZ&0d`N?BPFB>OHsR&q8HZ>>`F5QHQ5;4g8jD>kTg0}o(^z$kIgbvi{C zIkxMQQ8~yVw8@^lF(ds(R{K5f~OF9Y^!8uhS zZV2Ws#akiLQ*-9mUU_C4JtDX^O2v?9N0w;RiLlT9*~6wHV2k&XPrbzfv|fsoWN1jo z8tp+6A+<2VGbnv}8TirEDXt%nwBzgDnqh$57J!kZ&cd!XUY_r-epOvZ{_sedVR;yg ziwx)Lmt*0Yss$;ExGhymLZs*t2?z)Vl9^Q|J1)&EEo-1NB_34UQ)1RECe{1ux$3+#-|AVaC)+wA`1;nVbh+SW(hlj9<#|pGWBC1fR6ri=kS(m=RqE}h+g~V!=tS8aI zScFe)I6@ZICn!FDEmu}1plR>ACW{f~%}IBA*xfoV!?<37dgjB`0NXwbp<|@^mDh9fXAY9ai*3r^TI5^YBV;KSy)$Ji9na*c zJZ5qpbLfsqpBVnuyb9$P--tR0$~TJTS|xa`XSWBLlDB|9eY47=!?u^%0Bfc>9%y{N zO?@;tzsXQ`sZlYi3=(ZWZ+Yn1I7p?7{JWsQG?611F+2Ic7ra;i`IMKJ!QO#k)u(pcoZo^B6CYe% zTnx@JPGt!ria~^fMhR7|t*>GC-^^xOCB61~dwX{TuA3onb*xIFcr>+11`X-DLlu7d z|Nb*DaHKl2-Ol{A^PE_+d2jQSgHBXMDw?`nfPHy~J}d2M0rp z>5wn*F)mq{b8*8+{;d15hPE(QWYO504b5PYjkx7ny!ysDiFs7awrst=LxD!oqFzKe zXdqbowgx?=BAFq(bApv2{zB+!zJhl63yO+O2x>@m!~1D9{KYu#;wNBo!R-_1OvKU2 z3FetPTA-|=QnT&(?o=6H`+ZH==*u zv9c`+Unro@;5STYMsSG$Z{1RI_^Y=c939n3-~pRqEO%cqGHKghG87H19QCNqW({j; zY7SgpUQRW=HFp0-LuOF_lJJX2P=RGUtX~5?Q$#{MPT_l^XTsn%$1Trl6#sw3%r&We zbVt$xuH-+tJ?P(D#zZC+s%VNqEcl6W84*EjD~!VNPNGC#Pb#x6RX`Bh!xhggy=nT| z6|*86HZ8fD$=G&g&*wI%DVpSI&u`Ec-Dxa=kIdaMRKeqjW^D9T>utR@v?MMWd>r@o zGLwJQZWlA{QJAU0)Eq(!-w!^gL8I|Ns7aTkFHOo!!kVA{1mI`;GkUeV8f{(uBYQ?t5WHWN5ZLU)}8EinbOsQ@qeCF{32d$2&yD#WU{&)O|_Cv_8?_|?#_ zx7&;-Y)VNT_S#1O#yn=tG9@rn)5b)Gz8hO(+bY@GkF2+PQ3-RYX`q0qxheX(I>jt6 zxo{jP;L1$pEe+61#l`u=`+xBiO-=IHl`_=l%y|0vRp7;w!@)%4xZ0z2bHvFQXqR+LolhzyB zhNo3_a1Y5o|@=$Fj>f4bvSkoetF3r0l$69IHe zuNxlxikP6?|0s0f#p~h8J^7e~KWV*LQmEE>^7RR-5)h@WsE;-`@C zF-f+H$aC6?SoKz+wETU3 zsCBG}uFesRED{VVp;$A=b%o?Qq1dT`(wAcN^lEc&fIZO_lazHPeSO>bs2XINhc)j8; zHt|7rsrj<*H1T4EZ6cFiO~8(#qW!F{%A>rp+Kg8l!FBQmTPD1-%R|tSD(76E_?@ru zh@oIs_eC;9vh=|%G^TgWykx?!>}mZkvI)pWifud`0x{$f?q8MCN7}F}znFfT5%|RC zNwox6pDhZs`mL;3gl0uiST$m8JUp{cS3D^2mBMX<6uX+^0#AO~zsy-wsA`Ila^$|~ zYTW1Gu3yb0JG21I&R59Rl|3QDRnj9;^ue?(wtG1Qyc`9QgZaNy+8gWKs=P_-yaI`v z~Bkii`q!RvvC&pP$d=HuCML&Y; z=l*()NwF2&uCr0pX76VHJ#xY%mHTu-BB$B$lNmMyz18pM!p!V^&dAI8K5gwHE&h|| zUlE__TF|jh`teM9Yw6^gZX)Wfp!diMW2&r=MAgfBa#hUKuiRnQwjI{zh6*q|`B$m3 z%kH|OgNriNAADL(2o>S%usV>j1N~M(&$}?=`isa0vY;?(mHc<-lbcoS&>okG*soE}OmvwI0lf{H4TrU7?Z16`9< za*;-{1KUsEMEr##wAgv;C@WI5&!5d=2?;u+qIH~<{DK}eS#`U`Hdsf^rmtN*!7Bo9 zBzD>>FK+~XnR=K0CP(M5*Cuye#a0{<6D-f1a4oSk-*yP{7 ztV$q>Yq^!uQra=Uy?Rd?O}+3w6RQonqCjsBsT>6JBb z*(^1id3n_zL+^qg4j#;P(ySCgk3y~sU#%bGQ0VkK?IdI8cG z;{gjHLGc_yEp+`#LL5`%^M>rHiJ#-ZCz^Yj%ZA z<4hGKcdakt6Z0fi8T&-quI3{PudNIeq6u^+)w70~T!e0~vJ&Mr18g)y&Dnp|nf{4L zQ@G-b65n!9#>_UOt8H|nFvU@YB5LZzGau}B(fstD>G%$17i#i#v36m0@&T=Bn`c)0 zr$9XeW`f=CK1yRcfjjy``3^<@#$P+^PFL+5Npzk_phBaE3{y~#?iSmB^9^8nQ+tVP zuXx#NCRq_me{1c_mC;HTq)4u^w(|>#;p74q$7`=2te!jZhzN?H?5mTwWqTv4aEzx< z-vgSd}L;KQWj+wwYQruJ=|Z6X&9yqfPSh;JV9xyPD9kXj?az9na@tQe;ExgS>x*`L=y}D z5ck@QbDSoxM`K{rV1jKN)4VX?d_^kUXntqriyN*NL-MJWXD%f$YKpM}H3N89>S_MY zbGqezH1O{ihh6NLu^-PjDm*dWbxq-}lCUwqQ+{SIBCMX{bZ6!-gCYoWUKBM_yRNzy-{jKu@$$pUiQdYW6}ciT)UwxdjZ zMbyJhg=2i?v}@A@L*OHOE&MyP>8=v0Z4~JYGuwobt_{wjR^5t#Kr4&F9mfutQp`2B z3sT|t?oXgqb4wuG1L)epaIPo!`v>>h8xbReqAgVl%t^txiWEo?r2lXrmNf!9A0!Hn zB?QX8w6kCS$Y-I_NE}{*!R>v$xk(5Qtxt2g8M=IGqvFrSSBYL+i*9;Z4$3T+OPI$J zWC^jv9zRk(uRFR^(U!}hy8DJPnS8cg2#&E`0vVn%=svRnN6V6?yz10R`2^zsRaCex z-TXTXehm^*)1Ht>Tj$W|dNjwksk^mqvtDfh6T8iHaAk_QqJhCwHUkc-#2k?)AY--6>6w{f?nCc*k}_&x z=cEPKZ(8pUma52W*%Atp8g{2qYmCW5Ho$bD&iwp5RAqkl{&{oXX}@0_+Tf%WWry%3 zwFXNYyV#s=6V{T6{_*@a_^TKRWK&2Z=Y?s9^uSa!x}|j^GUeGgD{icN)TxInCU}V# z)~vK^7wIu@hdkqj_n+aFSO*Sg>kS7XSQg2WEZZZbL9BC^K|oD8)I(m|`hDlxI{v#n z?l_MjbATi*?S;uopP2>kTEpJrq&Sb#kcbx}H4h#7rOP0}kc3jcZp?-Dx1MKy#D6MgRowcg{8zQ$K)A2nz@BzS0%x z@CZ3;>ouQn4`{^%oaJM#7c?LVD!xGCs)#(}vTQ-X# zDAA;pVowvp2K7e4y`%}%2+hPd=dX0a(!9~6kx+PKY}C7+!-pId3y zn*=OJ2jeqlhzjf7s!DHsf)lPWpUF;L5z{!4K^ez9?&W;>)m04qE^O^r-HmTzZV0#m z|7vA=!@yn=cC}XiEd5+p7%IGBUikHQTntTplc5&h*6*Wjj0s#D5_CU>vXogyKlN45 zhx@zZ2@PHj`J^4~6a>_!FLX$c^#@4L^!4jBaVua@S)F^x)0eaoiAjOrZ95DN0PH^* zt*zopDRn*hU|s27WU;o_T*R?RIsG{uXIj#R$MP32sX1~XWX)SV;f|kWS+-Mkq>)tg zNpUP3Lr1z1*ML_@!`2oK$@es0?S3VFJir`N%A$8O?^MGfsY;q!Xjc-^)c((9Cb_lt zZfC1o{u5ofT>9mj8}AfuNyyaUDZ{`doyS{c5B;^#I^>(2+?S#pDy_>9@D$;hsjW#b ze%hskt>?Nj?=tivFMjvvz!(V$>r1=TKhq7j`TdlbXMq$ZO1#Fp6R#iWxw7{uP77-z zBqzHEK~LxD;7qp?4i?JD#!)Q%PV}BG>3i)97XDXE(`8d{O#^F;!4iUa&Exc}2Or(d zImh%lzjb!kq5pQEctU7^0#>Z`*@~iMpiY7R4u>BwV!shae_M#cSGNrwdEt=b4Umq7 zu6{=jx&n7}fcz&#@SPqGTfl%*+@QlT20hu(wOpxPGu~f_b-!r@-mD~zs0@3Q-s;%# z^@8EdP+j)hQ>g*xEGaLQ@=>t1V7|HvY$xT-D29SVo~)^H-S`UTOo4z(2HR!uN4`w9sF5xdkX} zu-QB8;rls6%oylHBApZ%nBloH5^}}?7Q!?|XTJ^k7!C zJ@?b5ZU&{SYRWY;6}Xz|wW(h|!|v-#0s+6dS(~pOqV2Ze;fnq&dyqT&hcQP`v2OpZ zZqtvbG)3;=#@WSaN27%37$ee>Xzc!bpb58tiYq8(>z5HgNZ*~vJa}znQMpxuAZn`+ zHMs~L*tfQqRwo#&2ep0r0)SI5+Zt|*)^6@c13gO_fzPKeXl_#4xtezV$BW4{#OvcR zG>Mmlif;jv9? z-t+9w7JqiYs34^!_M`@iWdHR#rVoq5IwmCN4~4VK95!zSm0%7EEqT6rpgXN8tA=yp zAuZ3?8XuZ|@B>|r3~}Y(U4PRoI@sZNVz>SGuWrZjV>P@n0oNF!i=I{)$rE*;=M}vg z$W3*Gk|J}zKlZc=J^2keg@lTJ0)8S{I)=ji`lMk3txH?d(yRn_^h$D1E{{LZTeBgz!4TjXR2^-2*3q5F9TR9M0@Q^-+$3yQ}ZDE5^C@ zt>M}iLz}7+QU67y-)k~kv7;Z=ODlXxzK^eE{Qj6ZqC{DzMm9XD#?UCwGPM4_I>kSI zFqNzH=mBWu)!>>4yDK&l0ul0Y*vuii#=$P5SHlM)f2>s#f_&=T6C0Fb=3Is zV`65q_l5${=%GVD6}8Qhi5`bCh5JO6VVBag+zXFP&XhQ{w9B?L`JIq_dhL~M0Ys`h zCaJPSLZ!$}q%^WC^|QJaiqILZ`Odc@)!a!^-Ut^AMST8_Au1VQBBaD$5<-=OepqDv z9Nh>HiqMwJ&vrlI5C-dJXq!tpgfW~_4pFRu$9;p+Vxh

    X)Uiy9ni8QZHzFo{jL^7Uq9No-(t(c<)t|;J#_w(VL4hMc25V&z@KxxMrZCp;Wh% zht|^^Cm*9?3^#UxfEseBe`BcoMp#fWNVfC5p@yTktJb>TW;mTY)>XY>obq&wD#T3j z)1V&iX!&2iY)8#5k-B%48p>sny`cj^6FvE7vJ^iHM>PjiFG1!)8jT~3AbIu)wJLt|Mn2)b>s&RPA3-Z09gdzyp zcY`IUFnS6=!yCJz8@2V4qv}}T0sZ&Z8>RSD2q=720JuS%RjNBYE{zQU}}l z8(j`VxPtjheC)hd)_4&?oQKHqjTx%1S7pXiXj*m30x14FMek_F+A_LL-;l#R%WbD2 zBpnuwq25Nqz+c3^uli@1T&1P+b<#LgGZM_(Q+!Hj5Ry6Ef=#}BuA=)*OCD(l=Exii z3emnG8%H_`vV1umy*IB~GX!Pc^#Pljp}4ndP?yHPf-|*_dTrT-e9OgHMvWY<&YO}upv^c zV#5K0Sg^)Bcq&G~__~oS8k4eGFEV%N6KzjT;|?uL#-$?6+0!DKrz5OWd$Cx%X6Tk9 zB>2;PG=fXsDTn~$x z2ziIdv|VJfsy5gY#hn5bXY?mQl{6}@H`MX;Y*mn=IHCpZHA1ym8vO0eWlV)fSyn;Q zLfoZs8F?y2H)BxjF?qa0h2-uT z+E5cWrcW=Ej-HsuNv-$$q0z9*H&ul>1da1pmJSgSuKW?F`d6$S>LxP=g#>No>B#@1l8Zcbtwb`1>O%_qow2_P^nwD zhPU63^;el%adWvwY~{z9VkN+vS}j8g$o{9w=+S~~G|cd2yl+uH;)3}IU=i22j7E#C zT9qyih+`{d6KS6B@3-G_)Hc01i}CqK`t@^8vZ@otwsnzK%x%j^`yGF}g80>jyzu+? z)L_E6f}7RDuMfU(VevIIltX8@J7t6G@ItI4-XFM@WOl9jc+@JsD=UL1?i?f!b$mFU zDiMciTQe^9JNN{%Q0`K^s>TG9dBJ#d`7$--uhr?iHVO&{eYb-Q5x=l z=&Edj<{hdpPpWVGKUAddp5_?WBZV80L$O2;fSUHF7T6e7NGhY7epjw&AS4>NNlP|yv#6pN2^_LZ2p-9|dI zvOPiPFIY`hB;xoe?Sh>^$EV;|`lnICz{E2kAa)Uq;gLd`bUHT6Mm;L$PzLR`Qsii) zd2bM7IPoGy^a0uNmiXp6Y!lx}CI3Q#GnPlz`Em@{Ew3J_6}>4bvPImTVSBZ{G=s_E zDY~{nDNs$9xTCt9*bDF}|MGgh6$VfPr2)SCiUI}psF{csu3lcS9XC(-?U-(uZf9)Z>^VvWi-ZP6mZUuKPeTnKfR5P1A! z{I-h0hEnUFOhkZo5fu4^(7$T6saWMP+h2r(`~|gm{dq2%o*)TItl}9`C&q+Um&JsW zw$Iv1_5H5v&2F)_wda_TaNwIYiCBwhjm#j|SLA%@!K&0M2Eip3tD3A!Rz(FZ=)bhV?5n9ZoR{xpA&`CA+hgd08-MvFb=bOm35ze{5_pugNI*MnZj4pHd#qMy{e+{ z3$L1)euqcCSvo-xBIHTPCoYfO+09cu@Zxmrc78fwCn%V2wag?iI9yYD%lcjYt?RoN z!51$l>()xmZqWBM5G@-$V2qU_;5ez|DbQb`s*>bI8Ndv<5JCrvzBe|m-y5BPa5j6+ zIAE*dgr3GLGLTkeObG29ED!HFV2{RND7SX<=N#gcEF)%_thf&98jBcMZZ%4)veWJH zeg@LB!y(s5tkh*qex&=CpHvf3hc5*)ErksPar&-fa+?Auw#RKwShP4{)R*GDt0iE- zo;*YMIxhSh;_OqAe~3P0HjmlW_Q-XNPY|u0CnrFaCmoC*hFN}RWo ze)#f!Vl`Hhhw;1>59WbUn|qrByce$YSjWoIf;lRg*qIGM_Hn2i^5zxdtD?aPb{l!6 zmRG+GrGD-)tRuF=+q|-^Jz1I6rvHMnqW;>T^Duc!(-@y$>;UL7XiTtLt>M5ZkqcLB zkSR*c5HAS_7!{@TdN@kNG1XVJkF{$7;SpR_t}foj(uc8fg^|GvKwmeoFFWZleo;Yt zV~_`K#f9HnQt1G*oBFv9MVym7JkPQu_JcjC`7Q6q;xw+mXBIN`aUt*1WY=xhA(E>< zJOnJ|wuMZ^o~0}yBFCD{U1`YBen_QDqNK7Q5UsPJIthWCwIZI%C}udzLsqDBxAMHk zEYF&fYi?@XH}9Qz)haZHtwJ^v#tx9{`z#B3PW_0isBX?Z%6El4=iV>Y4X9b1B^p`5 z2Jf^;i$ggTvJX8!>qj>i!!Z!Z{{}fNSN{?xCw2V`??GFiLNMmV3;a<%Y$L`l_$;^L z1t}vtUr|j=yAKYe=-CH4X?OnP%HEb4?;GIKc&{W z+?551*=3Fbouc;TeqhH)vgK7USvvoI_RYpc_Pyw*j^N$^w=XKuksJ7Sak=BjnRofe z-oQdC;2IePkYwG9*8_{)CSLO_qF(>{6XLflfFy-N;1o9jOgB%>g7+0^oAbZ&^;5R8 zN04AL#CsY9s)6oUNqkX==k8_{6&f)Px z70UCg)lz5`>+a%M?I*q}>mB5ldfXx4$|6wg$!< zhjjs0b%#Kg+_O{pg9q>wASx<&;G>c+UgRd1qS4UavDsNegIWhfHU84qd-Joo1$Nsq zu-jf%j}7v~baj@jB~J5_RcmGMsWj@F(RSq1Jbo^&AFzeb=i0N9e~DQNRo2&H$5wO+ z8tGYXXQJg2>*JOAfslnIoPpCx+?w4_)pw**fn ztS4Sl3sCz^H13+}^B`;xE`E?Mst#fCsD#@+83Uh}((>E8Hy!x!h*X&A&cUpWJiW-E zt+WID&|U=Csa1?*Kq69iGPkE69Bx$w{?M3Yu^r?9`1Ea05uiIx_km*z^!&f?KbM=rj4 zaq5@f)%q7Ng5R`s@jO<&`;#=D)L{L9R&&5f?#uL;Dm2*?5C+WN#w|sQKl%Fdnp-Yn zoJzW|WiSD+>f0jMH~1NthR3Ww+2ggz?E+*aDI00`!sgvJtB$b8;jt9Jz5-I+WcYD! zpW*^d3#F1B_*I1ZW`BMeSvAPk^LG@y0OjO>kxuvt6Zv^4P^xHiOPD{y(m&mSU1owp zyKwz2h+Vur5enZ89r_VOsiI62!$ElVBWa+LjFuNKQY;cK{@Q!M5iIa*{8;ARPTCqM zI#%|INE{z{JwOlewctG)I?qUydlceWZpT7KMJJ1N%RfdAM5o=zM5aOz{#HjHioh1( zhe7AwPJdR?Iz#yq_ZH$ggo$_&>n6K%y zsOjkuC=}}Bld&8}>}o7b2voT+Mh!RaL9s@?P3Ou*0K-Trc!V@H)2e^&y2V;rH4jy zhnfZ`YZalVTB?c?wj44(`oP0c0L-oiem=)b{8%#|F(T7-bc=DdF6V?MnV58BwWz-r z{rVkPSo7r?I#Z~Of^OQ+O09=XtORcVEKMSYmAv*)Th-TJ8R}@lf`r=CvY@q-;;o7y z6AyR=II%Wge0F^0dMZGWT@0Rhlrzq4Y2-#FQjyQkx%hyP@X|Xilf~|{7KGJ|g!<9u zmG;i+7(SA<E-aAKcag|`BDbKfYxmBe}ZsghH=6?L0G4!aU7cRb&0m+kwY9=$icW*9#CEbVN-oSfB)NnL zo16AkOtnAPS@|FNr5}g(C0Gx zVXuU_l_QQ1i*?MqCB4$8S4I%{ZqpP&gLf2t0|jfL_M}Uj1`6vbe6XeG&Xk3X^X z$;<7Z_SgwhfeY6F^+CDJZ8aZo6}Vp>Z#|V9-UAjoV_+JRMqgo}my=v#nphr&rTu!A ztAbDdse%(OGs$&Yu1SF{U-&M%`yn1rdpZH7pgjm`Wwq>#<(&IHoONwR=s7yfCgV4+ zBC^`RzKZjqvdV_eJAI2FC4quAMc3%9dzr(X3iF1_cYW?-yM^$*{bgGxC*dI#Pj{E( zt($uB#y`(;#cW(`rOZ$%%XlqyK`i~sfPAXZZH(9F^U$4gJbV3D{wOubrcP0HXupLU zX5t*jv#9uXF5-e&5WPCC(zu9iDYVkqHy&j{K7m#MZ4jJ;65_i8F#oEt7AS zZU*AWZ#_4^*VBMiAW_{pqe_Lp2Djico~}^;?{^7gmQHUf`HR!+oY>s5(?myY7pvq< z%iY2#{2pE;5=4s_%*zg4*m(|Rs_qcqTmR{#KxYB;?ikkMa?w%}ASoM2hEkE?%3?U# z9mieacnZIAS}9pe?jHd|xp`R=OXqpkZyV+IOwP9S8>2Ug+XU0pFAnq~$JKswaLvcxhZR=9O9$Rbv=cy> z3`9aAvFNqv=aypfM_sU5SGwh*F zql+JSlTCNFk^%+flT9h&yZu+VWn~1ge?m7~L$4o2>MMLFfX~XlWQO7?t}W0gOL&j=@CjqW~Hrg~tSHZTA_*{nqLD zU=t6Exkaf7D2@=kh&!Ib7ffcZZHyC+oC6J+P8CNT#(&2tW5?g7oDK=#$|J#=O_`W7 z@b#GeX|HDi{gF}{@`tc^q|=;%luSZds~NEjQ{3zOr}8@RWJBOyABh+SO$34z6A2P3 zZxWk%U(LiaPZX(KKkRuffYp?w2YI7qDLpzK>HanWIYP!8rzfm1+@K{>izMWVIi_eI6D8E4B9-W9r%oj_1rmKhz6(M|0kCj4O ztj!GJ7j=6oMMsD z;36%jl+x#%EgHnVvaFNEq^bg(Uc+iKCm(N8w8LD;fCu`L(NnbAye%VfjE6tXJw!=< zFvleOK^0$q&OO4l6C8K+gPQ+f@khXqYk)qZ&-FxaYRY;W&VKwbI#32Qv7vKJNDsJP z|Ba|B4a!14Ziw5+Q{sd`;7z@pCy@|@a^r&*BoHTfRbG*KyaMfcF~}MF5v~1!_R;N3 ze`L>##;RgE7@Fuz$-B%<#)OT<^?DN|yB7*Q5tOGLteba~+cxFG1=p_XR#m>onAhvu zFya=Hj6!M87(5{)Og`T!loZk|V(`2qMV6H%#rm!>9maSy$wo#-7B)AF7iIZ0n>GLh zc^e=$(DqB0h2_t7nJm*6Ieeg=x2H)vZeOg9`vl{2r!Mi%T3?YP9|n}bbr!kU(XSwA zz?ZA0%q?1ZxPd#R%~sPRt5AqIEa$hEcG1%e?e#S|`xa7Zd51Pib%kBmQ$c;TkE|av zy=@CnP36|6oHPfqmv-3;@vOKdP0fsaHrLW*Qia6=S|m#eTNN0ej57U|7-W^!vY;7C>4%S`vQwY zjyZ!j5R$|8=e3%w*H+L6;M)F=X|q_$_u%LNjOe6k>)wA2Xy05kA61CI(dOkZ>%}z8 zv_qW2=I{E53nnZ6UDvWF-3cQ384l`PcLNh>&!X&)xev(c;Iox8v_dHHyXw1~NZ zo3gK?<>DpM@WXKT_6823ER5c_Sg=Esh(Fo#!T=VXo}o*g7Oc9b2$a}BDx3*0J}KrY z(9<1JQpEQjx^tpm=yO;LEZx5rM4x77RxOHr1OwvSPBlb zfJsycCW|gLfj-n@W_rG8ro;o~7wskA6$)*=p}Il{fa9bV7X1hfHDNyxqA7dVETWKr zPAnk%?yc4)Zp)&7^W6bvgEFOoQ?&k$%+f0taFj#qZRU6(aTbs;_4*2=w#RvTlaIy; za9G^44M>#;F*iJq75_43@vwst*+?Qa*03`2ktQx;;Yw(V$-m#z_%55Dn%?H>-1OQ$ z&2y+rv$6W{QOsK>aXdNyU>!X4fWV#Y+m_MVyM#-o?-mxj#zJY|F)44t6hJwo-S2r3 zX4xkvC)+fA<2*R>sf17UBL)6nEiVn*byr(K7 zA$=CXce(6dT8y;KZ>Dd>bZ9fyO4Q2{Mc^;iroD=xT& zLmnN*Lys3k7+adITjk$lY0(tycO_IK_-mY4 znOvW7j)tu*U+%DeWdy_^a~^E($1#aY^clb8E@~a$SF9hc`tjdc7jWQ}CGRgHXHpo$ zDL2{AvtT%$+cy~*Nm$40Av5yG*|OILi@MKKQs|lj(hJE&PD7M#Lbz+mFlO#09M_zHZ6ks342& z{e(^V)_S7q&rjeIBf(72`f$1%e;)>Z_ji`%Kl~Dq3sv=&0~U0|{kYxvk$g`${MWcA zanWxpQQ$rmDwIn#j?YB~s0eJn(lpd(HuB+T@(da>rC)hJWuJ7~1#XAA_&u9ekJl>4 z&bvHSkFEwZd57Mlt#Qagk6Z4@I4%VG7z}M77R)?+7hZelYd@*#+pI>a9~y1TwOIs_Qnurl4!bl(5~=a4W< z;xPaS1ATZB`UOJB?1FBhwr=#zv`*O8N5d@^Z0UP5oV4jg;G8e;g5|RHgZk?`)ldJGI=TH0y z$^s>A+o$4%ICx+b%&njddrE<1))wDRV?b5mhk@&r3BcOwP1<@+^G<#nkEe=)+=PAI z@V_f0*632HTD^Dgz55vR_!^5=Mh=0acKwxw0_AhbO<*FznpZ4fX}^FgIUzXF$|0%@ zHxI`(Wi`%ueNLXJ24AS0!9oK53{W`fy}~!&=+y^!pb?sP0DhCC^%;zJE_w;*o(IH8jeC3@WW-X7EB%gqmQO5D{xxk}t0_0Vs4 zjIlLGCLJm>cW4s(ZdPf;Zz7ePG2_3ZlxO2*X(`pHfY4LPRLe}#-BgWs{np?AT@i6q z)@V1^Kiv1oA3joZat<^!WO?m%6<|$TyI!Ip2)*8SLL(eB-)O#zldCn@MQ1KXzc$oh zzv22S@{TvUVB0Df=!L#(6XYI@)9`119~NbOY)A2>?3+GI1z%-iXUn&hUs(eW%0O6O zUxFq0w_cqThl<2T6)~tx6c1RUjEiA820FK~jf9C4dHArzuh^BqvOTb+$kU-xhC~Gr z4Ym@6>38ghBysUThIn*jB))%pid$92bEev6TbwMTro_-`-^7GU^NWmM9sWIfe>+hD zk-aDX8m1I0NC9Hb+8nItFkbDE=3|*OpQ4V%-yoL3QET0ybQ|UTS?-upX7q#GL_P$P z504gWO9{Ts|HkleOSj0&T1Des%u>C2by|O&`DKPT&!@rPkg5pkK(J7%b83u z^EbHPi)5m-JxC;Iu|AD1EhT5w2|0h`do&=lZpC<&s^v%P(s-XBox}%fl&@Z>yDV1h z3NlopKTX;rb}Vl7#@_S+g$USll`Bwu#q_s}EHIDH!z59aUdQjtr7D7sNWq${F{lX319 z*)fogW3Nf|_dJ-VTGqpG*aBOS3LGu23P)|HYJnYjTqso4!}Xs|E_*uGaKIsWPHQ5t z>=h9>Go;(3TtR@$xS2b;^#or_y4N_-nyI{Kg*0rc^5xkN{dbzx358tBvq3>Y4OALS zKulG%I=%LvuRsCv==-TOTmme0y%yL_+=}yB>%mKCi@J~VP!WRdCiKJV! z5UAp_h#zc08^Y^`-9cNbb|}up%6S-Jc`&UaRcQM4Tld*&3_YXr_)BE0=G*9Qw>V^t zEiGMEvSpo#Aa`lfM6^xyca&Q1!JbAON+SclAU07Fic#fEeWJEgTwA{Gez(D@*7mei zX`Nb_bkAKsNuDACey=nG!#fU=`}yC3mgMy^G2#rStQ;YBI&G!bS3-vA37B-U-*3>s zPhp0J5XPH7itsu(Yd=t~ef*5khl}79h}h6!8VhlEJO7Lw;xAt~8KgCU$lV6Gp5K?k zw{ z#6R?bGp8Q~5-?LffIW0A7Ej{^U+TKO&Q=CdqPgJPTU$N(Oyja6_*{?gFHyJyuTTur zSUZ3V4`J@&uI+sM;!en4Vb%^XO?{WnPHu!0j>1`r>=xQtbs|VmdT^AITsy!9X8FZM z`gXQ|H1e=4Mr5w=)n~ZR3lv*?FD@2^!E4}jDYqxT`hL|>weALV-z4bqi5c0#YD(&f z(MTok5jlrR<5xbQi_aK-P=f|JN_G!9UA`h(W>GvmJOmi=Tb;ywc|R2+`2Ki9x53%7d>qk6Xoq`X_Y<3lV4_iwA8BKd;37x+IvnhI-(l4hu{g^? zhztIxj6pRN{uBBE5#XcLpyvF`h`C0u%EO3!?c2u1n>XtRN&Q@s$}qAoS7&=Em41I6 zBh`RyaOe36zl%ije16bku9AF0LlZd;a)>mPH@oF&(*GoGulS%2Tqi|8kkcn1HR6ij zGy>*8jR|WADV8Veua|I0^!1(Ohds=>$@ey~X2-ym7rB###x<}3fc+7FTJmbZt$N0( z_szRsGYMHv?`#FXvdmcf-}Q8Cb!u34RaqIirPxsR>F&*Me{9wx!B)Q6yFe=HP$*$7 zJ=ouOb-@b3GP`Iwl3Hpx%KE_5t;i=Y9j3_fQ0t#rYefBmMV$dGEiEMHG3gWnd75Bg z&6z1Z*-yr*rQ>afOOu0}Fy8}+;%@|T!#QbGA;_w#O_!e(&Z~`1W5F5zhj22et3ps2%De75JP0%fM#FntATwHjw}R{n1{2( zkZ1Y%rbE7%Zhp*~Jh4n|D8WRn8WMb(iPj$I1rONZeH!mvrPMAZqWyShu3_hdgHsj? z0^#Fh9ms)}`JQ^KOUD};8I_I~0jL8*niO(CkaD-~Qz8NQD12xe3_PZNMUJ19c5z!V;p#cS zaZr2sgewmcHdV930Vren!5V`paWMkSs#vyxP2R zrHsN*s4_=u{(Zh7+~8yO#Tnyc2Gr4Xif4OUHIfW<9gp&b=Bd@LFp>oa0zXa%X;3Je zP9BjI70kEF{N$;!5pz)JlPt}n!^5Om3>IT0=ts3^Z1tHgF8pKQ?@D0KCf8@vrlm@~ z`880UtXLvaDvp+StT|%uh>P62JcKy4mrE%LBG6d@Qi$H(fnn{@Q^9{8oI+)G*0r*x zVMb@8{?3y?!q;OARnOYK8|6H}1HP*NXw8|fJXzCr3%w;xkG2QkLwvt>dY14KS!4=- zt&?>tCsJX?b`?N!Hu}?K0m@e~K#+yx$uVGZNoQk6M=Mt+%WTkG?^67ARG&R?s1 zk{C^re|;%-jb1b|$#QncarA4prhzSw?CuoRY1WM$lsfmuer+sG)Kx!*h8Y1f9{mUO zH7}p+Ug)MAP2O&(imRnI_9(L0PjxTAH3uf>g^~`4X9WrwO?ueM?0op6E!@H)uliA73MCIeMd|%p_Cf@!MT*VDzCrHsUxB2=bWQoKqA=yx zPMPc<=uOub(Mqs?=OUAG4d_E;{qQ-Ke$&jO?3RVv zmoz^z5y9JrWb{DH7M zn(Pjs>5pwnoCz1bqqko){{eWY@=LP)4N39X_rf8R-{1u}a#%Z4m3l`~gP;9ebskt? zeHyaOey=ct8~CS_iH*&+MizZgY0{|6VQoPfXtnZ{zT+QIPO3}ZY-!p95yRdo&y|ky z73SCfp9K)HT`x;a$Y_AiT$7Ch(vh|dZtWQ0-;YvUnxlTW5%Q86p@uUPR(%`zlh(rY z!N=J?h{5Sm(=Ul@E21@`>$*QRuX^4MDEM8s5KKklVLLF!;x#BeH#3W>4KN;PVenbC z=FCEGTOOX#CVI+U4GC#$dQp+1QM)CKSHCwfHd83M=ik$%iEX^R%Rvr4A|Z& zE-DrF&eHuwwWrh1e%O67ZFfRp`enUywwY>H77Wui;Vfx$st&g1&lS8w=vT$!yB{jh`N zq;e;Qgrv(UodOqSXE-ik>B2n!+P}RN-dKm;zSS#+=C82g7g_jV!%+0b3V4zu)4s+# zFSkcxgDQU583qxx;)p4pyKXV~5)9)%+n8f93jj7&YnPN;uxvZQdtItLdhGl0$XN3~ zr+lP(P{z?P=N;L_`3$(u+@vvjRg+pJfe7a@KY1Epsx7&PpJku`7-y=v01g7BJAq9` z6m>hj0RZmuH**5A2eZXXpX_KS-wn9<>u?CSXFWPx;5Pcko^!{cQ%nLwbqC23uxsaq z;VcWMQgd;x9vVMkS;E}}7C6UOV_-;T`Ao}sr zkfCTgI)_O>ANe4)6-7rUPHO72#UjANe;4Vw#L6&<15A;@fYEKkPHt}sgFNK1v&r}@ z%?o3RV1?qAY(a-3A)US2D$mb~w;PsG#r&sAp6(F=^~~tg+bx^6%Gx}`zd6}DN`j3c zw7+kTPY;gX=2u4@P2ZLgovmcuN{B#5)EQU_rv|w5%c$QY!Cg(W!_vQpU?V+!+~W%q zvi2N2>AXCNuc^-TEH>=PM-POc;5@?E@eAYGfT3$LNdH=Ks`-Zk zYEa#nI8m>%M`>^I&yu#yCr?t%ufijPe&)!A)FtMS<6-*V%1npJ3v;zezhaA@#$QSY z2S^`zuc>rDJqEso63r~u5>CRiN@?7TeQQX946}p2_7rn-URghJCl(bI=aN2U7v2lq z9i{_QdLQG9I#3)Je$CZyWYAO1_a+>$WC2qS=~V$Q{$#9(^yPnS+HM8KR1uNF2VFRc z$Qx6X;V6A&!?vGk<(PEc09PRmOB&jGcxU{~5vxJ43Gf1RInb;|!(VySy{^icZo29b z{;Q$uwJ|JU#%Hp#{ru?R=BtD0$+k&~$r@i)SZBK^!+D=D4(4M_-xRfU{)m?QAeKCP z@2GTA{>2y|xa8ui%8_|E)DTNq;!~&F>Msf$B2`sPN^Iw!&#cdbFJxo5JY)wnmF0m2erlr=)p_=Nax47RuKb zS_!c^-F?o-6%u|su2T2$DbdbREd{-#j#m3?1FoIfEQ!IGGyAMpYi_|i;T~NYRBsSh z^!#v}m}l1(JkcJtI2+~~^HF)v^$`lwTxvjScJmPMeY`z-W@FwiV5n}7m^~ctqdHVNDv2C2y&ycmu z8_>*X)WzE;-zUf9r(TR;pD-TH`NbJWUqHFR+jN<5m`W9&$XNo3s60#&*j+`JbeM}Nu- zMUPn&HIRGQwdcEOI}3WY?|U!2s#M&>xqUkL?2ZH*8&evjh7D8}ooE4CO^Z&fo*m#O zo`{re!EYmAeh1Q7Mnpmx&gBTwXo-TWoq3stH(ZKlzd_#ck}OeP(b1;7eD>NEG!q)2 z8_5Uf&^DRVSJ9;09*$TF>->x!H@$r%hXTE!*!|4byMIDNH`23BQ8^~l?CbkvRE|yG z%~E{`+?9E~L5#N|kd$L1t=T<|v8_ONYT(Bjet@}_s^1>~M7-f8 zmpM1bw#TO%b?}cAViE#ml)r=2#Lq$ofR%g`|N?tNJtZk>}6PX5ODt3bdL=LzzfY$7#GV{K?($=N1$=u-D9 zIjXGiH5dp_mp}^@VrCwHIJ~OQYt9g46wy@V`SwV)(BTSnwzEq(d}@X0RrMUm^q280 zOC!Ud6Jgb^%SIMvv7s;M#EskDnp$=FD!S>S4(4Q{PQkDL# zo@FLxNDgq=f)SLcqM0hAwU2rbNKu@u3O*K4%$ZZ%|2Pw5D(uQ592D7_N-wm-C^d4A z7*&di=w3-hJ>iDhC@(WdEoZ8Jqr~nH#duRDRV-LD1>7l+=svDkGz8X86p%wC*mEYb z6p{XO-Apb2&~b!F9kDHx2C1E(%B5#3-E#8e!X$Y-lw}WHNe4|i_yln z50F~|{+#`|6ZZr5)fYSuxafnFbpAST!EK0e;Q5TVR{Vs$ImF}%ts@);V?U%?C^lR= z(@K^pC(OWzD^Hcg>XI{%Fb%Jlei-)^$<#SZxLr;nheSrN^b?{qJM z*ZJ)Ar-$a8Wn)r`IO7Ssw?%#I#(G|_$I~vo*2%*@eUSJ4g#AN=`=HxZ8MycOFy9v2 zYy{MvAv#TU?knyrsw?klJR6%?3hGm>>xUG=#~#iw9&fmxYW+e@38q?^eh>d=ZNs%f z@|#GFyASpRV+3tVDEMyap%G>!r}R;Sd1As8@XfVS;QOY^v+TcJ62_4%{&Btj{CH4w zZ@B6G5e$ofrFE&0XPP4ZS~~i2Q}QnD+naf`Za+Y3N!C`)3#L~!CC5%6#WahJg&0+Q zc^@EN^zuL_bHVHh1tr(3yx{F|dk-k95JJVHgmbSwb_Y9B7Q$W74(A0_Zts5|xL5RZ+Jdi>1kNF>6ja_YSQE!?c@gde^o-@b3 z-x0A?E@YnjVlTc0KYCtnrlm5b!Z)KiA-j5HX~b>S*g~>rS?PCwSCC+T4h^*L9v|}E z;8S_*di+QG5(xK8v1w)(hBNqnD%QwA_nuZ65+xe>1_eodw8SXg`9pCD*w{G0l=ONd zq?A1jN!b6_nbFUAql=ppd@4M31XGx)igp&$hznYy(evBpI1n#d8?(u|q~YEtiaFAM zjB+Vj5?w6&i&dQe9gp>ts*jIvl#DjP(#3f)D9J45XhJcbz2VPQ`pAp$@!VJW2=2{N z`4${uo%1Di0_oV3EE%0){KspIvaRNLvE$cc3UBSU?SU1c=DAmYh`-Qjle_>{xPSY)Uk;Om501r*gt45dE?Ghfl8-YD=Kfz+f5#lli z@eUK3Baa1;4*%ZP2gjJcSvTh4#df35)$$9E4N=>gOk?7NRf&t8#*5}hkSR$MvwdZm zgAo$0R?h*+-R8hwM||C?1vpMQQpgq39SmCiPkU!k0t|vxzhnp5fJWh$Oe=*o1SCI- z$8-x^%6B?L`ofFVHc?Pi{xeFIyZ9HDC-hlx?cTQlE?&O4t&f0U4GZ*It6`moQ`tNrd_8PbS~av`}HpPU#hblClV zY(LCIb9#21h!Ss(XIYx9`h5K8Hx?2qSwGu9m-Vrj!q#;rUB_#kj=ib=vP`6icZ({|Jpfl365cKYqVnNOAHK4a|WNl6vBq5daND#*6-dpRl{ zO57gAa#C&sGzv{TVunH><~4k<+NIb*rwqE*9Z93y)-C(BDscY+Qqu=j1jafTayDc* zH6N;S53;YrJ^jdJ;*k5&C%nqZD{4$n?<#+G`8$tGT(;(a=?sJ*TweE6I2%s}6r<%4 zkMfs)^0Vq>iKIZ6$tinYs9Yahh)fRYpCb*%2z!!E`&n+Q^i<^5FOM?01}WgPE>+SI zOpCJGKMjZ=_^EV3#%(Wj)fl`s-Ipl&JTI3t?YusX6Hhd~j{ZQ;M_+wu#q4 z#1fp)th6S(iX1a`3KT+}zUE`I##s(ZM?Jgk2cghj9x2)=RjYHz@iir1p3iFihYPBc zIdg~S$SF@-*?Tyfg>a@9;ZcG6PYMVUd;@l zCtS|?q|$v zntBN>WScDILyCPd=Oa%}Go!d-Q=ZM|y{FY!0y#Y}MufZlkKy1v6U_Y*9?_;#&t7_2 z(Q+r2`==w-jh`B(Hu3s%m<~ujDk=)TbqAaQ1UA=y-VjQ%C-GVo(b?RA%=-HJ>}PB2 zg%Eu9T~GV?L~<-A%v5<44G*RULt>CXm?PA0`TfU2{-m3ln{bKMD3hmnDh;_y@`sNy zU+@q}gP_=#6(>+ts+4oD@r3q&`C#25AARlI@O+|eT`I=0pV7siNtAv8H8xqJ907l? z41whTBkHZgntb2?;n6s{rIC^b5v03&jE#~~8UdxdOF9IR?$|&YrCU-OL`p(HLZp%A zchC3t^E`ih93Jf6z3V#9SI*@3Dn-f2{z4ifB4Yr_m-RRjtO+LGb~kM#A(5QJ5->bA_nIr-YN+(OJA zdr$O>LshNui%6QZrP*Ph>y8@>N@9&Kd>@&&*-nZY3q46cVZ`Ch{!pe(P*S33hx`4z zFZg>jmb{(!kUnq_5&L1DUiZh`evgtW`ljpgC59p#2UjU6mFd}$L{hZnBaSGkC-?Gu zZ(D%mv`rN(QmS8}uemERS5<^(o`QFc+~p&F?Ez{WiXA)(UiC(Zc!Vntai1MKu|s|= zSKK`jqqOEh=Y5CxGf7~6Eo|-r((vuNL$Q#pNKegGcOVP{_!g#Rqu-xP?E9?uMY{uO zQRO!13$Ko|vvJ+e+-tcS)zdEg=*(ulhpY5@>2O3ckG~rsY(WtWDORa-A(~p`O1N)l zrs1RR%~d&+nu7)Fm01Cfat+@aY788#pJMr5+sVt(Y`R=#{3wBKlVOGG-&BSAYg@>T zbThnKavWY?ANR_+3k=OxGb2SUO|rzQ0+@%(OH``>F7NIpZlL;C{GW)18CZ2mNY z-#_GAm8l=b6Jt1Bsq=dIzz*=HIy_G*e|vuJS)z&c;Ce_WFy&9jwezgvs|K-P@(A$X zGy}7OmAmuL$VZ@lwC5N?*j+AOf0oqD0n@rYkS!uYj0A}HqQ`mu(Bzixv3lP#2c@3E zrxl8>EUS3#P*XnwG8Z(iF*+3=PLuU&4C+2{Dee5G`P9*ert@oBTYK7caIUvAdYVbj z;@)XoG~%fSb1ltmu#^Cnf`u=p`LdtBxt<_2%c0GEGVuY3Q$nF^`3ze1TQ+Q#F7KM- zh20_M3W=QPnc@p^2K?X~o_|LflK?)tlxA_E2_2V864C~5!P zB*S7d9A{fo!6FpS`Xvcg!buH5YBzVEd<8$KjuJBq+pk~>y8Ihzos~fZ{EN+wbep$m zcL~p)mn*rM3FvqLG3H_-W;4mEo2QWu8L9y%6BOcumpVMrFq6mGjEde$0TS(A$jm?4 z2I^u{c3i(d*W_s26xDVyp37R{{QHlUWn~9vNV*>UGJu5TO8P*PKWx7Rqn`i)2fBS6 zk{WKVuBiaucY4tNH<$Uja0$;_n0H$tCnc_qA<3#Yq+u*eL}&jmP}wknDv@!LAlbp@Ysd<0=3Anu&Ot2lAPXQ zpamtG3+FoQR{lD65_yOCf`n-#&PzBFN|!#-KatCqPusPmD4Q(GQ;lG53=M!>N5kT% z8D2CMblHN*kxZ~BWhcTP-P7LPx>vs|O}Bxv%k0rZN=oZi-~xNW#pjMT2hOos8X&2R zO6}V>k2GH2Y`wH|DriOO?Hv-HCt@9B`dhKu!N~=Xr!rdy@g@E#ZD>($m$q7tfQEH zm)uG8Km<^v6K-3siU$T`d!p%rJvhm0E~qz<;Y`GQ=p776PZac33$EsvggWwo2El(wJ;bq&M6 zI?2DFp|Ex>lE}$omQ9Q4*E2IXoN9+ikHp3K^jTWAVhCl{`PL7;oXhJ<@HVL{`uDIx zWlcyd7}EUF*rAKpv=6BzPH-8yN>t&B4wS!qugDPb`=+N;xv@y*$7YJiNU-XW=O=qm zK}+;LHqFBALiL6ZIc5zg?@zMwP*E3aCnaz;V=ysUArq+3;)@~5L}{Eeh%gMTvWajo z+i49(IRZhQHi$Vn4|END@(|AvdeIY(7V3Fe8+8}w1i1J=etPZTP?(UAK>O_I(tlV_ zSVY8t6C#HsB*>;6t;sj}@+9T`#Y1r1O_th~nZv$AK?|TOzx|k+r>|%y8^P*R`NDPt zMD=(<*-jD*?ob9O*ZjKI6cT5+)sw|jRlf*#6Byy7`*<|3+mi1%loYEv$TI$9dPaVV@~|8D;TYIB?_xv zizN6IQJKBs!?~QHSF5&0mjXz(#<_~vSGBIit@cjOhhR(?Jm0i}2Qr%(Du*p5q0x@jA| zmL7m#H71VW)A;IK{!7!QHwDM9P{}8=(u|jbD&!e{XS?vtJ@8^Mz`B_xSB2d|UFhN% zwHk7P3Kn5~;%>LCuLV&IzN*6AG?ni3{$`hAV#J4k0i22!x7m1>0~xGwW4a{ZP>E)Y z==?04cTJprrxAtl;&W#E6?qLB(Y8hd5s`z_Y!Y<)NmgQmt>Dvy2o8 zpZ!f#PB(g-URNes5*~0UT+_5$(rHLvC67cjtgcPOC>sRszZ*b-au!Yc1?#_ubKZ-Q=qGLkWT zryAhp=Pv^S6gx{)7z0xCwFx{mX~`ZL85s?OL0k)fj4J{FhtvTAol)wjk1WPymghl( z*!m?O5fAv{NBefjng`zs zOFS4iZotl*e{}+`zVXrx`J8G(Z{~n-pmlS_7j`JidCf|fXZ}=aF)f{!obsKk0sZ< zW=C@zZ?(ERUs@Q2eqrNSUE}%QJ;7U#H_!z4DK(Z7y}tS1s8~uOIcv}ao9@=lT!l>765=zgsghC zDARuo8NiZv1%@#p>tS-=wFs(h0J3Z58p@OKs$vc>3%s=U1(FJ3t_1S66%~8z)?5i_ z+#up|ru%&605{x==IX?pQY>%edzX{unk}OR-e`JJN)hPYdoOge%!KGUe%acmctT$3Ph+^>J$x@-BRqFU-g*X6dRCd5`U z)F?jAKk~`l`*EN6mASrR2hC8KplBx|9!-mSX;JpFxLLKsjF?WPeFbn@h?d=Hcv51N1%*M7fi!M&THO#Z$$=46pHLaBqBf2O0 ziSQ3#9#6?{3zl!JsezEBhJ9A) ztpE~ef@r-TupU-acc|A;d=Pn^%WRJmNL|EefdJhbB=t8bD>xCn6p9O%7!|I2{_ zTG~og2wgwWmYkb~L2O^q`bcpKc}xjq!USBt5)|dDYq^!^Ijb|cX?N37uDveo=rEJY z2QltyR8n;@L9@ia59hP_TJ0P5gRevCO{RiY!z$dHYgrtb;Syd3e}%>2b1H}o&IV8a zClsz^TL1VV&^nl4Z?n)HT~@oscQf|+ZkwHl5h;XS-hAMdJt-m^A_mGn2e#nU+nb zX6$+fTHFv7?+huuNzoa*aIW8}>@_O4kr6-bZ0x^1w0ZT%G;OZqyF$h_^T=-$CHZfj zAQySZr01e=2`B+{5uybXnp#@$4VFR0a=ik40_9Rd1~BO>x?jM=-vH%Z^=5hkgppH_ zX2kUCa`0m$U(HqrruE0umJt#O9vuxZ8Vq3S;+53I#wIny1O&nF;S+eL)>XAWc(fR;?b|B z*{q?&rSOMU_)uWd>`?&uOiUK3z?Dc<^)Y&YfrAK2A-2tES6%6+d5%x7`U zZ?aV91X$1zJ<}d=0c=>YiX2$^e7vdjnnLW;%ek+Cwms)<2_iq^(iq&a~`A_x6 zij6K`y6c}KTQ0xcY|)KAYXw#(A})iNwV#YhApK?7*pxV_?UIaEt4k{cNLZ*lEn%wSqw>^rn87uZsVT^Q(zOajd4?V81(YNKq(yz)hm zITLTm1XlUw%B!p*xRA&n-~BR-Gs+W03XmiSFJ6u!An_pKqDmJDOOr@QkxcL=zbyGT zUDPUdomz1XDy62#t3~4ss(O3IZ|GpHlWrPuc*F|Hk_XGq4jbrVKd|OhA6ruazn)1} z@5Iidvcyuui{Q>x!Ar{V#%H`WhcUT5nJe(b=sxdllAGxHOK$z@g8_%tn;OfZSJ5G$ zwz7p5}-V0~dq^n``;l@#*ZKO6fHV$7?`>;4BvtouM6GN7lZ_(gC7}b9cCMU3U zwvwO`Be_dmhh!eRXAzpbs9RwC?C&g)EdKf?zVJP*3h#X=m++U()h)fNtG{@4|MoCN zTD0jOn<0u=Xx?`>KH@;;30H5=xZPH`px;ekQ!wLC08{bsy;zHiT4decW5US?e|ZYa zW}nkG;&TW# z4vzHXe4lXZ;hk|FeLhXU*jt+udtU)6Q7y}Z&xNeX(Du9DsQ#Umgcd0kJN#^khKz#8 z6)4s<%5va{Z2Tx!UabmEV6jq{Ngn=2!J{$D^xhU&*afK34U?3|B9QbOhINCEb$FF0 z?h~`^VJG+(#p|uh`Ryt0xgL&0I8f*LRDX{tFGACjt8Y~w$dJP<6eYKiVsNtfE^U6E zCV|tVz?rZi?0-+cj~Hz_1;NDp85mE2Pp!i?)Bsj=4}mSahgj%BOCX;Ii8En1 zM95=b*6&RGYvwUeR&9lnLRC1`?;C+?V4U`g_1Kt0%z~H{-*Wo`8^EVl%^W6I3?%$$ zBIFxyfh^q8OsN-bsNO0;+0szl_Oox#?SZNRBEGRh<-O2ms&bqrW zIx@CY?ToSDyj$3U7geo)pk@{Y9L9~c!)`B`CaAabM@Ff3AYT|3 zTmtdn!fuw-t+CoqYmGCFv}Zq3EFG3d(JE0uVxD?@eJB5uvut^YDD}cE-a9+=;Pp(r zmde~9^30Hkzsodm($V4FSjlbgr~(TtWPsica-2u%8X*otaGDfa|M~^#NgamSr1EM5 zaQXbr*SsT(4{RuUxB-{RJnXR)&CZKjhIpykCf-N5_)4IaijF^KKoHQ;(>vY*K)~`% z%T2<5$BG?B{gYRPtGwz9)zh~9xhx>t9j<<@(%DgN<$A&_$y2D=Iw&oUUl#!!C#)Rk zrL20o{XxJ0GmE*4YJ@F0(s<9KyJ^6ot8y$sN`ia#>-T(pZ$~i`&T3XfzcvL0#jfPV z%dShC(M+X8sq+sG>H-aTVyXC$d=$u~t_3cH*E0j(=F3xHzbiylrjQhd;Y3=#a?s!R z;9zy`y!G^`{FUpcojlxy_6eOSwU+46dm~u|rohd?P5kg4i*GZ?>)KQ4#vz^?}r5+kInw2P|UEBRFp?B}NBloCBr^w|R(>NnKDjd=W&!{Vy zk_K^^(s{VKi-5jYq>?R<Ru?c3e)pS|Bl$NE;Q|Q+CL;?()mX9pd z1%dDij{O0QKITj`SrV{3nRK}~FHMCxlTv|r0FWn=DvrhlAx_|1{Dj0WMvf1 zmhei*x4_~Q2k^7B-;fJCuqLnUp-G7@g?_&l*NLsGp&cA@Rom z;JAns>B&w$;SS!NDb|dVD?Yyd-h)S=Z$LwaI5MSsyXmJi#)ixK6rD*A;A(cr@-8qN zKYb#lteUhsWnsL0>nlZ`cWu?rPra2uSHwM`Flw?;eT?76MB;(@=00W31IUB*8Tw?I z2AiIt7LEY=yvbsxcJ99Xv{$y*pZR4QNp{EvMZyv>*zVLaq%zk8hv_gwij})kt+>QT z!%{I3Eq0U4S3uQS6)Yz#y4TLcBMEUxmh;Rh6Y5zAV|0LUsHi}DLRU@eZQ`NtUNXkf zUKgy*sA?gH#X<%wo4R}^O)0sa(@_x-5A`MwF}*&5^ify%Jt4##oVK$RS)$uG+kQ0h z=XKFfVHLZBO?vmXD}mY125t|64&FY-99jsu3m`EzTqqw~PnBwTS!JI>|)WM=92Fxu0 z(?}zI`reAEqpg6M9?43-PY`+(+BEb0GWsakklq1DV9C2i>M(}QrZ-;6Y>p94CVfBe zwPZzVc@)<T?kl;q<$k`dT=-kw04qU4^pn6z@u1m2&#srtWb=jGV2+jOG1VuO+TszQx0C& zZ2!|I56)PC*bZM^yx+57Zp2dL3QDJWG@xoB%EBOicb*TyDgeuMeJX;KUolJnn4rfY zLri~wq~QYkRn`{K*QbZ_{!Xj=OteaqJ1Q8q~&(VLx$80 zuCk7BFdB=GAAl?*T0JbeQ=_VsZ)}<#+#T8wygy8xSBpy1G$a;ygl_oo_|hL$R|B-C zeIvU~jQ|}-gA6hn1fv($_evRbi~G;eEhnkKvk_z`j@urspq$qzE-aA#4ZybJ9BmcWEK}LgfEMu zUyc_^Vn%IGbCnQ5g~?L|V~5r^9g*KuhH;OdN+Ia9fWIv+95e_?-BvIHLxq<>1t5OE z2X2o*ehf*Tyh{_ckH;<}nv>`k9Vad-K0cMb`*TN!=Y!|k4cw8*Tm-4|DkM!3PPf3p z)J)7M4y!{g3lHf~Q`aFcV9YOMQAwB>%aNEJ&&XJ}v^@MPLf=vBNo-g(E6|II=?vdMKHN5mlX< z`ov8Mpg|bVkD%jsd2tWPh>;)?BP;a+$rUu~Bt zi+eO?NZmyb*X6*brxf<@I%*!wc9-0~Gfd`E+|_!Mc!4g+-bj3)+7od>lALS~1_=Ga z|8C8@ldaLB0mh(gl&O9)mcOGslW!R)FD(SAHh7iC8HfPRYT<>x0?*tv>>uXqblTu7&)As@PE91m(rJua%aH}WNk1Iy_~7sJlw;X9p=RQlyS2z* zIKrDXZH0oBLNni3wphHGlj;tb(Qwh#VuQa42-%}0MH2z;HuPds%htRbH1-|rKo*%k zvJepE$5#t>GS4YJ+|MRb)Wn2h{h+3f+l5}^o;5KasAd(~3~7>m?^BM#rve{AdpqlZ zovVj|Ylm{ZH%k2+MFE7d0K-A!$B*$q5OFCCv7LY-+^>KFCauoP(bslU#cHW}c`}YF zekT0iF;GDwNV1CV>O6cMV!&2(rE!yEvd(A@a5`j&?K;{65XG;}V%P3)6D7XRmIJ|A zAe42bwyhANDfQle*CDpO6&H%{)wLIK< zr}vLmO=7}z$MT&41HveO5fr;xwist_AE);WDC-9gI zS+RGZ7$55n>~tteK=~Zr9dg@W24JvtKc^9(Fn)K;B+-JM)RD1aWexv980(0#ZV90> z;m~GJ^wQgKw~_c(KHUI3+}ZBueZOosTHZBv_k?K-&yHd!qY2J_!4yzkErwcuZ`!Mj ziiSChvi%d&biKjNe*%B~nqOE*2;$`Q(YPz>EOl-VuH_J}_>i!7S<$J_~^K*ASH&YxRQ%_@I-aMygK%Uz5FC#62xxFQ)iLv_={ z&Nq4kl-!~BhPQ$AUN!O2HA)45(*A0ym9B@;l-vO^yqGVAmsHi%bg!dY^BnnsSB-_m zf{iw*?Tgo6z2MrB8rkYlV?{khN;INbX;!r#wZ zFMr8@vjN?D=x|CPoXa)mL8WTD*Q9smBj6YOF!BohP(_K1a=n)0Ke>`@Aq%mLGE2;$ zwUyOGQKGcE*AE|CMOzo~9GL#MPG9OtG^@wJvWgoMygXbYwd4&RKf*1Cw$5`m)=S)( zA$muH1PZRG*kOB_0WO@EQDw7M9roUKJ5ezJt9w~ZHYC6;-oNgZ1_|e?AD|Rjr1dVK zdrup@_M`Q6^>gJIAPHSdbcucABhcFY3VRWy<3Je9)6` z27YrqvgK7TJnc|@KL{ZfB41Bl%;n&apIugBbZU6g~K zt!5TfE&?ra=DPYil%O9xRFn1YMVt!{8ij#;ctq=H%hXV2rp|lOs~dJqeL+<@rUxY3 zmQ!2nUt&*z?y;m?|6?_4vIwlpo*wz(kr6#BPW3yWwH-DjGkjNV)~=57@y))v2SPNM z!W}|8Ue|~&e*dAxOTYX;9OHygV!|(;Yd+}iqC{E!uQ0!6=-tcXdb?AR1pN%XqTO+CY;=ale3(x`|GIdmou!4n8 zZyJV>#;AbeU=)!cAO6k4se)K5;1pQ#E}+fs%uH#vWW8o6eN(p3jW!#ZLs411 zfd%2Q4Eh4{fcjV>%l>D7{3($0KB=c8RiZjK?teACVI9jE-6sd4Uw?^oZOCmN<* zm@J;r6!zIZm?~m2n2Q{aV1|_eYT-G%ku~*UO^+$lY`oFUemJS60>}!P1@GWENk^UL za$P*Qtn?XREHrm+3h)mh+mE`GrYcoE-qt!EeNU!nGEMwTMQB)7meXzx{ zc-yZUZt-8EZpw9*;Ot|7nT(-3yS{A*y!G`37RrCVTdlD%hdV%oISFuBKE@sXVwe8X zv*c$Pwz&l*ZMUHjc&`^!%mmm`TAWXw*yPDHVZz#$p%xRmFVJWh5aoqKYjt#S}Y#;gJ$cU9Uw2PN!v{u5Z&i~QRUqgd;hG0uIpFe-*=C9y3s4BMs zd3bnmMJt7ImE+dc)upQJ0$B?1X|8$`lZ+_TX(-#%?8v87-fyX?TBVzi&VhtkU^0FJ z^Bu^%`IMk-;%s$a^=i1HA^r8bZ_%5-TQ3`T+}WWAAD+wWHBW{Tn3hIj`oos9@g@2V z*JUj%~SQ!@1-wzx1*m9m}+l_~O7S>4ji3n{1y ztqYh8c@m*WPf(f^G|rjEtSeXgf7T9mOwC&aHr6g6bJ>tYf?aT zG0vV!2*lc#E|)oMJ6hxUEO{CWu_aDP5{etlsvBG=qYXc7N5|X|B1X8y!0m$sWVl&- z89iUj?tR6UB-EK%w@?C;A@mKnhz@O_^T9>$9|1R!EFEz$4aHsAATO#dHuH%kwpi1v z3%leVw%b98GOesqf4zzf%`^dN^njb&-zPX9YW7P11P88k_viV%jH?M#`vZ7P?B{lj zje9n)yj;?>z<%!PeN<>XW3gPq9doi{e87XB1VFD90U!#^{rC4LS7+5hTGbs_TyTAT zQW_8tt6HM0;Szv!WYrO?t3ZkC72x;_HIxiYoI=J`GB z=Dm56R{a=Dj!#{@zL|wpsIGSF&(FyDjn7PmxSh?+d{eUavG>8%AU*_v0besQ@@aE{ta$o4?=9RXo z7Z@w47%ee6$~^Ow_Xt+a!D1E;Ff4RuqPF1RJ?js9 z%orq?_%R@4RuVU0C?Ijw;?M-bCTOSZgz>oOSR|f{M?_&7XFu!ls^*_4l7!w$QJ&G$ zl@$!yhcSV4Zbr`b8!ivwq2eB%KF^lL!|wT(iz@oU=(NqINYJ<|pv#1VIX<5IU0p;trpi>1H#8kTG2@10*`M)_L($Jj$S} z)FOSc8iu(U99~NTGK$23CFaYl7X%7DlRu)RR~3b$kUwvs+)(!JaWHAQTH)GLBu*Vf z2UaJtD}AmkEBk@Wy@25cfp6cbo@Z#w2vH0TQN}3D36=`1EmpQHH zJ|UMcwP-19N+xKk8aTh+2zaT#v|E?<5Q0X`h9aoeeuD5y6}X4|VxGfOUJ8 z+yW5RhS%MC?0qAVL`GthzF_SJ)a}*G+Q2oRDo>&Iga;%jc+qd%Gl47X^8NcC0|H+m z=CtdLH)7FgO+Kt19+zoclP~u+OVOk@ep^qanX5EE(ARXjiMzeH-y-awmW|TWBx5bQ z>wZWm#Syl<(XXe?my@7!dPJX;3`fxaZuk7{N_OoxI}x#~e&w?Q9Up zn-Q|Zj&hfW+3wSOc`jAzIlYUkB2~D!p(@N!m*s5DhL=3PY`vMb9+E%E|Y1|UVo zlA5IpN<*aNEI>^?F{ZOTC~p8zzp2Oj0)1a7MaG~_Jz@*0SE|`O6x3N?uV(~t0whg8 z(1fE%k6m!LUM-FHJ4Yp%=Gc;~Xi|tBSl*Jf?nm!s<@4Vf-1z6b#i~u^xRWtc0rT=b9}~e`KK*g&RbIC#$Sv&W z-d@P@lYb;bHFj7ZVz1oEHDFVly!eN`Ojz2A3vlLR!%IHZrMz5e7GLPTGZP-oNlo7= zfj3*XJ&1J44K!j8HV?U}6fQ}z7l8QFRSi6peKcl7|>iktMM z9yS?*@?53yjZbI9KF0-Fcj|Pi8ftC1!!;Cp#KFzY0u!W{3CspuiutNj0C`h!L#D{h z1G138dd?|Su~2WDc)T;v`MUi~|7z)%bXjG|DPsWzE`>~PPYKTqP_EK!sNrKXeyPCJ4iTlA}a zO@9{-=?y93d+tN}Nm)tJ$1}H%d*>PqWV_DEK4wnM2Ig47S$Xc`va9mm?msqf+^=Hn zxM$V9<5%C;m>Sv6-65K)4E1Ta?OANNUiWk^o)Fr4s(_aLPQQzF*H!x5fB4Xf=%Psc zd)O33S-&0z62`6<|BxeV{3q#M9Qk7k8$Y|*Q)d05(&VW2l7_$Ysz3F^kt0KF_hJt9 zqfy-34yM;{J+UDlw5^qPTbfIRN(6G~mdGs{Ce#~#+q8+T{jK`4!^SO=T_@VaDnP!f zf}t6RS`^hHg6H;1P{a&xPY_Ce60e!800>77giAu96ll*mVcK#zF<3Xxotq=>?hfvA zAzRhFckC2zu=9A{w!9y6cCZwrxcs@j@*X=cX(%#^uJb(>X%?Z`rcF*D*QicOD^+SV zc#2~#;eFd4p0FY#VKe3HoO5x)(3Lf`vx4{s^wt_(_qz8s zB_mPD?{{;u{SNOjdkJ5rng^e1x|K|yh8n?AyRD;@@a#wCMYa`ZUz}6yukR4*2;xWx zZN2M>=@4U!wb$Jd9M<67aD6ieI{GR^L5ARS70W-54Ukm}RmObuR@hQdH0i2iFTSP* znpjtc_(BcK-fz!+Bd!c9!lq^Yp}_gOK)h2@WjU_XV-*a4=8nk*lZ({m94T(y`b&l= zNGZ}*38DhdHNt0a6$9eC>qUWK+2-Ww^DdC)e}iw2B1n;ga$n|ZG7*V&iOMHIqV1+} z8vy-A*f^5clf-90X?>9jgAdR@df&Y`Jbt7AQshFa7-wh-BUgNHCZ6j{j z6qg=bR`sWxi3=mkvq$u-~gNosFp@PR<^N3RO@Ot-4t#KP1JJV1c~ z0;5HhxT))K7V{`cZs_|5^LvXHeoMdY2V{2wK0S_lpV*pKx-ph-n!ZxvHP)t0p+$93 z`rQ9DO4po+(BHi$FYXC~xS^s*?zZS3}FAR+`#}PMCOPDVr zX;>RPv0>9?mrG8RnwQFH}yB<#phDVVXg43_At02N;NT%0~U4Adr?b)3SMYTDh za$loJAr!^OwKCz3UwrCb!RUGoyaq$Ik=*}E_W@QXOt+Y3R}k5~dfgIsdzK~9l4g!PQs!Xk z={c1tlVsgpw>wQtH|TWDs26|f0#OnG2P`Yf{$D7dO_3`^g$M3cT~O^Ro0W% zs!wD|j))A|uo0!?RX2`N=-)E6xz!JfhUW3?Pv+C@$G?ouOiH!2N5t==A5X{FA6=wX zI-2$=()wu;Dk$2s-8~|J{ff_5cd~`=5^uXpYj{T~s7cN6HI7OnU+=#Ze#7`K|B8aJ zhryy7Q-Afu<8GuX7B(PV3E5n?2_Pjy{N<+}A1%GGVTpSoQB?u${m%B}nRTeSa8@1j zBoR(>--p~dlz3=83*wgLmmpQp0LE%QbHyGv0>Cq*A;TR9Lh zT_Rp_cQx0kkDS&C*wt%rm_^d6LQ^f;ftG+%AR;XL)9aNn#dm4ns?DoOEy}S05s9L* zMX=@uqwfXZiwkU}`39RCTYKo1>w@QzPYWa{Ji3V?@N`A9i@9r0vy9W{#6IwdYglWj zEH^k};i?Hi_0HqQb{bfSYy-QBW}W`NxomM;RX%2)iV>@{n=ph}c^;2K+TaMt09T%{ zHkaH>D%(;HYYyjc{hOtSudYZC3x4G4a}g%TiQfmq9TZ{{+0(41dNoEUl95hS!}U;# z8j6t1lozG<8Jh4|${Vx)# z;BPMmoK+3-9x;(OSNM~3gQ$6o-` z>7*RVd(uzn?CWvy5@Y`^|NWNh|+_+|cb(pz3mT-bFQVXcQ( z&iYu1cYVOe(DiB$muW!9W&Yw3+ud;~YIHkcv6zyuzGKo+D*zHOxTiJ~gKk*%mzv%3 zo5>|%ji94lcX2@KG*gN4u%p};3)P!O#H!+$l0fjMp*v2z?aMR8edpaj`-OFJh~Kf9 zG|ZGtS~;3MErX0U8FYiN(S+bHH8ECjf)-JU)_yAo2@$%(lX&gN@6zn}BA|tVI)=m* zZ3HVMYhFi9)acE$+dCyO{n`tjg)!$fuIS;W+AUd`&B;oh>c3O}Fu|w<3dCD^xC_JI zH!FAis8ko`&Y)SBFnWektfBxy5%h~ck-`v#=jp?YU!@lN@^Ye1Qqrcuc6{l7!)n4l zw*qfXuqgBBzR*~(6)SL4FyShapxC1>eC&H7$wLsYQC&DnTz=4TUB&emCxZqT6E_|y z`1C2{J{2VLpd|+udU=~sgAq$DJ4Yo*ZFoxfR##o z!$u-BFin+FWZ<}VVfL3TKWypLP#n9zuXzzv8)LajG7{|YDdNF2nL(EQVy$}1*JbPJ zHtoz_ty1SKQ*u3Kc$Nq*T$1_0?_ZmwL8}0J_iw&n!u>#kRt#Qdf-bg}$7gA)JtRZ3 zUg^WztkG6qTk0Fb1Vja%cr*QqU%ZP#nR>oRBL*2!;u^q1fsLtoZ;wMXlafLTZ%I53 zNGfO2(_K$Y2_mktGyI46UolyH790FxeOHS=R*gu9*W^?h@7s8Aq&TvAOcE}=y}VSe zEUXPX&-qvcu;+&Jr1?i!_6^x-WFuvp+!3}70|md1r4~c+wL?L0KE%-M4~EAN#ZbbbK|dIhEJV}y5jS7DQ=*;TZ|*Jb;~`-*;}ez_*B4N z95dJ8p`r&aL{-S^YKOc+*DDWEf(QQ?eq68g?!%fqc_!uc6Huzge}C}@9JCE%0?pFgj}8U9rP^G>$51s-@Gp+K)mOz8__ye7=WFTz zeI>GWOiAum4s|Am8D&hwM3|10QOtTWj`S3_x*W6U?=tPq8*aTRJTCnZu@uO?t@n^e zUcT|l?)Bhv2g_Dy5repa&NiO}A3vM~anig70}^E(MZ=P^?f$H834S!>@GEk0+W7Fl zrwGs^gqZoRed`x>h|5aN{Ze33<5GDt@cZjiyiWYvEk0Z5y|&B)|2Fy7+C zRip+GcEYS!x^LgpF1P`$PKRf$;AuPA?99ZH(&4v-kv^`#&z{bl6!kH3)m^o^gx)Q6 z8PPMw;?L)i>g(xm=I37qYOWL38)oRty!p;Eya(Qe{desCd$EAKFd9VZ^YnXI;AEf4 z*ufR;yM8xG*FRY#UF)sTk{0?p;-IIJ$1%W zpH)mTY0ze8GA8H}{a zn|aA6{9KYPv2}P0;+*+hxO?iSpjJ$B|0m zGA0mKQ+|+FS!zs-NaDc<1Imb|7ijCi?yiw>LHCNoEx^o&|LZBlUK`A7QPS6UBc#nt z79`Bzc4DFvxfVb%3L@eA|9-{5m(&Hp^u4;;Hqqj4_c;Vxmo}w3O)FO2Bm+>hCv6*a z--;rL!_th2It_J75daUa2>Tx z0H2!)iRA(kol=#wlerhAF4zM(P^xr2SLw$niD!S*y zs-&2XmFgbz`Reg}wYba_1h|9-jnm!WpdkBuVx?V+!PZ}P?FdCq$co@Dr8|k^w z$98+hD{U-Rl%)R#15?O0M&FWKcu@3apg%k~Yvek|zn8fuRMZ3{hEfEuVxj|GR44=W zKd(_>XC4sttc>y*D9}i}HApH)MR@@6p6dHbj0LJ zmET2M+BAG@O^k-g>`SdEYjt#Fsb7a_VedlYAxcQEfu#wJyXDH6zEtCRK~Tw#=zHqk z{#|2!Zah}%XFq4t#87C08Sc!?%mhH=tDFucQ8JE`qchMo6m-4 ztNqA(-rx03C4k6Or=4>6iSi=0)oUQ(7jV~9Xys^^K}XlyjAf1d{w#_0eCmzp?e=^Y z5s{jnF0#ZfXFl+^c>I^%uTJ-!l&j|Q^0xrY&dI`}Fe|N6M=fsUoi)h{`(|iUYlsPfC6M*_kaV{__uC zZWJqNRUdJ;Z2Nf;1s6MX7O5mo;V}BkzV5gz$J(9#$ zdG(50>hF@<>DQ;@z&87&pZclI#9YU@aH#9EnXb$6TqzAyf&}^6((>{sUT(m~nXmob z&E+W&0-NCsFak=fQNEh{()G<`x{&14~f>8LN1>slN7)K`%uwWPIae&+nA@b7eRn%xDH zziRopNQtq?=T!B&b_^T`8^&++WyqbuFUqrqyMM5()e#w4k;iqfCgID3am?p39D-@l zF!!(jGfd(pfK&(D{r*k?q4{YJCxAv3Y?LN`@s^X5vjMQ+wE)W0ZLiL2dZ!<4MhHE* zx&*eCmKHkzygmhr$ERm2G*xQ}&|u{X7?_W@LI;4rn5aABTUx6p2~-ZNAAq)-d{pH7 zaE}F$N`Q)i8y+48)UQNSK%K+(^~!w*bFKj}VDqJO&nS#|s)fq3{IaM%=#)=8qZjI6 zivPyXQ-ojLrW5CTS)lGA(S(eq)lq}L)2&X4(*Ta$Le$S{QrR$pA9Y^vswt}vW0{~q0djWl%sMUHAL+8vJBM_+6_NKagkqfgFh(lh?A#t7)AL$C4EKv zJM6YhGovsy%T68ZI=D6o5dso3Ex$n!=S{_NariL2aux<`=@bF z=)Um65CE862E3B7DADl!sm{G33Sq7rKpO(+mFZHg)8i5TX@G)!P;w7I;*qkpUPSx9 zh6`A31~;(txXY*@KF*nHPx+m`Mc-D^=(t38_F`%ol3lA0Zlez9T-*<#no2tqq=Tq~ zY-WC54F$DYYXNC!;0Mny^b2?%Y(C#cUIF!E34efQfu!@ac+3zh<*woQGCIvtWsS6j zdHVdnI&%{!9$Dl1``elBIYgKg1jt<}BIMf{S9h75j3q#3z+)EWK7ZxQZ~c|d0l>J@ zHaGMAR-!Zx^Cd39)cn=|1ZM7vAhUcRCr>yNz_|t|REZLAg^$TuodN=a-u0;_l+6H>c76S2nqDXH zykZ~$fJ~Z0Mn;CG&T}Su5c@%_tj=r3oHZN0>Oakc=hXU{dbwH^wiJ(l`=`8EP13gW zG=#3_;TxE2aRA3d?<3;&mZi0^hY@qMG&I{eUOx)v%!6`jdV&DgE_YBVM5hsO5gG$V zUUhjC=db{j1qzN5c?8XC6RRp?<|{THNX{6HtJ{l*6*WHhqyLw@Tp|bon!%G zI{X0{2LS!8vlPWKgfnMK%3%geKAVyillhIa+TP-S>1teWqcs?XP696Befx6sr_e@D z_3O8mT~`*1|Bt4tj*9yE+Dk9JG}7Imba$tuASEr`AYD?@-Q6iAAW9=GAkr!&9ZE?_ zy|ezl?>Qcie<1tW*_}Igp8G_bQ;d+jM1Fq0xGU)*S<&7zJ3ChJtEvOK>g%1>E>C4o z>57OE4Mq0m?lP-CRwj;N&g}h;*hnEsLeB1pAX!`f@s2PYDBj@`{n5A(Rtc18Jt7IM zW1BEEqRy&*)~70}mM#V72Sn(Yg9s|+8if-1pN}xJKhiv5L%fTxe9uZyt8>ov`e^g( zy)AzAYvz}h4PQ?C`TW4J(QpJCH-%9+d^laZd;FuEZ1uSgV|9 zxqJ?rhT%kom?CWJAR*@2`bMk}d@oy?%%LW?0>CthQ*?-nxRVAZ@Q^W++qjoqrR_&# zQ=(D`53Un!Z?&HGJ`L;=pZz}m-RtJMyGZfKoMG$aLr3R>qdYIA#0y1@j}aLfV`b0f zSMc6O1U)&w@YbR3S%tl?2oxiJ^93e#ziWjj{{lDI<|^*2J!A?O_`^(N780#T*U02{ zI1)J^H?Bn;F$TQ&`TVV2U4xY8WRx*NaOK)@$w^nj6oS|v<0~rkH^Bcr*@t!s(bfPj zYA=W(6dCuXgb&@?_;^sJB$f#QJ|T3aN2JkQPp=_+x+hm5Q~qWDY=+BOp!H3zx_s%o zhoR>IR}J3IDy^5V$TTU8s}Tyq40+ipNV-ebQBPOI{V%@2A)>L}Vioy_XHHJPs-nWQ z|G;%KB?z0{SKXq3{PgR4`_m9qzE52e~{IWi}xb6_2HSppltNgH+6{uE%c6+xO;PO=P#mp54+bUlpvX3-p^zpfU z>vvMY4J^_^T7xPCEjT~xT9kjX{Lzfk@p2eiofRMTZ*EFW?*vgqgDYDXmz~I|E_(#M zBZSbhx%bjtiIj&v=ua#9>4}s%Q^b?1g@uLtwuSc{uG~Xj5v8aEKrLHejLd48r(&lN zBBWi3)^l;4wC{yMQi{MdM83>fSX+AH(3}he_2|V}FaH2m%72FZpxnaL?l018e82dx z;V|BRW0+8T=HQX`Phy3OsA=5KP9*3F7%p&SK1iLwyg|ifppDi&Oq`O2<*oy<)K%kg z;!rJ&DB$kkMWtr$TR$;l4G>@OC*CFCwY!JM97_Ksl@e6f7C%wjej=4~60c#YIRpNNKYtS`TYYUpr%2-g6#Xx2bTd{0?(k2D0v?-7W5>E#I%Q-< zp9yYcHNoN{a3Al`O<$R!Wn-uo8?a`_AOGU6xJ1wTwY_bV9@qbwTG@gjR1QauEg@76 zchrurY&bbi{Q?h8kWMkVDif*G;EJNYv6pbJ$ypM_jG6s4TwB%T^xpmBZYe~@i#idh z$=R8epe8x6KrXl}xv;p$EhIj@`r`f4qqQ8|uIz*Wh33kCb$?nBa?O}l4d#Hl*s9W2 z{d8=)_&VgY(TkG6j1JzE=-Aj)Xq#+rZQ1qU>^+hRgZD6S_<8IUc*v7~4O)Z}8Q9K> z2qhtHY+HgXgLl9lsoY20_mlxRVuX$<(&{ul&T$VtmSbf)JuMFHBtt|A_`OjfL^>V1 z02IOHREyMt##yVpQ(~o`aC%LSq_QQ6-D`6L2dG58{Mz6-Hgy+TPAkwcgZ*?`TqpZW z5^y~_rLu-|G5FL&^nK^50(Bc(?DCglg)I)b{3rAc(I8djP@|ytrA%TdM?-3}j)|K| z94;!Yge4mrTUrTatW*=7b{Nn@%m5ef7q&zrwr0_6IB(zvt%y`3{*5&CuV`LD3Q1J- z;;D8te0Yf1mm!$!ix6D)`{bYyd%-IuEVmy@iKW94$(B$=1$oGprbce=p;|>k>j~lg zcFtRZYEcbcEm>8PRmZ_s+rR2Gm&U`{RxMd0?AH=@SvgR?JOk?tF(}PXf9#efh_D8WJ|E}vkXNw2dTfQaT5LWh=I8d(RIe~`SWVR z_p#$5F>W%#s9*I?56oC{9{6F^!;b~O?v2^xXeMc#jeF=ySlnkb z-(#h-rJpGzV#Zf81gqV$v+=^wVR4uee02`Z3Y*;Bu1|rYBmUhibv%TI5iL2!vPkWp zbDp!DRJAssAJsA5(`ZkR62;73KGoF`C#YuW;Fa-wQvBfoi(S`O%%Nkmhv8;Bl1zd0 z<$FsrD!uD6zs1Ky%Le~LC*cl!5aAsVi&06KIwf(#0cR^z3&Q;$qnF;GH`o(6RMpf4 zkEOAerc{69ma3642vKA~pd&gP$|}Mkr=ZbHE`8DAF0U69`bEBgGuaqQ^YOLdue~v1 z5zk`ju6COY8}95JV8SB|LcyDU?RKcnQZ+4qu@s$&+{ z8DPqfvHnPZ!N_I{W(w<#hZ>BGv41^G|5P*EM0$Y>99HE$ zDlz)zCs~WX=6zz;tzXcqW~onwFFt^xpg;pi9<;^&f|jGV=kDVBJC7X=k)T_lE?~w` z1*iqA-*TVPKuCB4qwN#6xx|q@$RdI04VTC=cTdfm_V5_ljhP)X*Je4k;nj zckQKFm>k6hblZ#noA2i3wiJY_8i%i-IpMCfw5vAitw5uF<+6(qo!&>od=rEZ#tRzf zhZ{M&R&2-$AjD}0fnvcc|3TIaleo8pqy*pWNc}La%H9xvj+4>Z{SD!G!q&-%8&826 z(;HqD3g+y^`S(K^l)?#zJ$BCr_c>BnQY?qcVj9NsX&v&QxQIKEzveUcW zWtFQ|zd@j&s;d9?n?u7R=|^LXWlM1o*tor z=<1y@vhv!G!`>mTJ!=aY-1S~-#%FEALZp(CSJ+QS)uOigkKfv$#6rfC` z%*fHz(Z~H^5+xtkq%lMZ7rcQRoT&~4;v@nf^$E5yzJ1hTQD4&F6W-eij)m(D>IW7e zBY)@SELBD#w+#AK(jxf zSIyfNO0!|+jr2=OA;{p51Rdj{1{=E+t%59sus-f?;dF+LyVOHd-VFeY;t)#e zU4ln?&H++n3OCB)rP8gIr$r5Zaq@HCmxY=Sx&?I;B5ymsRe<%$#gEZk~RQdbd$Ck-ImQxS(vF zP8@j}=!>%uja-$oz(2h33`qqOE?ddDnL2S?^nCjIgCe@3XVH8p+kS!!UiBb@#e@0l zTQ|YHVLRYwr;s{K~?Ps}R?p8m@6w!twK)@E`9k^~G= zhzzdcq0ulMbHWm`{c4@cIB2wHaCC43m;YRJ>alTzKIGW|tpVMMq`P2W(x>iYrjQd% zq$6OP&PP=?Z+~+>@;4X-k!kXcYXgXf8HXF}5DcN16SChQ=KzjPuzgJfF$qcTF*C!V zqU`&5xch@;^iTfrFQ2kt8t0|dcO!8G3S2U$=5e_5G(i#oN*#)QcN7G(egQn3=nwl< z5ety#uU)Z^MS5>Y&oX;%tv8f02Oh1ozzk@A(@`SE*}RZ`f8=}hY7wk?|lAutb3CTiXQo!^qu3`~3-~%n4> zYUqw)fAIJX#I#0<8iH%EnF4o;H?UxnQ+FgSb$KoQ5g<_nD~Xmgi1eSw7M@%zulgl; z$P^9Ew@V+RkdVGR&WTubh{yZ+>*lD(Mb0LAtlfSZu@e^;`7rTTA67tnyy7{dKJ>lh zDC?#mF<225!KZ{yzeW}F>EQ0e?GnxL1iPBxx@^NQvB!)=>R*xA#pEWS)n{j$^VuCk z$GFo^Zv70y?HJ#;x`s$Jg8~PtIdTHTk!}1f#*gQyzaM!&a?iTZcg5HULqZhbgLcD$ z%y-V?b@%;I|HPsMIwJ8eeut?y(F(E=@5xSB7B!uo_u}u)PR%u`wl;6sW(Rf4=`dN3 zU`=Gk$YeQQFhl&gIkiw+V^%K;ITDh_w$LQ6LV*d~ZQ_YiL?|>A zR(zl|f{TYo{%pL7Y;|_l3QHWC0bIZGZWn^@GJ737`LI#xJ58n~!%awYyNCF&7D`I! z=vSPVKg{_w$$XZ79r~@1#qLqN5AI3@OC5iTjBa29($4EBRtzs%MdG*L+a;m(q~t^K zmo~Q1nM7kKO^?8>+zD2b+y)`CTq=1Ta-yO~OGJAgYI~d$9=_(Fg6aCik7 zX71TkqufTto;j3(lU-0qCur*jlOgoX`eF1ZR5=7$MrF-VeWns_~QFS>cKZPI~JF3;OiV=x&xkfhX00ZpYF9*dRyvOZW z8=TSEj8&DotenA*4=;M7_y z)ypJT20K*aP%~;H>OqR48@?P!hTJ>Nw!Rxr&`Ebcl&RmeW*WmzZDEkS`}PjD?&CE5 z#AZ`LeLfAVdOv+k0bVBUd=ybrlr`c?Q)EM*ma4p?CvD zz&Fh>w4YTDDUR$jhIP9&%#%eRD@AbaoBB7% z>Yd^#1r`T4k?C6O^RNN)3hCl~dE$lXWuk4aZ#2fFXx^!Z@RlW;T`{Rk*}%HE2I zVR`+r_{ez~6$ATdn%kt~tEJE7ALGYnH~wPDU#YDE8+97-MK!uq-+tO(4JG3-6vmufy;f|WR`}jmli}lv5n!2?seL%Hxf3EMcbj z*5u>-W=|A0-&dQhXY%*{gmhhSQp+10GP~d(g~*3WMP0Q z^bDA-s!{1~ibwQD8`t*vo3B-a3ODw z6g@5!)kEI@M&zSED&cZm(zm&4I`25X`Lu&Q+QKI6D9EDMi#>sBHKSpaM3YF2s#*+7 zE1h;(HnMj~iXnu0qzSAiP0cjS3QWQdWfuYUvp8sKS%Iqfyc&*rW%wYDWN+}{dnlxB&5v@_a|G8#_KI>uW{b6CK z&$^#E=DH~EUQr_$s4dB9h~NF08QLb>HR#qrT$h7fT3YCTNHu-JU-SCbk4qk z9&4dHGW7ur;OU$D$qB>Ch_<)<*`mwA95ZnbjS8lu-spend|es*ms#g_?+tUo6JPUs zPlWDaoC}Ibu}3e$e&UFzm z*$_#3K}1y}FE4L-`u3c%_UJ6*f~(rjSuis9=wSZr?Iez!T~)e4l+MpCRzqP43vCpm zOwz{T$pW0cUFQW&w@g1r)K}#qjEW3Q-5M*4FSyPpx~?Pce2ZDalHO8Pk26({etpCG zGd}kG5@ZN+42WYS_S2_iq#>BDSAl&;_{0RP zaZwh;LqQt1Z5x+l7RV7z)Vud)yz1FJ^7r5@`QdYfa~W_|AX}zY z?TmeXKExER9&UVh?0R>S7#zUA|MGpHyCi-iIYO6w(pcoPrGPTsntem-7~a$!-7art5$>SNSRp+Mk{8Ha}CtV=7l zxwB*R5$gaiQcN4I*OJ)$FPQ45zI%5d>r7*7*3y4>%VvW6OcNY z8ux>}Sww|`5TZgd+cnrx3y(Zc3VB(*>_Fe#jZcvc+m99s=r=yvIJ*Oly`665AR_)-YGM6VzXML+yYq#u-RaWi zz#DJhz4A;j_oL!&`&lKjBh6rjgji3R-+bViP9bDe@13idQSHRf$h?F~zX6M+3;FSv z6`kwEFE4JH9D{h3839x&YDDt}wm$l8aPQ`qPY!tNFj5KAb|Xl{7Q}%DMk%2ud%VM@ z+XE)j>IKgT+hk5yept!K$(^u-xAZ3|$Yw1{t>n*NyLrUi!>9Wm6rVInH|U9U92^|t zSz^D4$5{f>#a#>uDS<$A-*L|Fch}U21veyYjk`D1fr;y@>*|nktOU}ir7$nXs{m=@ zM6Kx{Kj)Ycy5zu}nk^am(llKGaxE_o%h1NG>*AyjVlolBpN;Z(pQX$`Y0FI#$>`W< z`qx4vAk*m56A`u%u|Lb&&36erFjCMAyuaSD2Dy4e2mBNb@s>=X32&){jkTG{`8rq2 z+lFu7JZdfy$~Wr|fjEBpBvi@ZZ#?uH=QXWIH2gQ3kt3Qvt_a%%QMPd;yS7y_gyBgd z!S?~Fxt?=1dPAawD+Hx>$KT|9egO2qUZ6J75Bpab38I*2Y)nk#uRbIs3aSR!v-Ksj zh$W*toO7rP!DiFzD0Z^9Es_noooLe}1tctf5rjyvFiy8eI}u43(!`d1*nPH-){Ws^ zpEQoI&7e~575j00eTxy-93MIE?C6s6&#zC;I|#m7t2j4Ph&Al-;25WPSYxwQT^vP- z%|iVnW_`|;CNj2kS{OMI#kKn&zS>>(6#m9|Cq$C7?@j~ZrxKJL(cqnFhkN<$){Fb{ zfV13HKJy2VLs^nVCcrxq`WHWh|JmH4&0&joJY9}X9#gH&_LuwP2&odY4zlXa^ z_2^rmYqAF12mJxs6NyhMKI4A{pvA|X5zyEsnecPY5|mJ4-}jBw$lB1nK=M!D2cmFu zpZG_2j;v!$zw3$QrbU6onDt>2qp)at5o6!2k*&32xGVuhY^2xkmixDb4d;wcKvuX( zu73Lw)%`8`1J`3+{?UVvkE<5iMqaDNl+(~p=k;%Rj?{(e?(N%V{+{&iFqmW7hjN#o z(h?QljdRfQ%bfZ2l?s}Am@?MrvlX=bufJc6g~X&3X|cJG9k1s zQ;;zgWD>j3S}1Wtdch-N}}&u^rPJ5%^s*k-DL^El|7NIsbtb4T$?oNZ-5lrT{GvvIp~{%Ac4u3qQSfgXn2nPAU# zJe~-(-!5$j$YiQ3HV*uBO&j;~q$1Zj<>$|z2XaOZFMWFHX0dkUrdc-sgk7@AtpGAg zjsryS5a}ex{GPaDBruMXZQs-0OKCmBy=wWykY;40u za~p~(s6T1?YvDQ3*MpCP%sY8#>H5#`i~rKIYM|h1MVG+m;&Gu^Q%K=MvV`(m`+&?d zPSSmhGSlu7Ef%AFchGZRd-5zo>5bT1n2xH7O58BVMTA+LSRKr^9yOG3XTUOe0oUc3 z&kq@BYyVgPrt$MTgT(jq&s%KJ!IyZep2FMqQ2LNnNyo-61q%mMXSu^{gEz-an=Es6nVt)x!r1#r@}fN=@Ip_JyC8K7fu>A0D?vPCK`8VmyN`Cf;*3 z_?Ya3P`<`h49kK2l1=QnR%207(OOQ49*i%OH&JBT}7Av`Fvk(qd6ZGWrJi5yU zMtzS!OJc$H)*s;FHfp;_tjO?e5wME!c*cQ)YxjTG9f0x-;fGvCHOatja8FtG{={ zI&A^dKOLGiIxmDFUW3=sv1j5yU(Cb_5p!5~izS38afcl29+9CQq#h+py+AZs7S}F` zsA!{loGJUVmQiwseTmI)yX+J0UNKTOtRS-m(_dcSr>%h9VYWnfp#r5>cqUcMeWuQs zzKpIfh(RzDNxssUY=v63VOFWY))Xv{)FOeD9Ny`SpnyQmJI%(Ai%K-cP|w}KzU&x< zrQkM|ly^xxVI}tt+~MQra^phh#81yk>4?&{mFEJguX5wzP^gmGA7qw_zm2c;nUH0p zqn>zzcKcIr1niBgpU)#Ra_85X%#*w+9>p#`**M#F7}LChf(woVl$aL-URZONN`E)H z8P-%GB|E;HeCLyWs_wf1@#wg@N$D(a_O*nK$8j#GWyWntDzc{z{<1T=cXvvo=vkTm za=&^=$pUU%>cbFPel6MC_2U1(9t$86 z>PT*)A>gg#F8cA|YJ%%M%?=A#yO0L}7$^BX>v}{}M%At95ceVXqQhV z2}n}FKzX|Avw_`0TTVb1C-HDSr3&KN15rOGC-uURlb*2{c}!RCTJZla)FdjHSV8_= z@-e2$)wn3h{;1>UF8qy0Nm6@lZ;o=mdm=Bp>4OR&f&A^`hpnt_ zMU$Q$IgJ<2Nm%@!jBTSLh>$HK3@Z(<7I^<+4iE@3yWl`61LMax_$JO>S!w& z=b+8mmsEev`!}6w>5Hf>?G6r8BIh+Y`R0sv@mVt$51&FV__r}kt2MYjd=Ku2Z@bV& z+TIt^h1D{@*+@HZq6RkEB8uQ2$P;fwn0BIZU3&Yay->Gb1+f*=*zop_Lsn3YA75P8 zsTkYnq#mwbB5`Gny=`iFYD-DKPX8%i$V+=6qWmysOo4w(4JAP|F)`6LF>#6sw^$G4 z!1n!39r#Dvj{t$*Tt>A7`*EaQ8HJ!aU z!^K7TKBF;&_TCWs9_~!!GQ$y;tpfkwc#FA?3}&wo4PcUnCGs;Gx+?0Hxj31z#omRy z4gt}oD$2VPsrFq%ivNl~!UGHx|2d38GFF@e8>+++>sD~}y#}xV7lSRM5gS9Nhfr!j&XEPi# zr#e=nn`(aLk$uQ??M@|J@0op#&7Trik5F2H)M{C@UbmANZXp3MPWaPm7xBbyma!p3fh#Cl~x?=lRH@ z{%q=TlJb)B!jV{t{_dBmhzdV!D?EBQ1ROrS5|2P*s*-2 zET6s7)bhst7wjABsVQT1QcQ`CBmB+*;Cw}hjGmEE?$XbVjlo~uQLFNES2K-1Ij2FCJZAOT5X7WWn4j_nrqTJgVk$rCnZ@9`d~$resY-`ooxPVU4w zkQfu!@gKOM)Y39@V4%kSt@`iLqbLh#4?dTYnOez^wxH^tv3m z9%EW^E0G~H6tQ04#L9k=Mr&#^V%;K$!11oqcR2@xjn4V(7j|wbJpz8TJ)-#oCuZVT zAZ5-G)1}W=hE`{1XQ!m5(l0G7g&hZNwpf5416htZoSI+0e6#DH)Z!;Zz2t0hS1YD% z=RNGPS3nz_Qlu@T9^xLjxx>m>hIi^x5OmXQ|zj!ZT&L)7Qm-%ozgLU;xi@6*(vFVQSxr5*enQTp(^tf)r4J0 zG1>X4;1`F`!Y(ir6%-;_p&=y@_-9p2`=y!+t8#8_C8$#de}lGUTLpC>_EzK(^t-!* zPmg{q`dae;&duHxWDyaOvd+#Q(5jE#zj&^%UmY&e0+_W6GyX$kVOEyyQS91oNleIo z)z>oNqf2|+hi+ayL-Z9+!7Baz%{;4Z+xBZ_gw|h;iv@MQ+Qagy{LgZy(4!OqaK41x zZ>n~F`G+QoNT%_aJ{+SC{%o=YQmqR)72d+7VfHE|M*Bu0;HdhO{KN7+GKD=O^N=uu z1|~-1e^;ASNT;UO+Mmzayv+dL4)uxo1@&%LMGdGK9cUOElZgpqpADuN;%)wCJnY{+K<%StiZD*%Z1pl zN422iwbs&0A7Wm{0O(iz&&E*{_bY$HLk>yw#`r^v`sKt zAHpQ^z4P$!C46l=W&hOD_#pKI?I==CjI`;ue zV~i=>xR$N*?tWve0KWQW?~s#l_JN;nGw}Xe`ruWIzOHCq4YvP=UCfhv5Q8}myx;~8 z&c{Fsx9XW`oC0wXgzfB6LWWo(CIiAE`EypP?7Uo#K|@dbXVN)ugfKRRmo68fH16mf zf0|DGtsOah`QRh8xHKu#k7t4P z4>=wYRaGN>6D(1z`dCbU_dZ^5g$1Y)_=|51@_KwuN;;4GF%{IXmq&bU@JVx|I={1m zUdbxVuXN}Dk&D=E=};A7V_q_;72{Wa@ooKrl3nrNsgkTj^D~(7BY(1=ynFMy8g<7;QcZ}eoKUcwjH6YVnEHu~GtAmsz4&bg;(+Pl!iW)X7 z^Gzj?g~s$5qX79>ArO$Sx4LhBr(Rw8^z>W5WPq_E)0Ab{bBDdcwR6KJ(q7K_=&|QX zq+Mx~dmQAa{x`USvS}kODTlOj{SMETabr9F-zM*mfE=n2vd9~rM|r~GTj#bD(G`B$0P>?3wvr3=s0W~El>P#;!oZA#47ncRMW=&lSUjE>vZDUu} zg2%WwvOdAhk(czI?AqkwI`m#Pz9tN?4rJI;8aQ-H@)~^}{vI@piyn1ais>XfP_vdM zJ>~}jKzG{XF}g?yG5^^N{$_D{>gMqvS%;gS_a|ecGSle!##Fh)0U?22(f{f*@K6PZ zP!~|d-H!L%#){n>wjdtq_*9k{vYi%yPk>qC1f3u(JtM>Blg>E#m>(9UUqLqVp*lon zf5k)Zw32eCyt6{yea>=y0~5n){Sy{?HUb*+#E9o?=U?-X;ZXf9>@_b~b-avy*(66p zEHYgtr1NQE&|kZ2cqEcE?F{w9)o?S29tVbRFv1Ez^m{J`20J{U6N3X^Rueh=JiwN3 z1f`!n7K%8M{2{j8=80Uw=<|NjG^3@6*1f! zhJv{XQlrX#1V7yIxc!u)uZtw+o&xhJMQ}fOS-VL@q|MH!Z!i6 znn=D}yaM}~UvbHXU_!05=7)Htq3~AMCtu>v7g?KuuzQ!FGji#7GfkGm zWnEn+I8yYA*DAZv-XVttf96bu-NBkyrOFG0>zH%JrN0V! zE&X7vX(fBDG*$mm5yA_k2gW zUs)D?syC+keNx%d+u#RLSsJLLUm-Zr%Sbt^Ncf0HBuh3wcx3TmA4 z*S+xkXlYuoC<7uCtvqd*#S1X&V22+!;YpD0hGfNapjt>Kcj?qp zQBhI5dH~W<+fH3zIfRT-+c=WQhtPAo^>_5D=6cgm7WrJem61S9>5pKsW%Dd!>J5vS)t_ z{q|XXfjGqqoCnQ-(zgWct$@BXw+D`40Chn#P&TE?5+Smmnu2%&vZwP(Iclbu=y4ek ztV1xtuv9JGoleWM8r3*~%JgZQTeYC1L4KS6$a%mRYDRCz++A7}{zoyCqJf%)_Ec4k zES41llArqfhg_F#R&qh-G>@Ih>=D-RTe!e16D~;%E2(OH0oQG+*x1<6M1GP`?uBXc zJ_Vhl)%Q2l> zJLLx;BsT-LJK%uDbpi%%ML!z`Vy|l;Fj(6Jk;2K!sZ5W|Tf4hgHrtvLcIeUN*b$%= z*5{l>2M2dLx%2xz zXax{^@s_ZCMF8n^pvO$05@&1Zx&P4gg0%wGU10H5?zWP6G2Q&a0e&fcjeAk( z{15s7_P%=G#&m_`JnWML}X!@w>CF_jjn~Zhb?}v8pY2B>~GL6&y=CMid=74pKMxg;!7=R zn)-!(W>v}L!2We9M1SGX=bZ{|KnlNP{v?cC!uCIqRcaGIq~IuZZ(aZ-j>X{wu*_3IFQ2Va|)pJsu0XdGNv)!iUvC{l0dGEMzP%Mhe$LO`tL zEMX(Y^6c?v2AB|{Q~vVTDtRb-`?QC&;Z)8=iOiEnli#Xw8(ZFYqMNiL>4tie9X+u<1s|+ahfs4HNb?GuY|1=>EdYhF|^0t z(J{^UY+Fn19A$V1Pr8?<4q#aP!rIJMjALOxu?S=~EfQvnCb`A1X{=;1b?XO^C@rh@*FQ=&E|O}BXZ{Qm;7Dfjcmc}EOO?j z>5jfBt0hYKKEKM8ntfAEEJ6Af&<<=qf?E;T>ENn?OjQee-eua*%1*6JLkE=tPB(U$ z%P(uJzBjp7J2+>$8IpS1NY^l6=olh+O<9JCvKPR5HqH+v&kYO2~p=-9!viW9e0-5a28!;9o^c&Bjzy)54ThR8k@^ zNyhSoJvKo=VNy&C#^~ha#d5@yGEE(NRRY_2{jX*n4;v>5Z8mJqd>(PhL7#HJ>_v%P zkJw|81~k*^CN1)nr$@6z!G}Kom^3t@EHtk2`cns9Cjm!G_QEyEN~~-}D^FN;FnIBw z?|vOROQb7f5lSz!VAGLY@+lGG`}aUekU`zTL_`dY;-72)5{xE96t~ya7kHP=_7*5n zls;~&nmpl_b2 ziy@HkSvDeV!D>M;Bbz3!dDXAZR<>QvT-8TxV?l+n66H4SPq1>d51_z_h;Ej$oZy&S z$$uXL0{*cm!lwCC4c9RrP7boljwO<(lYE0*cR_UCyCjIu_ACE<5+X)D!_@MYf#WoN zwBSXB@<6SGiiA>4WO@~UP+k%De173jMIxq|IW>}zJ~QkvS@-^!(~ocnC;ok(vZpA2 z=jtfzZP7#Q8aljB0e@&t(S>GLa?|n|vIPhC1`}p16r9cNDQ_l4#k6z?TG!IJ+Wwo4 zhT|f{RIl^uQ?R0A$^y{db90MhD5EmK2y+_mB`o{kk6U#XUD*}68)kX zJ_+~hk5FAOC&7_C@Fj*H$zhPs44L%Lcsi;2{(5BPs259-{P7qnSxbvqu6hBRZ}a^! zdJ_I`8~OnlR#p;?0s;LhzxU*;p|9_audvZKn!Qms_u<=s=iK~8#*>T30yS>>u*iby zE79kWoe))U~ zSjVUTa6?lt`-of!aC^t_gdvokv9;Oz;1O%JZAu(rBA&L(*DpcgflU#SkWOsax56p~ z-v1TLe{bt5RZ7pYwoX!$?nXmT*+H?rjPV1b=+efNPUB-qe5nH6#K?2Y0t4uLqS+D= zd>xRJA%n9t{oB<_G+&TE`1_R=m&<;eOX8Y58OxC;uv!WKBUPAjhbsd?_2?9R*14aq zGWA+o>V)&ZFAGhm7M{|K@m2fhG4A0>PLN$> z@0p~y=T_yGsL_$LA#9}%^{kw>3~cj*BVlhI4I#Pbbw6R3T!^kY(*f?qP0)=a*i>gCbE)F(L!8!EM?(8n5i`Q4012>HMF5>11+{2^s! zah^5bM0^M}yy)A8VvyH$!vp{OnkfJpo0Nk?Z63(B2SY%5&>6#T5v*KX#F^v#wl63t zDcu1kChWc$EtIdp%EFQa*z7UGyq$;&;`RZ?ojzI@hfBO`z5pn)0$^84&e$JWBpI?k z@(D_l<{igYfE%!Ky{t2?a?bc!SBCee*W|S_Wct=QpLsFD#|mJm@J9{?`(+>)#}`FQ z0aAP?PWFwcRP_gxx<}fhOk+$Vg~4R+VhB5EfY7>1#=B!AG`&bz`_T$@Gwa$Lcrk!` z+<1A70)^A&>iw_P%|VhEX@`f7zNe$iTflL;*~-caYXp(*5P(5jlJ^^un@cYX(>FJ* zeBt1L(dyrf&8;nLpS&Y-AjfY8g9v!<%OD|P+G*Nw^nF|S)6x;>LkV>n=y^{`L_U1j z+T8NHUbD?MyWb|N9RI1DO@9=vh#ViHLrD#*PAl>jJu5@S7JVuQ{{ka0f?8MPvm^{Z z1;O|wufZ{`CQ@KjRrLuuvS^I={gzn9%39zWx4AKwTh+;DZ}Ct!j`yzOgx&v2Whnz> z>I=9Y`2xr$zDNZBXbOxSo`W<~$ED^$Xrq&pQz=D+-%7`FGcfi_yX z2AC}(00o+zz6U$R**cgKPet(Nv&NaRblGp;3vujYKb zox!`p(gt+@t9`wT=$@}$y5{0hChpGKq0({ z_s2temIj=LgjTBPAfweClrr||b*sV3T+alQ&7YP05D9ea4ynMm3k%6*$Yfk?Ke?b)-L)Zen3Tg8iq0;QaLhi;&@Izn+h@72lgI7Ge$naGhekex0=?457b>4xo8th~i0ExJ-&b~XuW zvtc^0-;0N`y?eV8Zz6m{1rh)MGy!)4Ma8JYl`bPwpLG-+j(tFZN&o!07!$AW_4)Do z!0Ew@2SW@@%q`x+>o_ZG>v-QP;M~Zh-V4HdV=2L2sr8`pjwUPe)4&#KL-*-q6upP{^49Ny2Z9f-ZVzy(Y_we>!0uK(OE7nW)ZJL-e*VC2P(%Py-5kN| zvzNFZLZhXpA0R|B04S-j1Q*xuoDI~!NW(vWRPD#$>I7r!>A{m1TKcZ!2hb=Y&_JsE z);$h)11;_X9Ep>5Lu%{A3qkAu$X4=O=owelj}HNUZ9nSdQJYi5>tNJEho!%l!Y^wt zL)kM{`b#56kp9;XMyf-6HP(|c{0U_CWpTx=oCTurb!de;fu!~n3@}EJaK&f<&Rr;! zKgs>38YfB?OqjXg(v#0w+yl@@?~^+WwCNfSI-X3b=L%#GgK5EdNM^X$XyB32I_ z&+HZ?iEEN_s8<>DC%o|Uj0O>=!+(+Mzx|_BIms&b^vBJWD6-@;NqTXz^4TRd>Bk1t z_yI2fSzY`I@rzsW%DxXc1v`d_SCpZersX}aH16`v|BtD!j*9C2zNS>VOS-$eySr0b zRJugEQ$V`AVTNvL=@O)oknV0A^1Y~^@9+Hw7i+mLGtWKG$-VbM@`KT%>+96^zIiEe z8q5qW2%nQ-%H_-OAorRy8c^9$^*s$D9lSnTq}B<+shYFVnd7xzq9f$7js3%P;swyd z>oc4^lB+-nUoxby1Tn`I}&xZoW_9Bua#g-$) z7w1&J4vOar{Lt?j@Z1q-!Mfm)ytRj@&GY~24}c^G{qytbx>V{TFx2}J8{v4HM_}6l zC>jisKAye;l8|Iz@U-+3BuUIWeOK*9tD0?l8w?vTQw=5RI*c7Kij;>Fc?HOKrkIMa z%()lkoXh=RWA$w*Mwsu!bYBTM!y)xyntpw zc@KYPPiO<$dEqYF4HO|pVzVM*m6n^`l zlFfcX2QHIi_>%5xpvBt@pFc=y`8xAAw7>ctprav~%%o2NEKOxo5I#3;KkFx?5!wf~ z+pw?iKisT{GWFnDi$*O1Ne`jwWJi+G8KtJ0nxiXn$J`euAK+|wWGYS$+)>%_UUC|m z!UOqPyzZyW1j+X{y=5U$_8A$B0N4g6W<2z~H2Za9wV>*&0jgfU&aKY2Vpc?+Ovd-!ej?!ImJZZEE4`)5!~ zNst>LE>oQHg#236J^Z%fDE2M%F#}+cnVee6k82ckY5S9zTzZu0C&NnttvhN_&oWn5X4{ zfQSJU{_SqSjX!Z}dM-V_meSVx?YB&rGgREvRkN5A4Da`s4=jki{PXWk5yVEmoj~C( z<|@Oj^O9BTep|ky^!F?K?H1uz6_BdwZ9MK)-8MyEe9b#j;EwXN`b@Y8{!w4g1vz{# z%Gk8x+X{)LqNUB~G;5RiAPq0ls}p=yz--*62Q-8~x=vOM$(CYI!mdVc0=uB!HK5o} zB6~+l23iu=t>$dwPCj>QE0mOKRs0&FY7Wy6CE(tST^@=3 zqjX9fk{H`-D*tBriBn(R$bfm5Kt6`&3_4s4=5#i|2>v9p%6p6PT-WbPckT@}MWSg6 zkncVgc;B?HB*pj~TAW`_sb)xfxCfIJO+S-L>l}~0$fCPyp7q<6da)&Lp4LboyQHWf z$Gq`7U-bhMplr=HKZI;R_i8O2R->qV%j3Nq60;IxU1Kl7dQN}+>!1Af9R6DwrHDw!N}ub`f@++&NaRmc=j%P1NY_Ns zL3R<iHK%k9(LL-IR*vxgKFEZ)8{*-j?foxl!J6cB(JvM$WF$?|vx2{j zX2V_PB$K&`OggRc|4T4FqOY>nk?y=+(>xUkdC#D;>O&Z13}3)zuFeHDBadOc#rXC1 z7_9)8@kXypwv&%!xx8m6ZGRE%4G2Rcgs7Cwc#TFhF(AsNU^qSLkhGr_*(nNVK-2V! zTIhDino+S8SNOxhA#ThRISY4hZNi4-Xkhn*+c0I21er{QWlZw)RX@M>DaqoOcWN)c zCp;%C073vc0O-+=0Jy2elPgno(&bV>jpT_|RRmI)yPAN55CS_}X|#Caq^zub4rmO# z>3BGD7y;JOF{}VOngBOcCrCNs&HHLJ^2YAjhF~4|YIJ3@vRlNWQ)g)sNo?MbUy+v@ zgJ1SrV`fB2y%5BtD(r0&D5+g#at+lo$Ka_m{P;{?6;t=8L24mt{6f$6NCqv6nVY&V zn~E+_vu>}Ab$LV(N`tH&o}mYEu(L{H9P~b!sz#H@H7)O^113R;2I9HWrH=r<;T5)t zPfPPHc0L^<3fVoy6GGj4WI7=yQYqVBpZAO|@!$URE+d6$ ze|mSdQZQzf+ktn>&unte32ifh7L%%Y-{AygNU=fFSyv8|>6-UPC!rz}qK596VrD6S z@Yrn;^;6R%(!@}O@!g#d0Fn$IQM#)!*c7n_2W1TQxdf@9C$E2=xzTK{V4C$LNSVt1 znkbU)Ryf!i{e?#*USOg&{=v-2!JztEc3OK(sQ(nZN{ALOlFFBtBryQSf-HdT&waxR zCmaNp@g!Jamz}&H%Vd8^DI{R_p<5G*AG~T6F>{|hn`~_MW9OcZ4oVV7{+8Ug+fllR zbF<-jZ3!(PFmXQbby}i#6&4qXl3n_nkYW!I+%!FJp>R8R*3e9dhRQC{34)Gtp@92- zo*wcQiSqR#K+LfdA|@NYC3#Qm2dK#agohGf9`lm@YA}vchAqGim=WWZ8$DeAT$o@+ zNeATgAP)`4Dp#o=w8>ki=zm%);Y-fm3J!cQF0($2P1v#7Tq>gZyk{MU@Hs0Uoc9>@ z`Xq;@cY3T5chA;=Tkzw4TWEgXt`^bxPaeUdXz3Ce?ic94)WYE+S-*n%DKLRk|7Nc5 z}Med`1XX7-INKHLM z83O}LPDT2JC~FZLna@u}0m1qH{qGK=qM!;JK6K_MM#% zccVVKt{)}(;}feF z#}ay-o)PuDFCH#2TqMG|(X~&*Gh9X@>CIW#B3R%q<`x#LeUaF5eEhKT;idIV7&=VM zQpgxy#{9n7J9%jc{L7+ALQ2|CFEy-*fd{*bzzWQ8urzTQ9(y*lkw7I% zDegyEm6|Uz@$q5Jxk69x<|}c0J~wLYT=Kt0!Y#a-($z+$WWD#ZY{`dappj8Wffj^I zLD8m7j-Q)vB_Yv0V-D3(@?&%~=~-Gh8BiJ?4zElOhYW~5sskWcewXjSe8|m6L}x|h zlqj@L8*b!AxRC4{|7yi;5b3=bTfZUKCaFwy5|S$*WD+>q)D;Oe_tFVJyYAH5XEorJ zl8H}y?6_!u3D3Znmv@{z{e5=-fI8rV$S!xO8UM+io4YkWcPeWN>0?nc67s9P@SjkBQF zg*o+r;2t1(SE=_l08bE(aC0+g4%6^AhCkG+7%nLyQ}T+^(p~U3OkZ8BUzDMA(JMBa z3Ih%zxCRfu$jZ&clLK2jhm03V+ayT64%zFB?#5RA%qEB%i5njYYzKb;>Miejhzu^m zWy8y#0K%s2p^a@&vr3lUt<~YTi=SaI@w@oK4 ztYOshRYh?*`=VF<838Dki*TB<5EJag=`p3u`?>~e==$bl#X(96zZ8%&D{JN#C(#K0 z+C753{?-qrO7b*Q)UV@gS8A8I&4|}wnF*M}5^E?ORjD3u{{|SiUicWnVuN zfV;v&@guOI&?Q#wA~$X$K$2Hj6(??=t_DNEGLTiNkT;c9$>(Ho49 zh%spZBK=O+5E^2k4u!a;bGjK=Ein5MP5<)!mUNKYgc?ddJ&?QUd^mQDCIqj1aPO21 z0d~Qo)b5>H@_(vP(U_*3Io}NrJ%|am3C0T?DDntzz=vx?|Jg6&zd~%WF;MWgbfyS` z$_I~W^9(O~DHayjC{J=ZTlqS9zJ2os&NxKUWy@;@H<%L+cmCfPJwFBL|3iHj4(3pV z3qg+vW%F|fQ;^QrT8=1XPd*~@T@j;7y>j=L=#>gza*WUoGE#4-(O$Q%1U6xZ}Yjpt5&6a!#|dH)v}v)N!I3QgmkG!txh|{rnbbwA|+nuyQs42&ka zo!ilZB~S3-3a~>*My=sIJO6h7SydTPY7H15q))@a@5vf#V`p{OoW5<}N?y*_M%He6 zw|*;&KX^B$JyI-Lq@lA&k>H%LRh-7p!OR;%0-D>Xy<$v0Lk9R!e{;;|pZJUc*Om5I z&Gip@%?NlVeDspI*zegsdY7BRItm3sensoae|A$0^hCLMq=kx|r+z-YU~*s}=$pwE z9*a)$EQqtQ_F2t6JPw@^5XxrEx!ENA1FvU^)kNZ(uDKp}$wx23jm9 zNx(KMDWI;S>Y!i>MXj3X@X%sM4L)}OgzbP6bmOKXz3V2#%`QR{`JG#?U)O(mB8aPH zx!h=%Ay4bSU$%=xQp?90VPnR0TCS|3a!uJhxDRe_*KEwDOSwUPlN<`@h{UHbHT@V# zp(p6r(y)kP_J&Vg(sM#hVCD9f8IAkjK=Nl2)On#X*q&$Y;dx3;EvkR4CK$K&aGl8> z)-#*{ej%4eJCmL8&yT`C$2ZE4o17tX2vsWK1w}$O)tI`XxH; znz-kBF9Mb?8acMaVIsXI9QnsO$(^0>_9xeqH){ zF2nD$T|eZCD2{Dhv5RG>q7sc^U!eudhyU=fGtQ7wMR()_r1G3N? zX~W(iU3HV2LUCb@CL(6em(FF+^KN=gfPui+Ot7x{qyNBh{_cgVw44?>H+9$Osjt@$ zY*_$S{%1C5CYfuDx4=tGpM;d89G|@zC%A(r*MduHSw{*TUV`4N?w{zPal|W1gz@K< z#{;8w(aA72gg8v{M@F4;HVWD{jkPrdhp7$6#LF z8FOl&tf3{T*8xo$}EuSU0;b1m!rXFp!2=5t|8Dkc5<&&L}43$bSL(a5bEpa@rLQA)V?ro z_p8=2CuVoPSR#V_%oMt^{;2LxA|kVRhyXov@QGt{jEA#3;Q13hI~sSa-N|Vayn3>| zMhnY8iXtSM_rqT}`=>T0LZ_^^Yre=eRei@V@APsjebqEN6JrDnE5!8+l7C{@|B$c5;YaZVV zsgk#hvdATY_~rY1{6mT*gar#kMZ51b&4i{rNra_H00F2!21MnUBnGhd90Y-3lLDa< zVxAW+oQ;rqL5d_zZ$|9q`(cs2I$YJ{yVxG=HiQ0pT;eR5gWS;Pp0 z&Eo#ZxdO#`TQfzdW%ADqg~e8R(6|Ojhg|UvrjS~Lr#5h{gGN4kis)MpThdG zQ_wCmIN=W!5hyNq_0>J{yD9)@1m5pAVC1LB&PUpz2=jnBs1TjdXTV3MjZ*pg1wCd- z-kL2SfPiDzP7>CufrU0KrJ;s`_%1v6@5xKS#Ug?MfxS%PI7N8koU|N*{E5?gNessi z*;>KZv>tlFZge_-M`3be!R8F2FR0j%VSW*0&rD8G!=Hq)AL^{xMTg$}m=prRqm;05 zA&2uUzj*mEA2&zS=x_8EgTau4lCXC1D#>Ih<6V15=%)n@SY+0` zraX1-d5rhIC=7k*JB4{ZJ%6}B34aki@viR)!JN?Wpd^$EfME-2tJw)8YJJ0cl=Ta< zfPz5?g|0C4;xJ;DE1d{b`V-MC^S{O>@PK}a+&hJsL@R|-%jnU>z|;l5J(U(Ih|aIdE=Wsf9}be9hIK{x2Y~LFFz9CB+?xO=pyZEGgK#Kvikt{YQF)W5{cGwunoaV z#v2I&#qZCKwTp7%mNt#T?x<|~ciR5ko(W*b6f0CzQD|Ed;ZT9 zMJ+@7WUA4oiOC&;_upU-kS_M)myw9PTZjgXQH_|-#G*ebgW#ko)@xHnSaX8x#L9hk zBC;VpYMENG_}$Ptz-HO|aIOAQ0RZbR z@zARFoV3Fpi!Sl1d0g#o3Cz2%#%D6y#7;{!Epai*;wlewX^Vs{qTK)_ui!+2K@tk@2 zKOm?nH9QeH1wWwEmD$A2UB5}>bu&qvOn*nOzR^&27vb$K-hpiyZLD^*dz{>}|GC9? zg__@Fna<-iLap_u%J1|_+{>T`n@_^-2U)r9#9>-(8w|{RfAX^i_s4E4|SlA5O zz^T2E3Q_tlpWH0H_lb~Z;DQ|5y{I2FP^}oE#Zr1v;zJ6a)B*3% z0Lhc0Ljv4aWW-oZA~45TO0nr@t`mPX>mS2CdQ>Zqq-;04RHkgeWqRC;-27fWZ?lLR z9$Zr^jSBs}gtu~zF{$q*#d~89>i=#k15CB*%7Sjbx^e{vKdZF;%%vKAdSt?=F`Vh- zK&yFQ8HJl6(~+0gD5~sV4MbUgbL-!u`dZOnYx9(ir|wIuj@rn!&^6*Rt^H@0%@DwY zc?M)JhJyUQ$N7^iN3dJ#F{fqQwHXYQxa-ZkKy|F$auA`fPh&x^J*b4Fa7&0 zfC|i21#vO@ehpGXG5$Vc1Lege*6!7ZjMw|b@U~)23;y&7_D<0U+xI_heffx<%?w@^ zCa6ql&0U(vr5B^r-kO&LRCUNli_^f&5gzS%wczz)hT!7Hj+2v0czfS)PFP;e$!;d< ztX2)_MIlwo$C(9?%&cqcSqK}gX`2Rj%oMeCmihVO^c zfc7db-o^k7x7a}U%U*KtDVmm#^vl{7I1j<^0w|Tdq$gOX$)i zO33oNHtwy*D*W@+_J@;E{kD0w;$bYnMPa=i%%v~P8?%=u6T@jLOHrX2xJWN=4V!=Z z!Ay;Lhf{DYZkUMSawD%#B zkM_Rz)V9i==DmKyg`v5@iMiQ9jipt-k?&o)?VNj&E(F@=&P-qBFnfeO8kqb0!Q@N} zfn$nJ#J@q~gI1LDF^W`vP#4y~SP)Gv_5^2^?_&P|c{&Yv%?M6VZ)mO;HMEbEYsB>W zlZ^1W+kSvI^>qr`C^98UM_ASW_rP!OfF#E2Z51xl!&bjVt@EvWnjpE)Psp_4f}mv% ziPx!ZgF82P4=BGhgrWjVcqGx!dc=oWQaEMe*R$50E|PiIX*2QuRF&d1-%OIpV0ZRH zY1B$cKb-uaYztYP%hs8FGhyjKLfaHFSLs8Zx&^X3iF4sxhu+T z;&dBx@PZ$HOqmxtjRiQw2xy0gRHWzjDb&Ra*S<5$Tfh%Os-935;?i|M0MYOBM+yB8 zAq4=ZVGWTUMX>HD1IXd0#pE8?WcT$X?_LQcVQBr(%4ni5MU|rGFb*TPi%?;26Xl>u z)cxz^0T?6MI9Od_QB`N~$ySI3P&SU@WoVH^JaJa0zv@4Z+-`tKzg~B`@{0_fb4X1k z2Yt53+3S~=(OANl>6L^Phf6z5*1{qZiQ<7cHYsM1L{YFvQPgfYE#KHgumATFM} zJ>lej-Z_^D`)`q;>56D{S-#acxrUz$GzqlYQ_wI5w6 zZb_LtL%Kz$tipaqQDwfwIY%2zM%=ZuADrZqLAfUqt+kYfd1j=ChNLJlfZ7G3j}#XW z&M<`AuRFgw!-EJGp7zI(G(hA!UAE|2z-A>4v|z?!I&G(9UGvq+LEKq5^iL^;BnZZU zcfJyGKKnJzh$cWL<*8|_o`@BcPzfEZbs+TX7elEI_mJQ#b<_Qb@59Q8#Q?s? zwMA!)XL=|Qpm|p`YZ#%XxWbd#NkFYV(D5Xtk7opS(e$jd{r$=miGXdxXZ>{iS`HBS zJOEeF-f<8(q#Xh-?XuTVXUM#}ZiaBEztCs9~0~OOR_=- zU-wX6-58D`E6O#GvX#3OcD|m0WVa#D0q%)h)jEA! zzG$wxeftl)7vK#&gB&&9&u-6Y7bj_&Oi4XCfKv^MNkFHlDB5)q8swz2`yMY~(6k#* zDWPJ5;o2wUr}ELu%L#oi1~C4seLLanCFF#S$vYSC^JKx>g2eJcuWaNk6WZqH$$2;V z-_8arrJX1zB}&D7B?c0nZVvoA3I=-a<%&QC2fLuIjGgDS78(ntR?(ojzk8BbsQiJ>zUX1-P2CQq7wO!MdSpbeOfw!f0A zh+XOMQ&2&stoI{RK-W^VS$wM-v%RWxoZL5WFF(%a4CEi-GczB5`h6xy>a{hxPA7~G z{o{4g#FVH^h^j_?;m{Xi%rzbM-{FzZxD770}A@|$u2^N?d%pc`y43@{KGot4PACVehVsv@#(8JZq zabA>YU>Pw{+2mNQ$vs;J83X({CpSa!JPF=sbIm*M@+TB#KJ9l{G1DDyO@m2AbS;cK zTzmtRzN_rFB0V)CK)X{=eI>RQYvoq8W{M1(e{0N#{4WuOe-VI+vbEv_*6?j!`2GRk{+yad zMZE%;VUzivb}>bT!~jVN(Q((0pRVP?BES-O0|DqE_pV_Cqv-0I>qhw+K^ftSs3p5+s}_Y>tJ5Xe4$?Xno2g!%i8V ztbRnU%2+P_l$mQ5Wt9nD`73n-oT+I!oSN9jlV)qkV_8^XVLrX7v~nx=fS&2HM;A4S|kZk>Ko7+qgR_jn7l|LB#TJbBq6y z@)}G&#}1i}i*6D6DYbhsUTlU6HSw#EiuW%d0&95+UR2}LRR9KBe#TrA(AGu#Pow}~ z7m534gYt4owsx4l%O#2$va6F7*{X>*biE8@KwcYy44r?Qq(B7m+5uUi& z{vzOJ7LrZ*2ewg7G1dOD{}LEs>2~r@nw=alPok4D0s6u90DER7E7>C;qxz?Dqb`@rD{HMi9-@WRKwbLy z_`q3vElPMGmS=n49C(7NoSyL-XOY!L&dlJ^zRb9fkD0?WuZUDLx)Mu zji}DL5+BQpxX;k!lHIqyiq1+;Q0ieK1NP{uoasA)2D9?BUx7ZeY*P^OOOX5*{4wNn z0gc5^+2F*S4p%7!h71YcFUh&L=hqj3^{^MTZ{>*EX&yva^?4#3A6Qn!u$5M#@ z_KBl1fo~tjxq;zJ10{~buQkDQI7I{=4PaFWInAYq&^zBP3E^mH;)@*b@Dtm)u_bT( zLS<%H)hL+fU$A#4`WNwI#ey+D9PK6_(K2r85=M_e&Se&{If8Qy^cN|rPTERe=txIu z6h#j788Z3#+*c2h>`b2e;s8+$s3;>D@19FDpjA%@{Wux(g*4_GD*(YD5t00fEtTiE zmC9B5$af!dYrj;fhjOGEXSlsNT)*^Iyj0Zi1Hx{7hKJnbe)*}KtCiD#0#(lsg9=EF zW|{xgCh>R!q#(uh#?p$3>cPedVd0STwl z-B(^O*Pd((XvZ^dcJQ@@Fa*tf8ad_|^VA zC7|?~31(d^;LU1eBjKVx=2Hg+4oI(@+ zU;qWPr%^(PTuAue3H;22iqMo$3;FWt4TD7N4G-r`<} zTv(#kvykG1>G;L}Ou+ux1ngw^NF}dM7 zoe~KmyZbv)2<0dznTG$E$4On5cq1z6(a{~J7gU`Uzd9LFt^#>F{Pil8NxE6&RA)#& z5CMlzF8*VmT&SeXcYnlE`0#isbhWrUJaKH~T)bF1eX-cwO{&0nt+se^svmQ|6Uz+c0A! zJ<<>L`->_+WT^oJ=!uexQEtPUac`G?$>RQ@S3&OcRr)ng2oj2-}?DT1?+H=dmCwHBY-ezvpf4^tG zC#^`%-P>uOXCtga7X0~Ue#Gah=fAHUATC4J-Scu@Fs> z2F?-dMZo(UpGJ3pgA^HrDp0Bi$P-6!&%LSR+fKEJc;@v>E(cl=9klVbt)b9=S$TTA zk<8W={&tn+(v3ii4QK*5)$|kCU;_#g_BD^U2Y7(2h3Z+P$$h@(?{HDC@GZg=U#FS@ zLtU0+rkfs8n-PiqyE&s`J(}R@j&GuOwm%qg)7{4Eb9|YM_mBz!iJ0e?8}N;e0zD2? z0L7BG3j9U4v!50*MQH#uDWl3Ac=ns`{O{jmoW}UwTbz}dJTPPl0y-9Wtez8*lQxyj z+XNwRP_s6HRiIgNU%fE&*-qLnP<ulvV_}C-+0j%xt+r(T@)HFFl;J&{?F(V2%z5_0lKgZVc7VU5c=Nhu_6`X zKnlZcKs3&y!Rj~B);DVt7Q28q@L)pmdz}L5I}X~(K5c27&Og&Er9>aOzk_4vptrtg zU3svlh-gg=+_i5#(qZcOy>12T3pY7g0_-TO*0Tl`MF3LFqf;rPl$pSmG7E~%M%cmY zUMy8AXTS^j@sFNX)lVu|wfcwP8S{~HY_@to9J_TYN~Ps8?5_eAZzuGl2H3^y<1{Hx zi$kF=3K>$xU3BR5q3C%6*7O(>d2Gh*-Spuamj5&hBaTSvxGegz2bgOlD~HKh_W2O# zaAA>@*|=p~sLyajSUbgI9%*3x-02Ge%uAMhM5corx5{~&&i>ASt^oLljQ~De>RIjo z%^SzA7kvlDH!bVLC+@ONGupZ+9`s(B2FngHQ@Q}Hu#acac4`<+kUCUwJw-~NDB1n? zJf+k7mLBHCsji{!v&ik|A06jORZQDCevf+tmm5K^Vmd0L)P7kdY(-*K-g-DaIXvnB zl0o&pR9Tbm;{5ve5%FFfWtsIR#Y+WA{)9ZvaEA#kgWfJhK3B5Y28DmT=pVBthQSb+ zl`a1a3STE&`Q5(`_$)6>4eAs6Vh6g;#lp-pJd9g_)IlYUL6&<6EF!Y20o*JtW_ri( zPSG@fie^^#E~JQok%!`J&wbE7xuh?y6~NkftpDAG=BtKoW@2OyU~cP&4xKDV0$!20 zlS$Ks%QfhN+l_VgEtBfG{Rd$N?r-NhNt{V5i)}71TB(QOwFCD*5whsob}S@vJYP!R z^+jcaP)rhz2GiH%ZM%UN$#(@~#=WQcgq!QB|BKdd;nAfk3~FgXGwO|w6s4$^zjvP5 zQB;M1*Yjg;T(ocPH3}1`I&w>RqEJz8tophh!AS%hd>u|COUs8_lAQW=ur75OXG@Zv-!Mp17<)2sf?V__aL&w>$s^fi8fSvKq`*t0o$Lbl zHK8tI+FDY|lRpNaqytC6(V&_wtArt?m?h<>L#bqB-lY-z#(6j~@GE`b>f_xBtMPe! z3bxC4_KS`jenmNsvzbSwcc&%>Br7z*+b-Y}5(YAZ)dz-^n3F`iChQ`CQFdd2})t%^JD=syy!7Y?jlwOYb-^ zI#F2UcXc%%5zn_k0ADL!jnA|oz@G|>9Pr&Y+Vhop&wKh~gbBls1eL)zkc=->FbnKV z^?53e8r^Tjbh45>xOlWG=W@zU|gD&f;nf^(#STBwmL#>XA$zMohd#`QXu2cCuU=&p~A_*e)q2XR)BJGv!UH zzZcAOR@UF&s%Q$Jv1O5%-ag)RcDm1x7$?IGs<^Q-TmnYP*Z~=Jz#U<#Q>r;?TrB?V z6g0b*-iA+>cG?66+XthFL-SQ1O!sMJ&eXvITBt3T9KD`krK!#K&%Usf0r1)`(O%@^ zv;0jPj~CO=Nu{v<{T1sIOSb2=$7fx^WaW%&+q3UeKd^)AIRY+?Aa)D5&zw5?3rJvM zWzH~hRK)zYXXDqsNB+pg?QB|~CqLRKNQM{Br&E>_h_6h1oK?}}{q&S-kyo}|<1!qb z?`9DHPHJ6mjSI_W+G-Ip9U5v*dt3JIv@PUuseo>~1@h~vxP<+en>2%_Z;+z4T!QRg z7XzeKY5J+TjZjxRrpm;H=`n@$C%)))U&&J#cbg|p#9EO^nWp60wwX>Xsql+o<+Iipa|s1N*|4xBMHs*-3N0_{i(U3T`C|c`Kd@@}gyH1M=IX-FJx(kyXR!U%u5P`P`Z@DcV8G`{?#GgHu>skpk0_GGLuVJE3BI zbsvC1Vv5ztyS!s5PgK`=LuvaK{uECL(C(b(YCg&-|lJcK)m0tO!f; z#ttr9xwd3mD<64LW}W8l+cz>bx!Zo8+y)8(tqG-(UXg&WpHtQ|bUYxV)?lzDs_+r1 zADxcgW=LNmwTZTnrZK1Teeyz<*FfByflbBEZ4QUvn7Rnyv}GguhLiMkVyHVFV>qjL|aDq96Sv z-uBv=GfvIrzbD*#sJbQmxShH8QI5T@zHJ0FC@MO-Fwgi^D$A0gGB$oG;qVufNlH zp;Tb@+`7Bh2}r)Xkttd(A@a?ojSlMFbZ+*W+tzzHKsc7zkEgp#W2Bo%GDTWRbwHrEH7(S^qPMT{|&+(t73AaMOJL{vmpj`g9+$^sW1`GdJKYSlHFAl5VJNaX(5Q(%Apq>|O{ z%h4N`QKNn=q4!Troqp@2s)>+HFHdP_RX=9N%KJ{ou8`r6x15rC?J@QuJqJVQ#!nX~ zPl=m;*{|Uxd3Sh;VS{Lg=U}KsToSW3qw4GTqINno8z0r1`iDbCy@Q;C|iltLcILt`)g2YU}Nr^2kXLMLdYS|LV%d}ca-w!@PnQUue&p)*)$x0^q)Bp%j zk2)%lRPTg!tWRiD_5x&Z6FL#UZ;$d^R~atIk4}1MpMio^TeJOJNsPdLsg}Jckc>tv z{3_k9n0jw_1n910?t>nj4k%4d4cV1OEC_iY5$Spbpl|zvi*)fL* zb;mjV#QR9*M!6Nj7$QL36?C-dv6EGj5^%YJ|1?qgTwC=4t1aGmAG_ozUVSLkCyM~I z8CT?Cw%-Htf!Xnt5zoto=|up(D~))=)KDHAywr#;2zGJbl_dT~tPpj^urRbV%F&*Gc+ zm|mw1?=&--3k|`S>DAKFri#eBp3xR|JC+&}p0C-jjNLev#0U%QTUDm0K65Beso8&i ztDR@K0C7XB6xocGEOwFW+@stjYFctuyk&M#eXKKpaaeF3Va9sj<+DqB%k-vB8Q?fm%Mo7KFB-K+_BENJg^8yJwtfu1rJ z*wVHhlMbF4N-r_A=D#!MHPmp?CZC)vx%^PJGn|cu2f5P+-20q(nFxHMctQZ0>C2Kd z+Lf-e`m~_il1yiXbaGBf@HZPSY?AzdP|#<&eX(U=RY5Ur9s!)q{c-b7_GPfn3wNLZ zmqWwd$+@%3a-RQ8DXTW^Ies*NyecUmDC{hpiUcW*r1;BcQeal+bYH?a{qw?jFnM>LCV?Uienpn5r|?f2+6nLAUzk^Mp}QaaAbRakYl z`T8n0^^S(B8IBNAx{_vFI!zjpE2R9O!-r)D%8!I_Zq_BYKBM~F!sh4`@(+DSV|*J? zdrjcB(vsyQ6H7SK?pMSPIa-#V*`%dLijnD>_T$e#EjbMo-F9xL+o-@$_e_MV#C-n6nWXeoTW2#7SQ1WIsZzNpnDY7*kJEFbv$>G zUv71mm?X~aDq%7aacwoj^=ge%$?==-YoZ3rc6fWpf+KfcIxNBYjq=GbYMzeKdGnBWRYkC0#>tE< z+Rw@oa@OIf$71UaULJPnN#;3lwkU3nOHRR;{je?>gN0&ilWFCJQ_ns|;|W)jz7mgk z5VMaREqT51%K6zsD2@G~$#C+y+D#VMj5Z`o`#I)&>V)Lh+K{od?B-v7)W(sP&9$H) zz@Mg5yGXoanL*0zwqfgwHIe%1zXP;zlwhg9M7=CcIL*bN_>lU7O6j#2$o5yN!n!p2 z1=uj!*GZMZQnSwy?dA5bbgorXd6_KJ*B_fnHy5McYk#1G`3C>mxP1vpr(hJBF7DH& zpEdnGf4}MEH|S5jMBV4^sR6-WY^Kx#(E4rxEJ~)5lu5QQy2b1qf)Ks8Yd{-^?Mu~+?_NAHfyYY&n5!X`BsDm?R@mAw)_y%v8 zTw1E_Tif-X2IbT)1&B+hca?qg`#Z3Y8jo2i3tcB=1Cyz>35qG$HBWQF`-5reiFSuz zL)Cq*JwuS)QJFl~9yC z7__+W_;ZyamsIQB^a>!NzPLA&Xvml-RY2GClIxbqmv@g6TsNBdLI|m|dlc;BGR4oA zcm2|2yi!;BHT7?Xl3{`6NoHM8vF1~G+Xid15BRaNvIP~IU-eMi&rKER&Ws{=^1o7@ zF4mz<0q=addC!MMH+^J(mz;NAel(l?{}?;#pt#yL&0|3loB+Y0@em|91R87HJ-E9Q z+%32U_XKzMV8NZ>?%sspZhLs=n{Q@zw`%t?l3k6Y=YS=7^e^Y;lbH;11 zk_5IrUA=C14Q`omDPt{)E}pa5p^c#bTUpF>hA$V#<9n$Y-9HN5BM1o%4I&}K$ob{) zlhtt5Qvfx(i52ZT{)Vj1FQI9F+r>yrlCrsKFEaan#hC+|4aQ^(8VfVGa0Hd(s6^fimUl$_&CQlmhFLJ?Fb{0cygb-xz0|U*oulgL*5w(Py z;>-g|O^6Y=;a%b7`>i@Loi=4wmLp&r9u5aozQqv=DQ-ao{OM9i(UkuF!tiF4*Y)H<%R<@j(frvEt-e6}Rw;WbTe(1+94W)q-e%)d>jU8Xz`1S?COmc|#WBQ$bOMENcT z2rq|lHmr{Eiht7L+Hv5XXu5Q|JMG{sDCR@wI{IP%CxJ=ea?-T3n)ipU{LfM5nXS5U zS(8O?_Id-aMU_Sp0S1S0Oy$!2JdA8y%-Zj|syHZq`k-cBZeu~wcSCP&zs^-pUioqr z#IZ`?X()3{d_t}rU>W8Ps~up)E`t|l5|zU?-r>NRAl4AXoE6&VQyqy*lPY%n+1OHS z-lI0BMp0T2H%4M{$wf6{CwrheP8Kt6pRVMhpgY4CL&f|M8)n9QZLOb4*%&3oP_AEYFE|_INR*g>0wyvhGp#l2B+&v47^GzWIa@qSw{a z)1{Dtx)TCDzWXMl=GkoaXxezhAW+05>oef47=nEC0MIbjybC+jccC4FwRcd}XW83R zZ|3X7bDZO?7(Yh~y=EH9Dvwk@^%#K@e+-#D>1bLfK(d}?M+CFk_V}hWP-`N8E=h}K zBk_({OP)S`=sVcJl4rtj7()v+)RKcDS34r|il6jP3Ngh}LWt1)SewPQjFg3ueP&fy zjGs@Md|0uwqS@x!%62Qf4WL=o4>?tv?-3WgFU7!qP|bcwyK&{>Irfu}(sEreNuCX> z4htUnZMh2hnF~8wX%d@6PT2IWiRfYmiAz?a@q$Ub$x;FtZ(-yrf_yYC2LNniLU=H? z&#G5Zijm9FvQS!pBCPnw{I}Jp4LieT6jx^!m1@$swffu3A;U#*#za_Rb@x~r>n%2c zJh12*iY4+nC?slI#l)+F7Uc3Y9 zMb1$t)k?0#>`yzM+;gOo9`?}L#Rmocj%d$IuI!~r^PeFF7swJpjy412)6&<|%vRk7 zMHim@m7^FlhZ6BHzfEl{>UQ!6lkZ3ZWIL7`8u%K$na3Y5au4e^ekX-IcvtS#-~LF` z6?mjuX<^>c2ucNaC|?MVDYwdl5l$36p_{QZ>tW>xs0Ad~naCCahZ`YeS(NcL zu(MJ{4dw+xqSI|0qFZ%4__X+S`p3o@&AjweE^=N14anP)Www<=g+m>JZ*2rU3m?Dy` z;C^4nIXC2Tl6h|Yc<=e8-YF~B=-wf=u&!i)wPF#xs(is06+K`fSzH7cg&@LuWMxXg z{zGCrMy&IjmplMON~#mBRFN#oe8gR-Umbb3;6C9-RScke^Q@T)4^VwY(pLDBI@jP zAT+PbxZ6OjN$+VY&T_9S8D}ncQQf;|nw5}B9xA*1Gj*AV3kwhn1EC2{emv2r#`Ry( zH0;E>71eH}@``yNznsb|ER@@-*Qo2avGM1~!YD4?b!7*4_qF$N-;=m5$K5o9g~fPn zQ-)o~^l?y*PKXNf;BOpRoM#!tsqa}Z964l?oqTF(4xPRagMpnvh@p-2Y)Ae$K`@evOz@k$rYV#B(0l){c z^YhH`1W9cc!{u$!fZ71sikx%-`_)2d5h=7|#2-+I^bkBwsRca9zcq}RJ=OB9XtG)ZerYXp~lemP_zWZ3ADT zw4(jXz=rNZoc?^a9hHtRfF>YMzvRv(gpGt)50xEmQC~A9Y;i=<0hvJuvG*m^q8%A| zLn%(9s>?i#j?8V!j1mW)OFqOp90_t~J*SM}`^IYlPxPu6hm#+s`}Qj3#GCUg3Xf>g zPwGPCnnz~QY!Aw~}+Fb8*PEE@PRBf$Zapb9w0zd70mplHSH-zR2wLW}-LcUjK&2>W3i zEqM14nB|2DDk4x6$PtsJ{i)yF1(K_b_VLPPvkj)6>C?-66m+kNQv7b_^6gVg){HoX zG_pIDo!ncu2RzrAW9(T`tDzY6Mm~;0j)~P%Lk6akH#W;A$vSGRCsapy%goud~5}jZQTXXH?<)!Jd9tVL>h90NToR6}wvVzdwAgBJpHN!6f8` zm$A5)=K#c5jqut1ra-mT0EY82bfQO~?~qAE=7{o)aKC<5li_GQOwhxD zH-rJ%##pJSW@q@8xYl%}`IgUO8!n+%MqkG$ies{4l5}XK9m^>!f3h^9<<={pRN{00 z5Y88yIpFE+^%vs17eP4`s@-z{NM7XQaB&{9XpEi`?X*4tsfkZRW7RlO+>GFa;5gXS zATS0-?+B<273=JLQUv87@s%(3MDy1KT%fm;eL=sZ&xvGiS`XNkp0Mkgt_u6=_p9)+ z8UW1gl>@2s7d*z6HUgVoj%8T;Y0$i5Di;!hQ!?hOXE=`vtAwNSXplE^Y& zPahlAcK+e_brEphoO06XH&dKH9viN_JAGe^4_c<-oEr~&_7o?-XX$9X&CROWI%mk< zYO_5otCibGlzr=u0+-oj;?~fI{E;IU5J&&PC^pV^iZ{G$mD@YZROf^zow)O|ut?hB z+Zc`~rc*%otvhIVW2$eB{ViaCaU!TxyycC9)FKK4FV1K#^2=ZL%*6?JY{ti>k@taz}Z(1-}&f;dZKrxh7MD272en?*LF zOu&$|X#7ri{`4UEe4!w=iYvj^7xH0oJLin@jz7$`eRBwuI$1YuXcEvU;B0k7o4Y>e zA~h^DPA4%xNEUH6;5A(|k9$|-rdSgD+#M7a?yNLP?!E&g4-DZz4?o}Qh<9q%Zt~f- zng2(kT%Q+d%DY)Tgo__9{4iyH)w#&x14RT|aD71Y=(Mz_d};jM>~aIC%e;Z)19;sJ zUWxbiJ|o&8aGlOM1-avLR;!RPti-6>>yKM&ND41$Q9s8|F~Q!ccM-T)(^E&NORUZn?K}1#fX>9lJ&*UVg65s@M7Glpp)C zs_JM&jS&G`hh~7u*Qgd^oH*5l&2u+U?AJy>0?8yAP8hmD+m8*NybpeVQK?y$yXo1RCj;!# zbR?nksB`O|>%{TI4JMtBQLr(5X9GPt<(l1;sa62<%ss3FAkmXzB`$vT4gM0!slH}D z@*ONoPi72OSvur(+r6CA%XT7q{3nLJ`jM1{A|LnEw+sC)Ib@xq`XbVEDhp#N#kSxj zB{j3^Yt<14`|z!b$dF)6Z>8x_3RX4O5torU++g*3U#}&b5~3~drhTbkuboMXMOT|n z1- zr9!;I1fuYC|5*Z@SxoAjsHkETD_I1f#;uQmO3pNIRl9`b*yJ-GiQK94$OA3P#l})C zT>tBdLktR7>Y1j6BqRtg0{5KGJHv;}8cH$X-W2wj%fJ7Fmz%l=XB}v^{P}hPPN9+f zvmtZxh6oIY@M@kYG?W-~5Z3CcZbmYF2R8Cond5hG$IB*yrFTX2GH+(eFI3<>DDexb za2y#%<%WRqhcW@=ccGv{Xwp?2#$`4QH>%8HB)6c9E9n{?JYo(A7IKbda=mC(NkyfK zBm_SHq{M(0NUR7)y8J^HU8o-I^v34{*6%qSVOO9t_4f1|WxmXAeQJZ$%EX>|ZfMbv z^Xi*mkrUo+LKd_f$_SD@?UpnBZOeKLEH{bxAOu1! zPE3RoW#O!kfo-i0sdsrltC1#VW@)0i7D7vdUKSlot3zR?ixke6J8U1NW8PFc1Gp$j z{w3Q`Yn=K5@asxI2e1`Q3E zmtt+j?oI{NaEebcwY>=_&QcnVpb2nf=DFokOF$%3FlTdAa%cO;AfqB`SKx@1w7BDP zs9{2kD1Qd2kCff-$B;7Ej(rVSeX>rJM_818>|wT=o|*L#Xk3dds>|7H=jWRtbB|R< zi@cw)I3?nK@l}uNRwE{wRv?!J!QjrWrU?ao>RMC_fbtiV?^!|5A4B45@n@)+3b;)b8JRa~|V0Jc4{aM(&ior|Vk! zuH;E4EaH7&yf|kyoPSrC&@2N6-xm_X5N&t0NrHqBaXl#cYF|H6jY5fP%=K4yP&0Z zEBcd52Ikmauct5OZ!>}sv)aYtv3o$Ut^@2cR9)uhb@7XAHUzb_?`!pQ?66o@{oIp%8(3&n)DEBD=8rseV*l%db4EdEGs~?xz&F#roL5PE2pX|^XhoK8kX$6XTe&>f#YPWIP9zI0F6a4 zP7jyJ*Z*ih{=HgqPQx~>%z%_8)5czbnUT*=hVbU2GiEEMySb>K$cJygBf>uLZN$*l zksgQe3BFa#74bRtTuXnSrQpDPZ@W)7YQE2o#y9GNW!@!*0c)%(P7_2H)?D0^CE)C1 zQ*b`>nXriH?J4zXddJNqYF)H4RfgE-AmPg&n5nU;<QNt*6VP!+ldSEQ?wAs zVDcH1F=^DS4c^>lO(r9PawMG!+;Q9|V6V7poRB`^T^e+zAxW%?vO=vB39!B()(rWD zN@RKhE2)Sf)LeHG`C3`Zzb@WF?^zdHMVQXf*!QFK)osLrv;riQS~F=DBnoZ!FYQpP>xqsFSyvkQ&a95yfN9tBQb1 zumNQrP`@aDA`ph&Bqfvx%K3FO*2JcLDFDjp))q}*#g#EQ4=_y!kr5rfJ1&te!B$t~ z*nFFrPtht?^DRYswI2+F5i-tI!x4+vMaSJp2#74z?+vl4$CWBNklM;fZHC+px8`ec za4l5!Ire=E$Y1PH+37-PZz*Ob{m%uk&j3fL01tu8Pd@QlurdgvvJS8-OGZv@Aby0F z5}8WL7-{Hna!d);GqZP^CZKTfN=I4A!Bb#wSYmFytBt)5z%NZ z)uDMhf`t`!tGrLx)fj9QFM*X-ou(NJefqd16Dj01t=Lm!38l-HXT0`R>31G6%@mO- z&tY%LuCK&M1}p6)1im;nihXuU$JCiNd{qe!C|ZUcN%HnZsRu>PQ3`b-YQb+88UpQq zB_};?4<9&Uo$?jS!;38uss?55r~{v2|d-2U9W`@%V z<60<9s498#f_1-9)n@RjTVPp@1negq)@FH+x>0fB!0}2#l9SZL}`RQUi0YiX*`WqV*(p%CeM%7gtD7v7GwfSn8o5_mKNIlWqug6oawHWCPx% z%u=?C(O$<{lC$t4Z~KTncH$hydsLLj?fce++<|uaym|#O8mX4oztK3OA=lfH?$6>m z#AAmE1Rh7GitV;z?(l3KfAu$4&X_?x37!`#pc~Jg z`*rP~iOQI?UYS{y2vuP!BmH_47t#*;J~aa2R3E#0g?hu@Lui0|ydM_jIcs}j3Qv{vM~PZUEV1!q?VZ&gReX#^k%(!<}jKjUTT z6V?iNNvhy17?4Y{mlFx3?hCr1Iu#@a!2f!CI~Yu*LCTP`EaME2>V0FbCq(_ofc~wK zu&~~ND#sDE!0r{tZ4Dnrb-i9<+wKDmq3U*~ht1FEI|NgX(Hml9R9-kJBG%~edU

    ?WHBSZmQyUSzqIMc#B5o@U2n3? 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

    &puByr>uY<}R59#wG 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%0Ad2}Jk~)( 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