有时 Ollama 可能无法按预期运行。找出问题的最佳方法之一是查看日志。在 Mac 上,通过运行以下命令查找日志:

cat ~/.ollama/logs/server.log

在使用 systemd 的 Linux 系统上,可以通过以下命令找到日志:

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

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

docker logs <container-name>

(使用 docker ps 来查找容器名称)

如果在终端中手动运行 ollama serve,日志将显示在该终端中。

当你在 Windows 上运行 Ollama 时,有几个不同的位置。你可以通过按下 <cmd>+R 并输入以下内容在资源管理器窗口中查看它们:

  • 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"

加入 Discord 以获取解读日志的帮助。

LLM libraries

Ollama 包含多个针对不同的 GPUs 和 CPU vector features 编译的 LLM libraries。Ollama 会根据系统的功能尝试选择最佳的一个。如果这种自动检测存在问题,或者你遇到其他问题(例如 GPU 崩溃),你可以通过强制指定特定的 LLM library 来解决此问题。cpu_avx2 性能最佳,其次是 cpu_avx,最慢但兼容性最好的是 cpu。MacOS 下的 Rosetta emulation 可以与 cpu library 一起工作。

在服务器日志中,你会看到类似这样的消息(因版本而异):

Dynamic LLM libraries [rocm_v6 cpu cpu_avx cpu_avx2 cuda_v11 rocm_v5]

Experimental LLM Library Override

你可以将 OLLAMA_LLM_LIBRARY 设置为任何可用的 LLM libraries 以绕过自动检测。例如,如果你有一张 CUDA card,但想强制使用支持 AVX2 vector 的 CPU LLM library,请使用:

OLLAMA_LLM_LIBRARY="cpu_avx2" ollama serve

你可以通过以下命令查看你的 CPU 具有哪些功能。

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

Installing older or pre-release versions on Linux

如果你在 Linux 上遇到问题并希望安装旧版本,或者想在正式发布前试用预发布版,你可以告诉安装脚本要安装的版本。

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

Linux tmp noexec

如果你的系统配置了“noexec”标志,而 Ollama 在其上存储临时可执行文件,你可以通过设置 OLLAMA_TMPDIR 为 Ollama 运行用户可写入的位置来指定备用位置。例如 OLLAMA_TMPDIR=/usr/share/ollama/

Linux docker

如果 Ollama 最初在 docker 容器中的 GPU 上正常工作,但过一段时间后切换到 CPU 运行,且服务器日志中报告 GPU discovery failures,这可以通过禁用 Docker 中的 systemd cgroup management 来解决。在主机上编辑 /etc/docker/daemon.json 并在 docker 配置中添加 "exec-opts": ["native.cgroupdriver=cgroupfs"]。

NVIDIA GPU Discovery

当 Ollama 启动时,它会清点系统中存在的 GPUs 以确定兼容性和可用 VRAM 量。有时这种发现过程可能无法找到你的 GPUs。通常,运行最新的驱动会得到最佳结果。

Linux NVIDIA Troubleshooting

如果你使用容器运行 Ollama,请确保首先按照 docker 中的描述设置了 container runtime

有时 Ollama 可能在初始化 GPU 时遇到困难。当你检查服务器日志时,这可能会显示为各种错误代码,如 “3” (not initialized), “46” (device unavailable), “100” (no device), “999” (unknown) 或其他。以下故障排除技术可能有助于解决问题

  • 如果你使用的是容器,container runtime 是否正常工作?尝试 docker run --gpus all ubuntu nvidia-smi - 如果这不起作用,Ollama 将无法看到你的 NVIDIA GPU。
  • uvm driver 是否已加载?sudo nvidia-modprobe -u
  • 尝试重新加载 nvidia_uvm driver - sudo rmmod nvidia_uvm 然后 sudo modprobe nvidia_uvm
  • 尝试重启
  • 确保你运行的是最新的 nvidia drivers

如果以上方法都无法解决问题,请收集更多信息并提交 issue:

  • 设置 CUDA_ERROR_LEVEL=50 并重试以获取更多诊断日志
  • 检查 dmesg 中是否有错误 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 发现期间将报告额外信息
  • 检查 dmesg 中 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 GPUs

如果在 Linux 上的多个 AMD GPUs 之间加载模型时出现乱码响应,请参阅以下指南。

Windows Terminal 错误

已知旧版本的 Windows 10(例如 21H1)存在一个 bug,标准终端程序无法正确显示控制字符。这可能导致显示一长串类似 ←[?25h←[?25l 的字符串,有时还会报错 The parameter is incorrect 要解决此问题,请更新到 Win 10 22H1 或更高版本。