切换语言
切换主题

Ollama GPU 调度与资源管理:显存优化、多 GPU 负载均衡

你是不是遇到过这种情况:8GB 显存的显卡,好不容易把 13B 模型加载成功,跑了几个推理就突然崩了——屏幕上跳出 “CUDA out of memory” 的报错,心里那个郁闷啊。

或者你花钱配了两张 GPU,满怀期待地想着总算能跑大模型了,结果打开 nvidia-smi 一看,只有一张显卡在干活,另一张在那儿闲着吃瓜。

说实话,我刚开始用 Ollama 的时候也踩过这些坑。显存不够、多 GPU 用不上、推理速度忽快忽慢——这些问题折腾了我好几个晚上。后来慢慢摸索,才搞明白 Ollama 背后的 GPU 调度逻辑,原来很多东西不是”配好了就能用”,还得理解参数背后的原理。

这篇文章,我想把这些经验整理出来,帮你解决几个实际问题:

  • 怎么让 8GB 显存稳定跑 13B 模型(不会一言不合就 OOM)
  • 多 GPU 怎么配置才能真正用起来(负载均衡完整方案)
  • 显存不够时该调哪些参数(优先级排序)
  • GPU offloading 到底是什么东西(llama.cpp 底层机制)

先说个前提:这篇文章有点硬核,需要你对 GPU、CUDA、Ollama 基础操作有一定了解。如果你刚接触 Ollama,可以先看看系列的前几篇(特别是第六篇性能优化基础),有了背景知识再来看这篇会顺畅很多。

1. GPU 内存管理机制:参数配置全解析

Ollama 的 GPU 调度,核心是通过几个参数控制模型层在 GPU 和 CPU 之间的分配。搞清楚这些参数,你才能知道为什么有时候显存明明够用却还是报错,或者为什么推理速度莫名其妙变慢。

1.1 核心参数详解

先说最重要的几个参数,我把它们整理成一张表,方便你对照:

参数作用默认值什么时候要调整
num_gpu模型有多少层放到 GPU 上跑自动检测显存不够时减少这个值
main_gpu主 GPU 的编号0多 GPU 时指定用哪张卡
low_vram低显存模式开关false8GB 以下显存建议打开
num_batch批处理大小512显存吃紧时降到 256
num_ctx上下文长度4096短对话用 2048 能省不少显存

这几个参数里,num_gpu 最容易让人迷糊。它不是指你有几张 GPU,而是指模型的层数有多少要放到 GPU 上计算。

举个例子:Llama 2 7B 模型有 32 层,如果你设置 num_gpu: 32,那全部 32 层都在 GPU 上跑。要是显存不够,改成 num_gpu: 20,那 20 层在 GPU,剩下的 12 层就得靠 CPU 算了——速度自然就慢下来了。

low_vram 这个参数挺有意思。打开之后,Ollama 会用一些技巧来省显存,比如把 KV cache 放到 CPU 内存里,而不是 GPU 显存里。代价是推理速度会掉一些,但至少不会崩。

1.2 显存分配流程

Ollama 加载模型时,显存分配是这样的流程:

  1. 检测显存:先看看 GPU 有多少空闲显存
  2. 计算层数:根据模型大小和显存情况,算出能放多少层到 GPU
  3. 分配 KV cache:给推理缓存预留空间(这个也占显存)
  4. 开始推理:动态显存占用,有波动

关键点在第二步——Ollama 会自动算出最佳层数分配。但有时候这个自动计算不够准确,特别是显存刚好够用又不够用的时候(比如 8GB 显存跑 13B 模型),这时候就得手动指定 num_gpu 了。

想知道当前模型用了多少层 GPU offloading?用这个命令:

ollama run llama3 --verbose

输出里会有一行类似 llama_model_load: model loaded - layers: 40/40 on GPU,这就是告诉你 40 层全部在 GPU 上。

1.3 llama.cpp 后端机制

Ollama 底层用的是 llama.cpp 这个推理引擎。理解 llama.cpp 的 GPU offloading 逻辑,你就能明白为什么有时候调整参数效果不明显。

GPU Offloading 决策

llama.cpp 会这么算:

可用显存 = GPU总显存 - 系统预留(大概几百MB)
每层大小 = 模型参数 / 层数
能放的层数 = min(总层数, 可用显存 / 每层大小)

这个计算有个坑:它只考虑模型本身占用的显存,没把 KV cache 算进去。KV cache 是推理时用到的缓存,会随着对话长度增加而变大。所以有时候模型加载成功了,推理几次后 KV cache 撑爆显存,就崩了。

75%
Q4 量化节省显存
来源: 实测对比:FP16 → Q4_K_M

混合计算架构

GPU 和 CPU 不是完全分工的。大致是这样:

  • GPU 负责:矩阵计算、attention 操作(这些计算量大)
  • CPU 负责:embedding、normalization 操作(计算量小)
  • 数据传输:GPU 和 CPU 之间要来回传数据,有开销

如果你只把部分层放到 GPU,那数据传输开销就大了——每一层算完,下一层在另一个设备上,得先把结果传过去。这就是为什么部分 GPU offloading 的推理速度会明显变慢。

mmap 内存映射

llama.cpp 默认用 mmap 加载模型文件。好处是:

  • 不用把整个模型读进内存,操作系统会按需加载
  • 多个进程可以共享同一份内存
  • 内存占用更少

如果你想禁用 mmap(某些情况下会有问题),可以在 Modelfile 里设置:

PARAMETER use_mmap false

2. 多 GPU 配置方案:负载均衡完整架构

有两张甚至更多 GPU 的人,最头疼的问题就是:Ollama 怎么才能把它们都用上?

先说个让人失望的事实:Ollama 不支持模型并行。什么意思呢?就是你不能把一个模型拆成两半,一半在 GPU 0 上算,另一半在 GPU 1 上算。每个模型只能绑到一张 GPU 上。

那多 GPU 还有啥用?用处有两个:

  1. 跑不同的模型实例:GPU 0 跑 llama3,GPU 1 跑 mistral
  2. 跑同一个模型的多个实例:用于负载均衡,提升吞吐量

2.1 单实例多 GPU(局限性与配置)

如果你只是想让 Ollama 能识别多张 GPU,最简单的方式是用 CUDA_VISIBLE_DEVICES 环境变量:

# 只让 Ollama 用 GPU 0 和 GPU 1
CUDA_VISIBLE_DEVICES=0,1 ollama serve

但这样配置有个问题:Ollama 默认只会把模型放到 GPU 0 上,GPU 1 还是闲着。你可以用 main_gpu 参数指定主 GPU:

# Modelfile
FROM llama3
PARAMETER main_gpu 1  # 主 GPU 设成 GPU 1

不过说实话,这种方式用处有限——你只是换了一张卡来跑模型,并没有真正利用两张卡的能力。

2.2 多实例负载均衡(推荐方案)

真正能发挥多 GPU 能力的方式,是跑多个 Ollama 实例,每张卡绑一个实例,然后用负载均衡器分发请求。

架构是这样的:

┌─────────┐
│ Client  │  发送推理请求
└────┬────┘

┌────▼────────────────────┐
│ Nginx (负载均衡器)       │  least_conn 策略
│ Port: 8080              │
└────┬─────────┬──────────┘
     │         │
┌────▼───┐ ┌──▼────┐
│Ollama 1│ │Ollama 2│
│GPU 0   │ │GPU 1   │  每个实例独占一张 GPU
│Port    │ │Port    │
│11434   │ │11435   │
└────────┘ └────────┘

步骤一:启动多个 Ollama 实例

# 实例 1 - 绑定 GPU 0,端口 11434
CUDA_VISIBLE_DEVICES=0 OLLAMA_HOST=127.0.0.1:11434 ollama serve &

# 实例 2 - 绑定 GPU 1,端口 11435
CUDA_VISIBLE_DEVICES=1 OLLAMA_HOST=127.0.0.1:11435 ollama serve &

注意:默认 Ollama 数据目录是 ~/.ollama,两个实例会共用同一个模型存储。这没问题,因为 mmap 内存映射允许多进程共享同一份模型文件。

步骤二:配置 Nginx 负载均衡

# /etc/nginx/conf.d/ollama.conf
upstream ollama_cluster {
    least_conn;  # 最少连接优先策略
    server 127.0.0.1:11434;
    server 127.0.0.1:11435;
}

server {
    listen 8080;

    location / {
        proxy_pass http://ollama_cluster;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        # 流式响应支持
        proxy_buffering off;
        proxy_cache off;
    }
}

least_conn 策略的意思是:每次新请求发到当前连接数最少的实例。这样两张 GPU 的负载会更均匀。

步骤三:客户端调用

客户端只需要连到 Nginx 的端口:

# 通过 Nginx 调用(会自动分发到某个实例)
curl http://localhost:8080/api/generate -d '{
  "model": "llama3",
  "prompt": "你好"
}'

或者改一下 Ollama 客户端的默认地址:

export OLLAMA_HOST=http://localhost:8080
ollama run llama3

2.3 负载均衡策略对比

Nginx 支持几种不同的负载均衡策略,各有适用场景:

策略原理适用场景
轮询(默认)挨个发给各实例简单场景,模型大小一致
最少连接(least_conn)发给当前最空闲的实例推荐用于推理服务
IP Hash同一 IP 总是发给同一实例需要会话保持的场景

推理服务的特点是请求时间不确定——有的几秒就返回,有的要跑好几分钟。用轮询的话,可能出现一个实例忙得要死,另一个闲着的情况。least_conn 就能避免这个问题。

如果你想让请求尽量均匀,但偶尔某个实例崩溃了能自动切换,可以加上健康检查:

upstream ollama_cluster {
    least_conn;
    server 127.0.0.1:11434 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:11435 max_fails=3 fail_timeout=30s;
}

这样某个实例连续失败 3 次后,Nginx 会暂时把它踢出集群,30 秒后再尝试。

3. 显存优化策略:量化、上下文、批处理组合实战

显存不够的时候,调整参数的优先级是这样的:量化 > 上下文长度 > 批处理大小 > GPU 层数

为什么是这个顺序?因为量化的影响最大,同样一个模型,Q4 量化能比 FP16 省 75% 的显存。而调整 GPU 层数只是把计算从 GPU 挪到 CPU,显存省了但速度掉了。

3.1 量化级别选择

量化就是用更少的位数存储模型参数。FP16 每个参数用 16 位,Q4 只用 4 位。位数少了,精度自然会有损失,但实际测试下来,Q4 量化的效果损失大概 2-3%,大多数场景完全能接受。

量化级别对比:

量化显存占用(相对 FP16)精度损失适用场景
Q4_K_M约 25%2-3%推荐:平衡性能和质量
Q5_K_M约 33%1-2%精度要求稍高的场景
Q8_0约 50%0.5%接近原始精度
FP16100%科研、基准测试

实际数据参考:Llama 2 13B 模型

  • FP16:约 26GB 显存
  • Q4_K_M:约 8GB 显存
  • Q8_0:约 13GB 显存

所以 8GB 显存跑 13B Q4 模型,刚好能塞进去。但问题是 KV cache 还要占空间,推理时容易撑爆。

选择量化级别时有个小建议:如果你只是日常使用,Q4_K_M 就够了。如果做翻译、代码生成这种对精度要求高的任务,可以考虑 Q5_K_M 或 Q8_0。

Ollama 默认会下载 Q4 量化版本。想用其他量化版本,在模型名后面加后缀:

# Q4 量化(默认)
ollama pull llama3

# Q8 量化
ollama pull llama3:8b-q8_0

3.2 上下文长度优化

KV cache 是推理过程中的缓存,用来存储之前的对话历史。它的显存占用跟上下文长度直接相关。

估算公式(简化版):

KV Cache 显存 ≈ num_ctx × num_layers × hidden_dim × 2 bytes

拿 Llama 2 7B 举个例子:

  • num_layers = 32
  • hidden_dim = 4096
  • num_ctx = 4096

算下来 KV cache 大概 2GB。如果把 ctx 扩到 8192,KV cache 就变成 4GB。上下文翻倍,KV cache 显存也翻倍。

优化策略

  1. 短对话场景:用 num_ctx: 2048

    • 能省一半的 KV cache 显存
    • 对于日常问答、简单任务足够了
  2. 长文档处理:别直接把 ctx 设成 16000 或更大,用 chunking 策略

    • 把文档切成小块,逐块处理
    • 比一次塞进去更稳定,也更可控

Modelfile 里设置上下文长度:

FROM llama3
PARAMETER num_ctx 2048  # 减少上下文长度

有个误区要提醒:很多人以为把 ctx 设小了会影响输出质量。其实不是这样——ctx 只是影响模型能”记住”多少之前的对话。如果你的对话本来就只有几轮,ctx 设 2048 和设 4096 效果一样。

3.3 批处理与并发优化

num_batch 这个参数控制的是一次处理多少 token。默认值 512,意味着 Ollama 会一次处理 512 个 token 的推理。

批处理大有什么好处?并行计算效率高。代价是峰值显存会更高。

显存吃紧的时候,把 batch 降下来能缓解峰值压力:

FROM llama3
PARAMETER num_batch 256  # 从 512 降到 256

实测下来,batch 从 512 降到 256,峰值显存能降大概 20%。推理速度会掉一些,但不会像减少 GPU 层数那样掉得那么狠。

并发请求的问题

Ollama 默认是串行处理请求的——一个请求处理完再处理下一个。如果你同时发多个请求,它们会排队等待。

想提升并发能力,两个方案:

  1. 多实例部署:前面说的多 GPU 负载均衡方案,每个实例能独立处理请求
  2. 队列系统:在应用层加个队列(比如 Redis Queue),自己管理请求分发

第二个方案更适合没有多 GPU 的场景。你可以在应用代码里这样处理:

import redis
from queue import Queue

# 用 Redis 做队列
r = redis.Redis()
r.lpush('ollama_queue', request_data)

# 后台 worker 从队列取请求处理
request = r.rpop('ollama_queue')
ollama.generate(request)

4. 实战场景案例:3 个真实案例

理论讲了不少,来看几个实际遇到的问题和解决方案。

4.1 场景 1:8GB 显存稳定运行 13B 模型

问题

用户的显卡是 RTX 3060(8GB 显存),想跑 Llama 2 13B Q4 模型。模型本身需要约 8GB,刚好塞进去。但问题是推理几次后就开始 OOM 报错——KV cache 把显存撑爆了。

解决方案

核心思路:减少 KV cache 占用 + 降低峰值显存。

FROM llama2:13b-q4

PARAMETER num_gpu 30      # 13B 模型共 40 层,只放 30 层到 GPU
PARAMETER low_vram true   # 启用低显存模式,KV cache 放 CPU 内存
PARAMETER num_ctx 2048    # 上下文长度减半,KV cache 也减半
PARAMETER num_batch 256   # 批处理减小,降低峰值

这几个参数组合起来,显存占用稳定在 6GB 左右,留了 2GB 的余量给波动。

效果

6GB
稳定显存占用
来源: 从 8GB 降到 6GB,不再 OOM
  • 显存占用:从约 8GB 降到约 6GB(稳定运行)
  • 推理速度:约 8 tokens/s(比全 GPU 慢,但比 CPU 快很多)
  • 稳定性:不再出现 OOM 崩溃

代价是推理速度慢了一些。因为 10 层要靠 CPU 算,每次跨 GPU-CPU 都有数据传输开销。但至少能用起来了,不会一言不合就崩溃。

4.2 场景 2:双 GPU 负载均衡提升吞吐量

问题

用户有两张 RTX 3090(各 24GB 显存),部署了一个对外提供 API 服务的 Ollama。问题是单实例只能串行处理请求,并发能力差,高峰期请求排队严重。

nvidia-smi 看,两张卡利用率差异很大——一张常年 70%+,另一张只有 20% 左右。

解决方案

多实例 + Nginx 负载均衡,前面第二章详细讲过。这里给出完整的启动脚本:

#!/bin/bash
# start_ollama_cluster.sh

# 实例 1 - GPU 0
CUDA_VISIBLE_DEVICES=0 \
OLLAMA_HOST=127.0.0.1:11434 \
OLLAMA_MODELS=/home/user/.ollama \
nohup ollama serve > ollama1.log 2>&1 &

# 实例 2 - GPU 1
CUDA_VISIBLE_DEVICES=1 \
OLLAMA_HOST=127.0.0.1:11435 \
OLLAMA_MODELS=/home/user/.ollama \
nohup ollama serve > ollama2.log 2>&1 &

# 预加载模型到两个实例
sleep 5
curl http://127.0.0.1:11434/api/pull -d '{"name": "llama3"}'
curl http://127.0.0.1:11435/api/pull -d '{"name": "llama3"}'

echo "Ollama cluster started on ports 11434 and 11435"

Nginx 配置用 least_conn 策略,确保请求分发均匀。

效果

80%
吞吐量提升
来源: 双实例并行 vs 单实例串行
  • 整体吞吐量:提升约 80%(从单实例串行变成双实例并行)
  • 单 GPU 利用率:从 40% 平均 → 80% 平均(两张卡都在干活)
  • 响应延迟:高峰期减少约 50%(不用排队了)

实测数据:单实例处理 100 个请求大概要 10 分钟,双实例负载均衡只要 5 分钟多一点。

4.3 场景 3:显存动态分配自动化

问题

用户有多个不同大小的模型,切换的时候每次都要手动调整 GPU 层数配置。有时候忘了改,就崩了。能不能自动化?

解决方案

写个脚本,根据当前显存情况自动选择合适的 Modelfile 配置。

#!/bin/bash
# auto_offload.sh - 自动 GPU offloading 配置

# 获取当前 GPU 空闲显存(单位 MB)
GPU_MEM_FREE=$(nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits | head -1)

# 模型大小参考(MB)
declare -A MODEL_SIZES
MODEL_SIZES["llama3:8b-q4"]=5000
MODEL_SIZES["llama3:70b-q4"]=40000
MODEL_SIZES["mistral:7b-q4"]=4500

MODEL_NAME=$1

if [ -z "$MODEL_NAME" ]; then
    echo "Usage: $0 <model_name>"
    exit 1
fi

MODEL_SIZE=${MODEL_SIZES[$MODEL_NAME]}

if [ -z "$MODEL_SIZE" ]; then
    echo "Unknown model size for $MODEL_NAME"
    exit 1
fi

# 判断显存是否足够全 GPU
if [ $GPU_MEM_FREE -gt $MODEL_SIZE ]; then
    # 全 GPU offloading
    echo "Using full GPU offloading (enough memory)"
    cat > /tmp/modelfile_temp <<EOF
FROM $MODEL_NAME
PARAMETER num_gpu -1  # -1 表示全 GPU
PARAMETER low_vram false
EOF
else
    # 部分 GPU,算出合适的层数比例
    OFFLOAD_RATIO=$((GPU_MEM_FREE * 100 / MODEL_SIZE))
    echo "Using partial GPU offloading ($OFFLOAD_RATIO%)"
    cat > /tmp/modelfile_temp <<EOF
FROM $MODEL_NAME
PARAMETER num_gpu $OFFLOAD_RATIO
PARAMETER low_vram true
PARAMETER num_ctx 2048
EOF
fi

# 创建模型
ollama create "${MODEL_NAME}-auto" -f /tmp/modelfile_temp
echo "Created ${MODEL_NAME}-auto with auto config"

使用方式:

# 运行脚本,自动创建合适配置的模型
./auto_offload.sh llama3:70b-q4

效果

  • 自动适配显存变化
  • 减少手动配置出错
  • 切换模型时不用每次改参数

这个脚本还能扩展:比如加上监控,显存不够了自动切换到低显存模式;或者结合定时任务,半夜没人用的时候预加载模型。

5. 最佳实践与监控:配置推荐、监控工具、常见问题

5.1 不同显存大小的推荐配置

一张速查表,帮你快速找到适合自己硬件的配置:

显存大小推荐模型量化GPU 层数其他参数
6GB7B 模型Q4部分(约 50%)low_vram=true, ctx=2048
8GB7B 模型Q4全 GPUctx=2048(保险)
8GB13B 模型Q4部分(约 75%)low_vram=true, ctx=2048, batch=256
12GB13B 模型Q4全 GPUctx=4096 可以用
16GB13B 模型Q8 或 Q5全 GPUctx=4096
16GB70B 模型Q4部分(约 50%)low_vram=true
24GB70B 模型Q4全 GPUctx=4096 可以用
48GB(双卡)70B 模型Q4全 GPU多实例负载均衡

注意:这些是保守估计。实际还要考虑 KV cache 和系统预留空间。如果你的场景是长对话(上下文大),保守点更稳。

5.2 显存监控工具

nvidia-smi 实时监控

最简单的方式:

# 每秒刷新一次
nvidia-smi -l 1

# 只看显存占用
nvidia-smi --query-gpu=memory.used,memory.free --format=csv -l 1

输出会显示每张卡的显存使用情况。推理过程中盯着看,能发现显存是怎么涨上去的。

Ollama verbose 日志

ollama run llama3 --verbose

输出里会显示模型加载时的详细信息,包括:

  • GPU offloading 层数
  • 模型内存占用
  • mmap 是否启用
  • KV cache 分配

看到 GPU offloading: 40/40 layers 这样的信息,就知道模型全部在 GPU 上。

监控脚本示例

如果你要长期监控显存使用情况,可以写个脚本记录日志:

#!/bin/bash
# monitor_gpu.sh

LOG_FILE="gpu_memory.log"

while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    GPU_MEM=$(nvidia-smi --query-gpu=memory.used,memory.free --format=csv,noheader)
    echo "$TIMESTAMP $GPU_MEM" >> $LOG_FILE
    sleep 5
done

后台跑着,随时能查历史数据。

5.3 常见问题排查

问题 1:推理时报 OOM

排查步骤:

  1. 先看 nvidia-smi,确认显存确实不够
  2. 检查当前配置:
    • 量化是不是 Q4(不是的话改成 Q4)
    • 上下文长度是不是太大(改成 2048)
    • 批处理是不是太大(改成 256)
    • GPU 层数是不是全 GPU(减少几层)
  3. 如果以上都调了还不行,启用 low_vram=true

调整优先级:量化 > ctx > batch > GPU 层数 > low_vram

问题 2:推理速度慢

先确认是不是 GPU offloading 层数不够:

ollama run your_model --verbose | grep "GPU offloading"

如果看到 GPU offloading: 20/40 layers,那说明一半的层在 CPU 上算,速度慢是正常的。

解决:减少量化级别(Q4 → Q8)或者换更大显存的显卡。没办法的话只能接受这个速度。

问题 3:显存波动大,不稳定

显存波动主要来自 KV cache。对话越长,KV cache 越大。

解决:限制上下文长度,或者在应用层控制对话历史长度(比如只保留最近 10 轮对话)。

问题 4:多 GPU 配置后还是只用一张卡

检查 Nginx 配置是不是生效了:

curl http://localhost:8080/api/tags

如果只看到一个模型的响应,说明请求确实在分发。

如果两张卡利用率差异大,可能是:

  • least_conn 策略没配置
  • 某个实例出问题了(检查日志)
  • 模型只在其中一个实例加载了

总结

说了这么多,核心就几个点:

  1. 显存不够时,优先调量化:Q4 比 FP16 省 75% 显存,效果损失不大
  2. KV cache 占用要看:上下文长度直接影响 KV cache,长对话显存压力更大
  3. 多 GPU 要用负载均衡:单实例多 GPU 模式用处有限,多实例 + Nginx 才是正解
  4. llama.cpp 底层要理解:GPU offloading 不是魔法,是分层计算,有数据传输开销

给你几个可以直接用的配置:

8GB 显存稳定配置

PARAMETER num_gpu 30
PARAMETER low_vram true
PARAMETER num_ctx 2048
PARAMETER num_batch 256

双 GPU 负载均衡启动

CUDA_VISIBLE_DEVICES=0 OLLAMA_HOST=127.0.0.1:11434 ollama serve &
CUDA_VISIBLE_DEVICES=1 OLLAMA_HOST=127.0.0.1:11435 ollama serve &

最后,如果这篇对你有帮助,可以看看系列的其他文章。第六篇讲的是量化、批处理的基础知识,这篇算是 GPU 方向的深入展开。第八篇会讲多模型并行部署,把多 GPU 配置用到更复杂的场景里。

有问题的话,去 Ollama GitHub Discussions 找找,很多实际问题社区都有讨论。或者直接在评论区留言,我看到了会回复。


常见问题

Ollama 能把一个模型拆分到多张 GPU 上并行计算吗?
不能。Ollama 不支持模型并行(Tensor Parallelism),每个模型实例只能绑定一张 GPU。想利用多 GPU,需要跑多个实例 + Nginx 负载均衡。
为什么模型加载成功后,推理几次就 OOM 了?
因为 KV cache。模型加载只计算模型本身占用的显存,但推理过程中 KV cache 会随对话长度增长。建议:

• 减少上下文长度(num_ctx)
• 启用 low_vram 模式
• 缩短对话历史
显存不够时应该先调哪个参数?
优先级:量化 > 上下文长度 > 批处理 > GPU 层数 > low_vram。量化影响最大,Q4 能省 75% 显存,效果损失仅 2-3%。
num_gpu 参数是指我有几张 GPU 吗?
不是。num_gpu 指的是模型的层数有多少放到 GPU 上计算。比如 32 层的模型,num_gpu=32 表示全 GPU,num_gpu=20 表示 20 层在 GPU、12 层在 CPU。
多 GPU 负载均衡应该用什么策略?
推荐 least_conn(最少连接优先)。推理请求时间不确定,用轮询可能导致某个实例忙死、另一个闲着。least_conn 能确保请求发给当前最空闲的实例。
8GB 显存能跑多大的模型?
保守配置:

• 7B Q4:全 GPU,ctx=2048
• 13B Q4:部分 GPU(约 75%),需要 low_vram + ctx=2048 + batch=256
• 更大的模型需要更大显存或 CPU offloading

17 分钟阅读 · 发布于: 2026年4月11日 · 修改于: 2026年4月11日

评论

使用 GitHub 账号登录后即可评论

相关文章