Skip to content
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

Merged
merged 1 commit into from
Oct 10, 2018
Merged

Move towards being able to build for x86 #1008

merged 1 commit into from
Oct 10, 2018

Conversation

tannergooding
Copy link
Member

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.

@tannergooding
Copy link
Member Author

CC. @eerhardt

@tannergooding
Copy link
Member Author

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.

@tannergooding
Copy link
Member Author

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, init-tools.cmd only pulls down the x64 CLI and it uses that when attempting to run the tests.

Directory.Build.props Outdated Show resolved Hide resolved
@@ -18,7 +19,7 @@ public NormalizerTests(ITestOutputHelper output) : base(output)
{
}

[Fact]
[ConditionalFact(typeof(Environment), nameof(Environment.Is64BitProcess))]
Copy link
Member

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?

Copy link
Member Author

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.

Copy link
Member

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))]
Copy link
Member

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."
Copy link
Member

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?

Copy link
Member

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)

Copy link
Member

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)

Copy link
Member Author

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.

Copy link
Member

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)?

Copy link
Member Author

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.

Copy link
Member

@eerhardt eerhardt Oct 10, 2018

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:

  1. It is self-documenting, like @danmosemsft said.
  2. It is centralized, so if it ever needs to be updated, only need to update a single spot.
  3. We can add any rules we want into the method, where you can't do this in a single attribute.
  4. 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.

Copy link
Member Author

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)

Copy link
Member

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.

Copy link
Member Author

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
Copy link
Member

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.

Copy link
Member Author

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.

Copy link
Member

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.

Copy link
Member Author

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).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -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"
Copy link
Member

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.

Copy link
Member

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.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was there a follow up issue for this?


In reply to: 222758690 [](ancestors = 222758690)

Copy link
Member Author

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.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tannergooding
Copy link
Member Author

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 digitsOfPrecision: 4.

@tannergooding
Copy link
Member Author

@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.

@sfilipi
Copy link
Member

sfilipi commented Oct 9, 2018

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
Copy link
Member

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.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

@sfilipi sfilipi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

Copy link
Member

@eerhardt eerhardt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@ghost ghost locked as resolved and limited conversation to collaborators Mar 28, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants