Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 54 additions & 24 deletions .github/workflows/build-windows-gpu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@ on:
rocm_version:
description: ROCm version (used by ROCm/all)
required: true
default: '10.0.0'
default: '10.1.0'
type: choice
options:
- '7.14.0'
- '10.0.0'
- '10.1.0'
vulkan_version:
description: Vulkan SDK version (used by Vulkan/all)
required: true
Expand All @@ -47,6 +48,14 @@ on:
- gfx1151
- gfx1200
- gfx1201
rocm_peer_copy:
description: ROCm peer copy support (enabled omits GGML_CUDA_NO_PEER_COPY)
required: true
default: disabled
type: choice
options:
- disabled
- enabled
llama_source:
description: llama.cpp source type
required: true
Expand Down Expand Up @@ -155,8 +164,7 @@ jobs:
-DGGML_CUDA_NO_PEER_COPY=ON ^
-DGGML_NATIVE=OFF ^
-DGGML_BACKEND_DL=ON ^
-DLLAMA_BUILD_BORINGSSL=ON ^
-DGGML_CUDA_CUB_3DOT2=ON
-DLLAMA_BUILD_BORINGSSL=ON
cmake --build build-cuda --config Release -j %NUMBER_OF_PROCESSORS%

- name: Verify CUDA backend
Expand All @@ -183,6 +191,7 @@ jobs:
timeout-minutes: 180
env:
GPU_TARGET: ${{ inputs.rocm_target }}
ROCM_PEER_COPY: ${{ inputs.rocm_peer_copy }}
outputs:
llama_ref: ${{ steps.llama-source.outputs.ref }}
steps:
Expand Down Expand Up @@ -266,27 +275,33 @@ jobs:
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: build-rocm
key: windows-2022-rocm-build-${{ env.ROCM_VERSION }}-${{ env.GPU_TARGET }}-${{ steps.llama-source.outputs.ref }}-${{ hashFiles('.github/workflows/build-windows-gpu.yml', 'scripts/Build-Rocm.ps1') }}
key: windows-2022-rocm-build-${{ env.ROCM_VERSION }}-${{ env.GPU_TARGET }}-peer-copy-${{ env.ROCM_PEER_COPY }}-${{ steps.llama-source.outputs.ref }}-${{ hashFiles('.github/workflows/build-windows-gpu.yml', 'scripts/Build-Rocm.ps1') }}

- name: Build ROCm with peer copy disabled
- name: Build ROCm
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
cmake -S vendor/llama.cpp -B build-rocm -G 'Unix Makefiles' `
-DCMAKE_BUILD_TYPE=Release `
"-DCMAKE_PREFIX_PATH=${env:HIP_PATH}" `
"-DCMAKE_C_COMPILER=${env:HIP_PATH}\lib\llvm\bin\clang.exe" `
"-DCMAKE_CXX_COMPILER=${env:HIP_PATH}\lib\llvm\bin\clang++.exe" `
"-DCMAKE_HIP_COMPILER=${env:HIP_PATH}\lib\llvm\bin\clang.exe" `
"-DHIP_PATH=${env:HIP_PATH}" `
-DGGML_HIP=ON `
-DGGML_CUDA_NO_PEER_COPY=ON `
-DGGML_HIP_NO_VMM=ON `
-DGGML_HIP_ROCWMMA_FATTN=ON `
-DGGML_NATIVE=OFF `
-DGGML_BACKEND_DL=ON `
-DLLAMA_BUILD_BORINGSSL=ON `
$cmakeArgs = @(
'-S', 'vendor/llama.cpp',
'-B', 'build-rocm',
'-G', 'Unix Makefiles',
'-DCMAKE_BUILD_TYPE=Release',
"-DCMAKE_PREFIX_PATH=${env:HIP_PATH}",
"-DCMAKE_C_COMPILER=${env:HIP_PATH}\lib\llvm\bin\clang.exe",
"-DCMAKE_CXX_COMPILER=${env:HIP_PATH}\lib\llvm\bin\clang++.exe",
"-DCMAKE_HIP_COMPILER=${env:HIP_PATH}\lib\llvm\bin\clang.exe",
"-DHIP_PATH=${env:HIP_PATH}",
'-DGGML_HIP=ON',
'-DGGML_HIP_NO_VMM=ON',
'-DGGML_NATIVE=OFF',
'-DGGML_BACKEND_DL=ON',
'-DLLAMA_BUILD_BORINGSSL=ON',
"-DAMDGPU_TARGETS=${env:GPU_TARGET}"
)
if ($env:ROCM_PEER_COPY -eq 'disabled') {
$cmakeArgs += '-DGGML_CUDA_NO_PEER_COPY=ON'
}
& cmake @cmakeArgs
if ($LASTEXITCODE -ne 0) { throw "CMake configure failed: $LASTEXITCODE" }
cmake --build build-rocm --parallel $env:NUMBER_OF_PROCESSORS
if ($LASTEXITCODE -ne 0) { throw "CMake build failed: $LASTEXITCODE" }
Expand All @@ -308,7 +323,9 @@ jobs:

- name: Create self-contained ROCm package
shell: pwsh
run: ./scripts/Package-RocmBuild.ps1 -BuildDir ./build-rocm -RocmRoot $env:HIP_PATH -RuntimeRoot $env:ROCM_PACKAGE_ROOT -Name "llama-${env:LLAMA_REF}-win-x64-rocm-${env:ROCM_VERSION}-${env:GPU_TARGET}-no-peer-copy"
run: |
$peerCopySuffix = if ($env:ROCM_PEER_COPY -eq 'enabled') { 'peer-copy' } else { 'no-peer-copy' }
./scripts/Package-RocmBuild.ps1 -BuildDir ./build-rocm -RocmRoot $env:HIP_PATH -RuntimeRoot $env:ROCM_PACKAGE_ROOT -Name "llama-${env:LLAMA_REF}-win-x64-rocm-${env:ROCM_VERSION}-${env:GPU_TARGET}-$peerCopySuffix"

- name: Verify bundled ROCm runtime
shell: pwsh
Expand All @@ -332,7 +349,7 @@ jobs:
- name: Upload ROCm package
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: llama-${{ env.LLAMA_REF }}-win-x64-rocm-${{ env.ROCM_VERSION }}-${{ env.GPU_TARGET }}-no-peer-copy
name: llama-${{ env.LLAMA_REF }}-win-x64-rocm-${{ env.ROCM_VERSION }}-${{ env.GPU_TARGET }}-${{ env.ROCM_PEER_COPY == 'enabled' && 'peer-copy' || 'no-peer-copy' }}
path: dist/*.zip
if-no-files-found: error

Expand Down Expand Up @@ -457,6 +474,7 @@ jobs:
REQUESTED_RELEASE_TAG: ${{ inputs.release_tag }}
SELECTED_BACKEND: ${{ inputs.backend }}
ROCM_TARGET: ${{ inputs.rocm_target }}
ROCM_PEER_COPY: ${{ inputs.rocm_peer_copy }}
steps:
- name: Download successful build artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand Down Expand Up @@ -486,16 +504,28 @@ jobs:
release_notes="Windows x64 CUDA ${CUDA_VERSION} binaries built from llama.cpp ${LLAMA_REF}. Peer copy is disabled."
;;
rocm)
release_title="llama-${LLAMA_REF}-win-x64-rocm-${ROCM_VERSION}-${ROCM_TARGET}-no-peer-copy"
release_notes="Windows x64 ROCm ${ROCM_VERSION} (${ROCM_TARGET}) binaries built from llama.cpp ${LLAMA_REF}. The ROCm runtime and device kernels are bundled; peer copy is disabled."
if [[ "$ROCM_PEER_COPY" == "enabled" ]]; then
peer_copy_suffix="peer-copy"
peer_copy_note="Peer copy is enabled."
else
peer_copy_suffix="no-peer-copy"
peer_copy_note="Peer copy is disabled."
fi
release_title="llama-${LLAMA_REF}-win-x64-rocm-${ROCM_VERSION}-${ROCM_TARGET}-${peer_copy_suffix}"
release_notes="Windows x64 ROCm ${ROCM_VERSION} (${ROCM_TARGET}) binaries built from llama.cpp ${LLAMA_REF}. The ROCm runtime and device kernels are bundled. ${peer_copy_note}"
;;
vulkan)
release_title="llama-${LLAMA_REF}-win-x64-vulkan-${VULKAN_VERSION}"
release_notes="Windows x64 Vulkan SDK ${VULKAN_VERSION} binaries built from llama.cpp ${LLAMA_REF}."
;;
all)
if [[ "$ROCM_PEER_COPY" == "enabled" ]]; then
rocm_peer_copy_note="ROCm peer copy is enabled."
else
rocm_peer_copy_note="ROCm peer copy is disabled."
fi
release_title="llama-${LLAMA_REF}-win-x64-gpu-cuda-${CUDA_VERSION}-rocm-${ROCM_VERSION}-${ROCM_TARGET}-vulkan-${VULKAN_VERSION}"
release_notes="Windows x64 GPU binaries built from llama.cpp ${LLAMA_REF}. CUDA ${CUDA_VERSION}; ROCm ${ROCM_VERSION} (${ROCM_TARGET}, runtime and device kernels bundled); Vulkan SDK ${VULKAN_VERSION}. Peer copy is disabled in CUDA/ROCm builds."
release_notes="Windows x64 GPU binaries built from llama.cpp ${LLAMA_REF}. CUDA ${CUDA_VERSION} (peer copy disabled); ROCm ${ROCM_VERSION} (${ROCM_TARGET}, runtime and device kernels bundled); Vulkan SDK ${VULKAN_VERSION}. ${rocm_peer_copy_note}"
;;
*)
echo "Unsupported backend for Release metadata: $SELECTED_BACKEND" >&2
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# llama.cpp Windows GPU Builder

NVIDIA CUDA、AMD ROCm/HIP、およびVulkanに対応した、[`llama.cpp`](https://github.com/ggml-org/llama.cpp)の再現可能なWindows x64ビルド環境です。CUDAとROCmでは`GGML_CUDA_NO_PEER_COPY=ON`を指定してビルドします。
NVIDIA CUDA、AMD ROCm/HIP、およびVulkanに対応した、[`llama.cpp`](https://github.com/ggml-org/llama.cpp)の再現可能なWindows x64ビルド環境です。CUDAでは`GGML_CUDA_NO_PEER_COPY=ON`を指定します。ROCmではpeer copyを有効/無効から選択でき、既定では従来どおり無効化します。

`llama.cpp`のソースコードはGit submoduleとして特定のコミットに固定しています。GitHub Actionsは使い捨てのWindows runner上にツールチェーンを準備し、バイナリをビルドしてZIP形式のArtifactをアップロードします。ローカルで隔離されたビルド環境が必要な場合は、Windows VMまたはWindows Sandboxを利用できます。WSL/DockerのCUDA・ROCmコンテナで生成されるのはLinuxバイナリであり、Windowsネイティブバイナリではありません。

Expand All @@ -23,7 +23,7 @@ GitHubリポジトリで**Actions > Build Windows GPU binaries > Run workflow**

- `all`: CUDA、選択したROCmターゲット、およびVulkanをビルド
- `cuda`: ワークフローに設定されたCUDAバージョンをビルド
- `rocm`: ワークフローに設定されたROCmバージョンを、選択した`gfx`ターゲット向けにビルド
- `rocm`: ワークフローに設定されたROCmバージョンを、選択した`gfx`ターゲット向けにビルド。`rocm_peer_copy`でpeer copyの有効/無効を選択可能
- `vulkan`: ワークフローに設定されたVulkan SDKで、GPUメーカー共通のVulkan版をビルド

`llama_source`では、使用する`llama.cpp`の種類を選択します。
Expand All @@ -36,9 +36,9 @@ GitHubリポジトリで**Actions > Build Windows GPU binaries > Run workflow**

`llama_tag`は任意です。指定した種類とタグ形式が一致しない場合や、`latest-branch`を選択してタグも入力した場合は、ビルドを開始せずエラーになります。

ビルド結果は、ワークフロー実行画面からArtifactとしてダウンロードできます。Artifact名には、実際に使用した`llama.cpp`タグまたは`master-<コミットSHA>`が含まれます。
ビルド結果は、ワークフロー実行画面からArtifactとしてダウンロードできます。Artifact名には、実際に使用した`llama.cpp`タグまたは`master-<コミットSHA>`が含まれます。ROCm版はpeer copy設定も`peer-copy`または`no-peer-copy`としてArtifact名に含めます。

ROCmジョブでは、TheRock SDKとCMakeのビルドディレクトリをGitHub Actionsのキャッシュへ保存します。同じROCmバージョン、GPUターゲット、`llama.cpp`コミット、およびビルド設定で再実行した場合、SDKのダウンロード・展開と変更のないソースの再コンパイルを省略します。バージョンやビルド設定が変わるとキャッシュキーも変わるため、古い生成物は使用されません。
ROCmジョブでは、TheRock SDKとCMakeのビルドディレクトリをGitHub Actionsのキャッシュへ保存します。同じROCmバージョン、GPUターゲット、peer copy設定、`llama.cpp`コミット、およびビルド設定で再実行した場合、SDKのダウンロード・展開と変更のないソースの再コンパイルを省略します。バージョンやビルド設定が変わるとキャッシュキーも変わるため、古い生成物は使用されません。

### GitHub Releaseへの公開

Expand Down Expand Up @@ -149,10 +149,10 @@ ROCm版ZIPには、同梱ランタイムを確認してPATHを一時設定する
| ツールチェーン | 選択肢 | デフォルト |
|---|---|---|
| CUDA | `12.4` | `12.4` |
| ROCm | `7.14.0`、`10.0.0` | `7.14.0` |
| ROCm | `7.14.0`、`10.0.0`、`10.1.0` | `10.1.0` |
| Vulkan SDK | `1.4.357.0` | `1.4.357.0` |

ROCmは安定して利用してきた7系と、新しい10系を選べます。7.14系は従来のmulti-arch wheelインデックス、10系は新しいTheRock stableインデックスから取得します。選択した値はセットアップ、キャッシュキー、ZIP Artifact名、Release情報へ引き継がれるため、異なるバージョンのキャッシュや成果物は混在しません。
ROCmは安定して利用してきた7系と、新しい10系を選べます。7.14系は従来のmulti-arch wheelインデックス、10系は新しいTheRock stableインデックスから取得します。ROCm 10.1.0をデフォルトとし、10.0.0も互換性確認や切り戻し用に選択できます。`rocm_peer_copy`は`disabled`(既定)と`enabled`を選択できます。`disabled`では`GGML_CUDA_NO_PEER_COPY=ON`を指定し、`enabled`ではこの定義を省略してROCm/HIPのpeer copy実装を利用します。ROCm 10.1のnon-P2P / multi-GPU修正を検証する場合は`enabled`を選択できます。選択した値はキャッシュキー、ZIP Artifact名、Release情報へ引き継がれるため、異なる設定の成果物は混在しません。

`.github/workflows/build-windows-gpu.yml`のトップレベル`env`は、手動実行時の入力を各ジョブへ共有します。

Expand Down Expand Up @@ -187,7 +187,7 @@ GPU固有のコードや配布処理を変更した場合は、マージ前に**

## llama.cppの更新

更新スクリプトは、引数を指定しない場合に`v0.2.0`のような安定版リリースタグを公式リポジトリから取得し、Semantic Versionが最も新しいリリースへ更新します。`b10603`のような`b`タグはnightly/dev版のため、デフォルトでは選択しません。
更新スクリプトは、引数を指定しない場合に`v0.6.0`のような安定版リリースタグを公式リポジトリから取得し、Semantic Versionが最も新しいリリースへ更新します。`b10603`のような`b`タグはnightly/dev版のため、デフォルトでは選択しません。

```powershell
.\scripts\Update-LlamaCpp.ps1
Expand All @@ -196,7 +196,7 @@ GPU固有のコードや配布処理を変更した場合は、マージ前に**
特定の安定版リリースを使用する場合は、[llama.cpp Releases](https://github.com/ggml-org/llama.cpp/releases)に掲載されている`vX.Y.Z`形式のタグを`-Release`で指定します。

```powershell
.\scripts\Update-LlamaCpp.ps1 -Release v0.2.0
.\scripts\Update-LlamaCpp.ps1 -Release v0.6.0
```

`b10603`のようなnightly/dev版を使用する場合は、安定版と区別するため`-Nightly`で指定します。
Expand Down
2 changes: 1 addition & 1 deletion vendor/llama.cpp
Submodule llama.cpp updated 1473 files