1
- using System . IO ;
1
+ using System ;
2
+ using System . IO ;
2
3
using System . Linq ;
3
4
using System . Runtime . InteropServices ;
4
5
using System . Text . RegularExpressions ;
@@ -31,7 +32,7 @@ public OnnxConversionTest(ITestOutputHelper output) : base(output)
31
32
/// <summary>
32
33
/// In this test, we convert a trained <see cref="TransformerChain"/> into ONNX <see cref="UniversalModelFormat.Onnx.ModelProto"/> file and then
33
34
/// call <see cref="OnnxScoringEstimator"/> to evaluate that file. The outputs of <see cref="OnnxScoringEstimator"/> are checked against the original
34
- /// ML.NET model's outputs.
35
+ /// ML.NET model's outputs.
35
36
/// </summary>
36
37
[ Fact ]
37
38
public void SimpleEndToEndOnnxConversionTest ( )
@@ -52,12 +53,12 @@ public void SimpleEndToEndOnnxConversionTest()
52
53
var transformedData = model . Transform ( data ) ;
53
54
54
55
// Step 2: Convert ML.NET model to ONNX format and save it as a file.
55
- var onnxModel = mlContext . Model . Portability . ConvertToOnnx ( model , data ) ;
56
+ var onnxModel = mlContext . Model . ConvertToOnnx ( model , data ) ;
56
57
var onnxFileName = "model.onnx" ;
57
58
var onnxModelPath = GetOutputPath ( onnxFileName ) ;
58
59
SaveOnnxModel ( onnxModel , onnxModelPath , null ) ;
59
60
60
- if ( RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) )
61
+ if ( RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) && Environment . Is64BitProcess )
61
62
{
62
63
// Step 3: Evaluate the saved ONNX model using the data used to train the ML.NET pipeline.
63
64
string [ ] inputNames = onnxModel . Graph . Input . Select ( valueInfoProto => valueInfoProto . Name ) . ToArray ( ) ;
@@ -70,7 +71,8 @@ public void SimpleEndToEndOnnxConversionTest()
70
71
CompareSelectedR4ScalarColumns ( "Score" , "Score0" , transformedData , onnxResult , 2 ) ;
71
72
}
72
73
73
- // Step 5: Check ONNX model's text format.
74
+ // Step 5: Check ONNX model's text format. This test will be not necessary if Step 3 and Step 4 can run on Linux and
75
+ // Mac to support cross-platform tests.
74
76
var subDir = Path . Combine ( ".." , ".." , "BaselineOutput" , "Common" , "Onnx" , "Regression" , "Adult" ) ;
75
77
var onnxTextName = "SimplePipeline.txt" ;
76
78
var onnxTextPath = GetOutputPath ( subDir , onnxTextName ) ;
@@ -86,11 +88,6 @@ private class BreastCancerFeatureVector
86
88
public float [ ] Features ;
87
89
}
88
90
89
- private void CreateDummyExamplesToMakeComplierHappy ( )
90
- {
91
- var dummyExample = new BreastCancerFeatureVector ( ) { Features = null } ;
92
- }
93
-
94
91
[ Fact ]
95
92
public void KmeansOnnxConversionTest ( )
96
93
{
@@ -102,24 +99,24 @@ public void KmeansOnnxConversionTest()
102
99
// Now read the file (remember though, readers are lazy, so the actual reading will happen when the data is accessed).
103
100
var data = mlContext . Data . ReadFromTextFile < BreastCancerFeatureVector > ( dataPath ,
104
101
hasHeader : true ,
105
- separatorChar : '\t ' ) ;
102
+ separatorChar : '\t ' ) ;
106
103
107
104
var pipeline = mlContext . Transforms . Normalize ( "Features" ) .
108
105
Append ( mlContext . Clustering . Trainers . KMeans ( features : "Features" , advancedSettings : settings =>
109
106
{
110
- settings . MaxIterations = 1 ;
111
- settings . K = 4 ;
112
- settings . NumThreads = 1 ;
113
- settings . InitAlgorithm = Trainers . KMeans . KMeansPlusPlusTrainer . InitAlgorithm . KMeansPlusPlus ;
107
+ settings . MaxIterations = 1 ;
108
+ settings . K = 4 ;
109
+ settings . NumThreads = 1 ;
110
+ settings . InitAlgorithm = Trainers . KMeans . KMeansPlusPlusTrainer . InitAlgorithm . KMeansPlusPlus ;
114
111
} ) ) ;
115
112
116
113
var model = pipeline . Fit ( data ) ;
117
114
var transformedData = model . Transform ( data ) ;
118
115
119
- var onnxModel = mlContext . Model . Portability . ConvertToOnnx ( model , data ) ;
116
+ var onnxModel = mlContext . Model . ConvertToOnnx ( model , data ) ;
120
117
121
118
// Compare results produced by ML.NET and ONNX's runtime.
122
- if ( RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) )
119
+ if ( RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) && Environment . Is64BitProcess )
123
120
{
124
121
var onnxFileName = "model.onnx" ;
125
122
var onnxModelPath = GetOutputPath ( onnxFileName ) ;
@@ -134,6 +131,9 @@ public void KmeansOnnxConversionTest()
134
131
CompareSelectedR4VectorColumns ( "Score" , "Score0" , transformedData , onnxResult , 3 ) ;
135
132
}
136
133
134
+ // Check ONNX model's text format. We save the produced ONNX model as a text file and compare it against
135
+ // the associated file in ML.NET repo. Such a comparison can be retired if ONNXRuntime ported to ML.NET
136
+ // can support Linux and Mac.
137
137
var subDir = Path . Combine ( ".." , ".." , "BaselineOutput" , "Common" , "Onnx" , "Cluster" , "BreastCancer" ) ;
138
138
var onnxTextName = "Kmeans.txt" ;
139
139
var onnxTextPath = GetOutputPath ( subDir , onnxTextName ) ;
@@ -142,7 +142,12 @@ public void KmeansOnnxConversionTest()
142
142
Done ( ) ;
143
143
}
144
144
145
- private void CompareSelectedR4VectorColumns ( string leftColumnName , string rightColumnName , IDataView left , IDataView right , int precision = 6 )
145
+ private void CreateDummyExamplesToMakeComplierHappy ( )
146
+ {
147
+ var dummyExample = new BreastCancerFeatureVector ( ) { Features = null } ;
148
+ }
149
+
150
+ private void CompareSelectedR4VectorColumns ( string leftColumnName , string rightColumnName , IDataView left , IDataView right , int precision = 6 )
146
151
{
147
152
var leftColumnIndex = left . Schema [ leftColumnName ] . Index ;
148
153
var rightColumnIndex = right . Schema [ rightColumnName ] . Index ;
@@ -166,7 +171,7 @@ private void CompareSelectedR4VectorColumns(string leftColumnName, string rightC
166
171
}
167
172
}
168
173
169
- private void CompareSelectedR4ScalarColumns ( string leftColumnName , string rightColumnName , IDataView left , IDataView right , int precision = 6 )
174
+ private void CompareSelectedR4ScalarColumns ( string leftColumnName , string rightColumnName , IDataView left , IDataView right , int precision = 6 )
170
175
{
171
176
var leftColumnIndex = left . Schema [ leftColumnName ] . Index ;
172
177
var rightColumnIndex = right . Schema [ rightColumnName ] . Index ;
0 commit comments