-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Move towards being able to build for x86 #1008
Conversation
CC. @eerhardt |
Most of the skipped tests are due to a x64 only dependency (TensorFlow or LightGBM). Some of them were caused by differences in the baseline vs actual output. |
In order to be able to run tests from the command line, we will need some kind of "test-host" logic, possibly similar to what CoreFX has. Right now, |
src/Microsoft.ML.DnnAnalyzer/Microsoft.ML.DnnAnalyzer/Microsoft.ML.DnnAnalyzer.csproj
Show resolved
Hide resolved
@@ -18,7 +19,7 @@ public NormalizerTests(ITestOutputHelper output) : base(output) | |||
{ | |||
} | |||
|
|||
[Fact] | |||
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about this test and the below test require x64? I don't see tensorflow or lightgbm in the tests. Are there other things that only work on x64?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As mentioned here: #1008 (comment), there are a few tests which have different outputs from the baseline.
These need further investigation and potentially fixes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's put that in the code comments then, so we know which ones need to be investigated, and which ones don't.
@@ -812,7 +812,7 @@ public void CommandCrossValidation() | |||
Done(); | |||
} | |||
|
|||
[Fact] | |||
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar question here - what requires x64?
@@ -57,7 +57,7 @@ public OnnxTransformTests(ITestOutputHelper output) : base(output) | |||
{ | |||
} | |||
|
|||
[Fact] | |||
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))] // x86 fails with "An attempt was made to load a program with an incorrect format." |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I assume Onnx support (i.e. Microsoft.ML.Scoring) is 64-bit only. @shmoradims @jignparm - can you confirm?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If so it might be more self documenting to have something like [ConditionalFact(typeof(TestUtilities), nameof(TestUtilities.IsOnnxScoringSupported))]
(and similar for TF)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Was there a response to this feedback? I think this seems like a good idea. Or perhaps even deriving a few fact attributes like OnnxFact
or TensorflowFact
, etc.
In reply to: 222758463 [](ancestors = 222758463)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure its worth the added overhead to declare a new fact, which itself calls Environment.Is64BitProcess
.
The current conditional fact requires no "new" code and clearly defines that it is only supported on 64-bit processes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And when we try to add Aarch64
(i.e. arm64
)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then we will need to re-review any of the currently disabled tests and possibly change this based on whether they support ARM and/or ARM64.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are multiple advantages to taking the above approach:
- It is self-documenting, like @danmosemsft said.
- It is centralized, so if it ever needs to be updated, only need to update a single spot.
- We can add any rules we want into the method, where you can't do this in a single attribute.
- It sets a good pattern for other tests to follow.
The only disadvantage I see is the small amount of effort it is going to take to make this change.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@eerhardt, do you have any problem with logging a tracking issue to improve this?
I'd like to get this merged in order to unblock people and I don't think it's going to be as trivial as just defining some new attributes, since we will need to do something different for .NET Core (where we need to instead check the S.R.InteropServices.Architecture
of the process)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that's fine with me.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@@ -102,7 +102,7 @@ public IList<TestDataset> GetDatasetsForClassificationWeightingPredictorsTest() | |||
/// <summary> | |||
///A test for binary classifiers | |||
///</summary> | |||
[Fact] | |||
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))] // x86 output differs from Baseline |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should fix/adjust the baseline mechanism so tests like this can be executed. We shouldn't disable tests just because the baseline differs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree, but it requires more investigation to determine what differs and why. I saw a number of other tests that are already disabled due to baseline differences as well (for all targets), that also need investigation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you, at minimum, log an issue to address the x86 baseline differences?
other tests that are already disabled
Those tests have never been enabled in dotnet/machinelearning. They were ported to this repo and immediately disabled.
IMO, the existing test shortcomings in this repo aren't valid reasons for not following good practices going forward. We need to actively make things better, or else it won't get better.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking at a handful of the differences, they generally seem to be minor differences in the computed result (for example: 1.4157174495771871
vs 1.4157174495771872
). This is likely fallout from alignment differences and algorithm differences for various System.Math
(and other) functions.
The comparison logic, in general, likely needs an overhaul (to properly account for these differences cross-architecture and cross-platform).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CC. @GalOshri, @shauheen, @TomFinley, @Zruty0
@@ -587,7 +587,7 @@ public void RankingLightGBMTest() | |||
Done(); | |||
} | |||
|
|||
[Fact] | |||
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))] // x86 fails with "Unknown command: 'train'; Format error at (83,3)-(83,4011): Illegal quoting" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be investigated and fixed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could perhaps be a follow up issue if @tannergooding isn't the right person to investigate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've not logged issues for anything that requires followup yet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We will need to update: https://github.com/dotnet/machinelearning/blob/master/pkg/common/CommonPackage.props so we can support x86 on .NET Framework. |
Updated. Significantly fewer tests disabled now. The ones that are still disabled depend on a 64-bit only native component or currently have results that don't match for |
@sfilipi, would you be able to give this a quick review? As per above, there are still a few tests that are disabled due to having less than 4 matching significant digits. From a brief look, some of these are caused by bugs in the parser/formatter code for full framework that have been fixed (or are being fixed) in .NET Core. |
Taking a look shortly! In reply to: 428336304 [](ancestors = 428336304) |
@@ -192,7 +192,7 @@ public void MulticlassSdcaTest() | |||
/// <summary> | |||
/// Multiclass Logistic Regression test with a tree featurizer. | |||
/// </summary> | |||
[Fact] | |||
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))] // x86 output differs from Baseline |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))] // x86 output differs from Baseline [](start = 8, length = 110)
Let's add an issue to create baselines for those x86 tests, after checking that the difference is ok.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is work towards #97
It allows you to build using
build.cmd -buildArch=x86
and, if you manually set the correct testhost, it allows the tests to pass.