Summary: Pull Request resolved: https://github.com/pytorch/pytorch/pull/33431 Some elementwise operators don't have shape and type inference specified for the output tensor: `BitwiseOr`, `BitwiseAnd`, `BitwiseXor`, `Not`, `Sign`. This change fixes this issue: - For `Not` and `Sign` operators, the output has the same type and shape as the input, so `IdenticalTypeAndShapeOfInput` function is used to specify that. - For bitwise operators created by `CAFFE2_SCHEMA_FOR_BINARY_BITWISE_OP` macro, the type and shape inference rules should be the same as for other binary element-wise operators, so `TensorInferenceFunction(ElementwiseOpShapeInference)` is used to specify that. Also some tests were modified to ensure that the shape and type are inferred (`ensure_outputs_are_inferred` parameter) Test Plan: ``` CAFFE2_ASSERT_SHAPEINFERENCE=1 buck test caffe2/caffe2/python/operator_test:elementwise_ops_test CAFFE2_ASSERT_SHAPEINFERENCE=1 buck test caffe2/caffe2/python/operator_test:math_ops_test ``` Note that the tests have to be executed with `CAFFE2_ASSERT_SHAPEINFERENCE=1` in order to fail upon shape inference failure. Reviewed By: idning Differential Revision: D19880164 fbshipit-source-id: 5d7902e045d79e5669e5e98dfb13a39711294939 |
||
|---|---|---|
| .. | ||
| data/operator_test | ||
| __init__.py | ||
| coverage.py | ||
| README.md | ||
| serialized_test_util.py | ||
| SerializedTestCoverage.md | ||
Serialized operator test framework
Major functionality lives in serialized_test_util.py
How to use
- Extend the test case class from
SerializedTestCase - Change the
@givendecorator to@serialized_test_util.given. This runs a seeded hypothesis test instance which will generate outputs if desired in addition to the unseeded hypothesis tests normally run. - [Optional] Add (or change a call of
unittest.main()to)testWithArgsin__main__. This allows you to generate outputs usingpython caffe2/python/operator_test/my_test.py -G. - Run your test
python -m pytest caffe2/python/operator_test/my_test.py -Gto generate serialized outputs. They will live incaffe2/python/serialized_test/data/operator_test, one zip file per test function. The zip file contains aninout.npzfile of the inputs, outputs, and meta data (like device type), aop.pbfile of the operator, andgrad_#.pbfiles of the gradients if there are any. Use-Oto change the output directory. This also generates a markdown document summarizing the coverage of serialized tests. We can disable generating this coverage document using the-Cflag. - Thereafter, runs of the test without the flag will load serialized outputs and gradient operators for comparison against the seeded run. The comparison is done as long as you have a call to assertReferenceChecks. If for any reason the seeded run's inputs are different (this can happen with different hypothesis versions or different setups), then we'll run the serialized inputs through the serialized operator to get a runtime output for comparison.
Coverage report
SerializedTestCoverage.md contains some statistics about the coverage of serialized tests. It is regenerated every time someone regenerates a serialized test (i.e. running an operator test with the -G option). If you run into merge conflicts for the file, please rebase and regenerate. If you'd like to disable generating this file when generating the serialized test, you can run with -G -C. The logic for generating this file lives in coverage.py.
##Additional Notes
If we'd like to extend the test framework beyond that for operator tests, we can create a new subfolder for them inside caffe2/python/serialized_test/data.
Note, we currently don't support using other hypothesis decorators on top of given_and_seeded. Hypothesis has some handling to explicitly check that @given is on the bottom of the decorator stack.
If there are multiple calls to assertReferenceChecks in a test function, we'll serialize and write the last one. The actual input checked may then differ if we refactor a test function that calls this multiple times, though the serialized test should still pass since we then use the serialized input to generate a dynamic output.