From a5008a8a0a6e09133b2f3151b1ef614e945bca15 Mon Sep 17 00:00:00 2001 From: Srujan Saggam Date: Mon, 29 Apr 2019 14:19:53 -0700 Subject: [PATCH 1/2] fix error handling --- .../CodeGenerator/CodeGenerationHelper.cs | 73 ++++++++++++++++--- src/mlnet/ProgressBar/ProgressBar.cs | 1 + 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/mlnet/CodeGenerator/CodeGenerationHelper.cs b/src/mlnet/CodeGenerator/CodeGenerationHelper.cs index f787b5a336..38d95c2fe7 100644 --- a/src/mlnet/CodeGenerator/CodeGenerationHelper.cs +++ b/src/mlnet/CodeGenerator/CodeGenerationHelper.cs @@ -3,13 +3,10 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; -using System.Runtime.ExceptionServices; using System.Threading; -using System.Threading.Tasks; using Microsoft.ML.AutoML; using Microsoft.ML.CLI.CodeGenerator.CSharp; using Microsoft.ML.CLI.Data; @@ -17,7 +14,6 @@ using Microsoft.ML.CLI.Utilities; using Microsoft.ML.Data; using NLog; -using NLog.Targets; namespace Microsoft.ML.CLI.CodeGenerator { @@ -81,7 +77,7 @@ public void GenerateCode() // i.e there is no common class/interface to handle all three tasks together. ExperimentResult binaryExperimentResult = default; - ExperimentResult multiExperimentResult = default; + ExperimentResult multiClassExperimentResult = default; ExperimentResult regressionExperimentResult = default; if (verboseLevel > LogLevel.Trace) { @@ -111,20 +107,22 @@ public void GenerateCode() if (verboseLevel > LogLevel.Trace && !Console.IsOutputRedirected) { + Exception ex = null; using (var pbar = new FixedDurationBar(wait, "", options)) { pbar.Message = Strings.WaitingForFirstIteration; Thread t = default; switch (taskKind) { + // TODO: It may be a good idea to convert the below Threads to Tasks or get rid of this progress bar all together and use an existing one in opensource. case TaskKind.BinaryClassification: - t = new Thread(() => binaryExperimentResult = automlEngine.ExploreBinaryClassificationModels(context, trainData, validationData, columnInformation, new BinaryExperimentSettings().OptimizingMetric, pbar)); + t = new Thread(() => SafeExecute(() => automlEngine.ExploreBinaryClassificationModels(context, trainData, validationData, columnInformation, new BinaryExperimentSettings().OptimizingMetric, pbar), out ex, out binaryExperimentResult, pbar)); break; case TaskKind.Regression: - t = new Thread(() => regressionExperimentResult = automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric, pbar)); + t = new Thread(() => SafeExecute(() => automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric, pbar), out ex, out regressionExperimentResult, pbar)); break; case TaskKind.MulticlassClassification: - t = new Thread(() => multiExperimentResult = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric, pbar)); + t = new Thread(() => SafeExecute(() => automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric, pbar), out ex, out multiClassExperimentResult, pbar)); break; default: logger.Log(LogLevel.Error, Strings.UnsupportedMlTask); @@ -147,6 +145,10 @@ public void GenerateCode() pbar.Message = originalMessage; } } + if (ex != null) + { + throw ex; + } } } else @@ -160,7 +162,7 @@ public void GenerateCode() regressionExperimentResult = automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric); break; case TaskKind.MulticlassClassification: - multiExperimentResult = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric); + multiClassExperimentResult = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric); break; default: logger.Log(LogLevel.Error, Strings.UnsupportedMlTask); @@ -204,11 +206,11 @@ public void GenerateCode() ConsolePrinter.PrintIterationSummary(regressionExperimentResult.RunDetails, new RegressionExperimentSettings().OptimizingMetric, 5); break; case TaskKind.MulticlassClassification: - var bestMultiIteration = multiExperimentResult.BestRun; + var bestMultiIteration = multiClassExperimentResult.BestRun; bestPipeline = bestMultiIteration.Pipeline; bestModel = bestMultiIteration.Model; - ConsolePrinter.ExperimentResultsHeader(LogLevel.Info, settings.MlTask, settings.Dataset.Name, columnInformation.LabelColumnName, elapsedTime.ToString("F2"), multiExperimentResult.RunDetails.Count()); - ConsolePrinter.PrintIterationSummary(multiExperimentResult.RunDetails, new MulticlassExperimentSettings().OptimizingMetric, 5); + ConsolePrinter.ExperimentResultsHeader(LogLevel.Info, settings.MlTask, settings.Dataset.Name, columnInformation.LabelColumnName, elapsedTime.ToString("F2"), multiClassExperimentResult.RunDetails.Count()); + ConsolePrinter.PrintIterationSummary(multiClassExperimentResult.RunDetails, new MulticlassExperimentSettings().OptimizingMetric, 5); break; } } @@ -278,5 +280,52 @@ private void ConsumeAutoMLSDKLogs(MLContext context) } }; } + + private void SafeExecute(Func> p, out Exception ex, out ExperimentResult binaryExperimentResult, FixedDurationBar pbar) + { + try + { + binaryExperimentResult = p.Invoke(); + ex = null; + } + catch (Exception e) + { + ex = e; + binaryExperimentResult = null; + return; + } + } + + private void SafeExecute(Func> p, out Exception ex, out ExperimentResult regressionExperimentResult, FixedDurationBar pbar) + { + try + { + regressionExperimentResult = p.Invoke(); + ex = null; + } + catch (Exception e) + { + ex = e; + regressionExperimentResult = null; + return; + } + } + + private void SafeExecute(Func> p, out Exception ex, out ExperimentResult multiClassExperimentResult, FixedDurationBar pbar) + { + try + { + multiClassExperimentResult = p.Invoke(); + ex = null; + } + catch (Exception e) + { + ex = e; + multiClassExperimentResult = null; + pbar.Dispose(); + //((ManualResetEvent)pbar.CompletedHandle).Set(); + return; + } + } } } diff --git a/src/mlnet/ProgressBar/ProgressBar.cs b/src/mlnet/ProgressBar/ProgressBar.cs index 5f8fac716e..5e72ad2f69 100644 --- a/src/mlnet/ProgressBar/ProgressBar.cs +++ b/src/mlnet/ProgressBar/ProgressBar.cs @@ -356,6 +356,7 @@ public void Dispose() _timer?.Dispose(); _timer = null; foreach (var c in this.Children) c.Dispose(); + OnDone(); } } } From c40cf93dad3880923e4e0469fb4610981354559e Mon Sep 17 00:00:00 2001 From: Srujan Saggam Date: Mon, 29 Apr 2019 14:31:09 -0700 Subject: [PATCH 2/2] renaming variables --- .../CodeGenerator/CodeGenerationHelper.cs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/mlnet/CodeGenerator/CodeGenerationHelper.cs b/src/mlnet/CodeGenerator/CodeGenerationHelper.cs index 38d95c2fe7..178e944ea2 100644 --- a/src/mlnet/CodeGenerator/CodeGenerationHelper.cs +++ b/src/mlnet/CodeGenerator/CodeGenerationHelper.cs @@ -77,7 +77,7 @@ public void GenerateCode() // i.e there is no common class/interface to handle all three tasks together. ExperimentResult binaryExperimentResult = default; - ExperimentResult multiClassExperimentResult = default; + ExperimentResult multiclassExperimentResult = default; ExperimentResult regressionExperimentResult = default; if (verboseLevel > LogLevel.Trace) { @@ -122,7 +122,7 @@ public void GenerateCode() t = new Thread(() => SafeExecute(() => automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric, pbar), out ex, out regressionExperimentResult, pbar)); break; case TaskKind.MulticlassClassification: - t = new Thread(() => SafeExecute(() => automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric, pbar), out ex, out multiClassExperimentResult, pbar)); + t = new Thread(() => SafeExecute(() => automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric, pbar), out ex, out multiclassExperimentResult, pbar)); break; default: logger.Log(LogLevel.Error, Strings.UnsupportedMlTask); @@ -162,7 +162,7 @@ public void GenerateCode() regressionExperimentResult = automlEngine.ExploreRegressionModels(context, trainData, validationData, columnInformation, new RegressionExperimentSettings().OptimizingMetric); break; case TaskKind.MulticlassClassification: - multiClassExperimentResult = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric); + multiclassExperimentResult = automlEngine.ExploreMultiClassificationModels(context, trainData, validationData, columnInformation, new MulticlassExperimentSettings().OptimizingMetric); break; default: logger.Log(LogLevel.Error, Strings.UnsupportedMlTask); @@ -206,11 +206,11 @@ public void GenerateCode() ConsolePrinter.PrintIterationSummary(regressionExperimentResult.RunDetails, new RegressionExperimentSettings().OptimizingMetric, 5); break; case TaskKind.MulticlassClassification: - var bestMultiIteration = multiClassExperimentResult.BestRun; - bestPipeline = bestMultiIteration.Pipeline; - bestModel = bestMultiIteration.Model; - ConsolePrinter.ExperimentResultsHeader(LogLevel.Info, settings.MlTask, settings.Dataset.Name, columnInformation.LabelColumnName, elapsedTime.ToString("F2"), multiClassExperimentResult.RunDetails.Count()); - ConsolePrinter.PrintIterationSummary(multiClassExperimentResult.RunDetails, new MulticlassExperimentSettings().OptimizingMetric, 5); + var bestMulticlassIteration = multiclassExperimentResult.BestRun; + bestPipeline = bestMulticlassIteration.Pipeline; + bestModel = bestMulticlassIteration.Model; + ConsolePrinter.ExperimentResultsHeader(LogLevel.Info, settings.MlTask, settings.Dataset.Name, columnInformation.LabelColumnName, elapsedTime.ToString("F2"), multiclassExperimentResult.RunDetails.Count()); + ConsolePrinter.PrintIterationSummary(multiclassExperimentResult.RunDetails, new MulticlassExperimentSettings().OptimizingMetric, 5); break; } } @@ -322,8 +322,7 @@ private void SafeExecute(Func> { ex = e; multiClassExperimentResult = null; - pbar.Dispose(); - //((ManualResetEvent)pbar.CompletedHandle).Set(); + pbar.Dispose(); // or ((ManualResetEvent)pbar.CompletedHandle).Set(); return; } }