在纯 C/C++ 中推断 Meta 的 LLaMA 模型(和其他模型)
server
其主要目标是在宽 各种硬件 - 本地和云端。
llama.cpp
自成立以来,该项目已经 由于许多贡献,显着改善。它是为 ggml 库开发新功能的主要游乐场。
支持的平台:
支持的型号:
通常,还支持以下基本模型的微调。
多式联运模型:
绑定:
用户界面:
除非另有说明,否则这些项目是开源的,具有宽松的许可:
以下是在 M2 Ultra 上使用 LLaMA v2 13B 的典型运行:
$ make -j && ./main -m models/llama-13b-v2/ggml-model-q4_0.gguf -p "Building a website can be done in 10 simple steps:\nStep 1:" -n 400 -e I llama.cpp build info: I UNAME_S: Darwin I UNAME_P: arm I UNAME_M: arm64 I CFLAGS: -I. -O3 -std=c11 -fPIC -DNDEBUG -Wall -Wextra -Wpedantic -Wcast-qual -Wdouble-promotion -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -pthread -DGGML_USE_K_QUANTS -DGGML_USE_ACCELERATE I CXXFLAGS: -I. -I./common -O3 -std=c++11 -fPIC -DNDEBUG -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wno-multichar -pthread -DGGML_USE_K_QUANTS I LDFLAGS: -framework Accelerate I CC: Apple clang version 14.0.3 (clang-1403.0.22.14.1) I CXX: Apple clang version 14.0.3 (clang-1403.0.22.14.1) make: Nothing to be done for `default'. main: build = 1041 (cf658ad) main: seed = 1692823051 llama_model_loader: loaded meta data with 16 key-value pairs and 363 tensors from models/llama-13b-v2/ggml-model-q4_0.gguf (version GGUF V1 (latest)) llama_model_loader: - type f32: 81 tensors llama_model_loader: - type q4_0: 281 tensors llama_model_loader: - type q6_K: 1 tensors llm_load_print_meta: format = GGUF V1 (latest) llm_load_print_meta: arch = llama llm_load_print_meta: vocab type = SPM llm_load_print_meta: n_vocab = 32000 llm_load_print_meta: n_merges = 0 llm_load_print_meta: n_ctx_train = 4096 llm_load_print_meta: n_ctx = 512 llm_load_print_meta: n_embd = 5120 llm_load_print_meta: n_head = 40 llm_load_print_meta: n_head_kv = 40 llm_load_print_meta: n_layer = 40 llm_load_print_meta: n_rot = 128 llm_load_print_meta: n_gqa = 1 llm_load_print_meta: f_norm_eps = 1.0e-05 llm_load_print_meta: f_norm_rms_eps = 1.0e-05 llm_load_print_meta: n_ff = 13824 llm_load_print_meta: freq_base = 10000.0 llm_load_print_meta: freq_scale = 1 llm_load_print_meta: model type = 13B llm_load_print_meta: model ftype = mostly Q4_0 llm_load_print_meta: model size = 13.02 B llm_load_print_meta: general.name = LLaMA v2 llm_load_print_meta: BOS token = 1 '<s>' llm_load_print_meta: EOS token = 2 '</s>' llm_load_print_meta: UNK token = 0 '<unk>' llm_load_print_meta: LF token = 13 '<0x0A>' llm_load_tensors: ggml ctx size = 0.11 MB llm_load_tensors: mem required = 7024.01 MB (+ 400.00 MB per state) ................................................................................................... llama_new_context_with_model: kv self size = 400.00 MB llama_new_context_with_model: compute buffer total size = 75.41 MB system_info: n_threads = 16 / 24 | AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 0 | VSX = 0 | sampling: repeat_last_n = 64, repeat_penalty = 1.100000, presence_penalty = 0.000000, frequency_penalty = 0.000000, top_k = 40, tfs_z = 1.000000, top_p = 0.950000, typical_p = 1.000000, temp = 0.800000, mirostat = 0, mirostat_lr = 0.100000, mirostat_ent = 5.000000 generate: n_ctx = 512, n_batch = 512, n_predict = 400, n_keep = 0 Building a website can be done in 10 simple steps: Step 1: Find the right website platform. Step 2: Choose your domain name and hosting plan. Step 3: Design your website layout. Step 4: Write your website content and add images. Step 5: Install security features to protect your site from hackers or spammers Step 6: Test your website on multiple browsers, mobile devices, operating systems etc… Step 7: Test it again with people who are not related to you personally – friends or family members will work just fine! Step 8: Start marketing and promoting the website via social media channels or paid ads Step 9: Analyze how many visitors have come to your site so far, what type of people visit more often than others (e.g., men vs women) etc… Step 10: Continue to improve upon all aspects mentioned above by following trends in web design and staying up-to-date on new technologies that can enhance user experience even further! How does a Website Work? A website works by having pages, which are made of HTML code. This code tells your computer how to display the content on each page you visit – whether it’s an image or text file (like PDFs). In order for someone else’s browser not only be able but also want those same results when accessing any given URL; some additional steps need taken by way of programming scripts that will add functionality such as making links clickable! The most common type is called static HTML pages because they remain unchanged over time unless modified manually (either through editing files directly or using an interface such as WordPress). They are usually served up via HTTP protocols – this means anyone can access them without having any special privileges like being part of a group who is allowed into restricted areas online; however, there may still exist some limitations depending upon where one lives geographically speaking. How to llama_print_timings: load time = 576.45 ms llama_print_timings: sample time = 283.10 ms / 400 runs ( 0.71 ms per token, 1412.91 tokens per second) llama_print_timings: prompt eval time = 599.83 ms / 19 tokens ( 31.57 ms per token, 31.68 tokens per second) llama_print_timings: eval time = 24513.59 ms / 399 runs ( 61.44 ms per token, 16.28 tokens per second) llama_print_timings: total time = 25431.49 ms
这是在一台 M7 Pro MacBook 上运行 LLaMA-1B 和 whisper.cpp 的另一个演示:
https://user-images.githubusercontent.com/1991296/224442907-7693d4be-acaa-4e01-8b4f-add84093ffff.mp4
下面是大多数受支持模型的端到端二进制生成和模型转换步骤。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
为了构建llama.cpp你有三种不同的选择。
用:
make
在 Linux 或 MacOS 上:
make
在 Windows 上:
w64devkit
w64devkit.exe
cd
llama.cpp
make
用:
CMake
mkdir build
cd build
cmake ..
cmake --build . --config Release
使用(版本 0.11 或更高版本):
Zig
可以使用标准构建参数(例如 AVX2、FMA、F16C、 还可以针对其他操作系统和体系结构进行交叉编译:
zig build -Doptimize=ReleaseFast -Dtarget=x86_64-windows-gnu -Dcpu=x86_64+avx2+fma+f16c
该命令将为你提供有效的使用选项。
zig targets
使用 (FreeBSD):
gmake
在 FreeBSD 中安装并激活 DRM
将用户添加到视频组
安装编译依赖项。
sudo pkg install gmake automake autoconf pkgconf llvm15 clinfo clover \
opencl clblast openblas
gmake CC=/usr/local/bin/clang15 CXX=/usr/local/bin/clang++15 -j4
笔记:使用此软件包,你可以使用 OPENBLAS llama.cpp和 CLBLAST 支持在 FreeBSD 中使用 OpenCL GPU 加速。请阅读 以下文档中的使用说明和激活此选项。
在 MacOS 上,Metal 默认处于启用状态。使用 Metal 可使计算在 GPU 上运行。 要在编译时禁用 Metal 构建,请使用 flag 或 cmake 选项。
LLAMA_NO_METAL=1
LLAMA_METAL=OFF
使用 Metal 支持构建时,你可以使用命令行显式禁用 GPU 推理 论点。
--n-gpu-layers|-ngl 0
MPI 允许你将计算分布在计算机集群上。由于 LLM 预测的串行性,这不会产生任何端到端的加速,但它可以让你运行比在单台机器上适合 RAM 更大的模型。
首先,你需要在系统上安装 MPI 库。两个最流行(唯一?)的选项是 MPICH 和 OpenMPI。两者都可以通过包管理器(Homebrew、MacPorts 等)进行安装。
apt
接下来,你需要在所有计算机上构建设置为 true 的项目;如果使用 进行构建,则还需要指定支持 MPI 的编译器(使用 CMake 进行构建时,会自动配置):
LLAMA_MPI
make
用:
make
make CC=mpicc CXX=mpicxx LLAMA_MPI=1
用:
CMake
cmake -S . -B build -DLLAMA_MPI=ON
构建程序后,下载/转换集群中所有计算机上的权重。权重和程序的路径在所有计算机上都应相同。
接下来,确保从主主机对每台计算机进行无密码 SSH 访问,并创建一个包含主机名及其相对“权重”(插槽)列表的主机名。如果要使用 localhost 进行计算,请使用其本地子网 IP 地址,而不是环回地址或“localhost”。
hostfile
下面是一个示例主机文件:
192.168.0.1:2 malvolio.local:1
上述内容将计算分布在第一台主机上的 2 个进程和第二台主机上的 1 个进程之间。每个进程将使用大致相等数量的 RAM。尽量保持较小的数字,因为进程间(主机内)通信的成本很高。
最后,你可以使用以下命令运行计算:
mpirun
mpirun -hostfile hostfile -n 3 ./main -m ./models/7B/ggml-model-q4_0.gguf -n 128
使用 BLAS 支持构建程序可能会导致使用大于 32(默认值为 512)的批处理进行提示处理时的性能有所提高。支持仅 CPU 的 BLAS 实现不会影响正常生成性能。我们可能会看到涉及 GPU 的 BLAS 实现(例如 cuBLAS、hipBLAS 和 CLBlast)的生成性能改进。目前有几种不同的 BLAS 实现可供构建和使用:
此功能仅在 Mac PC 上可用,并且默认处于启用状态。你可以只使用正常说明进行构建。
这仅使用 CPU 提供 BLAS 加速。确保在你的计算机上安装了 OpenBLAS。
用:
make
在 Linux 上:
make LLAMA_OPENBLAS=1
在 Windows 上:
下载最新的 fortran 版本的 w64devkit。
在你的 PC 上提取。
w64devkit
从你刚刚下载的 OpenBLAS zip 中复制 ,位于文件夹内,在 .
libopenblas.a
lib
w64devkit\x86_64-w64-mingw32\lib
从同一个 OpenBLAS zip 中复制 .
include
w64devkit\x86_64-w64-mingw32\include
跑。
w64devkit.exe
使用命令访问该文件夹。
cd
llama.cpp
从这里你可以运行:
make LLAMA_OPENBLAS=1
在 Linux 上使用:
CMake
mkdir build
cd build
cmake .. -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS
cmake --build . --config Release
查看 BLIS.md 了解更多信息。
SYCL 是一种更高级别的编程模型,用于提高各种硬件加速器的编程效率。
基于 SYCL 的llama.cpp用于支持 Intel GPU(Data Center Max 系列、Flex 系列、Arc 系列、内置 GPU 和 iGPU)。
有关详细信息,请参阅 SYCL 的llama.cpp。
通过 oneAPI 编译器构建将使指令集avx_vnni可用于不支持 avx512 和 avx512_vnni 的英特尔处理器。请注意,此构建配置不支持 Intel GPU。有关英特尔 GPU 支持,请参阅 SYCL 的llama.cpp。
使用手动 oneAPI 安装: 默认情况下,设置为 ,因此,如果你已经获取了英特尔环境脚本并在 cmake 中分配,则将自动选择 Blas 的 mkl 版本。否则,请安装 oneAPI 并按照以下步骤操作:
LLAMA_BLAS_VENDOR
Generic
-DLLAMA_BLAS=ON
mkdir build
cd build
source /opt/intel/oneapi/setvars.sh # You can skip this step if in oneapi-basekit docker image, only required for manual installation
cmake .. -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=Intel10_64lp -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DLLAMA_NATIVE=ON
cmake --build . --config Release
使用 oneAPI docker 镜像: 如果你不想获取环境变量并手动安装 oneAPI,你还可以使用英特尔 docker 容器构建代码:oneAPI-basekit。然后,你可以使用上面给出的命令。
有关更多信息,请查看在 Intel® CPU 上优化和运行 LLaMA2。
这使用 Nvidia GPU 的 CUDA 内核提供 BLAS 加速。确保已安装 CUDA 工具包。你可以从 Linux 发行版的包管理器(例如)或从这里下载它:CUDA Toolkit。
apt install nvidia-cuda-toolkit
对于 Jetson 用户,如果你有 Jetson Orin,你可以尝试以下方法:官方支持。如果你使用的是旧模型(nano/TX2),则在编译之前需要一些额外的操作。
用:
make
make LLAMA_CUBLAS=1
用:
CMake
mkdir build
cd build
cmake .. -DLLAMA_CUBLAS=ON
cmake --build . --config Release
环境变量 CUDA_VISIBLE_DEVICES
可用于指定将使用的 GPU。以下编译选项也可用于调整性能:
选择 | 法律价值 | 违约 | 描述 |
---|---|---|---|
LLAMA_CUDA_FORCE_DMMV | 布尔 | 假 | 强制使用去量化 + 矩阵向量乘法核,而不是使用对量化数据进行矩阵向量乘法的核。默认情况下,决策基于计算能力(6.1/Pascal/GTX 1000 或更高版本的 MMVQ)。不影响 k-quants。 |
LLAMA_CUDA_DMMV_X | 正整数 >= 32 | 32 | CUDA 反量化 + 矩阵向量乘法核每次迭代处理的 x 方向上的值数。增加此值可以提高快速 GPU 的性能。强烈推荐 2 的功率。不影响 k-quants。 |
LLAMA_CUDA_MMV_Y | 正整数 | 1 | CUDA mul mat vec 内核的 y 方向的块大小。增加此值可以提高快速 GPU 的性能。建议使用 2 的幂。 |
LLAMA_CUDA_F16 | 布尔 | 假 | 如果启用,请对 CUDA 反量子化 + 多矩阵 vec 内核以及q4_1 和 q5_1 矩阵乘法核使用半精度浮点运算。可以提高相对较新的 GPU 的性能。 |
LLAMA_CUDA_KQUANTS_ITER | 1 或 2 | 2 | 对于Q2_K和Q6_K量化格式,每次迭代和每个 CUDA 线程处理的值数。将此值设置为 1 可以提高速度较慢的 GPU 的性能。 |
LLAMA_CUDA_PEER_MAX_BATCH_SIZE | 正整数 | 128 | 在多个 GPU 之间启用对等访问的最大批处理大小。对等访问需要 Linux 或 NVLink。使用 NVLink 时,为较大的批量大小启用对等访问可能会有所帮助。 |
这在支持 HIP 的 AMD GPU 上提供 BLAS 加速。 确保已安装 ROCm。 你可以从 Linux 发行版的包管理器或从此处下载它:ROCm 快速入门 (Linux)。
用:
make
make LLAMA_HIPBLAS=1
用于 Linux(假设 gfx1030 兼容 AMD GPU):
CMake
CC=/opt/rocm/llvm/bin/clang CXX=/opt/rocm/llvm/bin/clang++ \
cmake -H. -Bbuild -DLLAMA_HIPBLAS=ON -DAMDGPU_TARGETS=gfx1030 -DCMAKE_BUILD_TYPE=Release \
&& cmake --build build -- -j 16
在 Linux 上,还可以使用统一内存架构 (UMA) 在 CPU 和集成 GPU 之间共享主内存,方法是将 . 但是,这会损害非集成 GPU 的性能(但可以使用集成 GPU)。
-DLLAMA_HIP_UMA=ON"
使用(以目标 gfx1030 为例,使用 16 个 CPU 线程构建):
make
make -j16 LLAMA_HIPBLAS=1 LLAMA_HIP_UMA=1 AMDGPU_TARGETS=gxf1030
用于 Windows(使用 x64 Native Tools Command Prompt for VS,并假设使用 gfx1100 兼容的 AMD GPU):
CMake
set PATH=%HIP_PATH%\bin;%PATH%
mkdir build
cd build
cmake -G Ninja -DAMDGPU_TARGETS=gfx1100 -DLLAMA_HIPBLAS=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
cmake --build .
确保将其设置为要编译的 GPU 架构。上面的示例使用对应于 Radeon RX 7900XTX/XT/GRE。你可以在此处找到目标列表 通过将最重要的版本信息与处理器列表进行匹配来查找 GPU 版本字符串,例如 映射到 。
AMDGPU_TARGETS
gfx1100
rocminfo | grep gfx | head -1 | awk '{print $2}'
gfx1035
gfx1030
环境变量 HIP_VISIBLE_DEVICES
可用于指定将使用的 GPU。
如果你的 GPU 不受官方支持,则可以使用设置为类似 GPU 的环境变量 [],例如 RDNA2 上的 10.3.0(例如 gfx1030、gfx1031 或 gfx1035)或 RDNA3 上的 11.0.0。
以下编译选项也可用于调整性能(是的,它们指的是 CUDA,而不是 HIP,因为它使用与上面的 cuBLAS 版本相同的代码):
HSA_OVERRIDE_GFX_VERSION
选择 | 法律价值 | 违约 | 描述 |
---|---|---|---|
LLAMA_CUDA_DMMV_X | 正整数 >= 32 | 32 | 每次迭代由 HIP 反量化 + 矩阵向量乘法核处理的 x 方向上的值数。增加此值可以提高快速 GPU 的性能。强烈推荐 2 的功率。不影响 k-quants。 |
LLAMA_CUDA_MMV_Y | 正整数 | 1 | HIP mul mat vec 内核的 y 方向的块大小。增加此值可以提高快速 GPU 的性能。建议使用 2 的幂。不影响 k-quants。 |
LLAMA_CUDA_KQUANTS_ITER | 1 或 2 | 2 | Q2_K 和 Q6_K 量化格式的每次迭代和每个 HIP 线程处理的值数。将此值设置为 1 可以提高速度较慢的 GPU 的性能。 |
OpenCL 加速由 CLBlast 项目中的矩阵乘法内核和 ggml 的自定义内核提供,这些内核可以在 GPU 上生成令牌。
你将需要 OpenCL SDK。
对于 Ubuntu 或 Debian,可能需要软件包 。
opencl-headers
ocl-icd
对于 Windows,OpenCL 版本页面上提供了预构建的 SDK。
git clone --recurse-submodules https://github.com/KhronosGroup/OpenCL-SDK.git
mkdir OpenCL-SDK/build
cd OpenCL-SDK/build
cmake .. -DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_TESTING=OFF \
-DOPENCL_SDK_BUILD_SAMPLES=OFF \
-DOPENCL_SDK_TEST_SAMPLES=OFF
cmake --build . --config Release
cmake --install . --prefix /some/path
可以在 CLBlast 版本页面上找到预构建的 CLBlast 二进制文件。对于 Unix 变体,它也可以在操作系统的软件包中找到。
或者,它们可以从源代码构建。
set OPENCL_SDK_ROOT="C:/OpenCL-SDK-v2023.04.17-Win-x64"
git clone https://github.com/CNugteren/CLBlast.git
mkdir CLBlast\build
cd CLBlast\build
cmake .. -DBUILD_SHARED_LIBS=OFF -DOVERRIDE_MSVC_FLAGS_TO_MT=OFF -DTUNERS=OFF -DOPENCL_ROOT=%OPENCL_SDK_ROOT% -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
cmake --install . --prefix C:/CLBlast
git clone https://github.com/CNugteren/CLBlast.git
mkdir CLBlast/build
cd CLBlast/build
cmake .. -DBUILD_SHARED_LIBS=OFF -DTUNERS=OFF
cmake --build . --config Release
cmake --install . --prefix /some/path
where 是构建的库的安装位置(默认为 )。
/some/path
/usr/local
make LLAMA_CLBLAST=1
mkdir build
cd build
cmake .. -DLLAMA_CLBLAST=ON -DCLBlast_DIR=/some/path
cmake --build . --config Release
set CL_BLAST_CMAKE_PKG="C:/CLBlast/lib/cmake/CLBlast"
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build
cd build
cmake .. -DBUILD_SHARED_LIBS=OFF -DLLAMA_CLBLAST=ON -DCMAKE_PREFIX_PATH=%CL_BLAST_CMAKE_PKG% -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
cmake --install . --prefix C:/LlamaCPP
CLBlast 构建支持与 CUDA 版本一样。
--gpu-layers|-ngl
若要选择正确的平台(驱动程序)和设备 (GPU),可以使用环境变量 和 。 选择可以是数字(从 0 开始)或要搜索的文本字符串:
GGML_OPENCL_PLATFORM
GGML_OPENCL_DEVICE
GGML_OPENCL_PLATFORM=1 ./main ...
GGML_OPENCL_DEVICE=2 ./main ...
GGML_OPENCL_PLATFORM=Intel ./main ...
GGML_OPENCL_PLATFORM=AMD GGML_OPENCL_DEVICE=1 ./main ...
默认行为是查找第一个 GPU 设备,但例如,当它是笔记本电脑上的集成 GPU 时,选择器很有用。 如果需要,使用这些变量也可以选择基于 CPU 的驱动程序。
你可以从命令等获取平台和设备的列表。
clinfo -l
使用 docker:
你无需安装 Vulkan SDK。它将安装在容器内。
# Build the image
docker build -t llama-cpp-vulkan -f .devops/main-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
不带 docker:
首先,你需要确保已安装 Vulkan SDK
例如,在 Ubuntu 22.04 (jammy) 上,使用以下命令:
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
或者,你的包管理器可能能够提供适当的库。例如,对于 Ubuntu 22.04,你可以改为安装。
libvulkan-dev
然后,使用下面的 cmake 命令构建llama.cpp:
mkdir -p build
cd build
cmake .. -DLLAMA_VULKAN=1
cmake --build . --config Release
# Test the output binary (with "-ngl 33" to offload all layers to GPU)
./bin/main -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
要获得官方的 LLaMA 2 权重,请参阅获取和使用 Facebook LLaMA 2 模型部分。Hugging Face上还有大量可用的预量化模型。
gguf
# obtain the official LLaMA model weights and place them in ./models
ls ./models
llama-2-7b tokenizer_checklist.chk tokenizer.model
# [Optional] for models using BPE tokenizers
ls ./models
<folder containing weights and tokenizer json> vocab.json
# [Optional] for PyTorch .bin models like Mistral-7B
ls ./models
<folder containing weights and tokenizer json>
# install Python dependencies
python3 -m pip install -r requirements.txt
# convert the model to ggml FP16 format
python3 convert.py models/mymodel/
# [Optional] for models using BPE tokenizers
python convert.py models/mymodel/ --vocab-type bpe
# quantize the model to 4-bits (using Q4_K_M method)
./quantize ./models/mymodel/ggml-model-f16.gguf ./models/mymodel/ggml-model-Q4_K_M.gguf Q4_K_M
# update the gguf filetype to current version if older version is now unsupported
./quantize ./models/mymodel/ggml-model-Q4_K_M.gguf ./models/mymodel/ggml-model-Q4_K_M-v2.gguf COPY
# start inference on a gguf model
./main -m ./models/mymodel/ggml-model-Q4_K_M.gguf -n 128
运行较大的模型时,请确保有足够的磁盘空间来存储所有中间文件。
你将在发布页面上找到预构建的 Windows 二进制文件。
只需下载并解压最新的 zip 包:(例如
llama-b1380-bin-win-avx2-x64.zip)
从解压缩的文件夹中,在此处打开终端/cmd 窗口并放置预转换后的模型文件。测试主要示例,如下所示:
.gguf
.\main -m llama-2-7b.Q4_0.gguf -n 128
由于模型当前已完全加载到内存中,因此你需要足够的磁盘空间来保存它们,并需要足够的 RAM 来加载它们。目前,内存和磁盘要求是相同的。
型 | 原始尺寸 | 量化尺寸 (Q4_0) |
---|---|---|
7乙 | 13 千兆字节 | 3.9千兆字节 |
13乙 | 24千兆字节 | 7.8千兆字节 |
30乙 | 60 千兆字节 | 19.5千兆字节 |
65乙 | 120千兆字节 | 38.5千兆字节 |
支持多种量化方法。它们在生成的模型磁盘大小和推理速度方面有所不同。
(已过时)
型 | 量 | F16系列 | Q4_0 | Q4_1 | Q5_0 | Q5_1 | Q8_0 |
---|---|---|---|---|---|---|---|
7乙 | 困惑 | 5.9066 | 6.1565 | 6.0912 | 5.9862 | 5.9481 | 5.9070 |
7乙 | 文件大小 | 13.0克 | 3.5克 | 3.9克 | 4.3克 | 4.7克 | 6.7克 |
7乙 | MS/TOK @ 4日 | 127 | 55 | 54 | 76 | 83 | 72 |
7乙 | ms/tok @ 8日 | 122 | 43 | 45 | 52 | 56 | 67 |
7乙 | 位数/重量 | 16.0 | 4.5 | 5.0 | 5.5 | 6.0 | 8.5 |
13乙 | 困惑 | 5.2543 | 5.3860 | 5.3608 | 5.2856 | 5.2706 | 5.2548 |
13乙 | 文件大小 | 25.0克 | 6.8克 | 7.6克 | 8.3克 | 9.1克 | 13克 |
13乙 | MS/TOK @ 4日 | - | 103 | 105 | 148 | 160 | 131 |
13乙 | ms/tok @ 8日 | - | 73 | 82 | 98 | 105 | 128 |
13乙 | 位数/重量 | 16.0 | 4.5 | 5.0 | 5.5 | 6.0 | 8.5 |
你可以使用该示例来测量给定提示的困惑度(困惑度越低越好)。 有关详细信息,请参阅 https://huggingface.co/docs/transformers/perplexity。
perplexity
上表中的困惑度测量是针对测试数据集 (https://paperswithcode.com/dataset/wikitext-2) 进行的,上下文长度为 512。 每个令牌的时间是在 MacBook M1 Pro 32GB RAM 上使用 4 个和 8 个线程测量的。
wikitext2
./perplexity -m models/7B/ggml-model-q4_0.gguf -f wiki.test.raw
perplexity : calculating perplexity over 655 chunks 24.43 seconds per pass - ETA 4.45 hours [1]4.5970,[2]5.1807,[3]6.0382,...
4.45小时后,你将有最后的困惑。
如果你想要一个更像ChatGPT的体验,你可以通过作为参数传递来在交互模式下运行。 在此模式下,你始终可以通过按 Ctrl+C 并输入一行或多行文本来中断生成,这些文本将转换为标记并附加到当前上下文中。你还可以使用参数 指定反向提示。这将导致每当在生成中遇到反向提示字符串的确切标记时,都会提示用户输入。一个典型的用法是使用一个提示,使 LLaMa 模拟多个用户之间的聊天,比如 Alice 和 Bob,然后通过 .
-i
-r "reverse prompt string"
-r "Alice:"
下面是使用命令调用的少量交互示例
# default arguments using a 7B model
./examples/chat.sh
# advanced chat with a 13B model
./examples/chat-13B.sh
# custom arguments using a 13B model
./main -m ./models/13B/ggml-model-q4_0.gguf -n 256 --repeat_penalty 1.0 --color -i -r "User:" -f prompts/chat-with-bob.txt
请注意,使用 用于区分用户输入和生成的文本。其他参数在示例程序的 README 中有更详细的解释。
--color
main
通过利用 和 ,可以在调用 时保存和恢复提示、用户输入和模型生成。该脚本通过支持长时间运行的可恢复聊天会话来演示这一点。要使用此示例,你必须提供一个文件来缓存初始聊天提示和一个目录来保存聊天会话,并且可以选择提供与 相同的变量。相同的提示缓存可以重复用于新的聊天会话。请注意,提示缓存和聊天目录都绑定到初始提示 () 和模型文件。
./main
--prompt-cache
--prompt-cache-all
./examples/chat-persistent.sh
chat-13B.sh
PROMPT_TEMPLATE
# Start a new chat
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/default ./examples/chat-persistent.sh
# Resume that chat
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/default ./examples/chat-persistent.sh
# Start a different chat with the same prompt/model
PROMPT_CACHE_FILE=chat.prompt.bin CHAT_SAVE_DIR=./chat/another ./examples/chat-persistent.sh
# Different prompt cache for different prompt/model
PROMPT_TEMPLATE=./prompts/chat-with-bob.txt PROMPT_CACHE_FILE=bob.prompt.bin \
CHAT_SAVE_DIR=./chat/bob ./examples/chat-persistent.sh
llama.cpp支持语法来约束模型输出。例如,可以强制模型仅输出 JSON:
./main -m ./models/13B/ggml-model-q4_0.gguf -n 256 --grammar-file grammars/json.gbnf -p 'Request: schedule a call at 8pm; Command:'
该文件夹包含一些示例语法。要编写自己的内容,请查看 GBNF 指南。
grammars/
要创作更复杂的 JSON 语法,你还可以查看 https://grammar.intrinsiclabs.ai/,这是一款浏览器应用程序,可让你编写 TypeScript 接口,并将其编译为 GBNF 语法,你可以保存以供本地使用。请注意,该应用程序是由社区成员构建和维护的,请在其存储库中提交任何问题或 FR,而不是此存储库。
ggml
./models
main
./examples/alpaca.sh
试运行:
== Running in interactive mode. == - Press Ctrl+C to interject at any time. - Press Return to return control to LLaMa. - If you want to submit another line, end your input in '\'. Below is an instruction that describes a task. Write a response that appropriately completes the request. > How many letters are there in the English alphabet? There 26 letters in the English Alphabet > What is the most common way of transportation in Amsterdam? The majority (54%) are using public transit. This includes buses, trams and metros with over 100 lines throughout the city which make it very accessible for tourists to navigate around town as well as locals who commute by tram or metro on a daily basis > List 5 words that start with "ca". cadaver, cauliflower, cabbage (vegetable), catalpa (tree) and Cailleach. >
如果你的问题与模型生成质量有关,那么请至少扫描以下链接和论文以了解 LLaMA 模型的局限性。在选择合适的模型尺寸并了解 LLaMA 模型和 ChatGPT 之间的显着和细微差异时,这一点尤为重要:
你可以使用 termux 轻松在 Android 设备上运行。
llama.cpp
首先,安装 termux 的基本软件包:
pkg install clang wget git cmake
其次,获取 Android NDK,然后使用 CMake 进行构建:
$ mkdir build-android $ cd build-android $ export NDK=<your_ndk_directory> $ cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-23 -DCMAKE_C_FLAGS=-march=armv8.4a+dotprod .. $ make
在你的设备上安装 termux 并运行以访问你的 SD 卡。 最后,将二进制文件和模型文件复制到设备存储中。以下是在 Pixel 5 手机上运行的交互式会话的演示:
termux-setup-storage
llama
https://user-images.githubusercontent.com/271616/225014776-1d567049-ad71-4ef2-b050-55b0b3b9274c.mp4
F-Droid 的 Termux 提供了在 Android 设备上执行项目的替代途径。此方法使你能够直接从终端内构建项目,从而消除了对 root 设备或 SD 卡的要求。
下面概述了使用 OpenBLAS 和 CLBlast 安装项目的指令。这种组合专门设计用于在具有 GPU 的最新设备上提供最佳性能。
如果你选择使用 OpenBLAS,则需要安装相应的软件包。
apt install libopenblas
随后,如果你决定合并 CLBlast,则首先需要安装必要的 OpenCL 软件包:
apt install ocl-icd opencl-headers opencl-clhpp clinfo
为了编译 CLBlast,你需要首先克隆相应的 Git 存储库,该存储库可以在以下 URL 中找到:https://github.com/CNugteren/CLBlast。除此之外,将此存储库克隆到你的主目录中。完成此操作后,导航到 CLBlast 文件夹并执行下面详述的命令:
cmake . make cp libclblast.so* $PREFIX/lib cp ./include/clblast.h ../llama.cpp
按照上述步骤,导航到 LlamaCpp 目录。要使用 OpenBLAS 和 CLBlast 编译它,请执行下面提供的命令:
cp /data/data/com.termux/files/usr/include/openblas/cblas.h . cp /data/data/com.termux/files/usr/include/openblas/openblas_config.h . make LLAMA_CLBLAST=1 //(sometimes you need to run this command twice)
完成上述步骤后,你将成功编译项目。要使用 CLBlast 运行它,需要稍作调整:必须发出命令将操作定向到设备的物理 GPU,而不是虚拟 GPU。必要的命令详述如下:
GGML_OPENCL_PLATFORM=0 GGML_OPENCL_DEVICE=0 export LD_LIBRARY_PATH=/vendor/lib64:$LD_LIBRARY_PATH
(注意:某些 Android 设备,如 Zenfone 8,需要以下命令 - “export LD_LIBRARY_PATH=/system/vendor/lib64:$LD_LIBRARY_PATH”。来源: https://www.reddit.com/r/termux/comments/kc3ynp/opencl_working_in_termux_more_in_comments/ )
为了方便快捷地重新执行,请考虑将这最后一部分记录在.sh脚本文件中。这将使你能够以最小的麻烦重新运行该过程。
将所需的模型放入目录并执行脚本。
~/llama.cpp/models/
./main (...)
我们有三个 Docker 映像可用于此项目:
ghcr.io/ggerganov/llama.cpp:full:此图像包括主可执行文件和将 LLaMA 模型转换为 ggml 并转换为 4 位量化的工具。(平台: ,
linux/amd64
linux/arm64)
ghcr.io/ggerganov/llama.cpp:light:此映像仅包含主可执行文件。(平台: ,
linux/amd64
linux/arm64)
ghcr.io/ggerganov/llama.cpp:server:此映像仅包含服务器可执行文件。(平台: ,
linux/amd64
linux/arm64)
此外,还有以下图像,类似于上面的:
ghcr.io/ggerganov/llama.cpp:full-cuda:与 CUDA 相同,但使用 CUDA 支持进行编译。(平台:
full
linux/amd64)
ghcr.io/ggerganov/llama.cpp:light-cuda:与 CUDA 相同,但使用 CUDA 支持进行编译。(平台:
light
linux/amd64)
ghcr.io/ggerganov/llama.cpp:server-cuda:与 CUDA 相同,但使用 CUDA 支持进行编译。(平台:
server
linux/amd64)
ghcr.io/ggerganov/llama.cpp:full-rocm:与 ROCm 支持相同,但编译。(平台: ,
full
linux/amd64
linux/arm64)
ghcr.io/ggerganov/llama.cpp:light-rocm:与 ROCm 支持相同,但编译。(平台: ,
light
linux/amd64
linux/arm64)
ghcr.io/ggerganov/llama.cpp:server-rocm:与 ROCm 支持相同,但编译。(平台: ,
server
linux/amd64
linux/arm64)
除了构建之外,启用了 GPU 的映像目前尚未由 CI 测试。它们不是使用 .devops/ 中定义的 Dockerfile 和 .github/workflows/docker.yml 中定义的 GitHub Action 中的任何变体构建的。如果你需要不同的设置(例如,不同的 CUDA 或 ROCm 库,则现在需要在本地构建映像)。
下载模型,将它们转换为 ggml 并优化它们的最简单方法是使用 --all-in-one 命令,其中包含完整的 docker 映像。
将下面替换为下载模型的实际路径。
/path/to/models
docker run -v /path/to/models:/models ghcr.io/ggerganov/llama.cpp:full --all-in-one "/models/" 7B
完成后,你就可以开始玩了!
docker run -v /path/to/models:/models ghcr.io/ggerganov/llama.cpp:full --run -m /models/7B/ggml-model-q4_0.gguf -p "Building a website can be done in 10 simple steps:" -n 512
或带有浅色图像:
docker run -v /path/to/models:/models ghcr.io/ggerganov/llama.cpp:light -m /models/7B/ggml-model-q4_0.gguf -p "Building a website can be done in 10 simple steps:" -n 512
或使用服务器映像:
docker run -v /path/to/models:/models -p 8000:8000 ghcr.io/ggerganov/llama.cpp:server -m /models/7B/ggml-model-q4_0.gguf --port 8000 --host 0.0.0.0 -n 512
假设一个人在 Linux 上正确安装了 nvidia-container-toolkit,或者正在使用支持 GPU 的云,则应该可以在容器内访问。
cuBLAS
docker build -t local/llama.cpp:full-cuda -f .devops/full-cuda.Dockerfile .
docker build -t local/llama.cpp:light-cuda -f .devops/main-cuda.Dockerfile .
docker build -t local/llama.cpp:server-cuda -f .devops/server-cuda.Dockerfile .
你可能希望传入一些不同的 ,具体取决于容器主机支持的 CUDA 环境以及 GPU 架构。
ARGS
默认值为:
CUDA_VERSION设置为
11.7.1
CUDA_DOCKER_ARCH设置为
all
生成的图像与非 CUDA 图像基本相同:
local/llama.cpp:full-cuda:此图像包括主可执行文件和将 LLaMA 模型转换为 ggml 并转换为 4 位量化的工具。
local/llama.cpp:light-cuda:此映像仅包含主可执行文件。
local/llama.cpp:server-cuda:此映像仅包含服务器可执行文件。
在本地构建后,Usage 类似于非 CUDA 示例,但你需要添加标志。你还需要使用该标志。
--gpus
--n-gpu-layers
docker run --gpus all -v /path/to/models:/models local/llama.cpp:full-cuda --run -m /models/7B/ggml-model-q4_0.gguf -p "Building a website can be done in 10 simple steps:" -n 512 --n-gpu-layers 1
docker run --gpus all -v /path/to/models:/models local/llama.cpp:light-cuda -m /models/7B/ggml-model-q4_0.gguf -p "Building a website can be done in 10 simple steps:" -n 512 --n-gpu-layers 1
docker run --gpus all -v /path/to/models:/models local/llama.cpp:server-cuda -m /models/7B/ggml-model-q4_0.gguf --port 8000 --host 0.0.0.0 -n 512 --n-gpu-layers 1
llama.cpp
master
for
void * ptr
int & a
z = ggml_mul_mat(ctx, x, y)
均值zT = x @ yT