Repository navigation
Description
System Information (please complete the following information):
- OS & Version: Windows 11 [Version 10.0.22621.675]
- ML.NET Version: ML.NT v2.0.0-preview.22525.3
- .NET Version: .NET 6.0.9
Describe the bug
I created a custom class that implements the Microsoft.ML.AutoML.IMonitor to monitor my training. It's ReportRunningTrial method has the following simple implementation:
_logger.LogInformation($"{"Running".PadLeft(9)} Trial #{setting.TrialId.ToString().PadLeft(4)} - Pipeline: {_pipeline.ToString(setting.Parameter).PadRight(70)}");
The other, ReportBestTrial, ReportCompletedTrial and ReportFailTrial methods look very similar.
When I run my training it looks like that the ReportRunningTrial method's pipeline object wasn't updated, so it doesn't show the pipeline of the current trial.
To Reproduce
Steps to reproduce the behavior:
- Create a custom class that implements IMonitor
- Create an ML.NET experiment, and use that monitor class, like this:
var experiment = mlContext.Auto().CreateExperiment();
experiment
.SetPipeline(pipeline)
.SetTrainingTimeInSeconds(trainingTimeInSeconds)
.SetRegressionMetric(RegressionMetric.RSquared, labelColumn: "Label")
.SetDataset(trainTestData.TrainSet, trainTestData.TestSet)
.SetMonitor(monitor)
.SetMaximumMemoryUsageInMegaByte(20 * 1024);
- Make sure that you allow more than one type of (regression) algorithms
- Run the experiment
- Check the output: you will see that the
settings.TrialIdproperty values look good, but the_pipeline.ToString(setting.Parameter)returns an invalid value in theReportRunningTrialmethod.
Expected behavior
The _pipeline.ToString(setting.Parameter) should return the just-started trial's pipeline.
Screenshots, Code, Sample Projects

Additional context
You can see the problem on the screenshot:
Running Trial 0's pipeline looks like it was FastTreeRegression, but in reality it's FastForestRegression.
Running Trial 1's pipeline looks like it was FastForestRegression, but it's FastTreeRegression.
Running Trial 2's pipeline looks like it was FastForestRegression, but it's LightGbmRegression.
etc.
Edit: After testing a little more I'm not sure anymore which methods of the IMonitor interface report the pipeline wrong, it is possible that ReportRunningTrial is the correct one and the others are incorrect.
Activity
luisquintanilla commentedon Dec 1, 2022
@LittleLittleCloud thoughts on this one?
andrasfuchs commentedon Dec 2, 2022
After I looked into the ML.NET code a little more, my current understanding is that we don't know the last estimator when the
IMonitor'sReportRunningTrial()event is called. The last estimator is set only after we callrunner.RunAsync()and that's why the"Running Trial"lines in my log show the pipeline incorrectly (they have a previously set value).I modified my event handler code to not show the pipeline at that point, but I think it would be a little better if the
TrialSettingsclass that is passed to allIMonitorevent handlers would contain a nullable property with the last (or all) estimator(s).LittleLittleCloud commentedon Dec 2, 2022
@andrasfuchs does the original monitor also print incorrect pipeline
andrasfuchs commentedon Dec 2, 2022
You mean the
MLContextMonitorclass in IMonitor.cs? Yes, I think so.