mirror of
https://github.com/ggml-org/llama.cpp.git
synced 2025-06-26 19:55:04 +00:00
* ggml-cpu: add nnpa compile flag Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit4a9f60c201
) * ggml-cpu: add fp16->fp32 nnpa first Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit8d4a7987f9
) * ggml-cpu: add fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit0ff0d65162
) * ggml-cpu: better variable names Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit2f58bbcbb8
) * docs: update s390x docs Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit01b929491b
) * ggml-cpu: add debugging prints to see if dlf16 is correct Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix print vs printf Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix float placeholder Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: ensure fp16 and fp32 load and stores are called Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fp16 load ensured to hit Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove sigint from fp16 store for some reason, the function is not getting a hit when debugged with gdb. we will need to investigate further Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: activate nnpa for ggml_cpu_fp16_to_fp32 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: nnpa activate ggml_cpu_fp16_to_fp32 for 8 elements Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: nnpa switch to vec_xst test Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to vec_xst for 4 element loops also Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: rework noop Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove noop, general code cleanup Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: clarify variable naming Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: activate nnpa for ggml_cpu_fp32_to_fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add breakpoint for debugging Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: test fix for conversion failure Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: disable fp32->fp16 nnpa conversions for now there are some conversion failures in nnpa that requires the eyes of an ibm stsm. will create a separate pr to introduce the fp32->fp16 change. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to elif macro Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: reattempt fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix typo Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: reattempt fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix compiler types Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: change to typedef vector types Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add 4 element loops for fp32->fp16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: clarified vector naming Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back fp32->fp16 store nnpa Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: activate nnpa fp32->fp16 or fp16->fp32 compute Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add nnpa macro check in ggml-impl Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add missing __func__ Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: diagnose why __NNPA__ macro is not being defined Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: import vecintrin.h to fix compiler errors Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: update macro tests Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move s390x typedef to own header file Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: move s390x typedef to own header file" This reverts commit157f856c34
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to importing ggml-cpu-impl instead Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix macro declaration Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: test more macros Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add debug prints Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bruteforce macro definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move macro definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add ggml-impl.h to cmakelists Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to private macros Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move s390x typedef to own header file Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit157f856c34
) * ggml-cpu: move things around Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back compile macros Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: switch to quotes for import Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add compiler error macro Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add s390x detection in ggml-src Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back compile definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: undo cmakelists work Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: move s390x typedef to own header file" This reverts commit18d79e1a30
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove typedefs.h Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove typedef from cmakelists Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add ggml-impl.h future notes Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: add todo comment for future reference Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: clarify naming of dlf16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove unnecessary target compile definitions Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move nnpa fp16->fp32 and fp32->fp16 to simd-mappings Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: refactor fp32->fp16 and fp16->fp32 simd to ggml-cpu Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * docs: update broken huggingface link for s390x Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix duplicate func names during compile Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: fix duplicate func names during compile" This reverts commitfbb733451f
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml: refactor fp32->fp16 and fp16->fp32 simd to ggml-cpu" This reverts commitbd288e8fa5
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: refactor fp16<->fp32 simd to ggml-cpu Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix missing simd-mappings.h import in quants.c Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix missing simd-mappings.h within repack Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix amx mmq missing simd-mappings.h Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: attempt at fixing loongarch failing build Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move nnpa together with other fp16<->fp32 simd Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: fix wrong refactor of ggml-base ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164176555 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: remove dependency on ggml-cpu from ggml-base Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: rename all fp16<->fp32 macros to prefix with ggml_cpu ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164449406 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: remove mistaken fallback macro fallback logic was already implemented but i was too sleepy to realise Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: move ggml_table_f32_f16 to ggml-cpu ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164775006 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: move ggml_table_f32_f16 back to ggml-base due to ci failures Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: move ggml_table_f32_f16 back to ggml-base due to ci failures" This reverts commit32a3533564
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml: move ggml_table_f32_f16 to ggml-cpu" This reverts commit9e40d984ad
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml: move ggml_table_f32_f16 to ggml-cpu ref: https://github.com/ggml-org/llama.cpp/pull/14317#discussion_r2164775006 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> (cherry picked from commit9e40d984ad
) * ggml: move ggml_table_f32_f16 to ggml-cpu.c Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: extern c ggml_table_f32_f16 + chore docs Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: dedup ggml_table_f32_f16 from simd-mappings.h we rely on the variable declaration in ggml-cpu.c instead Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: dedup ggml_table_f32_f16 from simd-mappings.h" This reverts commitf71b21d2f7
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * ggml-cpu: bring back ggml_table_f32_f16 Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * Revert "ggml-cpu: bring back ggml_table_f32_f16" This reverts commit2dce119178
. Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> * fix ggml time initialization * fix f32_f16 table init * remove extra line --------- Signed-off-by: Aaron Teo <aaron.teo1@ibm.com> Co-authored-by: slaren <slarengh@gmail.com>
571 lines
27 KiB
Markdown
571 lines
27 KiB
Markdown
# Build llama.cpp locally
|
|
|
|
The main product of this project is the `llama` library. Its C-style interface can be found in [include/llama.h](../include/llama.h).
|
|
|
|
The project also includes many example programs and tools using the `llama` library. The examples range from simple, minimal code snippets to sophisticated sub-projects such as an OpenAI-compatible HTTP server.
|
|
|
|
**To get the Code:**
|
|
|
|
```bash
|
|
git clone https://github.com/ggml-org/llama.cpp
|
|
cd llama.cpp
|
|
```
|
|
|
|
The following sections describe how to build with different backends and options.
|
|
|
|
## CPU Build
|
|
|
|
Build llama.cpp using `CMake`:
|
|
|
|
```bash
|
|
cmake -B build
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
**Notes**:
|
|
|
|
- For faster compilation, add the `-j` argument to run multiple jobs in parallel, or use a generator that does this automatically such as Ninja. For example, `cmake --build build --config Release -j 8` will run 8 jobs in parallel.
|
|
- For faster repeated compilation, install [ccache](https://ccache.dev/)
|
|
- For debug builds, there are two cases:
|
|
|
|
1. Single-config generators (e.g. default = `Unix Makefiles`; note that they just ignore the `--config` flag):
|
|
|
|
```bash
|
|
cmake -B build -DCMAKE_BUILD_TYPE=Debug
|
|
cmake --build build
|
|
```
|
|
|
|
2. Multi-config generators (`-G` param set to Visual Studio, XCode...):
|
|
|
|
```bash
|
|
cmake -B build -G "Xcode"
|
|
cmake --build build --config Debug
|
|
```
|
|
|
|
For more details and a list of supported generators, see the [CMake documentation](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html).
|
|
- For static builds, add `-DBUILD_SHARED_LIBS=OFF`:
|
|
```
|
|
cmake -B build -DBUILD_SHARED_LIBS=OFF
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
- Building for Windows (x86, x64 and arm64) with MSVC or clang as compilers:
|
|
- Install Visual Studio 2022, e.g. via the [Community Edition](https://visualstudio.microsoft.com/vs/community/). In the installer, select at least the following options (this also automatically installs the required additional tools like CMake,...):
|
|
- Tab Workload: Desktop-development with C++
|
|
- Tab Components (select quickly via search): C++-_CMake_ Tools for Windows, _Git_ for Windows, C++-_Clang_ Compiler for Windows, MS-Build Support for LLVM-Toolset (clang)
|
|
- Please remember to always use a Developer Command Prompt / PowerShell for VS2022 for git, build, test
|
|
- For Windows on ARM (arm64, WoA) build with:
|
|
```bash
|
|
cmake --preset arm64-windows-llvm-release -D GGML_OPENMP=OFF
|
|
cmake --build build-arm64-windows-llvm-release
|
|
```
|
|
Building for arm64 can also be done with the MSVC compiler with the build-arm64-windows-MSVC preset, or the standard CMake build instructions. However, note that the MSVC compiler does not support inline ARM assembly code, used e.g. for the accelerated Q4_0_N_M CPU kernels.
|
|
|
|
For building with ninja generator and clang compiler as default:
|
|
-set path:set LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64;C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\lib\x64\uwp;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64
|
|
```bash
|
|
cmake --preset x64-windows-llvm-release
|
|
cmake --build build-x64-windows-llvm-release
|
|
```
|
|
- Curl usage is enabled by default and can be turned off with `-DLLAMA_CURL=OFF`. Otherwise you need to install development libraries for libcurl.
|
|
|
|
## BLAS Build
|
|
|
|
Building the program with BLAS support may lead to some performance improvements in prompt processing using batch sizes higher than 32 (the default is 512). Using BLAS doesn't affect the generation performance. There are currently several different BLAS implementations available for build and use:
|
|
|
|
### Accelerate Framework
|
|
|
|
This is only available on Mac PCs and it's enabled by default. You can just build using the normal instructions.
|
|
|
|
### OpenBLAS
|
|
|
|
This provides BLAS acceleration using only the CPU. Make sure to have OpenBLAS installed on your machine.
|
|
|
|
- Using `CMake` on Linux:
|
|
|
|
```bash
|
|
cmake -B build -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
### BLIS
|
|
|
|
Check [BLIS.md](./backend/BLIS.md) for more information.
|
|
|
|
### Intel oneMKL
|
|
|
|
Building through oneAPI compilers will make avx_vnni instruction set available for intel processors that do not support avx512 and avx512_vnni. Please note that this build config **does not support Intel GPU**. For Intel GPU support, please refer to [llama.cpp for SYCL](./backend/SYCL.md).
|
|
|
|
- Using manual oneAPI installation:
|
|
By default, `GGML_BLAS_VENDOR` is set to `Generic`, so if you already sourced intel environment script and assign `-DGGML_BLAS=ON` in cmake, the mkl version of Blas will automatically been selected. Otherwise please install oneAPI and follow the below steps:
|
|
```bash
|
|
source /opt/intel/oneapi/setvars.sh # You can skip this step if in oneapi-basekit docker image, only required for manual installation
|
|
cmake -B build -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Intel10_64lp -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DGGML_NATIVE=ON
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
- Using oneAPI docker image:
|
|
If you do not want to source the environment vars and install oneAPI manually, you can also build the code using intel docker container: [oneAPI-basekit](https://hub.docker.com/r/intel/oneapi-basekit). Then, you can use the commands given above.
|
|
|
|
Check [Optimizing and Running LLaMA2 on Intel® CPU](https://www.intel.com/content/www/us/en/content-details/791610/optimizing-and-running-llama2-on-intel-cpu.html) for more information.
|
|
|
|
### Other BLAS libraries
|
|
|
|
Any other BLAS library can be used by setting the `GGML_BLAS_VENDOR` option. See the [CMake documentation](https://cmake.org/cmake/help/latest/module/FindBLAS.html#blas-lapack-vendors) for a list of supported vendors.
|
|
|
|
## Metal Build
|
|
|
|
On MacOS, Metal is enabled by default. Using Metal makes the computation run on the GPU.
|
|
To disable the Metal build at compile time use the `-DGGML_METAL=OFF` cmake option.
|
|
|
|
When built with Metal support, you can explicitly disable GPU inference with the `--n-gpu-layers 0` command-line argument.
|
|
|
|
## SYCL
|
|
|
|
SYCL is a higher-level programming model to improve programming productivity on various hardware accelerators.
|
|
|
|
llama.cpp based on SYCL is used to **support Intel GPU** (Data Center Max series, Flex series, Arc series, Built-in GPU and iGPU).
|
|
|
|
For detailed info, please refer to [llama.cpp for SYCL](./backend/SYCL.md).
|
|
|
|
## CUDA
|
|
|
|
This provides GPU acceleration using an NVIDIA GPU. Make sure to have the [CUDA toolkit](https://developer.nvidia.com/cuda-toolkit) installed.
|
|
|
|
#### Download directly from NVIDIA
|
|
You may find the official downloads here: [NVIDIA developer site](https://developer.nvidia.com/cuda-downloads).
|
|
|
|
|
|
#### Compile and run inside a Fedora Toolbox Container
|
|
We also have a [guide](./backend/CUDA-FEDORA.md) for setting up CUDA toolkit in a Fedora [toolbox container](https://containertoolbx.org/).
|
|
|
|
**Recommended for:**
|
|
- ***Necessary*** for users of [Atomic Desktops for Fedora](https://fedoraproject.org/atomic-desktops/); such as: [Silverblue](https://fedoraproject.org/atomic-desktops/silverblue/) and [Kinoite](https://fedoraproject.org/atomic-desktops/kinoite/).
|
|
- (there are no supported CUDA packages for these systems)
|
|
- ***Necessary*** for users that have a host that is not a: [Supported Nvidia CUDA Release Platform](https://developer.nvidia.com/cuda-downloads).
|
|
- (for example, you may have [Fedora 42 Beta](https://fedoramagazine.org/announcing-fedora-linux-42-beta/) as your your host operating system)
|
|
- ***Convenient*** For those running [Fedora Workstation](https://fedoraproject.org/workstation/) or [Fedora KDE Plasma Desktop](https://fedoraproject.org/spins/kde), and want to keep their host system clean.
|
|
- *Optionally* toolbox packages are available: [Arch Linux](https://archlinux.org/), [Red Hat Enterprise Linux >= 8.5](https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux), or [Ubuntu](https://ubuntu.com/download)
|
|
|
|
|
|
### Compilation
|
|
```bash
|
|
cmake -B build -DGGML_CUDA=ON
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
### Override Compute Capability Specifications
|
|
|
|
If `nvcc` cannot detect your gpu, you may get compile-warnings such as:
|
|
```text
|
|
nvcc warning : Cannot find valid GPU for '-arch=native', default arch is used
|
|
```
|
|
|
|
To override the `native` GPU detection:
|
|
|
|
#### 1. Take note of the `Compute Capability` of your NVIDIA devices: ["CUDA: Your GPU Compute > Capability"](https://developer.nvidia.com/cuda-gpus).
|
|
|
|
```text
|
|
GeForce RTX 4090 8.9
|
|
GeForce RTX 3080 Ti 8.6
|
|
GeForce RTX 3070 8.6
|
|
```
|
|
|
|
#### 2. Manually list each varying `Compute Capability` in the `CMAKE_CUDA_ARCHITECTURES` list.
|
|
|
|
```bash
|
|
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86;89"
|
|
```
|
|
|
|
### Runtime CUDA environmental variables
|
|
|
|
You may set the [cuda environmental variables](https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#env-vars) at runtime.
|
|
|
|
```bash
|
|
# Use `CUDA_VISIBLE_DEVICES` to hide the first compute device.
|
|
CUDA_VISIBLE_DEVICES="-0" ./build/bin/llama-server --model /srv/models/llama.gguf
|
|
```
|
|
|
|
### Unified Memory
|
|
|
|
The environment variable `GGML_CUDA_ENABLE_UNIFIED_MEMORY=1` can be used to enable unified memory in Linux. This allows swapping to system RAM instead of crashing when the GPU VRAM is exhausted. In Windows this setting is available in the NVIDIA control panel as `System Memory Fallback`.
|
|
|
|
### Performance Tuning
|
|
|
|
The following compilation options are also available to tweak performance:
|
|
|
|
| Option | Legal values | Default | Description |
|
|
|-------------------------------|------------------------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
| GGML_CUDA_FORCE_MMQ | Boolean | false | Force the use of custom matrix multiplication kernels for quantized models instead of FP16 cuBLAS even if there is no int8 tensor core implementation available (affects V100, CDNA and RDNA3+). MMQ kernels are enabled by default on GPUs with int8 tensor core support. With MMQ force enabled, speed for large batch sizes will be worse but VRAM consumption will be lower. |
|
|
| GGML_CUDA_FORCE_CUBLAS | Boolean | false | Force the use of FP16 cuBLAS instead of custom matrix multiplication kernels for quantized models |
|
|
| GGML_CUDA_F16 | Boolean | false | If enabled, use half-precision floating point arithmetic for the CUDA dequantization + mul mat vec kernels and for the q4_1 and q5_1 matrix matrix multiplication kernels. Can improve performance on relatively recent GPUs. |
|
|
| GGML_CUDA_PEER_MAX_BATCH_SIZE | Positive integer | 128 | Maximum batch size for which to enable peer access between multiple GPUs. Peer access requires either Linux or NVLink. When using NVLink enabling peer access for larger batch sizes is potentially beneficial. |
|
|
| GGML_CUDA_FA_ALL_QUANTS | Boolean | false | Compile support for all KV cache quantization type (combinations) for the FlashAttention CUDA kernels. More fine-grained control over KV cache size but compilation takes much longer. |
|
|
|
|
## MUSA
|
|
|
|
This provides GPU acceleration using a Moore Threads GPU. Make sure to have the [MUSA SDK](https://developer.mthreads.com/musa/musa-sdk) installed.
|
|
|
|
#### Download directly from Moore Threads
|
|
|
|
You may find the official downloads here: [Moore Threads developer site](https://developer.mthreads.com/sdk/download/musa).
|
|
|
|
### Compilation
|
|
|
|
```bash
|
|
cmake -B build -DGGML_MUSA=ON
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
#### Override Compute Capability Specifications
|
|
|
|
By default, all supported compute capabilities are enabled. To customize this behavior, you can specify the `MUSA_ARCHITECTURES` option in the CMake command:
|
|
|
|
```bash
|
|
cmake -B build -DGGML_MUSA=ON -DMUSA_ARCHITECTURES="21"
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
This configuration enables only compute capability `2.1` (MTT S80) during compilation, which can help reduce compilation time.
|
|
|
|
#### Compilation options
|
|
|
|
Most of the compilation options available for CUDA should also be available for MUSA, though they haven't been thoroughly tested yet.
|
|
|
|
- For static builds, add `-DBUILD_SHARED_LIBS=OFF` and `-DCMAKE_POSITION_INDEPENDENT_CODE=ON`:
|
|
```
|
|
cmake -B build -DGGML_MUSA=ON \
|
|
-DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
### Runtime MUSA environmental variables
|
|
|
|
You may set the [musa environmental variables](https://docs.mthreads.com/musa-sdk/musa-sdk-doc-online/programming_guide/Z%E9%99%84%E5%BD%95/) at runtime.
|
|
|
|
```bash
|
|
# Use `MUSA_VISIBLE_DEVICES` to hide the first compute device.
|
|
MUSA_VISIBLE_DEVICES="-0" ./build/bin/llama-server --model /srv/models/llama.gguf
|
|
```
|
|
|
|
### Unified Memory
|
|
|
|
The environment variable `GGML_CUDA_ENABLE_UNIFIED_MEMORY=1` can be used to enable unified memory in Linux. This allows swapping to system RAM instead of crashing when the GPU VRAM is exhausted.
|
|
|
|
## HIP
|
|
|
|
This provides GPU acceleration on HIP-supported AMD GPUs.
|
|
Make sure to have ROCm installed.
|
|
You can download it from your Linux distro's package manager or from here: [ROCm Quick Start (Linux)](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/tutorial/quick-start.html#rocm-install-quick).
|
|
|
|
- Using `CMake` for Linux (assuming a gfx1030-compatible AMD GPU):
|
|
```bash
|
|
HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -R)" \
|
|
cmake -S . -B build -DGGML_HIP=ON -DAMDGPU_TARGETS=gfx1030 -DCMAKE_BUILD_TYPE=Release \
|
|
&& cmake --build build --config Release -- -j 16
|
|
```
|
|
|
|
To enhance flash attention performance on RDNA3+ or CDNA architectures, you can utilize the rocWMMA library by enabling the `-DGGML_HIP_ROCWMMA_FATTN=ON` option. This requires rocWMMA headers to be installed on the build system.
|
|
|
|
The rocWMMA library is included by default when installing the ROCm SDK using the `rocm` meta package provided by AMD. Alternatively, if you are not using the meta package, you can install the library using the `rocwmma-dev` or `rocwmma-devel` package, depending on your system's package manager.
|
|
|
|
As an alternative, you can manually install the library by cloning it from the official [GitHub repository](https://github.com/ROCm/rocWMMA), checkout the corresponding version tag (e.g. `rocm-6.2.4`) and set `-DCMAKE_CXX_FLAGS="-I<path/to/rocwmma>/library/include/"` in CMake. This also works under Windows despite not officially supported by AMD.
|
|
|
|
Note that if you get the following error:
|
|
```
|
|
clang: error: cannot find ROCm device library; provide its path via '--rocm-path' or '--rocm-device-lib-path', or pass '-nogpulib' to build without ROCm device library
|
|
```
|
|
Try searching for a directory under `HIP_PATH` that contains the file
|
|
`oclc_abi_version_400.bc`. Then, add the following to the start of the
|
|
command: `HIP_DEVICE_LIB_PATH=<directory-you-just-found>`, so something
|
|
like:
|
|
```bash
|
|
HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -p)" \
|
|
HIP_DEVICE_LIB_PATH=<directory-you-just-found> \
|
|
cmake -S . -B build -DGGML_HIP=ON -DAMDGPU_TARGETS=gfx1030 -DCMAKE_BUILD_TYPE=Release \
|
|
&& cmake --build build -- -j 16
|
|
```
|
|
|
|
- Using `CMake` for Windows (using x64 Native Tools Command Prompt for VS, and assuming a gfx1100-compatible AMD GPU):
|
|
```bash
|
|
set PATH=%HIP_PATH%\bin;%PATH%
|
|
cmake -S . -B build -G Ninja -DAMDGPU_TARGETS=gfx1100 -DGGML_HIP=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release
|
|
cmake --build build
|
|
```
|
|
Make sure that `AMDGPU_TARGETS` is set to the GPU arch you want to compile for. The above example uses `gfx1100` that corresponds to Radeon RX 7900XTX/XT/GRE. You can find a list of targets [here](https://llvm.org/docs/AMDGPUUsage.html#processors)
|
|
Find your gpu version string by matching the most significant version information from `rocminfo | grep gfx | head -1 | awk '{print $2}'` with the list of processors, e.g. `gfx1035` maps to `gfx1030`.
|
|
|
|
|
|
The environment variable [`HIP_VISIBLE_DEVICES`](https://rocm.docs.amd.com/en/latest/understand/gpu_isolation.html#hip-visible-devices) can be used to specify which GPU(s) will be used.
|
|
If your GPU is not officially supported you can use the environment variable [`HSA_OVERRIDE_GFX_VERSION`] set to a similar GPU, for example 10.3.0 on RDNA2 (e.g. gfx1030, gfx1031, or gfx1035) or 11.0.0 on RDNA3.
|
|
|
|
### Unified Memory
|
|
|
|
On Linux it is possible to use unified memory architecture (UMA) to share main memory between the CPU and integrated GPU by setting environment variable `GGML_CUDA_ENABLE_UNIFIED_MEMORY=1`. However, this hurts performance for non-integrated GPUs (but enables working with integrated GPUs).
|
|
|
|
## Vulkan
|
|
|
|
**Windows**
|
|
|
|
### w64devkit
|
|
|
|
Download and extract [`w64devkit`](https://github.com/skeeto/w64devkit/releases).
|
|
|
|
Download and install the [`Vulkan SDK`](https://vulkan.lunarg.com/sdk/home#windows) with the default settings.
|
|
|
|
Launch `w64devkit.exe` and run the following commands to copy Vulkan dependencies:
|
|
```sh
|
|
SDK_VERSION=1.3.283.0
|
|
cp /VulkanSDK/$SDK_VERSION/Bin/glslc.exe $W64DEVKIT_HOME/bin/
|
|
cp /VulkanSDK/$SDK_VERSION/Lib/vulkan-1.lib $W64DEVKIT_HOME/x86_64-w64-mingw32/lib/
|
|
cp -r /VulkanSDK/$SDK_VERSION/Include/* $W64DEVKIT_HOME/x86_64-w64-mingw32/include/
|
|
cat > $W64DEVKIT_HOME/x86_64-w64-mingw32/lib/pkgconfig/vulkan.pc <<EOF
|
|
Name: Vulkan-Loader
|
|
Description: Vulkan Loader
|
|
Version: $SDK_VERSION
|
|
Libs: -lvulkan-1
|
|
EOF
|
|
|
|
```
|
|
|
|
Switch into the `llama.cpp` directory and build using CMake.
|
|
```sh
|
|
cmake -B build -DGGML_VULKAN=ON
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
### Git Bash MINGW64
|
|
|
|
Download and install [`Git-SCM`](https://git-scm.com/downloads/win) with the default settings
|
|
|
|
Download and install [`Visual Studio Community Edition`](https://visualstudio.microsoft.com/) and make sure you select `C++`
|
|
|
|
Download and install [`CMake`](https://cmake.org/download/) with the default settings
|
|
|
|
Download and install the [`Vulkan SDK`](https://vulkan.lunarg.com/sdk/home#windows) with the default settings.
|
|
|
|
Go into your `llama.cpp` directory and right click, select `Open Git Bash Here` and then run the following commands
|
|
|
|
```
|
|
cmake -B build -DGGML_VULKAN=ON
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
Now you can load the model in conversation mode using `Vulkan`
|
|
|
|
```sh
|
|
build/bin/Release/llama-cli -m "[PATH TO MODEL]" -ngl 100 -c 16384 -t 10 -n -2 -cnv
|
|
```
|
|
|
|
### MSYS2
|
|
Install [MSYS2](https://www.msys2.org/) and then run the following commands in a UCRT terminal to install dependencies.
|
|
```sh
|
|
pacman -S git \
|
|
mingw-w64-ucrt-x86_64-gcc \
|
|
mingw-w64-ucrt-x86_64-cmake \
|
|
mingw-w64-ucrt-x86_64-vulkan-devel \
|
|
mingw-w64-ucrt-x86_64-shaderc
|
|
```
|
|
|
|
Switch into the `llama.cpp` directory and build using CMake.
|
|
```sh
|
|
cmake -B build -DGGML_VULKAN=ON
|
|
cmake --build build --config Release
|
|
```
|
|
|
|
**With docker**:
|
|
|
|
You don't need to install Vulkan SDK. It will be installed inside the container.
|
|
|
|
```sh
|
|
# Build the image
|
|
docker build -t llama-cpp-vulkan --target light -f .devops/vulkan.Dockerfile .
|
|
|
|
# Then, use it:
|
|
docker run -it --rm -v "$(pwd):/app:Z" --device /dev/dri/renderD128:/dev/dri/renderD128 --device /dev/dri/card1:/dev/dri/card1 llama-cpp-vulkan -m "/app/models/YOUR_MODEL_FILE" -p "Building a website can be done in 10 simple steps:" -n 400 -e -ngl 33
|
|
```
|
|
|
|
**Without docker**:
|
|
|
|
Firstly, you need to make sure you have installed [Vulkan SDK](https://vulkan.lunarg.com/doc/view/latest/linux/getting_started_ubuntu.html)
|
|
|
|
For example, on Ubuntu 22.04 (jammy), use the command below:
|
|
|
|
```bash
|
|
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | apt-key add -
|
|
wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
|
|
apt update -y
|
|
apt-get install -y vulkan-sdk
|
|
# To verify the installation, use the command below:
|
|
vulkaninfo
|
|
```
|
|
|
|
Alternatively your package manager might be able to provide the appropriate libraries.
|
|
For example for Ubuntu 22.04 you can install `libvulkan-dev` instead.
|
|
For Fedora 40, you can install `vulkan-devel`, `glslc` and `glslang` packages.
|
|
|
|
Then, build llama.cpp using the cmake command below:
|
|
|
|
```bash
|
|
cmake -B build -DGGML_VULKAN=1
|
|
cmake --build build --config Release
|
|
# Test the output binary (with "-ngl 33" to offload all layers to GPU)
|
|
./bin/llama-cli -m "PATH_TO_MODEL" -p "Hi you how are you" -n 50 -e -ngl 33 -t 4
|
|
|
|
# You should see in the output, ggml_vulkan detected your GPU. For example:
|
|
# ggml_vulkan: Using Intel(R) Graphics (ADL GT2) | uma: 1 | fp16: 1 | warp size: 32
|
|
```
|
|
|
|
## CANN
|
|
This provides NPU acceleration using the AI cores of your Ascend NPU. And [CANN](https://www.hiascend.com/en/software/cann) is a hierarchical APIs to help you to quickly build AI applications and service based on Ascend NPU.
|
|
|
|
For more information about Ascend NPU in [Ascend Community](https://www.hiascend.com/en/).
|
|
|
|
Make sure to have the CANN toolkit installed. You can download it from here: [CANN Toolkit](https://www.hiascend.com/developer/download/community/result?module=cann)
|
|
|
|
Go to `llama.cpp` directory and build using CMake.
|
|
```bash
|
|
cmake -B build -DGGML_CANN=on -DCMAKE_BUILD_TYPE=release
|
|
cmake --build build --config release
|
|
```
|
|
|
|
You can test with:
|
|
|
|
```bash
|
|
./build/bin/llama-cli -m PATH_TO_MODEL -p "Building a website can be done in 10 steps:" -ngl 32
|
|
```
|
|
|
|
If the following info is output on screen, you are using `llama.cpp` with the CANN backend:
|
|
```bash
|
|
llm_load_tensors: CANN model buffer size = 13313.00 MiB
|
|
llama_new_context_with_model: CANN compute buffer size = 1260.81 MiB
|
|
```
|
|
|
|
For detailed info, such as model/device supports, CANN install, please refer to [llama.cpp for CANN](./backend/CANN.md).
|
|
|
|
## Arm® KleidiAI™
|
|
KleidiAI is a library of optimized microkernels for AI workloads, specifically designed for Arm CPUs. These microkernels enhance performance and can be enabled for use by the CPU backend.
|
|
|
|
To enable KleidiAI, go to the llama.cpp directory and build using CMake
|
|
```bash
|
|
cmake -B build -DGGML_CPU_KLEIDIAI=ON
|
|
cmake --build build --config Release
|
|
```
|
|
You can verify that KleidiAI is being used by running
|
|
```bash
|
|
./build/bin/llama-cli -m PATH_TO_MODEL -p "What is a car?"
|
|
```
|
|
If KleidiAI is enabled, the ouput will contain a line similar to:
|
|
```
|
|
load_tensors: CPU_KLEIDIAI model buffer size = 3474.00 MiB
|
|
```
|
|
KleidiAI's microkernels implement optimized tensor operations using Arm CPU features such as dotprod, int8mm and SME. llama.cpp selects the most efficient kernel based on runtime CPU feature detection. However, on platforms that support SME, you must manually enable SME microkernels by setting the environment variable `GGML_KLEIDIAI_SME=1`.
|
|
|
|
Depending on your build target, other higher priority backends may be enabled by default. To ensure the CPU backend is used, you must disable the higher priority backends either at compile time, e.g. -DGGML_METAL=OFF, or during run-time using the command line option `--device none`.
|
|
|
|
## OpenCL
|
|
|
|
This provides GPU acceleration through OpenCL on recent Adreno GPU.
|
|
More information about OpenCL backend can be found in [OPENCL.md](./backend/OPENCL.md) for more information.
|
|
|
|
### Android
|
|
|
|
Assume NDK is available in `$ANDROID_NDK`. First, install OpenCL headers and ICD loader library if not available,
|
|
|
|
```sh
|
|
mkdir -p ~/dev/llm
|
|
cd ~/dev/llm
|
|
|
|
git clone https://github.com/KhronosGroup/OpenCL-Headers && \
|
|
cd OpenCL-Headers && \
|
|
cp -r CL $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include
|
|
|
|
cd ~/dev/llm
|
|
|
|
git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader && \
|
|
cd OpenCL-ICD-Loader && \
|
|
mkdir build_ndk && cd build_ndk && \
|
|
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
|
|
-DOPENCL_ICD_LOADER_HEADERS_DIR=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include \
|
|
-DANDROID_ABI=arm64-v8a \
|
|
-DANDROID_PLATFORM=24 \
|
|
-DANDROID_STL=c++_shared && \
|
|
ninja && \
|
|
cp libOpenCL.so $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android
|
|
```
|
|
|
|
Then build llama.cpp with OpenCL enabled,
|
|
|
|
```sh
|
|
cd ~/dev/llm
|
|
|
|
git clone https://github.com/ggml-org/llama.cpp && \
|
|
cd llama.cpp && \
|
|
mkdir build-android && cd build-android
|
|
|
|
cmake .. -G Ninja \
|
|
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
|
|
-DANDROID_ABI=arm64-v8a \
|
|
-DANDROID_PLATFORM=android-28 \
|
|
-DBUILD_SHARED_LIBS=OFF \
|
|
-DGGML_OPENCL=ON
|
|
|
|
ninja
|
|
```
|
|
|
|
### Windows Arm64
|
|
|
|
First, install OpenCL headers and ICD loader library if not available,
|
|
|
|
```powershell
|
|
mkdir -p ~/dev/llm
|
|
|
|
cd ~/dev/llm
|
|
git clone https://github.com/KhronosGroup/OpenCL-Headers && cd OpenCL-Headers
|
|
mkdir build && cd build
|
|
cmake .. -G Ninja `
|
|
-DBUILD_TESTING=OFF `
|
|
-DOPENCL_HEADERS_BUILD_TESTING=OFF `
|
|
-DOPENCL_HEADERS_BUILD_CXX_TESTS=OFF `
|
|
-DCMAKE_INSTALL_PREFIX="$HOME/dev/llm/opencl"
|
|
cmake --build . --target install
|
|
|
|
cd ~/dev/llm
|
|
git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader && cd OpenCL-ICD-Loader
|
|
mkdir build && cd build
|
|
cmake .. -G Ninja `
|
|
-DCMAKE_BUILD_TYPE=Release `
|
|
-DCMAKE_PREFIX_PATH="$HOME/dev/llm/opencl" `
|
|
-DCMAKE_INSTALL_PREFIX="$HOME/dev/llm/opencl"
|
|
cmake --build . --target install
|
|
```
|
|
|
|
Then build llama.cpp with OpenCL enabled,
|
|
|
|
```powershell
|
|
cmake .. -G Ninja `
|
|
-DCMAKE_TOOLCHAIN_FILE="$HOME/dev/llm/llama.cpp/cmake/arm64-windows-llvm.cmake" `
|
|
-DCMAKE_BUILD_TYPE=Release `
|
|
-DCMAKE_PREFIX_PATH="$HOME/dev/llm/opencl" `
|
|
-DBUILD_SHARED_LIBS=OFF `
|
|
-DGGML_OPENCL=ON
|
|
ninja
|
|
```
|
|
|
|
## Android
|
|
|
|
To read documentation for how to build on Android, [click here](./android.md)
|
|
|
|
## IBM Z & LinuxONE
|
|
|
|
To read documentation for how to build on IBM Z & LinuxONE, [click here](./build-s390x.md)
|
|
|
|
## Notes about GPU-accelerated backends
|
|
|
|
The GPU may still be used to accelerate some parts of the computation even when using the `-ngl 0` option. You can fully disable GPU acceleration by using `--device none`.
|
|
|
|
In most cases, it is possible to build and use multiple backends at the same time. For example, you can build llama.cpp with both CUDA and Vulkan support by using the `-DGGML_CUDA=ON -DGGML_VULKAN=ON` options with CMake. At runtime, you can specify which backend devices to use with the `--device` option. To see a list of available devices, use the `--list-devices` option.
|
|
|
|
Backends can be built as dynamic libraries that can be loaded dynamically at runtime. This allows you to use the same llama.cpp binary on different machines with different GPUs. To enable this feature, use the `GGML_BACKEND_DL` option when building.
|