blob: a44257092c47f38f081c99377bf2d1eab3e856d4 [file] [log] [blame] [view]
<!--
emi-automated TOC generation with instructions from
https://github.com/ekalinin/github-markdown-toc#auto-insert-and-update-toc
-->
<!--ts-->
* [How to Contribute](#how-to-contribute)
* [Contributor License Agreement](#contributor-license-agreement)
* [Community Guidelines](#community-guidelines)
* [Code Contribution Guidelines](#code-contribution-guidelines)
* [General Pull Request Guidelines](#general-pull-request-guidelines)
* [Guidelines for Specific Contribution Categories](#guidelines-for-specific-contribution-categories)
* [Bug Fixes](#bug-fixes)
* [Reference Kernel Implementations](#reference-kernel-implementations)
* [Optimized Kernel Implementations](#optimized-kernel-implementations)
* [New Target / Platform / IDE / Examples](#new-target--platform--ide--examples)
* [Development Workflow Notes](#development-workflow-notes)
* [Initial Setup](#initial-setup)
* [Before submitting your PR](#before-submitting-your-pr)
* [During the PR review](#during-the-pr-review)
* [Reviewer notes](#reviewer-notes)
* [Python notes](#python-notes)
* [Continuous Integration System](#continuous-integration-system)
<!-- Added by: advaitjain, at: Thu 16 Sep 2021 11:43:42 AM PDT -->
<!--te-->
# How to Contribute
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement (CLA). You (or your employer) retain the copyright to your
contribution; this simply gives us permission to use and redistribute your
contributions as part of the project. Head over to
<https://cla.developers.google.com/> to see your current agreements on file or
to sign a new one.
You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to do it
again.
## Community Guidelines
This project follows
[Google's Open Source Community Guidelines](https://opensource.google/conduct/).
# Code Contribution Guidelines
We provide some general guidelines with the goal of enabling community
contributions while still maintaining code health, maintainability, and
consistency in style.
Please note that while these guidelines may seem onerous to some developers,
they are derived from Google's software engineering best practices.
Before we describe project-specific guidelines, we recommend that external
contributors read these tips from the Google Testing Blog:
* [Code Health: Providing Context with Commit Messages and Bug Reports](https://testing.googleblog.com/2017/09/code-health-providing-context-with.html)
* [Code Health: Understanding Code In Review](https://testing.googleblog.com/2018/05/code-health-understanding-code-in-review.html)
* [Code Health: Too Many Comments on Your Code Reviews?](https://testing.googleblog.com/2017/06/code-health-too-many-comments-on-your.html)
* [Code Health: To Comment or Not to Comment?](https://testing.googleblog.com/2017/07/code-health-to-comment-or-not-to-comment.html)
We also recommend that contributors take a look at the
[Tensorflow Contributing Guidelines](https://github.com/tensorflow/tensorflow/blob/master/CONTRIBUTING.md).
## General Pull Request Guidelines
We strongly recommend that contributors:
1. Initiate a conversation with the TFLM team via a
[TF Lite Micro Github issue](https://github.com/tensorflow/tensorflow/issues/new?labels=comp%3Amicro&template=70-tflite-micro-issue.md)
as early as possible.
* This enables us to give guidance on how to proceed, prevent duplicated
effort and also point to alternatives as well as context if we are not
able to accept a particular contribution at a given time.
* Ideally, you should make an issue ***before*** starting to work on a
pull request and provide context on both what you want to contribute and
why.
1. Once step 1. is complete and it is determined that a PR from an external
contributor is the way to go, please follow these guidelines from
[Google's Engineering Practices documentation](https://google.github.io/eng-practices/):
* [Send Small Pull Requests](https://google.github.io/eng-practices/review/developer/small-cls.html)
* If a pull request is doing more than one thing, the reviewer will
request that it be broken up into two or more PRs.
* [Write Good Pull Request Descriptions](https://google.github.io/eng-practices/review/developer/cl-descriptions.html)
* We require that all PR descriptions link to the GitHub issue
created in step 1 via the text `BUG=#nn` on a line by itself [^1]. This
is enforced by CI.
[^1]: This despite GitHub having additional forms of
[linked references](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/autolinked-references-and-urls).
1. Unit tests are critical to a healthy codebase. PRs without tests should be
the exception rather than the norm. And contributions to improve, simplify,
or make the unit tests more exhaustive are welcome! Please refer to
[this guideline](https://google.github.io/eng-practices/review/developer/small-cls.html#test_code)
on how test code and writing small PRs should be reconciled.
## Guidelines for Specific Contribution Categories
We provide some additional guidelines for different categories of contributions.
### Bug Fixes
Pull requests that fix bugs are always welcome and often uncontroversial, unless
there is a conflict between different requirements from the platform, or if
fixing a bug needs a bigger architectural change.
1. Create a [Github issue](https://github.com/tensorflow/tflite-micro/issues/new/choose)
to determine the scope of the bug fix.
1. Send a PR (if that is determined to be the best path forward).
1. Bugfix PRs should be accompanied by a test case that fails prior to the fix
and passes with the fix. This validates that the fix works as expected, and
helps prevent future regressions.
### Reference Kernel Implementations
Pull requests that port reference kernels from TF Lite Mobile to TF Lite Micro
are welcome once we have context from the contributor on why the additional
kernel is needed.
Please see the [reference kernel porting guide](tensorflow/lite/micro/docs/porting_reference_ops.md)
for more details of that process.
### Optimized Kernel Implementations
Please see the [optimized kernel implementations guide](tensorflow/lite/micro/docs/optimized_kernel_implementations.md).
### New Target / Platform / IDE / Examples
Please see the [new platform support guide](tensorflow/lite/micro/docs/new_platform_support.md)
for documentation on how to add TFLM support for your particular platform.
# Development Workflow Notes
## Initial Setup
Below are some tips that might be useful and improve the development experience.
* Add the [Refined GitHub](https://github.com/sindresorhus/refined-github)
plugin to make the github experience even better.
* Code search the [TfLite Micro codebase](https://sourcegraph.com/github.com/tensorflow/tflite-micro@main)
on Sourcegraph. And optionally install the [plugin that enables GitHub integration](https://docs.sourcegraph.com/integration/github#github-integration-with-sourcegraph).
* Install [bazel](ci/install_bazelisk.sh) and [buildifier](ci/install_buildifier.sh).
* Install the latest clang and clang-format. For example, [here](ci/Dockerfile.micro)
is the what we do for the TFLM continuous integration Docker container.
* Get a copy of [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint)
or install it:
* Install Pillow and Wave. For example, [here](ci/Dockerfile.micro) is what we
do for the TFLM continuous integration Docker container.
```
pip install cpplint
```
* [yapf](https://github.com/google/yapf/) should be used for formatting Python
code. For example:
```
pip install yapf
yapf log_parser.py -i --style='{based_on_style: pep8, indent_width: 2}'
```
* Add a git hook to check for code style etc. prior to creating a pull request:
```
cp tensorflow/lite/micro/tools/dev_setup/pre-push.tflm .git/hooks/pre-push
```
## Before submitting your PR
1. Run in-place clang-format on all the files that are modified in your git
tree with
```
clang-format -i -style=google `git ls-files -m | grep "\.cc"`
clang-format -i -style=google `git ls-files -m | grep "\.h"`
```
1. Make sure your code is lint-free.
```
cpplint `git ls-files -m`
```
1. Run all the tests for x86, and any other platform that you are modifying.
```
tensorflow/lite/micro/tools/ci_build/test_x86_default.sh
```
Please check the READMEs in the optimized kernel directories for specific
instructions.
1. Sometimes, bugs are caught by the sanitizers that can go unnoticed
via the Makefile. To run a test with the different sanitizers, use the
following commands (replace `micro_interpreter_test` with the target that you
want to test:
```
CC=clang bazel run --config=asan tensorflow/lite/micro:micro_interpreter_test
CC=clang bazel run --config=msan tensorflow/lite/micro:micro_interpreter_test
CC=clang bazel run --config=ubsan tensorflow/lite/micro:micro_interpreter_test
```
## During the PR review
1. Do not change the git version history.
* Always merge upstream/main (***do not rebase***) and no force-pushes
please.
* Having an extra merge commit is ok as the github review tool handles
that gracefully.
Assuming that you forked tensorflow and added a remote called upstream with:
```
git remote add upstream https://github.com/tensorflow/tflite-micro.git
```
Fetch the latest changes from upstream and merge into your local branch.
```
git fetch upstream
git merge upstream/main
```
In case of a merge conflict, resolve via:
```
git mergetool
# Use your favorite diff tools (e.g. meld) to resolve the conflicts.
git add <files that were manually resolved>
git commit
```
1. If a force push seems to be the only path forward, please stop and let your
PR reviewer know ***before*** force pushing. We will attempt to do the merge
for you. This will also help us better understand in what conditions a
force-push may be unavoidable.
## Reviewer notes
* [GIthub CLI](https://cli.github.com) can be useful to quickly checkout a PR
to test locally.
`gh pr checkout <PR number>`
* Google engineers on the Tensorflow team will have the permissions to push
edits to most PRs. This can be useful to make some small fixes as a result
of errors due to internal checks that are not easily reproducible via
github.
One example of this is
[this comment](https://github.com/tensorflow/tensorflow/pull/38634#issuecomment-683190474).
And a sketch of the steps:
```
git remote add <remote_name> git@github.com:<PR author>/tflite-micro.git
git fetch <remote_name>
git checkout -b <local-branch-name> <remote_name>/<PR branch name>
# make changes and commit to local branch
# push changes to remove branch
git push <remote_name> <PR branch name>
# remove the temp remote to clean up your git environment.
git remote rm <remote_name>
```
## Python notes
* [TFLM Python guide](docs/python.md)
# Continuous Integration System
* Some [additional documentation](docs/continuous_integration.md) on the TFLM CI.