name: CI (webgpu) on: workflow_dispatch: # allows manual triggering push: branches: - master paths: [ '.github/workflows/build-webgpu.yml', '**/CMakeLists.txt', '**/.cmake', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.wgsl' ] pull_request: types: [opened, synchronize, reopened] paths: [ '.github/workflows/build-webgpu.yml', 'ggml/src/ggml-webgpu/**' ] concurrency: group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }} cancel-in-progress: true env: GGML_NLOOP: 3 GGML_N_THREADS: 1 LLAMA_ARG_LOG_COLORS: 1 LLAMA_ARG_LOG_PREFIX: 1 LLAMA_ARG_LOG_TIMESTAMPS: 1 jobs: macos: runs-on: macos-latest steps: - name: Clone id: checkout uses: actions/checkout@v6 - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: webgpu-macos-latest evict-old-files: 1d save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - name: Dawn Dependency id: dawn-depends run: | DAWN_VERSION="v20260317.182325" DAWN_OWNER="google" DAWN_REPO="dawn" DAWN_ASSET_NAME="Dawn-18eb229ef5f707c1464cc581252e7603c73a3ef0-macos-latest-Release" echo "Fetching release asset from https://github.com/google/dawn/releases/download/${DAWN_VERSION}/${DAWN_ASSET_NAME}.tar.gz" curl -L -o artifact.tar.gz \ "https://github.com/google/dawn/releases/download/${DAWN_VERSION}/${DAWN_ASSET_NAME}.tar.gz" mkdir dawn tar -xvf artifact.tar.gz -C dawn --strip-components=1 - name: Build id: cmake_build run: | export CMAKE_PREFIX_PATH=dawn cmake -B build -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DGGML_WEBGPU=ON -DGGML_METAL=OFF -DGGML_BLAS=OFF time cmake --build build --config Release -j $(sysctl -n hw.logicalcpu) - name: Test id: cmake_test run: | cd build ctest -L main --verbose --timeout 900 ubuntu: runs-on: ubuntu-24.04 steps: - name: Clone id: checkout uses: actions/checkout@v6 - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: webgpu-ubuntu-24.04 evict-old-files: 1d save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - name: Dependencies id: depends run: | sudo add-apt-repository -y ppa:kisak/kisak-mesa sudo apt-get update -y sudo apt-get install -y build-essential mesa-vulkan-drivers \ libxcb-xinput0 libxcb-xinerama0 libxcb-cursor-dev libssl-dev - name: Dawn Dependency id: dawn-depends run: | sudo apt-get install -y libxrandr-dev libxinerama-dev libxcursor-dev mesa-common-dev libx11-xcb-dev libxi-dev DAWN_VERSION="v20260317.182325" DAWN_OWNER="google" DAWN_REPO="dawn" DAWN_ASSET_NAME="Dawn-18eb229ef5f707c1464cc581252e7603c73a3ef0-ubuntu-latest-Release" echo "Fetching release asset from https://github.com/google/dawn/releases/download/${DAWN_VERSION}/${DAWN_ASSET_NAME}.tar.gz" curl -L -o artifact.tar.gz \ "https://github.com/google/dawn/releases/download/${DAWN_VERSION}/${DAWN_ASSET_NAME}.tar.gz" mkdir dawn tar -xvf artifact.tar.gz -C dawn --strip-components=1 - name: Build id: cmake_build run: | export Dawn_DIR=dawn/lib64/cmake/Dawn cmake -B build \ -DGGML_WEBGPU=ON time cmake --build build --config Release -j $(nproc) - name: Test id: cmake_test run: | cd build # This is using llvmpipe and runs slower than other backends # test-backend-ops is too slow on llvmpipe, skip it ctest -L main -E test-backend-ops --verbose --timeout 900 ubuntu-wasm: strategy: matrix: include: - build: 'x64' os: ubuntu-24.04 - build: 'arm64' os: ubuntu-24.04-arm runs-on: ${{ matrix.os }} steps: - name: Clone id: checkout uses: actions/checkout@v6 - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: webgpu-${{ matrix.os }}-wasm evict-old-files: 1d save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - name: Install Emscripten run: | git clone https://github.com/emscripten-core/emsdk.git cd emsdk ./emsdk install latest ./emsdk activate latest - name: Fetch emdawnwebgpu run: | DAWN_TAG="v20260317.182325" EMDAWN_PKG="emdawnwebgpu_pkg-${DAWN_TAG}.zip" echo "Downloading ${EMDAWN_PKG}" curl -L -o emdawn.zip \ "https://github.com/google/dawn/releases/download/${DAWN_TAG}/${EMDAWN_PKG}" unzip emdawn.zip - name: Build WASM WebGPU run: | source emsdk/emsdk_env.sh emcmake cmake -B build-wasm \ -G "Ninja" \ -DCMAKE_BUILD_TYPE=Release \ -DGGML_WEBGPU=ON \ -DLLAMA_OPENSSL=OFF \ -DEMDAWNWEBGPU_DIR=emdawnwebgpu_pkg time cmake --build build-wasm --config Release --target test-backend-ops -j $(nproc)