| PyTorch Contribution Guide |
| ========================== |
| |
| PyTorch is a GPU-accelerated Python tensor computation package for |
| building deep neural networks built on tape-based autograd systems. |
| |
| The PyTorch Contribution Process |
| -------------------------------- |
| |
| The PyTorch organization is governed by `PyTorch |
| Governance </docs/community/governance.html>`__. |
| |
| The PyTorch development process involves a healthy amount of open |
| discussions between the core development team and the community. |
| |
| PyTorch operates similar to most open source projects on GitHub. |
| However, if you've never contributed to an open source project before, |
| here is the basic process. |
| |
| - **Figure out what you're going to work on.** The majority of open |
| source contributions come from people scratching their own itches. |
| However, if you don't know what you want to work on, or are just |
| looking to get more acquainted with the project, here are some tips |
| for how to find appropriate tasks: |
| |
| - Look through the `issue |
| tracker <https://github.com/pytorch/pytorch/issues/>`__ and see if |
| there are any issues you know how to fix. Issues that are |
| confirmed by other contributors tend to be better to investigate. |
| We also maintain some labels for issues which are likely to be |
| good for new people, e.g., **bootcamp** and **1hr**, although |
| these labels are less well maintained. |
| - Join us on Slack and let us know you're interested in getting to |
| know PyTorch. We're very happy to help out researchers and |
| partners get up to speed with the codebase. |
| |
| - **Figure out the scope of your change and reach out for design |
| comments on a GitHub issue if it's large.** The majority of pull |
| requests are small; in that case, no need to let us know about what |
| you want to do, just get cracking. But if the change is going to be |
| large, it's usually a good idea to get some design comments about it |
| first. |
| |
| - If you don't know how big a change is going to be, we can help you |
| figure it out! Just post about it on issues or Slack. |
| - Some feature additions are very standardized; for example, lots of |
| people add new operators or optimizers to PyTorch. Design |
| discussion in these cases boils down mostly to, “Do we want this |
| operator/optimizer?” Giving evidence for its utility, e.g., usage |
| in peer reviewed papers, or existence in other frameworks, helps a |
| bit when making this case. |
| - Core changes and refactors can be quite difficult to coordinate, |
| as the pace of development on PyTorch master is quite fast. |
| Definitely reach out about fundamental or cross-cutting changes; |
| we can often give guidance about how to stage such changes into |
| more easily reviewable pieces. |
| |
| - **Code it out!** |
| |
| - See the technical guide for advice for working with PyTorch in a |
| technical form. |
| |
| - **Open a pull request.** |
| |
| - If you are not ready for the pull request to be reviewed, tag it |
| with [WIP]. We will ignore it when doing review passes. If you are |
| working on a complex change, it's good to start things off as WIP, |
| because you will need to spend time looking at CI results to see |
| if things worked out or not. |
| - Find an appropriate reviewer for your change. We have some folks |
| who regularly go through the PR queue and try to review |
| everything, but if you happen to know who the maintainer for a |
| given subsystem affected by your patch is, feel free to include |
| them directly on the pull request. You can learn more about this |
| structure at PyTorch Subsystem Ownership. |
| |
| - **Iterate on the pull request until it's accepted!** |
| |
| - We'll try our best to minimize the number of review roundtrips and |
| block PRs only when there are major issues. For the most common |
| issues in pull requests, take a look at `Common Mistakes </docs/community/contribution_guide.html#common-mistakes-to-avoid>`__. |
| - Once a pull request is accepted and CI is passing, there is |
| nothing else you need to do; we will merge the PR for you. |
| |
| Getting Started |
| --------------- |
| |
| Proposing new features |
| ~~~~~~~~~~~~~~~~~~~~~~ |
| |
| New feature ideas are best discussed on a specific issue. Please include |
| as much information as you can, any accompanying data, and your proposed |
| solution. The PyTorch team and community frequently reviews new issues |
| and comments where they think they can help. If you feel confident in |
| your solution, go ahead and implement it. |
| |
| Reporting Issues |
| ~~~~~~~~~~~~~~~~ |
| |
| If you've identified an issue, first search through the `list of |
| existing issues <https://github.com/pytorch/pytorch/issues>`__ on the |
| repo. If you are unable to find a similar issue, then create a new one. |
| Supply as much information you can to reproduce the problematic |
| behavior. Also, include any additional insights like the behavior you |
| expect. |
| |
| Implementing Features or Fixing Bugs |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| If you want to fix a specific issue, it's best to comment on the |
| individual issue with your intent. However, we do not lock or assign |
| issues except in cases where we have worked with the developer before. |
| It's best to strike up a conversation on the issue and discuss your |
| proposed solution. The PyTorch team can provide guidance that saves you |
| time. |
| |
| Issues that are labeled first-new-issue, low, or medium priority provide |
| the best entrance point are great places to start. |
| |
| Adding Tutorials |
| ~~~~~~~~~~~~~~~~ |
| |
| A great deal of the tutorials on `pytorch.org <http://pytorch.org/>`__ |
| come from the community itself and we welcome additional contributions. |
| To learn more about how to contribute a new tutorial you can learn more |
| here: `PyTorch.org Tutorial Contribution Guide on |
| Github <https://github.com/pytorch/tutorials/#contributing>`__ |
| |
| Improving Documentation & Tutorials |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| We aim to produce high quality documentation and tutorials. On rare |
| occasions that content includes typos or bugs. If you find something you |
| can fix, send us a pull request for consideration. |
| |
| Take a look at the `Documentation <#on-documentation>`__ section to learn how our system |
| works. |
| |
| Participating in online discussions |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| You can find active discussions happening on the PyTorch Discussion |
| `forum <https://discuss.pytorch.org/>`__. |
| |
| Submitting pull requests to fix open issues |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| You can view a list of all open issues |
| `here <https://github.com/pytorch/pytorch/issues>`__. Commenting on an |
| issue is a great way to get the attention of the team. From here you can |
| share your ideas and how you plan to resolve the issue. |
| |
| For more challenging issues, the team will provide feedback and |
| direction for how to best solve the issue. |
| |
| If you're not able to fix the issue itself, commenting and sharing |
| whether you can reproduce the issue can be useful for helping the team |
| identify problem areas. |
| |
| Reviewing open pull requests |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| We appreciate your help reviewing and commenting on pull requests. Our |
| team strives to keep the number of open pull requests at a manageable |
| size, we respond quickly for more information if we need it, and we |
| merge PRs that we think are useful. However, due to the high level of |
| interest, additional eyes on pull requests is appreciated. |
| |
| Improving code readability |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Improve code readability helps everyone. It is often better to submit a |
| small number of pull requests that touch few files versus a large pull |
| request that touches many files. Starting a discussion in the PyTorch |
| forum `here <https://discuss.pytorch.org/>`__ or on an issue related to |
| your improvement is the best way to get started. |
| |
| Adding test cases to make the codebase more robust |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Additional test coverage is appreciated. |
| |
| Promoting PyTorch |
| ~~~~~~~~~~~~~~~~~ |
| |
| Your use of PyTorch in your projects, research papers, write ups, blogs, |
| or general discussions around the internet helps to raise awareness for |
| PyTorch and our growing community. Please reach out to |
| `pytorch-marketing@fb.com <http://mailto:pytorch-marketing@fb.com/>`__ |
| for marketing support. |
| |
| Triaging issues |
| ~~~~~~~~~~~~~~~ |
| |
| If you feel that an issue could benefit from a particular tag or level |
| of complexity comment on the issue and share your opinion. If an you |
| feel an issue isn't categorized properly comment and let the team know. |
| |
| About open source development |
| ----------------------------- |
| |
| If this is your first time contributing to an open source project, some |
| aspects of the development process may seem unusual to you. |
| |
| - **There is no way to “claim” issues.** People often want to “claim” |
| an issue when they decide to work on it, to ensure that there isn't |
| wasted work when someone else ends up working on it. This doesn't |
| really work too well in open source, since someone may decide to work |
| on something, and end up not having time to do it. Feel free to give |
| information in an advisory fashion, but at the end of the day, we |
| will take running code and rough consensus. |
| - **There is a high bar for new functionality that is added.** Unlike |
| in a corporate environment, where the person who wrote code |
| implicitly “owns” it and can be expected to take care of it in the |
| beginning of its lifetime, once a pull request is merged into an open |
| source project, it immediately becomes the collective responsibility |
| of all maintainers on the project. When we merge code, we are saying |
| that we, the maintainers, are able to review subsequent changes and |
| make a bugfix to the code. This naturally leads to a higher standard |
| of contribution. |
| |
| Common Mistakes To Avoid |
| ------------------------ |
| |
| - **Did you add tests?** (Or if the change is hard to test, did you |
| describe how you tested your change?) |
| |
| - We have a few motivations for why we ask for tests: |
| |
| 1. to help us tell if we break it later |
| 2. to help us tell if the patch is correct in the first place |
| (yes, we did review it, but as Knuth says, “beware of the |
| following code, for I have not run it, merely proven it |
| correct”) |
| |
| - When is it OK not to add a test? Sometimes a change can't be |
| conveniently tested, or the change is so obviously correct (and |
| unlikely to be broken) that it's OK not to test it. On the |
| contrary, if a change is seems likely (or is known to be likely) |
| to be accidentally broken, it's important to put in the time to |
| work out a testing strategy. |
| |
| - **Is your PR too long?** |
| |
| - It's easier for us to review and merge small PRs. Difficulty of |
| reviewing a PR scales nonlinearly with its size. |
| - When is it OK to submit a large PR? It helps a lot if there was a |
| corresponding design discussion in an issue, with sign off from |
| the people who are going to review your diff. We can also help |
| give advice about how to split up a large change into individually |
| shippable parts. Similarly, it helps if there is a complete |
| description of the contents of the PR: it's easier to review code |
| if we know what's inside! |
| |
| - **Comments for subtle things?** In cases where behavior of your code |
| is nuanced, please include extra comments and documentation to allow |
| us to better understand the intention of your code. |
| - **Did you add a hack?** Sometimes a hack is the right answer. But |
| usually we will have to discuss it. |
| - **Do you want to touch a very core component?** In order to prevent |
| major regressions, pull requests that touch core components receive |
| extra scrutiny. Make sure you've discussed your changes with the team |
| before undertaking major changes. |
| - **Want to add a new feature?** If you want to add new features, |
| comment your intention on the related issue. Our team tries to |
| comment on and provide feedback to the community. It's better to have |
| an open discussion with the team and the rest of the community prior |
| to building new features. This helps us stay aware of what you're |
| working on and increases the chance that it'll be merged. |
| - **Did you touch unrelated code to the PR?** To aid in code review, |
| please only include files in your pull request that are directly |
| related to your changes. |
| |
| Frequently asked questions |
| |
| - **How can I contribute as a reviewer?** There is lots of value if |
| community developer reproduce issues, try out new functionality, or |
| otherwise help us identify or troubleshoot issues. Commenting on |
| tasks or pull requests with your enviroment details is helpful and |
| appreciated. |
| - **CI tests failed, what does it mean?** Maybe you need to merge with |
| master or rebase with latest changes. Pushing your changes should |
| re-trigger CI tests. If the tests persist, you'll want to trace |
| through the error messages and resolve the related issues. |
| - **What are the most high risk changes?** Anything that tourhces build |
| configuration is an risky area. Please avoid changing these unless |
| you've had a discussion with the team beforehand. |
| - **Hey, a commit showed up on my branch, what's up with that?** |
| Sometimes another community member will provide a patch or fix to |
| your pull request or branch. This is often needed for getting CI tests |
| to pass. |
| |
| On Documentation |
| ---------------- |
| |
| Python Docs |
| ~~~~~~~~~~~ |
| |
| PyTorch documentation is generated from python source using |
| `Sphinx <http://www.sphinx-doc.org/en/master/>`__. Generated HTML is |
| copied to the docs folder in the master branch of |
| `pytorch.github.io <https://github.com/pytorch/pytorch.github.io/tree/master/docs>`__, |
| and is served via GitHub pages. |
| |
| - Site: http://pytorch.org/docs |
| - GitHub: http://github.com/pytorch/pytorch/docs |
| - Served from: |
| `https://github.com/pytorch/pytorch.github.io/tree/master/doc <https://github.com/pytorch/pytorch.github.io/tree/master/docs>`__ |
| |
| C++ Docs |
| ~~~~~~~~ |
| |
| For C++ code we use Doxygen to generate the content files. The C++ docs |
| are built on a special server and the resulting files are copied to the |
| https://github.com/pytorch/cppdocs repo, and are served from GitHub |
| pages. |
| |
| - Site: http://pytorch.org/cppdocs |
| - GitHub: https://github.com/pytorch/pytorch/tree/master/docs/cpp |
| - Served from: https://github.com/pytorch/cppdocs |
| |
| Tutorials |
| --------- |
| |
| PyTorch tutorials are documents used to help understand using PyTorch to |
| accomplish specific tasks or to understand more holistic concepts. |
| Tutorials are built using |
| `Sphinx-Gallery <https://sphinx-gallery.readthedocs.io/en/latest/index.html>`__ |
| from executable python sources files, or from restructured-text (rst) |
| files. |
| |
| - Site: http://pytorch.org/tutorials |
| - GitHub: http://github.com/pytorch/tutorials |
| |
| Tutorials Build Overview |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| For tutorials, `pull |
| requests <https://github.com/pytorch/tutorials/pulls>`__ trigger a |
| rebuild the entire site using CircleCI to test the effects of the |
| change. This build is sharded into 9 worker builds and takes around 40 |
| minutes total. At the same time, we do a Netlify build using *make |
| html-noplot*, which builds the site without rendering the notebook |
| output into pages for quick review. |
| |
| After a PR is accepted, the site is rebuilt and deployed from CircleCI. |
| |
| Contributing a new Tutorial |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| `PyTorch.org Tutorial Contribution |
| Guide <https://github.com/pytorch/tutorials/#contributing>`__ |
| |
| Code Style |
| ~~~~~~~~~~ |
| |
| **Python style** |
| |
| **C++ style** |
| |
| Submitting a Pull Request |
| ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| PyTorch development happens publicly on our Github repo. |
| |
| To have your feature or fix added to PyTorch, please submit a Pull |
| Request. |
| |
| Running Tests |
| ~~~~~~~~~~~~~ |
| |
| Show examples for running all tests, just one individual... |
| |
| Technical Process |
| ----------------- |
| |
| Developing PyTorch |
| ~~~~~~~~~~~~~~~~~~ |
| |
| To develop PyTorch on your machine, here are some tips: |
| |
| 1. Uninstall all existing PyTorch installs: |
| |
| :: |
| |
| conda uninstall pytorch |
| pip uninstall torch |
| pip uninstall torch # run this command twice |
| |
| 2. Clone a copy of PyTorch from source: |
| |
| :: |
| |
| git clone https://github.com/pytorch/pytorch |
| cd pytorch |
| |
| 3. Install PyTorch in ``build develop`` mode: |
| |
| A full set of instructions on installing PyTorch from source is here: |
| https://github.com/pytorch/pytorch#from-source |
| |
| The change you have to make is to replace |
| |
| :: |
| |
| python setup.py install |
| |
| with |
| |
| :: |
| |
| python setup.py build develop |
| |
| This is especially useful if you are only changing Python files. |
| |
| This mode will symlink the Python files from the current local source |
| tree into the Python install. |
| |
| Hence, if you modify a Python file, you do not need to reinstall PyTorch |
| again and again. |
| |
| For example: |
| |
| - Install local PyTorch in ``build develop`` mode |
| - modify your Python file ``torch/__init__.py`` (for example) |
| - test functionality |
| - modify your Python file ``torch/__init__.py`` |
| - test functionality |
| - modify your Python file ``torch/__init__.py`` |
| - test functionality |
| |
| You do not need to repeatedly install after modifying Python files. |
| |
| In case you want to reinstall, make sure that you uninstall PyTorch |
| first by running ``pip uninstall torch`` and ``python setup.py clean``. |
| Then you can install in ``build develop`` mode again. |
| |
| Codebase structure |
| ------------------ |
| |
| - `c10 <https://github.com/pytorch/pytorch/blob/master/c10>`__ - Core |
| library files that work everywhere, both server and mobile. We are |
| slowly moving pieces from |
| `ATen/core <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/core>`__ |
| here. This library is intended only to contain essential |
| functionality, and appropriate to use in settings where binary size |
| matters. (But you'll have a lot of missing functionality if you try |
| to use it directly.) |
| - `aten <https://github.com/pytorch/pytorch/blob/master/aten>`__ - C++ |
| tensor library for PyTorch (no autograd support) |
| |
| - `src <https://github.com/pytorch/pytorch/blob/master/aten/src>`__ |
| |
| - `TH <https://github.com/pytorch/pytorch/blob/master/aten/src/TH>`__ |
| `THC <https://github.com/pytorch/pytorch/blob/master/aten/src/THC>`__ |
| `THNN <https://github.com/pytorch/pytorch/blob/master/aten/src/THNN>`__ |
| `THCUNN <https://github.com/pytorch/pytorch/blob/master/aten/src/THCUNN>`__ |
| - Legacy library code from the original Torch. Try not to add |
| things here; we're slowly porting these to |
| `native <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native>`__. |
| |
| - generic - Contains actual implementations of operators, |
| parametrized over ``scalar_t``. Files here get compiled N |
| times per supported scalar type in PyTorch. |
| |
| - `ATen <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen>`__ |
| |
| - `core <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/core>`__ |
| - Core functionality of ATen. This is migrating to top-level |
| c10 folder. |
| - `native <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native>`__ |
| - Modern implementations of operators. If you want to write |
| a new operator, here is where it should go. Most CPU |
| operators go in the top level directory, except for |
| operators which need to be compiled specially; see cpu |
| below. |
| |
| - `cpu <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/cpu>`__ |
| - Not actually CPU implementations of operators, but |
| specifically implementations which are compiled with |
| processor-specific instructions, like AVX. See the |
| `README <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/cpu/README.md>`__ |
| for more details. |
| - `cuda <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/cuda>`__ |
| - CUDA implementations of operators. |
| - `sparse <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/sparse>`__ |
| - CPU and CUDA implementations of COO sparse tensor |
| operations |
| - `mkl <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/mkl>`__ |
| `mkldnn <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/mkldnn>`__ |
| `miopen <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/miopen>`__ |
| `cudnn <https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/cudnn>`__ |
| |
| - implementations of operators which simply bind to some |
| backend library. |
| |
| - `torch <https://github.com/pytorch/pytorch/blob/master/torch>`__ - |
| The actual PyTorch library. Everything that is not in |
| `csrc <https://github.com/pytorch/pytorch/blob/master/torch/csrc>`__ |
| is a Python module, following the PyTorch Python frontend module |
| structure. |
| |
| - `csrc <https://github.com/pytorch/pytorch/blob/master/torch/csrc>`__ |
| - C++ files composing the PyTorch library. Files in this directory |
| tree are a mix of Python binding code, and C++ heavy lifting. |
| Consult ``setup.py`` for the canonical list of Python binding |
| files; conventionally, they are often prefixed with ``python_``. |
| |
| - `jit <https://github.com/pytorch/pytorch/blob/master/torch/csrc/jit>`__ |
| - Compiler and frontend for TorchScript JIT frontend. |
| - `autograd <https://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd>`__ |
| - Implementation of reverse-mode automatic differentiation. |
| - `api <https://github.com/pytorch/pytorch/blob/master/torch/csrc/api>`__ |
| - The PyTorch C++ frontend. |
| - `distributed <https://github.com/pytorch/pytorch/blob/master/torch/csrc/distributed>`__ |
| - Distributed training support for PyTorch. |
| |
| - `tools <https://github.com/pytorch/pytorch/blob/master/tools>`__ - |
| Code generation scripts for the PyTorch library. See |
| `README <https://github.com/pytorch/pytorch/blob/master/tools/README.md>`__ |
| of this directory for more details. |
| - `test <https://github.com/pytorch/pytorch/blob/master/tests>`__ - |
| Python unit tests for PyTorch Python frontend. |
| |
| - `test\_torch.py <https://github.com/pytorch/pytorch/blob/master/test/test_torch.py>`__ |
| - Basic tests for PyTorch functionality. |
| - `test\_autograd.py <https://github.com/pytorch/pytorch/blob/master/test/test_autograd.py>`__ |
| - Tests for non-NN automatic differentiation support. |
| - `test\_nn.py <https://github.com/pytorch/pytorch/blob/master/test/test_nn.py>`__ |
| - Tests for NN operators and their automatic differentiation. |
| - `test\_jit.py <https://github.com/pytorch/pytorch/blob/master/test/test_jit.py>`__ |
| - Tests for the JIT compiler and TorchScript. |
| - ... |
| - `cpp <https://github.com/pytorch/pytorch/blob/master/test/cpp>`__ |
| - C++ unit tests for PyTorch C++ frontend. |
| - `expect <https://github.com/pytorch/pytorch/blob/master/test/expect>`__ |
| - Automatically generated "expect" files which are used to compare |
| against expected output. |
| - `onnx <https://github.com/pytorch/pytorch/blob/master/test/onnx>`__ |
| - Tests for ONNX export functionality, using both PyTorch and |
| Caffe2. |
| |
| - `caffe2 <https://github.com/pytorch/pytorch/blob/master/caffe2>`__ - |
| The Caffe2 library. |
| |
| - `core <https://github.com/pytorch/pytorch/blob/master/caffe2/core>`__ |
| - Core files of Caffe2, e.g., tensor, workspace, blobs, etc. |
| - `operators <https://github.com/pytorch/pytorch/blob/master/caffe2/operators>`__ |
| - Operators of Caffe2. |
| - `python <https://github.com/pytorch/pytorch/blob/master/caffe2/python>`__ |
| - Python bindings to Caffe2. |
| - ... |
| |
| Unit Testing |
| ------------ |
| |
| PyTorch's testing is located under ``test/``. Run the entire test suite |
| with |
| |
| :: |
| |
| python test/run_test.py |
| |
| or run individual test files, like ``python test/test_nn.py``, for |
| individual test suites. |
| |
| Better local unit tests with pytest |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| We don't officially support ``pytest``, but it works well with our |
| ``unittest`` tests and offers a number of useful features for local |
| developing. Install it via ``pip install pytest``. |
| |
| If you want to just run tests that contain a specific substring, you can |
| use the ``-k`` flag: |
| |
| :: |
| |
| pytest test/test_nn.py -k Loss -v |
| |
| The above is an example of testing a change to Loss functions: this |
| command runs tests such as ``TestNN.test_BCELoss``\ and |
| ``TestNN.test_MSELoss`` and can be useful to save keystrokes. |
| |
| Writing documentation |
| --------------------- |
| |
| PyTorch uses `Google |
| style <http://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html>`__ |
| for formatting docstrings. Length of line inside docstrings block must |
| be limited to 80 characters to fit into Jupyter documentation popups. |
| |
| For C++ documentation (https://pytorch.org/cppdocs), we use |
| `Doxygen <http://www.doxygen.nl/>`__ and then convert it to |
| `Sphinx <http://www.sphinx-doc.org/>`__ via |
| `Breathe <https://github.com/michaeljones/breathe>`__ |
| and\ `Exhale <https://github.com/svenevs/exhale>`__. Check the `Doxygen |
| reference <http://www.stack.nl/~dimitri/doxygen/manual/index.html>`__ |
| for more information on the documentation syntax. To build the |
| documentation locally, ``cd`` into ``docs/cpp`` and then ``make html``. |
| |
| We run Doxygen in CI (Travis) to verify that you do not use invalid |
| Doxygen commands. To run this check locally, run ``./check-doxygen.sh`` |
| from inside ``docs/cpp``. |
| |
| Managing multiple build trees |
| ----------------------------- |
| |
| One downside to using ``python setup.py develop`` is that your |
| development version of PyTorch will be installed globally on your |
| account (e.g., if you run ``import torch`` anywhere else, the |
| development version will be used. |
| |
| If you want to manage multiple builds of PyTorch, you can make use of |
| `conda environments <https://conda.io/docs/using/envs.html>`__ to |
| maintain separate Python package environments, each of which can be tied |
| to a specific build of PyTorch. To set one up: |
| |
| :: |
| |
| conda create -n pytorch-myfeaturesource activate pytorch-myfeature# if you run python now, torch will NOT be installed |
| python setup.py build develop |
| |
| C++ Development tips |
| -------------------- |
| |
| If you are working on the C++ code, there are a few important things |
| that you will want to keep in mind: |
| |
| 1. How to rebuild only the code you are working on. |
| 2. How to make rebuilds in the absence of changes go faster. |
| |
| Build only what you need. |
| ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| ``python setup.py build`` will build everything, but since our build |
| system is not very optimized for incremental rebuilds, this will |
| actually be very slow. Far better is to only request rebuilds of the |
| parts of the project you are working on: |
| |
| - Working on the Python bindings? Run ``python setup.py develop`` to |
| rebuild (NB: no ``build`` here!) |
| - Working on ``torch/csrc`` or ``aten``? Run |
| ``python setup.py rebuild_libtorch`` to rebuild and avoid having to |
| rebuild other dependent libraries we depend on. |
| - Working on one of the other dependent libraries? The other valid |
| targets are listed in ``dep_libs`` in ``setup.py``. prepend |
| ``build_`` to get a target, and run as e.g. |
| ``python setup.py build_gloo``. |
| - Working on a test binary? Run |
| ``(cd build && ninja bin/test_binary_name)`` to rebuild only that |
| test binary (without rerunning cmake). (Replace ``ninja`` with |
| ``make`` if you don't have ninja installed). |
| |
| On the initial build, you can also speed things up with the environment |
| variables ``DEBUG`` and ``NO_CUDA``. |
| |
| - ``DEBUG=1`` will enable debug builds (-g -O0) |
| - ``REL_WITH_DEB_INFO=1`` will enable debug symbols with optimizations |
| (-g -O3) |
| - ``NO_CUDA=1`` will disable compiling CUDA (in case you are developing |
| on something not CUDA related), to save compile time. |
| |
| For example: |
| |
| :: |
| |
| NO_CUDA=1 DEBUG=1 python setup.py build develop |
| |
| Make sure you continue to pass these flags on subsequent builds. |
| |
| Code completion and IDE support |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| When using ``python setup.py develop``, PyTorch will generate a |
| ``compile_commands.json`` file that can be used by many editors to |
| provide command completion and error highlighting for PyTorch's C++ |
| code. You need to ``pip install ninja`` to generate accurate information |
| for the code in ``torch/csrc``. More information at: |
| |
| - https://sarcasm.github.io/notes/dev/compilation-database.html |
| |
| Make no-op build fast. |
| ~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Use Ninja |
| ~~~~~~~~~ |
| |
| Python ``setuptools`` is pretty dumb, and always rebuilds every C file |
| in a project. If you install the ninja build system with |
| ``pip install ninja``, then PyTorch will use it to track dependencies |
| correctly. If PyTorch was already built, you will need to run |
| ``python setup.py clean`` once after installing ninja for builds to |
| succeed. |
| |
| Use CCache |
| ~~~~~~~~~~ |
| |
| Even when dependencies are tracked with file modification, there are |
| many situations where files get rebuilt when a previous compilation was |
| exactly the same. |
| |
| Using ccache in a situation like this is a real time-saver. However, by |
| default, ccache does not properly support CUDA stuff, so here are the |
| instructions for installing a custom ccache fork that has CUDA support: |
| |
| :: |
| |
| # install and export ccacheif ! ls ~/ccache/bin/ccachethen |
| sudo apt-get update |
| sudo apt-get install -y automake autoconf |
| sudo apt-get install -y asciidoc |
| mkdir -p ~/ccache |
| pushd /tmp |
| rm -rf ccache |
| git clone https://github.com/colesbury/ccache -b ccbin |
| pushd ccache |
| ./autogen.sh |
| ./configure |
| make install prefix=~/ccache |
| popdpopd |
| |
| mkdir -p ~/ccache/lib |
| mkdir -p ~/ccache/cuda |
| ln -s ~/ccache/bin/ccache ~/ccache/lib/cc |
| ln -s ~/ccache/bin/ccache ~/ccache/lib/c++ |
| ln -s ~/ccache/bin/ccache ~/ccache/lib/gcc |
| ln -s ~/ccache/bin/ccache ~/ccache/lib/g++ |
| ln -s ~/ccache/bin/ccache ~/ccache/cuda/nvcc |
| |
| ~/ccache/bin/ccache -M 25Gifiexport PATH=~/ccache/lib:$PATHexport CUDA_NVCC_EXECUTABLE=~/ccache/cuda/nvcc |
| |
| CUDA Development tips |
| --------------------- |
| |
| If you are working on the CUDA code, here are some useful CUDA debugging |
| tips: |
| |
| 1. ``CUDA_DEVICE_DEBUG=1`` will enable CUDA device function debug |
| symbols (``-g -G``). This will be particularly helpful in debugging |
| device code. However, it will slow down the build process for about |
| 50% (compared to only ``DEBUG=1``), so use wisely. |
| 2. ``cuda-gdb`` and ``cuda-memcheck`` are your best CUDA debugging |
| friends. Unlike\ ``gdb``, ``cuda-gdb`` can display actual values in a |
| CUDA tensor (rather than all zeros). |
| |
| Hope this helps, and thanks for considering to contribute. |
| |
| Windows development tips |
| ------------------------ |
| |
| Occasionally, you will write a patch which works on Linux, but fails CI |
| on Windows. There are a few aspects in which MSVC (the Windows compiler |
| toolchain we use) is stricter than Linux, which are worth keeping in |
| mind when fixing these problems. |
| |
| 1. Symbols are NOT exported by default on Windows; instead, you have to |
| explicitly mark a symbol as exported/imported in a header file with |
| ``__declspec(dllexport)`` / ``__declspec(dllimport)``. We have |
| codified this pattern into a set of macros which follow the |
| convention ``*_API``, e.g., ``CAFFE2_API`` inside Caffe2 and ATen. |
| (Every separate shared library needs a unique macro name, because |
| symbol visibility is on a per shared library basis. See |
| c10/macros/Macros.h for more details.) The upshot is if you see an |
| "unresolved external" error in your Windows build, this is probably |
| because you forgot to mark a function with ``*_API``. However, there |
| is one important counterexample to this principle: if you want a |
| *templated* function to be instantiated at the call site, do NOT mark |
| it with ``*_API`` (if you do mark it, you'll have to explicitly |
| instantiate all of the specializations used by the call sites.) |
| 2. If you link against a library, this does not make its dependencies |
| transitively visible. You must explicitly specify a link dependency |
| against every library whose symbols you use. (This is different from |
| Linux where in most environments, transitive dependencies can be used |
| to fulfill unresolved symbols.) |
| 3. If you have a Windows box (we have a few on EC2 which you can request |
| access to) and you want to run the build, the easiest way is to just |
| run ``.jenkins/pytorch/win-build.sh``. If you need to rebuild, run |
| ``REBUILD=1 .jenkins/pytorch/win-build.sh`` (this will avoid blowing |
| away your Conda environment.) |
| |
| Even if you don't know anything about MSVC, you can use cmake to build |
| simple programs on Windows; this can be helpful if you want to learn |
| more about some peculiar linking behavior by reproducing it on a small |
| example. Here's a simple example cmake file that defines two dynamic |
| libraries, one linking with the other: |
| |
| :: |
| |
| project(myproject CXX)set(CMAKE_CXX_STANDARD 11)add_library(foo SHARED foo.cpp)add_library(bar SHARED bar.cpp)# NB: don't forget to __declspec(dllexport) at least one symbol from foo,# otherwise foo.lib will not be created.target_link_libraries(bar PUBLIC foo) |
| |
| You can build it with: |
| |
| :: |
| |
| mkdir buildcd build |
| cmake .. |
| cmake --build . |
| |
| Known MSVC (and MSVC with NVCC) bugs |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The PyTorch codebase sometimes likes to use exciting C++ features, and |
| these exciting features lead to exciting bugs in Windows compilers. To |
| add insult to injury, the error messages will often not tell you which |
| line of code actually induced the erroring template instantiation. We've |
| found the most effective way to debug these problems is to carefully |
| read over diffs, keeping in mind known bugs in MSVC/NVCC. Here are a few |
| well known pitfalls and workarounds: |
| |
| - This is not actually a bug per se, but in general, code generated by |
| MSVC is more sensitive to memory errors; you may have written some |
| code that does a use-after-free or stack overflows; on Linux the code |
| might work, but on Windows your program will crash. ASAN may not |
| catch all of these problems: stay vigilant to the possibility that |
| your crash is due to a real memory problem. |
| - (NVCC) ``c10::optional`` does not work when used from device code. |
| Don't use it from kernels. Upstream issue: |
| https://github.com/akrzemi1/Optional/issues/58 and our local issue |
| #10329. |
| - ``constexpr`` generally works less well on MSVC. |
| |
| - The idiom ``static_assert(f() == f())`` to test if ``f`` is |
| constexpr does not work; you'll get "error C2131: expression did |
| not evaluate to a constant". Don't use these asserts on Windows. |
| (Example: ``c10/util/intrusive_ptr.h``) |
| |
| - (NVCC) Code you access inside a ``static_assert`` will eagerly be |
| evaluated as if it were device code, and so you might get an error |
| that the code is "not accessible". |
| |
| :: |
| |
| class A { |
| static A singleton_; |
| static constexpr inline A* singleton() { |
| return &singleton_; |
| } |
| };static_assert(std::is_same(A*, decltype(A::singleton()))::value, "hmm"); |
| |
| - The compiler will run out of heap space if you attempt to compile |
| files that are too large. Splitting such files into separate files |
| helps. (Example: ``THTensorMath``, ``THTensorMoreMath``, |
| ``THTensorEvenMoreMath``.) |
| - MSVC's preprocessor (but not the standard compiler) has a bug where |
| it incorrectly tokenizes raw string literals, ending when it sees a |
| ``"``. This causes preprocessor tokens inside the literal like |
| an\ ``#endif`` to be incorrectly treated as preprocessor directives. |
| See https://godbolt.org/z/eVTIJq as an example. |
| |
| Running Clang-Tidy |
| ~~~~~~~~~~~~~~~~~~ |
| |
| `Clang-Tidy <https://clang.llvm.org/extra/clang-tidy/index.html>`__ is a |
| C++ linter and static analysis tool based on the clang compiler. We run |
| clang-tidy in our CI to make sure that new C++ code is safe, sane and |
| efficient. See our |
| `.travis.yml <https://github.com/pytorch/pytorch/blob/master/.travis.yml>`__ |
| file for the simple commands we use for this. To run clang-tidy locally, |
| follow these steps: |
| |
| 1. Install clang-tidy. First, check if you already have clang-tidy by |
| simply writing ``clang-tidy`` in your terminal. If you don't yet have |
| clang-tidy, you should be able to install it easily with your package |
| manager, e.g. by writing ``apt-get install clang-tidy`` on Ubuntu. |
| See `https://apt.llvm.org <https://apt.llvm.org/>`__ for details on |
| how to install the latest version. Note that newer versions of |
| clang-tidy will have more checks than older versions. In our CI, we |
| run clang-tidy-6.0. |
| 2. Use our driver script to run clang-tidy over any changes relative to |
| some git revision (you may want to replace ``HEAD~1`` with ``HEAD`` |
| to pick up uncommitted changes). Changes are picked up based on a |
| ``git diff`` with the given revision: |
| |
| :: |
| |
| python tools/clang_tidy.py -d build -p torch/csrc --diff 'HEAD~1' |
| |
| Above, it is assumed you are in the PyTorch root folder. |
| ``path/to/build`` should be the path to where you built PyTorch from |
| source, e.g. ``build`` in the PyTorch root folder if you used |
| ``setup.py build``. You can use ``-c <clang-tidy-binary>``\ to change |
| the clang-tidy this script uses. Make sure you have PyYaml installed, |
| which is in PyTorch's ``requirements.txt``. |
| |
| Pre-commit Tidy/Linting Hook |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| We use clang-tidy and flake8 to perform additional formatting and |
| semantic checking of code. We provide a pre-commit git hook for |
| performing these checks, before a commit is created: |
| |
| :: |
| |
| ln -s ../../tools/git-pre-commit .git/hooks/pre-commit |
| |
| Caffe2 notes |
| ------------ |
| |
| In 2018, we merged Caffe2 into the PyTorch source repository. While the |
| steady state aspiration is that Caffe2 and PyTorch share code freely, in |
| the meantime there will be some separation. If you submit a PR to only |
| PyTorch or only Caffe2 code, CI will only run for the project you |
| edited. The logic for this is implemented in |
| ``.jenkins/pytorch/dirty.sh`` and ``.jenkins/caffe2/dirty.sh``; you can |
| look at this to see what path prefixes constitute changes. This also |
| means if you ADD a new top-level path, or you start sharing code between |
| projects, you need to modify these files. There are a few "unusual" |
| directories which, for historical reasons, are Caffe2/PyTorch specific. |
| Here they are: |
| |
| - ``CMakeLists.txt``, ``Makefile``, ``binaries``, ``cmake``, ``conda``, |
| ``modules``, ``scripts`` are Caffe2-specific. Don't put PyTorch code |
| in them without extra coordination. |
| - ``mypy*``, ``requirements.txt``, ``setup.py``, ``test``, ``tools`` |
| are PyTorch-specific. Don't put Caffe2 code in them without extra |
| coordination. |