Build bitsandbytes Windows Wheel #2
This file contains 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 bitsandbytes Windows Wheel | |
on: | |
workflow_dispatch: | |
inputs: | |
version: | |
description: 'Version to build.' | |
default: 'latest' | |
required: true | |
type: string | |
workflow_call: | |
inputs: | |
version: | |
description: 'Version to build.' | |
default: 'latest' | |
required: true | |
type: string | |
permissions: | |
contents: write | |
jobs: | |
compile_cuda_new: | |
# Uses Windows-2022 and Cuda Toolkit >= 11.6 with full version spec as string: "11.6.2" | |
# Uses 11.6 as CPU build target, version must be included to build CPU binaries | |
# See https://github.com/Jimver/cuda-toolkit/blob/master/src/links/windows-links.ts for supported versions | |
name: Compile Cuda Code 2022 | |
runs-on: windows-2022 | |
strategy: | |
matrix: | |
cuda: ["11.6.2", "11.7.1", "11.8.0", "12.0.1", "12.1.0", "12.2.0"] | |
cublas: ["0", "1"] | |
defaults: | |
run: | |
shell: pwsh | |
env: | |
CUDAVER: ${{ matrix.cuda }} | |
steps: | |
- name: Get Visual Studio Integration | |
if: matrix.cuda != '12.2.0' | |
uses: Jimver/cuda-toolkit@v0.2.10 | |
with: | |
cuda: ${{ matrix.cuda }} | |
method: 'network' | |
sub-packages: '["visual_studio_integration"]' | |
- name: Get Visual Studio Integration 12.2 | |
if: matrix.cuda == '12.2.0' | |
run: | | |
Invoke-RestMethod 'https://developer.download.nvidia.com/compute/cuda/12.2.0/network_installers/cuda_12.2.0_windows_network.exe' -OutFile "$env:RUNNER_TEMP\cudainstaller.exe" | |
Start-Process "$env:RUNNER_TEMP\cudainstaller.exe" -wait -ArgumentList '-s visual_studio_integration_12.2' | |
echo 'CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2' >> $env:GITHUB_ENV | |
- name: Install Visual Studio Integration | |
run: | | |
$x = (dir $env:CUDA_PATH -dir -recurse -depth 2).where({$_.name -eq 'visual_studio_integration'}).fullname | |
$y = (dir $x -dir -recurse).where({$_.name -eq 'MSBuildExtensions'}).fullname + '\*' | |
(gi 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\*\BuildCustomizations').fullname.foreach({cp $y $_}) | |
- uses: actions/checkout@v3 | |
with: | |
repository: 'jllllll/bitsandbytes' | |
ref: ${{ inputs.version == 'latest' && 'cmake_windows' || format('cmake_windows_{0}', inputs.version) }} | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.10" | |
- name: Setup Mamba | |
uses: conda-incubator/setup-miniconda@v2.2.0 | |
with: | |
activate-environment: "build" | |
python-version: "3.10" | |
miniforge-variant: Mambaforge | |
miniforge-version: latest | |
use-mamba: true | |
add-pip-as-python-dependency: true | |
auto-activate-base: false | |
- name: Install Dependencies | |
run: | | |
$cudaVersion = $env:CUDAVER | |
$cudaChannels = '' | |
$cudaNum = [int]$cudaVersion.substring($cudaVersion.LastIndexOf('.')+1) | |
while ($cudaNum -ge 0) { $cudaChannels += '-c nvidia/label/cuda-' + $cudaVersion.Remove($cudaVersion.LastIndexOf('.')+1) + $cudaNum + ' '; $cudaNum-- } | |
$cudaChannels = $cudaChannels.TrimEnd() + ' -c conda-forge -c defaults' | |
mamba install -y 'cmake' 'ninja' 'cuda' $cudaChannels.Split() | |
- name: Compile Cuda Code | |
if: matrix.cublas == '0' | |
run: | | |
$env:CUDA_PATH = $env:CONDA_PREFIX | |
$cudaVersion = $env:CUDAVER.Remove($env:CUDAVER.LastIndexOf('.')) | |
$x = 'CUDA_PATH_V' + $cudaVersion.Replace('.','_') | |
[Environment]::SetEnvironmentVariable($x, $env:CUDA_PATH) | |
if (!(Test-Path '.\BuildArtifacts\')) { mkdir '.\BuildArtifacts' } | |
cmake -S . -B "./build_$cudaVersion_0" -G "Visual Studio 17 2022" -T "cuda=$cudaVersion" -D "NO_CUBLASLT=0" -D "CUDA_TARGET_ARCH_FEATURE_LEVEL=$cudaVersion" -D "CIBUILD=1" | |
cmake --build "./build_$cudaVersion_0" --target libbitsandbytes_cuda --config Release | |
if ($cudaVersion -eq '11.6') { cmake --build "./build_$cudaVersion_0" --target libbitsandbytes_cpu --config Release } | |
- name: Compile Cuda Code nocublaslt | |
if: matrix.cublas == '1' | |
run: | | |
$env:CUDA_PATH = $env:CONDA_PREFIX | |
$cudaVersion = $env:CUDAVER.Remove($env:CUDAVER.LastIndexOf('.')) | |
$x = 'CUDA_PATH_V' + $cudaVersion.Replace('.','_') | |
[Environment]::SetEnvironmentVariable($x, $env:CUDA_PATH) | |
if (!(Test-Path '.\BuildArtifacts\')) { mkdir '.\BuildArtifacts' } | |
cmake -S . -B "./build_$cudaVersion_1" -G "Visual Studio 17 2022" -T "cuda=$cudaVersion" -D "NO_CUBLASLT=1" -D "CUDA_TARGET_ARCH_FEATURE_LEVEL=$cudaVersion" -D "CIBUILD=1" | |
cmake --build "./build_$cudaVersion_1" --target libbitsandbytes_cuda --config Release | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ format('compiled-binaries-{0}', inputs.version) }} | |
path: ./BuildArtifacts/* | |
compile_cuda_old_conda: | |
# Uses Windows-2019 and Cuda Toolkit 11.3 - 11.5 with full version spec as string: "11.5.2" | |
# See https://github.com/Jimver/cuda-toolkit/blob/master/src/links/windows-links.ts for supported versions | |
name: Compile Cuda Code 2019-Conda | |
runs-on: windows-2019 | |
strategy: | |
matrix: | |
cuda: ["11.3.1", "11.4.4", "11.5.2"] | |
cublas: ["0", "1"] | |
defaults: | |
run: | |
shell: pwsh | |
env: | |
CUDAVER: ${{ matrix.cuda }} | |
steps: | |
- name: Get Visual Studio Integration | |
uses: Jimver/cuda-toolkit@v0.2.10 | |
with: | |
cuda: ${{ matrix.cuda }} | |
method: 'network' | |
sub-packages: '["visual_studio_integration"]' | |
- name: Install Visual Studio Integration | |
run: | | |
$x = (dir $env:CUDA_PATH -dir -recurse -depth 2).where({$_.name -eq 'visual_studio_integration'}).fullname | |
$y = (dir $x -dir -recurse).where({$_.name -eq 'MSBuildExtensions'}).fullname + '\*' | |
(gi 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\*\BuildCustomizations').fullname.foreach({cp $y $_}) | |
- uses: actions/checkout@v3 | |
with: | |
repository: 'jllllll/bitsandbytes' | |
ref: ${{ inputs.version == 'latest' && 'cmake_windows' || format('cmake_windows_{0}', inputs.version) }} | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.10" | |
- name: Setup Mamba | |
uses: conda-incubator/setup-miniconda@v2.2.0 | |
with: | |
activate-environment: "build" | |
python-version: "3.10" | |
miniforge-variant: Mambaforge | |
miniforge-version: latest | |
use-mamba: true | |
add-pip-as-python-dependency: true | |
auto-activate-base: false | |
- name: Install Dependencies | |
run: | | |
$cudaVersion = $env:CUDAVER | |
$cudaChannels = '' | |
$cudaNum = [int]$cudaVersion.substring($cudaVersion.LastIndexOf('.')+1) | |
while ($cudaNum -ge 0) { $cudaChannels += '-c nvidia/label/cuda-' + $cudaVersion.Remove($cudaVersion.LastIndexOf('.')+1) + $cudaNum + ' '; $cudaNum-- } | |
$cudaChannels = $cudaChannels.TrimEnd() + ' -c conda-forge -c defaults' | |
mamba install -y 'cmake' 'ninja' 'cuda' $cudaChannels.Split() | |
- name: Compile Cuda Code | |
if: matrix.cublas == '0' | |
run: | | |
$env:CUDA_PATH = $env:CONDA_PREFIX | |
$cudaVersion = $env:CUDAVER.Remove($env:CUDAVER.LastIndexOf('.')) | |
$x = 'CUDA_PATH_V' + $cudaVersion.Replace('.','_') | |
[Environment]::SetEnvironmentVariable($x, $env:CUDA_PATH) | |
if (!(Test-Path '.\BuildArtifacts\')) { mkdir '.\BuildArtifacts' } | |
cmake -S . -B "./build_$cudaVersion_0" -G "Visual Studio 16 2019" -T "cuda=$cudaVersion" -D "NO_CUBLASLT=0" -D "CUDA_TARGET_ARCH_FEATURE_LEVEL=$cudaVersion" -D "CIBUILD=1" | |
cmake --build "./build_$cudaVersion_0" --target libbitsandbytes_cuda --config Release | |
- name: Compile Cuda Code nocublaslt | |
if: matrix.cublas == '1' | |
run: | | |
$env:CUDA_PATH = $env:CONDA_PREFIX | |
$cudaVersion = $env:CUDAVER.Remove($env:CUDAVER.LastIndexOf('.')) | |
$x = 'CUDA_PATH_V' + $cudaVersion.Replace('.','_') | |
[Environment]::SetEnvironmentVariable($x, $env:CUDA_PATH) | |
if (!(Test-Path '.\BuildArtifacts\')) { mkdir '.\BuildArtifacts' } | |
cmake -S . -B "./build_$cudaVersion_1" -G "Visual Studio 16 2019" -T "cuda=$cudaVersion" -D "NO_CUBLASLT=1" -D "CUDA_TARGET_ARCH_FEATURE_LEVEL=$cudaVersion" -D "CIBUILD=1" | |
cmake --build "./build_$cudaVersion_1" --target libbitsandbytes_cuda --config Release | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ format('compiled-binaries-{0}', inputs.version) }} | |
path: ./BuildArtifacts/* | |
compile_cuda_old: | |
# Uses Windows-2019 and Cuda Toolkit <= 11.2 with full version spec as string: "11.2.2" | |
# These versions of the Toolkit are not available through conda and must be installed through Jimver/cuda-toolkit (slower for newer versions, but these are fine) | |
# See https://github.com/Jimver/cuda-toolkit/blob/master/src/links/windows-links.ts for supported versions | |
name: Compile Cuda Code 2019 | |
runs-on: windows-2019 | |
strategy: | |
matrix: | |
cuda: ["11.1.1", "11.2.2"] | |
cublas: ["0", "1"] | |
defaults: | |
run: | |
shell: pwsh | |
env: | |
CUDAVER: ${{ matrix.cuda }} | |
steps: | |
- name: Install Cuda Toolkit | |
uses: Jimver/cuda-toolkit@v0.2.10 | |
with: | |
cuda: ${{ matrix.cuda }} | |
method: 'local' | |
- name: Install Visual Studio Integration | |
run: | | |
$x = (dir $env:CUDA_PATH -dir -recurse -depth 2).where({$_.name -eq 'visual_studio_integration'}).fullname | |
$y = (dir $x -dir -recurse).where({$_.name -eq 'MSBuildExtensions'}).fullname + '\*' | |
(gi 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\*\BuildCustomizations').fullname.foreach({cp $y $_}) | |
- uses: actions/checkout@v3 | |
with: | |
repository: 'jllllll/bitsandbytes' | |
ref: ${{ inputs.version == 'latest' && 'cmake_windows' || format('cmake_windows_{0}', inputs.version) }} | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.10" | |
- name: Setup Mamba | |
uses: conda-incubator/setup-miniconda@v2.2.0 | |
with: | |
activate-environment: "build" | |
python-version: "3.10" | |
miniforge-variant: Mambaforge | |
miniforge-version: latest | |
use-mamba: true | |
add-pip-as-python-dependency: true | |
auto-activate-base: false | |
- name: Install Dependencies | |
run: mamba install -y 'cmake' 'ninja' -c 'conda-forge' -c 'defaults' | |
- name: Compile Cuda Code | |
if: matrix.cublas == '0' | |
run: | | |
$cudaVersion = $env:CUDAVER.Remove($env:CUDAVER.LastIndexOf('.')) | |
if (!(Test-Path '.\BuildArtifacts\')) { mkdir '.\BuildArtifacts' } | |
cmake -S . -B "./build_$cudaVersion_0" -G "Visual Studio 16 2019" -T "cuda=$cudaVersion" -D "NO_CUBLASLT=0" -D "CUDA_TARGET_ARCH_FEATURE_LEVEL=$cudaVersion" -D "CIBUILD=1" | |
cmake --build "./build_$cudaVersion_0" --target libbitsandbytes_cuda --config Release | |
- name: Compile Cuda Code nocublaslt | |
if: matrix.cublas == '1' | |
run: | | |
$cudaVersion = $env:CUDAVER.Remove($env:CUDAVER.LastIndexOf('.')) | |
if (!(Test-Path '.\BuildArtifacts\')) { mkdir '.\BuildArtifacts' } | |
cmake -S . -B "./build_$cudaVersion_1" -G "Visual Studio 16 2019" -T "cuda=$cudaVersion" -D "NO_CUBLASLT=1" -D "CUDA_TARGET_ARCH_FEATURE_LEVEL=$cudaVersion" -D "CIBUILD=1" | |
cmake --build "./build_$cudaVersion_1" --target libbitsandbytes_cuda --config Release | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ format('compiled-binaries-{0}', inputs.version) }} | |
path: ./BuildArtifacts/* | |
build_wheel: | |
name: Build Wheel | |
needs: [compile_cuda_new, compile_cuda_old_conda, compile_cuda_old] | |
runs-on: windows-latest | |
defaults: | |
run: | |
shell: pwsh | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
repository: 'jllllll/bitsandbytes' | |
ref: ${{ inputs.version == 'latest' && 'cmake_windows' || format('cmake_windows_{0}', inputs.version) }} | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.10" | |
- uses: actions/download-artifact@v3 | |
with: | |
name: ${{ format('compiled-binaries-{0}', inputs.version) }} | |
path: ./bitsandbytes | |
- name: Build Wheel | |
run: | | |
python -m pip install build wheel | |
python -m build -n --wheel -C--global-option=--plat-name=win_amd64 | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: wheels | |
path: ./dist/*.whl | |
- name: Upload files to a GitHub release | |
uses: svenstaro/upload-release-action@2.6.1 | |
with: | |
file: ./dist/*.whl | |
tag: wheels | |
file_glob: true | |
overwrite: true |