mirror of
https://github.com/likelovewant/ollama-for-amd.git
synced 2025-12-21 14:26:30 +00:00
Initially Vulkan support in Ollama will require building from source. Once it is more thoroughly tested and we have fixed any critical bugs, then we can bundle Vulkan into the official binary releases.
432 lines
17 KiB
YAML
432 lines
17 KiB
YAML
name: release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
env:
|
|
CGO_CFLAGS: '-O3'
|
|
CGO_CXXFLAGS: '-O3'
|
|
|
|
jobs:
|
|
setup-environment:
|
|
runs-on: ubuntu-latest
|
|
environment: release
|
|
outputs:
|
|
GOFLAGS: ${{ steps.goflags.outputs.GOFLAGS }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Set environment
|
|
id: goflags
|
|
run: |
|
|
echo GOFLAGS="'-ldflags=-w -s \"-X=github.com/ollama/ollama/version.Version=${GITHUB_REF_NAME#v}\" \"-X=github.com/ollama/ollama/server.mode=release\"'" >>$GITHUB_OUTPUT
|
|
|
|
darwin-build:
|
|
runs-on: macos-13-xlarge
|
|
environment: release
|
|
needs: setup-environment
|
|
strategy:
|
|
matrix:
|
|
os: [darwin]
|
|
arch: [amd64, arm64]
|
|
env:
|
|
GOFLAGS: ${{ needs.setup-environment.outputs.GOFLAGS }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
- run: |
|
|
go build -o dist/ .
|
|
env:
|
|
GOOS: ${{ matrix.os }}
|
|
GOARCH: ${{ matrix.arch }}
|
|
CGO_ENABLED: 1
|
|
CGO_CPPFLAGS: '-mmacosx-version-min=11.3'
|
|
- if: matrix.arch == 'amd64'
|
|
run: |
|
|
cmake --preset CPU -DCMAKE_OSX_DEPLOYMENT_TARGET=11.3 -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_OSX_ARCHITECTURES=x86_64
|
|
cmake --build --parallel --preset CPU
|
|
cmake --install build --component CPU --strip --parallel 8
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: build-${{ matrix.os }}-${{ matrix.arch }}
|
|
path: dist/*
|
|
|
|
windows-depends:
|
|
strategy:
|
|
matrix:
|
|
os: [windows]
|
|
arch: [amd64]
|
|
preset: ['CPU']
|
|
include:
|
|
- os: windows
|
|
arch: amd64
|
|
preset: 'CUDA 12'
|
|
install: https://developer.download.nvidia.com/compute/cuda/12.8.0/local_installers/cuda_12.8.0_571.96_windows.exe
|
|
cuda-components:
|
|
- '"cudart"'
|
|
- '"nvcc"'
|
|
- '"cublas"'
|
|
- '"cublas_dev"'
|
|
cuda-version: '12.8'
|
|
flags: ''
|
|
runner_dir: 'cuda_v12'
|
|
- os: windows
|
|
arch: amd64
|
|
preset: 'CUDA 13'
|
|
install: https://developer.download.nvidia.com/compute/cuda/13.0.0/local_installers/cuda_13.0.0_windows.exe
|
|
cuda-components:
|
|
- '"cudart"'
|
|
- '"nvcc"'
|
|
- '"cublas"'
|
|
- '"cublas_dev"'
|
|
- '"crt"'
|
|
- '"nvvm"'
|
|
- '"nvptxcompiler"'
|
|
cuda-version: '13.0'
|
|
flags: ''
|
|
runner_dir: 'cuda_v13'
|
|
- os: windows
|
|
arch: amd64
|
|
preset: 'ROCm 6'
|
|
install: https://download.amd.com/developer/eula/rocm-hub/AMD-Software-PRO-Edition-24.Q4-WinSvr2022-For-HIP.exe
|
|
rocm-version: '6.2'
|
|
flags: '-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_FLAGS="-parallel-jobs=4 -Wno-ignored-attributes -Wno-deprecated-pragma" -DCMAKE_CXX_FLAGS="-parallel-jobs=4 -Wno-ignored-attributes -Wno-deprecated-pragma"'
|
|
runner_dir: 'rocm'
|
|
runs-on: ${{ matrix.arch == 'arm64' && format('{0}-{1}', matrix.os, matrix.arch) || matrix.os }}
|
|
environment: release
|
|
env:
|
|
GOFLAGS: ${{ needs.setup-environment.outputs.GOFLAGS }}
|
|
steps:
|
|
- name: Install system dependencies
|
|
run: |
|
|
choco install -y --no-progress ccache ninja
|
|
ccache -o cache_dir=${{ github.workspace }}\.ccache
|
|
- if: startsWith(matrix.preset, 'CUDA ') || startsWith(matrix.preset, 'ROCm ')
|
|
id: cache-install
|
|
uses: actions/cache/restore@v4
|
|
with:
|
|
path: |
|
|
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA
|
|
C:\Program Files\AMD\ROCm
|
|
key: ${{ matrix.install }}
|
|
- if: startsWith(matrix.preset, 'CUDA ')
|
|
name: Install CUDA ${{ matrix.cuda-version }}
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
if ("${{ steps.cache-install.outputs.cache-hit }}" -ne 'true') {
|
|
Invoke-WebRequest -Uri "${{ matrix.install }}" -OutFile "install.exe"
|
|
$subpackages = @(${{ join(matrix.cuda-components, ', ') }}) | Foreach-Object {"${_}_${{ matrix.cuda-version }}"}
|
|
Start-Process -FilePath .\install.exe -ArgumentList (@("-s") + $subpackages) -NoNewWindow -Wait
|
|
}
|
|
|
|
$cudaPath = (Resolve-Path "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\*").path
|
|
echo "$cudaPath\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
- if: startsWith(matrix.preset, 'ROCm')
|
|
name: Install ROCm ${{ matrix.rocm-version }}
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
if ("${{ steps.cache-install.outputs.cache-hit }}" -ne 'true') {
|
|
Invoke-WebRequest -Uri "${{ matrix.install }}" -OutFile "install.exe"
|
|
Start-Process -FilePath .\install.exe -ArgumentList '-install' -NoNewWindow -Wait
|
|
}
|
|
|
|
$hipPath = (Resolve-Path "C:\Program Files\AMD\ROCm\*").path
|
|
echo "$hipPath\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
echo "CC=$hipPath\bin\clang.exe" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
echo "CXX=$hipPath\bin\clang++.exe" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
echo "HIPCXX=$hipPath\bin\clang++.exe" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
echo "HIP_PLATFORM=amd" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
echo "CMAKE_PREFIX_PATH=$hipPath" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
- if: matrix.preset == 'CPU'
|
|
run: |
|
|
echo "CC=clang.exe" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
echo "CXX=clang++.exe" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
- if: ${{ !cancelled() && steps.cache-install.outputs.cache-hit != 'true' }}
|
|
uses: actions/cache/save@v4
|
|
with:
|
|
path: |
|
|
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA
|
|
C:\Program Files\AMD\ROCm
|
|
key: ${{ matrix.install }}
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: ${{ github.workspace }}\.ccache
|
|
key: ccache-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.preset }}
|
|
- name: Build target "${{ matrix.preset }}"
|
|
run: |
|
|
Import-Module 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\Microsoft.VisualStudio.DevShell.dll'
|
|
Enter-VsDevShell -VsInstallPath 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise' -SkipAutomaticLocation -DevCmdArguments '-arch=x64 -no_logo'
|
|
cmake --preset "${{ matrix.preset }}" ${{ matrix.flags }} -DOLLAMA_RUNNER_DIR="${{ matrix.runner_dir }}"
|
|
cmake --build --parallel --preset "${{ matrix.preset }}"
|
|
cmake --install build --component "${{ startsWith(matrix.preset, 'CUDA ') && 'CUDA' || startsWith(matrix.preset, 'ROCm ') && 'HIP' || 'CPU' }}" --strip --parallel 8
|
|
Remove-Item -Path dist\lib\ollama\rocm\rocblas\library\*gfx906* -ErrorAction SilentlyContinue
|
|
env:
|
|
CMAKE_GENERATOR: Ninja
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: depends-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.preset }}
|
|
path: dist\*
|
|
|
|
windows-build:
|
|
strategy:
|
|
matrix:
|
|
os: [windows]
|
|
arch: [amd64, arm64]
|
|
include:
|
|
- os: windows
|
|
arch: amd64
|
|
llvmarch: x86_64
|
|
- os: windows
|
|
arch: arm64
|
|
llvmarch: aarch64
|
|
runs-on: ${{ matrix.arch == 'arm64' && format('{0}-{1}', matrix.os, matrix.arch) || matrix.os }}
|
|
environment: release
|
|
needs: [setup-environment]
|
|
env:
|
|
GOFLAGS: ${{ needs.setup-environment.outputs.GOFLAGS }}
|
|
steps:
|
|
- name: Install ARM64 system dependencies
|
|
if: matrix.arch == 'arm64'
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
Set-ExecutionPolicy Bypass -Scope Process -Force
|
|
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
|
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
|
|
echo "C:\ProgramData\chocolatey\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
|
|
choco install -y --no-progress git gzip
|
|
echo "C:\Program Files\Git\cmd" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
- name: Install clang and gcc-compat
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
Set-ExecutionPolicy Bypass -Scope Process -Force
|
|
Invoke-WebRequest -Uri "https://github.com/mstorsjo/llvm-mingw/releases/download/20240619/llvm-mingw-20240619-ucrt-${{ matrix.llvmarch }}.zip" -OutFile "${{ runner.temp }}\llvm-mingw-ucrt.zip"
|
|
Expand-Archive -Path ${{ runner.temp }}\llvm-mingw-ucrt.zip -DestinationPath "C:\Program Files\"
|
|
$installPath=(Resolve-Path -Path "C:\Program Files\llvm-mingw-*-ucrt*").path
|
|
echo "$installPath\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
- name: Verify gcc is actually clang
|
|
run: |
|
|
$ErrorActionPreference='Continue'
|
|
$version=& gcc -v 2>&1
|
|
$version=$version -join "`n"
|
|
echo "gcc is $version"
|
|
if ($version -notmatch 'clang') {
|
|
echo "ERROR: GCC must be clang for proper utf16 handling"
|
|
exit 1
|
|
}
|
|
$ErrorActionPreference='Stop'
|
|
- run: |
|
|
go build -o dist/${{ matrix.os }}-${{ matrix.arch }}/ .
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: build-${{ matrix.os }}-${{ matrix.arch }}
|
|
path: |
|
|
dist\${{ matrix.os }}-${{ matrix.arch }}\*.exe
|
|
|
|
linux-build:
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- os: linux
|
|
arch: amd64
|
|
target: archive_novulkan
|
|
- os: linux
|
|
arch: amd64
|
|
target: rocm
|
|
- os: linux
|
|
arch: arm64
|
|
target: archive_novulkan
|
|
runs-on: ${{ matrix.arch == 'arm64' && format('{0}-{1}', matrix.os, matrix.arch) || matrix.os }}
|
|
environment: release
|
|
needs: setup-environment
|
|
env:
|
|
GOFLAGS: ${{ needs.setup-environment.outputs.GOFLAGS }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: docker/setup-buildx-action@v3
|
|
- uses: docker/build-push-action@v6
|
|
with:
|
|
context: .
|
|
platforms: ${{ matrix.os }}/${{ matrix.arch }}
|
|
target: ${{ matrix.target }}
|
|
build-args: |
|
|
GOFLAGS=${{ env.GOFLAGS }}
|
|
CGO_CFLAGS=${{ env.CGO_CFLAGS }}
|
|
CGO_CXXFLAGS=${{ env.CGO_CXXFLAGS }}
|
|
outputs: type=local,dest=dist/${{ matrix.os }}-${{ matrix.arch }}
|
|
cache-from: type=registry,ref=${{ vars.DOCKER_REPO }}:latest
|
|
cache-to: type=inline
|
|
- run: |
|
|
for COMPONENT in bin/* lib/ollama/*; do
|
|
case "$COMPONENT" in
|
|
bin/ollama) echo $COMPONENT >>ollama-${{ matrix.os }}-${{ matrix.arch }}.tar.in ;;
|
|
lib/ollama/*.so*) echo $COMPONENT >>ollama-${{ matrix.os }}-${{ matrix.arch }}.tar.in ;;
|
|
lib/ollama/cuda_v*) echo $COMPONENT >>ollama-${{ matrix.os }}-${{ matrix.arch }}.tar.in ;;
|
|
lib/ollama/cuda_jetpack5) echo $COMPONENT >>ollama-${{ matrix.os }}-${{ matrix.arch }}-jetpack5.tar.in ;;
|
|
lib/ollama/cuda_jetpack6) echo $COMPONENT >>ollama-${{ matrix.os }}-${{ matrix.arch }}-jetpack6.tar.in ;;
|
|
lib/ollama/rocm) echo $COMPONENT >>ollama-${{ matrix.os }}-${{ matrix.arch }}-rocm.tar.in ;;
|
|
esac
|
|
done
|
|
working-directory: dist/${{ matrix.os }}-${{ matrix.arch }}
|
|
- run: |
|
|
echo "Manifests"
|
|
for ARCHIVE in dist/${{ matrix.os }}-${{ matrix.arch }}/*.tar.in ; do
|
|
echo $ARCHIVE
|
|
cat $ARCHIVE
|
|
done
|
|
- run: |
|
|
for ARCHIVE in dist/${{ matrix.os }}-${{ matrix.arch }}/*.tar.in; do
|
|
tar c -C dist/${{ matrix.os }}-${{ matrix.arch }} -T $ARCHIVE --owner 0 --group 0 | pigz -9vc >$(basename ${ARCHIVE//.*/}.tgz);
|
|
done
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: dist-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.target }}
|
|
path: |
|
|
*.tgz
|
|
|
|
# Build each Docker variant (OS, arch, and flavor) separately. Using QEMU is unreliable and slower.
|
|
docker-build-push:
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- os: linux
|
|
arch: arm64
|
|
target: novulkan
|
|
build-args: |
|
|
CGO_CFLAGS
|
|
CGO_CXXFLAGS
|
|
GOFLAGS
|
|
- os: linux
|
|
arch: amd64
|
|
target: novulkan
|
|
build-args: |
|
|
CGO_CFLAGS
|
|
CGO_CXXFLAGS
|
|
GOFLAGS
|
|
- os: linux
|
|
arch: amd64
|
|
suffix: '-rocm'
|
|
build-args: |
|
|
CGO_CFLAGS
|
|
CGO_CXXFLAGS
|
|
GOFLAGS
|
|
FLAVOR=rocm
|
|
- os: linux
|
|
arch: amd64
|
|
suffix: '-vulkan'
|
|
target: default
|
|
build-args: |
|
|
CGO_CFLAGS
|
|
CGO_CXXFLAGS
|
|
GOFLAGS
|
|
runs-on: ${{ matrix.arch == 'arm64' && format('{0}-{1}', matrix.os, matrix.arch) || matrix.os }}
|
|
environment: release
|
|
needs: setup-environment
|
|
env:
|
|
GOFLAGS: ${{ needs.setup-environment.outputs.GOFLAGS }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: docker/setup-buildx-action@v3
|
|
- uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ vars.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
|
|
- id: build-push
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: .
|
|
platforms: ${{ matrix.os }}/${{ matrix.arch }}
|
|
target: ${{ matrix.target }}
|
|
build-args: ${{ matrix.build-args }}
|
|
outputs: type=image,name=${{ vars.DOCKER_REPO }},push-by-digest=true,name-canonical=true,push=true
|
|
cache-from: type=registry,ref=${{ vars.DOCKER_REPO }}:latest
|
|
cache-to: type=inline
|
|
- run: |
|
|
mkdir -p ${{ matrix.os }}-${{ matrix.arch }}
|
|
echo "${{ steps.build-push.outputs.digest }}" >${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.suffix }}.txt
|
|
working-directory: ${{ runner.temp }}
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: digest-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.suffix }}
|
|
path: |
|
|
${{ runner.temp }}/${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.suffix }}.txt
|
|
|
|
# Merge Docker images for the same flavor into a single multi-arch manifest
|
|
docker-merge-push:
|
|
strategy:
|
|
matrix:
|
|
suffix: ['', '-rocm']
|
|
runs-on: linux
|
|
environment: release
|
|
needs: [docker-build-push]
|
|
steps:
|
|
- uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ vars.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
|
|
- id: metadata
|
|
uses: docker/metadata-action@v4
|
|
with:
|
|
flavor: |
|
|
latest=false
|
|
suffix=${{ matrix.suffix }}
|
|
images: |
|
|
${{ vars.DOCKER_REPO }}
|
|
tags: |
|
|
type=ref,enable=true,priority=600,prefix=pr-,event=pr
|
|
type=semver,pattern={{version}}
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
pattern: digest-*
|
|
path: ${{ runner.temp }}
|
|
merge-multiple: true
|
|
- run: |
|
|
docker buildx imagetools create $(echo '${{ steps.metadata.outputs.json }}' | jq -cr '.tags | map("-t", .) | join(" ")') $(cat *-${{ matrix.suffix }}.txt | xargs printf '${{ vars.DOCKER_REPO }}@%s ')
|
|
docker buildx imagetools inspect ${{ vars.DOCKER_REPO }}:${{ steps.metadata.outputs.version }}
|
|
working-directory: ${{ runner.temp }}
|
|
|
|
# Trigger downstream release process
|
|
trigger:
|
|
runs-on: ubuntu-latest
|
|
environment: release
|
|
needs: [darwin-build, windows-build, windows-depends, linux-build]
|
|
permissions:
|
|
contents: write
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Create or update Release for tag
|
|
run: |
|
|
RELEASE_VERSION="$(echo ${GITHUB_REF_NAME} | cut -f1 -d-)"
|
|
echo "Looking for existing release for ${RELEASE_VERSION}"
|
|
OLD_TAG=$(gh release ls --json name,tagName | jq -r ".[] | select(.name == \"${RELEASE_VERSION}\") | .tagName")
|
|
if [ -n "$OLD_TAG" ]; then
|
|
echo "Updating release ${RELEASE_VERSION} to point to new tag ${GITHUB_REF_NAME}"
|
|
gh release edit ${OLD_TAG} --tag ${GITHUB_REF_NAME}
|
|
else
|
|
echo "Creating new release ${RELEASE_VERSION} pointing to tag ${GITHUB_REF_NAME}"
|
|
gh release create ${GITHUB_REF_NAME} \
|
|
--title ${RELEASE_VERSION} \
|
|
--draft \
|
|
--generate-notes \
|
|
--prerelease
|
|
fi
|
|
- name: Trigger downstream release process
|
|
run: |
|
|
curl -L \
|
|
-X POST \
|
|
-H "Accept: application/vnd.github+json" \
|
|
-H "Authorization: Bearer ${{ secrets.RELEASE_TOKEN }}" \
|
|
-H "X-GitHub-Api-Version: 2022-11-28" \
|
|
https://api.github.com/repos/ollama/${{ vars.RELEASE_REPO }}/dispatches \
|
|
-d "{\"event_type\": \"trigger-workflow\", \"client_payload\": {\"run_id\": \"${GITHUB_RUN_ID}\", \"version\": \"${GITHUB_REF_NAME#v}\", \"origin\": \"${GITHUB_REPOSITORY}\", \"publish\": \"1\"}}"
|