Build Cross-Platform Wheels #21
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build Cross-Platform Wheels | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| inputs: | |
| cuda_versions: | |
| description: 'CUDA versions to build for (comma-separated)' | |
| required: false | |
| default: '11.8,12.1' | |
| pytorch_version: | |
| description: 'PyTorch version to install (e.g., "2.1.0", "latest")' | |
| required: false | |
| default: 'latest' | |
| platforms: | |
| description: 'Platforms to build for (comma-separated: windows,linux)' | |
| required: false | |
| default: 'windows,linux' | |
| jobs: | |
| build_wheels: | |
| name: Build wheels on ${{ matrix.platform.name }} for CUDA ${{ matrix.cuda_version }} | |
| runs-on: ${{ matrix.platform.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: | |
| - name: linux | |
| os: ubuntu-22.04 | |
| - name: windows | |
| os: windows-2022 | |
| # Use valid, released CUDA toolkit package versions | |
| cuda_version: ['11.8', '12.1', '12.4'] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Install CUDA Toolkit ${{ matrix.cuda_version }} (Windows) | |
| if: matrix.platform.os == 'windows-2022' | |
| uses: Jimver/cuda-toolkit@v0.2.23 | |
| with: | |
| cuda: ${{ matrix.cuda_version }}.0 | |
| method: 'network' | |
| sub-packages: '["nvcc", "cudart", "cublas", "curand", "cufft", "cusparse", "cusolver"]' | |
| - name: Setup Visual Studio environment (Windows) | |
| if: matrix.platform.os == 'windows-2022' | |
| uses: ilammy/msvc-dev-cmd@v1 | |
| with: | |
| arch: x64 | |
| - name: Prepare CUDA package name for Linux | |
| if: matrix.platform.os == 'ubuntu-22.04' | |
| id: cuda_package_name | |
| run: | | |
| cuda_version="${{ matrix.cuda_version }}" | |
| # dnf cuda package names use a dash instead of a dot | |
| echo "PKG_VERSION=${cuda_version//./-}" >> $GITHUB_OUTPUT | |
| - name: Build wheels | |
| uses: pypa/cibuildwheel@v3.0.0 | |
| env: | |
| # Pass matrix and input variables to cibuildwheel's environment | |
| PYTORCH_VERSION: ${{ github.event.inputs.pytorch_version || 'latest' }} | |
| CUDA_VERSION: ${{ matrix.cuda_version }} | |
| # Configure cibuildwheel | |
| CIBW_BUILD_FRONTEND: "pip; args: --no-build-isolation" | |
| CIBW_BUILD: "cp38-* cp39-* cp310-* cp311-*" | |
| CIBW_SKIP: ${{ matrix.cuda_version == '11.8' && 'cp312-*' || '' }} | |
| CIBW_BEFORE_ALL_LINUX: | | |
| set -euxo pipefail | |
| # Install build dependencies, including CUDA toolkit | |
| dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo | |
| dnf install -y cuda-toolkit-${{ steps.cuda_package_name.outputs.PKG_VERSION }} gcc-c++ sparsehash-devel | |
| # Install python build dependencies | |
| pip install cython | |
| bash .github/tools/install_pytorch.sh | |
| CIBW_BEFORE_BUILD_WINDOWS: | | |
| # Install python build dependencies | |
| pip install cython | |
| # Download and install external dependencies | |
| powershell -Command "Invoke-WebRequest -Uri https://github.com/sparsehash/sparsehash/archive/refs/tags/sparsehash-2.0.4.zip -OutFile sparsehash.zip" | |
| powershell -Command "Expand-Archive -Path sparsehash.zip -DestinationPath C:\" | |
| powershell -Command "Rename-Item C:\sparsehash-sparsehash-2.0.4 C:\sparsehash" | |
| # Install PyTorch | |
| powershell -ExecutionPolicy Bypass -File .github/tools/install_pytorch.ps1 | |
| CIBW_ENVIRONMENT_LINUX: >- | |
| CUDA_HOME=/usr/local/cuda-${{ matrix.cuda_version }} | |
| PATH=$CUDA_HOME/bin:$PATH | |
| LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH | |
| CXXFLAGS="-O2 -fopenmp" | |
| CFLAGS="-O2" | |
| FORCE_CUDA=1 | |
| TORCH_CUDA_ARCH_LIST="7.5;8.0;8.6;8.9" | |
| MAX_JOBS=4 | |
| # Removed `CL` variable to avoid conflicting with setup.py compiler flags | |
| CIBW_ENVIRONMENT_WINDOWS: >- | |
| DISTUTILS_USE_SDK=1 | |
| MSSdk=1 | |
| FORCE_CUDA=1 | |
| TORCH_CUDA_ARCH_LIST="7.5;8.0;8.6;8.9" | |
| INCLUDE="$INCLUDE;C:\sparsehash\src" | |
| CIBW_BEFORE_TEST_LINUX: | | |
| bash .github/tools/install_pytorch.sh | |
| CIBW_BEFORE_TEST_WINDOWS: | | |
| powershell -ExecutionPolicy Bypass -File .github/tools/install_pytorch.ps1 | |
| CIBW_TEST_COMMAND_WINDOWS: "python -c \"import torch; import torchsparse; print(f'TorchSparse version: {torchsparse.__version__}')\"" | |
| CIBW_TEST_COMMAND_LINUX: "python -c 'import torch; import torchsparse; print(f\"TorchSparse version: {torchsparse.__version__}\")'" | |
| CIBW_BUILD_VERBOSITY: 1 | |
| - name: Upload wheel artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: wheels-${{ matrix.platform.name }}-cuda${{ matrix.cuda_version }} | |
| path: ./wheelhouse/*.whl | |
| create-release: | |
| needs: build_wheels | |
| runs-on: ubuntu-latest | |
| if: startsWith(github.ref, 'refs/tags/') | |
| steps: | |
| - name: Download all wheel artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: wheels | |
| pattern: wheels-* | |
| merge-multiple: true | |
| - name: Organize wheels and create release | |
| run: | | |
| mkdir -p release | |
| find wheels -name "*.whl" -exec cp {} release/ \; | |
| ls -la release/ | |
| gh release create ${{ github.ref_name }} --generate-notes --title "TorchSparse ${{ github.ref_name }} - Cross-Platform Release" release/*.whl | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| test-wheels: | |
| needs: build_wheels | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: | |
| - name: linux | |
| os: ubuntu-22.04 | |
| - name: windows | |
| os: windows-2022 | |
| python-version: ['3.10'] | |
| cuda-version: ['12.1'] | |
| runs-on: ${{ matrix.platform.os }} | |
| steps: | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Set up python-version-nodot | |
| id: py-ver | |
| run: echo "nodot=$(echo ${{ matrix.python-version }} | tr -d .)" >> $GITHUB_ENV | |
| - name: Install CUDA Toolkit (if needed for testing runtime) | |
| if: matrix.platform.os == 'windows-2022' | |
| uses: Jimver/cuda-toolkit@v0.2.23 | |
| with: | |
| cuda: ${{ matrix.cuda_version }}.0 | |
| method: 'network' | |
| - name: Download wheel artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: wheels-${{ matrix.platform.name }}-cuda${{ matrix.cuda_version }} | |
| path: wheels | |
| - name: Install PyTorch (for testing) | |
| run: pip install torch==2.1.0+cu121 torchvision==0.16.0+cu121 --index-url https://download.pytorch.org/whl/cu121 | |
| - name: Test wheel installation and functionality | |
| shell: bash | |
| run: | | |
| wheel_file=$(find wheels -name "*cp${{ env.nodot }}*.whl" | head -1) | |
| pip install "$wheel_file" | |
| python -c "import torch; import torchsparse; print('TorchSparse version:', torchsparse.__version__); print('PyTorch version:', torch.__version__); print('CUDA available:', torch.cuda.is_available())" |