ollama 本地部署
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 API 调用
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 部署
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 即可。
transformers 直接加载
```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]:]`
WebUI 可视化
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