纯C/C++中LLaMA模型的推理
llama.cpp
GGUFv2 增加了对 64 位大小 + 向后兼容的支持:https://github.com/ggerganov/llama.cpp/pull/2821
添加了对猎鹰模型的支持:https://github.com/ggerganov/llama.cpp/pull/2717
引入了一种新的文件格式:GGUF
与旧格式兼容的最后一个修订版:爸爸9
master
的主要目标是在MacBook上使用4位整数量化运行LLaMA模型。
llama.cpp
的原始实现在一个晚上就被黑客入侵了。从那时起,由于许多捐款,该项目得到了显着改善。该项目主要用于教育目的,并作为为ggml库开发新功能的主要游乐场。
llama.cpp
支持的平台:
支持的型号:
绑定:
用户界面:
以下是在 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
这是在单个M1 Pro MacBook上运行LLaMA-7B和whisper.cpp的另一个演示:
https://user-images.githubusercontent.com/1991296/224442907-7693d4be-acaa-4e01-8b4f-add84093ffff.mp4
以下是LLaMA-7B型号的步骤。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
为了建造美洲驼.cpp你有三种不同的选择。
用:
make
在 Linux 或 MacOS 上:
make
在视窗上:
w64devkit
w64devkit.exe
cd
llama.cpp
make
用:
CMake
mkdir build
cd build
cmake ..
cmake --build . --config Release
使用(版本 0.11 或更高版本):
Zig
优化级别和 CPU 功能的构建可以使用标准构建参数来完成,例如 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
笔记:有了这个软件包,你可以构建美洲驼.cpp支持OPENBLAS和CLBLAST,以便在FreeBSD中使用OpenCL GPU加速。请阅读以下本文档中的使用说明并激活此选项。
使用 Metal 允许在 Apple 设备的 GPU 上执行计算:
用:
make
LLAMA_METAL=1 make
用:
CMake
mkdir build-metal
cd build-metal
cmake -DLLAMA_METAL=ON ..
cmake --build . --config Release
使用 Metal 支持构建时,你可以使用命令行参数启用 GPU 推理。任何大于 0 的值都会将计算卸载到 GPU。例如:
--gpu-layers|-ngl
./main -m ./models/7B/ggml-model-q4_0.gguf -n 128 -ngl 1
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 访问,并创建一个包含主机名及其相对“权重”(插槽)列表的列表。如果要使用本地主机进行计算,请使用其本地子网 IP 地址,而不是环回地址或“本地主机”。
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)的批大小时提高提示处理的性能。BLAS 不会影响正常的生成性能。目前有三种不同的实现:
此功能仅在 Mac PC 上可用,默认情况下处于启用状态。你可以使用常规说明进行构建。
这仅使用 CPU 提供 BLAS 加速。确保在你的计算机上安装了 OpenBLAS。
用:
make
在 Linux 上:
make LLAMA_OPENBLAS=1
在视窗上:
下载 w64devkit 的最新 fortran 版本。
下载最新版本的 OpenBLAS for Windows。
在你的电脑上解压。
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。
默认情况下,设置为 ,因此,如果你已经获取了英特尔环境脚本并在 cmake 中分配,则会自动选择 Blas 的 mkl 版本。你也可以通过以下方式指定它:
LLAMA_BLAS_VENDOR
Generic
-DLLAMA_BLAS=ON
mkdir build
cd build
cmake .. -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=Intel10_64lp -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx
cmake --build . --config Release
这使用 Nvidia GPU 的 CUDA 内核提供 BLAS 加速。确保已安装 CUDA 工具包。你可以从Linux发行版的软件包管理器或从此处下载:CUDA Toolkit。
用:
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-quant。 |
LLAMA_CUDA_DMMV_X | 正整数 >= 32 | 32 | 每次迭代由 CUDA 反量化 + 矩阵向量乘法内核处理的 x 方向上的值数。增加此值可以提高快速 GPU 的性能。强烈推荐 2 的幂。不影响 k-quant。 |
LLAMA_CUDA_MMV_Y | 正整数 | 1 | CUDA mul mat vec 内核在 y 方向上的块大小。增加此值可以提高快速 GPU 的性能。建议使用 2 的幂。 |
LLAMA_CUDA_F16 | 布尔 | 假 | 如果启用,则对 CUDA 反量化 + mul mat vec 内核以及q4_1和q5_1矩阵矩阵乘法内核使用半精度浮点算法。可以提高相对较新的 GPU 的性能。 |
LLAMA_CUDA_KQUANTS_ITER | 1 或 2 | 2 | Q2_K和Q6_K量化格式的每次迭代和每个 CUDA 线程处理的值数。将此值设置为 1 可以提高慢速 GPU 的性能。 |
这在 HIP 支持的 GPU 如 AMD GPU 上提供了 BLAS 加速。确保已安装 ROCm。你可以从Linux发行版的软件包管理器或从此处下载:ROCm快速入门(Linux)。Windows 支持即将推出...
make
make LLAMA_HIPBLAS=1
CMake
mkdir build
cd build
CC=/opt/rocm/llvm/bin/clang CXX=/opt/rocm/llvm/bin/clang++ cmake .. -DLLAMA_HIPBLAS=ON
cmake --build .
环境变量HIP_VISIBLE_DEVICES
可用于指定将使用的 GPU。如果你的 GPU 不受官方支持,你可以使用设置为类似 GPU 的环境变量 [],例如 RDNA2 上的 10.3.0 或 RDNA3 上的 11.0.0。以下编译选项也可用于调整性能(是的,它们指的是 CUDA,而不是 HIP,因为它使用与上面的 cuBLAS 版本相同的代码):
HSA_OVERRIDE_GFX_VERSION
选择 | 法律价值 | 违约 | 描述 |
---|---|---|---|
LLAMA_CUDA_DMMV_X | 正整数 >= 32 | 32 | 每次迭代由 HIP 反量化 + 矩阵向量乘法内核处理的 x 方向上的值数。增加此值可以提高快速 GPU 的性能。强烈推荐 2 的幂。不影响 k-quant。 |
LLAMA_CUDA_MMV_Y | 正整数 | 1 | 在 y 方向上的块大小,用于 HIP mul mat vec 内核。增加此值可以提高快速 GPU 的性能。建议使用 2 的幂。不影响 k-quant。 |
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
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:它可能在你的操作系统软件包中找到。
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
“何处”是将安装构建的库的位置(默认值为 )。
/some/path
/usr/local
建筑:
make LLAMA_CLBLAST=1
mkdir build
cd build
cmake .. -DLLAMA_CLBLAST=ON -DCLBlast_dir=/some/path
cmake --build . --config Release
运行:
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
# obtain the original LLaMA model weights and place them in ./models
ls ./models
65B 30B 13B 7B tokenizer_checklist.chk tokenizer.model
# [Optional] for models using BPE tokenizers
ls ./models
65B 30B 13B 7B vocab.json
# install Python dependencies
python3 -m pip install -r requirements.txt
# convert the 7B model to ggml FP16 format
python3 convert.py models/7B/
# [Optional] for models using BPE tokenizers
python convert.py models/7B/ --vocabtype bpe
# quantize the model to 4-bits (using q4_0 method)
./quantize ./models/7B/ggml-model-f16.gguf ./models/7B/ggml-model-q4_0.gguf q4_0
# run the inference
./main -m ./models/7B/ggml-model-q4_0.gguf -n 128
运行较大的模型时,请确保有足够的磁盘空间来存储所有中间文件。
由于模型当前已完全加载到内存中,因此你需要足够的磁盘空间来保存它们,并需要足够的 RAM 来加载它们。目前,内存和磁盘要求相同。
型 | 原始尺寸 | 量化大小(4 位) |
---|---|---|
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 @ 4th | 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 @ 4th | - | 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
上表中的困惑度测量是针对上下文长度为 512 的测试数据集 (https://paperswithcode.com/dataset/wikitext-2) 完成的。每个令牌的时间是在MacBook M1 Pro 32GB RAM上使用4和8线程测量的。
wikitext2
如果你想要更像 ChatGPT 的体验,你可以通过作为参数传递在交互模式下运行。在此模式下,你始终可以通过按 Ctrl+C 并输入一行或多行文本来中断生成,这些文本将转换为标记并附加到当前上下文中。你还可以使用参数指定反向提示。这将导致每当在生成中遇到反向提示字符串的确切标记时,都会提示用户输入。一个典型的用途是使用提示,使LLaMa模拟多个用户之间的聊天,比如爱丽丝和鲍勃,并通过。
-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
请注意使用 来区分用户输入和生成的文本。示例程序的自述文件中更详细地解释了其他参数。
--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/
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. >
OpenLLaMA是Meta原始LLaMA模型的开放许可复制品。它使用相同的架构,是原始LLaMA权重的直接替代品。
python convert.py <path to OpenLLaMA directory>
注意:这些说明可能因 GGUF 更新而过时
tokenizer.model
models
added_tokens.json
models
gpt4all-lora-quantized.bin
models/gpt4all-7B
ggml
convert.py
python3 convert.py models/gpt4all-7B/gpt4all-lora-quantized.bin
现在,你可以像使用所有其他模型完全相同的方式使用新生成的模型
models/gpt4all-7B/ggml-model-q4_0.bin
尚不支持较新的 GPT4All-J 型号!
ggml
convert.py
python3 convert.py pygmalion-7b/ --outtype q4_1
Pygmalion 7B 和 Metharme 7B 砝码以 bfloat16 精度保存。如果你希望在不进行量化的情况下转换为 ,请指定 as 而不是 。
ggml--outtypef32f16
在创建与模型文件相关的问题之前,请验证所有下载的模型文件的 sha256 校验和,以确认你拥有正确的模型数据文件。
./models
# run the verification script
./scripts/verify-checksum-models.py
./models
sha256sum --ignore-missing -c SHA256SUMS
shasum -a 256 --ignore-missing -c SHA256SUMS
如果你的问题是模型生成质量,那么请至少扫描以下链接和论文以了解LLaMA模型的局限性。在选择合适的模型大小并欣赏LLaMA模型与ChatGPT之间的显着和细微差异时,这一点尤其重要:
./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小时后,你将有最后的困惑。
你可以使用termux轻松地在Android设备上运行。
llama.cpp
首先,安装 termux 的基本软件包:
pkg install clang wget git cmake
其次,获取安卓 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 位量化的工具。
ghcr.io/ggerganov/llama.cpp:light:此映像仅包含主可执行文件。
下载模型、将其转换为 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
假设在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 .
你可能需要传入一些不同的 ,具体取决于容器主机支持的 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:此映像仅包含主可执行文件。
在本地构建后,使用情况类似于非 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
llama.cpp
master
for
void * ptr
int & a