|
Ollama 是开源、轻量的 LLM 运行框架(底层基于 llama.cpp),支持 Windows / Linux / Mac,
社区维护,支持 LLaMA、Qwen、Gemma、DeepSeek 等众多开源模型。
```bash
# 在线安装(Linux)
curl -fsSL https://ollama.com/install.sh | sh
# Windows:官网下载安装包 https://ollama.com/download
# 模型下载目录环境变量(节省 C 盘空间)
mkdir -p /wks/bigmodels/ollama
export OLLAMA_MODELS=/wks/bigmodels/ollama
# Windows:系统属性 → 环境变量 → 新建 OLLAMA_MODELS = D:\OllamaModels,改完重启 ollama
# 服务启动与验证(默认端口 11434)
ollama serve
sudo netstat -tunlp | grep 11434
# 模型管理
ollama pull llama3
ollama run llama3
ollama rm llama3
ollama list
# deepseek-r1 蒸馏系列
ollama run deepseek-r1:1.5b
ollama run deepseek-r1:8b
ollama run deepseek-r1:14b
ollama run deepseek-r1:32b
```
云上(GPU 服务器)示例:
```bash
mkdir deepseek
export OLLAMA_MODELS=/root/deepseek
curl -fsSL https://ollama.com/install.sh | sh
nohup ollama serve &
ollama pull deepseek-r1:32b
# 本地通过 ssh 隧道访问云上的 ollama
ssh -L 11435:localhost:11434 root@your-server -p 22 -N -q
```
|
|
CPU 离线安装(无网环境下载安装包再解压):
```bash
cd /opt/soft
curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz
# 或 wget https://ollama.com/download/ollama-linux-amd64.tgz --no-check-certificate
tar -C /usr -xzf ollama-linux-amd64.tgz
# 或解压到自定义目录
mkdir -p /wks/python/ollama_offline/
tar -C /wks/python/ollama_offline/ -xzf ollama-linux-amd64.tgz
ollama serve
ollama -v
```
即使没刻意装 GPU 版,只要有 NVIDIA 显卡,日志里也会显示 `inference compute ... library=cuda`,自动用上 GPU。
|
|
从 modelscope 下载 GGUF 权重,再用 Modelfile 导入 ollama:
```bash
# 下载(Q4: 4 位量化;另有 Q8_0 / F16 可选)
git lfs install
git clone https://www.modelscope.cn/unsloth/DeepSeek-R1-Distill-Qwen-14B-GGUF.git
# 编写 Modelfile
vim mf_14b_q4
from /wks/models/deepseek/DeepSeek-R1-Distill-Qwen-14B-GGUF/DeepSeek-R1-Distill-Qwen-14B-Q4_K_M.gguf
# 注册进 ollama
ollama serve
ollama create DeepSeek-R1-14B-Q4 -f /wks/models/deepseek/mf_14b_q4
ollama list
```
同一套权重可分别注册 Q4 / Q8 / F16 多个档位,按需切换精度与资源消耗。
|
|
硬件环境建议:
- 笔记本 5000¥~12000¥ 皆可;有 GPU 更好,无 GPU 也能跑(慢)
- 磁盘至少 2T:优先高速存储 / SSD,普通磁盘也行就是慢;磁盘不够可加固态移动硬盘
- 经验:笔记本 8G 显存跑 9B 原生模型(transformers 直载)非常吃力;跑 ollama 量化版(Q4)则流畅得多
|
|
ollama 提供 OpenAI 兼容接口(`/v1`),直接用 openai SDK:
```python
from openai import OpenAI
# ollama serve
# ollama list
client = OpenAI(
base_url='http://localhost:11434/v1/',
api_key='key', # 必需但可以随便填
)
chat_completion = client.chat.completions.create(
messages=[{'role': 'user', 'content': '久坐办公,下班后适合做哪些运动'}],
model='deepseek-r1:1.5b',
)
print(chat_completion.choices[0].message.content)
```
|
|
原生 REST API(流式输出,逐 token 返回 JSON 行):
```bash
# 生成接口
curl http://localhost:11434/api/generate -d '{
"model": "llama3",
"prompt": "Why is the sky blue?"
}'
# 对话接口
curl http://localhost:11434/api/chat -d '{
"model": "llama3",
"messages": [
{ "role": "user", "content": "why is the sky blue?" }
]
}'
# OpenAI 兼容接口
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama3",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "who are you"}
]
}'
```
注意事项:
- 浏览器测试服务通畅性:`http://localhost:11434/api/tags`
- Windows 上 curl 建议用 git bash;从其他机器/WSL 访问 Windows 主机要留意 IP 不通的问题
- model 名称必须是 `ollama run` / `ollama pull` 安装过的名字
- 用 apipost / postman 调试时,超时时间要设置长一些
|
|
在项目里封装一层,业务代码更干净:
```python
from tpf.llm import chat_ollama
res = chat_ollama(
"上班很累了,办公看了一天的电脑,下班后如何克制自己不玩手机?",
model='deepseek-r1:1.5b'
)
print(res)
```
|
|
vLLM 是大模型部署及服务框架(https://vllm.ai),核心是 PagedAttention 高吞吐推理。
支持的模型清单:https://docs.vllm.ai/en/latest/models/supported_models.html
版本对齐示例(vllm 0.5.5 是 2024 年 8 月发布,其它依赖要同期版本):
```bash
pip install torch==2.4.0 torchaudio==2.4.0 torchvision==0.19.0 transformers==4.44.0 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tokenizers==0.19.1 triton==3.0.0 vllm==0.5.5 vllm-flash-attn==2.6.1 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
```
最新版直接 `pip install vllm uvicorn sse_starlette`。
也可以在 CPU 上安装(`pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu` 后再装 vllm),
但性能显著受限,仅建议验证用。
注意:vLLM 安装要求 **Linux + GPU**(Windows 上 pip 源码编译会失败),
Windows 建议用 nvidia 的 docker 镜像 `nvcr.io/nvidia/pytorch:23.10-py3`(自带 CUDA + ubuntu),
容器内 `conda create -n vllm python=3.9 -y && pip install vllm`。
|
|
启动 OpenAI 兼容的 API 服务(在线推理,适合聊天机器人、在线问答):
```bash
# 单卡
CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints.openai.api_server \
--model /wks/models/deepseek/DeepSeek-R1-Distill-Qwen-1.5B --port 8000
# 双卡张量并行
CUDA_VISIBLE_DEVICES=0,1 python -m vllm.entrypoints.openai.api_server \
--model ./path/deepseek_model --port 8000 --tensor-parallel-size 2
# 新版 vllm serve 写法
vllm serve deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \
--tensor-parallel-size 2 --max-model-len 32768 --enforce-eager
```
调用测试:
```bash
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "/path/to/model", "max_tokens": 60,
"messages": [{"role": "user", "content": "你是谁?"}]}'
```
|
|
离线批量推理(一次加载模型,批量处理输入,适合批量生成/翻译):
```bash
python -m vllm.entrypoints.offline_inference \
--model /path/to/your/model \
--input-path prompts.json \
--output-path outputs.json \
--temperature 0.7 --max-tokens 32 --top-p 0.9 --top-k 40 --dtype bfloat16
```
输入 `prompts.json` 示例:
```json
[
{"prompt": "Translate to French: Hello, world!"},
{"prompt": "Summarize this text: ..."}
]
```
CLI 交互式推理:
```bash
python -m vllm.entrypoints.cli \
--model DeepSeek-AI/DeepSeek-R1-Distill-Qwen-32B \
--tensor-parallel-size 4 --gpu-memory-utilization 0.9 \
--max-num-batched-tokens 4096 --dtype half
```
|
|
| 参数 | 含义 | 示例 |
|------|------|------|
| --model | 模型路径或 HF 名称 | /path/to/model |
| --host / --port | 监听地址与端口 | 0.0.0.0 / 8000 |
| --tensor-parallel-size | 张量并行 GPU 数 | 2 |
| --gpu-memory-utilization | GPU 显存利用率 | 0.9 |
| --max-num-seqs | 每次推理最大序列数 | 256 |
| --max-num-batched-tokens | 最大批处理 token 数 | 2048 |
| --max-model-len | 最大上下文长度 | 显存不足时调小 |
| --dtype | 计算精度 | bfloat16 / float16 |
启动排障:显存不足 → 减小 --max-model-len 或换更小模型;CUDA 报错 → 检查驱动与 CUDA 版本。
分布式张量并行用 Ray 管理:`pip install ray`,启动时加 --tensor-parallel-size N 即可。
|
|
```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
tokenizer = AutoTokenizer.from_pretrained("THUDM/glm-4-9b-chat", trust_remote_code=True)
query = "现在是9月份,我鼻炎爆发了,我是湿寒体质,生活习惯上应该注意什么?"
inputs = tokenizer.apply_chat_template(
[{"role": "user", "content": query}],
add_generation_prompt=True, tokenize=True,
return_tensors="pt", return_dict=True
).to(device)
model = AutoModelForCausalLM.from_pretrained(
"THUDM/glm-4-9b-chat",
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
trust_remote_code=True
).to(device).eval()
gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1}
with torch.no_grad():
outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
```
|
|
要点:
- `apply_chat_template` 把多轮消息按模型要求的对话模板编码,是 chat 模型的标准入口
- `torch_dtype=torch.bfloat16` + `low_cpu_mem_usage=True` 降低显存与内存压力
- 实测:笔记本 8G 显存跑 9B 模型非常吃力(半小时一次问答)——原生精度大模型对显存要求高,
本地小显存建议改用 ollama 量化版
- 输出要切掉 prompt 部分:`outputs[:, inputs['input_ids'].shape[1]:]`
|
|
lobe-chat(https://lobehub.com/zh/docs/usage/features/local-llm):
```bash
docker run -d -p 3210:3210 \
-e OLLAMA_PROXY_URL=http://host.docker.internal:11434/v1 \
lobehub/lobe-chat
```
- OLLAMA_PROXY_URL 指向 ollama 的 OpenAI 兼容地址;多台服务器可手工指定具体 IP
- Windows 上需先启动 docker desktop;访问 http://127.0.0.1:3210/welcome
|
|
open-webui(https://github.com/open-webui/open-webui):
```bash
# ollama 在本机
docker run -d -p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data --name open-webui --restart always \
ghcr.io/open-webui/open-webui:main
# 需要 Nvidia GPU
docker run -d -p 3000:8080 --gpus all \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data --name open-webui --restart always \
ghcr.io/open-webui/open-webui:cuda
# ollama 在别的服务器
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=https://example.com \
-v open-webui:/app/backend/data --name open-webui --restart always \
ghcr.io/open-webui/open-webui:main
```
安装后访问 http://localhost:3000 。
|
|
**问题 1:WebUI 找不到 ollama**
apipost 能访问 ollama,但 WebUI 不识别——是 WebUI docker 创建时的网络方式导致的。
解决办法:把 ollama 直接映射进 docker(用 `:ollama` 镜像变体):
```bash
# GPU
docker run -d -p 3000:8080 --gpus=all -v ollama:/root/.ollama \
-v open-webui:/app/backend/data --name open-webui --restart always \
ghcr.io/open-webui/open-webui:ollama
# CPU 去掉 --gpus=all 即可
```
这种方式不是 IP 映射,而是直接把 ollama 文件映射进容器,Windows 的文件映射给 Linux 容器用也没问题,可见 ollama 的平台兼容性。
**问题 2:WebUI 里无模型可选**
ollama 里已装模型但 WebUI 找不到——可在 WebUI 界面里再下载一个模型,之后列表就会出现。
|
|
大模型参数分布在多 GPU 上,核心依赖**模型并行(Model Parallelism)**:
**1. 张量并行(TP)**:把每层的权重矩阵按列/行切分到不同 GPU
```text
输入X → [GPU0: W0] → 部分输出
→ [GPU1: W1] → 部分输出
→ [GPU2: W2] → 部分输出
→ [GPU3: W3] → 部分输出
↓ All-Reduce 聚合 → 完整输出
```
每个 GPU 只存 1/N 权重,每轮计算后经 NCCL 通信聚合;适合单节点多卡(NVLink 高速互联)。
数学上看,就是把一次矩阵乘法 $Y = XW$ 拆成列块 $W = [W_1, W_2]$,分别算 $XW_1$、$XW_2$ 再拼接:
$$Y = XW = X[W_1, W_2] = [XW_1, XW_2]$$
**2. 流水线并行(PP)**:模型按层分组,不同组放不同 GPU,微批次流水执行;适合跨节点。
**3. 专家并行(EP,MoE 特有)**:如 GLM 系列 256 个专家分布到不同 GPU,
每个 token 经 Router 只激活其中 8 个(约 40B 参数),专家间用 All-to-All 通信调度。
**4. 数据并行(DP)**:同一模型副本放多组 GPU 处理不同 batch,适合高并发推理。
| 通信方式 | 带宽 | 适用 |
|----------|------|------|
| NVLink | 900GB/s | 单节点 TP |
| InfiniBand | 200-400Gb/s | 跨节点 PP/EP |
| RoCE | 100Gb/s | 低成本跨节点 |
|
|
**显存估算公式**
$$\text{显存}_{\text{总}} = \underbrace{N \times b}_{\text{权重}} + \underbrace{2 \times L \times d \times S \times B \times b}_{\text{KV Cache}} + \text{激活值}$$
- N:参数量;b:每参数字节数(BF16=2,FP8=1)
- KV Cache:2(K 和 V)× 层数 L × 隐藏维度 d × 序列长度 S × batch B
- 激活值:与 batch 和序列长度相关
以 744B 参数的超大 MoE 模型为例:BF16 权重约 1.51TB,FP8 约 756GB,
加 1M 上下文的 KV Cache(数百 GB)与激活值,总需求 3.6TB+。
| 方案 | 总显存 | 结论 |
|------|--------|------|
| 8×H20 96GB | 768GB | 仅够 FP8 权重,无余量 |
| 16×H20 96GB | 1536GB | 可行:TP=8, PP=2 跑 FP8 |
| 8×H100 80GB | 640GB | 不足 |
| 8×A100 + 量化 | 640GB | 边缘可行,长上下文受限 |
|
|
**超大模型部署方案举例(以 GLM 系列为例)**
vLLM 多卡(推荐):
```bash
python -m vllm.entrypoints.openai.api_server \
--model zai-org/GLM-5 \
--tensor-parallel-size 8 --pipeline-parallel-size 2 \
--dtype fp8 --max-model-len 32768 --gpu-memory-utilization 0.95
```
SGLang(对 MoE 优化,支持专家并行):
```bash
python -m sglang.launch_server --model zai-org/GLM-5 \
--tp 8 --dp 2 --ep 8 --dtype fp8 --mem-fraction-static 0.85
```
生产部署检查清单:显存总量达标、单节点 NVLink 或跨节点 IB、CUDA ≥ 12.1、
推理框架版本匹配、模型走 HF/ModelScope 镜像、跨节点带宽 ≥100Gb/s。
云上 4 卡 H20 部署 sglang 实例(含投机采样 EAGLE、分层缓存 hicache)时注意:
hicache 的 file 后端每次请求会产生大量 .bin 缓存文件,需规划好缓存盘(如挂 /tmp/hicache 到独立数据盘)。
|
ollama deepseek-r1
vLLM: Easy, Fast, and Cheap LLM Serving
open-webui troubleshooting