refactor: reorganize auditwheel repair and add manylinux platform support

- Move auditwheel repair after initial release upload with continue-on-error to allow pipeline continuation
- Add manylinux platform normalization support in normalize_platform_name()
- Expand self-hosted build matrix to include Python 3.14 and Flash Attention 2.8.3
- Improve wheel upload flow by separating regular and manylinux wheel handling
This commit is contained in:
Junya Morioka
2025-12-11 02:26:39 +09:00
parent 78470eab40
commit ab165f3f22
4 changed files with 87 additions and 34 deletions
+26 -14
View File
@@ -65,7 +65,7 @@ jobs:
- name: Install build dependencies - name: Install build dependencies
run: | run: |
sudo apt install -y ninja-build clang time sudo apt install -y ninja-build clang time
pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel pip install -U pip setuptools==75.8.0 wheel packaging psutil
- name: Build wheels - name: Build wheels
id: build_wheels id: build_wheels
@@ -75,23 +75,12 @@ jobs:
wheel_name=$(basename $(ls flash-attention/dist/*.whl | head -n 1)) wheel_name=$(basename $(ls flash-attention/dist/*.whl | head -n 1))
echo "WHEEL_NAME=$wheel_name" >> $GITHUB_OUTPUT echo "WHEEL_NAME=$wheel_name" >> $GITHUB_OUTPUT
- name: Apply auditwheel repair
run: |
auditwheel show flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}
auditwheel repair flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }} -w flash-attention/dist_manylinux
wheel_name=$(basename $(ls flash-attention/dist_manylinux/*.whl | head -n 1))
echo "WHEEL_NAME_MANYLINUX=$wheel_name" >> $GITHUB_OUTPUT
- name: Install Test - name: Install Test
run: | run: |
pip uninstall -y flash-attn > /dev/null 2>&1 pip uninstall -y flash-attn > /dev/null 2>&1
pip install --no-cache-dir flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }} pip install --no-cache-dir flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}
python -c "import flash_attn; print(flash_attn.__version__)" python -c "import flash_attn; print(flash_attn.__version__)"
pip uninstall -y flash-attn > /dev/null 2>&1
pip install --no-cache-dir flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}
python -c "import flash_attn; print(flash_attn.__version__)"
- name: Upload Release Asset - name: Upload Release Asset
if: ${{ inputs.is-upload }} if: ${{ inputs.is-upload }}
env: env:
@@ -99,18 +88,41 @@ jobs:
run: | run: |
tag_name=${{ github.ref_name }} tag_name=${{ github.ref_name }}
wheel_path="flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}" wheel_path="flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}"
wheel_path_manylinux="flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}"
# Check if the file exists # Check if the file exists
if [ ! -f "$wheel_path" ]; then if [ ! -f "$wheel_path" ]; then
echo "Error: Wheel file not found at $wheel_path" echo "Error: Wheel file not found at $wheel_path"
exit 1 exit 1
fi fi
# Upload the release asset using GitHub CLI
gh release upload "$tag_name" "$wheel_path" --clobber
- name: Apply auditwheel repair
continue-on-error: true
run: |
pip install auditwheel
auditwheel show flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}
auditwheel repair flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }} -w flash-attention/dist_manylinux
wheel_name=$(basename $(ls flash-attention/dist_manylinux/*.whl | head -n 1))
echo "WHEEL_NAME_MANYLINUX=$wheel_name" >> $GITHUB_OUTPUT
- name: Apply auditwheel repair
if: ${{ inputs.is-upload }}
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pip uninstall -y flash-attn > /dev/null 2>&1
pip install --no-cache-dir flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}
python -c "import flash_attn; print(flash_attn.__version__)"
wheel_path_manylinux="flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}"
if [ ! -f "$wheel_path_manylinux" ]; then if [ ! -f "$wheel_path_manylinux" ]; then
echo "Error: Wheel file not found at $wheel_path_manylinux" echo "Error: Wheel file not found at $wheel_path_manylinux"
exit 1 exit 1
fi fi
# Upload the release asset using GitHub CLI # Upload the release asset using GitHub CLI
gh release upload "$tag_name" "$wheel_path" --clobber
gh release upload "$tag_name" "$wheel_path_manylinux" --clobber gh release upload "$tag_name" "$wheel_path_manylinux" --clobber
+25 -14
View File
@@ -230,7 +230,7 @@ jobs:
shell: bash shell: bash
run: | run: |
sudo apt install -y ninja-build clang sudo apt install -y ninja-build clang
pip install -U pip setuptools==75.8.0 wheel packaging psutil auditwheel pip install -U pip setuptools==75.8.0 wheel packaging psutil
- name: Build wheels - name: Build wheels
timeout-minutes: 2160 timeout-minutes: 2160
@@ -242,13 +242,6 @@ jobs:
wheel_name=$(basename $(ls flash-attention/dist/*.whl | head -n 1)) wheel_name=$(basename $(ls flash-attention/dist/*.whl | head -n 1))
echo "WHEEL_NAME=$wheel_name" >> $GITHUB_OUTPUT echo "WHEEL_NAME=$wheel_name" >> $GITHUB_OUTPUT
- name: Apply auditwheel repair
run: |
auditwheel show flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}
auditwheel repair flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }} -w flash-attention/dist_manylinux
wheel_name=$(basename $(ls flash-attention/dist_manylinux/*.whl | head -n 1))
echo "WHEEL_NAME_MANYLINUX=$wheel_name" >> $GITHUB_OUTPUT
- name: Install Test - name: Install Test
shell: bash shell: bash
run: | run: |
@@ -256,10 +249,6 @@ jobs:
pip install --no-cache-dir flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }} pip install --no-cache-dir flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}
python -c "import flash_attn; print(flash_attn.__version__)" python -c "import flash_attn; print(flash_attn.__version__)"
pip uninstall -y flash-attn > /dev/null 2>&1
pip install --no-cache-dir flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}
python -c "import flash_attn; print(flash_attn.__version__)"
- name: Upload Release Asset - name: Upload Release Asset
if: ${{ inputs.is-upload }} if: ${{ inputs.is-upload }}
shell: bash shell: bash
@@ -268,20 +257,42 @@ jobs:
run: | run: |
tag_name=${{ github.ref_name }} tag_name=${{ github.ref_name }}
wheel_path="flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}" wheel_path="flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}"
wheel_path_manylinux="flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}"
# Check if the file exists # Check if the file exists
if [ ! -f "$wheel_path" ]; then if [ ! -f "$wheel_path" ]; then
echo "Error: Wheel file not found at $wheel_path" echo "Error: Wheel file not found at $wheel_path"
exit 1 exit 1
fi fi
# Upload the release asset using GitHub CLI
gh release upload "$tag_name" "$wheel_path" --clobber
- name: Apply auditwheel repair
continue-on-error: true
run: |
pip install auditwheel
auditwheel show flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }}
auditwheel repair flash-attention/dist/${{ steps.build_wheels.outputs.WHEEL_NAME }} -w flash-attention/dist_manylinux
wheel_name=$(basename $(ls flash-attention/dist_manylinux/*.whl | head -n 1))
echo "WHEEL_NAME_MANYLINUX=$wheel_name" >> $GITHUB_OUTPUT
- name: Apply auditwheel repair
if: ${{ inputs.is-upload }}
continue-on-error: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pip uninstall -y flash-attn > /dev/null 2>&1
pip install --no-cache-dir flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}
python -c "import flash_attn; print(flash_attn.__version__)"
wheel_path_manylinux="flash-attention/dist_manylinux/${{ steps.build_wheels.outputs.WHEEL_NAME_MANYLINUX }}"
if [ ! -f "$wheel_path_manylinux" ]; then if [ ! -f "$wheel_path_manylinux" ]; then
echo "Error: Wheel file not found at $wheel_path_manylinux" echo "Error: Wheel file not found at $wheel_path_manylinux"
exit 1 exit 1
fi fi
# Upload the release asset using GitHub CLI # Upload the release asset using GitHub CLI
gh release upload "$tag_name" "$wheel_path" --clobber
gh release upload "$tag_name" "$wheel_path_manylinux" --clobber gh release upload "$tag_name" "$wheel_path_manylinux" --clobber
- name: Clean up - name: Clean up
+18
View File
@@ -8,6 +8,7 @@ def parse_wheel_filename(filename: str) -> dict | None:
flash_attn-2.6.3+cu124torch2.5-cp311-cp311-linux_x86_64.whl flash_attn-2.6.3+cu124torch2.5-cp311-cp311-linux_x86_64.whl
flash_attn-2.7.4+cu124torch2.6-cp311-cp311-linux_x86_64.whl flash_attn-2.7.4+cu124torch2.6-cp311-cp311-linux_x86_64.whl
flash_attn-2.7.4.post1+cu130torch2.9-cp310-cp310-linux_x86_64.whl flash_attn-2.7.4.post1+cu130torch2.9-cp310-cp310-linux_x86_64.whl
flash_attn-2.8.3+cu128torch2.9-cp313-cp313-manylinux_2_34_x86_64.whl
--- ---
Wheel filename から情報を抽出 Wheel filename から情報を抽出
@@ -43,9 +44,26 @@ def normalize_platform_name(raw: str) -> str:
Examples: Examples:
linux -> Linux linux -> Linux
linux_x86_64 -> Linux x86_64 linux_x86_64 -> Linux x86_64
manylinux_2_34_x86_64 -> Manylinux 2_34 x86_64
manylinux_2_17_aarch64 -> Manylinux 2_17 arm64
win32 -> Windows win32 -> Windows
amd64 -> x86_64 amd64 -> x86_64
""" """
# Handle manylinux format: manylinux_X_Y_ARCH -> Manylinux X_Y ARCH
if raw.startswith("manylinux"):
# Extract parts from manylinux_X_Y_ARCH format
# Examples: manylinux_2_34_x86_64, manylinux_2_17_aarch64
parts = raw.split("_")
if len(parts) >= 4:
# parts[0] = 'manylinux', parts[1] = X, parts[2] = Y, parts[3:] = ARCH parts
# ARCH can contain underscores (e.g., x86_64)
version = f"{parts[1]}_{parts[2]}"
arch = "_".join(parts[3:]) # Join remaining parts for arch (e.g., x86_64)
# Apply architecture normalization
if arch == "aarch64":
arch = "arm64"
return f"Manylinux {version} {arch}"
name = raw[:1].upper() + raw[1:] # linux -> Linux name = raw[:1].upper() + raw[1:] # linux -> Linux
name = name.replace("_", " ", 1) # linux_x86_64 -> Linux x86_64 name = name.replace("_", " ", 1) # linux_x86_64 -> Linux x86_64
if "Win" in name: if "Win" in name:
+18 -6
View File
@@ -89,10 +89,22 @@ LINUX_ARM64_MATRIX = {
} }
LINUX_SELF_HOSTED_MATRIX = { LINUX_SELF_HOSTED_MATRIX = {
"flash-attn-version": ["2.7.4"], "flash-attn-version": [
"python-version": ["3.10", "3.11", "3.12", "3.13"], "2.7.4",
"2.8.3",
],
"python-version": [
"3.10",
"3.11",
"3.12",
"3.13",
"3.14",
],
"torch-version": ["2.9.1"], "torch-version": ["2.9.1"],
"cuda-version": ["12.8", "13.0"], "cuda-version": [
"12.8",
"13.0",
],
} }
LINUX_ARM64_SELF_HOSTED_MATRIX = { LINUX_ARM64_SELF_HOSTED_MATRIX = {
@@ -169,11 +181,11 @@ def main():
"linux_arm64": False, "linux_arm64": False,
# "linux_arm64": LINUX_ARM64_MATRIX, # "linux_arm64": LINUX_ARM64_MATRIX,
# #
"linux_self_hosted": False, # "linux_self_hosted": False,
# "linux_self_hosted": LINUX_SELF_HOSTED_MATRIX, "linux_self_hosted": LINUX_SELF_HOSTED_MATRIX,
# #
# "linux_arm64_self_hosted": False, # "linux_arm64_self_hosted": False,
"linux_arm64_self_hosted": LINUX_ARM64_SELF_HOSTED_MATRIX, # "linux_arm64_self_hosted": LINUX_ARM64_SELF_HOSTED_MATRIX,
# #
"windows": False, "windows": False,
# "windows": WINDOWS_MATRIX, # "windows": WINDOWS_MATRIX,