pytorch/ios/TestApp
Nikita Shulga 36ac095ff8 Migrate PyTorch to C++17 (#85969)
With CUDA-10.2 gone we can finally do it!

This PR mostly contains build system related changes, invasive functional ones are to be followed.
Among many expected tweaks to the build system, here are few unexpected ones:
 - Force onnx_proto project to be updated to C++17 to avoid `duplicate symbols` error when compiled by gcc-7.5.0, as storage rule for `constexpr` changed in C++17, but gcc does not seem to follow it
 - Do not use `std::apply` on CUDA but rely on the built-in variant, as it results in test failures when CUDA runtime picks host rather than device function when `std::apply` is invoked from CUDA code.
 - `std::decay_t` -> `::std::decay_t` and `std::move`->`::std::move` as VC++ for some reason claims that `std` symbol is ambigious
 - Disable use of `std::aligned_alloc` on Android, as its `libc++` does not implement it.

Some prerequisites:
 - https://github.com/pytorch/pytorch/pull/89297
 - https://github.com/pytorch/pytorch/pull/89605
 - https://github.com/pytorch/pytorch/pull/90228
 - https://github.com/pytorch/pytorch/pull/90389
 - https://github.com/pytorch/pytorch/pull/90379
 - https://github.com/pytorch/pytorch/pull/89570
 - https://github.com/facebookincubator/gloo/pull/336
 - https://github.com/facebookincubator/gloo/pull/343
 - 919676fb32

Fixes https://github.com/pytorch/pytorch/issues/56055

Pull Request resolved: https://github.com/pytorch/pytorch/pull/85969
Approved by: https://github.com/ezyang, https://github.com/kulinseth
2022-12-08 02:27:48 +00:00
..
benchmark Conditionally build the TestApp benchmark based on lite interpreter (#86314) 2022-10-06 10:08:54 +00:00
custom_build Revert D30279364: [codemod][lint][fbcode/c*] Enable BLACK by default 2021-08-12 11:45:01 -07:00
fastlane Remove codesigning from ios circleci workflows (#85630) 2022-09-29 19:49:11 +00:00
models remove unneeded overload for nansum 2022-04-27 16:02:54 +00:00
TestApp Conditionally build the TestApp benchmark based on lite interpreter (#86314) 2022-10-06 10:08:54 +00:00
TestApp.xcodeproj Migrate PyTorch to C++17 (#85969) 2022-12-08 02:27:48 +00:00
TestAppTests Add detailed error message for iOS test (#79140) 2022-06-08 21:07:08 +00:00
.clang-format
.gitignore
Gemfile
Gemfile.lock [CI] imporve ios simulator test (#80459) 2022-06-29 21:23:56 +00:00
METADATA.bzl Add all bzl files per D36874458 2022-06-06 09:40:19 -07:00
README.md Re-add benchmarking files to ios TestApp (#85539) 2022-10-03 06:43:06 +00:00

TestApp

The TestApp is currently being used as a dummy app by Circle CI for nightly jobs. The challenge comes when testing the arm64 build as we don't have a way to code-sign our TestApp. This is where Fastlane came to rescue. Fastlane is a trendy automation tool for building and managing iOS applications. It also works seamlessly with Circle CI. We are going to leverage the import_certificate action, which can install developer certificates on CI machines. See Fastfile for more details.

For simulator build, we run unit tests as the last step of our CI workflow. Those unit tests can also be run manually via the fastlane scan command.

Run Simulator Test Locally

Follow these steps if you want to run the test locally.

  1. Checkout PyTorch repo including all submodules

  2. Build PyTorch for ios

USE_COREML_DELEGATE=1 IOS_PLATFORM=SIMULATOR ./scripts/build_ios.sh
  1. Generate on-the-fly test models
python test/mobile/model_test/gen_test_model.py ios-test

You need to install regular PyTorch on your local machine to run this script. Check https://github.com/pytorch/pytorch/tree/master/test/mobile/model_test#diagnose-failed-test to learn more.

  1. Create XCode project (for lite interpreter)
cd ios/TestApp/benchmark
ruby setup.rb --lite 1
  1. Open the generated TestApp/TestApp.xcodeproj in XCode and run simulator test.

Re-generate All Test Models

  1. Make sure PyTorch (not PyTorch for iOS) is installed See https://pytorch.org/get-started/locally/

  2. Re-generate models for operator test

python test/mobile/model_test/gen_test_model.py ios
python test/mobile/model_test/gen_test_model.py ios-test
  1. Re-generate Core ML model
cd ios/TestApp/benchmark; python coreml_backend.py

Debug Test Failures

Make sure all models are generated. See https://github.com/pytorch/pytorch/tree/master/test/mobile/model_test to learn more.

There's no debug information in simulator test (project TestAppTests). You can copy the failed test code to TestApp/TestApp/ViewController.mm and debug in the main TestApp.

Benchmark

The benchmark folder contains two scripts that help you setup the benchmark project. The setup.rb does the heavy-lifting jobs of setting up the XCode project, whereas the trace_model.py is a Python script that you can tweak to generate your model for benchmarking. Simply follow the steps below to setup the project

  1. In the PyTorch root directory, run IOS_ARCH=arm64 ./scripts/build_ios.sh to generate the custom build from Master branch
  2. Navigate to the benchmark folder, run python trace_model.py to generate your model.
  3. In the same directory, open config.json. Those are the input parameters you can tweak.
  4. Again, in the same directory, run ruby setup.rb to setup the XCode project.
  5. Open the TestApp.xcodeproj, you're ready to go.

The benchmark code is written in C++, you can use UI_LOG to visualize the log. See benchmark.mm for more details.