Skip to content

[mlir-wgpu] add webgpu runtime wrappers #420

[mlir-wgpu] add webgpu runtime wrappers

[mlir-wgpu] add webgpu runtime wrappers #420

# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
# Copyright (c) 2024.
name: "Build, test, release mlir-python-bindings"
on:
workflow_dispatch:
inputs:
force_debug_with_tmate:
type: boolean
description: 'Run the build with tmate session'
required: false
default: false
debug_with_tmate:
type: boolean
description: 'Run the build with a tmate session ONLY in case of failure'
required: false
default: false
workflow_call:
inputs:
wheel_version:
description: 'wheel version'
type: string
required: false
default: ''
workflow_call:
description: 'To distinguish workflow_call from regular push'
type: boolean
required: false
default: true
workflow_caller_run_id:
description: ''
type: string
required: false
default: ''
pull_request:
branches:
- main
paths:
- ".github/workflows/build_mlir_python_bindings_wheel.yml"
- "projects/mlir-python-bindings/**"
push:
branches:
- main
paths:
- ".github/workflows/build_mlir_python_bindings_wheel.yml"
- "projects/mlir-python-bindings/**"
concurrency:
group: ${{ github.workflow }}-${{ github.event.number || github.sha }}-build_mlir_python_bindings_wheel
cancel-in-progress: true
jobs:
build-mlir-python-bindings:
strategy:
fail-fast: false
matrix:
include:
- name: "ubuntu_x86_64"
runs-on: "ubuntu-22.04"
os: "ubuntu"
host-arch: "x86_64"
target-arch: "x86_64"
- name: "ubuntu_aarch64"
runs-on: "ubuntu-22.04-arm"
os: "ubuntu"
host-arch: "aarch64"
target-arch: "aarch64"
- name: "ubuntu_wasm32"
runs-on: "ubuntu-22.04"
os: "ubuntu"
host-arch: "x86_64"
target-arch: "wasm32"
- name: "windows_amd64"
runs-on: "windows-2022"
os: "windows"
host-arch: "amd64"
target-arch: "amd64"
- name: "macos_arm64"
runs-on: "macos-14"
os: "macos"
host-arch: "arm64"
target-arch: "arm64"
runs-on: ${{ matrix.runs-on }}
name: "Build mlir-python-bindings ${{ matrix.name }}"
defaults:
run:
shell: bash
permissions:
id-token: write
contents: write
env:
# either the PR number or `branch-N` where N always increments
cache-key: mlir_python_bindings_${{ matrix.name }}_clang_${{ format('{0}-{1}', github.ref_name, github.run_number) }}
steps:
- name: "Check out repository"
uses: actions/checkout@v4.2.2
- name: "Setup base"
uses: ./.github/actions/setup_base
id: setup_base
with:
cache-key: ${{ env.cache-key }}
restore-key: "mlir_python_bindings_${{ matrix.name }}_clang"
os: ${{ matrix.os }}
host-arch: ${{ matrix.host-arch }}
target-arch: ${{ matrix.target-arch }}
- name: "Pip download MLIR from releases"
if: ${{ !inputs.workflow_call }}
run: |
if [[ "${{ matrix.target-arch }}" == "wasm32" ]]; then
pip download mlir-wheel --plat pyodide_2025_0_wasm32 --no-deps --python-version 3.13 -f https://llvm.github.io/eudsl
else
pip download mlir-wheel -f https://llvm.github.io/eudsl
fi
WHEEL_NAME=$(ls mlir_wheel*)
$python3_command -m pip install pkginfo
WHEEL_VERSION=$($python3_command -c "from pkginfo import Wheel; print(Wheel('$WHEEL_NAME').version)")
echo "WHEEL_VERSION=$WHEEL_VERSION" >> $GITHUB_ENV
- name: Pip download mlir-native-tools
if: ${{ !inputs.workflow_call }}
run: |
pip download mlir_native_tools -f https://llvm.github.io/eudsl
- name: Download LLVM distro artifacts
if: ${{ inputs.workflow_call }}
uses: dawidd6/action-download-artifact@v11
with:
name: mlir_wheel_${{ (matrix.name == 'ubuntu_x86_64' || matrix.name == 'ubuntu_aarch64') && 'manylinux' || matrix.os }}_${{ matrix.target-arch }}_artifact
path: "./"
run_id: ${{ inputs.workflow_caller_run_id }}
- name: "Set WHEEL_VERSION env var"
if: ${{ inputs.workflow_call }}
run: |
echo "WHEEL_VERSION=${{ inputs.wheel_version }}" >> $GITHUB_ENV
- name: Download mlir-native-tools artifacts
if: ${{ inputs.workflow_call }}
uses: dawidd6/action-download-artifact@v11
with:
name: mlir_native_tools_${{ matrix.os == 'ubuntu' && 'manylinux' || matrix.os }}_${{ matrix.host-arch }}_artifact
path: "./"
run_id: ${{ inputs.workflow_caller_run_id }}
- name: "Configure build"
run: |
if [[ "${{ matrix.target-arch }}" == "wasm32" ]]; then
unzip -q mlir_wheel*.whl -d llvm-install
else
unzip -q mlir_wheel*.whl
mv mlir_wheel llvm-install
fi
if [[ "${{ matrix.os }}" == "ubuntu" ]] && [[ "${{ matrix.target-arch }}" != "wasm32" ]]; then
echo "LLVM_DIR=/host/$PWD/llvm-install/lib/cmake/llvm" >> $GITHUB_ENV
echo "MLIR_DIR=/host/$PWD/llvm-install/lib/cmake/mlir" >> $GITHUB_ENV
echo "Clang_DIR=/host/$PWD/llvm-install/lib/cmake/clang" >> $GITHUB_ENV
echo "CMAKE_PREFIX_PATH=/host/$PWD/llvm-install" >> $GITHUB_ENV
else
echo "LLVM_DIR=$PWD/llvm-install/lib/cmake/llvm" >> $GITHUB_ENV
echo "MLIR_DIR=$PWD/llvm-install/lib/cmake/mlir" >> $GITHUB_ENV
echo "Clang_DIR=$PWD/llvm-install/lib/cmake/clang" >> $GITHUB_ENV
echo "CMAKE_PREFIX_PATH=$PWD/llvm-install" >> $GITHUB_ENV
fi
$python3_command -m pip install cibuildwheel
if [[ "${{ matrix.os }}" == "ubuntu" ]] && [[ "${{ matrix.host-arch }}" == "aarch64" ]]; then
sudo apt-get install libarchive-dev antlr libxml2-dev libxslt-dev libcurl4-openssl-dev
fi
if [[ "${{ matrix.os }}" == "macos" ]]; then
brew install antlr boost libarchive
fi
if [[ "${{ matrix.target-arch }}" == "wasm32" ]]; then
# currently only necessary for wasm32
unzip -o -j mlir_native_tools-*whl -d mlir_native_tools
export LLVM_NATIVE_TOOL_DIR="$PWD/mlir_native_tools"
echo "LLVM_NATIVE_TOOL_DIR=$LLVM_NATIVE_TOOL_DIR" >> $GITHUB_ENV
echo "LLVM_TABLEGEN=$LLVM_NATIVE_TOOL_DIR/llvm-tblgen" >> $GITHUB_ENV
echo "MLIR_TABLEGEN=$LLVM_NATIVE_TOOL_DIR/mlir-tblgen" >> $GITHUB_ENV
echo "MLIR_LINALG_ODS_YAML_GEN=$LLVM_NATIVE_TOOL_DIR/mlir-linalg-ods-yaml-gen" >> $GITHUB_ENV
source "$EMSDK/emsdk_env.sh"
echo "PATH=$EMSDK/ccache/git-emscripten_64bit/bin:$PATH" >> $GITHUB_ENV
export CCACHE_COMPILERCHECK="string:$($EMSDK/upstream/bin/clang --version | head -n 1)"
echo "CCACHE_COMPILERCHECK=$CCACHE_COMPILERCHECK" >> $GITHUB_ENV
export CCACHE="$EMSDK/ccache/git-emscripten_64bit/bin/ccache"
echo "CMAKE_C_COMPILER_LAUNCHER=$CCACHE" >> $GITHUB_ENV
echo "CMAKE_CXX_COMPILER_LAUNCHER=$CCACHE" >> $GITHUB_ENV
fi
- name: "Build mlir-python-bindings"
run: |
if [[ "${{ matrix.target-arch }}" == "wasm32" ]]; then
PYODIDE_BUILD_EXPORTS=whole_archive pyodide build "$PWD/projects/mlir-python-bindings-wasm" -o wheelhouse --compression-level 10
else
$python3_command -m cibuildwheel "$PWD/projects/mlir-python-bindings" --output-dir wheelhouse
fi
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: mlir_python_bindings_${{ matrix.name }}_artifact
path: wheelhouse/*.whl
if-no-files-found: error
- name: "Setup tmate session"
if: (failure() && inputs.debug_with_tmate) || inputs.force_debug_with_tmate
uses: mxschmitt/action-tmate@v3.18
with:
limit-access-to-actor: true
install-dependencies: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'windows') || startsWith(matrix.os, 'ubuntu') }}
test-mlir-python-bindings:
if: github.event_name == 'pull_request'
needs: [build-mlir-python-bindings]
strategy:
fail-fast: false
matrix:
runs-on: [
"ubuntu-22.04",
"ubuntu-22.04-arm",
"macos-14",
"windows-2022"
]
python-version: [
"3.10", "3.11", "3.12",
"3.13", "3.14", "3.14t"
]
include: [
{runs-on: "ubuntu-22.04", name: "ubuntu_x86_64", os: "ubuntu"},
{runs-on: "ubuntu-22.04-arm", name: "ubuntu_aarch64", os: "ubuntu"},
{runs-on: "windows-2022", name: "windows_amd64", os: "windows"},
{runs-on: "macos-14", name: "macos_arm64", os: "macos"},
]
exclude:
# <frozen importlib._bootstrap>:491: Warning: Numpy built with MINGW-W64 on Windows 64 bits is experimental, and only available for testing. You are advised not to use it for production.
- runs-on: windows-2022
python-version: "3.14"
- runs-on: windows-2022
python-version: "3.14t"
- runs-on: macos-14
python-version: "3.10"
- runs-on: macos-14
python-version: "3.11"
- runs-on: macos-14
python-version: "3.12"
- runs-on: macos-14
python-version: "3.13"
- runs-on: macos-14
python-version: "3.14"
runs-on: ${{ matrix.runs-on }}
name: "Test mlir-python-bindings ${{ matrix.name }} ${{ matrix.python-version }}"
defaults:
run:
shell: bash
steps:
- name: "Check out repository"
uses: actions/checkout@v4.2.2
with:
submodules: false
- name: "Get submodules"
run: git submodule update --init --depth=1
- name: "Install Python"
uses: actions/setup-python@v6.0.0
with:
python-version: "${{ matrix.python-version }}"
- uses: actions/download-artifact@v4
with:
name: mlir_python_bindings_${{ matrix.name }}_artifact
path: wheelhouse
- name: "Test mlir-python-bindings"
run: |
pip install mlir-python-bindings numpy -v -f wheelhouse
cd third_party/llvm-project/mlir/test/python/dialects
for f in *.py; do
if [[ "$f" == "python_test.py" ]]; then
continue
fi
python $f
done
test-mlir-python-bindings-wasm:
if: github.event_name == 'pull_request'
needs: [build-mlir-python-bindings]
runs-on: ubuntu-22.04
name: "Test mlir-python-bindings wasm"
defaults:
run:
shell: bash
steps:
- name: "Check out repository"
uses: actions/checkout@v4.2.2
with:
submodules: true
- uses: actions/download-artifact@v4
with:
name: mlir_python_bindings_ubuntu_wasm32_artifact
path: wheelhouse
- name: "Install Python"
uses: actions/setup-python@v4
with:
python-version: '3.12'
- name: Install pyodide and test
shell: bash
run: |
pip install pyodide-build>=0.28.0
pyodide venv venv
. venv/bin/activate
pip install mlir-python-bindings -f wheelhouse
pushd third_party/llvm-project/mlir/test/python/dialects
for f in *.py; do
if [[ "$f" == "python_test.py" ]]; then
continue
fi
python $f
done
popd
python projects/mlir-python-bindings-wasm/test_wasm_execution_engine.py
release-mlir-python-bindings:
if: (github.event_name == 'push' && github.ref_name == 'main') || github.event_name == 'workflow_dispatch'
needs: [build-mlir-python-bindings]
runs-on: "ubuntu-22.04"
permissions:
id-token: write
contents: write
strategy:
fail-fast: false
matrix:
name: [
"ubuntu_x86_64",
"ubuntu_aarch64",
"ubuntu_wasm32",
"macos_arm64",
"windows_amd64"
]
name: "Release mlir-python-bindings ${{ matrix.name }}"
steps:
- uses: actions/download-artifact@v4
with:
name: mlir_python_bindings_${{ matrix.name }}_artifact
path: wheelhouse
- name: Release current commit
uses: ncipollo/release-action@v1.12.0
with:
artifacts: "wheelhouse/mlir_python_bindings*.whl"
token: "${{ secrets.GITHUB_TOKEN }}"
tag: mlir-python-bindings
name: mlir-python-bindings
removeArtifacts: false
allowUpdates: true
replacesArtifacts: true
makeLatest: true
omitBody: true
call-build-eudsl-python-extras:
needs: [build-mlir-python-bindings]
permissions:
contents: write
id-token: write
pages: write
uses: ./.github/workflows/build_test_release_eudsl_python_extras.yml
secrets: inherit # pass all secrets
with:
workflow_call: true
workflow_caller_run_id: ${{ github.run_id }}
call-deploy-pip-page:
if: (github.event_name == 'push' && github.ref_name == 'main') || github.event_name == 'workflow_dispatch'
needs: [release-mlir-python-bindings]
permissions:
contents: read
id-token: write
pages: write
uses: ./.github/workflows/deploy_pip_page.yml
secrets: inherit # pass all secrets