☰
llama-cli 全参数使用指南:基于 PowerInfer SmallThinker 仓库的本地大模型推理入口
2026/9/25 6:11:55 网站建设 项目流程
  • 人工智能
  • 大模型
  • 推理引擎
  • 本地部署

【免费下载链接】PowerInfer

High-speed Large Language Model Serving for Local Deployment

项目地址:https://gitcode.com/gh_mirrors/po/PowerInfer
点击查看免费下载

导读

本文以 PowerInfer 仓库中 smallthinker/tools/main/README.md 为核心,系统讲解llama-cli命令行推理程序的完整用法——从模型下载、单轮生成、对话模式,到交互式输入、上下文管理、十余种采样器调优以及性能与内存优化选项。读完本文,你将能够用llama-cli在本地 CPU/GPU 上高效运行 GGUF 格式的大模型(含本项目面向端侧部署的 SmallThinker 稀疏 MoE 模型),并根据任务需求组合出可复制的命令行方案。

llama-cli是该仓库smallthinker/tools/main目录下编译出的可执行目标:由 CMakeLists.txt 声明add_executable(llama-cli main.cpp),链接common、llama运行时库与系统线程库(C++17),其入口实现在 main.cpp(共 977 行)。该程序专为 LLaMA 系模型设计,基于 llama.cpp 的纯 C/C++ 实现,支持可选的 4-bit 量化推理,面向桌面 CPU 做了优化,同时也能与 GPU 后端协同工作。


快速开始

首先需要准备一个 GGUF 格式的模型文件。原文档以 Gemma 1.1 7B 指令版(Q4_K_M 量化)为例,将该文件下载后放入models/目录(例如models/gemma-1.1-7b-it.Q4_K_M.gguf)。如果使用本项目配套的 SmallThinker 模型,则需先按 smallthinker/README.md 中的流程将 safetensors 转换为 GGUF 并量化(python3 convert_hf_to_gguf.py ... --outtype f16,再用llama-quantize --pure ... Q4_0),转换与编译等操作均须在smallthinker目录下完成。

编译llama-cli目标(以 x86 为例,来自 smallthinker/README.md):

cmake -S . -B build \ -DCMAKE_C_COMPILER=clang-21 \ -DCMAKE_CXX_COMPILER=clang++-21 \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DGGML_OPENMP=OFF -DLLAMA_CURL=OFF \ -DBUILD_SHARED_LIBS=OFF -DAZ_ENABLE_PERFETTO=OFF \ -DPOWERINFER_NO_FFN_REPACK=ON -DPOWERINFER_WITH_TRACING=OFF \ -DGGML_CPU_AARCH64=OFF cmake --build build --config RelWithDebInfo --target llama-cli -j32

Unix 系系统(Linux、macOS 等)

一次性输入提示(one-and-done):

./llama-cli -m models/gemma-1.1-7b-it.Q4_K_M.gguf -no-cnv --prompt "Once upon a time"

对话模式(可持续与模型交互):

./llama-cli -m models/gemma-1.1-7b-it.Q4_K_M.gguf --chat-template gemma

使用模型内置 jinja 聊天模板的对话模式:

./llama-cli -m models/gemma-1.1-7b-it.Q4_K_M.gguf --jinja

使用 jinja + 自定义 system prompt + 起始提示的单轮查询:

./llama-cli -m models/gemma-1.1-7b-it.Q4_K_M.gguf --jinja --single-turn -sys "You are a helpful assistant" -p "Hello"

无限生成(可用Ctrl-C停止):

./llama-cli -m models/gemma-1.1-7b-it.Q4_K_M.gguf --ignore-eos -n -1

Windows

对应的 Windows 命令使用llama-cli.exe与反斜杠路径分隔符:

./llama-cli.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf -no-cnv --prompt "Once upon a time" ./llama-cli.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --chat-template gemma ./llama-cli.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --jinja ./llama-cli.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --jinja --single-turn -sys "You are a helpful assistant" -p "Hello" llama-cli.exe -m models\gemma-1.1-7b-it.Q4_K_M.gguf --ignore-eos -n -1

如果希望由程序直接从远程 URL 拉取模型,可使用-mu/--model-url;若通过-hf/--hf-repo指定 Hugging Face 仓库,-m未给出时模型会自动保存到LLAMA_CACHE环境变量指定的路径或系统本地缓存中(详见后文"附加选项")。


常用参数

以下是最常使用的参数(默认值以 common/arg.cpp 中的参数解析器为准):

参数说明
-m FNAME, --model FNAME指定 LLaMA 模型文件路径(如models/gemma-1.1-7b-it.Q4_K_M.gguf;若设置了--model-url则从其推断)。底层写入params.model.path(见 arg.cpp 的-m/--model定义)。
-mu MODEL_URL, --model-url MODEL_URL指定远程 http 下载地址,程序会据此获取模型文件。
-i, --interactive以交互模式运行,允许直接输入并获得实时回复。
-n N, --n-predict N设置生成时的预测 token 数量,直接影响生成文本长度。
-c N, --ctx-size N设置提示词上下文大小,默认 4096;若模型支持更长上下文,调大该值可获得更好的长输入效果。
-mli, --multiline-input允许多行输入/粘贴,无需在每行结尾加\。
-t N, --threads N生成时使用的线程数,推荐设为物理 CPU 核心数。
-ngl N, --n-gpu-layers N编译了 GPU 支持时,将若干层卸载到 GPU 计算,通常能提升性能。

输入提示

llama-cli提供了多种方式向模型提供输入:

  • --prompt PROMPT:直接在命令行给出提示词。
  • --file FNAME:从文件读取提示词(对应-f;解析时读取文件内容并去掉末尾换行,见 arg.cpp)。
  • --system-prompt PROMPT:提供系统提示词(否则使用聊天模板自带的默认系统提示,若有)。
  • --system-prompt-file FNAME:从文件读取系统提示词(对应-sysf)。
  • --interactive-first:以交互模式运行并立即等待输入(详见下文)。

在 main.cpp 中,提示词被 tokenize 后进入主循环:若提示词 token 数超过n_ctx - 4,程序会直接报错退出(prompt is too long);当输入为空且需要 BOS 时会自动补充 BOS token。


交互模式

llama-cli提供流畅的人机交互体验:可通过--interactive或--interactive-first触发。在交互模式下,生成过程中随时按Ctrl+C打断并输入自己的内容,按Return提交给模型;若要继续追加多行而不结束输入,可在行尾加\再回车。单 token 的反向提示词检测与Ctrl+C打断逻辑都由 main.cpp 中的sigint_handler与主循环实现(Unix 使用sigaction,Windows 使用SetConsoleCtrlHandler)。

交互相关选项

  • -i, --interactive:交互模式,实时对话或下达指令。
  • --interactive-first:交互模式并立即等待用户输入(等价于先设置interactive,见 main.cpp)。
  • -cnv, --conversation:对话模式——不打印特殊 token 与前后缀,使用默认或指定的聊天模板(若检测到聊天模板默认开启)。底层由COMMON_CONVERSATION_MODE_AUTO自动判定,见 main.cpp。
  • -no-cnv:强制关闭对话模式(默认 false)。
  • -st, --single-turn:只处理一轮对话(用户输入)后退出。
  • --jinja:启用 jinja 聊天模板解析器,使用模型内置模板或用户提供的模板(默认 false)。
  • --color:彩色输出,区分提示、用户输入与生成文本。

反向提示词(Reverse Prompts)

反向提示词用于打造聊天式体验:当生成文本中出现指定字符串时暂停生成并切回交互模式。

  • -r PROMPT, --reverse-prompt PROMPT:指定一个或多个反向提示词来暂停生成。例如-r "User:"可在轮到用户发言时切回对话。注意:以空格结尾的反向提示词不生效(因为会与后续输入连成一体,难以精确匹配)。

从源码看,主循环每次采样后会取最近 32 个 token(n_prev = 32)拼接成字符串,检查反向提示词是否出现在末尾;非交互模式下还会多放宽 2 个字符的搜索窗口,见 main.cpp。

In-Prefix

--in-prefix用于在输入前添加前缀,最常见的用途是在反向提示词后补一个空格:

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

In-Suffix

--in-suffix用于在输入后追加后缀,典型场景是补上 "Assistant:" 提示。它会追加在自动添加到用户输入末尾的换行符(\n)之后:

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

注意:启用--in-prefix或--in-suffix时,聊天模板(--chat-template)会被禁用(参见 arg.cpp 与 main.cpp 中的提示日志)。

聊天模板(Chat Templates)

  • --chat-template JINJA_TEMPLATE:设置自定义 jinja 聊天模板。它接受字符串而非文件名;默认取模型元数据中的模板。llama.cpp 仅支持若干预定义模板,包括llama2、llama3、gemma、monarch、chatml、orion、vicuna、vicuna-orca、deepseek、command-r、zephyr等。示例:--chat-template gemma。
  • --chat-template-file FNAME:从外部文件加载自定义 jinja 模板,适合模型自带模板过时或不兼容的情况。

模板字符串最终写入params.chat_template,由common_chat_templates_init统一管理;当模板可用时对话模式会自动开启(可通过-no-cnv关闭),见 main.cpp。


上下文管理

大模型的上下文长度有限,只能"看到"一定数量的输入与生成 token。上下文填满时模型会内部重置,可能丢失对话开头的信息或指令。上下文管理选项用于维持长对话的连贯性。

上下文大小

  • -c N, --ctx-size N:设置提示上下文大小(默认 4096,0表示从模型加载)。若模型原生上下文更长,增大该值可显著改善长输入/长推理效果。源码中低于 8 会被钳制为最小值 8,见 main.cpp。

扩展上下文

部分微调模型通过对 RoPE 进行缩放来扩展上下文。例如:原始预训练模型上下文为 4096(4k),微调模型为 32k,则缩放系数为 8——将--ctx-size设为 32768(32k)并配合--rope-scale 8即可。

  • --rope-scale N:N 为微调模型使用的线性缩放系数。底层实现是params.rope_freq_scale = 1.0f / N(见 arg.cpp),另有--rope-scaling(none/linear/yarn)、--rope-freq-base、--rope-freq-scale、--yarn-orig-ctx等扩展项可查阅--help。

Keep Prompt

  • --keep N:指定模型重置内部上下文时,从初始提示中保留的 token 数。默认 0(不保留任何 token),-1表示保留初始提示的全部 token。

上下文耗尽时,主循环会执行"上下文滑动"(context shift):保留n_keep个初始 token,丢弃n_keep之后一半的 token,并通过llama_kv_self_seq_rm/llama_kv_self_seq_add重排 KV 缓存后继续生成(见 main.cpp)。这正是-n -1无限生成得以跨越有限上下文窗口的机制。


生成参数(采样控制)

以下选项控制生成过程,用于调节文本的多样性、创造性与质量。所有默认值均可在--help输出中核对。

预测 token 数

  • -n N, --predict N:设置预测 token 数(默认-1,-1= 无限,-2= 直到上下文填满)。

-1会开启无限生成:上下文填满后,--keep保留的 token 之后的一半旧 token 会被丢弃,上下文必须重新评估才能继续生成——在大模型或大上下文窗口上会造成明显的停顿。若不想停顿,用-2让生成在上下文填满时立即停止。--no-context-shift可关闭无限生成时的上下文滑动,一旦有限窗口填满即停止。

需要注意:生成的文本可能短于指定 token 数——遇到 End-of-Sequence(EOS)token 或反向提示词时会提前停止。交互模式下暂停并把控制权交还用户;非交互模式下程序结束。若希望模型永不自行输出 EOS,可用--ignore-eos(等价于--logit-bias EOS-inf,见 arg.cpp)。

温度(Temperature)

  • --temp N:调整生成文本的随机性(默认 0.8)。

温度影响模型输出 token 的概率分布:温度越高(如 1.5)输出越随机、越有创造性;越低(如 0.5)越聚焦、确定、保守。默认 0.8 是随机性与确定性的平衡点。极端情况下,温度 0 每次都选取概率最大的 token,多次运行结果完全一致。示例:--temp 0。源码会对该值做max(0, value)钳制(见 arg.cpp)。

重复惩罚(Repeat Penalty)

  • --repeat-penalty N:控制生成文本中 token 序列的重复程度(默认 1.0,1.0 = 禁用)。
  • --repeat-last-n N:考虑惩罚重复的最近 token 数(默认 64,0 = 禁用,-1 = ctx-size)。

repeat-penalty越高(如 1.5)对重复的惩罚越强,越低(如 0.9)越宽松,默认 1 即不惩罚。repeat-last-n决定回看多远的生成历史来惩罚重复:越大回看得越远,0 禁用,-1 等价于上下文大小。源码会校验该值不小于 -1(见 arg.cpp)。

DRY 重复惩罚(Don't Repeat Yourself)

DRY 采样通过在长上下文中依据 token 近期使用模式进行惩罚,能有效减少重复文本(即使跨很长的上下文也有效)。

  • --dry-multiplier N:DRY 采样乘数(默认 0.0,0.0 = 禁用)。

  • --dry-base N:DRY 采样底数(默认 1.75)。

  • --dry-allowed-length N:DRY 采样允许长度(默认 2)。

  • --dry-penalty-last-n N:DRY 惩罚最近 n 个 token(默认 -1,0 = 禁用,-1 = 上下文大小)。

  • --dry-sequence-breaker STRING:为 DRY 采样添加序列分隔符,可多次使用以添加多个;使用该选项会清空默认分隔符['\n', ':', '"', '*'];若传"none"则完全不用分隔符。

  • dry-multiplier控制 DRY 效果强度:0.0 禁用,越大影响越强,常用推荐值 0.8。

  • dry-base设置指数惩罚计算的底数,越大对重复的惩罚越激进。

  • dry-allowed-length设置不被惩罚的最大重复序列长度:不超过该长度的短重复(常见词、短语)不惩罚。

  • dry-penalty-last-n控制应用 DRY 惩罚时考虑多少近期 token:-1 考虑整个上下文。

  • dry-sequence-breaker中断序列匹配,将输入拆分为可分段匹配的片段。

DRY 采样提供了更精细的生成控制,尤其擅长减少长程重复、维持全局连贯性。示例:

--dry-multiplier 0.8 --dry-base 1.75 --dry-allowed-length 2 --dry-penalty-last-n -1 --dry-sequence-breaker "—" --dry-sequence-breaker "##"

(dry-sequence-breaker使用时会清空默认分隔符的逻辑由 arg.cpp 实现。)

Top-K 采样

  • --top-k N:仅从概率最高的 K 个 token 中选择下一个 token(默认 40)。

Top-K 有助于降低生成低概率或无意义 token 的风险,但也可能限制输出多样性。值越大(如 100)考虑的 token 越多、文本更多样;越小(如 10)越保守。示例:--top-k 30。

Top-P 采样(Nucleus Sampling)

  • --top-p N:从累积概率达到阈值 P 的 token 子集中采样(默认 0.9)。

Top-P 在多样性与质量之间取得平衡。值越大(如 0.95)输出越多样,越小(如 0.5)越聚焦保守。示例:--top-p 0.95。

Min-P 采样

  • --min-p N:为 token 选择设置最小基础概率阈值(默认 0.1)。

Min-P 被设计为 Top-P 的替代方案,兼顾质量与多样性。参数p表示 token 被考虑所需的最小概率(相对最可能 token 的概率)。例如p=0.05、最可能 token 概率为 0.9 时,logit 低于 0.045 的 token 会被过滤。示例:--min-p 0.05。

局部典型采样(Locally Typical Sampling)

  • --typical N:启用参数为 p 的局部典型采样(默认 1.0,1.0 = 禁用)。

局部典型采样通过采样"符合周边上下文预期"的 token 来促进上下文连贯且多样的文本。p 介于 0 与 1 之间:越接近 1 越偏向上下文连贯,越接近 0 越多样;等于 1 时禁用。示例:--typical 0.9。

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 在生成过程中主动把文本质量维持在期望区间内,避免因过度重复(boredom traps)或前后不一致(confusion traps)导致的低质量输出。学习率 eta 影响算法对生成文本反馈的响应速度:越小调整越慢,越大越灵敏。目标熵 tau 即期望的困惑度:越低文本越聚焦连贯,越高越多样(可能连贯性下降)。示例:--mirostat 2 --mirostat-lr 0.05 --mirostat-ent 3.0。

XTC 采样(Exclude Top Choices)

  • --xtc-probability N:设置移除 token 的概率(在采样器启动时检查一次)(默认 0.0)。
  • --xtc-threshold N:设置被移除 token 的最小概率阈值(默认 0.1)。

XTC 是一种独特的采样器:以xtc-probability的概率寻找概率达到xtc-threshold的 token,然后移除其中除最小概率那个之外的所有 token。通过移除高概率 token,XTC 能提升回答多样性、打破写作陈词滥调、抑制重复(陈词与重复短语通常概率更高);保留阈值以上的最后一个 token 则保证回答仍然连贯。XTC 面向创作类任务,默认关闭(实验性)。推荐的组合是 Min-P 后接 XTC:--sampling-seq mx --min-p 0.02 --xtc-probability 0.5。示例:--xtc-probability 0.5 --xtc-threshold 0.1。

Top-nσ 采样

  • --top-nsigma N:限制在 softmax 之前的 logits 中、与最大 logit 相差不超过 n·σ 的 token 子集内采样(默认 -1,-1 = 禁用)。

Top-nσ 直接在预 softmax logits 上按统计阈值筛选 token,不依赖温度缩放即可维持稳定的采样空间,在高温下做推理任务(reasoning)表现良好;无需复杂概率操作即可高效过滤 token。值越大(如 5)纳入的噪声 token 越多,越小(如 1)越聚焦信息量高的区域。示例:--top-nsigma 1。

Logit Bias

  • -l TOKEN_ID(+/-)BIAS, --logit-bias TOKEN_ID(+/-)BIAS:修改指定 token 在生成补全中出现的可能性。

可以手动提高或压低特定 token 的概率。例如--logit-bias 15043+1提高 token 'Hello' 的出现概率,--logit-bias 15043-1降低;用负无穷--logit-bias 15043-inf可确保 'Hello' 永不出现。一个实用场景:LLaMA 推理中常出现 LaTeX 代码,可用-l 29905-inf把\token(29905)设为负无穷,从而禁止生成\code{begin}、\code{end}这类内容。示例:--logit-bias 29905-inf。解析逻辑在 arg.cpp:按token + 符号 + 数值格式解析并乘以符号。

RNG 种子

  • -s SEED, --seed SEED:设置随机数生成器(RNG)种子(默认 -1,-1 = 随机种子)。

固定种子可让相同输入与设置的多轮运行产生一致、可复现的结果,便于测试、调试或对比不同选项何时分叉。种子小于 0 时使用随机种子,每次运行输出不同。

采样链的源码级说明

以上采样器并非各自独立生效,而是组成一条采样链按序执行。默认链与各采样器字符、规范名称的映射定义在 common/sampling.cpp 与 common/arg.cpp:

  • --samplers "name1;name2;...":按名称(分号分隔)指定采样链,支持dry、top_k、top_p、top_n_sigma、typ_p、min_p、temperature、xtc、infill、penalties等规范名,也接受top-k、nucleus、typical、temp等别名。
  • --sampling-seq/--sampler-seq SEQUENCE:按单字符缩写指定简化采样链(如mx表示 min_p → xtc)。

主循环每次生成时调用common_sampler_sample得到 token、再调用common_sampler_accept更新采样器状态;启动时还会打印sampler chain供确认(见 main.cpp)。


性能调优与内存选项

以下选项用于改善模型运行的性能与内存占用,可按机器能力精细调节。

线程数

  • -t N, --threads N:生成时的线程数。推荐设为物理核心数(而非逻辑核心数),用对线程数能大幅提升性能。源码中若传 0 或负数会自动回退到hardware_concurrency()(见 arg.cpp)。
  • -tb N, --threads-batch N:批处理/提示词处理阶段的线程数。某些系统上批处理用更多线程更有利;未指定时与生成线程数相同。

Mlock

  • --mlock:将模型锁定在内存中,防止内存映射后被换出。可提升性能,但代价是占用更多 RAM(模型需整载入内存),加载时间可能变慢,并部分失去内存映射的优势。

关闭内存映射

  • --no-mmap:不对模型做内存映射。默认模型按需映射进内存,系统只加载需要的部分。若模型大于总内存、或系统内存紧张,mmap 可能增加页换出(pageout)风险。关闭 mmap 加载更慢,但在未使用--mlock时可能减少换出。若模型大于总内存,关闭 mmap 会导致模型完全无法加载。

NUMA 支持

  • --numa distribute:将等量线程固定到每个 NUMA 节点上的核心,负载散布到所有核心、利用全部内存通道,代价是跨节点访问需要走慢速互联。
  • --numa isolate:把全部线程固定到程序启动所在的 NUMA 节点,限制可用核心与内存,但保证所有内存访问都在本节点内。
  • --numa numactl:按启动时通过 numactl 工具传入的 CPU 映射固定线程,最灵活——例如用满第一个节点全部核心、在第二个节点只放足以饱和跨节点内存总线的核心数。

这些标志尝试针对非一致内存访问(NUMA)系统做优化,当前包含上述三种策略之一,并会关闭 mmap 的预取与预读(页面在首次访问时按需调入,配合线程固定,更多页面落在实际使用的 NUMA 节点上)。注意:若模型已在系统页缓存中(如之前未加该选项运行过),除非先清页缓存否则效果甚微——可重启系统,或在 Linux 上以 root 执行echo 3 > /proc/sys/vm/drop_caches。

批大小

  • -ub N, --ubatch-size N:物理批大小,单次最多并行处理的 token 数。增大可提升提示词处理性能,但内存占用更高。默认512。
  • -b N, --batch-size N:逻辑批大小。在使用多 GPU 流水线并行时,增大到超过物理批大小可提升提示词处理性能。默认2048。

主循环按n_batch分批调用llama_decode处理 token(见 main.cpp)。

提示缓存(Prompt Caching)

  • --prompt-cache FNAME:指定文件缓存初始提示处理后的模型状态。使用长提示时能显著加快启动速度:首次运行创建该文件,后续运行复用并更新。注意:恢复缓存并不等于恢复保存时的精确会话状态,因此即使指定了种子,也无法保证与原始生成得到完全相同的 token 序列。

源码层面:启动时若缓存文件存在则通过llama_state_load_file载入并比对与当前提示的 token 匹配度(低于一半匹配时会提示"将大部分重新评估");首次采样后通过llama_state_save_file保存(见 main.cpp)。相关变体:--prompt-cache-all(连用户输入与生成也存入缓存)、--prompt-cache-ro(只读缓存、不更新)。

语法约束(Grammars 与 JSON Schema)

  • --grammar GRAMMAR, --grammar-file FILE:以内联字符串或文件形式指定 GBNF 语法,把模型输出约束到特定格式——例如强制输出 JSON,或只允许说 emoji。语法细节参见 smallthinker/grammars/README.md(GBNF 指南),可直接用./llama-cli -m <model> --grammar-file grammars/some-grammar.gbnf -p 'Some prompt'试玩,仓库 smallthinker/grammars 目录下有json.gbnf、list.gbnf、c.gbnf等现成示例。
  • --json-schema SCHEMA:指定 JSON Schema 约束输出(如{}表示任意 JSON 对象,或{"items": {"type": "string", "minLength": 10, "maxLength": 100}, "minItems": 10}表示带长度/数量约束的 JSON 字符串数组)。若 Schema 含外部$ref,应改用--grammar "$( python examples/json_schema_to_grammar.py myschema.json )"。底层由 arg.cpp 调用json_schema_to_grammar即时把 Schema 编译为 GBNF 语法。

量化

4-bit 量化可显著提升性能并降低内存占用,相关准备与量化流程请参考本仓库 smallthinker/README.md(其中给出了llama-quantize --pure ... Q4_0的转换命令,并注明 SmallThinker 稀疏模型需使用 Q4_0 量化、最多 8 线程运行)。


LoRA(低秩适配)适配器

  • --lora FNAME:LoRA 适配器路径,缩放系数 1.0。可与--lora-scaled混用,可重复出现以叠加多个适配器。
  • --lora-scaled FNAME:带自定义缩放系数的 LoRA 适配器路径,可与--lora混用并重复。

用法示例:

--lora my_adapter_1.gguf --lora my_adapter_2.gguf ... --lora-scaled lora_task_A.gguf 0.5 --lora-scaled lora_task_B.gguf 0.5

要点:

  • LoRA 适配器必须为GGUF 格式;Hugging Face 格式可用仓库根目录的convert_lora_to_gguf.py脚本转换(参见 smallthinker/convert_lora_to_gguf.py)。
  • 适配器在推理时单独加载并应用,不与主模型合并,因此使用 LoRA 时仍可完全支持 mmap 模型加载。
  • 旧版--lora-base标志已移除(因为不再执行合并)。

源码中每个适配器以{路径, 缩放系数}记录到params.lora_adapters,模型初始化时统一应用(见 arg.cpp 与 main.cpp 的 "load the model and apply lora adapter" 流程)。


附加选项

  • -h, --help:显示全部可用选项及默认值。参数与默认值变化频繁,文档可能滞后,以--help输出为准。
  • --verbose-prompt:生成前打印详细提示词(含逐 token 拆解,见 main.cpp)。
  • --no-display-prompt:生成时不打印提示词。
  • -mg i, --main-gpu i:多 GPU 时指定哪个 GPU 承载小张量(跨 GPU 拆分收益不划算的部分)。该 GPU 会多占一点显存做临时结果的 scratch buffer。默认 GPU 0。
  • -ts SPLIT, --tensor-split SPLIT:多 GPU 时指定大张量在各 GPU 间的拆分比例。SPLIT为逗号分隔的非负值序列,按顺序给每块 GPU 分配数据比例,例如"3,2"表示 GPU 0 分 60%、GPU 1 分 40%。默认按显存比例拆分,但未必是最优性能方案。
  • -hfr URL --hf-repo URL:Hugging Face 模型仓库地址,配合--hf-file(-hff)使用。模型会下载并保存到-m/--model指定的文件;若未提供-m,则自动保存到LLAMA_CACHE环境变量路径或系统本地缓存。仓库还支持-hf简写、<user>/<model>[:quant]形式(quant 可选、默认 Q4_K_M)、--hf-token等扩展(见 arg.cpp)。

源码视角:llama-cli 的完整调用链

最后从实现层面串一遍llama-cli的完整工作流程,便于理解上述参数如何落到推理路径上(均位于 main.cpp):

  1. 参数解析:common_params_parse(argc, argv, params, LLAMA_EXAMPLE_MAIN, print_usage)统一解析所有命令行参数,失败即返回 1。
  2. 后端初始化:llama_backend_init()+llama_numa_init(params.numa),随后common_init_from_params加载模型并应用 LoRA 适配器。
  3. 线程池:通过 ggml 后端动态注册的ggml_threadpool_new创建生成线程池与批处理线程池(两者参数一致时可复用),llama_attach_threadpool挂载到上下文。
  4. 对话模式判定:聊天模板可用时自动启用-cnv,否则回退为普通补全模式。
  5. 会话/提示缓存:存在--prompt-cache文件时载入并与当前提示做前缀匹配,尽量复用已计算的 KV。
  6. 主生成循环:按n_batch分批llama_decode→common_sampler_sample采样 →common_sampler_accept更新采样器与语法状态 → 检测反向提示词(最近 32 token)与 EOG token → 上下文满时执行 KV 滑动(llama_kv_self_seq_rm/add)→ 交互模式下读入用户输入并注入前缀/后缀。
  7. 收尾:common_perf_print打印性能统计,释放采样器、线程池并调用llama_backend_free()。

正因如此,llama-cli既适合脚本化的批量补全(-no-cnv -p),也适合本地对话式交互(--jinja/--chat-template/-r反向提示词),还可以配合 smallthinker/grammars 做结构化输出约束,是本仓库本地部署推理最直接的命令行入口。

  • 人工智能
  • 大模型
  • 推理引擎
  • 本地部署

【免费下载链接】PowerInfer

High-speed Large Language Model Serving for Local Deployment

项目地址:https://gitcode.com/gh_mirrors/po/PowerInfer
点击查看免费下载

相关推荐

上一篇:NS-USBLoader 使用教程:Switch文件传输与系统管理全攻略
下一篇:Yew 服务端渲染(SSR)实战:从 trunk 构建 hydration 包到 warp 服务器的完整流程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询