diff --git a/.github/actions/build-and-upload/action.yml b/.github/actions/build-and-upload/action.yml new file mode 100644 index 0000000..65b3b01 --- /dev/null +++ b/.github/actions/build-and-upload/action.yml @@ -0,0 +1,127 @@ +name: "Build and Upload Flash Attention Wheels" +description: "Build, test, and upload Flash Attention wheels with optional manylinux support" + +inputs: + flash-attn-version: + description: "Flash-Attention version" + required: true + python-version: + description: "Python version" + required: true + torch-version: + description: "PyTorch version" + required: true + cuda-version: + description: "CUDA version" + required: true + is-upload: + description: "Whether to upload the release asset" + required: false + default: "true" + cleanup: + description: "Whether to clean up Python installation" + required: false + default: "false" + +outputs: + wheel-path: + description: "Path to the built wheel" + value: ${{ steps.build_wheels.outputs.WHEEL_PATH }} + wheel-path-manylinux: + description: "Path to the manylinux wheel" + value: ${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }} + +runs: + using: "composite" + steps: + - name: Install uv + uses: astral-sh/setup-uv@v7 + + - name: Install Python + shell: bash + run: | + uv venv -p ${{ inputs.python-version }} + uv pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel + current_dir=$(pwd) + echo "$current_dir/.venv/bin" >> $GITHUB_PATH + + - name: Setup CUDA + uses: mjun0812/setup-cuda@v1 + with: + version: ${{ inputs.cuda-version }} + + - name: Build wheels + id: build_wheels + shell: bash + run: | + chmod +x build_linux.sh + ./build_linux.sh ${{ inputs.flash-attn-version }} ${{ inputs.python-version }} ${{ inputs.torch-version }} ${{ inputs.cuda-version }} + wheel_path=$(ls flash-attention/dist/*.whl | head -n 1) + echo "WHEEL_PATH=$wheel_path" >> $GITHUB_OUTPUT + + - name: Install Test + shell: bash + run: | + pip uninstall -y flash-attn > /dev/null 2>&1 + pip install --no-cache-dir ${{ steps.build_wheels.outputs.WHEEL_PATH }} + python -c "import flash_attn; print(flash_attn.__version__)" + + - name: Upload Release Asset + if: ${{ inputs.is-upload == 'true' }} + shell: bash + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + tag_name=${{ github.ref_name }} + wheel_path="${{ steps.build_wheels.outputs.WHEEL_PATH }}" + # Check if the file exists + if [ ! -f "$wheel_path" ]; then + echo "Error: Wheel file not found at $wheel_path" + exit 1 + fi + # Upload the release asset using GitHub CLI + gh release upload "$tag_name" "$wheel_path" --clobber + + - name: Apply auditwheel repair + continue-on-error: true + id: auditwheel_repair + shell: bash + run: | + auditwheel show ${{ steps.build_wheels.outputs.WHEEL_PATH }} + auditwheel repair \ + --exclude libc10* --exclude libtorch* --exclude libcu* --exclude libnv* --exclude 'libtorch*' \ + ${{ steps.build_wheels.outputs.WHEEL_PATH }} -w flash-attention/dist_manylinux + wheel_path_manylinux=$(ls flash-attention/dist_manylinux/*manylinux*.whl 2>/dev/null | head -n 1 || echo "") + echo "WHEEL_PATH_MANYLINUX=$wheel_path_manylinux" >> $GITHUB_OUTPUT + + - name: Test manylinux wheel + continue-on-error: true + shell: bash + run: | + if [ -n "${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" ] && [ -f "${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" ]; then + pip uninstall -y flash-attn > /dev/null 2>&1 + pip install --no-cache-dir ${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }} + python -c "import flash_attn; print(flash_attn.__version__)" + fi + + - name: Upload manylinux wheel + if: ${{ inputs.is-upload == 'true' }} + continue-on-error: true + shell: bash + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + tag_name=${{ github.ref_name }} + wheel_path_manylinux="${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" + if [ -n "$wheel_path_manylinux" ] && [ -f "$wheel_path_manylinux" ]; then + # Upload the release asset using GitHub CLI + gh release upload "$tag_name" "$wheel_path_manylinux" --clobber + else + echo "Skipping manylinux wheel upload: file not found" + fi + + - name: Clean up + if: ${{ inputs.cleanup == 'true' }} + shell: bash + run: | + rm -rf /opt/hostedtoolcache/Python diff --git a/.github/workflows/_build_linux.yml b/.github/workflows/_build_linux.yml index 844992d..61f25e3 100644 --- a/.github/workflows/_build_linux.yml +++ b/.github/workflows/_build_linux.yml @@ -58,78 +58,11 @@ jobs: run: | sudo apt install -y ninja-build clang time patchelf - # Install Python using uv because setup-python needs newer version of glibc - - name: Install uv - uses: astral-sh/setup-uv@v7 - - name: Install Python - shell: bash - run: | - uv venv -p ${{ inputs.python-version }} - uv pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel - current_dir=$(pwd) - echo "$current_dir/.venv/bin" >> $GITHUB_PATH - - - uses: mjun0812/setup-cuda@v1 + - name: Build and upload wheels + uses: ./.github/actions/build-and-upload with: - version: ${{ inputs.cuda-version }} - - - name: Build wheels - id: build_wheels - run: | - chmod +x build_linux.sh - ./build_linux.sh ${{ inputs.flash-attn-version }} ${{ inputs.python-version }} ${{ inputs.torch-version }} ${{ inputs.cuda-version }} - wheel_path=$(ls flash-attention/dist/*.whl | head -n 1) - echo "WHEEL_PATH=$wheel_path" >> $GITHUB_OUTPUT - - - name: Install Test - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.build_wheels.outputs.WHEEL_PATH }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload Release Asset - if: ${{ inputs.is-upload }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path="${{ steps.build_wheels.outputs.WHEEL_PATH }}" - # Check if the file exists - if [ ! -f "$wheel_path" ]; then - echo "Error: Wheel file not found at $wheel_path" - exit 1 - fi - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path" --clobber - - - name: Apply auditwheel repair - continue-on-error: true - id: auditwheel_repair - run: | - auditwheel show ${{ steps.build_wheels.outputs.WHEEL_PATH }} - auditwheel repair \ - --exclude libc10* --exclude libtorch* --exclude libcu* --exclude libnv* --exclude 'libtorch*' \ - ${{ steps.build_wheels.outputs.WHEEL_PATH }} -w flash-attention/dist_manylinux - wheel_path_manylinux=$(ls flash-attention/dist_manylinux/*manylinux*.whl | head -n 1) - echo "WHEEL_PATH_MANYLINUX=$wheel_path_manylinux" >> $GITHUB_OUTPUT - - - name: Test manylinux wheel - continue-on-error: true - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload manylinux wheel - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path_manylinux="${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" - if [ ! -f "$wheel_path_manylinux" ]; then - echo "Error: Wheel file not found at $wheel_path_manylinux" - exit 1 - fi - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path_manylinux" --clobber + flash-attn-version: ${{ inputs.flash-attn-version }} + python-version: ${{ inputs.python-version }} + torch-version: ${{ inputs.torch-version }} + cuda-version: ${{ inputs.cuda-version }} + is-upload: ${{ inputs.is-upload }} diff --git a/.github/workflows/_build_linux_arm_self_host.yml b/.github/workflows/_build_linux_arm_self_host.yml index ec1a586..9a1ee36 100644 --- a/.github/workflows/_build_linux_arm_self_host.yml +++ b/.github/workflows/_build_linux_arm_self_host.yml @@ -95,90 +95,12 @@ jobs: run: | git config --global --add safe.directory $(pwd) - # Install Python using uv because setup-python needs newer version of glibc - - name: Install uv - uses: astral-sh/setup-uv@v7 - - name: Install Python - shell: bash - run: | - uv venv -p ${{ inputs.python-version }} - uv pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel - current_dir=$(pwd) - echo "$current_dir/.venv/bin" >> $GITHUB_PATH - - - uses: mjun0812/setup-cuda@v1 + - name: Build and upload wheels + uses: ./.github/actions/build-and-upload with: - version: ${{ inputs.cuda-version }} - - - name: Build wheels - timeout-minutes: 2160 - id: build_wheels - shell: bash - run: | - chmod +x build_linux.sh - ./build_linux.sh ${{ inputs.flash-attn-version }} ${{ inputs.python-version }} ${{ inputs.torch-version }} ${{ inputs.cuda-version }} - wheel_path=$(ls flash-attention/dist/*.whl | head -n 1) - echo "WHEEL_PATH=$wheel_path" >> $GITHUB_OUTPUT - - - name: Install Test - shell: bash - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.build_wheels.outputs.WHEEL_PATH }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload Release Asset - if: ${{ inputs.is-upload }} - shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path="${{ steps.build_wheels.outputs.WHEEL_PATH }}" - - # Check if the file exists - if [ ! -f "$wheel_path" ]; then - echo "Error: Wheel file not found at $wheel_path" - exit 1 - fi - - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path" --clobber - - - name: Apply auditwheel repair - continue-on-error: true - id: auditwheel_repair - run: | - auditwheel show ${{ steps.build_wheels.outputs.WHEEL_PATH }} - auditwheel repair \ - --exclude libc10* --exclude libtorch* --exclude libcu* --exclude libnv* --exclude 'libtorch*' \ - ${{ steps.build_wheels.outputs.WHEEL_PATH }} -w flash-attention/dist_manylinux - wheel_path_manylinux=$(ls flash-attention/dist_manylinux/*manylinux*.whl | head -n 1) - echo "WHEEL_PATH_MANYLINUX=$wheel_path_manylinux" >> $GITHUB_OUTPUT - - - name: Test manylinux wheel - continue-on-error: true - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload manylinux wheel - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path_manylinux="${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" - if [ ! -f "$wheel_path_manylinux" ]; then - echo "Error: Wheel file not found at $wheel_path_manylinux" - exit 1 - fi - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path_manylinux" --clobber - - - name: Clean up - shell: bash - if: always() - run: | - rm -rf /opt/hostedtoolcache/Python + flash-attn-version: ${{ inputs.flash-attn-version }} + python-version: ${{ inputs.python-version }} + torch-version: ${{ inputs.torch-version }} + cuda-version: ${{ inputs.cuda-version }} + is-upload: ${{ inputs.is-upload }} + cleanup: "true" diff --git a/.github/workflows/_build_linux_self_host.yml b/.github/workflows/_build_linux_self_host.yml index 3023eee..7b8ccdc 100644 --- a/.github/workflows/_build_linux_self_host.yml +++ b/.github/workflows/_build_linux_self_host.yml @@ -100,93 +100,15 @@ jobs: run: | git config --global --add safe.directory $(pwd) - # Install Python using uv because setup-python needs newer version of glibc - - name: Install uv - uses: astral-sh/setup-uv@v7 - - name: Install Python - shell: bash - run: | - uv venv -p ${{ inputs.python-version }} - uv pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel - current_dir=$(pwd) - echo "$current_dir/.venv/bin" >> $GITHUB_PATH - - - uses: mjun0812/setup-cuda@v1 + - name: Build and upload wheels + uses: ./.github/actions/build-and-upload with: - version: ${{ inputs.cuda-version }} - - - name: Build wheels - timeout-minutes: 2160 - id: build_wheels - shell: bash - run: | - chmod +x build_linux.sh - ./build_linux.sh ${{ inputs.flash-attn-version }} ${{ inputs.python-version }} ${{ inputs.torch-version }} ${{ inputs.cuda-version }} - wheel_path=$(ls flash-attention/dist/*.whl | head -n 1) - echo "WHEEL_PATH=$wheel_path" >> $GITHUB_OUTPUT - - - name: Install Test - shell: bash - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.build_wheels.outputs.WHEEL_PATH }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload Release Asset - if: ${{ inputs.is-upload }} - shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path="${{ steps.build_wheels.outputs.WHEEL_PATH }}" - - # Check if the file exists - if [ ! -f "$wheel_path" ]; then - echo "Error: Wheel file not found at $wheel_path" - exit 1 - fi - - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path" --clobber - - - name: Apply auditwheel repair - continue-on-error: true - id: auditwheel_repair - run: | - auditwheel show ${{ steps.build_wheels.outputs.WHEEL_PATH }} - auditwheel repair \ - --exclude libc10* --exclude libtorch* --exclude libcu* --exclude libnv* --exclude 'libtorch*' \ - ${{ steps.build_wheels.outputs.WHEEL_PATH }} -w flash-attention/dist_manylinux - wheel_path_manylinux=$(ls flash-attention/dist_manylinux/*manylinux*.whl | head -n 1) - echo "WHEEL_PATH_MANYLINUX=$wheel_path_manylinux" >> $GITHUB_OUTPUT - - - name: Test manylinux wheel - continue-on-error: true - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload manylinux wheel - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path_manylinux="${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" - if [ ! -f "$wheel_path_manylinux" ]; then - echo "Error: Wheel file not found at $wheel_path_manylinux" - exit 1 - fi - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path_manylinux" --clobber - - - name: Clean up - shell: bash - if: always() - run: | - rm -rf /opt/hostedtoolcache/Python + flash-attn-version: ${{ inputs.flash-attn-version }} + python-version: ${{ inputs.python-version }} + torch-version: ${{ inputs.torch-version }} + cuda-version: ${{ inputs.cuda-version }} + is-upload: ${{ inputs.is-upload }} + cleanup: "true" build_wheels_self_hosted_no_container: if: ${{ !inputs.use-container }} @@ -253,90 +175,12 @@ jobs: run: | git config --global --add safe.directory $(pwd) - # Install Python using uv because setup-python needs newer version of glibc - - name: Install uv - uses: astral-sh/setup-uv@v7 - - name: Install Python - shell: bash - run: | - uv venv -p ${{ inputs.python-version }} - uv pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel - current_dir=$(pwd) - echo "$current_dir/.venv/bin" >> $GITHUB_PATH - - - uses: mjun0812/setup-cuda@v1 + - name: Build and upload wheels + uses: ./.github/actions/build-and-upload with: - version: ${{ inputs.cuda-version }} - - - name: Build wheels - timeout-minutes: 2160 - id: build_wheels - shell: bash - run: | - chmod +x build_linux.sh - ./build_linux.sh ${{ inputs.flash-attn-version }} ${{ inputs.python-version }} ${{ inputs.torch-version }} ${{ inputs.cuda-version }} - wheel_path=$(ls flash-attention/dist/*.whl | head -n 1) - echo "WHEEL_PATH=$wheel_path" >> $GITHUB_OUTPUT - - - name: Install Test - shell: bash - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.build_wheels.outputs.WHEEL_PATH }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload Release Asset - if: ${{ inputs.is-upload }} - shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path="${{ steps.build_wheels.outputs.WHEEL_PATH }}" - - # Check if the file exists - if [ ! -f "$wheel_path" ]; then - echo "Error: Wheel file not found at $wheel_path" - exit 1 - fi - - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path" --clobber - - - name: Apply auditwheel repair - continue-on-error: true - id: auditwheel_repair - run: | - auditwheel show ${{ steps.build_wheels.outputs.WHEEL_PATH }} - auditwheel repair \ - --exclude libc10* --exclude libtorch* --exclude libcu* --exclude libnv* --exclude 'libtorch*' \ - ${{ steps.build_wheels.outputs.WHEEL_PATH }} -w flash-attention/dist_manylinux - wheel_path_manylinux=$(ls flash-attention/dist_manylinux/*manylinux*.whl | head -n 1) - echo "WHEEL_PATH_MANYLINUX=$wheel_path_manylinux" >> $GITHUB_OUTPUT - - - name: Test manylinux wheel - continue-on-error: true - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload manylinux wheel - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path_manylinux="${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" - if [ ! -f "$wheel_path_manylinux" ]; then - echo "Error: Wheel file not found at $wheel_path_manylinux" - exit 1 - fi - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path_manylinux" --clobber - - - name: Clean up - shell: bash - if: always() - run: | - rm -rf /opt/hostedtoolcache/Python + flash-attn-version: ${{ inputs.flash-attn-version }} + python-version: ${{ inputs.python-version }} + torch-version: ${{ inputs.torch-version }} + cuda-version: ${{ inputs.cuda-version }} + is-upload: ${{ inputs.is-upload }} + cleanup: "true" diff --git a/.github/workflows/_build_manylinux_self_host.yml b/.github/workflows/_build_manylinux_self_host.yml index 48bf30f..8b6f1e4 100644 --- a/.github/workflows/_build_manylinux_self_host.yml +++ b/.github/workflows/_build_manylinux_self_host.yml @@ -90,93 +90,12 @@ jobs: run: | git config --global --add safe.directory $(pwd) - # Install Python using uv because setup-python needs newer version of glibc - - name: Install uv - uses: astral-sh/setup-uv@v7 - - name: Install Python - shell: bash - run: | - uv venv -p ${{ inputs.python-version }} - uv pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel - current_dir=$(pwd) - echo "$current_dir/.venv/bin" >> $GITHUB_PATH - - - uses: mjun0812/setup-cuda@v1 + - name: Build and upload wheels + uses: ./.github/actions/build-and-upload with: - version: ${{ inputs.cuda-version }} - - - name: Build wheels - timeout-minutes: 2160 - id: build_wheels - shell: bash - run: | - chmod +x build_linux.sh - ./build_linux.sh ${{ inputs.flash-attn-version }} ${{ inputs.python-version }} ${{ inputs.torch-version }} ${{ inputs.cuda-version }} - wheel_path=$(ls flash-attention/dist/*.whl | head -n 1) - echo "WHEEL_PATH=$wheel_path" >> $GITHUB_OUTPUT - - - name: Install Test - shell: bash - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.build_wheels.outputs.WHEEL_PATH }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload Release Asset - if: ${{ inputs.is-upload }} - shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path="${{ steps.build_wheels.outputs.WHEEL_PATH }}" - - # Check if the file exists - if [ ! -f "$wheel_path" ]; then - echo "Error: Wheel file not found at $wheel_path" - exit 1 - fi - - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path" --clobber - - - name: Apply auditwheel repair - continue-on-error: true - id: auditwheel_repair - shell: bash - run: | - auditwheel show ${{ steps.build_wheels.outputs.WHEEL_PATH }} - auditwheel repair \ - --exclude libc10* --exclude libtorch* --exclude libcu* --exclude libnv* --exclude 'libtorch*' \ - ${{ steps.build_wheels.outputs.WHEEL_PATH }} -w flash-attention/dist_manylinux - ls -l flash-attention/dist_manylinux - wheel_path_manylinux=$(ls flash-attention/dist_manylinux/*manylinux*.whl | head -n 1) - echo "WHEEL_PATH_MANYLINUX=$wheel_path_manylinux" >> $GITHUB_OUTPUT - - - name: Test manylinux wheel - continue-on-error: true - run: | - pip uninstall -y flash-attn > /dev/null 2>&1 - pip install --no-cache-dir ${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }} - python -c "import flash_attn; print(flash_attn.__version__)" - - - name: Upload manylinux wheel - if: ${{ inputs.is-upload }} - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - tag_name=${{ github.ref_name }} - wheel_path_manylinux="${{ steps.auditwheel_repair.outputs.WHEEL_PATH_MANYLINUX }}" - if [ ! -f "$wheel_path_manylinux" ]; then - echo "Error: Wheel file not found at $wheel_path_manylinux" - exit 1 - fi - # Upload the release asset using GitHub CLI - gh release upload "$tag_name" "$wheel_path_manylinux" --clobber - - - name: Clean up - shell: bash - if: always() - run: | - rm -rf /opt/hostedtoolcache/Python + flash-attn-version: ${{ inputs.flash-attn-version }} + python-version: ${{ inputs.python-version }} + torch-version: ${{ inputs.torch-version }} + cuda-version: ${{ inputs.cuda-version }} + is-upload: ${{ inputs.is-upload }} + cleanup: "true"