From 809f9c7faa07cb07d6706b84c5d776e2582074c0 Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Tue, 26 Jul 2022 16:30:05 +0800 Subject: [PATCH 01/11] fix(workflows): use Python 3 for commands --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8b26e861..76ec0319 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,8 +173,9 @@ jobs: - name: Check consistency between the package version and release tag if: startsWith(github.ref, 'refs/tags/') run: | + PYTHON="$(head -n 1 .python-paths)" + PACKAGE_VER="v$("${PYTHON}" setup.py --version)" RELEASE_TAG="${GITHUB_REF#refs/*/}" - PACKAGE_VER="v$(python setup.py --version)" if [[ "${PACKAGE_VER}" != "${RELEASE_TAG}" ]]; then echo "package ver. (${PACKAGE_VER}) != release tag. (${RELEASE_TAG})" exit 1 From ab2ebff644d6b902586301a59b09b8beddc42589 Mon Sep 17 00:00:00 2001 From: Hello_World Date: Tue, 26 Jul 2022 20:22:12 +0800 Subject: [PATCH 02/11] feat(custom_op): use dynamic process number (#42) Co-authored-by: Xuehai Pan --- CHANGELOG.md | 4 ++++ src/adam_op/adam_op_impl.cpp | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70cbe2e8..104bce25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Use dynamic process number in CPU kernels by [@JieRen98](https://github.com/JieRen98) in [#42](https://github.com/metaopt/TorchOpt/pull/42). + ------ ## [0.4.2] - 2022-07-26 diff --git a/src/adam_op/adam_op_impl.cpp b/src/adam_op/adam_op_impl.cpp index 16be5251..994bf0f0 100644 --- a/src/adam_op/adam_op_impl.cpp +++ b/src/adam_op/adam_op_impl.cpp @@ -31,7 +31,7 @@ void adamForwardInplaceCPUKernel( const other_t inv_one_minus_pow_b2, const other_t eps, const other_t eps_root, const size_t n, scalar_t* __restrict__ updates_ptr, scalar_t* __restrict__ mu_ptr, scalar_t* __restrict__ nu_ptr) { -#pragma omp parallel for num_threads(32) +#pragma omp parallel for num_threads(omp_get_num_procs()) for (size_t tid = 0; tid < n; ++tid) { const scalar_t updates = updates_ptr[tid]; const scalar_t mu = mu_ptr[tid]; @@ -76,7 +76,7 @@ void adamForwardMuCPUKernel(const scalar_t* __restrict__ updates_ptr, const scalar_t* __restrict__ mu_ptr, const other_t b1, const size_t n, scalar_t* __restrict__ mu_out_ptr) { -#pragma omp parallel for num_threads(32) +#pragma omp parallel for num_threads(omp_get_num_procs()) for (size_t tid = 0; tid < n; ++tid) { const scalar_t updates = updates_ptr[tid]; const scalar_t mu = mu_ptr[tid]; @@ -108,7 +108,7 @@ void adamForwardNuCPUKernel(const scalar_t* __restrict__ updates_ptr, const scalar_t* __restrict__ nu_ptr, const other_t b2, const size_t n, scalar_t* __restrict__ nu_out_ptr) { -#pragma omp parallel for num_threads(32) +#pragma omp parallel for num_threads(omp_get_num_procs()) for (size_t tid = 0; tid < n; ++tid) { const scalar_t updates = updates_ptr[tid]; const scalar_t nu = nu_ptr[tid]; @@ -144,7 +144,7 @@ void adamForwardUpdatesCPUKernel(const scalar_t* __restrict__ new_mu_ptr, const other_t eps, const other_t eps_root, const size_t n, scalar_t* __restrict__ updates_out_ptr) { -#pragma omp parallel for num_threads(32) +#pragma omp parallel for num_threads(omp_get_num_procs()) for (size_t tid = 0; tid < n; ++tid) { const scalar_t new_mu = new_mu_ptr[tid]; const scalar_t new_nu = new_nu_ptr[tid]; @@ -185,7 +185,7 @@ void adamBackwardMuCPUKernel(const scalar_t* __restrict__ dmu_ptr, const other_t b1, const size_t n, scalar_t* __restrict__ dupdates_out_ptr, scalar_t* __restrict__ dmu_out_ptr) { -#pragma omp parallel for num_threads(32) +#pragma omp parallel for num_threads(omp_get_num_procs()) for (size_t tid = 0; tid < n; ++tid) { const scalar_t dmu = dmu_ptr[tid]; @@ -220,7 +220,7 @@ void adamBackwardNuCPUKernel(const scalar_t* __restrict__ dnu_ptr, const other_t b2, const size_t n, scalar_t* __restrict__ dupdates_out_ptr, scalar_t* __restrict__ dnu_out_ptr) { -#pragma omp parallel for num_threads(32) +#pragma omp parallel for num_threads(omp_get_num_procs()) for (size_t tid = 0; tid < n; ++tid) { const scalar_t dnu = dnu_ptr[tid]; const scalar_t updates = updates_ptr[tid]; @@ -259,7 +259,7 @@ void adamBackwardUpdatesCPUKernel(const scalar_t* __restrict__ dupdates_ptr, const size_t n, scalar_t* __restrict__ dnew_mu_out_ptr, scalar_t* __restrict__ dnew_nu_out_ptr) { -#pragma omp parallel for num_threads(32) +#pragma omp parallel for num_threads(omp_get_num_procs()) for (size_t tid = 0; tid < n; ++tid) { const scalar_t dupdates = dupdates_ptr[tid]; const scalar_t updates = updates_ptr[tid]; From 968319a33a42e74dd3448a38755a0ae4363d8928 Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Tue, 26 Jul 2022 20:23:17 +0800 Subject: [PATCH 03/11] fix(pyproject): update package classifiers --- .github/workflows/build.yml | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 76ec0319..d7d53a3a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -124,7 +124,7 @@ jobs: while read -r PYTHON; do PYVER="cp$("${PYTHON}" --version | cut -d ' ' -f2 | cut -d '.' -f-2 | tr -d '.')" echo "Audit and repair wheel for Python: ${PYTHON} (${PYVER})" - LIBTORCH_PATH="$("${PYTHON}" -c 'import os, site; print(os.path.join(site.getsitepackages()[0], "torch", "lib"))')" + LIBTORCH_PATH="$("${PYTHON}" -c 'import os, sysconfig; print(os.path.join(sysconfig.get_path("purelib"), "torch", "lib"))')" "${PYTHON}" -m pip install --upgrade git+https://github.com/XuehaiPan/auditwheel.git@torchopt ( export LD_LIBRARY_PATH="${LIBTORCH_PATH}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" diff --git a/pyproject.toml b/pyproject.toml index d76dd3dc..3148ae33 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ keywords = [ ] classifiers = [ "Development Status :: 4 - Beta", - "License :: OSI Approved :: Apache Software License 2.0 (Apache-2.0)", + "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", From aa0bae6bae3eb86597a9cc02b763e3be7a1e6341 Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Wed, 27 Jul 2022 19:39:23 +0800 Subject: [PATCH 04/11] fix(readthedocs): fix readthedocs integration --- .readthedocs.yaml | 10 ++++------ docs/requirements.txt | 2 +- pyproject.toml | 2 +- setup.py | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 88b7a202..28613f02 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -10,6 +10,10 @@ build: os: ubuntu-20.04 tools: python: mambaforge-4.10 + jobs: + post_install: + - python -m pip install --upgrade pip setuptools + - python -m pip install --no-build-isolation --edit . # Optionally declare the Python requirements required to build your docs conda: @@ -24,9 +28,3 @@ sphinx: builder: html configuration: docs/source/conf.py fail_on_warning: true - -# Optionally declare the Python requirements required to build your docs -python: - install: - - method: pip - path: . diff --git a/docs/requirements.txt b/docs/requirements.txt index 61b877af..d63f7aef 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ ---extra-index-url https://download.pytorch.org/whl/cu116 +--extra-index-url https://download.pytorch.org/whl/cpu torch == 1.12 torchvision functorch diff --git a/pyproject.toml b/pyproject.toml index 3148ae33..0cfbdb2e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ authors = [ {name = "Xidong Feng", email = "xidong.feng.20@ucl.ac.uk"}, {name = "Bo Liu", email = "benjaminliu.eecs@gmail.com"}, ] -license = {file = "LICENSE"} +license = {text = "Apache License, Version 2.0"} keywords = [ "PyTorch", "functorch", diff --git a/setup.py b/setup.py index 169a767c..a3dfe441 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ import shutil import sys -from setuptools import find_packages, setup +from setuptools import setup try: From f954f47d2b4f33815349409a848a68e0bf0e8cf7 Mon Sep 17 00:00:00 2001 From: Bo Liu Date: Wed, 27 Jul 2022 20:07:25 +0800 Subject: [PATCH 05/11] feat: add question/help/support issue template (#43) --- .../ISSUE_TEMPLATE/questions_help_support.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/questions_help_support.md diff --git a/.github/ISSUE_TEMPLATE/questions_help_support.md b/.github/ISSUE_TEMPLATE/questions_help_support.md new file mode 100644 index 00000000..072d2e52 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/questions_help_support.md @@ -0,0 +1,17 @@ +--- +name: Questions / Help / Support +about: Do you need support? +title: "[Question]" +labels: "question" +assignees: Benjamin-eecs + +--- + +## Questions + + + +## Checklist + +- [ ] I have checked that there is no similar issue in the repo (**required**) +- [ ] I have read the [documentation](https://torchopt.readthedocs.io/) (**required**) From 583666157d74d6de6b18be6c4cdc5ad291823e85 Mon Sep 17 00:00:00 2001 From: Bo Liu Date: Wed, 3 Aug 2022 19:57:56 +0800 Subject: [PATCH 06/11] fix(examples): correct MAML-RL implementation (#47) fix gamma error in MAML-RL example --- docs/source/index.rst | 10 +++++----- examples/MAML-RL/maml.png | Bin 52677 -> 184840 bytes examples/MAML-RL/maml.py | 9 +++------ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 892a1090..157eb5ad 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -11,12 +11,12 @@ TorchOpt Installation ------------ -Requirements +Requirements: -- PyTorch -- JAX -- (Optional) For visualizing computation graphs - - `Graphviz `_ (for Linux users use ``apt/yum install graphviz`` or ``conda install -c anaconda python-graphviz``) +* PyTorch +* JAX +* (Optional) For visualizing computation graphs + * `Graphviz `_ (for Linux users use ``apt/yum install graphviz`` or ``conda install -c anaconda python-graphviz``) Please follow the instructions at https://pytorch.org to install PyTorch in your Python environment first. Then run the following command to install TorchOpt from PyPI: diff --git a/examples/MAML-RL/maml.png b/examples/MAML-RL/maml.png index 8aaad571011b668bfed90e354471368613e6e10a..221462c813f415721bd5ed0fcdf60d314b2a31b5 100644 GIT binary patch literal 184840 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

Z5#&Xd`8Qfy5ftBI8g?Mjjw(=rrY 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 Date: Thu, 4 Aug 2022 16:39:57 +0800 Subject: [PATCH 07/11] feat(workflows): cibuildwheel integration (#45) --- .github/workflows/build.yml | 194 +++++++++---------------- .github/workflows/lint.yml | 6 +- .github/workflows/tests.yml | 2 + .readthedocs.yaml | 2 +- CHANGELOG.md | 1 + CMakeLists.txt | 3 +- README.md | 2 +- docs/source/developer/contributing.rst | 31 +++- docs/source/spelling_wordlist.txt | 1 + pyproject.toml | 92 ++++++++++-- tests/requirements.txt | 2 +- 11 files changed, 194 insertions(+), 142 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d7d53a3a..1f1be388 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,6 +20,14 @@ on: - published # Allow to trigger the workflow manually workflow_dispatch: + inputs: + task: + description: "Task type" + type: choice + options: + - build-only + - build-and-publish + required: true permissions: contents: read @@ -28,11 +36,15 @@ concurrency: group: "${{ github.workflow }}-${{ github.ref }}" cancel-in-progress: ${{ github.event_name == 'pull_request' }} +env: + CUDA_VERSION: "11.6" + TEST_TORCH_SPECS: "cpu cu113 cu116" + jobs: - build: - runs-on: ubuntu-18.04 + build-sdist: + runs-on: ubuntu-latest if: github.repository == 'metaopt/TorchOpt' && (github.event_name != 'push' || startsWith(github.ref, 'refs/tags/')) - timeout-minutes: 45 + timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v3 @@ -40,135 +52,65 @@ jobs: submodules: "recursive" fetch-depth: 1 - - name: Set up Python 3.7 - id: py37 + - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.7" - update-environment: false + python-version: "3.7 - 3.10" + update-environment: true - - name: Set up Python 3.8 - id: py38 - uses: actions/setup-python@v4 - with: - python-version: "3.8" - update-environment: false + - name: Install dependencies + run: python -m pip install --upgrade pip setuptools wheel build - - name: Set up Python 3.9 - id: py39 - uses: actions/setup-python@v4 - with: - python-version: "3.9" - update-environment: false + - name: Build sdist + run: python -m build --sdist - - name: Set up Python 3.10 - id: py310 - uses: actions/setup-python@v4 + - name: Upload artifact + uses: actions/upload-artifact@v3 with: - python-version: "3.10" - update-environment: false + name: sdist + path: dist/*.tar.gz + if-no-files-found: error - - name: Set up Python executable paths - run: | - echo "${{ steps.py37.outputs.python-path }}" > .python-paths - echo "${{ steps.py38.outputs.python-path }}" >> .python-paths - echo "${{ steps.py39.outputs.python-path }}" >> .python-paths - echo "${{ steps.py310.outputs.python-path }}" >> .python-paths - - - name: Setup CUDA Toolkit - uses: Jimver/cuda-toolkit@v0.2.7 - id: cuda-toolkit + build-wheels: + runs-on: ubuntu-latest + needs: [build-sdist] + if: github.repository == 'metaopt/TorchOpt' && (github.event_name != 'push' || startsWith(github.ref, 'refs/tags/')) + timeout-minutes: 60 + steps: + - name: Checkout + uses: actions/checkout@v3 with: - cuda: "11.6.2" - method: network - sub-packages: '["nvcc"]' - - run: | - CUDA_VERSION="${{steps.cuda-toolkit.outputs.cuda}}" - echo "CUDA_VERSION=${CUDA_VERSION}" >> "${GITHUB_ENV}" - TORCH_INDEX_URL="https://download.pytorch.org/whl/cu$(echo "${CUDA_VERSION}" | cut -d'.' -f-2 | tr -d '.')" - echo "TORCH_INDEX_URL=${TORCH_INDEX_URL}" >> "${GITHUB_ENV}" - - echo "Installed CUDA version is: ${CUDA_VERSION}" - echo "CUDA install location: ${{steps.cuda-toolkit.outputs.CUDA_PATH}}" - nvcc -V - echo "Torch index URL: ${TORCH_INDEX_URL}" - - - name: Build sdist and wheels - run: | - DEFAULT_PYTHON="$(head -n 1 .python-paths)" - - while read -r PYTHON; do - echo "Building wheel with Python: ${PYTHON} ($("${PYTHON}" --version))" - "${PYTHON}" -m pip install --upgrade pip setuptools wheel build - "${PYTHON}" -m pip install --extra-index-url "${TORCH_INDEX_URL}" \ - -r requirements.txt - if [[ "${PYTHON}" == "${DEFAULT_PYTHON}" ]]; then - "${PYTHON}" -m build - else - "${PYTHON}" -m build --wheel - fi - done < .python-paths - - - name: List built sdist and wheels - run: | - if [[ -n "$(find dist -maxdepth 0 -not -empty -print 2>/dev/null)" ]]; then - echo "Built sdist and wheels:" - ls -lh dist/ - else - echo "No sdist and wheels are built." - exit 1 - fi + submodules: "recursive" + fetch-depth: 1 - - name: Audit and repair wheels - run: | - while read -r PYTHON; do - PYVER="cp$("${PYTHON}" --version | cut -d ' ' -f2 | cut -d '.' -f-2 | tr -d '.')" - echo "Audit and repair wheel for Python: ${PYTHON} (${PYVER})" - LIBTORCH_PATH="$("${PYTHON}" -c 'import os, sysconfig; print(os.path.join(sysconfig.get_path("purelib"), "torch", "lib"))')" - "${PYTHON}" -m pip install --upgrade git+https://github.com/XuehaiPan/auditwheel.git@torchopt - ( - export LD_LIBRARY_PATH="${LIBTORCH_PATH}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" - echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" - "${PYTHON}" -m auditwheel show dist/torchopt-*-${PYVER}-*.whl && - "${PYTHON}" -m auditwheel repair --plat manylinux2014_x86_64 --wheel-dir wheelhouse dist/torchopt-*-${PYVER}-*.whl - ) - done < .python-paths - - rm dist/torchopt-*.whl - mv wheelhouse/torchopt-*manylinux*.whl dist/ - - - name: List built sdist and wheels - run: | - if [[ -n "$(find dist -maxdepth 0 -not -empty -print 2>/dev/null)" ]]; then - echo "Built sdist and wheels:" - ls -lh dist/ - else - echo "No sdist and wheels are built." - exit 1 - fi + - name: Build wheels + uses: pypa/cibuildwheel@v2.8.1 + with: + package-dir: . + output-dir: wheelhouse + config-file: "{package}/pyproject.toml" - - name: Test sdist and wheels - run: | - DEFAULT_PYTHON="$(head -n 1 .python-paths)" - while read -r PYTHON; do - PYVER="cp$("${PYTHON}" --version | cut -d ' ' -f2 | cut -d '.' -f-2 | tr -d '.')" - mkdir -p "temp-${PYVER}" - pushd "temp-${PYVER}" - if [[ "${PYTHON}" == "${DEFAULT_PYTHON}" ]]; then - echo "Testing sdist with Python: ${PYTHON} (${PYVER})" - "${PYTHON}" -m pip uninstall torch torchopt -y - "${PYTHON}" -m pip install --extra-index-url https://download.pytorch.org/whl/cpu \ - ../dist/torchopt-*.tar.gz - "${PYTHON}" -c 'import torchopt' - fi - echo "Testing wheel with Python: ${PYTHON} (${PYVER})" - "${PYTHON}" -m pip uninstall torch torchopt -y - "${PYTHON}" -m pip install --extra-index-url https://download.pytorch.org/whl/cpu \ - ../dist/torchopt-*-${PYVER}-*.whl - "${PYTHON}" -c 'import torchopt' - "${PYTHON}" -m pip uninstall torch torchopt -y - popd - done < .python-paths + - uses: actions/upload-artifact@v3 + with: + name: wheels + path: wheelhouse/*.whl + if-no-files-found: error + + publish: + runs-on: ubuntu-latest + needs: [build-sdist, build-wheels] + if: | + github.repository == 'metaopt/TorchOpt' && + (github.event_name != 'workflow_dispatch' || github.event.inputs.task == 'build-and-publish') && + (github.event_name != 'push' || startsWith(github.ref, 'refs/tags/')) + timeout-minutes: 15 + steps: + - name: Set up Python + uses: actions/setup-python@v4 + if: startsWith(github.ref, 'refs/tags/') + with: + python-version: "3.7 - 3.10" + update-environment: true - name: Check consistency between the package version and release tag if: startsWith(github.ref, 'refs/tags/') @@ -181,6 +123,14 @@ jobs: exit 1 fi + - name: Download built sdist and wheels + uses: actions/download-artifact@v3 + with: + # unpacks default artifact into dist/ + # if `name: artifact` is omitted, the action will create extra parent dir + name: artifact + path: dist + - name: Publish to TestPyPI if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' uses: pypa/gh-action-pypi-publish@v1.5.0 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f2393c77..f262f5c6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,6 +5,8 @@ on: branches: - main pull_request: + # Allow to trigger the workflow manually + workflow_dispatch: permissions: contents: read @@ -55,7 +57,9 @@ jobs: - name: Install dependencies run: | python -m pip install --extra-index-url "${TORCH_INDEX_URL}" \ - -r tests/requirements.txt -r docs/requirements.txt + -r tests/requirements.txt + python -m pip install --extra-index-url "${TORCH_INDEX_URL}" \ + -r docs/requirements.txt - name: Install TorchOpt run: | diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5c62ff1b..65e5b0cc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,6 +16,8 @@ on: - tests/** - torchopt/** - .github/workflows/tests.yml + # Allow to trigger the workflow manually + workflow_dispatch: permissions: contents: read diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 28613f02..73e1e60f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -13,7 +13,7 @@ build: jobs: post_install: - python -m pip install --upgrade pip setuptools - - python -m pip install --no-build-isolation --edit . + - python -m pip install --no-build-isolation --editable . # Optionally declare the Python requirements required to build your docs conda: diff --git a/CHANGELOG.md b/CHANGELOG.md index 104bce25..3788b80e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Use [`cibuildwheel`](https://github.com/pypa/cibuildwheel) to build wheels by [@XuehaiPan](https://github.com/XuehaiPan) in [#45](https://github.com/metaopt/TorchOpt/pull/45). - Use dynamic process number in CPU kernels by [@JieRen98](https://github.com/JieRen98) in [#42](https://github.com/metaopt/TorchOpt/pull/42). ------ diff --git a/CMakeLists.txt b/CMakeLists.txt index 523dc849..f2e6ee07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,8 +144,7 @@ endif() unset(TORCH_LIBRARIES) foreach(VAR_PATH ${TORCH_LIBRARY_PATH}) - file(GLOB TORCH_LIBRARY "${VAR_PATH}/*.so") - list(APPEND TORCH_LIBRARIES "${TORCH_LIBRARY}") + list(APPEND TORCH_LIBRARIES "${VAR_PATH}/libtorch_python.so") endforeach() message(STATUS "Detected Torch libraries: \"${TORCH_LIBRARIES}\"") diff --git a/README.md b/README.md index c73ae163..c57b0f26 100644 --- a/README.md +++ b/README.md @@ -243,7 +243,7 @@ cd TorchOpt CONDA_OVERRIDE_CUDA=11.7 conda env create --file conda-recipe.yaml conda activate torchopt -pip3 install -e . +pip3 install --no-build-isolation --editable . ``` -------------------------------------------------------------------------------- diff --git a/docs/source/developer/contributing.rst b/docs/source/developer/contributing.rst index 278e2900..71066f9e 100644 --- a/docs/source/developer/contributing.rst +++ b/docs/source/developer/contributing.rst @@ -33,17 +33,17 @@ Then you are ready to rock. Thanks for contributing to TorchOpt! Install Develop Version ----------------------- -To install TorchOpt in an "editable" mode, run +To install TorchOpt in an "editable" mode, run: .. code-block:: bash - pip install -e . + pip3 install --no-build-isolation --editable . -in the main directory. This installation is removable by +in the main directory. This installation is removable by: .. code-block:: bash - python setup.py develop --uninstall + pip3 uninstall torchopt Lint Check @@ -75,13 +75,34 @@ To check if everything conforms to the specification, run: Test Locally ------------ -This command will run automatic tests in the main directory +This command will run automatic tests in the main directory: .. code-block:: bash $ make test +Build Wheels +------------ + +To build compatible **manylinux2014** (:pep:`599`) wheels for distribution, you can use |cibuildwheel|_. You will need to install |docker|_ first. Then run the following command: + +.. code-block:: bash + + pip3 install --upgrade cibuildwheel + + export TEST_TORCH_SPECS="cpu cu113 cu116" # `torch` builds for testing + export CUDA_VERSION="11.6" # version of `nvcc` for compilation + python3 -m cibuildwheel --platform=linux --output-dir=wheelhouse --config-file=pyproject.toml + +It will installs the CUDA compiler with ``CUDA_VERSION`` in the build container. Then build wheel binaries for all supported CPython versions. The outputs will be placed in the ``wheelhouse`` directory. + +.. |cibuildwheel| replace:: ``cibuildwheel`` +.. _cibuildwheel: https://github.com/pypa/cibuildwheel + +.. |docker| replace:: ``docker`` +.. _docker: https://www.docker.com + Documentation ------------- diff --git a/docs/source/spelling_wordlist.txt b/docs/source/spelling_wordlist.txt index db1e67a1..4fc50e3c 100644 --- a/docs/source/spelling_wordlist.txt +++ b/docs/source/spelling_wordlist.txt @@ -69,3 +69,4 @@ sgd SGD CHANGELOG Changelog +CPython diff --git a/pyproject.toml b/pyproject.toml index 0cfbdb2e..61ca1cfc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,5 @@ +# Package ###################################################################### + [build-system] requires = ["setuptools", "torch == 1.12", "numpy", "pybind11"] build-backend = "setuptools.build_meta" @@ -8,13 +10,13 @@ description = "A Jax-style optimizer for PyTorch." readme = "README.md" requires-python = ">= 3.7" authors = [ - {name = "TorchOpt Contributors"}, - {name = "Xuehai Pan", email = "XuehaiPan@pku.edu.cn"}, - {name = "Jie Ren", email = "jieren9806@gmail.com"}, - {name = "Xidong Feng", email = "xidong.feng.20@ucl.ac.uk"}, - {name = "Bo Liu", email = "benjaminliu.eecs@gmail.com"}, + { name = "TorchOpt Contributors" }, + { name = "Xuehai Pan", email = "XuehaiPan@pku.edu.cn" }, + { name = "Jie Ren", email = "jieren9806@gmail.com" }, + { name = "Xidong Feng", email = "xidong.feng.20@ucl.ac.uk" }, + { name = "Bo Liu", email = "benjaminliu.eecs@gmail.com" }, ] -license = {text = "Apache License, Version 2.0"} +license = { text = "Apache License, Version 2.0" } keywords = [ "PyTorch", "functorch", @@ -48,9 +50,7 @@ dependencies = [ "graphviz", "typing-extensions", ] -dynamic = [ - "version", -] +dynamic = ["version"] [project.urls] Homepage = "https://github.com/metaopt/TorchOpt" @@ -58,9 +58,83 @@ Repository = "https://github.com/metaopt/TorchOpt" Documentation = "https://torchopt.readthedocs.io" "Bug Report" = "https://github.com/metaopt/TorchOpt/issues" +[project.optional-dependencies] +lint = [ + "isort", + "black >= 22.6.0", + "pylint", + "mypy", + "flake8", + "flake8-bugbear", + "doc8", + "pydocstyle", + "pyenchant", + "cpplint", + "pre-commit", +] +test = ['torchvision', 'functorch', 'pytest', 'pytest-cov', 'pytest-xdist'] + [tool.setuptools.packages.find] include = ["torchopt", "torchopt.*"] +# Wheel builder ################################################################ +# Reference: https://cibuildwheel.readthedocs.io +[tool.cibuildwheel] +archs = ["x86_64"] +build = "*manylinux*" +skip = "pp*" +build-frontend = "pip" +build-verbosity = 3 +environment.CUDACXX = "/usr/local/cuda/bin/nvcc" +environment.DEFAULT_CUDA_VERSION = "11.6" +environment.DEFAULT_TEST_TORCH_SPECS = "cpu cu113 cu116" +environment-pass = ["CUDA_VERSION", "TEST_TORCH_SPECS"] +container-engine = "docker" + +before-all = """ + CUDA_VERSION="$(echo "${CUDA_VERSION:-"${DEFAULT_CUDA_VERSION}"}" | cut -d"." -f-2)" + CUDA_PKG_SUFFIX="$(echo "${CUDA_VERSION}" | tr "." "-")" + echo "CUDA_VERSION=${CUDA_VERSION}" + yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo + yum clean all + yum install -y nvidia-driver-latest-libs "cuda-minimal-build-${CUDA_PKG_SUFFIX}" + """ +test-extras = ["test"] +test-command = """ + SITE_PACKAGES="$(python -c 'print(__import__("sysconfig").get_path("purelib"))')" + TORCH_LIB_PATH="${SITE_PACKAGES}/torch/lib" + echo "ls ${TORCH_LIB_PATH}"; ls -lh "${TORCH_LIB_PATH}" + find "${SITE_PACKAGES}/torchopt" -name "*.so" -print0 | + xargs -0 -I '{}' bash -c "echo 'ldd {}'; ldd '{}'; echo 'patchelf --print-rpath {}'; patchelf --print-rpath '{}'" + make -C "{project}" test || true + TORCH_VERSION="$(python -c 'print(__import__("torch").__version__.partition("+")[0])')" + TEST_TORCH_SPECS="${TEST_TORCH_SPECS:-"${DEFAULT_TEST_TORCH_SPECS}"}" + for spec in ${TEST_TORCH_SPECS}; do + python -m pip uninstall -y torch torchvision + export PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/${spec}" + echo "PIP_EXTRA_INDEX_URL='${PIP_EXTRA_INDEX_URL}'" + python -m pip install "torch==${TORCH_VERSION}" torchvision + echo "ls ${TORCH_LIB_PATH}"; ls -lh "${TORCH_LIB_PATH}" + find "${SITE_PACKAGES}/torchopt" -name "*.so" -print0 | + xargs -0 -I '{}' bash -c "echo 'ldd {}'; ldd '{}'; echo 'patchelf --print-rpath {}'; patchelf --print-rpath '{}'" + make -C "{project}" test || exit 1 + done + """ + +[tool.cibuildwheel.linux] +repair-wheel-command = """ + python -m pip install -r requirements.txt + SITE_PACKAGES="$(python -c 'print(__import__("sysconfig").get_path("purelib"))')" + TORCH_LIB_PATH="${SITE_PACKAGES}/torch/lib" + export LD_LIBRARY_PATH="${TORCH_LIB_PATH}:/usr/local/cuda/lib64:/usr/local/cuda/targets/x86_64-linux/lib/stubs${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" + echo "ls ${TORCH_LIB_PATH}"; ls -lh "${TORCH_LIB_PATH}" + python -m pip install --force-reinstall git+https://github.com/XuehaiPan/auditwheel.git@torchopt + python -m auditwheel lddtree "{wheel}" + python -m auditwheel repair --wheel-dir="{dest_dir}" "{wheel}" + """ + +# Linter tools ################################################################# + [tool.black] safe = true line-length = 100 diff --git a/tests/requirements.txt b/tests/requirements.txt index 6cf7a2a1..ff5b6ea2 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -14,7 +14,7 @@ pylint mypy flake8 flake8-bugbear -doc8 +doc8 < 1.0.0a pydocstyle pyenchant cpplint From 3f192465ab5d4037c462fb373c78a1e94ee40be2 Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Sun, 7 Aug 2022 01:44:21 +0800 Subject: [PATCH 08/11] chore(workflows): do not publish wheels in pull requests --- .github/workflows/build.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1f1be388..bebf3cf1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -100,7 +100,7 @@ jobs: runs-on: ubuntu-latest needs: [build-sdist, build-wheels] if: | - github.repository == 'metaopt/TorchOpt' && + github.repository == 'metaopt/TorchOpt' && github.event_name != 'pull_request' && (github.event_name != 'workflow_dispatch' || github.event.inputs.task == 'build-and-publish') && (github.event_name != 'push' || startsWith(github.ref, 'refs/tags/')) timeout-minutes: 15 @@ -123,12 +123,20 @@ jobs: exit 1 fi - - name: Download built sdist and wheels + - name: Download built sdist uses: actions/download-artifact@v3 with: # unpacks default artifact into dist/ # if `name: artifact` is omitted, the action will create extra parent dir - name: artifact + name: sdist + path: dist + + - name: Download built wheels + uses: actions/download-artifact@v3 + with: + # unpacks default artifact into dist/ + # if `name: artifact` is omitted, the action will create extra parent dir + name: wheels path: dist - name: Publish to TestPyPI From 5b5b21d3a4810f3370f5fa7363be42005591d45f Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Sun, 7 Aug 2022 21:08:29 +0800 Subject: [PATCH 09/11] feat: CPU-only build (#51) --- CHANGELOG.md | 1 + CMakeLists.txt | 37 +++++++++++------ README.md | 1 - .../{adam_op_impl.h => adam_op_impl_cpu.h} | 0 ...adam_op_impl.cuh => adam_op_impl_cuda.cuh} | 0 pyproject.toml | 20 +++++---- src/adam_op/CMakeLists.txt | 33 +++------------ src/adam_op/adam_op.cpp | 41 +++++++++++++++---- ...{adam_op_impl.cpp => adam_op_impl_cpu.cpp} | 2 +- .../{adam_op_impl.cu => adam_op_impl_cuda.cu} | 2 +- 10 files changed, 77 insertions(+), 60 deletions(-) rename include/adam_op/{adam_op_impl.h => adam_op_impl_cpu.h} (100%) rename include/adam_op/{adam_op_impl.cuh => adam_op_impl_cuda.cuh} (100%) rename src/adam_op/{adam_op_impl.cpp => adam_op_impl_cpu.cpp} (99%) rename src/adam_op/{adam_op_impl.cu => adam_op_impl_cuda.cu} (99%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3788b80e..94cb21b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- CPU-only build without `nvcc` requirement by [@XuehaiPan](https://github.com/XuehaiPan) in [#51](https://github.com/metaopt/TorchOpt/pull/51). - Use [`cibuildwheel`](https://github.com/pypa/cibuildwheel) to build wheels by [@XuehaiPan](https://github.com/XuehaiPan) in [#45](https://github.com/metaopt/TorchOpt/pull/45). - Use dynamic process number in CPU kernels by [@JieRen98](https://github.com/JieRen98) in [#42](https://github.com/metaopt/TorchOpt/pull/42). diff --git a/CMakeLists.txt b/CMakeLists.txt index f2e6ee07..b4b5400c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,33 +13,43 @@ # limitations under the License. # ============================================================================== -cmake_minimum_required(VERSION 3.4) -project(torchopt LANGUAGES CXX CUDA) +cmake_minimum_required(VERSION 3.8) +project(torchopt LANGUAGES CXX) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() -find_package(CUDA REQUIRED) -cuda_select_nvcc_arch_flags(CUDA_ARCH_FLAGS All) -list(APPEND CUDA_NVCC_FLAGS ${CUDA_ARCH_FLAGS}) - set(CMAKE_CXX_STANDARD 14) -set(CMAKE_CUDA_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pthread -fPIC -fopenmp") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") -set(CMAKE_CUDA_FLAGS_RELEASE "${CMAKE_CUDA_FLAGS_RELEASE} -O3") + +find_package(CUDA) + +if(CUDA_FOUND) + message(STATUS "Found CUDA, enabling CUDA support.") + enable_language(CUDA) + + cuda_select_nvcc_arch_flags(CUDA_ARCH_FLAGS All) + list(APPEND CUDA_NVCC_FLAGS ${CUDA_ARCH_FLAGS}) + set(CMAKE_CUDA_STANDARD 14) + set(CMAKE_CUDA_FLAGS_RELEASE "${CMAKE_CUDA_FLAGS_RELEASE} -O3") +else() + message(STATUS "CUDA not found, build for CPU-only.") +endif() function(system) set(options STRIP) set(oneValueArgs OUTPUT_VARIABLE ERROR_VARIABLE WORKING_DIRECTORY) set(multiValueArgs COMMAND) - cmake_parse_arguments(SYSTEM - "${options}" - "${oneValueArgs}" - "${multiValueArgs}" - "${ARGN}") + cmake_parse_arguments( + SYSTEM + "${options}" + "${oneValueArgs}" + "${multiValueArgs}" + "${ARGN}" + ) if(NOT DEFINED SYSTEM_WORKING_DIRECTORY) set(SYSTEM_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}") @@ -51,6 +61,7 @@ function(system) ERROR_VARIABLE STDERR WORKING_DIRECTORY "${SYSTEM_WORKING_DIRECTORY}" ) + if("${SYSTEM_STRIP}") string(STRIP "${STDOUT}" STDOUT) string(STRIP "${STDERR}" STDERR) diff --git a/README.md b/README.md index c57b0f26..45be2ecb 100644 --- a/README.md +++ b/README.md @@ -252,7 +252,6 @@ pip3 install --no-build-isolation --editable . - [ ] Support general implicit differentiation with functional programing. - [ ] Support more optimizers such as AdamW, RMSProp -- [ ] CPU-accelerated optimizer ## Changelog diff --git a/include/adam_op/adam_op_impl.h b/include/adam_op/adam_op_impl_cpu.h similarity index 100% rename from include/adam_op/adam_op_impl.h rename to include/adam_op/adam_op_impl_cpu.h diff --git a/include/adam_op/adam_op_impl.cuh b/include/adam_op/adam_op_impl_cuda.cuh similarity index 100% rename from include/adam_op/adam_op_impl.cuh rename to include/adam_op/adam_op_impl_cuda.cuh diff --git a/pyproject.toml b/pyproject.toml index 61ca1cfc..f2952354 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,12 +92,18 @@ environment-pass = ["CUDA_VERSION", "TEST_TORCH_SPECS"] container-engine = "docker" before-all = """ - CUDA_VERSION="$(echo "${CUDA_VERSION:-"${DEFAULT_CUDA_VERSION}"}" | cut -d"." -f-2)" - CUDA_PKG_SUFFIX="$(echo "${CUDA_VERSION}" | tr "." "-")" - echo "CUDA_VERSION=${CUDA_VERSION}" - yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo - yum clean all - yum install -y nvidia-driver-latest-libs "cuda-minimal-build-${CUDA_PKG_SUFFIX}" + CUDA_VERSION="${CUDA_VERSION:-"${DEFAULT_CUDA_VERSION}"}" + if [[ "${CUDA_VERSION}" == "None" || "${CUDA_VERSION}" == "none" ]]; then + sed -i -E "s/__version__\\s*=\\s*.*$/\\0 + '+cpu'/" torchopt/version.py + else + CUDA_VERSION="$(echo "${CUDA_VERSION}" | cut -d"." -f-2)" + CUDA_PKG_SUFFIX="$(echo "${CUDA_VERSION}" | tr "." "-")" + echo "CUDA_VERSION=${CUDA_VERSION}" + yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo + yum clean all + yum install -y nvidia-driver-latest-libs "cuda-minimal-build-${CUDA_PKG_SUFFIX}" + fi + echo "cat torchopt/version.py"; cat torchopt/version.py """ test-extras = ["test"] test-command = """ @@ -130,7 +136,7 @@ repair-wheel-command = """ echo "ls ${TORCH_LIB_PATH}"; ls -lh "${TORCH_LIB_PATH}" python -m pip install --force-reinstall git+https://github.com/XuehaiPan/auditwheel.git@torchopt python -m auditwheel lddtree "{wheel}" - python -m auditwheel repair --wheel-dir="{dest_dir}" "{wheel}" + python -m auditwheel repair --no-copy-site-libs --wheel-dir="{dest_dir}" "{wheel}" """ # Linter tools ################################################################# diff --git a/src/adam_op/CMakeLists.txt b/src/adam_op/CMakeLists.txt index cea0371b..3c7226e3 100644 --- a/src/adam_op/CMakeLists.txt +++ b/src/adam_op/CMakeLists.txt @@ -13,36 +13,13 @@ # limitations under the License. # ============================================================================== -# add_library( -# adam_op_CUDA SHARED -# adam_op_impl.cu -# ) +set(adam_op_src adam_op.cpp adam_op_impl_cpu.cpp) -# target_link_libraries( -# adam_op_CUDA -# ${TORCH_LIBRARIES} -# ) +if(CUDA_FOUND) + list(APPEND adam_op_src adam_op_impl_cuda.cu) +endif() -# add_library( -# adam_op_CPU SHARED -# adam_op_impl.cpp -# ) - -# target_link_libraries( -# adam_op_CPU -# ${TORCH_LIBRARIES} -# ) - -# pybind11_add_module(adam_op adam_op.cpp) - -# target_link_libraries( -# adam_op PRIVATE -# adam_op_CPU -# adam_op_CUDA -# ${TORCH_LIBRARIES} -# ) - -pybind11_add_module(adam_op adam_op.cpp adam_op_impl.cpp adam_op_impl.cu) +pybind11_add_module(adam_op "${adam_op_src}") target_link_libraries( adam_op PRIVATE diff --git a/src/adam_op/adam_op.cpp b/src/adam_op/adam_op.cpp index a11c0116..7f107175 100644 --- a/src/adam_op/adam_op.cpp +++ b/src/adam_op/adam_op.cpp @@ -18,8 +18,10 @@ #include #include -#include "include/adam_op/adam_op_impl.cuh" -#include "include/adam_op/adam_op_impl.h" +#include "include/adam_op/adam_op_impl_cpu.h" +#if defined(__CUDACC__) +#include "include/adam_op/adam_op_impl_cuda.cuh" +#endif namespace torchopt { TensorArray<3> adamForwardInplace(const torch::Tensor& updates, @@ -27,10 +29,13 @@ TensorArray<3> adamForwardInplace(const torch::Tensor& updates, const torch::Tensor& nu, const float b1, const float b2, const float eps, const float eps_root, const int count) { +#if defined(__CUDACC__) if (updates.device().is_cuda()) { return adamForwardInplaceCUDA(updates, mu, nu, b1, b2, eps, eps_root, count); - } else if (updates.device().is_cpu()) { + } +#endif + if (updates.device().is_cpu()) { return adamForwardInplaceCPU(updates, mu, nu, b1, b2, eps, eps_root, count); } else { throw std::runtime_error("Not implemented"); @@ -38,9 +43,12 @@ TensorArray<3> adamForwardInplace(const torch::Tensor& updates, } torch::Tensor adamForwardMu(const torch::Tensor& updates, const torch::Tensor& mu, const float b1) { +#if defined(__CUDACC__) if (updates.device().is_cuda()) { return adamForwardMuCUDA(updates, mu, b1); - } else if (updates.device().is_cpu()) { + } +#endif + if (updates.device().is_cpu()) { return adamForwardMuCPU(updates, mu, b1); } else { throw std::runtime_error("Not implemented"); @@ -49,9 +57,12 @@ torch::Tensor adamForwardMu(const torch::Tensor& updates, torch::Tensor adamForwardNu(const torch::Tensor& updates, const torch::Tensor& nu, const float b2) { +#if defined(__CUDACC__) if (updates.device().is_cuda()) { return adamForwardNuCUDA(updates, nu, b2); - } else if (updates.device().is_cpu()) { + } +#endif + if (updates.device().is_cpu()) { return adamForwardNuCPU(updates, nu, b2); } else { throw std::runtime_error("Not implemented"); @@ -62,9 +73,12 @@ torch::Tensor adamForwardUpdates(const torch::Tensor& new_mu, const torch::Tensor& new_nu, const float b1, const float b2, const float eps, const float eps_root, const int count) { +#if defined(__CUDACC__) if (new_mu.device().is_cuda()) { return adamForwardUpdatesCUDA(new_mu, new_nu, b1, b2, eps, eps_root, count); - } else if (new_mu.device().is_cpu()) { + } +#endif + if (new_mu.device().is_cpu()) { return adamForwardUpdatesCPU(new_mu, new_nu, b1, b2, eps, eps_root, count); } else { throw std::runtime_error("Not implemented"); @@ -74,9 +88,12 @@ torch::Tensor adamForwardUpdates(const torch::Tensor& new_mu, TensorArray<2> adamBackwardMu(const torch::Tensor& dmu, const torch::Tensor& updates, const torch::Tensor& mu, const float b1) { +#if defined(__CUDACC__) if (dmu.device().is_cuda()) { return adamBackwardMuCUDA(dmu, updates, mu, b1); - } else if (dmu.device().is_cpu()) { + } +#endif + if (dmu.device().is_cpu()) { return adamBackwardMuCPU(dmu, updates, mu, b1); } else { throw std::runtime_error("Not implemented"); @@ -86,9 +103,12 @@ TensorArray<2> adamBackwardMu(const torch::Tensor& dmu, TensorArray<2> adamBackwardNu(const torch::Tensor& dnu, const torch::Tensor& updates, const torch::Tensor& nu, const float b2) { +#if defined(__CUDACC__) if (dnu.device().is_cuda()) { return adamBackwardNuCUDA(dnu, updates, nu, b2); - } else if (dnu.device().is_cpu()) { + } +#endif + if (dnu.device().is_cpu()) { return adamBackwardNuCPU(dnu, updates, nu, b2); } else { throw std::runtime_error("Not implemented"); @@ -100,10 +120,13 @@ TensorArray<2> adamBackwardUpdates(const torch::Tensor& dupdates, const torch::Tensor& new_mu, const torch::Tensor& new_nu, const float b1, const float b2, const int count) { +#if defined(__CUDACC__) if (dupdates.device().is_cuda()) { return adamBackwardUpdatesCUDA(dupdates, updates, new_mu, new_nu, b1, b2, count); - } else if (dupdates.device().is_cpu()) { + } +#endif + if (dupdates.device().is_cpu()) { return adamBackwardUpdatesCPU(dupdates, updates, new_mu, new_nu, b1, b2, count); } else { diff --git a/src/adam_op/adam_op_impl.cpp b/src/adam_op/adam_op_impl_cpu.cpp similarity index 99% rename from src/adam_op/adam_op_impl.cpp rename to src/adam_op/adam_op_impl_cpu.cpp index 994bf0f0..232ac4d7 100644 --- a/src/adam_op/adam_op_impl.cpp +++ b/src/adam_op/adam_op_impl_cpu.cpp @@ -13,7 +13,7 @@ // limitations under the License. // ============================================================================== -#include "include/adam_op/adam_op_impl.h" +#include "include/adam_op/adam_op_impl_cpu.h" #include #include diff --git a/src/adam_op/adam_op_impl.cu b/src/adam_op/adam_op_impl_cuda.cu similarity index 99% rename from src/adam_op/adam_op_impl.cu rename to src/adam_op/adam_op_impl_cuda.cu index b10942eb..0bd4cc50 100644 --- a/src/adam_op/adam_op_impl.cu +++ b/src/adam_op/adam_op_impl_cuda.cu @@ -17,7 +17,7 @@ #include -#include "include/adam_op/adam_op_impl.cuh" +#include "include/adam_op/adam_op_impl_cuda.cuh" #include "include/utils.h" namespace torchopt { From 84d1c3dbc50faf81ac29cd801aebd06eeec1fd66 Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Mon, 8 Aug 2022 01:45:54 +0800 Subject: [PATCH 10/11] chore(accelerated_op): use correct Python Ctype for pybind11 function prototype (#52) --- .github/workflows/lint.yml | 14 ++--- .github/workflows/tests.yml | 2 +- CHANGELOG.md | 4 ++ conda-recipe.yaml | 2 +- include/adam_op/adam_op.h | 27 ++++---- include/adam_op/adam_op_impl_cpu.h | 29 ++++----- include/adam_op/adam_op_impl_cuda.cuh | 28 ++++----- include/common.h | 4 ++ pyproject.toml | 2 +- src/adam_op/adam_op.cpp | 27 ++++---- src/adam_op/adam_op_impl_cpu.cpp | 89 +++++++++++++-------------- src/adam_op/adam_op_impl_cuda.cu | 88 +++++++++++++------------- tests/requirements.txt | 2 +- 13 files changed, 162 insertions(+), 156 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f262f5c6..274133de 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -54,16 +54,9 @@ jobs: run: | python -m pip install --upgrade pip setuptools - - name: Install dependencies - run: | - python -m pip install --extra-index-url "${TORCH_INDEX_URL}" \ - -r tests/requirements.txt - python -m pip install --extra-index-url "${TORCH_INDEX_URL}" \ - -r docs/requirements.txt - - name: Install TorchOpt run: | - python -m pip install -e . + python -m pip install -vvv -e '.[lint]' - name: pre-commit run: | @@ -97,6 +90,11 @@ jobs: run: | make mypy + - name: Install dependencies + run: | + python -m pip install --extra-index-url "${TORCH_INDEX_URL}" \ + -r docs/requirements.txt + - name: docstyle run: | make docstyle diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 65e5b0cc..5692839a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -72,7 +72,7 @@ jobs: - name: Install TorchOpt run: | - python -m pip install -e . + python -m pip install -vvv -e . - name: Test with pytest run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 94cb21b5..37feafd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Use [`cibuildwheel`](https://github.com/pypa/cibuildwheel) to build wheels by [@XuehaiPan](https://github.com/XuehaiPan) in [#45](https://github.com/metaopt/TorchOpt/pull/45). - Use dynamic process number in CPU kernels by [@JieRen98](https://github.com/JieRen98) in [#42](https://github.com/metaopt/TorchOpt/pull/42). +### Changed + +- Use correct Python Ctype for pybind11 function prototype [@XuehaiPan](https://github.com/XuehaiPan) in [#52](https://github.com/metaopt/TorchOpt/pull/52). + ------ ## [0.4.2] - 2022-07-26 diff --git a/conda-recipe.yaml b/conda-recipe.yaml index 3c10a3ed..1ca00d7b 100644 --- a/conda-recipe.yaml +++ b/conda-recipe.yaml @@ -76,7 +76,7 @@ dependencies: - mypy - flake8 - flake8-bugbear - - doc8 + - doc8 < 1.0.0a0 - pydocstyle - clang-format - clang-tools # clang-tidy diff --git a/include/adam_op/adam_op.h b/include/adam_op/adam_op.h index 38ebd0cc..77ae6ca9 100644 --- a/include/adam_op/adam_op.h +++ b/include/adam_op/adam_op.h @@ -23,32 +23,35 @@ namespace torchopt { TensorArray<3> adamForwardInplace(const torch::Tensor& updates, const torch::Tensor& mu, - const torch::Tensor& nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count); + const torch::Tensor& nu, const pyfloat_t b1, + const pyfloat_t b2, const pyfloat_t eps, + const pyfloat_t eps_root, + const pyuint_t count); torch::Tensor adamForwardMu(const torch::Tensor& updates, - const torch::Tensor& mu, const float b1); + const torch::Tensor& mu, const pyfloat_t b1); torch::Tensor adamForwardNu(const torch::Tensor& updates, - const torch::Tensor& nu, const float b2); + const torch::Tensor& nu, const pyfloat_t b2); torch::Tensor adamForwardUpdates(const torch::Tensor& new_mu, - const torch::Tensor& new_nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count); + const torch::Tensor& new_nu, + const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, const pyfloat_t eps_root, + const pyuint_t count); TensorArray<2> adamBackwardMu(const torch::Tensor& dmu, const torch::Tensor& updates, - const torch::Tensor& mu, const float b1); + const torch::Tensor& mu, const pyfloat_t b1); TensorArray<2> adamBackwardNu(const torch::Tensor& dnu, const torch::Tensor& updates, - const torch::Tensor& nu, const float b2); + const torch::Tensor& nu, const pyfloat_t b2); TensorArray<2> adamBackwardUpdates(const torch::Tensor& dupdates, const torch::Tensor& updates, const torch::Tensor& new_mu, - const torch::Tensor& new_nu, const float b1, - const float b2, const int count); + const torch::Tensor& new_nu, + const pyfloat_t b1, const pyfloat_t b2, + const pyuint_t count); } // namespace torchopt diff --git a/include/adam_op/adam_op_impl_cpu.h b/include/adam_op/adam_op_impl_cpu.h index 87562fb1..c65408db 100644 --- a/include/adam_op/adam_op_impl_cpu.h +++ b/include/adam_op/adam_op_impl_cpu.h @@ -21,35 +21,36 @@ #include "include/common.h" namespace torchopt { -TensorArray<3> adamForwardInplaceCPU(const torch::Tensor& updates, - const torch::Tensor& mu, - const torch::Tensor& nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count); +TensorArray<3> adamForwardInplaceCPU( + const torch::Tensor& updates, const torch::Tensor& mu, + const torch::Tensor& nu, const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, const pyfloat_t eps_root, const pyuint_t count); torch::Tensor adamForwardMuCPU(const torch::Tensor& updates, - const torch::Tensor& mu, const float b1); + const torch::Tensor& mu, const pyfloat_t b1); torch::Tensor adamForwardNuCPU(const torch::Tensor& updates, - const torch::Tensor& nu, const float b2); + const torch::Tensor& nu, const pyfloat_t b2); torch::Tensor adamForwardUpdatesCPU(const torch::Tensor& new_mu, - const torch::Tensor& new_nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count); + const torch::Tensor& new_nu, + const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, + const pyfloat_t eps_root, + const pyuint_t count); TensorArray<2> adamBackwardMuCPU(const torch::Tensor& dmu, const torch::Tensor& updates, - const torch::Tensor& mu, const float b1); + const torch::Tensor& mu, const pyfloat_t b1); TensorArray<2> adamBackwardNuCPU(const torch::Tensor& dnu, const torch::Tensor& updates, - const torch::Tensor& nu, const float b2); + const torch::Tensor& nu, const pyfloat_t b2); TensorArray<2> adamBackwardUpdatesCPU(const torch::Tensor& dupdates, const torch::Tensor& updates, const torch::Tensor& new_mu, const torch::Tensor& new_nu, - const float b1, const float b2, - const int count); + const pyfloat_t b1, const pyfloat_t b2, + const pyuint_t count); } // namespace torchopt diff --git a/include/adam_op/adam_op_impl_cuda.cuh b/include/adam_op/adam_op_impl_cuda.cuh index c9dcba85..406374aa 100644 --- a/include/adam_op/adam_op_impl_cuda.cuh +++ b/include/adam_op/adam_op_impl_cuda.cuh @@ -21,36 +21,36 @@ #include "include/common.h" namespace torchopt { -TensorArray<3> adamForwardInplaceCUDA(const torch::Tensor &updates, - const torch::Tensor &mu, - const torch::Tensor &nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count); +TensorArray<3> adamForwardInplaceCUDA( + const torch::Tensor &updates, const torch::Tensor &mu, + const torch::Tensor &nu, const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, const pyfloat_t eps_root, const pyuint_t count); torch::Tensor adamForwardMuCUDA(const torch::Tensor &updates, - const torch::Tensor &mu, const float b1); + const torch::Tensor &mu, const pyfloat_t b1); torch::Tensor adamForwardNuCUDA(const torch::Tensor &updates, - const torch::Tensor &nu, const float b2); + const torch::Tensor &nu, const pyfloat_t b2); torch::Tensor adamForwardUpdatesCUDA(const torch::Tensor &new_mu, const torch::Tensor &new_nu, - const float b1, const float b2, - const float eps, const float eps_root, - const int count); + const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, + const pyfloat_t eps_root, + const pyuint_t count); TensorArray<2> adamBackwardMuCUDA(const torch::Tensor &dmu, const torch::Tensor &updates, - const torch::Tensor &mu, const float b1); + const torch::Tensor &mu, const pyfloat_t b1); TensorArray<2> adamBackwardNuCUDA(const torch::Tensor &dnu, const torch::Tensor &updates, - const torch::Tensor &nu, const float b2); + const torch::Tensor &nu, const pyfloat_t b2); TensorArray<2> adamBackwardUpdatesCUDA(const torch::Tensor &dupdates, const torch::Tensor &updates, const torch::Tensor &new_mu, const torch::Tensor &new_nu, - const float b1, const float b2, - const int count); + const pyfloat_t b1, const pyfloat_t b2, + const pyuint_t count); } // namespace torchopt diff --git a/include/common.h b/include/common.h index e4362013..801a85a4 100644 --- a/include/common.h +++ b/include/common.h @@ -17,6 +17,10 @@ #include #include +#include + +using pyfloat_t = double; +using pyuint_t = std::size_t; namespace torchopt { template diff --git a/pyproject.toml b/pyproject.toml index f2952354..0ecea773 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ lint = [ "mypy", "flake8", "flake8-bugbear", - "doc8", + "doc8 < 1.0.0a0", "pydocstyle", "pyenchant", "cpplint", diff --git a/src/adam_op/adam_op.cpp b/src/adam_op/adam_op.cpp index 7f107175..bb4531ac 100644 --- a/src/adam_op/adam_op.cpp +++ b/src/adam_op/adam_op.cpp @@ -26,9 +26,10 @@ namespace torchopt { TensorArray<3> adamForwardInplace(const torch::Tensor& updates, const torch::Tensor& mu, - const torch::Tensor& nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count) { + const torch::Tensor& nu, const pyfloat_t b1, + const pyfloat_t b2, const pyfloat_t eps, + const pyfloat_t eps_root, + const pyuint_t count) { #if defined(__CUDACC__) if (updates.device().is_cuda()) { return adamForwardInplaceCUDA(updates, mu, nu, b1, b2, eps, eps_root, @@ -42,7 +43,7 @@ TensorArray<3> adamForwardInplace(const torch::Tensor& updates, } } torch::Tensor adamForwardMu(const torch::Tensor& updates, - const torch::Tensor& mu, const float b1) { + const torch::Tensor& mu, const pyfloat_t b1) { #if defined(__CUDACC__) if (updates.device().is_cuda()) { return adamForwardMuCUDA(updates, mu, b1); @@ -56,7 +57,7 @@ torch::Tensor adamForwardMu(const torch::Tensor& updates, } torch::Tensor adamForwardNu(const torch::Tensor& updates, - const torch::Tensor& nu, const float b2) { + const torch::Tensor& nu, const pyfloat_t b2) { #if defined(__CUDACC__) if (updates.device().is_cuda()) { return adamForwardNuCUDA(updates, nu, b2); @@ -70,9 +71,10 @@ torch::Tensor adamForwardNu(const torch::Tensor& updates, } torch::Tensor adamForwardUpdates(const torch::Tensor& new_mu, - const torch::Tensor& new_nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count) { + const torch::Tensor& new_nu, + const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, const pyfloat_t eps_root, + const pyuint_t count) { #if defined(__CUDACC__) if (new_mu.device().is_cuda()) { return adamForwardUpdatesCUDA(new_mu, new_nu, b1, b2, eps, eps_root, count); @@ -87,7 +89,7 @@ torch::Tensor adamForwardUpdates(const torch::Tensor& new_mu, TensorArray<2> adamBackwardMu(const torch::Tensor& dmu, const torch::Tensor& updates, - const torch::Tensor& mu, const float b1) { + const torch::Tensor& mu, const pyfloat_t b1) { #if defined(__CUDACC__) if (dmu.device().is_cuda()) { return adamBackwardMuCUDA(dmu, updates, mu, b1); @@ -102,7 +104,7 @@ TensorArray<2> adamBackwardMu(const torch::Tensor& dmu, TensorArray<2> adamBackwardNu(const torch::Tensor& dnu, const torch::Tensor& updates, - const torch::Tensor& nu, const float b2) { + const torch::Tensor& nu, const pyfloat_t b2) { #if defined(__CUDACC__) if (dnu.device().is_cuda()) { return adamBackwardNuCUDA(dnu, updates, nu, b2); @@ -118,8 +120,9 @@ TensorArray<2> adamBackwardNu(const torch::Tensor& dnu, TensorArray<2> adamBackwardUpdates(const torch::Tensor& dupdates, const torch::Tensor& updates, const torch::Tensor& new_mu, - const torch::Tensor& new_nu, const float b1, - const float b2, const int count) { + const torch::Tensor& new_nu, + const pyfloat_t b1, const pyfloat_t b2, + const pyuint_t count) { #if defined(__CUDACC__) if (dupdates.device().is_cuda()) { return adamBackwardUpdatesCUDA(dupdates, updates, new_mu, new_nu, b1, b2, diff --git a/src/adam_op/adam_op_impl_cpu.cpp b/src/adam_op/adam_op_impl_cpu.cpp index 232ac4d7..c50a4cd4 100644 --- a/src/adam_op/adam_op_impl_cpu.cpp +++ b/src/adam_op/adam_op_impl_cpu.cpp @@ -50,20 +50,20 @@ void adamForwardInplaceCPUKernel( } } // namespace -TensorArray<3> adamForwardInplaceCPU(const torch::Tensor& updates, - const torch::Tensor& mu, - const torch::Tensor& nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count) { - using other_t = float; - const float inv_one_minus_pow_b1 = 1 / (1 - std::pow(b1, count)); - const float inv_one_minus_pow_b2 = 1 / (1 - std::pow(b2, count)); +TensorArray<3> adamForwardInplaceCPU( + const torch::Tensor& updates, const torch::Tensor& mu, + const torch::Tensor& nu, const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, const pyfloat_t eps_root, const pyuint_t count) { + using other_t = pyfloat_t; + const other_t inv_one_minus_pow_b1 = 1 / (1 - std::pow(b1, count)); + const other_t inv_one_minus_pow_b2 = 1 / (1 - std::pow(b2, count)); const size_t n = getTensorPlainSize(updates); AT_DISPATCH_FLOATING_TYPES( updates.scalar_type(), "adamForwardInplaceCPU", ([&] { - adamForwardInplaceCPUKernel( - b1, inv_one_minus_pow_b1, b2, inv_one_minus_pow_b2, eps, eps_root, + adamForwardInplaceCPUKernel( + scalar_t(b1), scalar_t(inv_one_minus_pow_b1), scalar_t(b2), + scalar_t(inv_one_minus_pow_b2), scalar_t(eps), scalar_t(eps_root), n, updates.data_ptr(), mu.data_ptr(), nu.data_ptr()); })); @@ -87,16 +87,14 @@ void adamForwardMuCPUKernel(const scalar_t* __restrict__ updates_ptr, } // namespace torch::Tensor adamForwardMuCPU(const torch::Tensor& updates, - const torch::Tensor& mu, const float b1) { - using other_t = float; - + const torch::Tensor& mu, const pyfloat_t b1) { auto mu_out = torch::empty_like(mu); const size_t n = getTensorPlainSize(updates); AT_DISPATCH_FLOATING_TYPES(updates.scalar_type(), "adamForwardMuCPU", ([&] { - adamForwardMuCPUKernel( + adamForwardMuCPUKernel( updates.data_ptr(), - mu.data_ptr(), b1, n, + mu.data_ptr(), scalar_t(b1), n, mu_out.data_ptr()); })); return mu_out; @@ -120,16 +118,14 @@ void adamForwardNuCPUKernel(const scalar_t* __restrict__ updates_ptr, } // namespace torch::Tensor adamForwardNuCPU(const torch::Tensor& updates, - const torch::Tensor& nu, const float b2) { - using other_t = float; - + const torch::Tensor& nu, const pyfloat_t b2) { auto nu_out = torch::empty_like(nu); const size_t n = getTensorPlainSize(updates); AT_DISPATCH_FLOATING_TYPES(updates.scalar_type(), "adamForwardNuCPU", ([&] { - adamForwardNuCPUKernel( + adamForwardNuCPUKernel( updates.data_ptr(), - nu.data_ptr(), b2, n, + nu.data_ptr(), scalar_t(b2), n, nu_out.data_ptr()); })); return nu_out; @@ -156,10 +152,12 @@ void adamForwardUpdatesCPUKernel(const scalar_t* __restrict__ new_mu_ptr, } // namespace torch::Tensor adamForwardUpdatesCPU(const torch::Tensor& new_mu, - const torch::Tensor& new_nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count) { - using other_t = float; + const torch::Tensor& new_nu, + const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, + const pyfloat_t eps_root, + const pyuint_t count) { + using other_t = pyfloat_t; auto updates_out = torch::empty_like(new_mu); @@ -171,9 +169,10 @@ torch::Tensor adamForwardUpdatesCPU(const torch::Tensor& new_mu, const size_t n = getTensorPlainSize(new_mu); AT_DISPATCH_FLOATING_TYPES( new_mu.scalar_type(), "adamForwardUpdatesCPU", ([&] { - adamForwardUpdatesCPUKernel( + adamForwardUpdatesCPUKernel( new_mu.data_ptr(), new_nu.data_ptr(), - inv_one_minus_pow_b1, inv_one_minus_pow_b2, eps, eps_root, n, + scalar_t(inv_one_minus_pow_b1), scalar_t(inv_one_minus_pow_b2), + scalar_t(eps), scalar_t(eps_root), n, updates_out.data_ptr()); })); return updates_out; @@ -197,16 +196,14 @@ void adamBackwardMuCPUKernel(const scalar_t* __restrict__ dmu_ptr, TensorArray<2> adamBackwardMuCPU(const torch::Tensor& dmu, const torch::Tensor& updates, - const torch::Tensor& mu, const float b1) { - using other_t = float; - + const torch::Tensor& mu, const pyfloat_t b1) { auto dupdates_out = torch::empty_like(updates); auto dmu_out = torch::empty_like(mu); const size_t n = getTensorPlainSize(dmu); AT_DISPATCH_FLOATING_TYPES(dmu.scalar_type(), "adamBackwardMuCPU", ([&] { - adamBackwardMuCPUKernel( - dmu.data_ptr(), b1, n, + adamBackwardMuCPUKernel( + dmu.data_ptr(), scalar_t(b1), n, dupdates_out.data_ptr(), dmu_out.data_ptr()); })); @@ -233,19 +230,18 @@ void adamBackwardNuCPUKernel(const scalar_t* __restrict__ dnu_ptr, TensorArray<2> adamBackwardNuCPU(const torch::Tensor& dnu, const torch::Tensor& updates, - const torch::Tensor& nu, const float b2) { - using other_t = float; - + const torch::Tensor& nu, const pyfloat_t b2) { auto dupdates_out = torch::empty_like(updates); auto dnu_out = torch::empty_like(nu); const size_t n = getTensorPlainSize(dnu); - AT_DISPATCH_FLOATING_TYPES( - dnu.scalar_type(), "adamForwardNuCPU", ([&] { - adamBackwardNuCPUKernel( - dnu.data_ptr(), updates.data_ptr(), b2, n, - dupdates_out.data_ptr(), dnu_out.data_ptr()); - })); + AT_DISPATCH_FLOATING_TYPES(dnu.scalar_type(), "adamForwardNuCPU", ([&] { + adamBackwardNuCPUKernel( + dnu.data_ptr(), + updates.data_ptr(), scalar_t(b2), + n, dupdates_out.data_ptr(), + dnu_out.data_ptr()); + })); return TensorArray<2>{std::move(dupdates_out), std::move(dnu_out)}; } @@ -286,9 +282,9 @@ TensorArray<2> adamBackwardUpdatesCPU(const torch::Tensor& dupdates, const torch::Tensor& updates, const torch::Tensor& new_mu, const torch::Tensor& new_nu, - const float b1, const float b2, - const int count) { - using other_t = float; + const pyfloat_t b1, const pyfloat_t b2, + const pyuint_t count) { + using other_t = pyfloat_t; auto dmu_out = torch::empty_like(new_mu); auto dnu_out = torch::empty_like(new_nu); @@ -300,10 +296,11 @@ TensorArray<2> adamBackwardUpdatesCPU(const torch::Tensor& dupdates, const size_t n = getTensorPlainSize(dupdates); AT_DISPATCH_FLOATING_TYPES( dupdates.scalar_type(), "adamBackwardUpdatesCPU", ([&] { - adamBackwardUpdatesCPUKernel( + adamBackwardUpdatesCPUKernel( dupdates.data_ptr(), updates.data_ptr(), - new_mu.data_ptr(), one_minus_pow_b1, inv_one_minus_pow_b2, - n, dmu_out.data_ptr(), dnu_out.data_ptr()); + new_mu.data_ptr(), scalar_t(one_minus_pow_b1), + scalar_t(inv_one_minus_pow_b2), n, dmu_out.data_ptr(), + dnu_out.data_ptr()); })); return TensorArray<2>{std::move(dmu_out), std::move(dnu_out)}; } diff --git a/src/adam_op/adam_op_impl_cuda.cu b/src/adam_op/adam_op_impl_cuda.cu index 0bd4cc50..16441157 100644 --- a/src/adam_op/adam_op_impl_cuda.cu +++ b/src/adam_op/adam_op_impl_cuda.cu @@ -49,22 +49,22 @@ __global__ void adamForwardInplaceCUDAKernel( } } // namespace -TensorArray<3> adamForwardInplaceCUDA(const torch::Tensor &updates, - const torch::Tensor &mu, - const torch::Tensor &nu, const float b1, - const float b2, const float eps, - const float eps_root, const int count) { - using other_t = float; - const float inv_one_minus_pow_b1 = 1 / (1 - std::pow(b1, count)); - const float inv_one_minus_pow_b2 = 1 / (1 - std::pow(b2, count)); +TensorArray<3> adamForwardInplaceCUDA( + const torch::Tensor &updates, const torch::Tensor &mu, + const torch::Tensor &nu, const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, const pyfloat_t eps_root, const pyuint_t count) { + using other_t = pyfloat_t; + const other_t inv_one_minus_pow_b1 = 1 / (1 - std::pow(b1, count)); + const other_t inv_one_minus_pow_b2 = 1 / (1 - std::pow(b2, count)); const size_t n = getTensorPlainSize(updates); const dim3 block(std::min(n, size_t(256))); const dim3 grid((n - 1) / block.x + 1); AT_DISPATCH_FLOATING_TYPES( updates.scalar_type(), "adamForwardInplaceCUDA", ([&] { - adamForwardInplaceCUDAKernel<<>>( - b1, inv_one_minus_pow_b1, b2, inv_one_minus_pow_b2, eps, eps_root, + adamForwardInplaceCUDAKernel<<>>( + scalar_t(b1), scalar_t(inv_one_minus_pow_b1), scalar_t(b2), + scalar_t(inv_one_minus_pow_b2), scalar_t(eps), scalar_t(eps_root), n, updates.data_ptr(), mu.data_ptr(), nu.data_ptr()); })); @@ -89,9 +89,7 @@ __global__ void adamForwardMuCUDAKernel( } // namespace torch::Tensor adamForwardMuCUDA(const torch::Tensor &updates, - const torch::Tensor &mu, const float b1) { - using other_t = float; - + const torch::Tensor &mu, const pyfloat_t b1) { auto mu_out = torch::empty_like(mu); const size_t n = getTensorPlainSize(updates); @@ -99,9 +97,9 @@ torch::Tensor adamForwardMuCUDA(const torch::Tensor &updates, const dim3 grid((n - 1) / block.x + 1); AT_DISPATCH_FLOATING_TYPES( updates.scalar_type(), "adamForwardMuCUDA", ([&] { - adamForwardMuCUDAKernel<<>>( - updates.data_ptr(), mu.data_ptr(), b1, n, - mu_out.data_ptr()); + adamForwardMuCUDAKernel<<>>( + updates.data_ptr(), mu.data_ptr(), scalar_t(b1), + n, mu_out.data_ptr()); })); return mu_out; } @@ -126,9 +124,7 @@ __global__ void adamForwardNuCUDAKernel( } // namespace torch::Tensor adamForwardNuCUDA(const torch::Tensor &updates, - const torch::Tensor &nu, const float b2) { - using other_t = float; - + const torch::Tensor &nu, const pyfloat_t b2) { auto nu_out = torch::empty_like(nu); const size_t n = getTensorPlainSize(updates); @@ -136,9 +132,9 @@ torch::Tensor adamForwardNuCUDA(const torch::Tensor &updates, const dim3 grid((n - 1) / block.x + 1); AT_DISPATCH_FLOATING_TYPES( updates.scalar_type(), "adamForwardNuCUDA", ([&] { - adamForwardNuCUDAKernel<<>>( - updates.data_ptr(), nu.data_ptr(), b2, n, - nu_out.data_ptr()); + adamForwardNuCUDAKernel<<>>( + updates.data_ptr(), nu.data_ptr(), scalar_t(b2), + n, nu_out.data_ptr()); })); return nu_out; } @@ -166,10 +162,11 @@ __global__ void adamForwardUpdatesCUDAKernel( torch::Tensor adamForwardUpdatesCUDA(const torch::Tensor &new_mu, const torch::Tensor &new_nu, - const float b1, const float b2, - const float eps, const float eps_root, - const int count) { - using other_t = float; + const pyfloat_t b1, const pyfloat_t b2, + const pyfloat_t eps, + const pyfloat_t eps_root, + const pyuint_t count) { + using other_t = pyfloat_t; auto updates_out = torch::empty_like(new_mu); @@ -183,9 +180,10 @@ torch::Tensor adamForwardUpdatesCUDA(const torch::Tensor &new_mu, const dim3 grid((n - 1) / block.x + 1); AT_DISPATCH_FLOATING_TYPES( new_mu.scalar_type(), "adamForwardUpdatesCUDA", ([&] { - adamForwardUpdatesCUDAKernel<<>>( + adamForwardUpdatesCUDAKernel<<>>( new_mu.data_ptr(), new_nu.data_ptr(), - inv_one_minus_pow_b1, inv_one_minus_pow_b2, eps, eps_root, n, + scalar_t(inv_one_minus_pow_b1), scalar_t(inv_one_minus_pow_b2), + scalar_t(eps), scalar_t(eps_root), n, updates_out.data_ptr()); })); return updates_out; @@ -211,9 +209,7 @@ __global__ void adamBackwardMuCUDAKernel( TensorArray<2> adamBackwardMuCUDA(const torch::Tensor &dmu, const torch::Tensor &updates, - const torch::Tensor &mu, const float b1) { - using other_t = float; - + const torch::Tensor &mu, const pyfloat_t b1) { auto dupdates_out = torch::empty_like(updates); auto dmu_out = torch::empty_like(mu); @@ -222,9 +218,9 @@ TensorArray<2> adamBackwardMuCUDA(const torch::Tensor &dmu, const dim3 grid((n - 1) / block.x + 1); AT_DISPATCH_FLOATING_TYPES( dmu.scalar_type(), "adamBackwardMuCUDA", ([&] { - adamBackwardMuCUDAKernel<<>>( - dmu.data_ptr(), b1, n, dupdates_out.data_ptr(), - dmu_out.data_ptr()); + adamBackwardMuCUDAKernel<<>>( + dmu.data_ptr(), scalar_t(b1), n, + dupdates_out.data_ptr(), dmu_out.data_ptr()); })); return TensorArray<2>{std::move(dupdates_out), std::move(dmu_out)}; } @@ -251,9 +247,7 @@ __global__ void adamBackwardNuCUDAKernel( TensorArray<2> adamBackwardNuCUDA(const torch::Tensor &dnu, const torch::Tensor &updates, - const torch::Tensor &nu, const float b2) { - using other_t = float; - + const torch::Tensor &nu, const pyfloat_t b2) { auto dupdates_out = torch::empty_like(updates); auto dnu_out = torch::empty_like(nu); @@ -262,9 +256,10 @@ TensorArray<2> adamBackwardNuCUDA(const torch::Tensor &dnu, const dim3 grid((n - 1) / block.x + 1); AT_DISPATCH_FLOATING_TYPES( dnu.scalar_type(), "adamForwardNuCUDA", ([&] { - adamBackwardNuCUDAKernel<<>>( - dnu.data_ptr(), updates.data_ptr(), b2, n, - dupdates_out.data_ptr(), dnu_out.data_ptr()); + adamBackwardNuCUDAKernel<<>>( + dnu.data_ptr(), updates.data_ptr(), + scalar_t(b2), n, dupdates_out.data_ptr(), + dnu_out.data_ptr()); })); return TensorArray<2>{std::move(dupdates_out), std::move(dnu_out)}; } @@ -307,9 +302,9 @@ TensorArray<2> adamBackwardUpdatesCUDA(const torch::Tensor &dupdates, const torch::Tensor &updates, const torch::Tensor &new_mu, const torch::Tensor &new_nu, - const float b1, const float b2, - const int count) { - using other_t = float; + const pyfloat_t b1, const pyfloat_t b2, + const pyuint_t count) { + using other_t = pyfloat_t; auto dmu_out = torch::empty_like(new_mu); auto dnu_out = torch::empty_like(new_nu); @@ -323,10 +318,11 @@ TensorArray<2> adamBackwardUpdatesCUDA(const torch::Tensor &dupdates, const dim3 grid((n - 1) / block.x + 1); AT_DISPATCH_FLOATING_TYPES( dupdates.scalar_type(), "adamBackwardUpdatesCUDA", ([&] { - adamBackwardUpdatesCUDAKernel<<>>( + adamBackwardUpdatesCUDAKernel<<>>( dupdates.data_ptr(), updates.data_ptr(), - new_mu.data_ptr(), one_minus_pow_b1, inv_one_minus_pow_b2, - n, dmu_out.data_ptr(), dnu_out.data_ptr()); + new_mu.data_ptr(), scalar_t(one_minus_pow_b1), + scalar_t(inv_one_minus_pow_b2), n, dmu_out.data_ptr(), + dnu_out.data_ptr()); })); return TensorArray<2>{std::move(dmu_out), std::move(dnu_out)}; } diff --git a/tests/requirements.txt b/tests/requirements.txt index ff5b6ea2..5499afdf 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -14,7 +14,7 @@ pylint mypy flake8 flake8-bugbear -doc8 < 1.0.0a +doc8 < 1.0.0a0 pydocstyle pyenchant cpplint From 0ab590e264c51cadcbbdfd672ac0db4a1f9c14ee Mon Sep 17 00:00:00 2001 From: Xuehai Pan Date: Mon, 8 Aug 2022 02:03:30 +0800 Subject: [PATCH 11/11] ver: bump version to 0.4.3 --- CHANGELOG.md | 16 ++++++++++++++- CITATION.cff | 4 ++-- README.md | 10 ++++++++- conda-recipe.yaml | 4 ++-- docs/conda-recipe.yaml | 4 ++-- docs/requirements.txt | 4 ++-- docs/source/developer/contributing.rst | 14 ++++++++++++- examples/requirements.txt | 4 ++-- pyproject.toml | 28 +++++++++++++++++--------- requirements.txt | 2 +- tests/requirements.txt | 4 ++-- torchopt/version.py | 2 +- tutorials/requirements.txt | 4 ++-- 13 files changed, 72 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37feafd1..62d6ab83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +### Changed + +### Fixed + +### Removed + +------ + +## [0.4.3] - 2022-08-08 + +### Added + +- Bump PyTorch version to 1.12.1 by [@XuehaiPan](https://github.com/XuehaiPan) in [#49](https://github.com/metaopt/TorchOpt/pull/49). - CPU-only build without `nvcc` requirement by [@XuehaiPan](https://github.com/XuehaiPan) in [#51](https://github.com/metaopt/TorchOpt/pull/51). - Use [`cibuildwheel`](https://github.com/pypa/cibuildwheel) to build wheels by [@XuehaiPan](https://github.com/XuehaiPan) in [#45](https://github.com/metaopt/TorchOpt/pull/45). - Use dynamic process number in CPU kernels by [@JieRen98](https://github.com/JieRen98) in [#42](https://github.com/metaopt/TorchOpt/pull/42). @@ -61,7 +74,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ------ -[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.4.2...HEAD +[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.4.3...HEAD +[0.4.3]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.4.2...v0.4.3 [0.4.2]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.4.1...v0.4.2 [0.4.1]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.4.0...v0.4.1 [0.4.0]: https://github.com/olivierlacan/keep-a-changelog/releases/tag/v0.4.0 diff --git a/CITATION.cff b/CITATION.cff index 60c65cb3..bb49226a 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -28,7 +28,7 @@ authors: family-names: Yang affiliation: Peking University email: yaodong.yang@pku.edu.cn -version: 0.4.2 -date-released: "2022-07-26" +version: 0.4.3 +date-released: "2022-08-08" license: Apache-2.0 repository-code: "https://github.com/metaopt/TorchOpt" diff --git a/README.md b/README.md index 45be2ecb..cf48f0d0 100644 --- a/README.md +++ b/README.md @@ -219,12 +219,20 @@ Requirements - (Optional) For visualizing computation graphs - [Graphviz](https://graphviz.org/download/) (for Linux users use `apt/yum install graphviz` or `conda install -c anaconda python-graphviz`) -Please follow the instructions at to install PyTorch in your Python environment first. Then run the following command to install TorchOpt from PyPI ([![PyPI](https://img.shields.io/pypi/v/torchopt?label=PyPI)](https://pypi.org/project/torchopt) / ![Status](https://img.shields.io/pypi/status/torchopt?label=Status)): +**Please follow the instructions at to install PyTorch in your Python environment first.** Then run the following command to install TorchOpt from PyPI ([![PyPI](https://img.shields.io/pypi/v/torchopt?label=PyPI)](https://pypi.org/project/torchopt) / ![Status](https://img.shields.io/pypi/status/torchopt?label=Status)): ```bash pip3 install torchopt ``` +If the minimum version of PyTorch is not satisfied, `pip` will install/upgrade it for you. Please be careful about the `torch` build for CPU / CUDA support (e.g. `cpu`, `cu102`, `cu113`). You may need to specify the extra index URL for the `torch` package: + +```bash +pip3 install torchopt --extra-index-url https://download.pytorch.org/whl/cu116 +``` + +See for more information about installing PyTorch. + You can also build shared libraries from source, use: ```bash diff --git a/conda-recipe.yaml b/conda-recipe.yaml index 1ca00d7b..ed082846 100644 --- a/conda-recipe.yaml +++ b/conda-recipe.yaml @@ -17,11 +17,11 @@ dependencies: - pip # Learning - - pytorch::pytorch = 1.12 + - pytorch::pytorch >= 1.12 - pytorch::torchvision - pytorch::pytorch-mutex = *=*cuda* - pip: - - functorch + - functorch >= 0.2 - torchviz - sphinxcontrib-katex # for documentation - jax diff --git a/docs/conda-recipe.yaml b/docs/conda-recipe.yaml index d55c0f19..3e9f51cb 100644 --- a/docs/conda-recipe.yaml +++ b/docs/conda-recipe.yaml @@ -30,12 +30,12 @@ dependencies: - pip # Learning - - pytorch::pytorch = 1.12 + - pytorch::pytorch >= 1.12 - pytorch::torchvision - pytorch::pytorch-mutex = *=*cpu* - pip: - jax[cpu] >= 0.3 - - functorch + - functorch >= 0.2 - torchviz - sphinxcontrib-katex # for documentation - tensorboard diff --git a/docs/requirements.txt b/docs/requirements.txt index d63f7aef..8837b2a9 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,7 +1,7 @@ --extra-index-url https://download.pytorch.org/whl/cpu -torch == 1.12 +torch >= 1.12 torchvision -functorch +functorch >= 0.2 --requirement ../requirements.txt diff --git a/docs/source/developer/contributing.rst b/docs/source/developer/contributing.rst index 71066f9e..302b9fb3 100644 --- a/docs/source/developer/contributing.rst +++ b/docs/source/developer/contributing.rst @@ -95,11 +95,23 @@ To build compatible **manylinux2014** (:pep:`599`) wheels for distribution, you export CUDA_VERSION="11.6" # version of `nvcc` for compilation python3 -m cibuildwheel --platform=linux --output-dir=wheelhouse --config-file=pyproject.toml -It will installs the CUDA compiler with ``CUDA_VERSION`` in the build container. Then build wheel binaries for all supported CPython versions. The outputs will be placed in the ``wheelhouse`` directory. +It will install the CUDA compiler with ``CUDA_VERSION`` in the build container. Then build wheel binaries for all supported CPython versions. The outputs will be placed in the ``wheelhouse`` directory. + +To build a wheel for a specific CPython version, you can use the |CIBW_BUILD|_ environment variable. +For example, the following command will build a wheel for Python 3.7: + +.. code-block:: bash + + CIBW_BUILD="cp37*manylinux*" python3 -m cibuildwheel --platform=linux --output-dir=wheelhouse --config-file=pyproject.toml + +You can change ``cp37*`` to ``cp310*`` to build for Python 3.10. See https://cibuildwheel.readthedocs.io/en/stable/options for more options. .. |cibuildwheel| replace:: ``cibuildwheel`` .. _cibuildwheel: https://github.com/pypa/cibuildwheel +.. |CIBW_BUILD| replace:: ``CIBW_BUILD`` +.. _CIBW_BUILD: https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip + .. |docker| replace:: ``docker`` .. _docker: https://www.docker.com diff --git a/examples/requirements.txt b/examples/requirements.txt index 9e2e108e..9055e15e 100644 --- a/examples/requirements.txt +++ b/examples/requirements.txt @@ -1,7 +1,7 @@ --extra-index-url https://download.pytorch.org/whl/cu116 -torch == 1.12 +torch >= 1.12 torchvision -functorch +functorch >= 0.2 --requirement ../requirements.txt diff --git a/pyproject.toml b/pyproject.toml index 0ecea773..d60dcc99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ # Package ###################################################################### [build-system] -requires = ["setuptools", "torch == 1.12", "numpy", "pybind11"] +requires = ["setuptools", "torch >= 1.12", "numpy", "pybind11"] build-backend = "setuptools.build_meta" [project] @@ -44,7 +44,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", ] dependencies = [ - "torch == 1.12", + "torch >= 1.12", "jax[cpu] >= 0.3", "numpy", "graphviz", @@ -72,7 +72,13 @@ lint = [ "cpplint", "pre-commit", ] -test = ['torchvision', 'functorch', 'pytest', 'pytest-cov', 'pytest-xdist'] +test = [ + 'torchvision', + 'functorch >= 0.2', + 'pytest', + 'pytest-cov', + 'pytest-xdist', +] [tool.setuptools.packages.find] include = ["torchopt", "torchopt.*"] @@ -109,10 +115,11 @@ test-extras = ["test"] test-command = """ SITE_PACKAGES="$(python -c 'print(__import__("sysconfig").get_path("purelib"))')" TORCH_LIB_PATH="${SITE_PACKAGES}/torch/lib" + echo "LD_LIBRARY_PATH='${LD_LIBRARY_PATH}'" echo "ls ${TORCH_LIB_PATH}"; ls -lh "${TORCH_LIB_PATH}" find "${SITE_PACKAGES}/torchopt" -name "*.so" -print0 | xargs -0 -I '{}' bash -c "echo 'ldd {}'; ldd '{}'; echo 'patchelf --print-rpath {}'; patchelf --print-rpath '{}'" - make -C "{project}" test || true + make -C "{project}" test || exit 1 TORCH_VERSION="$(python -c 'print(__import__("torch").__version__.partition("+")[0])')" TEST_TORCH_SPECS="${TEST_TORCH_SPECS:-"${DEFAULT_TEST_TORCH_SPECS}"}" for spec in ${TEST_TORCH_SPECS}; do @@ -125,6 +132,7 @@ test-command = """ xargs -0 -I '{}' bash -c "echo 'ldd {}'; ldd '{}'; echo 'patchelf --print-rpath {}'; patchelf --print-rpath '{}'" make -C "{project}" test || exit 1 done + rm -rf ~/.pip/cache ~/.cache/pip """ [tool.cibuildwheel.linux] @@ -132,11 +140,13 @@ repair-wheel-command = """ python -m pip install -r requirements.txt SITE_PACKAGES="$(python -c 'print(__import__("sysconfig").get_path("purelib"))')" TORCH_LIB_PATH="${SITE_PACKAGES}/torch/lib" - export LD_LIBRARY_PATH="${TORCH_LIB_PATH}:/usr/local/cuda/lib64:/usr/local/cuda/targets/x86_64-linux/lib/stubs${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" - echo "ls ${TORCH_LIB_PATH}"; ls -lh "${TORCH_LIB_PATH}" - python -m pip install --force-reinstall git+https://github.com/XuehaiPan/auditwheel.git@torchopt - python -m auditwheel lddtree "{wheel}" - python -m auditwheel repair --no-copy-site-libs --wheel-dir="{dest_dir}" "{wheel}" + ( + export LD_LIBRARY_PATH="${TORCH_LIB_PATH}:/usr/local/cuda/lib64:/usr/local/cuda/targets/x86_64-linux/lib/stubs${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" + echo "ls ${TORCH_LIB_PATH}"; ls -lh "${TORCH_LIB_PATH}" + python -m pip install --force-reinstall git+https://github.com/XuehaiPan/auditwheel.git@torchopt + python -m auditwheel lddtree "{wheel}" + python -m auditwheel repair --no-copy-site-libs --wheel-dir="{dest_dir}" "{wheel}" + ) """ # Linter tools ################################################################# diff --git a/requirements.txt b/requirements.txt index 21fb120c..539a8145 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -torch == 1.12 +torch >= 1.12 jax[cpu] >= 0.3 numpy graphviz diff --git a/tests/requirements.txt b/tests/requirements.txt index 5499afdf..c6990c45 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,7 +1,7 @@ --extra-index-url https://download.pytorch.org/whl/cu116 -torch == 1.12 +torch >= 1.12 torchvision -functorch +functorch >= 0.2 --requirement ../requirements.txt diff --git a/torchopt/version.py b/torchopt/version.py index 784a9a63..78aa7e73 100644 --- a/torchopt/version.py +++ b/torchopt/version.py @@ -14,4 +14,4 @@ # ============================================================================== """TorchOpt: a high-performance optimizer library built upon PyTorch.""" -__version__ = '0.4.2' +__version__ = '0.4.3' diff --git a/tutorials/requirements.txt b/tutorials/requirements.txt index 00cb5228..5fe3b1ad 100644 --- a/tutorials/requirements.txt +++ b/tutorials/requirements.txt @@ -1,7 +1,7 @@ --extra-index-url https://download.pytorch.org/whl/cu116 -torch == 1.12 +torch >= 1.12 torchvision -functorch +functorch >= 0.2 --requirement ../requirements.txt pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy