Llama 使用方式与典型场景
使用方式与典型场景
示例一:起一个 OpenAI 兼容服务并用 cURL 调用
llama.cpp 的 llama-server 与 Ollama 都暴露 OpenAI 兼容端点,这意味着现有基于 OpenAI SDK 写的业务代码,只要改 base_url 就能切到本地模型。先起服务:
# 方案 A:llama.cpp
./build/bin/llama-server -m ./models/llama-8b-Q4_K_M.gguf \
-c 8192 -ngl 99 --host 0.0.0.0 --port 8080
# 方案 B:Ollama(其 OpenAI 兼容接口固定在 /v1 前缀下)
ollama serve
ollama pull llama3.1:8b
然后调用。llama.cpp 的端点是 http://localhost:8080/v1/chat/completions,Ollama 是 http://localhost:11434/v1/chat/completions:
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "local",
"messages": [
{"role": "system", "content": "你是中文技术助手,回答简洁准确。"},
{"role": "user", "content": "用一句话说明 LoRA 为什么省显存"}
],
"temperature": 0.6,
"top_p": 0.9,
"max_tokens": 256,
"stream": false
}'
流式输出把 stream 改为 true 即可,返回是 SSE 格式。模型名在 llama.cpp 下任意填,Ollama 下需与服务里的模型名一致。业务侧接入示例(Python):
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed")
resp = client.chat.completions.create(
model="local",
messages=[{"role": "user", "content": "写一个快速排序的 Python 实现"}],
temperature=0.2,
)
print(resp.choices[0].message.content)
示例二:LoRA 微调与打包成 Ollama 模型
微调的目标通常是让模型学会一种固定输出风格或领域术语,而不是灌入新知识。用 transformers + peft 做 LoRA(QLoRA 则在加载基座时开启 4bit 量化)的关键配置如下:
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import torch
quant_cfg = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B-Instruct",
quantization_config=quant_cfg,
device_map="auto",
)
model = prepare_model_for_kbit_training(model)
lora_cfg = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
)
model = get_peft_model(model, lora_cfg)
model.print_trainable_parameters()
几个容易踩的点:target_modules 必须写对 Llama 的注意力投影层名,写错会「训练跑起来了但效果为零」;QLoRA 必须先 prepare_model_for_kbit_training 再做 get_peft_model,顺序反了会精度异常;训练数据的组织形式要和推理时的 chat template 完全一致,否则训练完上线效果对不上。训练完成后 save_pretrained 只落盘适配器,几十到几百 MB,部署时可以合并回基座,也可以由 vLLM 用 --enable-lora 动态加载多份适配器。
如果要把微调结果做成 Ollama 可用的模型,可以写一个 Modelfile。注意下面的模板必须与训练时的模板严格一致:
FROM ./llama-3.1-8b-instruct-Q4_K_M.gguf
PARAMETER num_ctx 8192
PARAMETER temperature 0.6
PARAMETER top_p 0.9
PARAMETER repeat_penalty 1.1
PARAMETER stop "<|eot_id|>"
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
"""
ollama create my-llama-ft -f ./Modelfile
ollama run my-llama-ft
什么场景适合,什么场景不适合
适合:数据不出内网的私有化部署、高频调用的成本敏感场景(本地推理的边际成本几乎为零)、需要固定风格或格式的业务(LoRA 微调后效果稳定)、离线或弱网环境(端侧、车机、工业现场)、对输出可复现性有要求的评测与批处理(固定 seed)。
不适合:追求最强通用能力的任务——同代开源模型在最难推理与长链任务上通常仍落后于头部闭源模型,这类需求更适合混合架构,用本地模型处理量大且简单的部分;显存严重不足却想跑大尺寸模型——靠极低量化硬撑会显著掉质量,不如换更小的尺寸;超高并发在线服务——单机自建的吞吐与弹性不如成熟的托管推理服务,除非你有明确的合规硬约束。
