From cf82d32bde46861937426bf6585da2d7379baf76 Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Mon, 30 Mar 2026 13:52:57 -0700 Subject: [PATCH 1/6] Only run webgpu CI on my fork --- .github/workflows/build.yml | 2046 +++++++++++++++++------------------ 1 file changed, 1023 insertions(+), 1023 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3adf2a14af9c..a2457d554da1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -96,41 +96,41 @@ jobs: cd build ctest -L main -E "test-llama-archs" --verbose --timeout 900 - macOS-latest-x64: - runs-on: macos-15-intel - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: macOS-latest-x64 - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build - id: cmake_build - run: | - sysctl -a - # Metal is disabled due to intermittent failures with Github runners not having a GPU: - # https://github.com/ggml-org/llama.cpp/actions/runs/8635935781/job/23674807267#step:5:2313 - cmake -B build \ - -DCMAKE_BUILD_RPATH="@loader_path" \ - -DLLAMA_FATAL_WARNINGS=ON \ - -DLLAMA_BUILD_BORINGSSL=ON \ - -DGGML_METAL=OFF \ - -DGGML_RPC=ON \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 - 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 + # macOS-latest-x64: + # runs-on: macos-15-intel + + # steps: + # - name: Clone + # id: checkout + # uses: actions/checkout@v6 + + # - name: ccache + # uses: ggml-org/ccache-action@v1.2.21 + # with: + # key: macOS-latest-x64 + # evict-old-files: 1d + # save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + + # - name: Build + # id: cmake_build + # run: | + # sysctl -a + # # Metal is disabled due to intermittent failures with Github runners not having a GPU: + # # https://github.com/ggml-org/llama.cpp/actions/runs/8635935781/job/23674807267#step:5:2313 + # cmake -B build \ + # -DCMAKE_BUILD_RPATH="@loader_path" \ + # -DLLAMA_FATAL_WARNINGS=ON \ + # -DLLAMA_BUILD_BORINGSSL=ON \ + # -DGGML_METAL=OFF \ + # -DGGML_RPC=ON \ + # -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 + # 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 macOS-latest-arm64-webgpu: runs-on: macos-latest @@ -174,150 +174,150 @@ jobs: cd build ctest -L main --verbose --timeout 900 - ubuntu-cpu: - strategy: - matrix: - include: - - build: 'x64' - os: ubuntu-22.04 - - build: 'arm64' - os: ubuntu-22.04-arm - - build: 's390x' - os: ubuntu-24.04-s390x - - build: 'ppc64le' - os: ubuntu-24.04-ppc64le - - runs-on: ${{ matrix.os }} - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - if: ${{ matrix.build != 's390x' && matrix.build != 'ppc64le' }} - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ubuntu-cpu-${{ matrix.build }} - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build Dependencies - id: build_depends - run: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends \ - python3 python3-pip python3-dev \ - libjpeg-dev build-essential libssl-dev \ - git-lfs - - - name: Python Dependencies - id: python_depends - run: | - python3 -m pip install --upgrade pip - pip3 install ./gguf-py - - - name: Swap Endianness - id: endianness - if: ${{ matrix.build == 's390x' }} - run: | - for f in models/*.gguf; do - echo YES | python3 gguf-py/gguf/scripts/gguf_convert_endian.py $f big - done - - - name: Build - id: cmake_build - run: | - cmake -B build \ - -DLLAMA_FATAL_WARNINGS=ON \ - -DGGML_RPC=ON - time cmake --build build --config Release -j $(nproc) - - - name: Test - id: cmake_test - run: | - cd build - ctest -L main --verbose --timeout 900 - - - name: Test llama2c conversion - id: llama2c_test - if: ${{ matrix.build != 's390x' }} - run: | - cd build - echo "Fetch tokenizer" - wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/tok512.bin - echo "Fetch llama2c model" - wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/stories260K.bin - ./bin/llama-convert-llama2c-to-ggml --copy-vocab-from-model ./tok512.bin --llama2c-model stories260K.bin --llama2c-output-model stories260K.gguf - ./bin/llama-completion -m stories260K.gguf -p "One day, Lily met a Shoggoth" -n 500 -c 256 - - - name: Test llama2c (s390x) - id: llama2c_test_s390x - if: ${{ matrix.build == 's390x' }} - run: | - cd build - echo "Fetch llama2c big-endian model" - wget https://huggingface.co/ggml-org/models/resolve/main/tinyllamas/stories260K-be.gguf - ./bin/llama-completion -m stories260K-be.gguf -p "One day, Lily met a Shoggoth" -n 500 -c 256 - - ubuntu-latest-rpc: - runs-on: ubuntu-latest - - continue-on-error: true - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install build-essential libssl-dev ninja-build - - - name: Build - id: cmake_build - run: | - cmake -B build \ - -G "Ninja" \ - -DCMAKE_BUILD_TYPE=Release \ - -DGGML_RPC=ON - time cmake --build build --config Release -j $(nproc) - - - name: Test - id: cmake_test - run: | - cd build - ctest -L main --verbose - - ubuntu-24-vulkan: - runs-on: ${{ 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Dependencies - id: depends - run: | - sudo apt-get install -y glslc libvulkan-dev libssl-dev ninja-build - - - name: Configure - id: cmake_configure - run: | - cmake -B build \ - -G "Ninja" \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DGGML_BACKEND_DL=ON \ - -DGGML_CPU_ALL_VARIANTS=ON \ - -DGGML_VULKAN=ON - - - name: Build - id: cmake_build - run: | - time cmake --build build -j $(nproc) + # ubuntu-cpu: + # strategy: + # matrix: + # include: + # - build: 'x64' + # os: ubuntu-22.04 + # - build: 'arm64' + # os: ubuntu-22.04-arm + # - build: 's390x' + # os: ubuntu-24.04-s390x + # - build: 'ppc64le' + # os: ubuntu-24.04-ppc64le + + # runs-on: ${{ matrix.os }} + + # steps: + # - name: Clone + # id: checkout + # uses: actions/checkout@v6 + + # - name: ccache + # if: ${{ matrix.build != 's390x' && matrix.build != 'ppc64le' }} + # uses: ggml-org/ccache-action@v1.2.21 + # with: + # key: ubuntu-cpu-${{ matrix.build }} + # evict-old-files: 1d + # save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + + # - name: Build Dependencies + # id: build_depends + # run: | + # sudo apt-get update + # sudo apt-get install -y --no-install-recommends \ + # python3 python3-pip python3-dev \ + # libjpeg-dev build-essential libssl-dev \ + # git-lfs + + # - name: Python Dependencies + # id: python_depends + # run: | + # python3 -m pip install --upgrade pip + # pip3 install ./gguf-py + + # - name: Swap Endianness + # id: endianness + # if: ${{ matrix.build == 's390x' }} + # run: | + # for f in models/*.gguf; do + # echo YES | python3 gguf-py/gguf/scripts/gguf_convert_endian.py $f big + # done + + # - name: Build + # id: cmake_build + # run: | + # cmake -B build \ + # -DLLAMA_FATAL_WARNINGS=ON \ + # -DGGML_RPC=ON + # time cmake --build build --config Release -j $(nproc) + + # - name: Test + # id: cmake_test + # run: | + # cd build + # ctest -L main --verbose --timeout 900 + + # - name: Test llama2c conversion + # id: llama2c_test + # if: ${{ matrix.build != 's390x' }} + # run: | + # cd build + # echo "Fetch tokenizer" + # wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/tok512.bin + # echo "Fetch llama2c model" + # wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/stories260K.bin + # ./bin/llama-convert-llama2c-to-ggml --copy-vocab-from-model ./tok512.bin --llama2c-model stories260K.bin --llama2c-output-model stories260K.gguf + # ./bin/llama-completion -m stories260K.gguf -p "One day, Lily met a Shoggoth" -n 500 -c 256 + + # - name: Test llama2c (s390x) + # id: llama2c_test_s390x + # if: ${{ matrix.build == 's390x' }} + # run: | + # cd build + # echo "Fetch llama2c big-endian model" + # wget https://huggingface.co/ggml-org/models/resolve/main/tinyllamas/stories260K-be.gguf + # ./bin/llama-completion -m stories260K-be.gguf -p "One day, Lily met a Shoggoth" -n 500 -c 256 + + # ubuntu-latest-rpc: + # runs-on: ubuntu-latest + + # continue-on-error: true + + # steps: + # - name: Clone + # id: checkout + # uses: actions/checkout@v6 + + # - name: Dependencies + # id: depends + # run: | + # sudo apt-get update + # sudo apt-get install build-essential libssl-dev ninja-build + + # - name: Build + # id: cmake_build + # run: | + # cmake -B build \ + # -G "Ninja" \ + # -DCMAKE_BUILD_TYPE=Release \ + # -DGGML_RPC=ON + # time cmake --build build --config Release -j $(nproc) + + # - name: Test + # id: cmake_test + # run: | + # cd build + # ctest -L main --verbose + + # ubuntu-24-vulkan: + # runs-on: ${{ 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + + # steps: + # - name: Clone + # id: checkout + # uses: actions/checkout@v6 + + # - name: Dependencies + # id: depends + # run: | + # sudo apt-get install -y glslc libvulkan-dev libssl-dev ninja-build + + # - name: Configure + # id: cmake_configure + # run: | + # cmake -B build \ + # -G "Ninja" \ + # -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + # -DGGML_BACKEND_DL=ON \ + # -DGGML_CPU_ALL_VARIANTS=ON \ + # -DGGML_VULKAN=ON + + # - name: Build + # id: cmake_build + # run: | + # time cmake --build build -j $(nproc) ubuntu-24-webgpu: runs-on: ubuntu-24.04 @@ -427,847 +427,847 @@ jobs: time cmake --build build-wasm --config Release --target test-backend-ops -j $(nproc) - ubuntu-22-hip: - runs-on: ubuntu-22.04 - container: rocm/dev-ubuntu-22.04:6.1.2 - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install -y build-essential git cmake rocblas-dev hipblas-dev libssl-dev rocwmma-dev - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ubuntu-22-hip - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build with native CMake HIP support - id: cmake_build - run: | - cmake -B build -S . \ - -DCMAKE_HIP_COMPILER="$(hipconfig -l)/clang" \ - -DGGML_HIP_ROCWMMA_FATTN=ON \ - -DGGML_HIP=ON - cmake --build build --config Release -j $(nproc) - - ubuntu-22-musa: - runs-on: ubuntu-22.04 - container: mthreads/musa:rc4.3.0-devel-ubuntu22.04-amd64 - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Dependencies - id: depends - run: | - apt-get update - apt-get install -y build-essential git cmake libssl-dev - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ubuntu-22-musa - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build with native CMake MUSA support - id: cmake_build - run: | - cmake -B build -S . \ - -DGGML_MUSA=ON - time cmake --build build --config Release -j $(nproc) - - ubuntu-22-sycl: - runs-on: ubuntu-22.04 - - continue-on-error: true - - steps: - - uses: actions/checkout@v6 - - - name: add oneAPI to apt - shell: bash - run: | - cd /tmp - wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB - sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB - rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB - sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" - - - name: install oneAPI dpcpp compiler - shell: bash - run: | - sudo apt update - sudo apt install intel-oneapi-compiler-dpcpp-cpp libssl-dev - - - name: install oneAPI MKL library - shell: bash - run: | - sudo apt install intel-oneapi-mkl-devel - - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ubuntu-22-sycl - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build - id: cmake_build - run: | - source /opt/intel/oneapi/setvars.sh - cmake -B build \ - -DGGML_SYCL=ON \ - -DCMAKE_C_COMPILER=icx \ - -DCMAKE_CXX_COMPILER=icpx - time cmake --build build --config Release -j $(nproc) - - ubuntu-22-sycl-fp16: - runs-on: ubuntu-22.04 - - continue-on-error: true - - steps: - - uses: actions/checkout@v6 - - - name: add oneAPI to apt - shell: bash - run: | - cd /tmp - wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB - sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB - rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB - sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" - - - name: install oneAPI dpcpp compiler - shell: bash - run: | - sudo apt update - sudo apt install intel-oneapi-compiler-dpcpp-cpp libssl-dev ninja-build - - - name: install oneAPI MKL library - shell: bash - run: | - sudo apt install intel-oneapi-mkl-devel - - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ubuntu-22-sycl-fp16 - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build - id: cmake_build - run: | - source /opt/intel/oneapi/setvars.sh - cmake -B build \ - -G "Ninja" \ - -DCMAKE_BUILD_TYPE=Release \ - -DGGML_SYCL=ON \ - -DCMAKE_C_COMPILER=icx \ - -DCMAKE_CXX_COMPILER=icpx \ - -DGGML_SYCL_F16=ON - time cmake --build build --config Release -j $(nproc) - - ubuntu-24-openvino: - name: ubuntu-24-openvino-${{ matrix.openvino_device }} - strategy: - matrix: - include: - - variant: cpu - runner: '"ubuntu-24.04"' - openvino_device: "CPU" - - variant: gpu - runner: '["self-hosted","Linux","X64","Intel"]' - openvino_device: "GPU" - - runs-on: ${{ fromJSON(matrix.runner) }} - - env: - # Sync versions in build.yml, build-self-hosted.yml, release.yml, build-cache.yml, .devops/openvino.Dockerfile - OPENVINO_VERSION_MAJOR: "2026.0" - OPENVINO_VERSION_FULL: "2026.0.0.20965.c6d6a13a886" - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - if: runner.environment == 'github-hosted' - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ubuntu-24-openvino-${{ matrix.variant }}-no-preset-v1 - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install -y build-essential libssl-dev libtbb12 cmake ninja-build python3-pip - sudo apt-get install -y ocl-icd-opencl-dev opencl-headers opencl-clhpp-headers intel-opencl-icd - - - name: Use OpenVINO Toolkit Cache - if: runner.environment == 'github-hosted' - uses: actions/cache@v5 - id: cache-openvino - with: - path: ./openvino_toolkit - key: openvino-toolkit-v${{ env.OPENVINO_VERSION_FULL }}-${{ runner.os }} - - - name: Setup OpenVINO Toolkit - if: steps.cache-openvino.outputs.cache-hit != 'true' - uses: ./.github/actions/linux-setup-openvino - with: - path: ./openvino_toolkit - version_major: ${{ env.OPENVINO_VERSION_MAJOR }} - version_full: ${{ env.OPENVINO_VERSION_FULL }} - - - name: Install OpenVINO dependencies - run: | - cd ./openvino_toolkit - chmod +x ./install_dependencies/install_openvino_dependencies.sh - echo "Y" | sudo -E ./install_dependencies/install_openvino_dependencies.sh - - - name: Build - id: cmake_build - run: | - source ./openvino_toolkit/setupvars.sh - cmake -B build/ReleaseOV -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DGGML_OPENVINO=ON - time cmake --build build/ReleaseOV --config Release -j $(nproc) - - - name: Test - id: cmake_test - # TODO: fix and re-enable the `test-llama-archs` test below - run: | - cd ${{ github.workspace }} - if [ "${{ matrix.openvino_device }}" = "GPU" ]; then - export GGML_OPENVINO_DEVICE=GPU - fi - ctest --test-dir build/ReleaseOV -L main -E "test-llama-archs" --verbose --timeout 2000 - - windows-latest: - runs-on: windows-2025 - - env: - OPENBLAS_VERSION: 0.3.23 - SDE_VERSION: 9.33.0-2024-01-07 - VULKAN_VERSION: 1.4.313.2 - - strategy: - matrix: - include: - - build: 'cpu-x64 (static)' - arch: 'x64' - defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/x64-windows-llvm.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DGGML_RPC=ON -DBUILD_SHARED_LIBS=OFF' - - build: 'openblas-x64' - arch: 'x64' - defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/x64-windows-llvm.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DGGML_RPC=ON -DGGML_BACKEND_DL=ON -DGGML_CPU_ALL_VARIANTS=ON -DGGML_OPENMP=OFF -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS -DBLAS_INCLUDE_DIRS="$env:RUNNER_TEMP/openblas/include" -DBLAS_LIBRARIES="$env:RUNNER_TEMP/openblas/lib/openblas.lib"' - - build: 'vulkan-x64' - arch: 'x64' - defines: '-DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DGGML_RPC=ON -DGGML_BACKEND_DL=ON -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON' - - build: 'llvm-arm64' - arch: 'arm64' - defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-llvm.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON' - - build: 'llvm-arm64-opencl-adreno' - arch: 'arm64' - defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-llvm.cmake -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/opencl-arm64-release" -DGGML_OPENCL=ON -DGGML_OPENCL_USE_ADRENO_KERNELS=ON' - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: windows-latest-${{ matrix.build }} - variant: ccache - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Download OpenBLAS - id: get_openblas - if: ${{ matrix.build == 'openblas-x64' }} - run: | - curl.exe -o $env:RUNNER_TEMP/openblas.zip -L "https://github.com/xianyi/OpenBLAS/releases/download/v${env:OPENBLAS_VERSION}/OpenBLAS-${env:OPENBLAS_VERSION}-x64.zip" - curl.exe -o $env:RUNNER_TEMP/OpenBLAS.LICENSE.txt -L "https://github.com/xianyi/OpenBLAS/raw/v${env:OPENBLAS_VERSION}/LICENSE" - mkdir $env:RUNNER_TEMP/openblas - tar.exe -xvf $env:RUNNER_TEMP/openblas.zip -C $env:RUNNER_TEMP/openblas - $vcdir = $(vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath) - $msvc = $(join-path $vcdir $('VC\Tools\MSVC\'+$(gc -raw $(join-path $vcdir 'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt')).Trim())) - $lib = $(join-path $msvc 'bin\Hostx64\x64\lib.exe') - & $lib /machine:x64 "/def:${env:RUNNER_TEMP}/openblas/lib/libopenblas.def" "/out:${env:RUNNER_TEMP}/openblas/lib/openblas.lib" /name:openblas.dll - - - name: Install Vulkan SDK - id: get_vulkan - if: ${{ matrix.build == 'vulkan-x64' }} - run: | - curl.exe -o $env:RUNNER_TEMP/VulkanSDK-Installer.exe -L "https://sdk.lunarg.com/sdk/download/${env:VULKAN_VERSION}/windows/vulkansdk-windows-X64-${env:VULKAN_VERSION}.exe" - & "$env:RUNNER_TEMP\VulkanSDK-Installer.exe" --accept-licenses --default-answer --confirm-command install - Add-Content $env:GITHUB_ENV "VULKAN_SDK=C:\VulkanSDK\${env:VULKAN_VERSION}" - Add-Content $env:GITHUB_PATH "C:\VulkanSDK\${env:VULKAN_VERSION}\bin" - - - name: Install Ninja - id: install_ninja - run: | - choco install ninja - - - name: Install OpenCL Headers and Libs - id: install_opencl - if: ${{ matrix.build == 'llvm-arm64-opencl-adreno' }} - run: | - git clone https://github.com/KhronosGroup/OpenCL-Headers - cd OpenCL-Headers - cmake -B build ` - -DBUILD_TESTING=OFF ` - -DOPENCL_HEADERS_BUILD_TESTING=OFF ` - -DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF ` - -DCMAKE_INSTALL_PREFIX="$env:RUNNER_TEMP/opencl-arm64-release" - cmake --build build --target install - git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader - cd OpenCL-ICD-Loader - cmake -B build-arm64-release ` - -A arm64 ` - -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/opencl-arm64-release" ` - -DCMAKE_INSTALL_PREFIX="$env:RUNNER_TEMP/opencl-arm64-release" - cmake --build build-arm64-release --target install --config release - - - name: Build - id: cmake_build - run: | - cmake -S . -B build ${{ matrix.defines }} ` - -DLLAMA_BUILD_BORINGSSL=ON - cmake --build build --config Release -j ${env:NUMBER_OF_PROCESSORS} - - - name: Add libopenblas.dll - id: add_libopenblas_dll - if: ${{ matrix.build == 'openblas-x64' }} - run: | - cp $env:RUNNER_TEMP/openblas/bin/libopenblas.dll ./build/bin/Release/openblas.dll - cp $env:RUNNER_TEMP/OpenBLAS.LICENSE.txt ./build/bin/Release/OpenBLAS-${env:OPENBLAS_VERSION}.txt - - - name: Test - id: cmake_test - if: ${{ matrix.arch == 'x64' }} - run: | - cd build - ctest -L main -C Release --verbose --timeout 900 - - # TODO: disabled for now, consider adding tests for all CPU variants instead - # - name: Test (Intel SDE) - # id: cmake_test_sde - # if: ${{ matrix.build == 'avx512-x64' && env.HAS_AVX512F == '0' }} # use Intel SDE for AVX-512 emulation - # run: | - # curl.exe -o $env:RUNNER_TEMP/sde.tar.xz -L "https://downloadmirror.intel.com/813591/sde-external-${env:SDE_VERSION}-win.tar.xz" - # # for some weird reason windows tar doesn't like sde tar.xz - # 7z x "-o${env:RUNNER_TEMP}" $env:RUNNER_TEMP/sde.tar.xz - # 7z x "-o${env:RUNNER_TEMP}" $env:RUNNER_TEMP/sde.tar - # $sde = $(join-path $env:RUNNER_TEMP sde-external-${env:SDE_VERSION}-win/sde.exe) - # cd build - # $env:LLAMA_SKIP_TESTS_SLOW_ON_EMULATOR = 1 - # & $sde -future -- ctest -L main -C Release --verbose --timeout 900 - - ubuntu-latest-cuda: - runs-on: ubuntu-latest - container: nvidia/cuda:12.6.2-devel-ubuntu24.04 - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Install dependencies - env: - DEBIAN_FRONTEND: noninteractive - run: | - apt update - apt install -y cmake build-essential ninja-build libgomp1 git libssl-dev - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ubuntu-latest-cuda - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build with CMake - # TODO: Remove GGML_CUDA_CUB_3DOT2 flag once CCCL 3.2 is bundled within CTK and that CTK version is used in this project - run: | - cmake -S . -B build -G Ninja \ - -DLLAMA_FATAL_WARNINGS=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_CUDA_ARCHITECTURES=89-real \ - -DCMAKE_EXE_LINKER_FLAGS=-Wl,--allow-shlib-undefined \ - -DGGML_NATIVE=OFF \ - -DGGML_CUDA=ON \ - -DGGML_CUDA_CUB_3DOT2=ON - cmake --build build - - windows-2022-cuda: - runs-on: windows-2022 - - strategy: - matrix: - cuda: ['12.4'] - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Install ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: windows-cuda-${{ matrix.cuda }} - variant: ccache - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Install Cuda Toolkit - uses: ./.github/actions/windows-setup-cuda - with: - cuda_version: ${{ matrix.cuda }} - - - name: Install Ninja - id: install_ninja - run: | - choco install ninja - - - name: Build - id: cmake_build - shell: cmd - # TODO: Remove GGML_CUDA_CUB_3DOT2 flag once CCCL 3.2 is bundled within CTK and that CTK version is used in this project - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - cmake -S . -B build -G "Ninja Multi-Config" ^ - -DLLAMA_BUILD_SERVER=ON ^ - -DLLAMA_BUILD_BORINGSSL=ON ^ - -DGGML_NATIVE=OFF ^ - -DGGML_BACKEND_DL=ON ^ - -DGGML_CPU_ALL_VARIANTS=ON ^ - -DGGML_CUDA=ON ^ - -DGGML_RPC=ON ^ - -DGGML_CUDA_CUB_3DOT2=ON - set /A NINJA_JOBS=%NUMBER_OF_PROCESSORS%-1 - cmake --build build --config Release -j %NINJA_JOBS% -t ggml - cmake --build build --config Release - - windows-latest-sycl: - runs-on: windows-2022 - - defaults: - run: - shell: bash - - env: - WINDOWS_BASEKIT_URL: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/24751ead-ddc5-4479-b9e6-f9fe2ff8b9f2/intel-deep-learning-essentials-2025.2.1.25_offline.exe - WINDOWS_DPCPP_MKL: intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.mkl.devel:intel.oneapi.win.dnnl:intel.oneapi.win.tbb.devel - ONEAPI_ROOT: "C:/Program Files (x86)/Intel/oneAPI" - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: windows-latest-sycl - variant: ccache - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Install - run: | - scripts/install-oneapi.bat $WINDOWS_BASEKIT_URL $WINDOWS_DPCPP_MKL - - # TODO: add ssl support ; we will also need to modify win-build-sycl.bat to accept user-specified args - - - name: Build - id: cmake_build - run: examples/sycl/win-build-sycl.bat - - windows-latest-hip: - runs-on: windows-2022 - - env: - # Make sure this is in sync with build-cache.yml - HIPSDK_INSTALLER_VERSION: "26.Q1" - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Grab rocWMMA package - id: grab_rocwmma - run: | - curl -o rocwmma.deb "https://repo.radeon.com/rocm/apt/7.2/pool/main/r/rocwmma-dev/rocwmma-dev_2.2.0.70200-43~24.04_amd64.deb" - 7z x rocwmma.deb - 7z x data.tar - - - name: Use ROCm Installation Cache - uses: actions/cache@v5 - id: cache-rocm - with: - path: C:\Program Files\AMD\ROCm - key: rocm-${{ env.HIPSDK_INSTALLER_VERSION }}-${{ runner.os }} - - - name: Setup ROCm - if: steps.cache-rocm.outputs.cache-hit != 'true' - uses: ./.github/actions/windows-setup-rocm - with: - version: ${{ env.HIPSDK_INSTALLER_VERSION }} - - - name: Verify ROCm - id: verify - run: | - # Find and test ROCm installation - $clangPath = Get-ChildItem 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' | Select-Object -First 1 - if (-not $clangPath) { - Write-Error "ROCm installation not found" - exit 1 - } - & $clangPath.FullName --version - - - name: Install ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ${{ github.job }} - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Build - id: cmake_build - run: | - $env:HIP_PATH=$(Resolve-Path 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' | split-path | split-path) - $env:CMAKE_PREFIX_PATH="${env:HIP_PATH}" - cmake -G "Unix Makefiles" -B build -S . ` - -DCMAKE_C_COMPILER="${env:HIP_PATH}\bin\clang.exe" ` - -DCMAKE_CXX_COMPILER="${env:HIP_PATH}\bin\clang++.exe" ` - -DCMAKE_CXX_FLAGS="-I$($PWD.Path.Replace('\', '/'))/opt/rocm-7.2.0/include/" ` - -DCMAKE_BUILD_TYPE=Release ` - -DLLAMA_BUILD_BORINGSSL=ON ` - -DROCM_DIR="${env:HIP_PATH}" ` - -DGGML_HIP=ON ` - -DGGML_HIP_ROCWMMA_FATTN=ON ` - -DGGML_RPC=ON - cmake --build build -j ${env:NUMBER_OF_PROCESSORS} - - ubuntu-cpu-riscv64-native: - runs-on: RISCV64 - - steps: - - name: Install dependencies - run: | - sudo apt-get update - - # Install necessary packages - sudo apt-get install -y libatomic1 libtsan2 gcc-14 g++-14 rustup cmake build-essential libssl-dev wget ccache git-lfs - - # Set gcc-14 and g++-14 as the default compilers - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 100 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-14 100 - sudo ln -sf /usr/bin/gcc-14 /usr/bin/gcc - sudo ln -sf /usr/bin/g++-14 /usr/bin/g++ - - # Install Rust stable version - rustup install stable - rustup default stable - - git lfs install - - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Check environment - run: | - uname -a - gcc --version - g++ --version - ldd --version - cmake --version - rustc --version - - - name: Setup ccache - run: | - # Set unique cache directory for this job - export CCACHE_DIR="$HOME/.ccache/cpu-cmake-rv64-native" - mkdir -p "$CCACHE_DIR" - - # Configure ccache for optimal performance - ccache --set-config=max_size=5G - ccache --set-config=compression=true - ccache --set-config=compression_level=6 - ccache --set-config=cache_dir="$CCACHE_DIR" - - # Enable more aggressive caching - ccache --set-config=sloppiness=file_macro,time_macros,include_file_mtime,include_file_ctime - ccache --set-config=hash_dir=false - - # Export for subsequent steps - echo "CCACHE_DIR=$CCACHE_DIR" >> $GITHUB_ENV - echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - - - name: Build - id: cmake_build - run: | - cmake -B build \ - -DCMAKE_BUILD_TYPE=Release \ - -DGGML_OPENMP=OFF \ - -DLLAMA_BUILD_EXAMPLES=ON \ - -DLLAMA_BUILD_TOOLS=ON \ - -DLLAMA_BUILD_TESTS=ON \ - -DCMAKE_C_COMPILER_LAUNCHER=ccache \ - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DGGML_RPC=ON \ - -DCMAKE_C_COMPILER=riscv64-linux-gnu-gcc-14 \ - -DCMAKE_CXX_COMPILER=riscv64-linux-gnu-g++-14 - - time cmake --build build --config Release -j $(nproc) - - - name: Test - id: cmake_test - run: | - cd build - ctest -L main --verbose --timeout 900 - - - name: Test llama2c conversion - id: llama2c_test - run: | - cd build - echo "Fetch tokenizer" - wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/tok512.bin - echo "Fetch llama2c model" - wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/stories260K.bin - ./bin/llama-convert-llama2c-to-ggml --copy-vocab-from-model ./tok512.bin --llama2c-model stories260K.bin --llama2c-output-model stories260K.gguf - ./bin/llama-completion -m stories260K.gguf -p "One day, Lily met a Shoggoth" -n 500 -c 256 - -# TODO: simplify the following workflows using a matrix -# TODO: run lighter CI on PRs and the full CI only on master (if needed) - ggml-ci-x64-cpu-low-perf: - runs-on: ubuntu-22.04 - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ggml-ci-x64-cpu-low-perf - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install build-essential - - - name: Test - id: ggml-ci - run: | - LLAMA_ARG_THREADS=$(nproc) GG_BUILD_LOW_PERF=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt - - ggml-ci-arm64-cpu-low-perf: - runs-on: ubuntu-22.04-arm - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ggml-ci-arm64-cpu-low-perf - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install build-essential - - - name: Test - id: ggml-ci - run: | - LLAMA_ARG_THREADS=$(nproc) GG_BUILD_LOW_PERF=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt - - ggml-ci-x64-cpu-high-perf: - runs-on: ubuntu-22.04 - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ggml-ci-x64-cpu-high-perf - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install build-essential - - - name: Test - id: ggml-ci - run: | - LLAMA_ARG_THREADS=$(nproc) GG_BUILD_HIGH_PERF=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt - - ggml-ci-arm64-cpu-high-perf: - runs-on: ubuntu-22.04-arm - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ggml-ci-arm64-cpu-high-perf - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install build-essential - - - name: Test - id: ggml-ci - run: | - LLAMA_ARG_THREADS=$(nproc) GG_BUILD_HIGH_PERF=1 GG_BUILD_NO_SVE=1 GG_BUILD_NO_BF16=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt - - ggml-ci-arm64-cpu-high-perf-sve: - runs-on: ubuntu-22.04-arm - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ggml-ci-arm64-cpu-high-perf-sve - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install build-essential - - - name: Test - id: ggml-ci - run: | - LLAMA_ARG_THREADS=$(nproc) GG_BUILD_NO_BF16=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt - - ggml-ci-arm64-cpu-kleidiai: - runs-on: ubuntu-22.04-arm - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ggml-ci-arm64-cpu-kleidiai - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Dependencies - id: depends - run: | - sudo apt-get update - sudo apt-get install -y build-essential - - - name: Test - id: ggml-ci - run: | - GG_BUILD_KLEIDIAI=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt - - ggml-ci-arm64-cpu-kleidiai-graviton4: - runs-on: ah-ubuntu_22_04-c8g_8x - - steps: - - name: Clone - id: checkout - uses: actions/checkout@v6 - - - name: Dependencies - id: depends - run: | - set -euxo pipefail - sudo apt-get update - sudo DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a \ - apt-get install -y \ - build-essential \ - python3-venv \ - gpg \ - wget \ - time \ - git-lfs - - git lfs install - - # install the latest cmake - sudo install -d /usr/share/keyrings - wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc \ - | gpg --dearmor \ - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null - echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main' \ - | sudo tee /etc/apt/sources.list.d/kitware.list - sudo apt-get update - sudo apt-get install -y cmake - - - name: ccache - uses: ggml-org/ccache-action@v1.2.21 - with: - key: ggml-ci-arm64-cpu-kleidiai-graviton4 - evict-old-files: 1d - save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} - - - name: Test - id: ggml-ci - run: | - GG_BUILD_KLEIDIAI=1 \ - GG_BUILD_EXTRA_TESTS_0=1 \ - bash ./ci/run.sh ./tmp/results ./tmp/mnt +# ubuntu-22-hip: +# runs-on: ubuntu-22.04 +# container: rocm/dev-ubuntu-22.04:6.1.2 + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install -y build-essential git cmake rocblas-dev hipblas-dev libssl-dev rocwmma-dev + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ubuntu-22-hip +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Build with native CMake HIP support +# id: cmake_build +# run: | +# cmake -B build -S . \ +# -DCMAKE_HIP_COMPILER="$(hipconfig -l)/clang" \ +# -DGGML_HIP_ROCWMMA_FATTN=ON \ +# -DGGML_HIP=ON +# cmake --build build --config Release -j $(nproc) + +# ubuntu-22-musa: +# runs-on: ubuntu-22.04 +# container: mthreads/musa:rc4.3.0-devel-ubuntu22.04-amd64 + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: Dependencies +# id: depends +# run: | +# apt-get update +# apt-get install -y build-essential git cmake libssl-dev + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ubuntu-22-musa +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Build with native CMake MUSA support +# id: cmake_build +# run: | +# cmake -B build -S . \ +# -DGGML_MUSA=ON +# time cmake --build build --config Release -j $(nproc) + +# ubuntu-22-sycl: +# runs-on: ubuntu-22.04 + +# continue-on-error: true + +# steps: +# - uses: actions/checkout@v6 + +# - name: add oneAPI to apt +# shell: bash +# run: | +# cd /tmp +# wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB +# sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB +# rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB +# sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" + +# - name: install oneAPI dpcpp compiler +# shell: bash +# run: | +# sudo apt update +# sudo apt install intel-oneapi-compiler-dpcpp-cpp libssl-dev + +# - name: install oneAPI MKL library +# shell: bash +# run: | +# sudo apt install intel-oneapi-mkl-devel + +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ubuntu-22-sycl +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Build +# id: cmake_build +# run: | +# source /opt/intel/oneapi/setvars.sh +# cmake -B build \ +# -DGGML_SYCL=ON \ +# -DCMAKE_C_COMPILER=icx \ +# -DCMAKE_CXX_COMPILER=icpx +# time cmake --build build --config Release -j $(nproc) + +# ubuntu-22-sycl-fp16: +# runs-on: ubuntu-22.04 + +# continue-on-error: true + +# steps: +# - uses: actions/checkout@v6 + +# - name: add oneAPI to apt +# shell: bash +# run: | +# cd /tmp +# wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB +# sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB +# rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB +# sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" + +# - name: install oneAPI dpcpp compiler +# shell: bash +# run: | +# sudo apt update +# sudo apt install intel-oneapi-compiler-dpcpp-cpp libssl-dev ninja-build + +# - name: install oneAPI MKL library +# shell: bash +# run: | +# sudo apt install intel-oneapi-mkl-devel + +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ubuntu-22-sycl-fp16 +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Build +# id: cmake_build +# run: | +# source /opt/intel/oneapi/setvars.sh +# cmake -B build \ +# -G "Ninja" \ +# -DCMAKE_BUILD_TYPE=Release \ +# -DGGML_SYCL=ON \ +# -DCMAKE_C_COMPILER=icx \ +# -DCMAKE_CXX_COMPILER=icpx \ +# -DGGML_SYCL_F16=ON +# time cmake --build build --config Release -j $(nproc) + +# ubuntu-24-openvino: +# name: ubuntu-24-openvino-${{ matrix.openvino_device }} +# strategy: +# matrix: +# include: +# - variant: cpu +# runner: '"ubuntu-24.04"' +# openvino_device: "CPU" +# - variant: gpu +# runner: '["self-hosted","Linux","X64","Intel"]' +# openvino_device: "GPU" + +# runs-on: ${{ fromJSON(matrix.runner) }} + +# env: +# # Sync versions in build.yml, build-self-hosted.yml, release.yml, build-cache.yml, .devops/openvino.Dockerfile +# OPENVINO_VERSION_MAJOR: "2026.0" +# OPENVINO_VERSION_FULL: "2026.0.0.20965.c6d6a13a886" + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# if: runner.environment == 'github-hosted' +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ubuntu-24-openvino-${{ matrix.variant }}-no-preset-v1 +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install -y build-essential libssl-dev libtbb12 cmake ninja-build python3-pip +# sudo apt-get install -y ocl-icd-opencl-dev opencl-headers opencl-clhpp-headers intel-opencl-icd + +# - name: Use OpenVINO Toolkit Cache +# if: runner.environment == 'github-hosted' +# uses: actions/cache@v5 +# id: cache-openvino +# with: +# path: ./openvino_toolkit +# key: openvino-toolkit-v${{ env.OPENVINO_VERSION_FULL }}-${{ runner.os }} + +# - name: Setup OpenVINO Toolkit +# if: steps.cache-openvino.outputs.cache-hit != 'true' +# uses: ./.github/actions/linux-setup-openvino +# with: +# path: ./openvino_toolkit +# version_major: ${{ env.OPENVINO_VERSION_MAJOR }} +# version_full: ${{ env.OPENVINO_VERSION_FULL }} + +# - name: Install OpenVINO dependencies +# run: | +# cd ./openvino_toolkit +# chmod +x ./install_dependencies/install_openvino_dependencies.sh +# echo "Y" | sudo -E ./install_dependencies/install_openvino_dependencies.sh + +# - name: Build +# id: cmake_build +# run: | +# source ./openvino_toolkit/setupvars.sh +# cmake -B build/ReleaseOV -G Ninja \ +# -DCMAKE_BUILD_TYPE=Release \ +# -DGGML_OPENVINO=ON +# time cmake --build build/ReleaseOV --config Release -j $(nproc) + +# - name: Test +# id: cmake_test +# # TODO: fix and re-enable the `test-llama-archs` test below +# run: | +# cd ${{ github.workspace }} +# if [ "${{ matrix.openvino_device }}" = "GPU" ]; then +# export GGML_OPENVINO_DEVICE=GPU +# fi +# ctest --test-dir build/ReleaseOV -L main -E "test-llama-archs" --verbose --timeout 2000 + +# windows-latest: +# runs-on: windows-2025 + +# env: +# OPENBLAS_VERSION: 0.3.23 +# SDE_VERSION: 9.33.0-2024-01-07 +# VULKAN_VERSION: 1.4.313.2 + +# strategy: +# matrix: +# include: +# - build: 'cpu-x64 (static)' +# arch: 'x64' +# defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/x64-windows-llvm.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DGGML_RPC=ON -DBUILD_SHARED_LIBS=OFF' +# - build: 'openblas-x64' +# arch: 'x64' +# defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/x64-windows-llvm.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DGGML_RPC=ON -DGGML_BACKEND_DL=ON -DGGML_CPU_ALL_VARIANTS=ON -DGGML_OPENMP=OFF -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS -DBLAS_INCLUDE_DIRS="$env:RUNNER_TEMP/openblas/include" -DBLAS_LIBRARIES="$env:RUNNER_TEMP/openblas/lib/openblas.lib"' +# - build: 'vulkan-x64' +# arch: 'x64' +# defines: '-DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON -DGGML_RPC=ON -DGGML_BACKEND_DL=ON -DGGML_CPU_ALL_VARIANTS=ON -DGGML_VULKAN=ON' +# - build: 'llvm-arm64' +# arch: 'arm64' +# defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-llvm.cmake -DGGML_NATIVE=OFF -DLLAMA_BUILD_SERVER=ON' +# - build: 'llvm-arm64-opencl-adreno' +# arch: 'arm64' +# defines: '-G "Ninja Multi-Config" -D CMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-llvm.cmake -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/opencl-arm64-release" -DGGML_OPENCL=ON -DGGML_OPENCL_USE_ADRENO_KERNELS=ON' + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: windows-latest-${{ matrix.build }} +# variant: ccache +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Download OpenBLAS +# id: get_openblas +# if: ${{ matrix.build == 'openblas-x64' }} +# run: | +# curl.exe -o $env:RUNNER_TEMP/openblas.zip -L "https://github.com/xianyi/OpenBLAS/releases/download/v${env:OPENBLAS_VERSION}/OpenBLAS-${env:OPENBLAS_VERSION}-x64.zip" +# curl.exe -o $env:RUNNER_TEMP/OpenBLAS.LICENSE.txt -L "https://github.com/xianyi/OpenBLAS/raw/v${env:OPENBLAS_VERSION}/LICENSE" +# mkdir $env:RUNNER_TEMP/openblas +# tar.exe -xvf $env:RUNNER_TEMP/openblas.zip -C $env:RUNNER_TEMP/openblas +# $vcdir = $(vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath) +# $msvc = $(join-path $vcdir $('VC\Tools\MSVC\'+$(gc -raw $(join-path $vcdir 'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt')).Trim())) +# $lib = $(join-path $msvc 'bin\Hostx64\x64\lib.exe') +# & $lib /machine:x64 "/def:${env:RUNNER_TEMP}/openblas/lib/libopenblas.def" "/out:${env:RUNNER_TEMP}/openblas/lib/openblas.lib" /name:openblas.dll + +# - name: Install Vulkan SDK +# id: get_vulkan +# if: ${{ matrix.build == 'vulkan-x64' }} +# run: | +# curl.exe -o $env:RUNNER_TEMP/VulkanSDK-Installer.exe -L "https://sdk.lunarg.com/sdk/download/${env:VULKAN_VERSION}/windows/vulkansdk-windows-X64-${env:VULKAN_VERSION}.exe" +# & "$env:RUNNER_TEMP\VulkanSDK-Installer.exe" --accept-licenses --default-answer --confirm-command install +# Add-Content $env:GITHUB_ENV "VULKAN_SDK=C:\VulkanSDK\${env:VULKAN_VERSION}" +# Add-Content $env:GITHUB_PATH "C:\VulkanSDK\${env:VULKAN_VERSION}\bin" + +# - name: Install Ninja +# id: install_ninja +# run: | +# choco install ninja + +# - name: Install OpenCL Headers and Libs +# id: install_opencl +# if: ${{ matrix.build == 'llvm-arm64-opencl-adreno' }} +# run: | +# git clone https://github.com/KhronosGroup/OpenCL-Headers +# cd OpenCL-Headers +# cmake -B build ` +# -DBUILD_TESTING=OFF ` +# -DOPENCL_HEADERS_BUILD_TESTING=OFF ` +# -DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF ` +# -DCMAKE_INSTALL_PREFIX="$env:RUNNER_TEMP/opencl-arm64-release" +# cmake --build build --target install +# git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader +# cd OpenCL-ICD-Loader +# cmake -B build-arm64-release ` +# -A arm64 ` +# -DCMAKE_PREFIX_PATH="$env:RUNNER_TEMP/opencl-arm64-release" ` +# -DCMAKE_INSTALL_PREFIX="$env:RUNNER_TEMP/opencl-arm64-release" +# cmake --build build-arm64-release --target install --config release + +# - name: Build +# id: cmake_build +# run: | +# cmake -S . -B build ${{ matrix.defines }} ` +# -DLLAMA_BUILD_BORINGSSL=ON +# cmake --build build --config Release -j ${env:NUMBER_OF_PROCESSORS} + +# - name: Add libopenblas.dll +# id: add_libopenblas_dll +# if: ${{ matrix.build == 'openblas-x64' }} +# run: | +# cp $env:RUNNER_TEMP/openblas/bin/libopenblas.dll ./build/bin/Release/openblas.dll +# cp $env:RUNNER_TEMP/OpenBLAS.LICENSE.txt ./build/bin/Release/OpenBLAS-${env:OPENBLAS_VERSION}.txt + +# - name: Test +# id: cmake_test +# if: ${{ matrix.arch == 'x64' }} +# run: | +# cd build +# ctest -L main -C Release --verbose --timeout 900 + +# # TODO: disabled for now, consider adding tests for all CPU variants instead +# # - name: Test (Intel SDE) +# # id: cmake_test_sde +# # if: ${{ matrix.build == 'avx512-x64' && env.HAS_AVX512F == '0' }} # use Intel SDE for AVX-512 emulation +# # run: | +# # curl.exe -o $env:RUNNER_TEMP/sde.tar.xz -L "https://downloadmirror.intel.com/813591/sde-external-${env:SDE_VERSION}-win.tar.xz" +# # # for some weird reason windows tar doesn't like sde tar.xz +# # 7z x "-o${env:RUNNER_TEMP}" $env:RUNNER_TEMP/sde.tar.xz +# # 7z x "-o${env:RUNNER_TEMP}" $env:RUNNER_TEMP/sde.tar +# # $sde = $(join-path $env:RUNNER_TEMP sde-external-${env:SDE_VERSION}-win/sde.exe) +# # cd build +# # $env:LLAMA_SKIP_TESTS_SLOW_ON_EMULATOR = 1 +# # & $sde -future -- ctest -L main -C Release --verbose --timeout 900 + +# ubuntu-latest-cuda: +# runs-on: ubuntu-latest +# container: nvidia/cuda:12.6.2-devel-ubuntu24.04 + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: Install dependencies +# env: +# DEBIAN_FRONTEND: noninteractive +# run: | +# apt update +# apt install -y cmake build-essential ninja-build libgomp1 git libssl-dev + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ubuntu-latest-cuda +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Build with CMake +# # TODO: Remove GGML_CUDA_CUB_3DOT2 flag once CCCL 3.2 is bundled within CTK and that CTK version is used in this project +# run: | +# cmake -S . -B build -G Ninja \ +# -DLLAMA_FATAL_WARNINGS=ON \ +# -DCMAKE_BUILD_TYPE=Release \ +# -DCMAKE_CUDA_ARCHITECTURES=89-real \ +# -DCMAKE_EXE_LINKER_FLAGS=-Wl,--allow-shlib-undefined \ +# -DGGML_NATIVE=OFF \ +# -DGGML_CUDA=ON \ +# -DGGML_CUDA_CUB_3DOT2=ON +# cmake --build build + +# windows-2022-cuda: +# runs-on: windows-2022 + +# strategy: +# matrix: +# cuda: ['12.4'] + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: Install ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: windows-cuda-${{ matrix.cuda }} +# variant: ccache +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Install Cuda Toolkit +# uses: ./.github/actions/windows-setup-cuda +# with: +# cuda_version: ${{ matrix.cuda }} + +# - name: Install Ninja +# id: install_ninja +# run: | +# choco install ninja + +# - name: Build +# id: cmake_build +# shell: cmd +# # TODO: Remove GGML_CUDA_CUB_3DOT2 flag once CCCL 3.2 is bundled within CTK and that CTK version is used in this project +# run: | +# call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 +# cmake -S . -B build -G "Ninja Multi-Config" ^ +# -DLLAMA_BUILD_SERVER=ON ^ +# -DLLAMA_BUILD_BORINGSSL=ON ^ +# -DGGML_NATIVE=OFF ^ +# -DGGML_BACKEND_DL=ON ^ +# -DGGML_CPU_ALL_VARIANTS=ON ^ +# -DGGML_CUDA=ON ^ +# -DGGML_RPC=ON ^ +# -DGGML_CUDA_CUB_3DOT2=ON +# set /A NINJA_JOBS=%NUMBER_OF_PROCESSORS%-1 +# cmake --build build --config Release -j %NINJA_JOBS% -t ggml +# cmake --build build --config Release + +# windows-latest-sycl: +# runs-on: windows-2022 + +# defaults: +# run: +# shell: bash + +# env: +# WINDOWS_BASEKIT_URL: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/24751ead-ddc5-4479-b9e6-f9fe2ff8b9f2/intel-deep-learning-essentials-2025.2.1.25_offline.exe +# WINDOWS_DPCPP_MKL: intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.mkl.devel:intel.oneapi.win.dnnl:intel.oneapi.win.tbb.devel +# ONEAPI_ROOT: "C:/Program Files (x86)/Intel/oneAPI" +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: windows-latest-sycl +# variant: ccache +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Install +# run: | +# scripts/install-oneapi.bat $WINDOWS_BASEKIT_URL $WINDOWS_DPCPP_MKL + +# # TODO: add ssl support ; we will also need to modify win-build-sycl.bat to accept user-specified args + +# - name: Build +# id: cmake_build +# run: examples/sycl/win-build-sycl.bat + +# windows-latest-hip: +# runs-on: windows-2022 + +# env: +# # Make sure this is in sync with build-cache.yml +# HIPSDK_INSTALLER_VERSION: "26.Q1" + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: Grab rocWMMA package +# id: grab_rocwmma +# run: | +# curl -o rocwmma.deb "https://repo.radeon.com/rocm/apt/7.2/pool/main/r/rocwmma-dev/rocwmma-dev_2.2.0.70200-43~24.04_amd64.deb" +# 7z x rocwmma.deb +# 7z x data.tar + +# - name: Use ROCm Installation Cache +# uses: actions/cache@v5 +# id: cache-rocm +# with: +# path: C:\Program Files\AMD\ROCm +# key: rocm-${{ env.HIPSDK_INSTALLER_VERSION }}-${{ runner.os }} + +# - name: Setup ROCm +# if: steps.cache-rocm.outputs.cache-hit != 'true' +# uses: ./.github/actions/windows-setup-rocm +# with: +# version: ${{ env.HIPSDK_INSTALLER_VERSION }} + +# - name: Verify ROCm +# id: verify +# run: | +# # Find and test ROCm installation +# $clangPath = Get-ChildItem 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' | Select-Object -First 1 +# if (-not $clangPath) { +# Write-Error "ROCm installation not found" +# exit 1 +# } +# & $clangPath.FullName --version + +# - name: Install ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ${{ github.job }} +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Build +# id: cmake_build +# run: | +# $env:HIP_PATH=$(Resolve-Path 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' | split-path | split-path) +# $env:CMAKE_PREFIX_PATH="${env:HIP_PATH}" +# cmake -G "Unix Makefiles" -B build -S . ` +# -DCMAKE_C_COMPILER="${env:HIP_PATH}\bin\clang.exe" ` +# -DCMAKE_CXX_COMPILER="${env:HIP_PATH}\bin\clang++.exe" ` +# -DCMAKE_CXX_FLAGS="-I$($PWD.Path.Replace('\', '/'))/opt/rocm-7.2.0/include/" ` +# -DCMAKE_BUILD_TYPE=Release ` +# -DLLAMA_BUILD_BORINGSSL=ON ` +# -DROCM_DIR="${env:HIP_PATH}" ` +# -DGGML_HIP=ON ` +# -DGGML_HIP_ROCWMMA_FATTN=ON ` +# -DGGML_RPC=ON +# cmake --build build -j ${env:NUMBER_OF_PROCESSORS} + +# ubuntu-cpu-riscv64-native: +# runs-on: RISCV64 + +# steps: +# - name: Install dependencies +# run: | +# sudo apt-get update + +# # Install necessary packages +# sudo apt-get install -y libatomic1 libtsan2 gcc-14 g++-14 rustup cmake build-essential libssl-dev wget ccache git-lfs + +# # Set gcc-14 and g++-14 as the default compilers +# sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 100 +# sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-14 100 +# sudo ln -sf /usr/bin/gcc-14 /usr/bin/gcc +# sudo ln -sf /usr/bin/g++-14 /usr/bin/g++ + +# # Install Rust stable version +# rustup install stable +# rustup default stable + +# git lfs install + +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: Check environment +# run: | +# uname -a +# gcc --version +# g++ --version +# ldd --version +# cmake --version +# rustc --version + +# - name: Setup ccache +# run: | +# # Set unique cache directory for this job +# export CCACHE_DIR="$HOME/.ccache/cpu-cmake-rv64-native" +# mkdir -p "$CCACHE_DIR" + +# # Configure ccache for optimal performance +# ccache --set-config=max_size=5G +# ccache --set-config=compression=true +# ccache --set-config=compression_level=6 +# ccache --set-config=cache_dir="$CCACHE_DIR" + +# # Enable more aggressive caching +# ccache --set-config=sloppiness=file_macro,time_macros,include_file_mtime,include_file_ctime +# ccache --set-config=hash_dir=false + +# # Export for subsequent steps +# echo "CCACHE_DIR=$CCACHE_DIR" >> $GITHUB_ENV +# echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV + +# - name: Build +# id: cmake_build +# run: | +# cmake -B build \ +# -DCMAKE_BUILD_TYPE=Release \ +# -DGGML_OPENMP=OFF \ +# -DLLAMA_BUILD_EXAMPLES=ON \ +# -DLLAMA_BUILD_TOOLS=ON \ +# -DLLAMA_BUILD_TESTS=ON \ +# -DCMAKE_C_COMPILER_LAUNCHER=ccache \ +# -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ +# -DGGML_RPC=ON \ +# -DCMAKE_C_COMPILER=riscv64-linux-gnu-gcc-14 \ +# -DCMAKE_CXX_COMPILER=riscv64-linux-gnu-g++-14 + +# time cmake --build build --config Release -j $(nproc) + +# - name: Test +# id: cmake_test +# run: | +# cd build +# ctest -L main --verbose --timeout 900 + +# - name: Test llama2c conversion +# id: llama2c_test +# run: | +# cd build +# echo "Fetch tokenizer" +# wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/tok512.bin +# echo "Fetch llama2c model" +# wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories260K/stories260K.bin +# ./bin/llama-convert-llama2c-to-ggml --copy-vocab-from-model ./tok512.bin --llama2c-model stories260K.bin --llama2c-output-model stories260K.gguf +# ./bin/llama-completion -m stories260K.gguf -p "One day, Lily met a Shoggoth" -n 500 -c 256 + +# # TODO: simplify the following workflows using a matrix +# # TODO: run lighter CI on PRs and the full CI only on master (if needed) +# ggml-ci-x64-cpu-low-perf: +# runs-on: ubuntu-22.04 + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ggml-ci-x64-cpu-low-perf +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install build-essential + +# - name: Test +# id: ggml-ci +# run: | +# LLAMA_ARG_THREADS=$(nproc) GG_BUILD_LOW_PERF=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt + +# ggml-ci-arm64-cpu-low-perf: +# runs-on: ubuntu-22.04-arm + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ggml-ci-arm64-cpu-low-perf +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install build-essential + +# - name: Test +# id: ggml-ci +# run: | +# LLAMA_ARG_THREADS=$(nproc) GG_BUILD_LOW_PERF=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt + +# ggml-ci-x64-cpu-high-perf: +# runs-on: ubuntu-22.04 + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ggml-ci-x64-cpu-high-perf +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install build-essential + +# - name: Test +# id: ggml-ci +# run: | +# LLAMA_ARG_THREADS=$(nproc) GG_BUILD_HIGH_PERF=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt + +# ggml-ci-arm64-cpu-high-perf: +# runs-on: ubuntu-22.04-arm + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ggml-ci-arm64-cpu-high-perf +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install build-essential + +# - name: Test +# id: ggml-ci +# run: | +# LLAMA_ARG_THREADS=$(nproc) GG_BUILD_HIGH_PERF=1 GG_BUILD_NO_SVE=1 GG_BUILD_NO_BF16=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt + +# ggml-ci-arm64-cpu-high-perf-sve: +# runs-on: ubuntu-22.04-arm + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ggml-ci-arm64-cpu-high-perf-sve +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install build-essential + +# - name: Test +# id: ggml-ci +# run: | +# LLAMA_ARG_THREADS=$(nproc) GG_BUILD_NO_BF16=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt + +# ggml-ci-arm64-cpu-kleidiai: +# runs-on: ubuntu-22.04-arm + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ggml-ci-arm64-cpu-kleidiai +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Dependencies +# id: depends +# run: | +# sudo apt-get update +# sudo apt-get install -y build-essential + +# - name: Test +# id: ggml-ci +# run: | +# GG_BUILD_KLEIDIAI=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt + +# ggml-ci-arm64-cpu-kleidiai-graviton4: +# runs-on: ah-ubuntu_22_04-c8g_8x + +# steps: +# - name: Clone +# id: checkout +# uses: actions/checkout@v6 + +# - name: Dependencies +# id: depends +# run: | +# set -euxo pipefail +# sudo apt-get update +# sudo DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a \ +# apt-get install -y \ +# build-essential \ +# python3-venv \ +# gpg \ +# wget \ +# time \ +# git-lfs + +# git lfs install + +# # install the latest cmake +# sudo install -d /usr/share/keyrings +# wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc \ +# | gpg --dearmor \ +# | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null +# echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main' \ +# | sudo tee /etc/apt/sources.list.d/kitware.list +# sudo apt-get update +# sudo apt-get install -y cmake + +# - name: ccache +# uses: ggml-org/ccache-action@v1.2.21 +# with: +# key: ggml-ci-arm64-cpu-kleidiai-graviton4 +# evict-old-files: 1d +# save: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + +# - name: Test +# id: ggml-ci +# run: | +# GG_BUILD_KLEIDIAI=1 \ +# GG_BUILD_EXTRA_TESTS_0=1 \ +# bash ./ci/run.sh ./tmp/results ./tmp/mnt From 931d5d1593254714e5c35d49aceb1bdde7c6032a Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Sat, 18 Apr 2026 14:08:19 -0700 Subject: [PATCH 2/6] Add webgpu only workflow --- .github/workflows/build-webgpu.yml | 190 +++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 .github/workflows/build-webgpu.yml diff --git a/.github/workflows/build-webgpu.yml b/.github/workflows/build-webgpu.yml new file mode 100644 index 000000000000..0077f69b1f79 --- /dev/null +++ b/.github/workflows/build-webgpu.yml @@ -0,0 +1,190 @@ +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', + '**/CMakeLists.txt', + '**/.cmake', + '**/*.h', + '**/*.hpp', + '**/*.c', + '**/*.cpp', + '**/*.wgsl' + ] + +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_LOG_COLORS: 1 + LLAMA_LOG_PREFIX: 1 + LLAMA_LOG_TIMESTAMPS: 1 + +jobs: + macOS-latest-arm64-webgpu: + 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: macOS-latest-arm64-webgpu + 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-24-webgpu: + 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: ubuntu-24-webgpu + 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: Get latest Vulkan SDK version + id: vulkan_sdk_version + run: | + echo "VULKAN_SDK_VERSION=$(curl https://vulkan.lunarg.com/sdk/latest/linux.txt)" >> "$GITHUB_ENV" + + - name: Use Vulkan SDK Cache + uses: actions/cache@v5 + id: cache-sdk + with: + path: ./vulkan_sdk + key: vulkan-sdk-${{ env.VULKAN_SDK_VERSION }}-${{ runner.os }} + + - name: Setup Vulkan SDK + if: steps.cache-sdk.outputs.cache-hit != 'true' + uses: ./.github/actions/linux-setup-vulkan + with: + path: ./vulkan_sdk + version: ${{ env.VULKAN_SDK_VERSION }} + + - 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 + ctest -L main --verbose --timeout 900 + + ubuntu-24-webgpu-wasm: + runs-on: ${{ 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + + steps: + - name: Clone + id: checkout + uses: actions/checkout@v6 + + - 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) From d4b5e5b09aee3fccca0af50a4d9defc2d276e2c1 Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Tue, 2 Jun 2026 11:45:39 -0700 Subject: [PATCH 3/6] Implement 2d workgroups for more operations --- ggml/src/ggml-webgpu/ggml-webgpu.cpp | 32 ++++++++++++------- ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl | 10 +++--- ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl | 6 ++-- ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl | 8 ++--- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/ggml/src/ggml-webgpu/ggml-webgpu.cpp b/ggml/src/ggml-webgpu/ggml-webgpu.cpp index d577b5afa3c7..2824630c5d30 100644 --- a/ggml/src/ggml-webgpu/ggml-webgpu.cpp +++ b/ggml/src/ggml-webgpu/ggml-webgpu.cpp @@ -621,10 +621,11 @@ static void ggml_backend_webgpu_buffer_memset(webgpu_global_context & ctx, uint32_t value, size_t offset, size_t size) { - std::vector params = { (uint32_t) offset, (uint32_t) size, value }; - std::vector entries = { ggml_webgpu_make_bind_group_entry(0, buf, 0, buf.GetSize()) }; - size_t bytes_per_wg = ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup * ctx->capabilities.memset_bytes_per_thread; - uint32_t wg_x = CEIL_DIV(size + 3, bytes_per_wg); + std::vector params = { (uint32_t) offset, (uint32_t) size, value }; + std::vector entries = { ggml_webgpu_make_bind_group_entry(0, buf, 0, buf.GetSize()) }; + size_t bytes_per_wg = + ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup * ctx->capabilities.memset_bytes_per_thread; + uint32_t wg_x = CEIL_DIV(size + 3, bytes_per_wg); ctx->queue.WriteBuffer(ctx->memset_params_buf, 0, params.data(), params.size() * sizeof(uint32_t)); @@ -1362,7 +1363,7 @@ static webgpu_encoded_op ggml_webgpu_get_rows(webgpu_context & ctx, shader_lib_ctx.src0 = src; shader_lib_ctx.src1 = nullptr; shader_lib_ctx.dst = dst; - shader_lib_ctx.max_wg_size = ctx->global_ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup; + shader_lib_ctx.max_wg_size = ctx->global_ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup; webgpu_pipeline pipeline = ctx->shader_lib->get_get_rows_pipeline(shader_lib_ctx); auto * decisions = static_cast(pipeline.context.get()); @@ -2103,8 +2104,10 @@ static webgpu_encoded_op ggml_webgpu_unary_op(webgpu_context & ctx, ggml_tensor entries.push_back(ggml_webgpu_make_tensor_bind_group_entry(ctx, 1, dst)); } - uint32_t wg_x = CEIL_DIV(ne, decisions->wg_size); - return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x); + uint32_t wg_x, wg_y; + uint32_t total_wg = CEIL_DIV(ggml_nelements(dst), decisions->wg_size); + compute_2d_workgroups(total_wg, ctx->global_ctx->capabilities.limits.maxComputeWorkgroupsPerDimension, wg_x, wg_y); + return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x, wg_y); } static webgpu_encoded_op ggml_webgpu_binary_op(webgpu_context & ctx, @@ -2178,8 +2181,10 @@ static webgpu_encoded_op ggml_webgpu_binary_op(webgpu_context & ctx, } } - uint32_t wg_x = CEIL_DIV(ne, decisions->wg_size); - return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x); + uint32_t wg_x, wg_y; + uint32_t total_wg = CEIL_DIV(ggml_nelements(dst), decisions->wg_size); + compute_2d_workgroups(total_wg, ctx->global_ctx->capabilities.limits.maxComputeWorkgroupsPerDimension, wg_x, wg_y); + return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x, wg_y); } static webgpu_encoded_op ggml_webgpu_add_id(webgpu_context & ctx, @@ -2607,8 +2612,10 @@ static webgpu_encoded_op ggml_webgpu_scale(webgpu_context & ctx, ggml_tensor * s entries.push_back(ggml_webgpu_make_tensor_bind_group_entry(ctx, 1, dst)); } - uint32_t wg_x = CEIL_DIV(ggml_nelements(dst), decisions->wg_size); - return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x); + uint32_t wg_x, wg_y; + uint32_t total_wg = CEIL_DIV(ggml_nelements(dst), decisions->wg_size); + compute_2d_workgroups(total_wg, ctx->global_ctx->capabilities.limits.maxComputeWorkgroupsPerDimension, wg_x, wg_y); + return ggml_backend_webgpu_build(ctx, pipeline, params, entries, wg_x, wg_y); } static webgpu_encoded_op ggml_webgpu_soft_max(webgpu_context & ctx, @@ -3712,7 +3719,8 @@ static ggml_guid_t ggml_backend_webgpu_guid(void) { static void ggml_webgpu_init_memset_pipeline(webgpu_global_context & ctx) { // we use the maximum workgroup size for the memset pipeline - size_t max_threads = ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup * ctx->capabilities.limits.maxComputeWorkgroupsPerDimension; + size_t max_threads = ctx->capabilities.limits.maxComputeInvocationsPerWorkgroup * + ctx->capabilities.limits.maxComputeWorkgroupsPerDimension; // Size the bytes_per_thread so that the largest buffer size can be handled ctx->capabilities.memset_bytes_per_thread = CEIL_DIV(ctx->capabilities.limits.maxStorageBufferBindingSize, max_threads); diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl index 605de7aa7be6..ff185cae0bd6 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl @@ -130,10 +130,10 @@ fn update(dst_i: u32, src0_i: u32, src1_i: u32) { } @compute @workgroup_size(WG_SIZE) -fn main(@builtin(global_invocation_id) gid: vec3) { - if (gid.x < params.ne) { - let src0_i = params.offset_src0 + src0_index(gid.x); - let src1_i = params.offset_src1 + src1_index(gid.x); - update(params.offset_dst + gid.x, src0_i, src1_i); +fn main(@builtin(global_invocation_index) gindex: u32) { + if (gindex < params.ne) { + let src0_i = params.offset_src0 + src0_index(gindex); + let src1_i = params.offset_src1 + src1_index(gindex); + update(params.offset_dst + gindex, src0_i, src1_i); } } diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl index 3b70a876d70b..0bac4f6e770d 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl @@ -43,12 +43,12 @@ struct Params { var src: array; @compute @workgroup_size(WG_SIZE) -fn main(@builtin(global_invocation_id) gid: vec3) { - if (gid.x >= params.ne) { +fn main(@builtin(global_invocation_index) gindex: u32) { + if (gindex >= params.ne) { return; } - var i = gid.x; + var i = gindex; let i3 = i / (params.ne2 * params.ne1 * params.ne0); i = i % (params.ne2 * params.ne1 * params.ne0); let i2 = i / (params.ne1 * params.ne0); diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl index 8e34e1c9ca0b..5d2773eda719 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl @@ -66,11 +66,11 @@ fn erf_approx(x: TYPE) -> TYPE { } @compute @workgroup_size(WG_SIZE) -fn main(@builtin(global_invocation_id) gid: vec3) { - if (gid.x >= params.ne) { +fn main(@builtin(global_invocation_index) gindex: vec3) { + if (gindex >= params.ne) { return; } - var i = gid.x; + var i = gindex; let ne2 = params.ne2; #ifdef DIAG let ne1 = params.ne0; @@ -205,6 +205,6 @@ fn main(@builtin(global_invocation_id) gid: vec3) { #ifdef INPLACE src[params.offset_src + src_idx] = res; #else - dst[params.offset_dst + gid.x] = res; + dst[params.offset_dst + gindex] = res; #endif } From 8c263fdbc6ff350d8e63676463890e14f69ddb77 Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Tue, 2 Jun 2026 11:55:56 -0700 Subject: [PATCH 4/6] fix --- .github/workflows/build-webgpu.yml | 173 +++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 .github/workflows/build-webgpu.yml diff --git a/.github/workflows/build-webgpu.yml b/.github/workflows/build-webgpu.yml new file mode 100644 index 000000000000..bade95c6ab10 --- /dev/null +++ b/.github/workflows/build-webgpu.yml @@ -0,0 +1,173 @@ +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: + runs-on: ubuntu-24.04-arm + + 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-arm-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) From 3610e6bc371d6a2b439942f53ffdd3ceaeb93961 Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Tue, 2 Jun 2026 12:28:11 -0700 Subject: [PATCH 5/6] Fix type --- ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl index 5d2773eda719..9be81f63894c 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl @@ -66,7 +66,7 @@ fn erf_approx(x: TYPE) -> TYPE { } @compute @workgroup_size(WG_SIZE) -fn main(@builtin(global_invocation_index) gindex: vec3) { +fn main(@builtin(global_invocation_index) gindex: u32) { if (gindex >= params.ne) { return; } From 771a0e369de5a78cc7d412139d0c60c0f2535416 Mon Sep 17 00:00:00 2001 From: Nikhil Jain Date: Wed, 3 Jun 2026 10:52:21 -0700 Subject: [PATCH 6/6] Move back to global_invocation_id --- ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl | 13 ++++++++----- ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl | 10 ++++++---- ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl | 11 +++++++---- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl index ff185cae0bd6..f262c4a8f6a1 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl @@ -130,10 +130,13 @@ fn update(dst_i: u32, src0_i: u32, src1_i: u32) { } @compute @workgroup_size(WG_SIZE) -fn main(@builtin(global_invocation_index) gindex: u32) { - if (gindex < params.ne) { - let src0_i = params.offset_src0 + src0_index(gindex); - let src1_i = params.offset_src1 + src1_index(gindex); - update(params.offset_dst + gindex, src0_i, src1_i); +fn main(@builtin(global_invocation_id) gid: vec3, + @builtin(num_workgroups) num_wg: vec3) { + let threads_per_group = u32(WG_SIZE); + let i = gid.x + (num_wg.x * threads_per_group) * gid.y; + if (i < params.ne) { + let src0_i = params.offset_src0 + src0_index(i); + let src1_i = params.offset_src1 + src1_index(i); + update(params.offset_dst + i, src0_i, src1_i); } } diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl index 0bac4f6e770d..6c76ed69e45f 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl @@ -43,12 +43,14 @@ struct Params { var src: array; @compute @workgroup_size(WG_SIZE) -fn main(@builtin(global_invocation_index) gindex: u32) { - if (gindex >= params.ne) { +fn main( + @builtin(global_invocation_id) gid: vec3, + @builtin(num_workgroups) num_wg: vec3) { + let threads_per_group = u32(WG_SIZE); + var i = gid.x + (num_wg.x * threads_per_group) * gid.y; + if (i >= params.ne) { return; } - - var i = gindex; let i3 = i / (params.ne2 * params.ne1 * params.ne0); i = i % (params.ne2 * params.ne1 * params.ne0); let i2 = i / (params.ne1 * params.ne0); diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl index 9be81f63894c..cb342c472636 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl @@ -66,11 +66,14 @@ fn erf_approx(x: TYPE) -> TYPE { } @compute @workgroup_size(WG_SIZE) -fn main(@builtin(global_invocation_index) gindex: u32) { - if (gindex >= params.ne) { +fn main(@builtin(global_invocation_id) gid: vec3, + @builtin(num_workgroups) num_wg: vec3) { + let threads_per_group = u32(WG_SIZE); + let flat_i = gid.x + (num_wg.x * threads_per_group) * gid.y; + if (flat_i >= params.ne) { return; } - var i = gindex; + var i = flat_i; let ne2 = params.ne2; #ifdef DIAG let ne1 = params.ne0; @@ -205,6 +208,6 @@ fn main(@builtin(global_invocation_index) gindex: u32) { #ifdef INPLACE src[params.offset_src + src_idx] = res; #else - dst[params.offset_dst + gindex] = res; + dst[params.offset_dst + flat_i] = res; #endif }