name: Release on: workflow_dispatch: # allows manual triggering inputs: create_release: description: 'Create new release' required: true type: boolean push: branches: - master paths: [ '.github/workflows/release.yml', '**/CMakeLists.txt', '**/.cmake', '**/*.h', '**/*.hpp', '**/*.c', '**/*.cpp', '**/*.cu', '**/*.cuh', '**/*.swift', '**/*.m', '**/*.metal', '**/*.comp', '**/*.glsl' ] env: GH_TOKEN: ${{ github.token }} BRANCH_NAME: ${{ github.head_ref || github.ref_name }} CMAKE_ARGS: "-DLLAMA_BUILD_EXAMPLES=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_TOOLS=ON -DLLAMA_BUILD_SERVER=ON -DGGML_RPC=ON" # note: run this workflow one at a time for better cache reuse concurrency: group: release queue: max jobs: check-release: runs-on: ubuntu-slim outputs: should_release: ${{ steps.check.outputs.should_release }} steps: - id: check env: COMMIT_MESSAGE: ${{ github.event.head_commit.message }} run: | if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then echo "should_release=true" >> $GITHUB_OUTPUT elif [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == "refs/heads/master" ]]; then if echo "$COMMIT_MESSAGE" | grep -q '\[no release\]'; then echo "should_release=false" >> $GITHUB_OUTPUT else echo "should_release=true" >> $GITHUB_OUTPUT fi else echo "should_release=false" >> $GITHUB_OUTPUT fi get-version: runs-on: ubuntu-slim outputs: ui_version: ${{ steps.version.outputs.ui_version }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - id: version run: | # Resolve UI version: BUILD_NUMBER from cmake/build-info.cmake > git hash + epoch > fallback version="" if grep -q "BUILD_NUMBER" cmake/build-info.cmake; then build_number=$(grep "set(BUILD_NUMBER" cmake/build-info.cmake | grep -oP '\d+') if [ -n "$build_number" ] && [ "$build_number" -gt 0 ]; then version="b${build_number}" fi fi if [ -z "$version" ]; then version=$(git rev-parse --short HEAD)-$(date +%s) fi echo "ui_version=${version}" >> $GITHUB_OUTPUT macos-cpu: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} strategy: matrix: include: - build: 'arm64' arch: 'arm64' os: macos-26 defines: "-DGGML_METAL_EMBED_LIBRARY=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3" # TODO: this build is disabled to save Github Actions resources (https://github.com/ggml-org/llama.cpp/pull/23780) # in order to enable it again, we have to provision dedicated runners to run it #- build: 'arm64-kleidiai' # arch: 'arm64' # os: macos-14 # defines: "-DGGML_METAL_EMBED_LIBRARY=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 -DGGML_CPU_KLEIDIAI=ON" - build: 'x64' arch: 'x64' os: macos-15-intel # Metal is disabled on x64 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 defines: "-DGGML_METAL=OFF -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3" runs-on: ${{ matrix.os }} permissions: actions: write steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-${{ matrix.os }}-${{ matrix.arch }} - name: Build id: cmake_build run: | sysctl -a cmake -B build \ ${{ matrix.defines }} \ -DCMAKE_INSTALL_RPATH='@loader_path' \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DLLAMA_FATAL_WARNINGS=ON \ -DLLAMA_BUILD_BORINGSSL=ON \ -DHF_UI_VERSION=${{ needs.get-version.outputs.ui_version }} \ ${{ env.CMAKE_ARGS }} cmake --build build --config Release -j $(sysctl -n hw.logicalcpu) - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-${{ matrix.os }}-${{ matrix.arch }} - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts run: | cp LICENSE ./build/bin/ tar -czvf llama-${{ steps.tag.outputs.name }}-bin-macos-${{ matrix.build }}.tar.gz -s ",^\.,llama-${{ steps.tag.outputs.name }}," -C ./build/bin . - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-macos-${{ matrix.build }}.tar.gz name: llama-bin-macos-${{ matrix.build }}.tar.gz ubuntu-cpu: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} strategy: matrix: include: - build: 'x64' os: ubuntu-22.04 - build: 'arm64' os: ubuntu-24.04-arm - build: 's390x' os: ubuntu-24.04-s390x runs-on: ${{ matrix.os }} permissions: actions: write steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: Dependencies id: depends run: | sudo apt-get update sudo apt-get install build-essential libssl-dev - name: Toolchain workaround (GCC 14) if: ${{ contains(matrix.os, 'ubuntu-24.04') }} run: | sudo apt-get install -y gcc-14 g++-14 echo "CC=gcc-14" >> "$GITHUB_ENV" echo "CXX=g++-14" >> "$GITHUB_ENV" - name: ccache if: ${{ matrix.build != 's390x' }} uses: ggml-org/ccache-action@v1.2.21 with: key: release-${{ matrix.os }}-cpu - name: Build id: cmake_build run: | cmake -B build \ -DCMAKE_INSTALL_RPATH='$ORIGIN' \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DGGML_BACKEND_DL=ON \ -DGGML_NATIVE=OFF \ -DGGML_CPU_ALL_VARIANTS=ON \ -DLLAMA_FATAL_WARNINGS=ON \ -DHF_UI_VERSION=${{ needs.get-version.outputs.ui_version }} \ ${{ env.CMAKE_ARGS }} cmake --build build --config Release -j $(nproc) - name: ccache-clear if: ${{ matrix.build != 's390x' }} uses: ./.github/actions/ccache-clear with: key: release-${{ matrix.os }}-cpu - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts run: | cp LICENSE ./build/bin/ tar -czvf llama-${{ steps.tag.outputs.name }}-bin-ubuntu-${{ matrix.build }}.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./build/bin . - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-ubuntu-${{ matrix.build }}.tar.gz name: llama-bin-ubuntu-${{ matrix.build }}.tar.gz ubuntu-vulkan: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} strategy: matrix: include: - build: 'x64' os: ubuntu-22.04 - build: 'arm64' os: ubuntu-24.04-arm runs-on: ${{ matrix.os }} permissions: actions: write steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: Dependencies id: depends run: | if [[ "${{ matrix.os }}" =~ "ubuntu-22.04" ]]; then wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add - sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list sudo apt-get update -y sudo apt-get install -y build-essential mesa-vulkan-drivers vulkan-sdk libssl-dev else sudo apt-get update -y sudo apt-get install -y gcc-14 g++-14 build-essential glslc libvulkan-dev spirv-headers libssl-dev ninja-build echo "CC=gcc-14" >> "$GITHUB_ENV" echo "CXX=g++-14" >> "$GITHUB_ENV" fi - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-${{ matrix.os }}-vulkan - name: Build id: cmake_build run: | cmake -B build \ -DCMAKE_INSTALL_RPATH='$ORIGIN' \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DGGML_BACKEND_DL=ON \ -DGGML_NATIVE=OFF \ -DGGML_CPU_ALL_VARIANTS=ON \ -DGGML_VULKAN=ON \ -DHF_UI_VERSION=${{ needs.get-version.outputs.ui_version }} \ ${{ env.CMAKE_ARGS }} cmake --build build --config Release -j $(nproc) - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-${{ matrix.os }}-vulkan - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts run: | cp LICENSE ./build/bin/ tar -czvf llama-${{ steps.tag.outputs.name }}-bin-ubuntu-vulkan-${{ matrix.build }}.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./build/bin . - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-ubuntu-vulkan-${{ matrix.build }}.tar.gz name: llama-bin-ubuntu-vulkan-${{ matrix.build }}.tar.gz android-arm64: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: ubuntu-latest #permissions: # actions: write env: NDK_VERSION: "29.0.14206865" steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: Set up JDK uses: actions/setup-java@v5 with: java-version: 17 distribution: temurin - name: Setup Android SDK uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1 with: log-accepted-android-sdk-licenses: false - name: Install NDK run: | sdkmanager "ndk;${{ env.NDK_VERSION }}" echo "ANDROID_NDK=${ANDROID_SDK_ROOT}/ndk/${{ env.NDK_VERSION }}" >> $GITHUB_ENV # note : disabled to spare some cache space (https://github.com/ggml-org/llama.cpp/pull/23789) # for some reason, the ccache does not improve the build time in this case # example: # cache off: https://github.com/ggerganov/tmp2/actions/runs/26534713799/job/78160400831 # cache on: https://github.com/ggerganov/tmp2/actions/runs/26534713799/job/78224189394 # #- name: ccache # uses: ggml-org/ccache-action@v1.2.21 # with: # key: release-android-arm64 - name: Build id: cmake_build run: | cmake -B build \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-28 \ -DCMAKE_INSTALL_RPATH='$ORIGIN' \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DGGML_BACKEND_DL=ON \ -DGGML_NATIVE=OFF \ -DGGML_CPU_ALL_VARIANTS=ON \ -DLLAMA_FATAL_WARNINGS=ON \ -DGGML_OPENMP=OFF \ -DLLAMA_BUILD_BORINGSSL=ON \ -DHF_UI_VERSION=${{ needs.get-version.outputs.ui_version }} \ ${{ env.CMAKE_ARGS }} cmake --build build --config Release -j $(nproc) #- name: ccache-clear # uses: ./.github/actions/ccache-clear # with: # key: release-android-arm64 - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts run: | cp LICENSE ./build/bin/ tar -czvf llama-${{ steps.tag.outputs.name }}-bin-android-arm64.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./build/bin . - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-android-arm64.tar.gz name: llama-bin-android-arm64.tar.gz ubuntu-24-openvino: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: ubuntu-24.04 permissions: actions: write outputs: openvino_version: ${{ steps.openvino_version.outputs.value }} env: # Sync versions in build-openvino.yml, build-self-hosted.yml, release.yml, build-cache.yml, .devops/openvino.Dockerfile OPENVINO_VERSION_MAJOR: "2026.2.1" OPENVINO_VERSION_FULL: "2026.2.1.21919.ede283a88e3" steps: - name: Set OpenVINO version output id: openvino_version run: echo "value=${{ env.OPENVINO_VERSION_MAJOR }}" >> $GITHUB_OUTPUT - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-ubuntu-24.04-openvino-release-no-preset-v1 - name: Dependencies run: | sudo apt-get update sudo apt-get install -y build-essential libssl-dev libtbb12 cmake ninja-build python3-pip sudo apt install ocl-icd-opencl-dev opencl-headers opencl-clhpp-headers intel-opencl-icd - name: Use OpenVINO Toolkit Cache uses: actions/cache@v5 id: cache-openvino with: path: ./openvino_toolkit key: cache-gha-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 \ -DCMAKE_INSTALL_RPATH='$ORIGIN' \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DHF_UI_VERSION=${{ needs.get-version.outputs.ui_version }} \ ${{ env.CMAKE_ARGS }} cmake --build build/ReleaseOV --config Release --parallel - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-ubuntu-24.04-openvino-release-no-preset-v1 - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts run: | dest=./build/ReleaseOV/bin OPENVINO_ROOT=./openvino_toolkit ov_lib="$OPENVINO_ROOT/runtime/lib/intel64" # Bundle OpenVINO runtime libs + TBB. Binaries built with RPATH=$ORIGIN # load these siblings without setupvars.sh / LD_LIBRARY_PATH. cp -P "$ov_lib"/libopenvino.so* \ "$ov_lib"/libopenvino_c.so* \ "$ov_lib"/libopenvino_*_plugin.so \ "$ov_lib"/libopenvino_intel_npu_compiler*.so \ "$OPENVINO_ROOT"/runtime/3rdparty/tbb/lib/*.so* \ "$dest" cp -P /usr/lib/x86_64-linux-gnu/libOpenCL.so.1* "$dest" 2>/dev/null || true cp "$ov_lib"/cache.json "$dest" 2>/dev/null || true # OpenVINO licensing cp -r "$OPENVINO_ROOT"/docs/licensing "$dest"/openvino-licensing cp LICENSE "$dest" tar -czvf llama-${{ steps.tag.outputs.name }}-bin-ubuntu-openvino-${{ env.OPENVINO_VERSION_MAJOR }}-x64.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C "$dest" . - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-ubuntu-openvino-${{ env.OPENVINO_VERSION_MAJOR }}-x64.tar.gz name: llama-bin-ubuntu-openvino-${{ env.OPENVINO_VERSION_MAJOR }}-x64.tar.gz windows-openvino: needs: [check-release] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: windows-2022 outputs: openvino_version: ${{ steps.openvino_version.outputs.value }} env: # Sync versions in build-openvino.yml, build-self-hosted.yml, release.yml, build-cache.yml, .devops/openvino.Dockerfile OPENVINO_VERSION_MAJOR: "2026.2.1" OPENVINO_VERSION_FULL: "2026.2.1.21919.ede283a88e3" steps: - name: Set OpenVINO version output id: openvino_version shell: bash run: echo "value=${{ env.OPENVINO_VERSION_MAJOR }}" >> $GITHUB_OUTPUT - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-windows-2022-openvino variant: ccache evict-old-files: 1d - name: Setup Cache uses: actions/cache@v5 id: cache-openvino with: path: ./openvino_toolkit key: cache-gha-openvino-toolkit-v${{ env.OPENVINO_VERSION_FULL }}-${{ runner.os }} - name: Setup OpenVINO Toolkit if: steps.cache-openvino.outputs.cache-hit != 'true' uses: ./.github/actions/windows-setup-openvino with: path: ./openvino_toolkit version_major: ${{ env.OPENVINO_VERSION_MAJOR }} version_full: ${{ env.OPENVINO_VERSION_FULL }} - name: Install OpenCL using vcpkg shell: powershell run: | git clone https://github.com/microsoft/vcpkg C:\vcpkg C:\vcpkg\bootstrap-vcpkg.bat C:\vcpkg\vcpkg install opencl - name: Build id: cmake_build shell: cmd run: | REM Find extracted OpenVINO folder dynamically for /d %%i in (openvino_toolkit\*) do set OPENVINO_ROOT=%%i if not exist "%OPENVINO_ROOT%\runtime\cmake\OpenVINOConfig.cmake" ( echo ERROR: OpenVINOConfig.cmake not found exit /b 1 ) call "%OPENVINO_ROOT%\setupvars.bat" cmake -B build\ReleaseOV -G "Visual Studio 17 2022" ^ -A x64 ^ -DCMAKE_BUILD_TYPE=Release ^ -DGGML_OPENVINO=ON ^ -DLLAMA_BUILD_BORINGSSL=ON ^ -DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake ^ ${{ env.CMAKE_ARGS }} cmake --build build\ReleaseOV --config Release -- /m - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-windows-2022-openvino - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts shell: powershell run: | # Locate the extracted OpenVINO toolkit root (same pattern as the Build step). $OPENVINO_ROOT = (Get-ChildItem -Directory openvino_toolkit | Select-Object -First 1).FullName if (-not $OPENVINO_ROOT) { Write-Error "OpenVINO toolkit folder not found under .\openvino_toolkit" exit 1 } $dest = ".\build\ReleaseOV\bin\Release" $ovBin = Join-Path $OPENVINO_ROOT 'runtime\bin\intel64\Release' Copy-Item -Path (Join-Path $ovBin '*.dll') -Destination $dest -Force Copy-Item -Path (Join-Path $ovBin 'cache.json') -Destination $dest -Force $tbbBin = Join-Path $OPENVINO_ROOT 'runtime\3rdparty\tbb\bin' Copy-Item -Path (Join-Path $tbbBin 'tbb*.dll') -Destination $dest -Force # OpenVINO licensing $licensingDest = Join-Path $dest 'openvino-licensing' New-Item -ItemType Directory -Force -Path $licensingDest | Out-Null Copy-Item -Path (Join-Path $OPENVINO_ROOT 'docs\licensing\*') -Destination $licensingDest -Recurse -Force Copy-Item LICENSE $dest 7z a -snl llama-${{ steps.tag.outputs.name }}-bin-win-openvino-${{ env.OPENVINO_VERSION_MAJOR }}-x64.zip $dest\* - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-win-openvino-${{ env.OPENVINO_VERSION_MAJOR }}-x64.zip name: llama-bin-win-openvino-${{ env.OPENVINO_VERSION_MAJOR }}-x64.zip windows-cpu: needs: [check-release] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: windows-2025-vs2026 permissions: actions: write strategy: matrix: include: - arch: 'x64' - arch: 'arm64' steps: - name: Clone uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: Install Ninja run: | choco install ninja - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-windows-2025-vs2026-${{ matrix.arch }}-cpu - name: Build shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.arch == 'x64' && 'x64' || 'amd64_arm64' }} cmake -S . -B build -G "Ninja Multi-Config" ^ -D CMAKE_TOOLCHAIN_FILE=cmake/${{ matrix.arch }}-windows-llvm.cmake ^ -DLLAMA_BUILD_BORINGSSL=ON ^ -DGGML_NATIVE=OFF ^ -DGGML_BACKEND_DL=ON ^ -DGGML_CPU_ALL_VARIANTS=${{ matrix.arch == 'x64' && 'ON' || 'OFF' }} ^ -DGGML_OPENMP=ON ^ ${{ env.CMAKE_ARGS }} cmake --build build --config Release - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-windows-2025-vs2026-${{ matrix.arch }}-cpu - name: Pack artifacts id: pack_artifacts run: | Copy-Item "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Redist\MSVC\14.51.36231\debug_nonredist\${{ matrix.arch }}\Microsoft.VC145.OpenMP.LLVM\libomp140.${{ matrix.arch == 'x64' && 'x86_64' || 'aarch64' }}.dll" .\build\bin\Release\ 7z a -snl llama-bin-win-cpu-${{ matrix.arch }}.zip .\build\bin\Release\* - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-bin-win-cpu-${{ matrix.arch }}.zip name: llama-bin-win-cpu-${{ matrix.arch }}.zip windows-rocm: needs: [check-release] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: windows-2022 strategy: matrix: include: - ROCM_VERSION: "7.14.0" gpu_targets: "gfx1010;gfx1011;gfx1012;gfx1030;gfx1031;gfx1032;gfx1033;gfx1034;gfx1035;gfx1036;gfx1100;gfx1101;gfx1102;gfx1103;gfx1150;gfx1151;gfx1152;gfx1153;gfx1200;gfx1201" build: x64 steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: windows-rocm-${{ matrix.ROCM_VERSION }}-${{ matrix.build }} evict-old-files: 1d - name: Cache ROCm Installation id: cache-rocm uses: actions/cache@v5 with: path: C:\TheRock\build key: rocm-wheels-${{ matrix.ROCM_VERSION }}-multi-arch-${{ runner.os }} - name: Setup ROCm if: steps.cache-rocm.outputs.cache-hit != 'true' uses: ./.github/actions/windows-setup-rocm with: version: ${{ matrix.ROCM_VERSION }} - name: Setup ROCm Environment run: | $ErrorActionPreference = "Stop" # Activate venv from cache or fresh install & C:\TheRock\build\.venv\Scripts\Activate.ps1 # Expand the devel tree (idempotent; no-op if already done during install) rocm-sdk init if ($LASTEXITCODE -ne 0) { throw "rocm-sdk init failed with exit code $LASTEXITCODE" } # Get ROCm installation paths using the rocm-sdk CLI tool $rocmPath = (rocm-sdk path --root) if (-not $rocmPath) { throw "rocm-sdk path --root returned empty - devel package may not be installed" } $rocmPath = $rocmPath.Trim() $cmakePath = (rocm-sdk path --cmake).Trim() $binPath = (rocm-sdk path --bin).Trim() write-host "ROCm root: $rocmPath" write-host "CMake path: $cmakePath" write-host "Bin path: $binPath" echo "HIP_PATH=$rocmPath" >> $env:GITHUB_ENV echo "CMAKE_PREFIX_PATH=$cmakePath" >> $env:GITHUB_ENV echo "HIP_DEVICE_LIB_PATH=$rocmPath\lib\llvm\amdgcn\bitcode" >> $env:GITHUB_ENV echo "HIP_PLATFORM=amd" >> $env:GITHUB_ENV echo "LLVM_PATH=$rocmPath\lib\llvm" >> $env:GITHUB_ENV echo "$binPath" >> $env:GITHUB_PATH # Keep venv in PATH for subsequent steps echo "C:\TheRock\build\.venv\Scripts" >> $env:GITHUB_PATH - name: Build run: | mkdir build cd build cmake .. ` -G "Unix Makefiles" ` -DCMAKE_PREFIX_PATH="${env:HIP_PATH}" ` -DCMAKE_BUILD_TYPE=Release ` -DGGML_BACKEND_DL=ON ` -DGGML_NATIVE=OFF ` -DGGML_CPU=ON ` -DGGML_CPU_ALL_VARIANTS=ON ` -DGGML_HIP=ON ` -DCMAKE_C_COMPILER="${env:HIP_PATH}\lib\llvm\bin\clang.exe" ` -DCMAKE_CXX_COMPILER="${env:HIP_PATH}\lib\llvm\bin\clang++.exe" ` -DCMAKE_C_FLAGS="-Wno-error=incompatible-pointer-types" ` -DCMAKE_HIP_COMPILER="${env:HIP_PATH}\lib\llvm\bin\clang.exe" ` -DHIP_PATH="${env:HIP_PATH}" ` -DGGML_HIP_ROCWMMA_FATTN=ON ` -DAMDGPU_TARGETS="${{ matrix.gpu_targets }}" cmake --build . --config Release --parallel ${env:NUMBER_OF_PROCESSORS} - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: windows-rocm-${{ matrix.ROCM_VERSION }}-${{ matrix.build }} - name: Verify HIP backend was built run: | $hipDll = Get-ChildItem -Path build\bin -Filter "ggml-hip*.dll" -ErrorAction SilentlyContinue if (-not $hipDll) { Write-Host "##[error]ggml-hip*.dll was NOT produced. The HIP backend silently failed to build." Write-Host "Contents of build\bin:" Get-ChildItem build\bin | Format-Table -AutoSize exit 1 } Write-Host "HIP backend artifact found:" $hipDll | Format-Table FullName, Length -AutoSize - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Get ROCm short version run: | $rocmVersionShort = ('${{ matrix.ROCM_VERSION }}'.Split('.')[0..1] -join '.') echo "ROCM_VERSION_SHORT=$rocmVersionShort" >> $env:GITHUB_ENV - name: Pack artifacts run: | cp "LICENSE" "build\bin\" 7z a -snl llama-bin-win-rocm-${{ env.ROCM_VERSION_SHORT }}-${{ matrix.build }}.zip .\build\bin\* - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-bin-win-rocm-${{ env.ROCM_VERSION_SHORT }}-${{ matrix.build }}.zip name: llama-bin-win-rocm-${{ env.ROCM_VERSION_SHORT }}-${{ matrix.build }}.zip windows: needs: [check-release] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: windows-2025 permissions: actions: write env: OPENBLAS_VERSION: 0.3.23 VULKAN_VERSION: 1.4.357.0 strategy: matrix: include: - backend: 'vulkan' arch: 'x64' defines: '-DGGML_VULKAN=ON' target: 'ggml-vulkan' - backend: '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' target: 'ggml-opencl' steps: - name: Clone id: checkout uses: actions/checkout@v6 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: Install Vulkan SDK id: get_vulkan if: ${{ matrix.backend == 'vulkan' }} 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 # TODO: these jobs need to use llvm toolchain in order to utilize the ccache #- name: ccache # uses: ggml-org/ccache-action@v1.2.21 # with: # key: release-windows-2025-${{ matrix.arch }}-${{ matrix.backend }} - name: Install OpenCL Headers and Libs id: install_opencl if: ${{ matrix.backend == 'opencl-adreno' && matrix.arch == 'arm64' }} 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 }} -DGGML_NATIVE=OFF -DGGML_CPU=OFF -DGGML_BACKEND_DL=ON -DLLAMA_BUILD_BORINGSSL=ON cmake --build build --config Release --target ${{ matrix.target }} #- name: ccache-clear # uses: ./.github/actions/ccache-clear # with: # key: release-windows-2025-${{ matrix.arch }}-${{ matrix.backend }} - name: Pack artifacts id: pack_artifacts run: | 7z a -snl llama-bin-win-${{ matrix.backend }}-${{ matrix.arch }}.zip .\build\bin\Release\${{ matrix.target }}.dll - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-bin-win-${{ matrix.backend }}-${{ matrix.arch }}.zip name: llama-bin-win-${{ matrix.backend }}-${{ matrix.arch }}.zip windows-cuda: name: windows-cuda (${{ matrix.cuda }}, ${{ matrix.arch }}) needs: [check-release] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: windows-2022 permissions: actions: write strategy: matrix: include: - cuda: '12.4' arch: x64 defines: '-DGGML_CUDA_CUB_3DOT2=ON' - cuda: '13.3' arch: x64 defines: '' - cuda: '13.4' arch: arm64 defines: '-DCMAKE_TOOLCHAIN_FILE=cmake/arm64-windows-msvc-cuda.cmake' steps: - name: Clone id: checkout uses: actions/checkout@v6 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: Install Cuda Toolkit uses: ./.github/actions/windows-setup-cuda with: cuda_version: ${{ matrix.cuda }} cuda_arch: ${{ matrix.arch }} - name: Install Ninja id: install_ninja run: | choco install ninja - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-windows-2022-${{ matrix.arch }}-cuda-${{ matrix.cuda }} - 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" ${{ matrix.arch == 'x64' && 'x64' || 'amd64_arm64' }} cmake -S . -B build -G "Ninja Multi-Config" ^ -DGGML_BACKEND_DL=ON ^ -DGGML_NATIVE=OFF ^ -DGGML_CPU=OFF ^ -DGGML_CUDA=ON ^ -DLLAMA_BUILD_BORINGSSL=ON ${{ matrix.defines }} set /A NINJA_JOBS=%NUMBER_OF_PROCESSORS%-1 cmake --build build --config Release -j %NINJA_JOBS% --target ggml-cuda - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-windows-2022-${{ matrix.arch }}-cuda-${{ matrix.cuda }} - name: Pack artifacts id: pack_artifacts run: | 7z a -snl llama-bin-win-cuda-${{ matrix.cuda }}-${{ matrix.arch }}.zip .\build\bin\Release\ggml-cuda.dll - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-bin-win-cuda-${{ matrix.cuda }}-${{ matrix.arch }}.zip name: llama-bin-win-cuda-${{ matrix.cuda }}-${{ matrix.arch }}.zip - name: Copy and pack Cuda runtime (x64) if: ${{ matrix.arch == 'x64' }} run: | echo "Cuda install location: ${{ env.CUDA_PATH }}" $dst='.\build\bin\cudart\' robocopy "${{env.CUDA_PATH}}\bin" $dst cudart64_*.dll cublas64_*.dll cublasLt64_*.dll robocopy "${{env.CUDA_PATH}}\lib" $dst cudart64_*.dll cublas64_*.dll cublasLt64_*.dll robocopy "${{env.CUDA_PATH}}\bin\x64" $dst cudart64_*.dll cublas64_*.dll cublasLt64_*.dll 7z a cudart-llama-bin-win-cuda-${{ matrix.cuda }}-${{ matrix.arch }}.zip $dst\* - name: Copy and pack Cuda runtime (ARM64) if: ${{ matrix.arch == 'arm64' }} run: | echo "Cuda install location: ${{ env.CUDA_PATH }}" $dst='.\build\bin\cudart\' robocopy "${{env.CUDA_PATH}}\bin\arm64" $dst cudart64_*.dll cublas64_*.dll cublasLt64_*.dll 7z a cudart-llama-bin-win-cuda-${{ matrix.cuda }}-${{ matrix.arch }}.zip $dst\* - name: Upload Cuda runtime uses: actions/upload-artifact@v6 with: path: cudart-llama-bin-win-cuda-${{ matrix.cuda }}-${{ matrix.arch }}.zip name: cudart-llama-bin-win-cuda-${{ matrix.cuda }}-${{ matrix.arch }}.zip windows-sycl: needs: [check-release] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: windows-2022 defaults: run: shell: bash env: WINDOWS_BASEKIT_URL: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/b60765d1-2b85-4e85-86b6-cb0e9563a699/intel-deep-learning-essentials-2025.3.3.18_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 LEVEL_ZERO_SDK_URL: https://github.com/oneapi-src/level-zero/releases/download/v1.28.2/level-zero-win-sdk-1.28.2.zip ONEAPI_ROOT: "C:/Program Files (x86)/Intel/oneAPI" ONEAPI_INSTALLER_VERSION: "2025.3.3" steps: - name: Clone id: checkout uses: actions/checkout@v6 - name: Download & Install oneAPI shell: bash run: | scripts/install-oneapi.bat $WINDOWS_BASEKIT_URL $WINDOWS_DPCPP_MKL - name: Install Level Zero SDK shell: pwsh run: | Invoke-WebRequest -Uri "${{ env.LEVEL_ZERO_SDK_URL }}" -OutFile "level-zero-win-sdk.zip" Expand-Archive -Path "level-zero-win-sdk.zip" -DestinationPath "C:/level-zero-sdk" -Force "LEVEL_ZERO_V1_SDK_PATH=C:/level-zero-sdk" | Out-File -FilePath $env:GITHUB_ENV -Append - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-windows-2022-x64-sycl - name: Build id: cmake_build shell: cmd run: | call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" intel64 --force cmake -G "Ninja" -B build ^ -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=icx ^ -DCMAKE_BUILD_TYPE=Release ^ -DGGML_BACKEND_DL=ON -DBUILD_SHARED_LIBS=ON ^ -DGGML_CPU=OFF -DGGML_SYCL=ON ^ -DLLAMA_BUILD_BORINGSSL=ON cmake --build build --target ggml-sycl -j %NUMBER_OF_PROCESSORS% - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-windows-2022-x64-sycl - name: Build the release package id: pack_artifacts run: | echo "cp oneAPI running time dll files in ${{ env.ONEAPI_ROOT }} to ./build/bin" cp "${{ env.ONEAPI_ROOT }}/mkl/latest/bin/mkl_sycl_blas.5.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/mkl/latest/bin/mkl_core.2.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/mkl/latest/bin/mkl_tbb_thread.2.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/ur_adapter_level_zero.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/ur_adapter_level_zero_v2.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/ur_adapter_opencl.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/ur_loader.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/ur_win_proxy_loader.dll" ./build/bin ZE_LOADER_DLL=$(find "${{ env.ONEAPI_ROOT }}" "$LEVEL_ZERO_V1_SDK_PATH" -iname ze_loader.dll -print -quit 2>/dev/null || true) if [ -n "$ZE_LOADER_DLL" ]; then echo "Using Level Zero loader: $ZE_LOADER_DLL" cp "$ZE_LOADER_DLL" ./build/bin else echo "Level Zero loader DLL not found in oneAPI or SDK; relying on system driver/runtime" fi cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/sycl8.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/svml_dispmd.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/libmmd.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/libiomp5md.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/sycl-ls.exe" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/libsycl-fallback-bfloat16.spv" ./build/bin cp "${{ env.ONEAPI_ROOT }}/compiler/latest/bin/libsycl-native-bfloat16.spv" ./build/bin cp "${{ env.ONEAPI_ROOT }}/dnnl/latest/bin/dnnl.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/tbb/latest/bin/tbb12.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/tcm/latest/bin/tcm.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/tcm/latest/bin/libhwloc-15.dll" ./build/bin cp "${{ env.ONEAPI_ROOT }}/umf/latest/bin/umf.dll" ./build/bin echo "cp oneAPI running time dll files to ./build/bin done" 7z a -snl llama-bin-win-sycl-x64.zip ./build/bin/* - name: Upload the release package uses: actions/upload-artifact@v6 with: path: llama-bin-win-sycl-x64.zip name: llama-bin-win-sycl-x64.zip ubuntu-24-sycl: needs: [check-release] if: ${{ needs.check-release.outputs.should_release == 'true' }} strategy: matrix: build: [fp32, fp16] include: - build: fp32 fp16: OFF - build: fp16 fp16: ON runs-on: ubuntu-24.04 env: ONEAPI_ROOT: /opt/intel/oneapi/ ONEAPI_INSTALLER_VERSION: "2025.3.3" LEVEL_ZERO_VERSION: "1.28.2" LEVEL_ZERO_UBUNTU_VERSION: "u24.04" steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Download & Install oneAPI shell: bash run: | cd /tmp wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/56f7923a-adb8-43f3-8b02-2b60fcac8cab/intel-deep-learning-essentials-2025.3.3.16_offline.sh -O intel-deep-learning-essentials_offline.sh sudo bash intel-deep-learning-essentials_offline.sh -s -a --silent --eula accept - name: Install Level Zero SDK shell: bash run: | cd /tmp wget -q "https://github.com/oneapi-src/level-zero/releases/download/v${LEVEL_ZERO_VERSION}/level-zero_${LEVEL_ZERO_VERSION}%2B${LEVEL_ZERO_UBUNTU_VERSION}_amd64.deb" -O level-zero.deb wget -q "https://github.com/oneapi-src/level-zero/releases/download/v${LEVEL_ZERO_VERSION}/level-zero-devel_${LEVEL_ZERO_VERSION}%2B${LEVEL_ZERO_UBUNTU_VERSION}_amd64.deb" -O level-zero-devel.deb sudo apt-get install -y ./level-zero.deb ./level-zero-devel.deb - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-ubuntu-24.04-sycl-${{ matrix.build }} - 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 \ -DCMAKE_INSTALL_RPATH='$ORIGIN' \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DLLAMA_OPENSSL=OFF \ -DGGML_NATIVE=OFF \ -DGGML_SYCL_F16=${{ matrix.fp16 }} time cmake --build build --config Release -j $(nproc) - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-ubuntu-24.04-sycl-${{ matrix.build }} - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts run: | cp LICENSE ./build/bin/ tar -czvf llama-${{ steps.tag.outputs.name }}-bin-ubuntu-sycl-${{ matrix.build }}-x64.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./build/bin . - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-ubuntu-sycl-${{ matrix.build }}-x64.tar.gz name: llama-bin-ubuntu-sycl-${{ matrix.build }}-x64.tar.gz ubuntu-22-rocm: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: ubuntu-22.04 permissions: actions: write strategy: matrix: include: - ROCM_VERSION: "7.14.0" gpu_targets: "gfx908;gfx90a;gfx942;gfx950;gfx1010;gfx1011;gfx1012;gfx1030;gfx1031;gfx1032;gfx1033;gfx1034;gfx1035;gfx1036;gfx1100;gfx1101;gfx1102;gfx1150;gfx1151;gfx1152;gfx1200;gfx1201" build: 'x64' steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: "24" cache: "npm" cache-dependency-path: "tools/ui/package-lock.json" - name: Free up disk space uses: ggml-org/free-disk-space@v1.3.1 with: tool-cache: true - name: ccache uses: ggml-org/ccache-action@v1.2.21 with: key: release-ubuntu-22.04-rocm-${{ matrix.ROCM_VERSION }} - name: Dependencies id: depends run: | sudo apt install -y build-essential git cmake wget - name: Setup TheRock with Wheels id: therock_env run: | # Create Python virtual environment python3 -m venv .venv source .venv/bin/activate # Install ROCm wheels for build # libraries = HIP runtime and CMake configs needed for linking # devel = compilers, headers, static libs python -m pip install --upgrade pip python -m pip install --index-url https://repo.amd.com/rocm/whl-multi-arch/ "rocm[libraries,devel]==${{ matrix.ROCM_VERSION }}" # Get ROCm installation paths using the rocm-sdk CLI tool ROCM_PATH=$(rocm-sdk path --root) CMAKE_PATH=$(rocm-sdk path --cmake) BIN_PATH=$(rocm-sdk path --bin) echo "ROCM_PATH=$ROCM_PATH" echo "CMAKE_PATH=$CMAKE_PATH" echo "BIN_PATH=$BIN_PATH" # Set environment variables echo "ROCM_PATH=$ROCM_PATH" >> $GITHUB_ENV echo "CMAKE_PREFIX_PATH=$CMAKE_PATH" >> $GITHUB_ENV echo "HIP_PATH=$ROCM_PATH" >> $GITHUB_ENV echo "PATH=$BIN_PATH:${PATH}" >> $GITHUB_ENV echo "LD_LIBRARY_PATH=$ROCM_PATH/lib:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV # Keep venv activated for subsequent steps echo "$(pwd)/.venv/bin" >> $GITHUB_PATH - name: Build with native CMake HIP support id: cmake_build run: | cmake -B build -S . \ -DCMAKE_HIP_COMPILER="$(hipconfig -l)/clang" \ -DCMAKE_BUILD_TYPE=Release \ -DGGML_BACKEND_DL=ON \ -DGGML_NATIVE=OFF \ -DCMAKE_INSTALL_RPATH='$ORIGIN' \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DGGML_CPU_ALL_VARIANTS=ON \ -DGPU_TARGETS="${{ matrix.gpu_targets }}" \ -DGGML_HIP=ON \ -DHIP_PLATFORM=amd \ -DHF_UI_VERSION=${{ needs.get-version.outputs.ui_version }} \ ${{ env.CMAKE_ARGS }} cmake --build build --config Release -j $(nproc) - name: ccache-clear uses: ./.github/actions/ccache-clear with: key: release-ubuntu-22.04-rocm-${{ matrix.ROCM_VERSION }} - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Get ROCm short version run: echo "ROCM_VERSION_SHORT=$(echo '${{ matrix.ROCM_VERSION }}' | cut -d '.' -f 1,2)" >> $GITHUB_ENV - name: Pack artifacts id: pack_artifacts run: | cp LICENSE ./build/bin/ tar -czvf llama-${{ steps.tag.outputs.name }}-bin-ubuntu-rocm-${{ env.ROCM_VERSION_SHORT }}-${{ matrix.build }}.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./build/bin . - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-bin-ubuntu-rocm-${{ env.ROCM_VERSION_SHORT }}-${{ matrix.build }}.tar.gz name: llama-bin-ubuntu-rocm-${{ env.ROCM_VERSION_SHORT }}-${{ matrix.build }}.tar.gz ios-xcode: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} runs-on: macos-26 steps: - name: Checkout code uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Xcode run: | sudo xcode-select -s /Applications/Xcode_26.4.app - name: Build id: cmake_build run: | sysctl -a cmake -B build -G Xcode \ -DGGML_METAL_EMBED_LIBRARY=ON \ -DLLAMA_OPENSSL=OFF \ -DLLAMA_BUILD_APP=OFF \ -DLLAMA_BUILD_EXAMPLES=OFF \ -DLLAMA_BUILD_TOOLS=OFF \ -DLLAMA_BUILD_TESTS=OFF \ -DLLAMA_BUILD_SERVER=OFF \ -DCMAKE_SYSTEM_NAME=iOS \ -DCMAKE_OSX_DEPLOYMENT_TARGET=16.0 \ -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=ggml \ -DHF_UI_VERSION=${{ needs.get-version.outputs.ui_version }} cmake --build build --config Release -j $(sysctl -n hw.logicalcpu) -- CODE_SIGNING_ALLOWED=NO - name: xcodebuild for swift package id: xcodebuild run: | ./build-xcframework.sh - name: Build Xcode project run: xcodebuild -project examples/llama.swiftui/llama.swiftui.xcodeproj -scheme llama.swiftui -sdk iphoneos CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= -destination 'generic/platform=iOS' FRAMEWORK_FOLDER_PATH=./build-ios build - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Pack artifacts id: pack_artifacts run: | # Zip file is required for Swift Package Manager, which does not support tar.gz for binary targets. # For more details, see https://developer.apple.com/documentation/xcode/distributing-binary-frameworks-as-swift-packages zip -r -y llama-${{ steps.tag.outputs.name }}-xcframework.zip build-apple/llama.xcframework - name: Upload artifacts uses: actions/upload-artifact@v6 with: path: llama-${{ steps.tag.outputs.name }}-xcframework.zip name: llama-${{ steps.tag.outputs.name }}-xcframework.zip # TODO: this build is disabled to save Github Actions resources (https://github.com/ggml-org/llama.cpp/pull/23705) # in order to enable it again, we have to provision dedicated runners to run it # openEuler-cann: # strategy: # matrix: # include: # # 910b with aclgraph (both architectures) # - arch: x86 # chip_type: '910b' # build: 'Release' # use_acl_graph: 'on' # - arch: aarch64 # chip_type: '910b' # build: 'Release' # use_acl_graph: 'on' # # 310p without aclgraph (both architectures) # - arch: x86 # chip_type: '310p' # build: 'Release' # use_acl_graph: 'off' # - arch: aarch64 # chip_type: '310p' # build: 'Release' # use_acl_graph: 'off' # runs-on: ${{ matrix.arch == 'aarch64' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} # steps: # - name: Checkout # uses: actions/checkout@v6 # with: # fetch-depth: 0 # # - name: Free up disk space # uses: ggml-org/free-disk-space@v1.3.1 # with: # tool-cache: true # # - name: Set container image # id: cann-image # run: | # image="ascendai/cann:${{ matrix.chip_type == '910b' && '8.5.0-910b-openeuler24.03-py3.11' || '8.5.0-310p-openeuler24.03-py3.11' }}" # echo "image=${image}" >> "${GITHUB_OUTPUT}" # # - name: Pull container image # run: docker pull "${{ steps.cann-image.outputs.image }}" # # - name: Build # env: # BUILD_TYPE: ${{ matrix.build }} # SOC_TYPE: ascend${{ matrix.chip_type }} # USE_ACL_GRAPH: ${{ matrix.use_acl_graph }} # run: | # HOST_UID=$(id -u) # HOST_GID=$(id -g) # # docker run --rm \ # -v "${PWD}:/workspace" \ # -w /workspace \ # -e SOC_TYPE=${SOC_TYPE} \ # -e BUILD_TYPE=${BUILD_TYPE} \ # -e USE_ACL_GRAPH=${USE_ACL_GRAPH} \ # "${{ steps.cann-image.outputs.image }}" \ # bash -lc ' # set -e # yum install -y --setopt=install_weak_deps=False --setopt=tsflags=nodocs git gcc gcc-c++ make cmake openssl-devel # yum clean all && rm -rf /var/cache/yum # git config --global --add safe.directory "/workspace" # export LD_LIBRARY_PATH=${ASCEND_TOOLKIT_HOME}/lib64:${ASCEND_TOOLKIT_HOME}/$(uname -m)-linux/devlib/:${LD_LIBRARY_PATH} # cmake -S . -B build \ # -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ # -DGGML_CANN=on \ # -DSOC_TYPE=${SOC_TYPE} \ # -DUSE_ACL_GRAPH=${USE_ACL_GRAPH} # cmake --build build -j $(nproc) # # chown -R '"${HOST_UID}"':'"${HOST_GID}"' /workspace/build # ' # # - name: Determine tag name # id: tag # uses: ./.github/actions/get-tag-name # # - name: Pack artifacts # run: | # cp LICENSE ./build/bin/ # tar -czvf llama-${{ steps.tag.outputs.name }}-bin-${{ matrix.chip_type }}-openEuler-${{ matrix.arch }}${{ matrix.use_acl_graph == 'on' && '-aclgraph' || '' }}.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./build/bin . # # - name: Upload artifacts # uses: actions/upload-artifact@v6 # with: # path: llama-${{ steps.tag.outputs.name }}-bin-${{ matrix.chip_type }}-openEuler-${{ matrix.arch }}${{ matrix.use_acl_graph == 'on' && '-aclgraph' || '' }}.tar.gz # name: llama-bin-${{ matrix.chip_type }}-openEuler-${{ matrix.arch }}${{ matrix.use_acl_graph == 'on' && '-aclgraph' || '' }}.tar.gz ui-build: needs: [check-release, get-version] if: ${{ needs.check-release.outputs.should_release == 'true' }} uses: ./.github/workflows/ui-build.yml with: hf_ui_version: ${{ needs.get-version.outputs.ui_version }} release: if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} # Fine-grant permission # https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token permissions: contents: write # for creating release runs-on: ubuntu-slim needs: - get-version - windows - windows-cpu - windows-cuda #- windows-sycl - windows-rocm - windows-openvino - ubuntu-22-rocm - ubuntu-cpu - ubuntu-vulkan - ubuntu-24-openvino #- ubuntu-24-sycl - android-arm64 - macos-cpu - ios-xcode #- openEuler-cann - ui-build outputs: tag_name: ${{ steps.tag.outputs.name }} steps: - name: Clone id: checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Determine tag name id: tag uses: ./.github/actions/get-tag-name - name: Download artifacts id: download-artifact uses: actions/download-artifact@v7 with: path: ./artifact merge-multiple: true - name: Move artifacts id: move_artifacts run: | mkdir -p release echo "Adding CPU backend files to existing zips..." for arch in x64 arm64; do cpu_zip="artifact/llama-bin-win-cpu-${arch}.zip" temp_dir=$(mktemp -d) echo "Extracting CPU backend for $arch..." unzip "$cpu_zip" -d "$temp_dir" echo "Adding CPU files to $arch zips..." for target_zip in artifact/llama-bin-win-*-${arch}.zip; do if [[ "$target_zip" == "$cpu_zip" ]]; then continue fi echo "Adding CPU backend to $(basename "$target_zip")" realpath_target_zip=$(realpath "$target_zip") (cd "$temp_dir" && zip -r "$realpath_target_zip" .) done rm -rf "$temp_dir" done echo "Renaming and moving zips to release..." for zip_file in artifact/llama-bin-win-*.zip; do base_name=$(basename "$zip_file" .zip) zip_name="llama-${{ steps.tag.outputs.name }}-${base_name#llama-}.zip" echo "Moving $zip_file to release/$zip_name" mv "$zip_file" "release/$zip_name" done echo "Moving other artifacts..." mv -v artifact/*.zip release mv -v artifact/*.tar.gz release - name: Download UI build id: download_ui uses: actions/download-artifact@v7 with: name: ui-build path: ./ui-dist - name: Package UI id: package_ui run: | tar -czvf release/llama-${{ steps.tag.outputs.name }}-ui.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./ui-dist . - name: Create release id: create_release uses: ggml-org/action-create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ steps.tag.outputs.name }} body: |
${{ github.event.head_commit.message }}
**Website:** - **macOS/iOS:** - [macOS Apple Silicon (arm64)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-macos-arm64.tar.gz) - macOS Apple Silicon (arm64, KleidiAI enabled) [DISABLED](https://github.com/ggml-org/llama.cpp/pull/23780) - [macOS Intel (x64)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-macos-x64.tar.gz) - [iOS XCFramework](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-xcframework.zip) **Linux:** - [Ubuntu x64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-x64.tar.gz) - [Ubuntu arm64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-arm64.tar.gz) - [Ubuntu s390x (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-s390x.tar.gz) - [Ubuntu x64 (Vulkan)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-vulkan-x64.tar.gz) - [Ubuntu arm64 (Vulkan)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-vulkan-arm64.tar.gz) - [Ubuntu x64 (ROCm 7.14)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-rocm-7.14-x64.tar.gz) - [Ubuntu x64 (OpenVINO)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-openvino-${{ needs.ubuntu-24-openvino.outputs.openvino_version }}-x64.tar.gz) - [Ubuntu x64 (SYCL FP32)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-sycl-fp32-x64.tar.gz) - [Ubuntu x64 (SYCL FP16)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-sycl-fp16-x64.tar.gz) **Android:** - [Android arm64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-android-arm64.tar.gz) **Windows:** - [Windows x64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cpu-x64.zip) - [Windows arm64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cpu-arm64.zip) - [Windows arm64 (OpenCL Adreno)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-opencl-adreno-arm64.zip) - [Windows x64 (CUDA 12)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cuda-12.4-x64.zip) - [CUDA 12.4 DLLs](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-bin-win-cuda-12.4-x64.zip) - [Windows x64 (CUDA 13)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cuda-13.3-x64.zip) - [CUDA 13.3 DLLs](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-bin-win-cuda-13.3-x64.zip) - [Windows arm64 (CUDA 13) (preview)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cuda-13.4-arm64.zip) - [CUDA 13.4 DLLs](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-bin-win-cuda-13.4-arm64.zip) - [Windows x64 (Vulkan)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-vulkan-x64.zip) - [Windows x64 (OpenVINO)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-openvino-${{ needs.windows-openvino.outputs.openvino_version }}-x64.zip) - [Windows x64 (SYCL)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-sycl-x64.zip) - [Windows x64 (ROCm 7.14)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-rocm-7.14-x64.zip) **openEuler:** - [DISABLED](https://github.com/ggml-org/llama.cpp/pull/23705) - openEuler x86 (310p) - openEuler x86 (910b, ACL Graph) - openEuler aarch64 (310p) - openEuler aarch64 (910b, ACL Graph) **UI:** - [UI](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-ui.tar.gz) - name: Upload release id: upload_release uses: actions/github-script@v8 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | const path = require('path'); const fs = require('fs'); const release_id = '${{ steps.create_release.outputs.id }}'; for (let file of await fs.readdirSync('./release')) { if (path.extname(file) === '.zip' || file.endsWith('.tar.gz')) { console.log('uploadReleaseAsset', file); await github.rest.repos.uploadReleaseAsset({ owner: context.repo.owner, repo: context.repo.repo, release_id: release_id, name: file, data: await fs.readFileSync(`./release/${file}`) }); } } ui-publish: if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} needs: - release uses: ./.github/workflows/ui-publish.yml with: version_tag: ${{ needs.release.outputs.tag_name }} secrets: hf_token: ${{ secrets.HF_TOKEN_UI_STATIC_OUTPUT }}