From 3521b6525de666720ce425c26a5ae646569680bf Mon Sep 17 00:00:00 2001 From: Srujan Saggam Date: Tue, 30 Apr 2019 12:33:07 -0700 Subject: [PATCH 1/3] fix case of label with space and exception logging --- .../CodeGenerator/CSharp/CodeGenerator.cs | 2 +- .../CodeGenerator/CodeGenerationHelper.cs | 63 ++++++++++++------- src/mlnet/Commands/New/NewCommandHandler.cs | 21 +++++-- src/mlnet/Program.cs | 1 + src/mlnet/Strings.resx | 6 ++ src/mlnet/strings.Designer.cs | 18 ++++++ 6 files changed, 82 insertions(+), 29 deletions(-) diff --git a/src/mlnet/CodeGenerator/CSharp/CodeGenerator.cs b/src/mlnet/CodeGenerator/CSharp/CodeGenerator.cs index 96cd32bcaa..34c211969a 100644 --- a/src/mlnet/CodeGenerator/CSharp/CodeGenerator.cs +++ b/src/mlnet/CodeGenerator/CSharp/CodeGenerator.cs @@ -43,7 +43,7 @@ public void GenerateOutput() // Get Namespace var namespaceValue = Utils.Normalize(settings.OutputName); - var labelType = columnInferenceResult.TextLoaderOptions.Columns.Where(t => t.Name == columnInferenceResult.ColumnInformation.LabelColumnName).First().DataKind; + var labelType = columnInferenceResult.TextLoaderOptions.Columns.Where(t => t.Name == settings.LabelName).First().DataKind; Type labelTypeCsharp = Utils.GetCSharpType(labelType); // Generate Model Project diff --git a/src/mlnet/CodeGenerator/CodeGenerationHelper.cs b/src/mlnet/CodeGenerator/CodeGenerationHelper.cs index 178e944ea2..f2153fd785 100644 --- a/src/mlnet/CodeGenerator/CodeGenerationHelper.cs +++ b/src/mlnet/CodeGenerator/CodeGenerationHelper.cs @@ -52,13 +52,10 @@ public void GenerateCode() } columnInference = automlEngine.InferColumns(context, inputColumnInformation); } - catch (Exception e) + catch (Exception) { logger.Log(LogLevel.Error, $"{Strings.InferColumnError}"); - logger.Log(LogLevel.Error, e.Message); - logger.Log(LogLevel.Trace, e.ToString()); - logger.Log(LogLevel.Error, Strings.Exiting); - return; + throw; } var textLoaderOptions = columnInference.TextLoaderOptions; @@ -172,14 +169,10 @@ public void GenerateCode() } - catch (Exception e) + catch (Exception) { logger.Log(LogLevel.Error, $"{Strings.ExplorePipelineException}:"); - logger.Log(LogLevel.Error, e.Message); - logger.Log(LogLevel.Debug, e.ToString()); - logger.Log(LogLevel.Info, Strings.LookIntoLogFile); - logger.Log(LogLevel.Error, Strings.Exiting); - return; + throw; } var elapsedTime = watch.Elapsed.TotalSeconds; @@ -214,28 +207,50 @@ public void GenerateCode() break; } } - catch (Exception e) + catch (Exception) { logger.Log(LogLevel.Info, Strings.ErrorBestPipeline); - logger.Log(LogLevel.Info, e.Message); - logger.Log(LogLevel.Trace, e.ToString()); - logger.Log(LogLevel.Info, Strings.LookIntoLogFile); - logger.Log(LogLevel.Error, Strings.Exiting); - return; + throw; } // Save the model var modelprojectDir = Path.Combine(settings.OutputPath.FullName, $"{settings.Name}.Model"); var modelPath = new FileInfo(Path.Combine(modelprojectDir, "MLModel.zip")); - Utils.SaveModel(bestModel, modelPath, context, trainData.Schema); - Console.ForegroundColor = ConsoleColor.Yellow; - logger.Log(LogLevel.Info, $"{Strings.SavingBestModel}: {modelPath}"); + + try + { + Utils.SaveModel(bestModel, modelPath, context, trainData.Schema); + Console.ForegroundColor = ConsoleColor.Yellow; + logger.Log(LogLevel.Info, $"{Strings.SavingBestModel}: {modelPath}"); + } + catch (Exception) + { + logger.Log(LogLevel.Info, Strings.ErrorSavingModel); + throw; + } + finally + { + Console.ResetColor(); + } // Generate the Project - GenerateProject(columnInference, bestPipeline, columnInformation.LabelColumnName, modelPath); - logger.Log(LogLevel.Info, $"{Strings.GenerateModelConsumption}: { Path.Combine(settings.OutputPath.FullName, $"{settings.Name}.ConsoleApp")}"); - logger.Log(LogLevel.Info, $"{Strings.SeeLogFileForMoreInfo}: {settings.LogFilePath}"); - Console.ResetColor(); + try + { + GenerateProject(columnInference, bestPipeline, columnInformation.LabelColumnName, modelPath); + Console.ForegroundColor = ConsoleColor.Yellow; + logger.Log(LogLevel.Info, $"{Strings.GenerateModelConsumption}: { Path.Combine(settings.OutputPath.FullName, $"{settings.Name}.ConsoleApp")}"); + logger.Log(LogLevel.Info, $"{Strings.SeeLogFileForMoreInfo}: {settings.LogFilePath}"); + + } + catch (Exception) + { + logger.Log(LogLevel.Info, Strings.ErrorGeneratingProject); + throw; + } + finally + { + Console.ResetColor(); + } } internal void GenerateProject(ColumnInferenceResults columnInference, Pipeline pipeline, string labelName, FileInfo modelPath) diff --git a/src/mlnet/Commands/New/NewCommandHandler.cs b/src/mlnet/Commands/New/NewCommandHandler.cs index 1be9219143..e61803e6b8 100644 --- a/src/mlnet/Commands/New/NewCommandHandler.cs +++ b/src/mlnet/Commands/New/NewCommandHandler.cs @@ -2,14 +2,17 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; using Microsoft.DotNet.Cli.Telemetry; using Microsoft.ML.CLI.CodeGenerator; using Microsoft.ML.CLI.Data; +using NLog; namespace Microsoft.ML.CLI.Commands.New { internal class NewCommand : ICommand { + private static Logger logger = LogManager.GetCurrentClassLogger(); private readonly NewCommandSettings settings; private readonly MlTelemetry telemetry; @@ -21,10 +24,20 @@ internal NewCommand(NewCommandSettings settings, MlTelemetry telemetry) public void Execute() { - telemetry.LogAutoTrainMlCommand(settings.Dataset.FullName, settings.MlTask.ToString(), settings.Dataset.Length); - - CodeGenerationHelper codeGenerationHelper = new CodeGenerationHelper(new AutoMLEngine(settings), settings); // Needs to be improved. - codeGenerationHelper.GenerateCode(); + try + { + telemetry.LogAutoTrainMlCommand(settings.Dataset.FullName, settings.MlTask.ToString(), settings.Dataset.Length); + CodeGenerationHelper codeGenerationHelper = new CodeGenerationHelper(new AutoMLEngine(settings), settings); // Needs to be improved. + codeGenerationHelper.GenerateCode(); + } + catch (Exception e) + { + logger.Log(LogLevel.Error, e.Message); + logger.Log(LogLevel.Debug, e.ToString()); + logger.Log(LogLevel.Info, Strings.LookIntoLogFile); + logger.Log(LogLevel.Error, Strings.Exiting); + return; + } } } } diff --git a/src/mlnet/Program.cs b/src/mlnet/Program.cs index 8a2715243b..e60e19d016 100644 --- a/src/mlnet/Program.cs +++ b/src/mlnet/Program.cs @@ -18,6 +18,7 @@ namespace Microsoft.ML.CLI { class Program { + private static Logger logger = LogManager.GetCurrentClassLogger(); public static void Main(string[] args) { var telemetry = new MlTelemetry(); diff --git a/src/mlnet/Strings.resx b/src/mlnet/Strings.resx index e5f203d5f5..81b4ad8e13 100644 --- a/src/mlnet/Strings.resx +++ b/src/mlnet/Strings.resx @@ -192,4 +192,10 @@ Check out log file for more information + + Exception occured while generating the project. + + + Exception occured while saving the model + \ No newline at end of file diff --git a/src/mlnet/strings.Designer.cs b/src/mlnet/strings.Designer.cs index 85e622ca2d..7ae8e6bebc 100644 --- a/src/mlnet/strings.Designer.cs +++ b/src/mlnet/strings.Designer.cs @@ -87,6 +87,24 @@ internal static string ErrorBestPipeline { } } + /// + /// Looks up a localized string similar to Exception occured while generating the project.. + /// + internal static string ErrorGeneratingProject { + get { + return ResourceManager.GetString("ErrorGeneratingProject", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exception occured while saving the model. + /// + internal static string ErrorSavingModel { + get { + return ResourceManager.GetString("ErrorSavingModel", resourceCulture); + } + } + /// /// Looks up a localized string similar to Exiting .... /// From fe30ab663e4af5b57dfe90114e259dd6268b1944 Mon Sep 17 00:00:00 2001 From: Srujan Saggam Date: Tue, 30 Apr 2019 13:44:56 -0700 Subject: [PATCH 2/3] final handler --- src/mlnet/Commands/New/NewCommandHandler.cs | 17 +---- src/mlnet/Program.cs | 70 ++++++++++++--------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/src/mlnet/Commands/New/NewCommandHandler.cs b/src/mlnet/Commands/New/NewCommandHandler.cs index e61803e6b8..2fe0288944 100644 --- a/src/mlnet/Commands/New/NewCommandHandler.cs +++ b/src/mlnet/Commands/New/NewCommandHandler.cs @@ -24,20 +24,9 @@ internal NewCommand(NewCommandSettings settings, MlTelemetry telemetry) public void Execute() { - try - { - telemetry.LogAutoTrainMlCommand(settings.Dataset.FullName, settings.MlTask.ToString(), settings.Dataset.Length); - CodeGenerationHelper codeGenerationHelper = new CodeGenerationHelper(new AutoMLEngine(settings), settings); // Needs to be improved. - codeGenerationHelper.GenerateCode(); - } - catch (Exception e) - { - logger.Log(LogLevel.Error, e.Message); - logger.Log(LogLevel.Debug, e.ToString()); - logger.Log(LogLevel.Info, Strings.LookIntoLogFile); - logger.Log(LogLevel.Error, Strings.Exiting); - return; - } + telemetry.LogAutoTrainMlCommand(settings.Dataset.FullName, settings.MlTask.ToString(), settings.Dataset.Length); + CodeGenerationHelper codeGenerationHelper = new CodeGenerationHelper(new AutoMLEngine(settings), settings); // Needs to be improved. + codeGenerationHelper.GenerateCode(); } } } diff --git a/src/mlnet/Program.cs b/src/mlnet/Program.cs index e60e19d016..eb049ba827 100644 --- a/src/mlnet/Program.cs +++ b/src/mlnet/Program.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; using System.CommandLine.Builder; using System.CommandLine.Invocation; using System.IO; @@ -27,39 +28,50 @@ public static void Main(string[] args) var handler = CommandHandler.Create( (options) => { - // Map the verbosity to internal levels - var verbosity = Utils.GetVerbosity(options.Verbosity); - - // Build the output path - string outputBaseDir = string.Empty; - if (options.Name == null) + try { - - options.Name = "Sample" + Utils.GetTaskKind(options.MlTask).ToString(); - outputBaseDir = Path.Combine(options.OutputPath.FullName, options.Name); + // Map the verbosity to internal levels + var verbosity = Utils.GetVerbosity(options.Verbosity); + + // Build the output path + string outputBaseDir = string.Empty; + if (options.Name == null) + { + + options.Name = "Sample" + Utils.GetTaskKind(options.MlTask).ToString(); + outputBaseDir = Path.Combine(options.OutputPath.FullName, options.Name); + } + else + { + outputBaseDir = Path.Combine(options.OutputPath.FullName, options.Name); + } + + // Override the output path + options.OutputPath = new DirectoryInfo(outputBaseDir); + + // Instantiate the command + var command = new NewCommand(options, telemetry); + + // Override the Logger Configuration + var logconsole = LogManager.Configuration.FindTargetByName("logconsole"); + var logfile = (FileTarget)LogManager.Configuration.FindTargetByName("logfile"); + var logFilePath = Path.Combine(Path.Combine(outputBaseDir, "logs"), "debug_log.txt"); + logfile.FileName = logFilePath; + options.LogFilePath = logFilePath; + var config = LogManager.Configuration; + config.AddRule(verbosity, LogLevel.Fatal, logconsole); + + // Execute the command + command.Execute(); } - else + catch (Exception e) { - outputBaseDir = Path.Combine(options.OutputPath.FullName, options.Name); + logger.Log(LogLevel.Error, e.Message); + logger.Log(LogLevel.Debug, e.ToString()); + logger.Log(LogLevel.Info, Strings.LookIntoLogFile); + logger.Log(LogLevel.Error, Strings.Exiting); + return; } - - // Override the output path - options.OutputPath = new DirectoryInfo(outputBaseDir); - - // Instantiate the command - var command = new NewCommand(options, telemetry); - - // Override the Logger Configuration - var logconsole = LogManager.Configuration.FindTargetByName("logconsole"); - var logfile = (FileTarget)LogManager.Configuration.FindTargetByName("logfile"); - var logFilePath = Path.Combine(Path.Combine(outputBaseDir, "logs"), "debug_log.txt"); - logfile.FileName = logFilePath; - options.LogFilePath = logFilePath; - var config = LogManager.Configuration; - config.AddRule(verbosity, LogLevel.Fatal, logconsole); - - // Execute the command - command.Execute(); }); var parser = new CommandLineBuilder() From b86d79fb74e64ac10972837efcc0cfa06dbcf831 Mon Sep 17 00:00:00 2001 From: Srujan Saggam Date: Tue, 30 Apr 2019 14:10:16 -0700 Subject: [PATCH 3/3] revert file --- src/mlnet/Commands/New/NewCommandHandler.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mlnet/Commands/New/NewCommandHandler.cs b/src/mlnet/Commands/New/NewCommandHandler.cs index 2fe0288944..1be9219143 100644 --- a/src/mlnet/Commands/New/NewCommandHandler.cs +++ b/src/mlnet/Commands/New/NewCommandHandler.cs @@ -2,17 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using Microsoft.DotNet.Cli.Telemetry; using Microsoft.ML.CLI.CodeGenerator; using Microsoft.ML.CLI.Data; -using NLog; namespace Microsoft.ML.CLI.Commands.New { internal class NewCommand : ICommand { - private static Logger logger = LogManager.GetCurrentClassLogger(); private readonly NewCommandSettings settings; private readonly MlTelemetry telemetry; @@ -25,6 +22,7 @@ internal NewCommand(NewCommandSettings settings, MlTelemetry telemetry) public void Execute() { telemetry.LogAutoTrainMlCommand(settings.Dataset.FullName, settings.MlTask.ToString(), settings.Dataset.Length); + CodeGenerationHelper codeGenerationHelper = new CodeGenerationHelper(new AutoMLEngine(settings), settings); // Needs to be improved. codeGenerationHelper.GenerateCode(); }