pytorch/test/cpp/jit
Michael Suo 341262754f module dedupe (#26666)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/26666

Changes:
- Introduce a `ConcreteModuleType` concept. This acts both as the key into the type
  cache, and as the source of truth for `ModuleValue::attr` queries. It needs
  to do both jobs because that's how we ensure correctness (if the types are
  different, it's because `ModuleValue::attr` would return different things).
- Now `recursive_script` will first construct a `ConcreteModuleType` and search for a
  pre-existing type before starting compilation.
- All previous paths to creating a `ScriptModule` (including inheriting from
  `ScriptModule`) are now rewritten to go through `create_script_module`, so
  that we have only a single place where construction happens.

Behavioral changes:
- Big change to `torch.jit.ScriptModule` inheritance: all attributes are now
  recursively scripted if possible, matching recursive scripting semantics.
  This makes it hard to keep something from being scripted (for example, a
  Python submodule). Possibly we'll need an `ignore()` type thing for
  attributes. In particular, this adds `self.training` to *every* ScriptModule, since
  it's present on every `nn.Module`.
- I believe this change to be transparent to existing users of the inheritance API, since if you had an attribute that is unscriptable that you never used, there is no error. In some cases, we will create new attributes (even if they are unused), which will increase serialized model size from before.

Test Plan: Imported from OSS

Differential Revision: D17551196

Pulled By: suo

fbshipit-source-id: b476d1c9feb3ddfd63406d90989aaf9dfe890591
2019-10-12 09:51:57 -07:00
..
__init__.py Add train() / eval() / is_training() to C++ ScriptModule API (#16044) 2019-02-01 13:07:38 -08:00
CMakeLists.txt Enable jit fusion on ROCm (#22872) 2019-09-05 18:22:08 -07:00
gtest.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
README.md big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_alias_analysis.cpp Make schema part of RegisterOperators::Options (#26114) 2019-09-13 13:52:32 -07:00
test_argument_spec.cpp Merge ProfiledTensorType and TensorType (#24284) 2019-08-20 13:01:28 -07:00
test_autodiff.cpp Merge ProfiledTensorType and TensorType (#24284) 2019-08-20 13:01:28 -07:00
test_base.h Use AT_INTERNAL_ASSERT in test_base (#20555) 2019-05-21 21:25:07 -07:00
test_class_import.cpp module dedupe (#26666) 2019-10-12 09:51:57 -07:00
test_class_parser.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_code_template.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_constant_pooling.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_constant_propagation.cpp Whenever possible, use function pointers rather than std::function to represent Operation's. (#26560) 2019-09-21 20:51:24 -07:00
test_create_autodiff_subgraphs.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_custom_operators.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_dce.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_fuser.cpp Remove unused DynamicDAG class. 2019-08-20 16:17:59 -07:00
test_graph_executor.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_inliner.cpp Use optimized graph in Inline (essentially, making Inline recursive now). (#26489) 2019-09-24 00:22:29 -07:00
test_interpreter.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_ir.cpp Removes SymbolicVariable from tests (#24007) 2019-08-19 20:49:37 -07:00
test_irparser.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_ivalue.cpp Add tuple constructor + to<std::tuple<Args...>> (#26668) 2019-09-30 11:00:48 -07:00
test_lite_interpreter.cpp Disable TSAN test for LiteInterpreterConv (#27748) 2019-10-11 14:05:33 -07:00
test_misc.cpp more profiler changes in C++ before enabling checkScript changes 2019-10-03 10:39:54 -07:00
test_netdef_converter.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_peephole_optimize.cpp Removes SymbolicVariable (#25077) 2019-08-31 11:19:50 -07:00
test_qualified_name.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_save_load.cpp Fix circular deps in loading (#26758) 2019-09-26 11:39:16 -07:00
test_schema_matching.cpp Whenever possible, use function pointers rather than std::function to represent Operation's. (#26560) 2019-09-21 20:51:24 -07:00
test_subgraph_matcher.cpp Removes SymbolicVariable from tests (#24007) 2019-08-19 20:49:37 -07:00
test_subgraph_rewriter.cpp Add filter function to subgraph rewriter runGraph (#26223) 2019-09-18 16:34:50 -07:00
test_subgraph_utils.cpp big cpp test reorg (#24801) 2019-08-18 16:49:56 -07:00
test_utils.cpp autodiff changes to enable profiling 2019-09-25 10:11:44 -07:00
test_utils.h Removes SymbolicVariable from tests (#24007) 2019-08-19 20:49:37 -07:00
tests_setup.py Report errors through call stack (#22280) 2019-07-09 16:41:22 -07:00
tests.h Add OPN instruction and vararg operator table (#27104) 2019-10-04 09:35:53 -07:00
torch_python_test.cpp Fix misuages for TORCH_CHECK/TORCH_INTERNAL_ASSERT with string (#26897) 2019-09-27 13:45:19 -07:00

JIT C++ Tests

How to add a new test

First, create a new test file. Test files should have be placed in this directory, with a name that starts with test_, like test_foo.cpp.

Here is an example test file you can copy-paste.

#include <test/cpp/jit/test_base.h>

// Tests go in torch::jit
namespace torch {
namespace jit {

// 1. Test cases are void() functions.
// 2. They start with the prefix `test`
void testCaseOne() {
    // ...
}

void testCaseTwo() {
    // ...
}
}
}

Then, register your test in tests.h:

// Add to TH_FORALL_TESTS_CUDA instead for CUDA-requiring tests
#define TH_FORALL_TESTS(_)             \
  _(ADFormulas)                        \
  _(Attributes)                        \
  ...
  _(CaseOne)  // note that the `test` prefix is omitted.
  _(CaseTwo)

We glob all the test files together in CMakeLists.txt so that you don't have to edit it every time you add a test. Unfortunately, this means that in order to get the build to pick up your new test file, you need to re-run cmake:

python setup.py build --cmake

Why do we have two different test runners?

We have two different ways of running our cpp tests:

  1. With gtest, from a standalone binary.
  2. With Python, from TestJit.test_cpp and TestJit.test_cpp_cuda (in test/test_jit.py)

We want both because we need to test things from a pure-C++ environment and with all our various Python patch-points enabled.

How do I run the tests?

The following commands assume you are in PyTorch root.

  1. With gtest:
    # (re)build the test binary
    ninja build/bin/test_jit
    # run
    build/bin/test_jit --gtest_filter='glob_style_filter*'
    
  2. With Python:
    python test/test_jit.py TestJit.test_cpp TestJit.test_cpp_cuda