From 1f2b1481ef5d460fc7b7d220a44cc9e0d78ca9e8 Mon Sep 17 00:00:00 2001 From: iperov Date: Mon, 14 Jan 2019 10:48:23 +0400 Subject: [PATCH] now you can train models on multiple GPU's on same workspace without cloning any folders. Model files names will be prefixed with GPU index if GPU choosed explicitly on train/convert start. if you leave GPU idx choice default, then best GPU idx will be choosed and model file names will not contain index prefix. It gives you possibility to train same fake with various models or options on multiple GPUs. H64 and H128: now you can choose 'Lighter autoencoder'. It is same as vram gb <= 4 before this update. added archived_models.zip contains old experiments RecycleGAN: archived devicelib: if your system has no NVML installed (some old cards), then it will work with gpu_idx=0 as 'Generic GeForce GPU' with 2GB vram. refactorings --- main.py | 24 +-- mainscripts/Extractor.py | 4 +- models/ModelBase.py | 49 ++--- models/Model_H128/Model.py | 18 +- models/Model_H64/Model.py | 24 ++- models/Model_RecycleGAN/Model.py | 250 ------------------------ models/Model_RecycleGAN/__init__.py | 1 - models/archived_models.zip | Bin 0 -> 137605 bytes nnlib/devicelib.py | 289 +++++++++++----------------- 9 files changed, 180 insertions(+), 479 deletions(-) delete mode 100644 models/Model_RecycleGAN/Model.py delete mode 100644 models/Model_RecycleGAN/__init__.py create mode 100644 models/archived_models.zip diff --git a/main.py b/main.py index acdaf6a..1c0e000 100644 --- a/main.py +++ b/main.py @@ -65,16 +65,6 @@ if __name__ == "__main__": sort_parser.set_defaults (func=process_sort) def process_train(arguments): - - if 'DFL_TARGET_EPOCH' in os.environ.keys(): - arguments.session_target_epoch = int ( os.environ['DFL_TARGET_EPOCH'] ) - - if 'DFL_BATCH_SIZE' in os.environ.keys(): - arguments.batch_size = int ( os.environ['DFL_BATCH_SIZE'] ) - - if 'DFL_WORST_GPU' in os.environ.keys(): - arguments.choose_worst_gpu = True - from mainscripts import Trainer Trainer.main ( training_data_src_dir=arguments.training_data_src_dir, @@ -83,10 +73,8 @@ if __name__ == "__main__": model_name=arguments.model_name, debug = arguments.debug, #**options - choose_worst_gpu = arguments.choose_worst_gpu, - force_best_gpu_idx = arguments.force_best_gpu_idx, - force_gpu_idxs = arguments.force_gpu_idxs, - cpu_only = arguments.cpu_only + force_gpu_idx = arguments.force_gpu_idx, + cpu_only = arguments.cpu_only ) train_parser = subparsers.add_parser( "train", help="Trainer") @@ -96,9 +84,7 @@ if __name__ == "__main__": train_parser.add_argument('--model', required=True, dest="model_name", choices=Path_utils.get_all_dir_names_startswith ( Path(__file__).parent / 'models' , 'Model_'), help="Type of model") train_parser.add_argument('--debug', action="store_true", dest="debug", default=False, help="Debug samples.") train_parser.add_argument('--cpu-only', action="store_true", dest="cpu_only", default=False, help="Train on CPU.") - train_parser.add_argument('--force-gpu-idxs', type=str, dest="force_gpu_idxs", default=None, help="Override final GPU idxs. Example: 0,1,2.") - train_parser.add_argument('--choose-worst-gpu', action="store_true", dest="choose_worst_gpu", default=False, help="Choose worst GPU instead of best. Environment variable to force True: DFL_WORST_GPU") - train_parser.add_argument('--force-best-gpu-idx', type=int, dest="force_best_gpu_idx", default=-1, help="Force to choose this GPU idx as best(worst).") + train_parser.add_argument('--force-gpu-idx', type=int, dest="force_gpu_idx", default=-1, help="Force to choose this GPU idx.") train_parser.set_defaults (func=process_train) @@ -111,7 +97,7 @@ if __name__ == "__main__": model_dir=arguments.model_dir, model_name=arguments.model_name, debug = arguments.debug, - force_best_gpu_idx = arguments.force_best_gpu_idx, + force_gpu_idx = arguments.force_gpu_idx, cpu_only = arguments.cpu_only ) @@ -122,7 +108,7 @@ if __name__ == "__main__": convert_parser.add_argument('--model-dir', required=True, action=fixPathAction, dest="model_dir", help="Model dir.") convert_parser.add_argument('--model', required=True, dest="model_name", choices=Path_utils.get_all_dir_names_startswith ( Path(__file__).parent / 'models' , 'Model_'), help="Type of model") convert_parser.add_argument('--debug', action="store_true", dest="debug", default=False, help="Debug converter.") - convert_parser.add_argument('--force-best-gpu-idx', type=int, dest="force_best_gpu_idx", default=-1, help="Force to choose this GPU idx as best.") + convert_parser.add_argument('--force-gpu-idx', type=int, dest="force_gpu_idx", default=-1, help="Force to choose this GPU idx.") convert_parser.add_argument('--cpu-only', action="store_true", dest="cpu_only", default=False, help="Convert on CPU.") convert_parser.set_defaults(func=process_convert) diff --git a/mainscripts/Extractor.py b/mainscripts/Extractor.py index 01cebe0..a746725 100644 --- a/mainscripts/Extractor.py +++ b/mainscripts/Extractor.py @@ -68,7 +68,7 @@ class ExtractSubprocessor(SubprocessorBase): if not multi_gpu or len(devices) == 0: devices = [nnlib.device.getBestDeviceIdx()] - if len(devices) == 0 or devices[0] == -1: + if len(devices) == 0: devices = [0] devices = [ (idx, nnlib.device.getDeviceName(idx), nnlib.device.getDeviceVRAMTotalGb(idx) ) for idx in devices] @@ -263,7 +263,7 @@ class ExtractSubprocessor(SubprocessorBase): self.e = None - device_config = nnlib.DeviceConfig ( cpu_only=self.cpu_only, force_best_gpu_idx=self.device_idx, allow_growth=True) + device_config = nnlib.DeviceConfig ( cpu_only=self.cpu_only, force_gpu_idx=self.device_idx, allow_growth=True) if self.type == 'rects': if self.detector is not None: if self.detector == 'mt': diff --git a/models/ModelBase.py b/models/ModelBase.py index a8e4355..69b73a4 100644 --- a/models/ModelBase.py +++ b/models/ModelBase.py @@ -18,7 +18,18 @@ You can implement your own model. Check examples. class ModelBase(object): #DONT OVERRIDE - def __init__(self, model_path, training_data_src_path=None, training_data_dst_path=None, debug = False, force_best_gpu_idx=-1, **in_options): + def __init__(self, model_path, training_data_src_path=None, training_data_dst_path=None, debug = False, force_gpu_idx=-1, **in_options): + + if force_gpu_idx == -1: + idxs_names_list = nnlib.device.getAllDevicesIdxsWithNamesList() + if len(idxs_names_list) > 1: + print ("You have multi GPUs in a system: ") + for idx, name in idxs_names_list: + print ("[%d] : %s" % (idx, name) ) + + force_gpu_idx = input_int("Which GPU idx to choose? ( skip: best GPU ) : ", -1, [ x[0] for x in idxs_names_list] ) + self.force_gpu_idx = force_gpu_idx + print ("Loading model...") self.model_path = model_path self.model_data_path = Path( self.get_strpath_storage_for_file('data.dat') ) @@ -35,7 +46,7 @@ class ModelBase(object): self.debug = debug self.is_training_mode = (training_data_src_path is not None and training_data_dst_path is not None) - self.supress_std_once = ('TF_SUPPRESS_STD' in os.environ.keys() and os.environ['TF_SUPPRESS_STD'] == '1') + self.supress_std_once = os.environ.get('TF_SUPPRESS_STD', '0') == '1' self.epoch = 0 self.options = {} @@ -48,21 +59,12 @@ class ModelBase(object): self.options = model_data['options'] self.loss_history = model_data['loss_history'] if 'loss_history' in model_data.keys() else [] self.sample_for_preview = model_data['sample_for_preview'] if 'sample_for_preview' in model_data.keys() else None - + ask_override = self.is_training_mode and self.epoch != 0 and input_in_time ("Press enter in 2 seconds to override some model settings.", 2) if self.epoch == 0: print ("\nModel first run. Enter model options as default for each run.") - if (self.epoch == 0 or ask_override) and (force_best_gpu_idx == -1): - idxs_names_list = nnlib.device.getAllDevicesIdxsWithNamesList() - if len(idxs_names_list) > 1: - print ("You have multi GPUs in a system: ") - for idx, name in idxs_names_list: - print ("[%d] : %s" % (idx, name) ) - - force_best_gpu_idx = input_int("Which GPU idx to choose? ( skip: system choice ) : ", -1) - if self.epoch == 0 or ask_override: default_write_preview_history = False if self.epoch == 0 else self.options.get('write_preview_history',False) self.options['write_preview_history'] = input_bool("Write preview history? (y/n ?:help skip:n/default) : ", default_write_preview_history, help_message="Preview history will be writed to _history folder.") @@ -119,13 +121,8 @@ class ModelBase(object): self.onInitializeOptions(self.epoch == 0, ask_override) - nnlib.import_all ( nnlib.DeviceConfig(allow_growth=False, force_best_gpu_idx=force_best_gpu_idx, **in_options) ) + nnlib.import_all ( nnlib.DeviceConfig(allow_growth=False, force_gpu_idx=self.force_gpu_idx, **in_options) ) self.device_config = nnlib.active_DeviceConfig - - if self.epoch == 0: - self.created_vram_gb = self.options['created_vram_gb'] = self.device_config.gpu_total_vram_gb - else: - self.created_vram_gb = self.options['created_vram_gb'] = self.options.get('created_vram_gb',self.device_config.gpu_total_vram_gb) self.onInitialize(**in_options) @@ -136,7 +133,10 @@ class ModelBase(object): if self.is_training_mode: if self.write_preview_history: - self.preview_history_path = self.model_path / ( '%s_history' % (self.get_model_name()) ) + if self.force_gpu_idx == -1: + self.preview_history_path = self.model_path / ( '%s_history' % (self.get_model_name()) ) + else: + self.preview_history_path = self.model_path / ( '%d_%s_history' % (self.force_gpu_idx, self.get_model_name()) ) if not self.preview_history_path.exists(): self.preview_history_path.mkdir(exist_ok=True) @@ -174,7 +174,7 @@ class ModelBase(object): for idx in self.device_config.gpu_idxs: print ("== |== [%d : %s]" % (idx, nnlib.device.getDeviceName(idx)) ) - if not self.device_config.cpu_only and self.device_config.gpu_total_vram_gb == 2: + if not self.device_config.cpu_only and self.device_config.gpu_vram_gb[0] == 2: print ("==") print ("== WARNING: You are using 2GB GPU. Result quality may be significantly decreased.") print ("== If training does not start, close all programs and try again.") @@ -268,7 +268,7 @@ class ModelBase(object): if self.supress_std_once: supressor.__exit__() - + model_data = { 'epoch': self.epoch, 'options': self.options, @@ -367,7 +367,10 @@ class ModelBase(object): return self.generator_list def get_strpath_storage_for_file(self, filename): - return str( self.model_path / (self.get_model_name() + '_' + filename) ) + if self.force_gpu_idx == -1: + return str( self.model_path / ( self.get_model_name() + '_' + filename) ) + else: + return str( self.model_path / ( str(self.force_gpu_idx) + '_' + self.get_model_name() + '_' + filename) ) def set_vram_batch_requirements (self, d): #example d = {2:2,3:4,4:8,5:16,6:32,7:32,8:32,9:48} @@ -379,7 +382,7 @@ class ModelBase(object): else: if self.batch_size == 0: for x in keys: - if self.device_config.gpu_total_vram_gb <= x: + if self.device_config.gpu_vram_gb[0] <= x: self.batch_size = d[x] break diff --git a/models/Model_H128/Model.py b/models/Model_H128/Model.py index af98a73..1c4a9f4 100644 --- a/models/Model_H128/Model.py +++ b/models/Model_H128/Model.py @@ -11,12 +11,22 @@ class Model(ModelBase): decoder_srcH5 = 'decoder_src.h5' decoder_dstH5 = 'decoder_dst.h5' + #override + def onInitializeOptions(self, is_first_run, ask_override): + if is_first_run: + self.options['lighter_ae'] = input_bool ("Use lightweight autoencoder? (y/n, ?:help skip:n) : ", False, help_message="Lightweight autoencoder is faster, requires less VRAM, sacrificing overall quality. If your GPU VRAM <= 4, you should to choose this option.") + else: + default_lighter_ae = self.options.get('created_vram_gb', 99) <= 4 #temporally support old models, deprecate in future + if 'created_vram_gb' in self.options.keys(): + self.options.pop ('created_vram_gb') + self.options['lighter_ae'] = self.options.get('lighter_ae', default_lighter_ae) + #override def onInitialize(self, **in_options): exec(nnlib.import_all(), locals(), globals()) self.set_vram_batch_requirements( {2.5:2,3:2,4:2,4:4,5:8,6:12,7:16,8:16,9:24,10:24,11:32,12:32,13:48} ) - bgr_shape, mask_shape, self.encoder, self.decoder_src, self.decoder_dst = self.Build(self.created_vram_gb) + bgr_shape, mask_shape, self.encoder, self.decoder_src, self.decoder_dst = self.Build( self.options['lighter_ae'] ) if not self.is_first_run(): self.encoder.load_weights (self.get_strpath_storage_for_file(self.encoderH5)) self.decoder_src.load_weights (self.get_strpath_storage_for_file(self.decoder_srcH5)) @@ -120,7 +130,7 @@ class Model(ModelBase): base_blur_mask_modifier=100, **in_options) - def Build(self, created_vram_gb): + def Build(self, lighter_ae): exec(nnlib.code_import_all, locals(), globals()) bgr_shape = (128, 128, 3) @@ -139,7 +149,7 @@ class Model(ModelBase): def Encoder(input_shape): input_layer = Input(input_shape) x = input_layer - if created_vram_gb >= 5: + if not lighter_ae: x = downscale(128)(x) x = downscale(256)(x) x = downscale(512)(x) @@ -161,7 +171,7 @@ class Model(ModelBase): return Model(input_layer, x) def Decoder(): - if created_vram_gb >= 5: + if not lighter_ae: input_ = Input(shape=(16, 16, 512)) x = input_ x = upscale(512)(x) diff --git a/models/Model_H64/Model.py b/models/Model_H64/Model.py index 3f5d5e3..a39ce2f 100644 --- a/models/Model_H64/Model.py +++ b/models/Model_H64/Model.py @@ -11,13 +11,25 @@ class Model(ModelBase): encoderH5 = 'encoder.h5' decoder_srcH5 = 'decoder_src.h5' decoder_dstH5 = 'decoder_dst.h5' + + #override + def onInitializeOptions(self, is_first_run, ask_override): + if is_first_run: + self.options['lighter_ae'] = input_bool ("Use lightweight autoencoder? (y/n, ?:help skip:n) : ", False, help_message="Lightweight autoencoder is faster, requires less VRAM, sacrificing overall quality. If your GPU VRAM <= 4, you should to choose this option.") + else: + default_lighter_ae = self.options.get('created_vram_gb', 99) <= 4 #temporally support old models, deprecate in future + if 'created_vram_gb' in self.options.keys(): + self.options.pop ('created_vram_gb') + self.options['lighter_ae'] = self.options.get('lighter_ae', default_lighter_ae) #override def onInitialize(self, **in_options): exec(nnlib.import_all(), locals(), globals()) self.set_vram_batch_requirements( {1.5:2,2:2,3:8,4:16,5:24,6:32,7:40,8:48} ) - bgr_shape, mask_shape, self.encoder, self.decoder_src, self.decoder_dst = self.Build(self.created_vram_gb) + + bgr_shape, mask_shape, self.encoder, self.decoder_src, self.decoder_dst = self.Build(self.options['lighter_ae']) + if not self.is_first_run(): self.encoder.load_weights (self.get_strpath_storage_for_file(self.encoderH5)) self.decoder_src.load_weights (self.get_strpath_storage_for_file(self.decoder_srcH5)) @@ -27,12 +39,12 @@ class Model(ModelBase): input_src_mask = Input(mask_shape) input_dst_bgr = Input(bgr_shape) input_dst_mask = Input(mask_shape) - + rec_src_bgr, rec_src_mask = self.decoder_src( self.encoder(input_src_bgr) ) rec_dst_bgr, rec_dst_mask = self.decoder_dst( self.encoder(input_dst_bgr) ) self.ae = Model([input_src_bgr,input_src_mask,input_dst_bgr,input_dst_mask], [rec_src_bgr, rec_src_mask, rec_dst_bgr, rec_dst_mask] ) - + self.ae.compile(optimizer=Adam(lr=5e-5, beta_1=0.5, beta_2=0.999), loss=[ DSSIMMaskLoss([input_src_mask]), 'mae', DSSIMMaskLoss([input_dst_mask]), 'mae' ] ) @@ -122,7 +134,7 @@ class Model(ModelBase): base_blur_mask_modifier=100, **in_options) - def Build(self, created_vram_gb): + def Build(self, lighter_ae): exec(nnlib.code_import_all, locals(), globals()) bgr_shape = (64, 64, 3) @@ -141,7 +153,7 @@ class Model(ModelBase): def Encoder(input_shape): input_layer = Input(input_shape) x = input_layer - if created_vram_gb >= 4: + if not lighter_ae: x = downscale(128)(x) x = downscale(256)(x) x = downscale(512)(x) @@ -162,7 +174,7 @@ class Model(ModelBase): return Model(input_layer, x) def Decoder(): - if created_vram_gb >= 4: + if not lighter_ae: input_ = Input(shape=(8, 8, 512)) x = input_ diff --git a/models/Model_RecycleGAN/Model.py b/models/Model_RecycleGAN/Model.py deleted file mode 100644 index f8748f5..0000000 --- a/models/Model_RecycleGAN/Model.py +++ /dev/null @@ -1,250 +0,0 @@ -from models import ModelBase -import numpy as np -import cv2 -from mathlib import get_power_of_two -from nnlib import nnlib - - -from facelib import FaceType -from samples import * - -class Model(ModelBase): - - GAH5 = 'GA.h5' - PAH5 = 'PA.h5' - DAH5 = 'DA.h5' - GBH5 = 'GB.h5' - DBH5 = 'DB.h5' - PBH5 = 'PB.h5' - - #override - def onInitialize(self, batch_size=-1, **in_options): - exec(nnlib.code_import_all, locals(), globals()) - - created_batch_size = self.get_batch_size() - if self.epoch == 0: - #first run - - - - try: - created_resolution = int ( input ("Resolution (default:64, valid: 64,128,256) : ") ) - except: - created_resolution = 64 - - if created_resolution not in [64,128,256]: - created_resolution = 64 - - try: - created_batch_size = int ( input ("Batch_size (minimum/default - 10) : ") ) - except: - created_batch_size = 10 - created_batch_size = max(created_batch_size,1) - - print ("Done. If training won't start, decrease resolution") - - self.options['created_resolution'] = created_resolution - self.options['created_batch_size'] = created_batch_size - self.created_vram_gb = self.device_config.gpu_total_vram_gb - else: - #not first run - if 'created_batch_size' in self.options.keys(): - created_batch_size = self.options['created_batch_size'] - else: - raise Exception("Continue training, but created_batch_size not found.") - - if 'created_resolution' in self.options.keys(): - created_resolution = self.options['created_resolution'] - else: - raise Exception("Continue training, but created_resolution not found.") - - resolution = created_resolution - bgr_shape = (resolution, resolution, 3) - ngf = 64 - npf = 64 - ndf = 64 - lambda_A = 10 - lambda_B = 10 - - self.set_batch_size(created_batch_size) - - use_batch_norm = False #created_batch_size > 1 - self.GA = modelify(ResNet (bgr_shape[2], use_batch_norm, n_blocks=6, ngf=ngf, use_dropout=True))(Input(bgr_shape)) - self.GB = modelify(ResNet (bgr_shape[2], use_batch_norm, n_blocks=6, ngf=ngf, use_dropout=True))(Input(bgr_shape)) - #self.GA = modelify(UNet (bgr_shape[2], use_batch_norm, num_downs=get_power_of_two(resolution)-1, ngf=ngf, use_dropout=True))(Input(bgr_shape)) - #self.GB = modelify(UNet (bgr_shape[2], use_batch_norm, num_downs=get_power_of_two(resolution)-1, ngf=ngf, use_dropout=True))(Input(bgr_shape)) - - self.PA = modelify(UNetTemporalPredictor(bgr_shape[2], use_batch_norm, num_downs=get_power_of_two(resolution)-1, ngf=npf, use_dropout=True))([Input(bgr_shape), Input(bgr_shape)]) - self.PB = modelify(UNetTemporalPredictor(bgr_shape[2], use_batch_norm, num_downs=get_power_of_two(resolution)-1, ngf=npf, use_dropout=True))([Input(bgr_shape), Input(bgr_shape)]) - - self.DA = modelify(NLayerDiscriminator(use_batch_norm, ndf=ndf, n_layers=3) ) (Input(bgr_shape)) - self.DB = modelify(NLayerDiscriminator(use_batch_norm, ndf=ndf, n_layers=3) ) (Input(bgr_shape)) - - if not self.is_first_run(): - self.GA.load_weights (self.get_strpath_storage_for_file(self.GAH5)) - self.DA.load_weights (self.get_strpath_storage_for_file(self.DAH5)) - self.PA.load_weights (self.get_strpath_storage_for_file(self.PAH5)) - self.GB.load_weights (self.get_strpath_storage_for_file(self.GBH5)) - self.DB.load_weights (self.get_strpath_storage_for_file(self.DBH5)) - self.PB.load_weights (self.get_strpath_storage_for_file(self.PBH5)) - - real_A0 = Input(bgr_shape, name="real_A0") - real_A1 = Input(bgr_shape, name="real_A1") - real_A2 = Input(bgr_shape, name="real_A2") - - real_B0 = Input(bgr_shape, name="real_B0") - real_B1 = Input(bgr_shape, name="real_B1") - real_B2 = Input(bgr_shape, name="real_B2") - - DA_ones = K.ones ( K.int_shape(self.DA.outputs[0])[1:] ) - DA_zeros = K.zeros ( K.int_shape(self.DA.outputs[0])[1:] ) - DB_ones = K.ones ( K.int_shape(self.DB.outputs[0])[1:] ) - DB_zeros = K.zeros ( K.int_shape(self.DB.outputs[0])[1:] ) - - def CycleLoss (t1,t2): - return K.mean(K.square(t1 - t2)) - - def RecurrentLOSS(t1,t2): - return K.mean(K.square(t1 - t2)) - - def RecycleLOSS(t1,t2): - return K.mean(K.square(t1 - t2)) - - fake_B0 = self.GA(real_A0) - fake_B1 = self.GA(real_A1) - - fake_A0 = self.GB(real_B0) - fake_A1 = self.GB(real_B1) - - #rec_FB0 = self.GA(fake_A0) - #rec_FB1 = self.GA(fake_A1) - - #rec_FA0 = self.GB(fake_B0) - #rec_FA1 = self.GB(fake_B1) - - pred_A2 = self.PA ( [real_A0, real_A1]) - pred_B2 = self.PB ( [real_B0, real_B1]) - rec_A2 = self.GB ( self.PB ( [fake_B0, fake_B1]) ) - rec_B2 = self.GA ( self.PA ( [fake_A0, fake_A1])) - - loss_G = K.mean(K.square(self.DB(fake_B0) - DB_ones)) + \ - K.mean(K.square(self.DB(fake_B1) - DB_ones)) + \ - K.mean(K.square(self.DA(fake_A0) - DA_ones)) + \ - K.mean(K.square(self.DA(fake_A1) - DA_ones)) + \ - lambda_A * ( #CycleLoss(rec_FA0, real_A0) + \ - #CycleLoss(rec_FA1, real_A1) + \ - RecurrentLOSS(pred_A2, real_A2) + \ - RecycleLOSS(rec_A2, real_A2) ) + \ - lambda_B * ( #CycleLoss(rec_FB0, real_B0) + \ - #CycleLoss(rec_FB1, real_B1) + \ - RecurrentLOSS(pred_B2, real_B2) + \ - RecycleLOSS(rec_B2, real_B2) ) - - weights_G = self.GA.trainable_weights + self.GB.trainable_weights + self.PA.trainable_weights + self.PB.trainable_weights - - self.G_train = K.function ([real_A0, real_A1, real_A2, real_B0, real_B1, real_B2],[loss_G], - Adam(lr=2e-4, beta_1=0.5, beta_2=0.999).get_updates(loss_G, weights_G) ) - - ########### - - loss_D_A0 = ( K.mean(K.square( self.DA(real_A0) - DA_ones)) + \ - K.mean(K.square( self.DA(fake_A0) - DA_zeros)) ) * 0.5 - - loss_D_A1 = ( K.mean(K.square( self.DA(real_A1) - DA_ones)) + \ - K.mean(K.square( self.DA(fake_A1) - DA_zeros)) ) * 0.5 - - loss_D_A = loss_D_A0 + loss_D_A1 - - self.DA_train = K.function ([real_A0, real_A1, real_A2, real_B0, real_B1, real_B2],[loss_D_A], - Adam(lr=2e-4, beta_1=0.5, beta_2=0.999).get_updates(loss_D_A, self.DA.trainable_weights) ) - - ############ - - loss_D_B0 = ( K.mean(K.square( self.DB(real_B0) - DB_ones)) + \ - K.mean(K.square( self.DB(fake_B0) - DB_zeros)) ) * 0.5 - - loss_D_B1 = ( K.mean(K.square( self.DB(real_B1) - DB_ones)) + \ - K.mean(K.square( self.DB(fake_B1) - DB_zeros)) ) * 0.5 - - loss_D_B = loss_D_B0 + loss_D_B1 - - self.DB_train = K.function ([real_A0, real_A1, real_A2, real_B0, real_B1, real_B2],[loss_D_B], - Adam(lr=2e-4, beta_1=0.5, beta_2=0.999).get_updates(loss_D_B, self.DB.trainable_weights) ) - - ############ - - - self.G_view = K.function([real_A0, real_A1, real_A2, real_B0, real_B1, real_B2],[fake_A0, fake_A1, pred_A2, rec_A2, fake_B0, fake_B1, pred_B2, rec_B2 ]) - self.G_convert = K.function([real_B0],[fake_A0]) - - - if self.is_training_mode: - f = SampleProcessor.TypeFlags - self.set_training_data_generators ([ - SampleGeneratorImageTemporal(self.training_data_src_path, debug=self.is_debug(), batch_size=self.batch_size, - temporal_image_count=3, - sample_process_options=SampleProcessor.Options(random_flip = False, normalize_tanh = True), - output_sample_types=[ [f.SOURCE | f.MODE_BGR, resolution] ] ), - - SampleGeneratorImageTemporal(self.training_data_dst_path, debug=self.is_debug(), batch_size=self.batch_size, - temporal_image_count=3, - sample_process_options=SampleProcessor.Options(random_flip = False, normalize_tanh = True), - output_sample_types=[ [f.SOURCE | f.MODE_BGR, resolution] ] ), - ]) - - #override - def onSave(self): - self.save_weights_safe( [[self.GA, self.get_strpath_storage_for_file(self.GAH5)], - [self.GB, self.get_strpath_storage_for_file(self.GBH5)], - [self.DA, self.get_strpath_storage_for_file(self.DAH5)], - [self.DB, self.get_strpath_storage_for_file(self.DBH5)], - [self.PA, self.get_strpath_storage_for_file(self.PAH5)], - [self.PB, self.get_strpath_storage_for_file(self.PBH5)] ]) - - #override - def onTrainOneEpoch(self, sample): - source_src_0, source_src_1, source_src_2, = sample[0] - source_dst_0, source_dst_1, source_dst_2, = sample[1] - - feed = [source_src_0, source_src_1, source_src_2, source_dst_0, source_dst_1, source_dst_2] - - loss_G, = self.G_train ( feed ) - loss_DA, = self.DA_train( feed ) - loss_DB, = self.DB_train( feed ) - #return ( ('G', loss_G), ) - return ( ('G', loss_G), ('DA', loss_DA), ('DB', loss_DB) ) - - #override - def onGetPreview(self, sample): - test_A0 = sample[0][0] - test_A1 = sample[0][1] - test_A2 = sample[0][2] - - test_B0 = sample[1][0] - test_B1 = sample[1][1] - test_B2 = sample[1][2] - - G_view_result = self.G_view([test_A0, test_A1, test_A2, test_B0, test_B1, test_B2]) - - fake_A0, fake_A1, pred_A2, rec_A2, fake_B0, fake_B1, pred_B2, rec_B2 = [ x[0] / 2 + 0.5 for x in G_view_result] - test_A0, test_A1, test_A2, test_B0, test_B1, test_B2 = [ x[0] / 2 + 0.5 for x in [test_A0, test_A1, test_A2, test_B0, test_B1, test_B2] ] - - - r = np.concatenate ((np.concatenate ( (test_A0, test_A1, test_A2, pred_A2, fake_B0, fake_B1, rec_A2), axis=1), - np.concatenate ( (test_B0, test_B1, test_B2, pred_B2, fake_A0, fake_A1, rec_B2), axis=1) - ), axis=0) - - return [ ('RecycleGAN, A0-A1-A2-PA2-FB0-FB1-RA2, B0-B1-B2-PB2-FA0-FA1-RB2, ', r ) ] - - def predictor_func (self, face): - x = self.G_convert ( [ np.expand_dims(face *2 - 1,0)] )[0] - return x[0] / 2 + 0.5 - - #override - def get_converter(self, **in_options): - from models import ConverterImage - return ConverterImage(self.predictor_func, - predictor_input_size=self.options['created_resolution'], - output_size=self.options['created_resolution'], - **in_options) - diff --git a/models/Model_RecycleGAN/__init__.py b/models/Model_RecycleGAN/__init__.py deleted file mode 100644 index cdb3fe7..0000000 --- a/models/Model_RecycleGAN/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .Model import Model \ No newline at end of file diff --git a/models/archived_models.zip b/models/archived_models.zip new file mode 100644 index 0000000000000000000000000000000000000000..0829194024a8889fed894186c203a11c7cb6e871 GIT binary patch literal 137605 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 b0$LgIJAg;XKtL=2f6CZFKuW)X0>1qp_T-q4 literal 0 HcmV?d00001 diff --git a/nnlib/devicelib.py b/nnlib/devicelib.py index ad388d8..70292c3 100644 --- a/nnlib/devicelib.py +++ b/nnlib/devicelib.py @@ -1,20 +1,26 @@ from .pynvml import * +try: + nvmlInit() + hasNVML = True +except: + hasNVML = False + class devicelib: class Config(): - force_best_gpu_idx = -1 + force_gpu_idx = -1 multi_gpu = False force_gpu_idxs = None choose_worst_gpu = False gpu_idxs = [] gpu_names = [] - gpu_total_vram_gb = 0 gpu_compute_caps = [] + gpu_vram_gb = [] allow_growth = True use_fp16 = False cpu_only = False - def __init__ (self, force_best_gpu_idx = -1, + def __init__ (self, force_gpu_idx = -1, multi_gpu = False, force_gpu_idxs = None, choose_worst_gpu = False, @@ -27,219 +33,154 @@ class devicelib: if cpu_only: self.cpu_only = True else: - self.force_best_gpu_idx = force_best_gpu_idx + self.force_gpu_idx = force_gpu_idx self.multi_gpu = multi_gpu self.force_gpu_idxs = force_gpu_idxs self.choose_worst_gpu = choose_worst_gpu self.allow_growth = allow_growth self.gpu_idxs = [] - - if not devicelib.hasNVML(): - self.gpu_idxs = [0] - self.gpu_total_vram_gb = 2 - self.gpu_names += ['Generic GeForce GPU'] - self.gpu_compute_caps += [ 50 ] + + if force_gpu_idxs is not None: + for idx in force_gpu_idxs.split(','): + idx = int(idx) + if devicelib.isValidDeviceIdx(idx): + self.gpu_idxs.append(idx) else: - if force_gpu_idxs is not None: - for idx in force_gpu_idxs.split(','): - idx = int(idx) - if devicelib.isValidDeviceIdx(idx): - self.gpu_idxs.append(idx) - else: - gpu_idx = force_best_gpu_idx if (force_best_gpu_idx >= 0 and devicelib.isValidDeviceIdx(force_best_gpu_idx)) else devicelib.getBestDeviceIdx() if not choose_worst_gpu else devicelib.getWorstDeviceIdx() - if gpu_idx != -1: - if self.multi_gpu: - self.gpu_idxs = devicelib.getDeviceIdxsEqualModel( gpu_idx ) - if len(self.gpu_idxs) <= 1: - self.multi_gpu = False - else: - self.gpu_idxs = [gpu_idx] - - self.cpu_only = (len(self.gpu_idxs) == 0) - - if not self.cpu_only: - self.gpu_total_vram_gb = devicelib.getDeviceVRAMTotalGb ( self.gpu_idxs[0] ) - self.gpu_names = [] - self.gpu_compute_caps = [] - for gpu_idx in self.gpu_idxs: - self.gpu_names += [devicelib.getDeviceName(gpu_idx)] - self.gpu_compute_caps += [ devicelib.getDeviceComputeCapability ( gpu_idx ) ] - - @staticmethod - def hasNVML(): - try: - nvmlInit() - nvmlShutdown() - except: - return False - return True - - @staticmethod - def getDevicesWithAtLeastFreeMemory(freememsize): - result = [] - try: - nvmlInit() - for i in range(0, nvmlDeviceGetCount() ): - handle = nvmlDeviceGetHandleByIndex(i) - memInfo = nvmlDeviceGetMemoryInfo( handle ) - if (memInfo.total - memInfo.used) >= freememsize: - result.append (i) - nvmlShutdown() - except: - pass - return result - + gpu_idx = force_gpu_idx if (force_gpu_idx >= 0 and devicelib.isValidDeviceIdx(force_gpu_idx)) else devicelib.getBestDeviceIdx() if not choose_worst_gpu else devicelib.getWorstDeviceIdx() + if gpu_idx != -1: + if self.multi_gpu: + self.gpu_idxs = devicelib.getDeviceIdxsEqualModel( gpu_idx ) + if len(self.gpu_idxs) <= 1: + self.multi_gpu = False + else: + self.gpu_idxs = [gpu_idx] + + self.cpu_only = (len(self.gpu_idxs) == 0) + + if not self.cpu_only: + self.gpu_names = [] + self.gpu_compute_caps = [] + for gpu_idx in self.gpu_idxs: + self.gpu_names += [devicelib.getDeviceName(gpu_idx)] + self.gpu_compute_caps += [ devicelib.getDeviceComputeCapability ( gpu_idx ) ] + self.gpu_vram_gb += [ devicelib.getDeviceVRAMTotalGb ( gpu_idx ) ] + @staticmethod def getDevicesWithAtLeastTotalMemoryGB(totalmemsize_gb): + if not hasNVML and totalmemsize_gb <= 2: + return [0] + result = [] - try: - nvmlInit() - for i in range(0, nvmlDeviceGetCount() ): - handle = nvmlDeviceGetHandleByIndex(i) - memInfo = nvmlDeviceGetMemoryInfo( handle ) - if (memInfo.total) >= totalmemsize_gb*1024*1024*1024: - result.append (i) - nvmlShutdown() - except: - pass + for i in range(nvmlDeviceGetCount()): + handle = nvmlDeviceGetHandleByIndex(i) + memInfo = nvmlDeviceGetMemoryInfo( handle ) + if (memInfo.total) >= totalmemsize_gb*1024*1024*1024: + result.append (i) return result @staticmethod - def getAllDevicesIdxsList (): - result = [] - try: - nvmlInit() - result = [ i for i in range(0, nvmlDeviceGetCount() ) ] - nvmlShutdown() - except: - pass - return result + def getAllDevicesIdxsList(): + if not hasNVML: + return [0] + + return [ i for i in range(0, nvmlDeviceGetCount() ) ] @staticmethod - def getAllDevicesIdxsWithNamesList (): - result = [] - try: - nvmlInit() - result = [ (i, nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(i)).decode() ) for i in range(0, nvmlDeviceGetCount() ) ] - nvmlShutdown() - except: - pass - return result + def getAllDevicesIdxsWithNamesList(): + if not hasNVML: + return [ (0, devicelib.getDeviceName(0) ) ] + + return [ (i, nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(i)).decode() ) for i in range(nvmlDeviceGetCount() ) ] @staticmethod def getDeviceVRAMFree (idx): - result = 0 - try: - nvmlInit() - if idx < nvmlDeviceGetCount(): - handle = nvmlDeviceGetHandleByIndex(idx) - memInfo = nvmlDeviceGetMemoryInfo( handle ) - result = (memInfo.total - memInfo.used) - nvmlShutdown() - except: - pass - return result + if not hasNVML: + return 2 + + if idx < nvmlDeviceGetCount(): + memInfo = nvmlDeviceGetMemoryInfo( nvmlDeviceGetHandleByIndex(idx) ) + return memInfo.total - memInfo.used + + return 0 @staticmethod def getDeviceVRAMTotalGb (idx): - result = 2 - try: - nvmlInit() - if idx < nvmlDeviceGetCount(): - handle = nvmlDeviceGetHandleByIndex(idx) - memInfo = nvmlDeviceGetMemoryInfo( handle ) - result = memInfo.total / (1024*1024*1024) - nvmlShutdown() - result = round(result) - except: - pass - return result + if not hasNVML: + return 2 + + if idx < nvmlDeviceGetCount(): + memInfo = nvmlDeviceGetMemoryInfo( nvmlDeviceGetHandleByIndex(idx) ) + return round ( memInfo.total / (1024*1024*1024) ) + + return 0 @staticmethod def getBestDeviceIdx(): - idx = -1 - try: - nvmlInit() - idx_mem = 0 - for i in range(0, nvmlDeviceGetCount() ): - handle = nvmlDeviceGetHandleByIndex(i) - memInfo = nvmlDeviceGetMemoryInfo( handle ) - if memInfo.total > idx_mem: - idx = i - idx_mem = memInfo.total + if not hasNVML: + return 0 + + idx = -1 + idx_mem = 0 + for i in range( nvmlDeviceGetCount() ): + memInfo = nvmlDeviceGetMemoryInfo( nvmlDeviceGetHandleByIndex(i) ) + if memInfo.total > idx_mem: + idx = i + idx_mem = memInfo.total - nvmlShutdown() - except: - pass return idx @staticmethod def getWorstDeviceIdx(): - idx = -1 - try: - nvmlInit() - - idx_mem = sys.maxsize - for i in range(0, nvmlDeviceGetCount() ): - handle = nvmlDeviceGetHandleByIndex(i) - memInfo = nvmlDeviceGetMemoryInfo( handle ) - if memInfo.total < idx_mem: - idx = i - idx_mem = memInfo.total + if not hasNVML: + return 0 + + idx = -1 + idx_mem = sys.maxsize + for i in range( nvmlDeviceGetCount() ): + memInfo = nvmlDeviceGetMemoryInfo( nvmlDeviceGetHandleByIndex(i) ) + if memInfo.total < idx_mem: + idx = i + idx_mem = memInfo.total - nvmlShutdown() - except: - pass return idx @staticmethod def isValidDeviceIdx(idx): - result = False - try: - nvmlInit() - result = (idx < nvmlDeviceGetCount()) - nvmlShutdown() - except: - pass - return result + if not hasNVML: + return (idx == 0) + + return (idx < nvmlDeviceGetCount()) @staticmethod def getDeviceIdxsEqualModel(idx): - result = [] - try: - nvmlInit() - idx_name = nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(idx)).decode() + if not hasNVML: + return [0] if idx == 0 else [] + + result = [] + idx_name = nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(idx)).decode() + for i in range( nvmlDeviceGetCount() ): + if nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(i)).decode() == idx_name: + result.append (i) - for i in range(0, nvmlDeviceGetCount() ): - if nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(i)).decode() == idx_name: - result.append (i) - - nvmlShutdown() - except: - pass return result @staticmethod def getDeviceName (idx): - result = 'Generic GeForce GPU' - try: - nvmlInit() - if idx < nvmlDeviceGetCount(): - result = nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(idx)).decode() - nvmlShutdown() - except: - pass - return result + if not hasNVML: + return 'Generic GeForce GPU' + + if idx < nvmlDeviceGetCount(): + return nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(idx)).decode() + + return None @staticmethod def getDeviceComputeCapability(idx): - result = 0 - try: - nvmlInit() - if idx < nvmlDeviceGetCount(): - result = nvmlDeviceGetCudaComputeCapability(nvmlDeviceGetHandleByIndex(idx)) - nvmlShutdown() - except: - pass - return result[0] * 10 + result[1] \ No newline at end of file + if not hasNVML: + return 99 if idx == 0 else 0 + + result = 0 + if idx < nvmlDeviceGetCount(): + result = nvmlDeviceGetCudaComputeCapability(nvmlDeviceGetHandleByIndex(idx)) + return result[0] * 10 + result[1]