Reorganize wheels #223
Workflow file for this run
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: MLIR AIE Distro | ||
on: | ||
pull_request: | ||
paths: | ||
- '.github/workflows/mlirAIEDistro.yml' | ||
workflow_dispatch: | ||
inputs: | ||
DEBUG_ENABLED: | ||
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' | ||
type: boolean | ||
required: false | ||
default: false | ||
DEBUG_OS: | ||
description: 'which runner os to run the tmate action in (if the tmate action is run)' | ||
type: string | ||
default: 'windows-2019' | ||
required: false | ||
DEBUG_ARCH: | ||
description: 'which runner arch to run the tmate action in (if the tmate action is run)' | ||
type: string | ||
default: 'x86_64' | ||
required: false | ||
DEBUG_DETACHED: | ||
description: 'whether to launch tmate in detached mode (if the tmate action is run)' | ||
type: boolean | ||
required: false | ||
default: true | ||
AIE_COMMIT: | ||
description: 'AIE commit to build' | ||
type: string | ||
required: false | ||
default: '' | ||
jobs: | ||
get_aie_project_commit: | ||
name: Get canonical AIE Project commit | ||
runs-on: ubuntu-latest | ||
outputs: | ||
AIE_PROJECT_COMMIT: ${{ steps.get_aie_project_commit.outputs.AIE_PROJECT_COMMIT }} | ||
DATETIME: ${{ steps.get_aie_project_commit.outputs.DATETIME }} | ||
steps: | ||
- name: Get AIE-project commit | ||
id: get_aie_project_commit | ||
shell: bash | ||
run: | | ||
if [ x"${{ inputs.AIE_COMMIT }}" == x"" ]; then | ||
sudo apt install jq | ||
AIE_PROJECT_COMMIT=$(curl -s https://api.github.com/repos/Xilinx/mlir-aie/commits/${{ github.head_ref || github.ref_name }} | jq -r '.sha[:8]') | ||
else | ||
AIE_PROJECT_COMMIT="${{ inputs.AIE_COMMIT }}" | ||
fi | ||
echo "AIE_PROJECT_COMMIT=${AIE_PROJECT_COMMIT}" | tee -a $GITHUB_OUTPUT | ||
DATETIME=$(date +"%Y%m%d%H") | ||
echo "DATETIME=${DATETIME}" | tee -a $GITHUB_OUTPUT | ||
get_required_llvm_wheel_version: | ||
name: Idenitfy which version of LLVM is required to build MLIR-AIE at the given commit | ||
needs: get_aie_project_commit | ||
runs-on: ubuntu-latest | ||
outputs: | ||
REQUIRED_LLVM_WHEEL_VERSION: ${{ steps.get_required_llvm_wheel_version.outputs.LLVM_VERSION }} | ||
steps: | ||
- name: Run `./utils/clone-llvm.sh --get-wheel-version` | ||
id: get_required_llvm_wheel_version: | ||
shell: bash | ||
run: | | ||
git clone --recursive https://github.com/${{ github.repository }}.git | ||
pushd mlir-aie | ||
git reset --hard ${{ needs.get_aie_project_commit.outputs.AIE_PROJECT_COMMIT }} | ||
LLVM_VERSION=$(./utils/clone-llvm.sh --get-wheel-version) | ||
if [[ ! $LLVM_VERSION ]]; then | ||
echo "::error::Unable to determine required LLVM version at commit " ${{ needs.get_aie_project_commit.outputs.AIE_PROJECT_COMMIT }} | ||
fi | ||
echo "LLVM_VERSION=${LLVM_VERSION}" >> $GITHUB_OUTPUT | ||
popd | ||
build_distro_wheels: | ||
needs: | ||
- get_aie_project_commit | ||
- get_required_llvm_wheel_version | ||
name: ${{ matrix.OS }} ${{ matrix.ARCH }} rtti=${{ matrix.ENABLE_RTTI }} | ||
continue-on-error: true | ||
runs-on: ${{ matrix.OS }} | ||
outputs: | ||
MLIR_AIE_WHEEL_VERSION: ${{ steps.get_wheel_version.outputs.MLIR_AIE_WHEEL_VERSION }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
include: | ||
- OS: ubuntu-20.04 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: ON | ||
- OS: windows-2019 | ||
ARCH: AMD64 | ||
ENABLE_RTTI: ON | ||
- OS: macos-12 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: ON | ||
- OS: macos-14 | ||
ARCH: arm64 | ||
ENABLE_RTTI: ON | ||
# disabled because openssl dep isn't being compiled from source | ||
# (and hence system openssl can't be linked against during cross-compile) | ||
# - OS: ubuntu-20.04 | ||
# ARCH: aarch64 | ||
# ENABLE_RTTI: ON | ||
- OS: ubuntu-20.04 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: OFF | ||
- OS: windows-2019 | ||
ARCH: AMD64 | ||
ENABLE_RTTI: OFF | ||
- OS: macos-12 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: OFF | ||
- OS: macos-14 | ||
ARCH: arm64 | ||
ENABLE_RTTI: OFF | ||
# disabled because openssl dep isn't being compiled from source | ||
# (and hence system openssl can't be linked against during cross-compile) | ||
# - OS: ubuntu-20.04 | ||
# ARCH: aarch64 | ||
# ENABLE_RTTI: OFF | ||
steps: | ||
- name: set ENV | ||
shell: bash | ||
run: | | ||
PIP_FIND_LINKS_URL="https://github.com/Xilinx/mlir-aie/releases/expanded_assets/mlir-distro" | ||
if [ x"${{ github.event_name }}" == x"pull_request" ]; then | ||
PIP_FIND_LINKS_URL="$PIP_FIND_LINKS_URL https://github.com/Xilinx/mlir-aie/releases/expanded_assets/dev-wheels" | ||
fi | ||
echo "PIP_FIND_LINKS=$PIP_FIND_LINKS_URL" | tee -a $GITHUB_ENV | ||
echo "ENABLE_RTTI=${{ matrix.ENABLE_RTTI }}" | tee -a $GITHUB_ENV | ||
- name: set ENV macos | ||
if: contains(matrix.OS, 'macos') | ||
shell: bash | ||
run: | | ||
echo "OSX_VERSION=$(sw_vers -productVersion)" | tee -a $GITHUB_ENV | ||
- name: Checkout actions | ||
uses: actions/checkout@v3 | ||
with: | ||
# checkout just the actions in order to pick and choose | ||
# where the actual repo is checked out manually (see actions/setup_base) | ||
sparse-checkout: .github/actions | ||
- uses: ./.github/actions/setup_base | ||
id: setup_base | ||
with: | ||
# optional | ||
DEBUG_ENABLED: ${{ inputs.DEBUG_ENABLED }} | ||
DEBUG_OS: ${{ inputs.DEBUG_OS }} | ||
DEBUG_ARCH: ${{ inputs.DEBUG_ARCH }} | ||
DEBUG_DETACHED: ${{ inputs.DEBUG_DETACHED }} | ||
# required | ||
MATRIX_OS: ${{ matrix.OS }} | ||
MATRIX_ARCH: ${{ matrix.ARCH }} | ||
- uses: ./.github/actions/setup_ccache | ||
id: setup_ccache | ||
with: | ||
MATRIX_OS: ${{ matrix.OS }} | ||
MATRIX_ARCH: ${{ matrix.ARCH }} | ||
EXTRA_KEY: mlir-aie-distro-rtti-${{ matrix.ENABLE_RTTI }} | ||
- name: Shift workspace root | ||
id: workspace_root | ||
shell: bash | ||
working-directory: ${{ env.TEMP }} | ||
run: | | ||
ls "${{ steps.setup_base.outputs.WORKSPACE_ROOT }}" | ||
if [ x"${{ matrix.OS }}" == x"windows-2019" ]; then | ||
WORKSPACE_ROOT="${{ steps.setup_base.outputs.WORKSPACE_ROOT }}\utils\packaging\mlir_aie_wheels" | ||
else | ||
WORKSPACE_ROOT="${{ steps.setup_base.outputs.WORKSPACE_ROOT }}/utils/packaging/mlir_aie_wheels" | ||
fi | ||
echo "WORKSPACE_ROOT=$WORKSPACE_ROOT" | tee -a $GITHUB_OUTPUT | ||
- name: Get AIE | ||
id: get_aie | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
shell: bash | ||
run: | | ||
git clone --recursive https://github.com/${{ github.repository }}.git | ||
pushd mlir-aie | ||
git reset --hard ${{ needs.get_aie_project_commit.outputs.AIE_PROJECT_COMMIT }} | ||
git submodule update | ||
popd | ||
# build | ||
- name: build distro wheels | ||
if: ${{ matrix.OS != 'ubuntu-20.04' || matrix.ARCH != 'aarch64' }} | ||
shell: bash | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
run: | | ||
export PIP_NO_BUILD_ISOLATION=false | ||
CIBW_ARCHS=${{ matrix.ARCH }} \ | ||
CMAKE_GENERATOR=Ninja \ | ||
DATETIME=${{ needs.get_aie_project_commit.outputs.DATETIME }} \ | ||
HOST_CCACHE_DIR=${{ steps.setup_ccache.outputs.HOST_CCACHE_DIR }} \ | ||
AIE_PROJECT_COMMIT=${{ needs.get_aie_project_commit.outputs.AIE_PROJECT_COMMIT }} \ | ||
REQUIRED_LLVM_WHEEL_VERSION=${{ needs.get_required_llvm_wheel_version.outputs.REQUIRED_LLVM_WHEEL_VERSION }} \ | ||
MATRIX_OS=${{ matrix.OS }} \ | ||
PARALLEL_LEVEL=2 \ | ||
cibuildwheel --output-dir wheelhouse | ||
- name: build aarch ubuntu wheel | ||
if: ${{ matrix.OS == 'ubuntu-20.04' && matrix.ARCH == 'aarch64' }} | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
shell: bash | ||
run: | | ||
# https://askubuntu.com/a/729214 | ||
pushd /usr/include/openssl | ||
sudo ln -s /usr/include/x86_64-linux-gnu/openssl/opensslconf.h opensslconf.h | ||
popd | ||
export PIP_NO_BUILD_ISOLATION=false | ||
pip install -r requirements.txt | ||
pip install importlib-metadata | ||
CIBW_ARCHS=${{ matrix.ARCH }} MATRIX_OS=${{ matrix.OS }} ./scripts/download_mlir.sh | ||
CIBW_ARCHS=${{ matrix.ARCH }} \ | ||
CMAKE_GENERATOR=Ninja \ | ||
DATETIME=${{ needs.get_aie_project_commit.outputs.DATETIME }} \ | ||
AIE_PROJECT_COMMIT=${{ needs.get_aie_project_commit.outputs.AIE_PROJECT_COMMIT }} \ | ||
REQUIRED_LLVM_WHEEL_VERSION=${{ needs.get_required_llvm_wheel_version.outputs.REQUIRED_LLVM_WHEEL_VERSION }} \ | ||
MATRIX_OS=${{ matrix.OS }} \ | ||
PARALLEL_LEVEL=2 \ | ||
pip wheel . -v -w wheelhouse | ||
- name: Clean | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
shell: bash | ||
run: | | ||
rm -rf mlir-aie | ||
rm -rf build | ||
- name: Docker prune | ||
if: contains(inputs.MATRIX_OS, 'ubuntu') | ||
shell: bash | ||
run: | | ||
docker system prune -a -f | ||
- name: Get wheel version | ||
id: get_wheel_version | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
shell: bash | ||
run: | | ||
pip install pkginfo | ||
WHL=$(ls wheelhouse/mlir_aie*whl) | ||
echo "MLIR_AIE_WHEEL_VERSION=$(python -c "import pkginfo; w = pkginfo.Wheel('$WHL'); print(w.version.split('+')[0] + '+' + w.version.split('+')[1].rsplit('.', 1)[-1])")" | tee -a $GITHUB_OUTPUT | ||
- name: Download cache from container ubuntu | ||
if: (matrix.OS == 'ubuntu-20.04' && matrix.ARCH == 'x86_64') && (success() || failure()) | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
shell: bash | ||
run: | | ||
ccache -s | ||
HOST_CCACHE_DIR="$(ccache --get-config cache_dir)" | ||
rm -rf $HOST_CCACHE_DIR | ||
mv ./wheelhouse/.ccache $HOST_CCACHE_DIR | ||
ls -la $HOST_CCACHE_DIR | ||
ccache -s | ||
# For whatever reason, the timestamps on all of the files that come out of the docker container | ||
# are some amount ahead in time (maybe 12 hours?). that means if you try to rebuild at any point | ||
# within that window ccache will not hit because the timestamps of the cached objects are ahead of | ||
# your build time. I'm not 100% sure about this explanation/mechanism but this fixed ccache misses for me. | ||
- name: Reset datetime ccache | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
shell: bash | ||
run: | | ||
ccache --print-stats | ||
HOST_CCACHE_DIR="$(ccache --get-config cache_dir)" | ||
# Set the timestamp to the beginning of the current hour. | ||
find $HOST_CCACHE_DIR -exec touch -a -m -t 201108231405.14 {} \; | ||
# The important parts of the wheels (all the LLVM/MLIR archives) have nothing to do with the | ||
# python version. With py3-none you can pip install them in any python venv. Unfortunately though this does | ||
# mean that the python bindings themselves will confusingly not work in other envs (!=3.10) | ||
- name: rename non-windows | ||
if: ${{ matrix.OS == 'ubuntu-20.04' || matrix.OS == 'macos-12' || matrix.OS == 'macos-14' }} | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
shell: bash | ||
run: | | ||
rename 's/cp310-cp310/py3-none/' wheelhouse/mlir_aie*whl | ||
if [ x"${{ matrix.OS }}" == x"ubuntu-20.04" ] && [ x"${{ matrix.ARCH }}" == x"aarch64" ]; then | ||
rename 's/x86_64/aarch64/' wheelhouse/mlir_aie*whl | ||
fi | ||
- name: rename windows | ||
if: ${{ matrix.OS == 'windows-2019' }} | ||
working-directory: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }} | ||
run: | | ||
ls wheelhouse/mlir_aie*whl | Rename-Item -NewName {$_ -replace 'cp310-cp310', 'py3-none' } | ||
- name: Upload distro wheels | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
path: ${{ steps.workspace_root.outputs.WORKSPACE_ROOT }}/wheelhouse/*.whl | ||
name: build_artifact_${{ matrix.OS }}_${{ matrix.ARCH }}_rtti_${{ matrix.ENABLE_RTTI }} | ||
smoke_test_wheels: | ||
name: test ${{ matrix.OS }} ${{ matrix.ARCH }} rtti=${{ matrix.ENABLE_RTTI }} | ||
needs: build_distro_wheels | ||
runs-on: ${{ matrix.OS }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
include: | ||
- OS: ubuntu-20.04 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: ON | ||
- OS: windows-2019 | ||
ARCH: AMD64 | ||
ENABLE_RTTI: ON | ||
- OS: macos-12 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: ON | ||
- OS: ubuntu-20.04 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: OFF | ||
- OS: windows-2019 | ||
ARCH: AMD64 | ||
ENABLE_RTTI: OFF | ||
- OS: macos-12 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: OFF | ||
steps: | ||
- name: Checkout reqs | ||
uses: actions/checkout@v3 | ||
with: | ||
sparse-checkout: python/requirements.txt | ||
- uses: actions/download-artifact@v3 | ||
with: | ||
name: build_artifact_${{ matrix.OS }}_${{ matrix.ARCH }}_rtti_${{ matrix.ENABLE_RTTI }} | ||
path: dist | ||
- uses: actions/setup-python@v4 | ||
with: | ||
python-version: '3.10' | ||
- name: test | ||
shell: bash | ||
run: | | ||
pip install -r python/requirements.txt | ||
unzip -o -q dist/mlir_aie\*.whl | ||
if [ x"${{ matrix.ENABLE_RTTI }}" == x"ON" ]; then | ||
export PYTHONPATH=mlir_aie/python | ||
else | ||
export PYTHONPATH=mlir_aie_no_rtti/python | ||
fi | ||
python -c 'import aie.ir' | ||
upload_wheels: | ||
needs: smoke_test_wheels | ||
runs-on: ubuntu-latest | ||
permissions: | ||
id-token: write | ||
contents: write | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
include: | ||
- OS: ubuntu-20.04 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: ON | ||
# - OS: ubuntu-20.04 | ||
# ARCH: aarch64 | ||
# ENABLE_RTTI: ON | ||
- OS: windows-2019 | ||
ARCH: AMD64 | ||
ENABLE_RTTI: ON | ||
- OS: macos-12 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: ON | ||
- OS: macos-14 | ||
ARCH: arm64 | ||
ENABLE_RTTI: ON | ||
- OS: ubuntu-20.04 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: OFF | ||
# - OS: ubuntu-20.04 | ||
# ARCH: aarch64 | ||
# ENABLE_RTTI: OFF | ||
- OS: windows-2019 | ||
ARCH: AMD64 | ||
ENABLE_RTTI: OFF | ||
- OS: macos-12 | ||
ARCH: x86_64 | ||
ENABLE_RTTI: OFF | ||
- OS: macos-14 | ||
ARCH: arm64 | ||
ENABLE_RTTI: OFF | ||
steps: | ||
- uses: actions/download-artifact@v3 | ||
with: | ||
# unpacks default artifact into dist/ | ||
# if `name: artifact` is omitted, the action will create extra parent dir | ||
name: build_artifact_${{ matrix.OS }}_${{ matrix.ARCH }}_rtti_${{ matrix.ENABLE_RTTI }} | ||
path: dist | ||
- name: Release current commit | ||
uses: ncipollo/release-action@v1.12.0 | ||
with: | ||
artifacts: "dist/*.whl,dist/*.tar.xz" | ||
token: "${{ secrets.GITHUB_TOKEN }}" | ||
tag: ${{ github.event_name == 'workflow_dispatch' && 'latest-wheels' || 'dev-wheels' }} | ||
name: ${{ github.event_name == 'workflow_dispatch' && 'latest-wheels' || 'dev-wheels' }} | ||
removeArtifacts: false | ||
allowUpdates: true | ||
replacesArtifacts: true | ||
makeLatest: true |