Ollama 故障排查

Ollama 有时可能无法按预期运行。了解原因的最佳方式之一,是查看日志。

在 Mac 上运行:

cat ~/.ollama/logs/server.log

在使用 systemd 的 Linux 系统上运行:

journalctl -u ollama --no-pager --follow --pager-end

在容器中运行时,日志输出到容器的 stdout/stderr:

docker logs <container-name>

使用 docker ps 查找容器名称。如果手动在终端运行 ollama serve,日志就显示在该终端。

Windows 上有几个不同位置。打开运行对话框,然后输入以下命令,用资源管理器查看:

  • explorer %LOCALAPPDATA%\Ollama:日志位置。最新服务器日志为 server.log,旧日志为 server-#.log。
  • explorer %LOCALAPPDATA%\Programs\Ollama:二进制文件位置,安装器会将其加入用户 PATH。
  • explorer %HOMEPATH%\.ollama:模型和配置保存位置。
  • explorer %TEMP%:临时可执行文件位于一个或多个 ollama* 目录中。

需要额外调试日志时,先从托盘菜单退出正在运行的应用,再在 PowerShell 中运行:

$env:OLLAMA_DEBUG="1"
& "ollama app.exe"

可以加入 Ollama 的 Discord 社区,寻求解读日志的帮助。

LLM 库

Ollama 包含多个针对不同 GPU 和 CPU 向量特性编译的 LLM 库,并尝试根据系统能力选择最适合的一个。如果自动检测失败,或者 GPU 崩溃等问题出现,可以强制使用特定库。

CPU 库中,cpu_avx2 性能最好,其次是 cpu_avx;cpu 最慢,但兼容性最高。macOS 下的 Rosetta 模拟可以使用 cpu 库。

服务器日志会出现类似以下消息,具体内容随版本变化:

Dynamic LLM libraries [rocm_v6 cpu cpu_avx cpu_avx2 cuda_v11 rocm_v5]

实验性的 LLM 库覆盖

可以将 OLLAMA_LLM_LIBRARY 设为任何可用库,以绕过自动检测。例如,虽然有 CUDA 显卡,但希望强制使用支持 AVX2 的 CPU 库:

OLLAMA_LLM_LIBRARY="cpu_avx2" ollama serve

查看 CPU 特性:

cat /proc/cpuinfo| grep flags | head -1

在 Linux 安装旧版或预发布版本

如果在 Linux 遇到问题,希望安装旧版,或者尝试正式发布前的预发布版,可以向安装脚本指定版本:

curl -fsSL https://ollama.com/install.sh | OLLAMA_VERSION=0.5.7 sh

Linux 临时目录的 noexec 设置

如果 Ollama 存放临时可执行文件的位置设置了 noexec,可以通过 OLLAMA_TMPDIR 指定其他目录。该目录必须允许运行 Ollama 的用户写入,例如 OLLAMA_TMPDIR=/usr/share/ollama/。

Linux Docker

如果容器中的 Ollama 起初使用 GPU,运行一段时间后却切换为 CPU,而且日志显示 GPU 发现失败,可以在 Docker 中禁用 systemd cgroup 管理。编辑主机的 /etc/docker/daemon.json,向 Docker 配置加入 "exec-opts": ["native.cgroupdriver=cgroupfs"]。

NVIDIA GPU 发现

Ollama 启动时会枚举系统 GPU,判断兼容性与可用显存。有时发现过程无法找到 GPU。通常使用最新驱动可以获得最佳结果。

Linux NVIDIA 排查

如果在容器内运行 Ollama,请先按照 Docker 文档配置容器运行时。

有时 Ollama 初始化 GPU 会遇到困难。日志中可能出现错误码 3(未初始化)、46(设备不可用)、100(无设备)、999(未知)或其他错误。可以尝试以下方法:

  • 如果使用容器,先确认运行时是否正常。运行 docker run --gpus all ubuntu nvidia-smi;如果该命令失败,Ollama 也无法看到 NVIDIA GPU。
  • 检查 uvm 驱动是否加载:sudo nvidia-modprobe -u。
  • 尝试重新加载 nvidia_uvm:先执行 sudo rmmod nvidia_uvm,再执行 sudo modprobe nvidia_uvm。
  • 尝试重启。
  • 确认使用最新 NVIDIA 驱动。

如果仍未解决,收集更多信息并提交问题:

  • 设置 CUDA_ERROR_LEVEL=50 后重试,取得更多诊断日志。
  • 检查内核错误:sudo dmesg | grep -i nvrm 与 sudo dmesg | grep -i nvidia。

AMD GPU 发现

Linux 上访问 AMD GPU,通常需要加入 video 和/或 render 组,才能访问 /dev/kfd。权限不正确时,Ollama 会检测并在服务器日志中报错。

在某些 Linux 发行版和容器运行时中,容器内的 ollama 进程可能无法访问 GPU。在主机运行 ls -lnd /dev/kfd /dev/dri /dev/dri/*,确定设备的数字组 ID,然后给容器添加相应的 --group-add ... 参数。例如输出 crw-rw---- 1 0 44 226, 0 Sep 16 16:55 /dev/dri/card0 中,组 ID 是 44。

如果 Ollama 无法正确发现或使用 GPU 进行推理,可以通过以下方法定位:

  • AMD_LOG_LEVEL=3:启用 AMD HIP/ROCm 库的信息级日志,显示更详细的错误码。
  • OLLAMA_DEBUG=1:在 GPU 发现过程中输出额外信息。
  • 检查 amdgpu 或 kfd 驱动错误:sudo dmesg | grep -i amdgpu 和 sudo dmesg | grep -i kfd。

AMD 驱动版本不匹配

如果 Linux 上检测不到 AMD GPU,且服务器日志出现:

msg="failure during GPU discovery" ... error="failed to finish discovery before timeout"
msg="bootstrap discovery took" duration=30s ...

通常意味着系统 AMD GPU 驱动过旧。Ollama 自带 ROCm 7 Linux 库,需要兼容 ROCm 7 的内核驱动。使用 ROCm 6.x 或更旧驱动时,GPU 初始化会在设备发现阶段挂起,最终超时,导致 Ollama 回退到 CPU。

解决方法是按照 AMD ROCm 文档,使用 amdgpu-install 升级到 ROCm v7 驱动。升级后,重启系统,再重启 Ollama。

多块 AMD GPU

如果 Linux 上模型加载到多块 AMD GPU 后输出乱码,参阅 AMD 多 GPU 已知问题与限制。

Windows 终端错误

某些旧版 Windows 10,例如 21H1,存在标准终端无法正确显示控制字符的问题。这可能导致屏幕出现大量 ←[?25h←[?25l 字符串,有时还会报 The parameter is incorrect。原文建议更新到 Windows 10 22H1 或更新版本以解决此问题。


原文:Ollama:Troubleshooting。作者/维护方:Ollama 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容