Tiered context length can exhaust VRAM

此报错通常发生在 Ollama 0.15.5 及以上版本,自动根据显存设置默认上下文长度(Tiered context length)后,未考虑并行数( OLLAMA_NUM_PARALLEL ),导致显存溢出、模型被迫使用系统内存/交换分区而性能骤降。优先排查方式是显式通过 OLLAMA_CONT

快速结论:此报错通常发生在 Ollama 0.15.5 及以上版本,自动根据显存设置默认上下文长度(Tiered context length)后,未考虑并行数(OLLAMA_NUM_PARALLEL),导致显存溢出、模型被迫使用系统内存/交换分区而性能骤降。优先排查方式是显式通过 OLLAMA_CONTEXT_LENGTH 环境变量限制上下文长度。

适用环境:GitHub Issue 中确认的工具版本:Ollama 0.15.5。可能涉及 24 GiB 以上显存的 GPU(24-48 GiB 默认 32,768 上下文,>=48 GiB 默认 262,144 上下文)。部分报告也涉及 AMD iGPU(共享系统内存场景)。未提及具体操作系统与 Python 版本。

最快修复方案:暂无确认的一步修复方案。Issue 维护者明确指出,目前尚不存在自动让“上下文与并行度之和保持在显存内”的动态标志;OLLAMA_CONTEXT_LENGTH 是当前唯一可用的静态限制手段。

注意事项:OLLAMA_CONTEXT_LENGTH 是一个全局环境变量,它会作用于所有模型,而非单个模型。维护者长期目标是让默认上下文等于模型的训练上下文长度,届时并行度也应由 Ollama 自动设置;在此之前需要用户自行权衡“模型质量”与“显存占用/性能”。此外,自动调整上下文与并行度的功能尚未实现,需等待后续版本。

问题场景

在 Ollama 服务端启动时,未手动设置 OLLAMA_CONTEXT_LENGTHOLLAMA_NUM_PARALLEL,直接运行大模型或使用并行推理。在 0.15.5 引入显存分档默认上下文后,总显存消耗近似等于 OLLAMA_CONTEXT_LENGTH × OLLAMA_NUM_PARALLEL,容易造成显存溢出。即使并行数为默认值 1,对于 24 GiB 以上显存的 GPU,更大的上下文也可能导致模型溢出至系统内存/交换分区,实测 tokens/s 从 ~15 降至 ~6。

报错原文

Tiered context length can exhaust VRAM
model requires more system memory (92.5 GiB) than is available (38.3 GiB)
model requires more system memory (254.8 GiB) than is available (33.7 GiB)

原因分析

可能原因:Ollama 0.15.5 为了简单起见,仅根据显存检测结果硬编码了三个默认上下文档位(4,096 / 32,768 / 262,144),却没有考虑 OLLAMA_NUM_PARALLEL 对显存总量的乘积影响。在 AMD iGPU(显存与系统内存共用)和 AMD Strix Halo 等大显存设备上,默认的高上下文档位使模型显存占用远超预期,触发错误或被迫降级到 CPU/系统内存,导致吞吐量断崖式下跌。

环境排查

  • 确认 Ollama 版本是否为 0.15.5 或更新版本(新代码在 0.16.0-rocm 中仍可能复现)。
  • 通过 ollama ps 查看当前上下文、处理器占用(100% GPU 还是 CPU/GPU 混合)及显存占用。
  • 检查显存总量与模型实际加载需求:例如 42GB 的 llama3.1:70b 在 96GB 总显存下竟被评估为需要 92.5GiB;84GB 的 qwen3-coder-next:Q8_0 反而运行正常。
  • 核查系统可用内存与显存分配(如 AMD UEFI 中将 96GB 固定为 VRAM 的实际可用数值)。
  • 查看 Ollama 服务端日志中是否有核心转储或 goroutine 卡在 IO wait 的重复信息。

解决步骤

  1. 显式设置 OLLAMA_CONTEXT_LENGTH 环境变量,避免使用自动分档的默认值。可优先尝试:在 systemd 服务文件或启动脚本中添加 Environment="OLLAMA_CONTEXT_LENGTH=16384",并重启 Ollama 服务。
  2. 如果使用 OLLAMA_NUM_PARALLEL 并行特性,手动调低上下文长度,确保二者乘积不超出显存。由于目前无自动均衡逻辑,必须人工计算。
  3. 作为测试手段,可同时设置 OLLAMA_NUM_PARALLEL=1 以排除并行度的影响;但 Issue 报告表明即使并行度为 1,较大的上下文也可能导致溢出,因此该步骤仅为辅助排查不能当作修复。
  4. 若使用的是 AMD Strix Halo 或 iGPU 共享内存设备,检查 UEFI 显存分配与系统可用内存实际值是否一致,避免因驱动或固件报告值与实际值不同造成误判。
  5. 目前没有“自动将上下文限制在 GPU 内”的开关;如需为单个模型做特定上下文默认值,仍只能通过 Modelfile 或显式启动参数,全局环境变量无法按模型区分。等待 Ollama 后续版本提供动态调整功能。

验证方法

修改环境变量后重启 Ollama,运行原本失败的模型,观察是否仍出现 “model requires more system memory” 或 “model failed to load”。成功标志:ollama ps 显示 100% GPU 且上下文为你手动设定的值,不再出现 CPU/GPU 混跑或性能骤降(tokens/s 数值回复到正常水平)。也可对比溢出前后的 tokens/s 变化确认性能回归。

参考来源

ollama/ollama #14116

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22011

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注