pytorch/caffe2/python/serialized_test
Ansha Yu 8ff435c8f6 Use tempfile during serialized test comparison (#12021)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/12021

TestPilot runs stress tests in parallel. These fail for serialized tests because extracting (and subsequent deletion) of binary data during the process isn't threadsafe. Extract zips into tempfile to avoid this problem.

Also remove some accidentally checked in zips of a test that we didn't end up including for now.

Reviewed By: houseroad

Differential Revision: D10013682

fbshipit-source-id: 6e13b850b38dee4106d3c10a9372747d17b67c5a
2018-09-25 20:55:45 -07:00
..
data/operator_test Use tempfile during serialized test comparison (#12021) 2018-09-25 20:55:45 -07:00
__init__.py framework for committed serialized tests (#10594) 2018-08-30 22:41:46 -07:00
README.md Refactor tests part 2 (#11811) 2018-09-19 10:09:28 -07:00
serialized_test_util.py Use tempfile during serialized test comparison (#12021) 2018-09-25 20:55:45 -07:00

Serialized operator test framework

Major functionality lives in serialized_test_util.py

How to use

  1. Extend the test case class from SerializedTestCase
  2. Change the @given decorator 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.
  3. [Optional] Add (or change a call of unittest.main() to) testWithArgs in __main__. This allows you to generate outputs using python caffe2/python/operator_test/my_test.py -G.
  4. Run your test python -m pytest caffe2/python/operator_test/my_test.py -G to generate serialized outputs. They will live in caffe2/python/serialized_test/data/operator_test, one zip file per test function. The zip file contains an inout.npz file of the inputs, outputs, and meta data (like device type), a op.pb file of the operator, and grad_#.pb files of the gradients if there are any. Use -O to change the output directory.
  5. 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.

##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. Hypothis 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.