Skip to content

[Dont merge] Build 0.1.0 ARM wheel by CI, use paddlepaddle 3.3.1 ABI #82

[Dont merge] Build 0.1.0 ARM wheel by CI, use paddlepaddle 3.3.1 ABI

[Dont merge] Build 0.1.0 ARM wheel by CI, use paddlepaddle 3.3.1 ABI #82

Workflow file for this run

name: Build Wheels for Paddle
on:
push:
branches: [paddle]
tags: ["v*"]
pull_request:
merge_group:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref_name }}-${{ github.ref_type == 'branch' && github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
cancel-in-progress: true
permissions:
id-token: write
contents: write
defaults:
run:
shell: bash -l -eo pipefail {0}
env:
PADDLECODEC_TEST_VIDEO_URL: https://paddlenlp.bj.bcebos.com/datasets/paddlemix/demo_video/example_video.mp4
PADDLECODEC_TEST_VIDEO_CACHE_KEY: paddlecodec-test-video-v1-example-video
PADDLECODEC_TEST_VIDEO_PATH: .github/test-assets/example_video.mp4
jobs:
prepare-test-video:
runs-on: ubuntu-latest
name: Prepare cached Paddle test video
steps:
- name: Restore cached test video
id: cache-test-video
uses: actions/cache@v4
with:
path: ${{ env.PADDLECODEC_TEST_VIDEO_PATH }}
key: ${{ env.PADDLECODEC_TEST_VIDEO_CACHE_KEY }}
- name: Download test video
if: steps.cache-test-video.outputs.cache-hit != 'true'
run: |
mkdir -p "$(dirname "${PADDLECODEC_TEST_VIDEO_PATH}")"
curl --fail --location --retry 5 --retry-all-errors \
--output "${PADDLECODEC_TEST_VIDEO_PATH}" \
"${PADDLECODEC_TEST_VIDEO_URL}"
- name: Upload cached test video artifact
uses: actions/upload-artifact@v5
with:
name: paddlecodec-test-video
path: ${{ env.PADDLECODEC_TEST_VIDEO_PATH }}
if-no-files-found: error
build-paddlecodec-wheel:
name: Build and upload Paddle wheel (${{ matrix.arch-name }}, py${{ matrix.python-version }})
runs-on: ${{ matrix.runner }}
container:
image: ${{ matrix.container-image }}
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
arch: ["x86_64", "arm64"]
include:
- arch: x86_64
arch-name: x86_64
runner: ubuntu-latest
container-image: pytorch/manylinux2_28-builder:cpu
artifact-prefix: paddlecodec-wheel-linux
wheel-platform: manylinux_2_28_x86_64
- arch: arm64
arch-name: arm64
runner: ubuntu-24.04-arm
container-image: pytorch/manylinux2_28_aarch64-builder:cpu-aarch64
artifact-prefix: paddlecodec-wheel-linux-arm64
wheel-platform: manylinux_2_28_aarch64
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup conda environment
uses: conda-incubator/setup-miniconda@v3
with:
auto-update-conda: true
miniforge-version: latest
activate-environment: build
python-version: ${{ matrix.python-version }}
- name: Install build dependencies
run: |
python -m pip install --upgrade pip
pip install build wheel setuptools
- name: Install PaddlePaddle nightly
run: |
pip install --pre paddlepaddle-gpu==3.3.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu130/
- name: Run pre-build script
run: |
bash packaging/pre_build_script.sh
- name: Build wheel
run: |
export BUILD_AGAINST_ALL_FFMPEG_FROM_S3=1
export I_CONFIRM_THIS_IS_NOT_A_LICENSE_VIOLATION=1
export TORCHCODEC_CMAKE_BUILD_DIR=$(pwd)/build_cmake
python -m build --wheel -vvv --no-isolation
- name: Repair wheel
run: |
pip install auditwheel
mkdir -p temp_libs
unzip -j dist/*.whl "torchcodec/*.so" -d temp_libs || true
FFMPEG_LIB_PATHS=$(find "$(pwd)/build_cmake/_deps" -type d -name "lib" -print | paste -sd: -)
PADDLE_PATH=$(python -c "import paddle; print(paddle.__path__[0])")
PADDLE_LIB_PATHS="$PADDLE_PATH/base:$PADDLE_PATH/libs"
INTERNAL_LIB_PATH=$(pwd)/temp_libs
export LD_LIBRARY_PATH=${FFMPEG_LIB_PATHS}:${PADDLE_LIB_PATHS}:${INTERNAL_LIB_PATH}:${LD_LIBRARY_PATH}
auditwheel repair dist/*.whl --plat ${{ matrix.wheel-platform }} -w wheelhouse/ --exclude "*"
rm -rf temp_libs
rm dist/*.whl
mv wheelhouse/*.whl dist/
rmdir wheelhouse
- name: Upload wheel artifact
uses: actions/upload-artifact@v5
with:
name: ${{ matrix.artifact-prefix }}-py${{ matrix.python-version }}
path: dist/*.whl
- name: Run post-build script
run: |
bash packaging/post_build_script.sh
- name: List wheel contents
run: |
wheel_path=$(find dist -type f -name "*.whl")
echo "Wheel path: $wheel_path"
unzip -l $wheel_path
test-paddlecodec-wheel:
name: Install and test Paddle wheel (${{ matrix.arch-name }}, py${{ matrix.python-version }}, ffmpeg ${{ matrix.ffmpeg-version }})
needs: [prepare-test-video, build-paddlecodec-wheel]
runs-on: ${{ matrix.runner }}
container:
image: ${{ matrix.container-image }}
env:
PADDLECODEC_TEST_VIDEO: .github/test-assets/example_video.mp4
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
arch: ["x86_64", "arm64"]
# FFmpeg 8.0 depends on libopenvino.so.2520, PaddlePaddle CPU depends on libopenvino.so.2500
# There has some conflict causing test failures, but it works with PaddlePaddle GPU.
# We skip FFmpeg 8.0 tests for PaddlePaddle CPU builds for now.
ffmpeg-version: ["4.4.2", "5.1.2", "6.1.1", "7.0.1"]
include:
- arch: x86_64
arch-name: x86_64
runner: ubuntu-latest
container-image: pytorch/manylinux2_28-builder:cpu
artifact-prefix: paddlecodec-wheel-linux
- arch: arm64
arch-name: arm64
runner: ubuntu-24.04-arm
container-image: pytorch/manylinux2_28_aarch64-builder:cpu-aarch64
artifact-prefix: paddlecodec-wheel-linux-arm64
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Download wheel artifact
uses: actions/download-artifact@v4
with:
name: ${{ matrix.artifact-prefix }}-py${{ matrix.python-version }}
path: dist/
- name: Download cached test video artifact
uses: actions/download-artifact@v4
with:
name: paddlecodec-test-video
path: .github/test-assets/
- name: Install FFmpeg via conda
uses: conda-incubator/setup-miniconda@v3
with:
auto-update-conda: true
miniforge-version: latest
activate-environment: test
python-version: ${{ matrix.python-version }}
- name: Install FFmpeg from conda-forge
run: |
conda install "ffmpeg=${{ matrix.ffmpeg-version }}" -c conda-forge -y
ffmpeg -version
- name: Install PaddlePaddle nightly in conda env
run: |
pip install --pre paddlepaddle==3.3.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
- name: Install paddlecodec from wheel
run: |
wheel_path=$(find dist -type f -name "*.whl")
echo "Installing $wheel_path"
pip install $wheel_path -vvv
- name: Install test dependencies
run: |
pip install numpy pytest pillow
- name: Delete src folder
run: |
rm -rf src/
ls -la
- name: Run tests
run: |
pytest --override-ini="addopts=-v" -s test_paddle
publish-pypi:
runs-on: ubuntu-latest
name: Publish Paddle wheels to PyPI
if: "startsWith(github.ref, 'refs/tags/')"
needs:
- test-paddlecodec-wheel
permissions:
id-token: write
steps:
- name: Retrieve release distributions
uses: actions/download-artifact@v6
with:
pattern: paddlecodec-wheel-linux*
path: dist/
merge-multiple: true
- name: Publish release distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
publish-release:
runs-on: ubuntu-latest
name: Publish Paddle wheels to GitHub
if: "startsWith(github.ref, 'refs/tags/')"
needs:
- test-paddlecodec-wheel
permissions:
contents: write
steps:
- uses: actions/download-artifact@v6
with:
pattern: paddlecodec-wheel-linux*
path: dist/
merge-multiple: true
- name: Get tag name
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Publish to GitHub
uses: softprops/action-gh-release@v2
with:
draft: true
files: dist/*
tag_name: ${{ env.RELEASE_VERSION }}