llama.cpp - 在 C/C++ 中移植 Facebook 的 LLaMA 模型

Created at: 2023-03-11 02:58:00
Language: C++
License: MIT

美洲驼.cpp

骆马

操作状态 授权协议: MIT

路线图 / 宣言 / ggml

纯C/C++中LLaMA模型的推理

热门话题


目录
  1. 描述
  2. 用法
  3. 贡献
  4. 编码准则
  5. 文档

描述

的主要目标是在MacBook上使用4位整数量化运行LLaMA模型。

llama.cpp

  • 没有依赖关系的普通 C/C++ 实现
  • Apple 硅一等公民 - 通过 ARM NEON、Accelerate 和 Metal 框架进行优化
  • AVX、AVX2 和 AVX512 支持 x86 架构
  • 混合F16 / F32精度
  • 支持 2 位、3 位、4 位、5 位、6 位和 8 位整数量化
  • CUDA、Metal 和 OpenCL GPU 后端支持

的原始实现在一个晚上就被黑客入侵了。从那时起,由于许多捐款,该项目得到了显着改善。该项目主要用于教育目的,并作为为ggml库开发新功能的主要游乐场。

llama.cpp

支持的平台:

  • [X] 苹果操作系统
  • [X] Linux
  • [X] Windows (via CMake)
  • [X] docker

支持的型号:

绑定:

用户界面:


以下是在 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 etcStep 7: Test it again with people who are not related to you personallyfriends 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) etcStep 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 visitwhether its an image or text file (like PDFs). In order for someone elses 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 protocolsthis 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
    • 在视窗上:

      1. 下载 w64devkit 的最新 fortran 版本。
      2. 在你的电脑上解压。
        w64devkit
      3. 跑。
        w64devkit.exe
      4. 使用该命令访问该文件夹。
        cd
        llama.cpp
      5. 从这里你可以运行:
        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

    1. 在 FreeBSD 中安装并激活 DRM

    2. 将你的用户添加到视频群组

    3. 安装编译依赖项。

      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 构建

MPI 允许你在计算机集群上分配计算。由于LLM预测的串行性质,这不会产生任何端到端的加速,但它可以让你运行比在单台计算机上的RAM更大的模型。

首先,你需要在系统上安装 MPI 库。两个最流行(仅?)的选项是MPICHOpenMPI。两者都可以使用包管理器(,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 上可用,默认情况下处于启用状态。你可以使用常规说明进行构建。

  • 开放BLAS:

    这仅使用 CPU 提供 BLAS 加速。确保在你的计算机上安装了 OpenBLAS。

    • 用:

      make

      • 在 Linux 上:

        make LLAMA_OPENBLAS=1
      • 在视窗上:

        1. 下载 w64devkit 的最新 fortran 版本。

        2. 下载最新版本的 OpenBLAS for Windows

        3. 在你的电脑上解压。

          w64devkit

        4. 从你刚刚下载副本的 OpenBLAS zip 中,位于文件夹内,在 .

          libopenblas.a
          lib
          w64devkit\x86_64-w64-mingw32\lib

        5. 从同一个 OpenBLAS zip 复制里面的文件夹内容。

          include
          w64devkit\x86_64-w64-mingw32\include

        6. 跑。

          w64devkit.exe

        7. 使用该命令访问该文件夹。

          cd
          llama.cpp

        8. 从这里你可以运行:

          make LLAMA_OPENBLAS=1
    • 在 Linux 上使用:

      CMake

      mkdir build
      cd build
      cmake .. -DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS
      cmake --build . --config Release
  • 幸福

    有关详细信息,请查看 BLIS.md

  • 英特尔 MKL

    默认情况下,设置为 ,因此,如果你已经获取了英特尔环境脚本并在 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

    • 从源代码安装 OpenCL 开发工具包
      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/

羊驼的指令模式

  1. 首先,将羊驼模型下载到文件夹中
    ggml
    ./models
  2. 像这样运行该工具:
    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

OpenLLaMA是Meta原始LLaMA模型的开放许可复制品。它使用相同的架构,是原始LLaMA权重的直接替代品。

  • 从 Hugging Face 下载 3B7B13B 型号。
  • 使用 将模型转换为 ggml FP16 格式
    python convert.py <path to OpenLLaMA directory>

使用 GPT4All

注意:这些说明可能因 GGUF 更新而过时

  • 从LLaMA模型中获取文件并将其放入
    tokenizer.model
    models
  • 从羊驼模型中获取文件并将其放入
    added_tokens.json
    models
  • 从 GPT4All 模型中获取文件并将其放入
    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 型号!

使用 Pygmalion 7B 和 Metharme 7B

python3 convert.py pygmalion-7b/ --outtype q4_1

Pygmalion 7B 和 Metharme 7B 砝码以 bfloat16 精度保存。如果你希望在不进行量化的情况下转换为 ,请指定 as 而不是 。

ggml
--outtype
f32
f16

获取Facebook LLaMA原始模型和斯坦福羊驼模型数据

  • 在任何情况下,IPFS、磁力链接或任何其他模型下载链接都不应在此存储库的任何地方共享,包括在议题、讨论或拉取请求中。它们将被立即删除。
  • LLaMA模型由Facebook正式分发,永远不会通过此存储库提供。
  • 如果你需要请求访问模型数据,请参阅 Facebook 的 LLaMA 存储库

获取和使用 Facebook LLaMA 2 模型

验证模型文件

在创建与模型文件相关的问题之前,请验证所有下载的模型文件的 sha256 校验和,以确认你拥有正确的模型数据文件。

  • 以下 python 脚本将验证自安装子目录中是否具有所有可能的最新文件:
    ./models
# run the verification script
./scripts/verify-checksum-models.py
  • 在 linux 或 macOS 上,还可以运行以下命令来验证自安装子目录中是否有所有可能的最新文件:
    ./models
    • 在 Linux 上:
      sha256sum --ignore-missing -c SHA256SUMS
    • 在 macOS 上:
      shasum -a 256 --ignore-missing -c SHA256SUMS

关于模型的开创性论文和背景

如果你的问题是模型生成质量,那么请至少扫描以下链接和论文以了解LLaMA模型的局限性。在选择合适的模型大小并欣赏LLaMA模型与ChatGPT之间的显着和细微差异时,这一点尤其重要:

如何运行

  1. 下载/解压缩: https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-2-raw-v1.zip?ref=salesforce-research
  2. ./perplexity -m models/7B/ggml-model-q4_0.gguf -f wiki.test.raw
  3. 输出:
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小时后,你将有最后的困惑。

人造人

使用 Android NDK 构建项目

你可以使用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

使用 Termux (F-Droid) 构建项目

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

先决条件

  • 必须在你的系统上安装并运行 Docker。
  • 创建一个文件夹来存储大型模型和中间文件(例如/llama/models)

图像

我们有两个 Docker 镜像可用于此项目:

  1. ghcr.io/ggerganov/llama.cpp:full
    :此映像包括主可执行文件和用于将 LLaMA 模型转换为 ggml 并转换为 4 位量化的工具。
  2. 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

docker 与 CUDA

假设在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 图像基本相同:

  1. local/llama.cpp:full-cuda
    :此映像包括主可执行文件和用于将 LLaMA 模型转换为 ggml 并转换为 4 位量化的工具。
  2. 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

贡献

  • 贡献者可以打开 PR
  • 协作者可以推送到存储库中的分支,并将 PR 合并到分支中
    llama.cpp
    master
  • 将根据贡献邀请合作者
  • 非常感谢任何有关管理问题和 PR 的帮助!
  • 请务必阅读以下内容:边缘推理
  • 给有兴趣的人的一些背景故事:更新日志播客

编码准则

  • 避免添加第三方依赖项、额外文件、额外标头等。
  • 始终考虑与其他操作系统和体系结构的交叉兼容性
  • 避免外观花哨的现代 STL 结构,使用基本循环,避免模板,保持简单
    for
  • 代码样式没有严格的规则,但请尝试遵循代码中的模式(缩进、空格等)。垂直对齐使内容更具可读性,更易于批量编辑
  • 清理所有尾随空格,使用 4 个空格进行缩进,括号在同一行上,
    void * ptr
    int & a
  • 查看适合首次贡献的任务的良好首期

文档