llama.cpp 主程序llama-cli的使用方式(翻译)

3,048 阅读20分钟

llama.cpp这个项目允许您以简单有效的方式使用各种LLaMA语言模型。
该项目使用了最普通的C/C++实现,具有可选的4位量化支持,
可实现更快,更低的内存推理,并针对桌面CPU进行了优化。
该程序可用于使用LLaMA模型执行各种推理任务,
包括基于用户提供的提示生成文本,
以及使用反向提示进行类似聊天的交互。

目录

  1. 快速开始
  2. 常用选项
  3. 输入提示
  4. 交互
  5. 上下文
  6. 生成标志
  7. 性能调整
  8. 附加选项

快速开始

命令行输入以下命令(确保使用正确的模型路径):

./llama-cli -m models/7B/ggml-model.bin --prompt "Once upon a time"

要获得交互式体验,请尝试以下命令:

./llama-cli -m models/7B/ggml-model.bin -n -1 --color \
-r "User:" --in-prefix " " -i -p \
'User: Hi
AI: Hello. I am an AI chatbot. Would you like to talk?
User: Sure!
AI: What would you like to talk about?
User:'

下面的命令从启动提示符生成"无限"文本(您可以使用Ctrl-C停止它):

./llama-cli -m models/7B/ggml-model.bin --ignore-eos -n -1

常用选项

在本节中,我们将介绍使用LLaMA模型运行llama-cli程序时最常用的选项:

-m FNAME, --model FNAME:
指定LLaMA模型文件的路径
(例如,models/7B/ggml-model.gguf;如果设置,则从--model-url推断)

-mu MODEL_URL --model-url MODEL_URL:
指定一个远程http url来下载文件
( 例如: hf-mirror.com/.../ggml-mo… )

-i, --interactive:
在交互模式下运行,允许直接输入并接收实时响应。 -n N, --n-predict N:
设置生成文本时要预测的标记数量。 调整此值会影响生成文本的长度。

-c N, --ctx-size N:设置提示上下文的大小。
默认值为512,但LLaMA模型是在上下文为2048的情况下构建的,
这将为更长的输入/推理提供更好的结果。

输入提示

llama-cli程序提供了几种使用输入提示与LLaMA模型交互的方法:

--prompt PROMPT:
直接提供提示符作为命令行选项。
--file FNAME:
提供包含一个或多个提示的文件。
--interactive-first:
在交互模式下运行程序并等待输入。

交互

llama-cli程序提供了与LLaMA模型进行交互的无缝方式,
允许用户参与实时对话或提供特定任务的指令。
可以使用各种选项触发交互模式,包括--interactive和--interactive-first。

在交互模式下,用户可以通过在过程中注入他们的输入来参与文本生成。
用户可以随时按Ctrl+C插入并键入他们的输入,然后按Return将其提交给LLaMA模型。
若要在未完成输入的情况下提交其他行,用户可以使用反斜杠(\)结束当前行并继续键入。

交互选项

-i, --interactive:
以交互模式运行程序,允许用户参与实时对话或向模型提供特定指令。
--interactive-first:
在交互模式下运行程序,并立即等待用户输入,然后开始文本生成。
--color:
启用彩色输出,以在提示、用户输入和生成的文本之间进行视觉区分。

通过理解和利用这些交互选项,
您可以使用LLaMA模型创建引人入胜的动态体验,
根据您的特定需求定制文本生成过程。

反向提示

反向提示是使用LLaMA模型创建类似聊天的体验的一种强大方法,
它在遇到特定文本字符串时暂停文本生成:

-r PROMPT, --reverse-prompt PROMPT:
指定一个或多个反向提示以暂停文本生成并切换到交互模式。
例如,每当轮到用户发言时,-r "User:"可以用于跳回到对话中。
这有助于创建更具交互性和对话性的体验。
但是,当以空格结尾时,反向提示符不起作用。
要克服这个限制,您可以使用--in-prefix标志在反向提示符后添加一个空格或任何其他字符。

内前缀

--in-prefix标志
用于为输入添加前缀,主要用于在反向提示符后插入空格。
下面是如何结合使用--in-prefix标志和--reverse-prompt标志的示例:

./llama-cli -r "User:" --in-prefix " "

内后缀

--in-suffix标志用于在输入后添加后缀。
这对于在用户输入后添加"Assistant:"提示非常有用。
它添加在自动添加到用户输入末尾的换行符(\n)之后。
下面是如何结合使用--in-suffix标志和--reverse-prompt标志的示例:

./llama-cli -r "User:" --in-prefix " " --in-suffix "Assistant:"

上下文

在文本生成过程中,LLaMA模型具有有限的上下文大小,
这意味着它们只能从输入和生成的文本中考虑一定数量的令牌。
当上下文填满时,模型在内部重置,可能会丢失对话或指令开始时的一些信息。
背景管理选项有助于在这些情况下保持连续性和一致性。

上下文大小

--ctx-size
选项允许您设置文本生成期间LLaMA模型使用的提示上下文的大小。
更大的上下文大小有助于模型更好地理解和生成更长输入或对话的响应。

-c N, --ctx-size N:
设置提示上下文的大小(默认值:512)。
LLaMA模型是在2048年的背景下构建的,这将在更长的输入/推理上产生最佳结果。
但是,将上下文大小增加到2048以上可能会导致不可预测的结果。

扩展上下文大小

一些微调的模型通过缩放RoPE来扩展上下文长度。
例如,如果原始预训练模型的上下文长度(最大序列长度)为4096(4k),
而微调模型的上下文长度为32k。这是一个缩放因子8,
并且应该通过将上述--ctx-size设置为32768(32k)和--rope-scale设置为8来工作。

--rope-scale N:
其中N是微调模型使用的线性比例因子。

保持提示

--keep 选项允许用户在模型脱离上下文运行时保留原始提示,
确保与初始指令或会话主题的连接得以保持。

--keep N:
指定当模型重置其内部上下文时,从初始提示中保留的令牌数量。
默认情况下,此值设置为0(表示不保留令牌)。
使用-1保留初始提示中的所有标记。
通过使用--ctx-size和--keep等上下文选项,
您可以与LLaMA模型保持更连贯一致的交互,确保生成的文本与原始提示或对话保持相关。

生成标志

以下选项允许您控制文本生成过程,并根据您的需要微调所生成文本的多样性、创造性和质量。
通过调整这些选项并尝试不同的值组合,您可以找到适合特定用例的最佳设置。

要预测的令牌数量

-n N, --n-predict N:
设置生成文本时要预测的令牌数量(默认值:128,-1 =无穷大,-2 =直到上下文填充)

--n-predict选项
控制模型为响应输入提示而生成的令牌数量。
通过调整此值,可以影响生成文本的长度。
值越大,文本越长,而值越小,文本越短。
值为-1将启用无限文本生成,即使我们有一个有限的上下文窗口。
当上下文窗口已满时,一些较早的令牌(--n-keep之后的令牌的一半)将被丢弃。
然后必须重新评估上下文,然后才能继续生成。
在大型模型和/或大型上下文窗口上,这将导致输出出现显著暂停。
如果不需要暂停,则值-2将在上下文填充时立即停止生成。
请务必注意,如果遇到序列结束(EOS)标记或反向提示,则生成的文本可能短于指定的标记数。
在交互模式下,文本生成将暂停,控制权将返回给用户。
在非交互模式下,程序将结束。在这两种情况下,文本生成可能会在达到指定的n-predict值之前停止。
如果你想让模型继续运行而不产生序列结束,你可以使用--ignore-eos参数。

温度

--temp N:
调整生成文本的随机性(默认值:0.8)。
温度是一个超参数,它控制生成的文本的随机性。
它影响模型输出令牌的概率分布。
较高的温度(例如,1.5)使得输出更随机和更有创造性,
而较低的温度(例如,0.5)使输出更加集中、确定和保守。
默认值为0.8,它提供了随机性和确定性之间的平衡。
在极端情况下,温度为0将始终选择最有可能的下一个令牌,导致每次运行的输出相同。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

重复处罚

--repeat-penalty N:
控制生成文本中标记序列的重复(默认值:1.1)。

--repeat-last-n N:
惩罚重复的最后n个令牌(默认值:64,0 =禁用,-1 = ctx-size)。

--no-penalize-nl:
在应用重复惩罚时,禁用对换行符标记的惩罚。
repeat-penalty选项有助于防止模型生成重复或单调的文本。
较高的值(例如,1.5)将更强烈地惩罚重复,而较低值(例如,0.9)会更加宽容。
默认值为1.1。

repeat-last-n选项
控制历史记录中要考虑惩罚重复的令牌数量。
较大的值将在生成的文本中向后查看以防止重复,而较小的值将仅考虑最近的标记。
值为0将禁用惩罚,值为-1将令牌的数量设置为等于上下文大小(ctx-size)。

使用--no-penalize-nl选项在应用重复惩罚时禁用换行符惩罚。
此选项对于生成聊天对话、对话、代码、诗歌或任何文本
(其中换行符标记在结构和格式中起重要作用) 特别有用。
禁用换行符惩罚有助于在这些特定用例中保持自然的流程和预期的格式。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

Top-K采样

--top-k N:
将下一个令牌选择限制为K个最可能的令牌(默认值:40)。
Top-k采样是一种文本生成方法,它仅从模型预测的前k个最有可能的标记中选择下一个标记。
它有助于降低生成低概率或无意义令牌的风险,但也可能限制输出的多样性。
top-k的较高值(例如,100)将考虑更多的令牌并导致更多样化的文本,
而较低的值(例如,10)将专注于最可能的标记并生成更保守的文本。默认值为40。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

Top-P抽样

--top-p N:
将下一个令牌选择限制为累积概率高于阈值P(默认值:0.9)的令牌子集。
Top-p采样,也称为核心采样,是另一种文本生成方法,
它从一个子集中选择下一个标记,这些标记的累积概率至少为p。
top-p的较高值(例如,0.95)将导致更多样化的文本,
而较低的值(例如,0.5)将产生更集中和保守的文本。默认值为0.9。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

最小P采样

--min-p N:
设置令牌选择的最小基本概率阈值(默认值:0.05)。
Min-P抽样方法是Top-P抽样方法的替代方法,旨在确保质量和品种的平衡。
参数p表示相对于最可能的令牌的概率,要考虑的令牌的最小概率。
例如,在p=0.05并且最可能的令牌具有概率0.9的情况下,具有小于0.045的值的对数被过滤掉。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

无尾采样(TFS)

--tfs N:
使用参数z启用无尾采样(默认值:1.0,1.0 =禁用)。
无尾采样(TFS)是一种文本生成技术,旨在减少不太可能的标记对输出的影响,
这些标记可能不太相关,不太连贯或无意义。
与Top-P类似,它尝试动态确定最可能的令牌的数量。
但是TFS根据概率的二阶导数过滤掉logits。在二阶导数的和达到参数z之后停止添加令牌。
简而言之:TFS查看令牌的概率下降的速度,并使用参数z切断不太可能令牌的尾部。
z的典型值为0.9至0.95。值1.0将包括所有令牌,因此禁用TFS的效果。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

局部典型抽样

--typical N:
使用参数p启用局部典型采样(默认值:1.0,1.0 =禁用)。
局部典型采样通过对基于周围上下文的典型
或预期的标记进行采样来促进上下文连贯和多样的文本的生成。
通过将参数p设置在0和1之间,您可以控制生成局部连贯和多样化文本之间的平衡。
接近1的值将促进更多上下文一致的令牌,而接近0的值将促进更多不同的令牌。
值等于1时禁用局部典型采样。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

Mirostat采样

--mirostat N:
启用Mirostat采样,控制文本生成期间的混乱
(默认值:0,0 =禁用,1 = Mirostat,2 = Mirostat 2.0)。

--mirostat-lr N:
设置Mirostat学习率,参数eta(默认值:0.1)。

--mirostat-ent N:
设置Mirostat目标熵,参数tau(默认值:5.0)。
Mirostat是一种在文本生成过程中主动将生成文本的质量保持在所需范围内的算法。
它旨在在连贯性和多样性之间取得平衡,避免因过度重复(无聊陷阱)
或不连贯(混乱陷阱)而导致的低质量输出。

--mirostat-lr选项
设置Mirostat学习率(eta)。学习率影响算法对生成文本反馈的响应速度。
较低的学习率将导致较慢的调整,而较高的学习率将使算法更具响应性。
默认值为0.1。

--mirostat-ent选项
设置Mirostat目标熵(tau),它表示所生成文本的所需困惑度值。
通过调整目标熵,您可以控制生成的文本中一致性和多样性之间的平衡。
较低的值将导致更集中和连贯的文本,而较高的值将导致更多样化和可能不太连贯的文本。
默认值为5.0。

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

Logit偏倚

-l TOKEN_ID(+/-)BIAS, --logit-bias TOKEN_ID(+/-)BIAS:
修改生成的文本补全中出现标记的可能性。
logit bias选项允许您手动调整生成的文本中出现特定标记的可能性。
通过提供令牌ID和正或负的偏置值,您可以增加或减少生成令牌的概率。
例如,使用--logit-bias 15043+1来增加标记'Hello'的可能性,
或使用--logit-bias 15043-1来降低其可能性。
使用负无穷大的值,--logit-bias 15043-inf确保令牌Hello永远不会产生。
更实际的用例可能是通过使用\code{begin}将\code{end}令牌(29905)
设置为负无穷大来防止生成\和-l 29905-inf。
(This是由于在LLaMA模型推断中出现的LaTeX代码的流行。)

示例用法:

--repeat-penalty 1.15 --repeat-last-n 128 --no-penalize-nl

RNG种子

-s SEED, --seed SEED:
设置随机数生成器(RNG)种子(默认值:-1,-1 =随机种子)。
RNG种子用于初始化影响文本生成过程的随机数生成器。
通过设置特定的种子值,您可以在具有相同输入和设置的多次运行中获得一致且可重现的结果。
这有助于测试、调试或比较不同选项对生成文本的影响,以查看它们何时出现分歧。
如果种子设置为小于0的值,则将使用随机种子,这将导致每次运行时的不同输出。

性能调整

这些选项有助于提高LLaMA模型的性能和内存使用率。
通过调整这些设置,您可以微调模型的行为,
以更好地适应您的系统功能,并为您的特定用例实现最佳性能。

线程数

-t N, --threads N:
设置生成时使用的线程数。
为了获得最佳性能,建议将此值设置为系统具有的物理CPU核心数(而不是逻辑核心数)。
使用正确的线程数可以大大提高性能。

-tb N, --threads-batch N:
设置批处理和提示处理期间使用的线程数。
在某些系统中,在批处理期间使用比生成期间更多的线程是有益的。
如果未指定,则用于批处理的线程数将与用于生成的线程数相同。

m锁

--mlock:
将模型锁定在内存中,防止它在内存映射时被换出。
这可以提高性能,但由于需要更多的RAM来运行,
并且在模型加载到RAM时可能会减慢加载时间,
因此牺牲了内存映射的一些优点。

无内存映射

--no-mmap:
不对模型进行内存映射。
默认情况下,模型被映射到内存中,
这允许系统根据需要仅加载模型的必要部分。
但是,如果模型大于您的RAM总量,或者如果您的系统可用内存不足,
则使用mmap可能会增加页面调出的风险,从而对性能产生负面影响。
禁用mmap会导致加载速度变慢,但如果您不使用--mlock,则可能会减少页面调出。
请注意,如果模型大于RAM的总量,关闭mmap将完全阻止模型加载。

NUMA支持

--numa distribute:
将相同比例的线程固定到每个NUMA节点上的内核。
这将在系统上的所有核心之间分散负载,
利用所有内存通道,代价是可能需要内存在节点之间的慢速链路上传输。

--numa isolate:
将所有线程固定到程序启动的NUMA节点。
这限制了内核数量和可使用的内存量,
但保证所有内存访问都保持在NUMA节点的本地。
--numa numactl:
将线程固定到通过numactl实用程序启动程序传递给程序的CPUMAP。
这是最灵活的模式,并允许任意的内核使用模式,
例如,使用一个NUMA节点上的所有内核的映射,
以及第二个节点上的刚好足够的内核来使节点间内存总线饱和。
这些标志尝试在某些具有非统一内存访问的系统上提供帮助的优化。
这目前包括上述策略之一,并禁用mmap的预取和预读。
后者导致映射页面在第一次访问时出错,而不是一次全部出错,
并且与将线程固定到NUMA节点相结合,更多的页面最终会出现在使用它们的NUMA节点上。
请注意,如果模型已经在系统页面缓存中,例如,由于以前的运行没有这个选项,
这将几乎没有影响,除非您先删除页面缓存。
这可以通过重新启动系统来完成,
或者在Linux上以root身份将"3"写入"/proc/sys/vm/drop_caches"。

内存浮点数32

--memory-f32:
使用32位浮点数而不是16位浮点数作为内存键+值。
这使上下文内存需求和缓存提示文件大小加倍,
但似乎没有以可衡量的方式提高生成质量。不推荐.

批量

-b N, --batch-size N:
设置批量大小以进行快速处理(默认值:2048)。
这种大批量使安装了BLAS并在构建过程中启用它的用户受益。
如果您没有启用BLAS("BLAS=0"),您可以使用较小的数字,
例如8,以查看在某些情况下评估提示的进度。

-ub N、--ubatch-size N:
物理最大批量。这是用于流水线并行化。默认值:512。

提示缓存

--prompt-cache FNAME: 指定一个文件来缓存初始提示后的模型状态。
当你使用较长的提示时,这可以显著加快启动时间。
该文件在第一次运行期间创建,并在后续运行中重复使用和更新。
注意:恢复缓存提示并不意味着恢复会话保存时的确切状态。
因此,即使指定了特定的种子,也不能保证获得与原始生成相同的令牌序列。

语法JSON模式

--grammar GRAMMAR、--grammar-file FILE:
指定语法(内联定义或在文件中定义)以将模型输出约束为特定格式。
例如,您可以强制模型输出JSON或仅使用表情符号。
有关语法的详细信息,请参阅GBNF指南。

--json-schema SCHEMA:
指定一个JSON模式来约束模型输出(例如,{}用于任何JSON对象,
或{"items": {"type": "string", "minLength": 10, "maxLength": 100}, "minItems": 10}
用于具有大小约束的JSON字符串数组)。
如果一个模式使用外部的$refs, 你应该使用
--grammar "$( python examples/json_schema_to_grammar.py myschema.json )"。

量化

有关4位量化的信息,它可以显着提高性能和减少内存使用,请参阅llama.cpp的主要README。

附加选项

这些选项在运行LLaMA模型时提供额外的功能和自定义:

-h, --help:
显示一条帮助消息,其中显示所有可用选项及其默认值。
对于检查最新的选项和默认值特别有用,
因为它们可能会经常更改,并且本文档中的信息可能会过时。

--verbose-prompt:
在生成文本之前打印提示。

-ngl N, --n-gpu-layers N:
当使用GPU支持编译时,此选项允许将一些层卸载到GPU进行计算。
通常会提高性能。

-mg i, --main-gpu i:
当使用多个GPU时,此选项控制哪个GPU用于小张量,
对于这些小张量,在所有GPU上拆分计算的开销是不值得的。
GPU将使用更多的VRAM来存储临时结果的暂存缓冲区。默认使用GPU 0。

-ts SPLIT, --tensor-split SPLIT:
当使用多个GPU时,此选项控制应该在所有GPU上拆分多大的张量。
SPLIT是一个以逗号分隔的非负值列表,用于指定每个GPU应按顺序获取的数据比例。
例如,"3,2"将60%的数据分配给GPU 0,40%分配给GPU 1。
默认情况下,数据按VRAM的比例分割,但这可能不是最佳性能。

--lora FNAME:
将LoRA(Low-Rank Adaptation)适配器应用于模型(意味着--no-mmap)。
这允许您将预训练的模型适应特定的任务或领域。

--lora-base FNAME:
可选模型,用作LoRA适配器修改的层的基础。
该标志与--lora标志结合使用,并指定用于自适应的基本模型。

-hfr URL --hf-repo URL:
Hugging Face模型库的URL。与--hf-file或-hff配合使用。
模型下载并存储在-m或--model提供的文件中。如果未提供-m,
则模型将自动存储在由LLAMA_CACHE环境变量指定的路径中或特定于操作系统的本地缓存中。