diff --git a/src/Microsoft.ML.AutoML/Experiment/Runners/CrossValRunner.cs b/src/Microsoft.ML.AutoML/Experiment/Runners/CrossValRunner.cs index 98e54d4b46..7f37eaef0d 100644 --- a/src/Microsoft.ML.AutoML/Experiment/Runners/CrossValRunner.cs +++ b/src/Microsoft.ML.AutoML/Experiment/Runners/CrossValRunner.cs @@ -53,7 +53,7 @@ public CrossValRunner(MLContext context, var modelFileInfo = RunnerUtil.GetModelFileInfo(modelDirectory, iterationNum, i + 1); var trainResult = RunnerUtil.TrainAndScorePipeline(_context, pipeline, _trainDatasets[i], _validDatasets[i], _labelColumn, _metricsAgent, _preprocessorTransforms?[i], modelFileInfo, _modelInputSchema, _logger); - trainResults.Add(new SuggestedPipelineTrainResult(trainResult.model, trainResult.metrics, trainResult.exception, trainResult.score)); + trainResults.Add(new SuggestedPipelineTrainResult(trainResult.modelContainer, trainResult.metrics, trainResult.exception, trainResult.score)); } var avgScore = CalcAverageScore(trainResults.Select(r => r.Score)); diff --git a/src/Microsoft.ML.AutoML/Experiment/Runners/RunnerUtil.cs b/src/Microsoft.ML.AutoML/Experiment/Runners/RunnerUtil.cs index c6aeef49a5..a1625a56a0 100644 --- a/src/Microsoft.ML.AutoML/Experiment/Runners/RunnerUtil.cs +++ b/src/Microsoft.ML.AutoML/Experiment/Runners/RunnerUtil.cs @@ -10,7 +10,7 @@ namespace Microsoft.ML.AutoML { internal static class RunnerUtil { - public static (ModelContainer model, TMetrics metrics, Exception exception, double score) + public static (ModelContainer modelContainer, TMetrics metrics, Exception exception, double score) TrainAndScorePipeline(MLContext context, SuggestedPipeline pipeline, IDataView trainData, diff --git a/src/Microsoft.ML.AutoML/Experiment/Runners/TrainValidateRunner.cs b/src/Microsoft.ML.AutoML/Experiment/Runners/TrainValidateRunner.cs index d608f7dd2f..4289f45a0c 100644 --- a/src/Microsoft.ML.AutoML/Experiment/Runners/TrainValidateRunner.cs +++ b/src/Microsoft.ML.AutoML/Experiment/Runners/TrainValidateRunner.cs @@ -50,7 +50,7 @@ public TrainValidateRunner(MLContext context, trainResult.score, trainResult.exception == null, trainResult.metrics, - trainResult.model, + trainResult.modelContainer, trainResult.exception); var runDetail = suggestedPipelineRunDetail.ToIterationResult(_preFeaturizer); return (suggestedPipelineRunDetail, runDetail); diff --git a/src/Microsoft.ML.Vision/ImageClassificationTrainer.cs b/src/Microsoft.ML.Vision/ImageClassificationTrainer.cs index 79973cd23b..cbaabc4337 100644 --- a/src/Microsoft.ML.Vision/ImageClassificationTrainer.cs +++ b/src/Microsoft.ML.Vision/ImageClassificationTrainer.cs @@ -1493,6 +1493,12 @@ ValueMapper IValueMapper.GetMapper() } public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + public void Dispose(bool disposing) { if (_isDisposed) return; @@ -1509,5 +1515,12 @@ public void Dispose() _isDisposed = true; } + + // Finalizer to clean-up remaining Tensor objects generated in TensorFlow C libraries + // not cleaned up by GC + ~ImageClassificationModelParameters() + { + Dispose(false); + } } } diff --git a/test/Microsoft.ML.AutoML.Tests/AutoFitTests.cs b/test/Microsoft.ML.AutoML.Tests/AutoFitTests.cs index 6523f89f0d..30b1251980 100644 --- a/test/Microsoft.ML.AutoML.Tests/AutoFitTests.cs +++ b/test/Microsoft.ML.AutoML.Tests/AutoFitTests.cs @@ -54,8 +54,6 @@ public void AutoFitMultiTest() } [TensorFlowFact] - //Skipping test temporarily. This test will be re-enabled once the cause of failures has been determined - [Trait("Category", "SkipInCI")] public void AutoFitImageClassificationTrainTest() { var context = new MLContext(seed: 1);