From 88ba7a5b0d45c27f762f3a46aabc4f79f8ee58e6 Mon Sep 17 00:00:00 2001 From: Marcin Kaminski Date: Wed, 23 Feb 2022 20:32:50 +0100 Subject: [PATCH] [ML][Training] Fixing error handling Changes: - proper error returning at JS level - additional check and proper error returned on recompilation trial Change-Id: If209e316553c94acd0a83decfb843b26a07be592 --- src/ml/js/ml_trainer.js | 25 +++++++++++--- src/ml/ml_trainer_manager.cc | 67 +++++++++++++++++++++++------------- 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/src/ml/js/ml_trainer.js b/src/ml/js/ml_trainer.js index 8354becb..e874baf9 100755 --- a/src/ml/js/ml_trainer.js +++ b/src/ml/js/ml_trainer.js @@ -100,6 +100,7 @@ var Layer = function(id, type) { var ValidSetPropertyExceptions = [ 'InvalidValuesError', + 'NotSupportedError', 'TypeMismatchError', 'AbortError' ]; @@ -142,6 +143,7 @@ Layer.prototype.setProperty = function() { var ValidDisposeExceptions = [ 'NotFoundError', + 'NoModificationAllowedError', 'AbortError' ]; @@ -305,6 +307,7 @@ function ValidateCompileOptions(options) { var ValidModelCompileExceptions = [ 'InvalidValuesError', 'TypeMismatchError', + 'NoModificationAllowedError', 'AbortError' ]; @@ -355,7 +358,9 @@ function ValidateRunOptions(options) { var ValidModelRunExceptions = [ 'InvalidValuesError', - 'TypeMismatchError' + 'InvalidStateError', + 'TypeMismatchError', + 'AbortError' ]; Model.prototype.run = function() { @@ -473,6 +478,7 @@ Model.prototype._checkMetrics = function (trainLoss, validLoss, validAccuracy) { var ValidModelSaveExceptions = [ 'InvalidValuesError', 'TypeMismatchError', + "NoModificationAllowedError", 'AbortError' ]; @@ -498,7 +504,7 @@ Model.prototype.saveToFile = function () { try { callArgs.savePath = tizen.filesystem.toURI(args.path); } catch (e) { - throw new WebAPIException(WebAPIException.InvalidValuesError, 'Invalid file path given'); + throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, 'Invalid file path given'); } if (tizen.filesystem.pathExists(callArgs.savePath)) { @@ -581,12 +587,21 @@ Model.prototype.addLayer = function() { if (native_.isFailure(result)) { throw native_.getErrorObjectAndValidate( result, - ValidBasicExceptions, + ValidSetObjectExceptions, AbortError ); } }; +var ValidSetObjectExceptions = [ + 'InvalidValuesError', + 'TypeMismatchError', + 'NoModificationAllowedError', + 'NotSupportedError', + 'NotFound', + 'AbortError' +]; + Model.prototype.setDataset = function() { var args = validator_.validateArgs(arguments, [ { @@ -612,7 +627,7 @@ Model.prototype.setDataset = function() { if (native_.isFailure(result)) { throw native_.getErrorObjectAndValidate( result, - ValidBasicExceptions, + ValidSetObjectExceptions, AbortError ); } @@ -643,7 +658,7 @@ Model.prototype.setOptimizer = function() { if (native_.isFailure(result)) { throw native_.getErrorObjectAndValidate( result, - ValidBasicExceptions, + ValidSetObjectExceptions, AbortError ); } diff --git a/src/ml/ml_trainer_manager.cc b/src/ml/ml_trainer_manager.cc index 5afe64dd..22805e8e 100644 --- a/src/ml/ml_trainer_manager.cc +++ b/src/ml/ml_trainer_manager.cc @@ -18,6 +18,8 @@ #include "common/tools.h" +#include "ml_utils.h" + using common::ErrorCode; using common::PlatformResult; @@ -81,6 +83,12 @@ PlatformResult TrainerManager::ModelCompile(int id, auto& model = models_[id]; std::lock_guard modelLock(model->instanceLock); + if (model->isCompiled()) { + LoggerE("Recompilation of compiled model is not allowed"); + return PlatformResult(ErrorCode::NO_MODIFICATION_ALLOWED_ERR, + "Recompilation of compiled model is not allowed"); + } + std::stringstream ss; for (const auto& opt : options) { const auto& key = opt.first; @@ -209,7 +217,7 @@ PlatformResult TrainerManager::ModelAddLayer(int id, int layerId) { if (model->isCompiled()) { LoggerE("Modification of compiled model"); model->instanceLock.unlock(); - return PlatformResult(ErrorCode::INVALID_STATE_ERR, + return PlatformResult(ErrorCode::NO_MODIFICATION_ALLOWED_ERR, "Modification of compiled model not allowed"); } @@ -219,7 +227,8 @@ PlatformResult TrainerManager::ModelAddLayer(int id, int layerId) { LoggerE("Could not add layer to model: %d (%s)", ret_val, ml_strerror(ret_val)); model->instanceLock.unlock(); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } model->layerIndices.push_back(layerId); @@ -256,7 +265,7 @@ PlatformResult TrainerManager::ModelSetOptimizer(int id, int optimizerId) { if (model->isCompiled()) { LoggerE("Modification of compiled model"); model->instanceLock.unlock(); - return PlatformResult(ErrorCode::INVALID_STATE_ERR, + return PlatformResult(ErrorCode::NO_MODIFICATION_ALLOWED_ERR, "Modification of compiled model not allowed"); } @@ -266,7 +275,8 @@ PlatformResult TrainerManager::ModelSetOptimizer(int id, int optimizerId) { LoggerE("Could not set optimizer for model: %d (%s)", ret_val, ml_strerror(ret_val)); model->instanceLock.unlock(); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } if (model->optimizerIndex != INVALID_INDEX) { @@ -294,7 +304,7 @@ PlatformResult TrainerManager::ModelSetDataset(int id, int datasetId) { if (models_.find(id) == models_.end()) { LoggerE("Could not find model with id: %d", id); - return PlatformResult(ErrorCode::ABORT_ERR, "Could not find model"); + return PlatformResult(ErrorCode::NOT_FOUND_ERR, "Could not find model"); } auto& model = models_[id]; @@ -319,7 +329,8 @@ PlatformResult TrainerManager::ModelSetDataset(int id, int datasetId) { LoggerE("Could not set dataset for model: %d (%s)", ret_val, ml_strerror(ret_val)); model->instanceLock.unlock(); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } if (model->datasetIndex != INVALID_INDEX) { @@ -470,7 +481,7 @@ PlatformResult TrainerManager::ModelSave(int id, const std::string& path, if (ret_val != ML_ERROR_NONE) { LoggerE("Could not save model to file: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } return PlatformResult(); @@ -508,7 +519,7 @@ PlatformResult TrainerManager::ModelLoad(int id, const std::string& path, if (ret_val != ML_ERROR_NONE) { LoggerE("Could not load model from file: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } return PlatformResult(); @@ -538,7 +549,8 @@ PlatformResult TrainerManager::ModelDispose(int id) { if (ret_val != ML_ERROR_NONE) { LoggerE("Could not destroy model: %d (%s)", ret_val, ml_strerror(ret_val)); model->instanceLock.unlock(); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } // erase model from map and use a shared pointer for related objects removal @@ -577,7 +589,8 @@ PlatformResult TrainerManager::CreateLayer(int& id, int ret_val = ml_train_layer_create(&n_layer, type); if (ret_val != ML_ERROR_NONE) { LoggerE("Could not create layer: %s", ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } layers_[next_layer_id_] = std::make_shared(n_layer); @@ -605,11 +618,12 @@ PlatformResult TrainerManager::LayerSetProperty(int id, if (ret_val != ML_ERROR_NONE) { LoggerE("Could not set layer property: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } if (name == "name") { - LoggerI("Layer name set detected - changing to: %s", value.c_str()); + LoggerI("Layer name setting detected - changing to: %s", value.c_str()); layer->setName(value); } return PlatformResult(); @@ -650,7 +664,8 @@ PlatformResult TrainerManager::LayerDispose(int id) { int ret_val = ml_train_layer_destroy(layer->getNative()); if (ret_val != ML_ERROR_NONE) { LoggerE("Could not destroy layer: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } layers_.erase(id); @@ -668,7 +683,8 @@ PlatformResult TrainerManager::CreateOptimizer(int& id, if (ret_val != ML_ERROR_NONE) { LoggerE("Could not create optimizer: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } optimizers_[next_optimizer_id_] = @@ -696,7 +712,8 @@ PlatformResult TrainerManager::OptimizerSetProperty(int id, if (ret_val != ML_ERROR_NONE) { LoggerE("Could not set optimizer property: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } return PlatformResult(); } @@ -723,7 +740,8 @@ PlatformResult TrainerManager::OptimizerDispose(int id) { if (ret_val != ML_ERROR_NONE) { LoggerE("Could not destroy optimizer: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } optimizers_.erase(id); @@ -758,7 +776,8 @@ PlatformResult TrainerManager::CreateFileDataset(int& id, LoggerE("Could not add train file %s to dataset: %s", tmpString.c_str(), ml_strerror(ret_val)); ml_train_dataset_destroy(n_dataset); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } } @@ -774,7 +793,8 @@ PlatformResult TrainerManager::CreateFileDataset(int& id, LoggerE("Could not add validation file %s to dataset: %s", tmpString.c_str(), ml_strerror(ret_val)); ml_train_dataset_destroy(n_dataset); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } } @@ -790,7 +810,8 @@ PlatformResult TrainerManager::CreateFileDataset(int& id, LoggerE("Could not add test file %s to dataset: %s", tmpString.c_str(), ml_strerror(ret_val)); ml_train_dataset_destroy(n_dataset); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } } @@ -801,8 +822,6 @@ PlatformResult TrainerManager::CreateFileDataset(int& id, return PlatformResult(); } -// MK-TODO Add creating Dataset with generator - PlatformResult TrainerManager::DatasetSetProperty( int id, const std::string& name, @@ -824,7 +843,8 @@ PlatformResult TrainerManager::DatasetSetProperty( if (ret_val != ML_ERROR_NONE) { LoggerE("Could not set dataset property for mode %d: %d (%s)", mode, ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } return PlatformResult(); @@ -852,7 +872,8 @@ PlatformResult TrainerManager::DatasetDispose(int id) { if (ret_val != ML_ERROR_NONE) { LoggerE("Could not destroy dataset: %d (%s)", ret_val, ml_strerror(ret_val)); - return PlatformResult(ErrorCode::ABORT_ERR, ml_strerror(ret_val)); + + return util::ToPlatformResult(ret_val, ml_strerror(ret_val)); } datasets_.erase(id); -- 2.34.1