* Arm AArch64: optimized GEMV and GEMM kernels for q4_0_q8_0, and q8_0_q8_0 quantization
* Arm AArch64: add optimized GEMV and GEMM asm kernels for q4_0_q8_0 quantization and refactor code to address llama.cpp pr#5780 suggestions
* Arm AArch64: add optimized GEMV and GEMM asm kernels for q4_0_q8_0 quantization and refactor code to address llama.cpp pr#5780 suggestions
* Arm AArch64: add optimized GEMV and GEMM asm kernels for q4_0_q8_0 quantization and refactor code to address llama.cpp pr#5780 suggestions
* Arm AArch64: add optimized GEMV and GEMM asm kernels for q4_0_q8_0 quantization and refactor code to address llama.cpp pr#5780 suggestions
* Arm AArch64: add copyright claim only to ggml-aarch64.cpp and ggml-aarch64.h files
* Arm AArch64: minor code refactoring for rebase
* Arm AArch64: minor code refactoring for resolving a build issue with cmake
* Arm AArch64: minor code refactoring to split the Q4_0_AARC64 type into three separate types: Q4_0_4_4, Q4_0_4_8, and Q4_0_8_8
* Arm AArch64: minor code change for resolving a build issue with server-windows
* retrigger checks
* Arm AArch64: minor code changes for rebase
* Arm AArch64: minor changes to skip the pr#7433 vec_dot code for arm cpus with SVE VL not equal to 256 bits
* Arm AArch64: remove stale LLAMA_QKK_64 from CMakeLists.txt and delete build.zig
* Arm AArch64: add reference scalar gemm and gemv, and avoid dynamic memory allocations during quantization for Q4_0_4_4, Q4_0_4_8, and Q4_0_8_8
* Arm AArch64: add multithreaded quantization support for the new types: Q4_0_4_4, Q4_0_4_8, and Q4_0_8_8
* Arm AArch64: minor code refactoring
* Arm AArch64: simplify logic for calling gemm and gemv functions in ggml_compute_forward_mul_mat
* Arm AArch64: minimize changes in ggml_compute_forward_mul_mat
* Arm AArch64: minor code refactoring, and add reference scalar code to quantize routines for new quant types
* Arm AArch64: minor code refactoring
* Arm AArch64: minor code refactoring
* Arm AArch64: minor code refactoring
* rebase on the latest master commit 3fd62a6
and adapt to the new directory structure
* Arm AArch64: remove a redundant comment
* Arm AArch64: add pragma in ggml-aarch64.c to turn -Woverlength-strings warning off
* Arm AArch64: use __aarch64__ check to guard 64-bit neon kernels
* Arm AArch64: update docs/build.md README to include compile time flags for buiilding the Q4_0_4_4 quant type
17 KiB
Build llama.cpp locally
To get the Code:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
In order to build llama.cpp you have four different options.
-
Using
make
:-
On Linux or MacOS:
make
-
On Windows:
- Download the latest fortran version of w64devkit.
- Extract
w64devkit
on your pc. - Run
w64devkit.exe
. - Use the
cd
command to reach thellama.cpp
folder. - From here you can run:
make
-
Notes:
- For
Q4_0_4_4
quantization type build, add theGGML_NO_LLAMAFILE=1
flag. For example, usemake GGML_NO_LLAMAFILE=1
. - For faster compilation, add the
-j
argument to run multiple jobs in parallel. For example,make -j 8
will run 8 jobs in parallel. - For faster repeated compilation, install ccache.
- For debug builds, run
make LLAMA_DEBUG=1
- For
-
-
Using
CMake
:cmake -B build cmake --build build --config Release
Notes:
-
For
Q4_0_4_4
quantization type build, add the-DGGML_LLAMAFILE=OFF
cmake option. For example, usecmake -B build -DGGML_LLAMAFILE=OFF
. -
For faster compilation, add the
-j
argument to run multiple jobs in parallel. For example,cmake --build build --config Release -j 8
will run 8 jobs in parallel. -
For faster repeated compilation, install ccache.
-
For debug builds, there are two cases:
- Single-config generators (e.g. default =
Unix Makefiles
; note that they just ignore the--config
flag):
cmake -B build -DCMAKE_BUILD_TYPE=Debug cmake --build build
- Multi-config generators (
-G
param set to Visual Studio, XCode...):
cmake -B build -G "Xcode" cmake --build build --config Debug
- Single-config generators (e.g. default =
-
-
Using
gmake
(FreeBSD):-
Install and activate DRM in FreeBSD
-
Add your user to video group
-
Install compilation dependencies.
sudo pkg install gmake automake autoconf pkgconf llvm15 openblas gmake CC=/usr/local/bin/clang15 CXX=/usr/local/bin/clang++15 -j4
-
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 GGML_NO_METAL=1
flag or the GGML_METAL=OFF
cmake option.
When built with Metal support, you can explicitly disable GPU inference with the --n-gpu-layers|-ngl 0
command-line
argument.
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). Support with CPU-only BLAS implementations doesn't affect the normal generation performance. We may see generation performance improvements with GPU-involved BLAS implementations, e.g. cuBLAS, hipBLAS. 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
make
:-
On Linux:
make GGML_OPENBLAS=1
-
On Windows:
-
Download the latest fortran version of w64devkit.
-
Download the latest version of OpenBLAS for Windows.
-
Extract
w64devkit
on your pc. -
From the OpenBLAS zip that you just downloaded copy
libopenblas.a
, located inside thelib
folder, insidew64devkit\x86_64-w64-mingw32\lib
. -
From the same OpenBLAS zip copy the content of the
include
folder insidew64devkit\x86_64-w64-mingw32\include
. -
Run
w64devkit.exe
. -
Use the
cd
command to reach thellama.cpp
folder. -
From here you can run:
make GGML_OPENBLAS=1
-
-
-
Using
CMake
on Linux:cmake -B build -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS cmake --build build --config Release
BLIS
Check BLIS.md for more information.
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.
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.
-
Using manual oneAPI installation: By default,
GGML_BLAS_VENDOR
is set toGeneric
, 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: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. Then, you can use the commands given above.
Check Optimizing and Running LLaMA2 on Intel® CPU for more information.
CUDA
This provides GPU acceleration using the CUDA cores of your Nvidia GPU. Make sure to have the CUDA toolkit installed. You can download it from your Linux distro's package manager (e.g. apt install nvidia-cuda-toolkit
) or from here: CUDA Toolkit.
For Jetson user, if you have Jetson Orin, you can try this: Offical Support. If you are using an old model(nano/TX2), need some additional operations before compiling.
-
Using
make
:make GGML_CUDA=1
-
Using
CMake
:cmake -B build -DGGML_CUDA=ON cmake --build build --config Release
The environment variable CUDA_VISIBLE_DEVICES
can be used to specify which GPU(s) will be used. The following compilation options are also available to tweak performance:
Option | Legal values | Default | Description |
---|---|---|---|
GGML_CUDA_FORCE_DMMV | Boolean | false | Force the use of dequantization + matrix vector multiplication kernels instead of using kernels that do matrix vector multiplication on quantized data. By default the decision is made based on compute capability (MMVQ for 6.1/Pascal/GTX 1000 or higher). Does not affect k-quants. |
GGML_CUDA_DMMV_X | Positive integer >= 32 | 32 | Number of values in x direction processed by the CUDA dequantization + matrix vector multiplication kernel per iteration. Increasing this value can improve performance on fast GPUs. Power of 2 heavily recommended. Does not affect k-quants. |
GGML_CUDA_MMV_Y | Positive integer | 1 | Block size in y direction for the CUDA mul mat vec kernels. Increasing this value can improve performance on fast GPUs. Power of 2 recommended. |
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, 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_KQUANTS_ITER | 1 or 2 | 2 | Number of values processed per iteration and per CUDA thread for Q2_K and Q6_K quantization formats. Setting this value to 1 can improve performance for slow 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. |
hipBLAS
This provides BLAS 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).
-
Using
make
:make GGML_HIPBLAS=1
-
Using
CMake
for Linux (assuming a gfx1030-compatible AMD GPU):HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -R)" \ cmake -S . -B build -DGGML_HIPBLAS=ON -DAMDGPU_TARGETS=gfx1030 -DCMAKE_BUILD_TYPE=Release \ && cmake --build build --config Release -- -j 16
On Linux it is also possible to use unified memory architecture (UMA) to share main memory between the CPU and integrated GPU by setting
-DGGML_HIP_UMA=ON
. However, this hurts performance for non-integrated GPUs (but enables working with integrated GPUs).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 fileoclc_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:HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -p)" \ HIP_DEVICE_LIB_PATH=<directory-you-just-found> \ cmake -S . -B build -DGGML_HIPBLAS=ON -DAMDGPU_TARGETS=gfx1030 -DCMAKE_BUILD_TYPE=Release \ && cmake --build build -- -j 16
-
Using
make
(example for target gfx1030, build with 16 CPU threads):make -j16 GGML_HIPBLAS=1 GGML_HIP_UMA=1 AMDGPU_TARGETS=gfx1030
-
Using
CMake
for Windows (using x64 Native Tools Command Prompt for VS, and assuming a gfx1100-compatible AMD GPU):set PATH=%HIP_PATH%\bin;%PATH% cmake -S . -B build -G Ninja -DAMDGPU_TARGETS=gfx1100 -DGGML_HIPBLAS=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 usesgfx1100
that corresponds to Radeon RX 7900XTX/XT/GRE. You can find a list of targets here Find your gpu version string by matching the most significant version information fromrocminfo | grep gfx | head -1 | awk '{print $2}'
with the list of processors, e.g.gfx1035
maps togfx1030
.
The environment variable 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.
The following compilation options are also available to tweak performance (yes, they refer to CUDA, not HIP, because it uses the same code as the cuBLAS version above):
Option | Legal values | Default | Description |
---|---|---|---|
GGML_CUDA_DMMV_X | Positive integer >= 32 | 32 | Number of values in x direction processed by the HIP dequantization + matrix vector multiplication kernel per iteration. Increasing this value can improve performance on fast GPUs. Power of 2 heavily recommended. Does not affect k-quants. |
GGML_CUDA_MMV_Y | Positive integer | 1 | Block size in y direction for the HIP mul mat vec kernels. Increasing this value can improve performance on fast GPUs. Power of 2 recommended. Does not affect k-quants. |
GGML_CUDA_KQUANTS_ITER | 1 or 2 | 2 | Number of values processed per iteration and per HIP thread for Q2_K and Q6_K quantization formats. Setting this value to 1 can improve performance for slow GPUs. |
Vulkan
With docker:
You don't need to install Vulkan SDK. It will be installed inside the container.
# Build the image
docker build -t llama-cpp-vulkan -f .devops/llama-cli-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
For example, on Ubuntu 22.04 (jammy), use the command below:
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:
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
Android
To read documentation for how to build on Android, click here