一、ollama方式
1.本地部署ollama
部署方式:见本地部署ollama博客内容
2.基于langchain使用
from langchain_ollama.chat_models import ChatOllama
llm = ChatOllama(
model="deepseek-r1:8b", # 与本地 ollama run 的模型名保持一致
base_url="http://ip:11434", # 默认端口
temperature=0.1,
num_predict=2048
)
# 单轮调用示例
for chunk in llm.stream(
"你好"
):
print(chunk.content)
二、llamafile方式
1.本地部署
步骤(linux环境)
wget https://huggingface.co/FM-1976/Qwen2.5-1.6b-llamafile/resolve/main/QwenPortable.llamafile
chmod +x QwenPortable.llamafile
./QwenPortable.llamafile
2.基于langchain使用
from langchain_openai import ChatOpenAI
# 配置本地模型:核心就是指向 llamafile 的 OpenAI兼容接口
llm = ChatOpenAI(
base_url="http://ip:8080/v1", # 本地llamafile的API地址,固定
api_key="not-needed", # 必填但无效,随便填即可,llamafile不需要鉴权
model_name="not-needed", # 模型名随便填,不影响调用,llamafile会忽略
temperature=0.7, # 回答随机性,0=严谨,1=发散
max_tokens=128 # 最大生成字数
)
# 方式1:简单单轮对话
result = llm.invoke("你好")
print(result.content)
3.system启动方式配置
(1)编辑文件
vim /etc/systemd/system/lamafile-qwen-1.6b-cpu.service
[Unit]
Description=Qwen2.5-1.6B llamafile Service
# 确保在网络就绪后启动
After=network.target
# 希望网络在线时启动(需要systemd-networkd-wait-online服务)
Wants=network-online.target
[Service]
Type=simple
# 建议使用非root用户运行,提高安全性(如新建专用用户)
User=root
Group=root
# 工作目录设置为包含模型文件的目录
WorkingDirectory=/data
# 使用bash执行,确保环境变量和信号处理正确
# --host 0.0.0.0 监听所有网络接口
# --port 18080 指定服务端口
# -t 8 设置使用的线程数(根据CPU核心数调整)
ExecStart=/bin/bash -c "exec /data/QwenPortable.llamafile --server --host 0.0.0.0 --port 18080 --nobrowser -t 8"
# 服务异常退出时自动重启
Restart=always
# 重启前等待10秒,避免频繁重启
RestartSec=10
# 日志输出到systemd journal
StandardOutput=journal
StandardError=journal
# 可选:设置日志标识
SyslogIdentifier=llamafile-qwen
# 可选:设置服务启动超时时间(秒)
TimeoutStartSec=300
# 可选:设置服务停止超时时间(秒)
TimeoutStopSec=30
# 可选:限制服务资源使用
# CPUQuota=200%
# MemoryMax=4G
[Install]
# 设置为系统启动时自动启用
WantedBy=multi-user.target
(2)刷新配置,启动
systemctl daemon-reload
systemctl start lamafile-qwen-1.6b-cpu.service
systemctl status lamafile-qwen-1.6b-cpu.service
(3)注意
(1)lamafile文件依赖shell启动
(2)exec参数
1)不加 exec:/bin/bash -c "/data/xxx.llamafile --参数"
bash 启动后,会新建一个子进程去运行 llamafile
最终进程树:systemd → bash → llamafile
问题:bash 会作为「父进程」残留,systemd 管理的是 bash 而非 llamafile,停止服务时信号传递异常、可能残留僵尸进程,日志也会混乱。
2)加 exec:/bin/bash -c "exec /data/xxx.llamafile --参数"
bash 启动后,执行 exec 命令 时,会销毁自身的 bash 进程,把 llamafile 程序加载到当前进程空间
最终进程树:systemd → llamafile
优势:没有多余的 bash 进程残留,systemd 能「直接管理」llamafile 主进程,启停服务、监控进程状态、日志收集全部正常,这是 systemd 配置的标准最佳实践。
(4)参数说明
| 参数 | 功能 | 典型场景 |
|---|---|---|
--server |
启动 HTTP 服务 | 远程 API 调用 |
--port 8080 |
固定服务端口 | 多服务共存时避免冲突 |
| --host 0.0.0.0 | 外部服务访问 | |
--nobrowser |
禁用浏览器自动弹窗 | 无头服务器部署 |
| -t 8 | 线程数 |
4.GPU的方式启动
# 双卡GPU,启动命令
./QwenPortable.llamafile --n-gpu-layers 40 --main-gpu 0 --split-mode layer -t 16
单卡GPU,启动命令
./QwenPortable.llamafile --n-gpu-layers 40 --main-gpu 0 -t 16
双卡核心参数:
--n-gpu-layers 40:加载 40 层模型到 GPU,显存占用极低(单卡仅占 1.2G 左右,双卡均分)
--main-gpu 0:指定主显卡 ID 为 0(nvidia-smi 里显示的第一张显卡是 0,第二张是 1),所有核心计算优先走主卡
--split-mode layer:多卡并行的核心模式 → 按「模型层」分片,把模型的神经网络层平均分配到你的两张 N 卡上,比如前 20 层跑在显卡 0,后 20 层跑在显卡 1,两张卡同时工作,算力拉满!
-t 16:CPU 线程数,建议填你 CPU 的物理核心数(比如 16 核填 16,8 核填 8),llama.cpp 会用 CPU 做少量辅助计算,不影响 GPU 主力工作