-
Notifications
You must be signed in to change notification settings - Fork 72
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Establish cicd workflow to build and publish FastVideo and STA Kernel…
… to pypi when there is a version change
- Loading branch information
1 parent
554ee17
commit b40b65a
Showing
5 changed files
with
322 additions
and
5 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
name: Publish FastVideo to PyPI on Version Change | ||
|
||
on: | ||
push: | ||
branches: | ||
- main | ||
paths: | ||
- 'pyproject.toml' # Trigger when pyproject.toml changes | ||
|
||
jobs: | ||
check-version-change: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
version-changed: ${{ steps.check-version.outputs.changed }} | ||
new-version: ${{ steps.check-version.outputs.new-version }} | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v3 | ||
with: | ||
fetch-depth: 2 | ||
|
||
- name: Check if version changed | ||
id: check-version | ||
run: | | ||
# Get current commit's version | ||
NEW_VERSION=$(grep -oP 'version\s*=\s*"\K[^"]+' pyproject.toml) | ||
echo "New version: $NEW_VERSION" | ||
# Get previous version from git history | ||
OLD_VERSION=$(git show HEAD~1:./pyproject.toml | grep -oP 'version\s*=\s*"\K[^"]+' || echo "0.0.0") | ||
echo "Old version: $OLD_VERSION" | ||
if [ "$NEW_VERSION" != "$OLD_VERSION" ]; then | ||
echo "Version changed from $OLD_VERSION to $NEW_VERSION" | ||
echo "changed=true" >> $GITHUB_OUTPUT | ||
echo "new-version=$NEW_VERSION" >> $GITHUB_OUTPUT | ||
else | ||
echo "Version did not change" | ||
echo "changed=false" >> $GITHUB_OUTPUT | ||
fi | ||
build-publish-main: | ||
needs: check-version-change | ||
if: needs.check-version-change.outputs.version-changed == 'true' | ||
runs-on: ubuntu-latest | ||
permissions: | ||
id-token: write # Needed for OIDC Trusted Publishing | ||
|
||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v3 | ||
|
||
- name: Set up Python | ||
uses: actions/setup-python@v4 | ||
with: | ||
python-version: '3.10' | ||
|
||
- name: Install build dependencies | ||
run: | | ||
python -m pip install --upgrade pip | ||
pip install build twine wheel | ||
- name: Build package | ||
run: | | ||
python -m build | ||
- name: Publish release distributions to PyPI | ||
uses: pypa/gh-action-pypi-publish@release/v1 | ||
with: | ||
packages-dir: dist/ |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,221 @@ | ||
name: Publish Sliding Tile Attention Kernel to PyPI on Version Change | ||
|
||
on: | ||
push: | ||
branches: | ||
- main | ||
paths: | ||
- "csrc/sliding_tile_attention/setup.py" | ||
|
||
jobs: | ||
check-version-change: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
version-changed: ${{ steps.check-version.outputs.changed }} | ||
new-version: ${{ steps.check-version.outputs.new-version }} | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v3 | ||
with: | ||
fetch-depth: 2 | ||
|
||
- name: Check if version changed | ||
id: check-version | ||
run: | | ||
cd csrc/sliding_tile_attention | ||
# Get current commit's version | ||
NEW_VERSION=$(grep -oP 'VERSION\s*=\s*"\K[^"]+' setup.py) | ||
echo "New version: $NEW_VERSION" | ||
# Get previous version from git history | ||
OLD_VERSION=$(git show HEAD~1:./setup.py | grep -oP 'VERSION\s*=\s*"\K[^"]+' || echo "0.0.0") | ||
echo "Old version: $OLD_VERSION" | ||
if [ "$NEW_VERSION" != "$OLD_VERSION" ]; then | ||
echo "Version changed from $OLD_VERSION to $NEW_VERSION" | ||
echo "changed=true" >> $GITHUB_OUTPUT | ||
echo "new-version=$NEW_VERSION" >> $GITHUB_OUTPUT | ||
else | ||
echo "Version did not change" | ||
echo "changed=false" >> $GITHUB_OUTPUT | ||
fi | ||
build_wheels: | ||
name: Build Wheel | ||
needs: check-version-change | ||
if: needs.check-version-change.outputs.version-changed == 'true' | ||
runs-on: ${{ matrix.os }} | ||
|
||
strategy: | ||
fail-fast: false | ||
matrix: | ||
# Using ubuntu-20.04 instead of 22.04 for more compatibility (glibc). Ideally we'd use the | ||
# manylinux docker image, but I haven't figured out how to install CUDA on manylinux. | ||
os: [ubuntu-22.04] | ||
python-version: ['3.10', '3.11', '3.12', '3.13'] | ||
torch-version: ['2.5.1', '2.6.0'] | ||
cuda-version: ['12.4.1', '12.5.1', '12.6.3'] | ||
|
||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
|
||
- name: Set up Python | ||
uses: actions/setup-python@v5 | ||
with: | ||
python-version: ${{ matrix.python-version }} | ||
|
||
- name: Install CUDA ${{ matrix.cuda-version }} | ||
uses: Jimver/[email protected] | ||
id: cuda-toolkit | ||
with: | ||
cuda: ${{ matrix.cuda-version }} | ||
linux-local-args: '["--toolkit"]' | ||
method: 'network' | ||
|
||
- name: Install dependencies (GCC, Clang, CUDA Paths, Git) | ||
run: | | ||
sudo apt update | ||
sudo apt install -y git patchelf gcc-11 g++-11 clang-11 | ||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100 --slave /usr/bin/g++ g++ /usr/bin/g++-11 | ||
# Allow Git to Access Safe Directory | ||
git config --global --add safe.directory /__w/FastVideo/FastVideo | ||
# Set CUDA environment variables | ||
export CUDA_HOME=/usr/local/cuda-${{ matrix.cuda-version }} | ||
export PATH=${CUDA_HOME}/bin:${PATH} | ||
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH | ||
# Verify installation | ||
gcc --version | ||
g++ --version | ||
clang-11 --version | ||
nvcc --version | ||
- name: Install PyTorch ${{ matrix.torch-version }}+cu${{ matrix.cuda-version }} | ||
run: | | ||
pip install --upgrade pip | ||
# With python 3.13 and torch 2.5.1, unless we update typing-extensions, we get error | ||
# AttributeError: attribute '__default__' of 'typing.ParamSpec' objects is not writable | ||
pip install typing-extensions==4.12.2 | ||
# We want to figure out the CUDA version to download pytorch | ||
# e.g. we can have system CUDA version being 11.7 but if torch==1.12 then we need to download the wheel from cu116 | ||
# see https://github.com/pytorch/pytorch/blob/main/RELEASE.md#release-compatibility-matrix | ||
export TORCH_CUDA_VERSION=124 | ||
pip install --no-cache-dir torch==${{ matrix.torch-version }} --index-url https://download.pytorch.org/whl/cu${TORCH_CUDA_VERSION} | ||
nvcc --version | ||
python --version | ||
python -c "import torch; print('PyTorch:', torch.__version__)" | ||
python -c "import torch; print('CUDA:', torch.version.cuda)" | ||
python -c "from torch.utils import cpp_extension; print (cpp_extension.CUDA_HOME)" | ||
- name: Build wheel | ||
run: | | ||
# We want setuptools >= 49.6.0 otherwise we can't compile the extension if system CUDA version is 11.7 and pytorch cuda version is 11.6 | ||
# https://github.com/pytorch/pytorch/blob/664058fa83f1d8eede5d66418abff6e20bd76ca8/torch/utils/cpp_extension.py#L810 | ||
# However this still fails so I'm using a newer version of setuptools | ||
pip install setuptools | ||
pip install ninja packaging wheel | ||
cd csrc/sliding_tile_attention # Move into the correct folder | ||
git submodule update --init --recursive tk # Ensure ThunderKittens submodule is initialized | ||
python setup.py bdist_wheel --dist-dir=dist | ||
- name: Rename wheel file | ||
run: | | ||
cd csrc/sliding_tile_attention | ||
CUDA_SHORT_VERSION=$(echo ${{ matrix.cuda-version }} | cut -d. -f1,2 | sed 's/\.//g') | ||
TORCH_SHORT_VERSION=$(echo ${{ matrix.torch-version }} | cut -d. -f1,2) | ||
# Get the correct version format | ||
tmpname=cu${CUDA_SHORT_VERSION}torch${TORCH_SHORT_VERSION} | ||
wheel_name=$(ls dist/*whl | xargs -n 1 basename | sed "s/-/+$tmpname-/2") | ||
# Rename with version information | ||
ls dist/*whl |xargs -I {} mv {} dist/${wheel_name} | ||
echo "wheel_name=${wheel_name}" >> $GITHUB_ENV | ||
- name: Upload wheel artifact | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: ${{ env.wheel_name }} | ||
path: csrc/sliding_tile_attention/dist/*.whl | ||
retention-days: 90 | ||
|
||
publish_package: | ||
name: Publish package | ||
needs: [build_wheels] | ||
if: needs.check-version-change.outputs.version-changed == 'true' | ||
runs-on: ubuntu-22.04 | ||
permissions: | ||
id-token: write # Needed for OIDC Trusted Publishing | ||
|
||
steps: | ||
- uses: actions/checkout@v4 | ||
|
||
- uses: actions/setup-python@v5 | ||
with: | ||
python-version: '3.10' | ||
|
||
- name: Install CUDA 12.4.1 | ||
uses: Jimver/[email protected] | ||
id: cuda-toolkit | ||
with: | ||
cuda: 12.4.1 | ||
linux-local-args: '["--toolkit"]' | ||
method: 'network' | ||
sub-packages: '["nvcc"]' | ||
|
||
- name: Install dependencies (GCC, Clang, CUDA Paths, Git) | ||
run: | | ||
sudo apt update | ||
sudo apt install -y git patchelf gcc-11 g++-11 clang-11 | ||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100 --slave /usr/bin/g++ g++ /usr/bin/g++-11 | ||
# Allow Git to Access Safe Directory | ||
git config --global --add safe.directory /__w/FastVideo/FastVideo | ||
# Set CUDA environment variables | ||
export CUDA_HOME=/usr/local/cuda-12.4.1 | ||
export PATH=${CUDA_HOME}/bin:${PATH} | ||
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH | ||
# Verify installation | ||
gcc --version | ||
g++ --version | ||
clang-11 --version | ||
nvcc --version | ||
- name: Install PyTorch 2.5.1+cu12.4.1 | ||
run: | | ||
pip install --upgrade pip | ||
# With python 3.13 and torch 2.5.1, unless we update typing-extensions, we get error | ||
# AttributeError: attribute '__default__' of 'typing.ParamSpec' objects is not writable | ||
pip install typing-extensions==4.12.2 | ||
# We want to figure out the CUDA version to download pytorch | ||
# e.g. we can have system CUDA version being 11.7 but if torch==1.12 then we need to download the wheel from cu116 | ||
# see https://github.com/pytorch/pytorch/blob/main/RELEASE.md#release-compatibility-matrix | ||
export TORCH_CUDA_VERSION=124 | ||
pip install --no-cache-dir torch==2.5.1 --index-url https://download.pytorch.org/whl/cu${TORCH_CUDA_VERSION} | ||
nvcc --version | ||
python --version | ||
python -c "import torch; print('PyTorch:', torch.__version__)" | ||
python -c "import torch; print('CUDA:', torch.version.cuda)" | ||
python -c "from torch.utils import cpp_extension; print (cpp_extension.CUDA_HOME)" | ||
- name: Build source distribution | ||
run: | | ||
# We want setuptools >= 49.6.0 otherwise we can't compile the extension if system CUDA version is 11.7 and pytorch cuda version is 11.6 | ||
# https://github.com/pytorch/pytorch/blob/664058fa83f1d8eede5d66418abff6e20bd76ca8/torch/utils/cpp_extension.py#L810 | ||
# However this still fails so I'm using a newer version of setuptools | ||
pip install setuptools | ||
pip install ninja packaging wheel | ||
cd csrc/sliding_tile_attention # Move into the correct folder | ||
git submodule update --init --recursive tk # Ensure ThunderKittens submodule is initialized | ||
python setup.py sdist --dist-dir=dist | ||
- name: Publish release distributions to PyPI | ||
uses: pypa/gh-action-pypi-publish@release/v1 | ||
with: | ||
packages-dir: csrc/sliding_tile_attention/dist/ |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
recursive-include tk * | ||
include config.py |
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
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