Skip to content

Ollama GPU 加速配置指南 (Windows & Linux),让 AI 推理快到飞起!

感觉 Ollama 只用 CPU 跑模型有点慢吞吞?想不想体验那种秒回的 AI 速度?好消息!如果你的电脑有块不错的 NVIDIA 显卡(GPU),那它就是你的秘密武器!GPU 天生就是并行计算小能手,让它来处理 AI 推理,速度能甩 CPU 好几条街!

这篇指南,就是带你一步步解锁 Ollama 的 GPU 加速能力,无论你是 Windows 党还是 Linux 控,都能轻松搞定!

为啥要用 GPU 加速?简单说就是:

  • 快!快!快! 大幅缩短等待时间,模型响应速度肉眼可见地提升。
  • 体验更丝滑: 实时聊天、代码生成?GPU 让交互更流畅,告别卡顿。
  • 驾驭更大模型: GPU 有更大的“肚子”(显存),能跑得动那些更复杂、更厉害的大家伙。

动手前的准备工作 (请确认!)

在咱们开始之前,请确保你的“装备”符合要求:

  1. 你有块 NVIDIA 显卡: 这是必须的!AMD 或 Intel 核显暂时还不行哦。
  2. 装好了最新的 NVIDIA 驱动: 这是让系统和显卡正常沟通的关键。怎么检查?
    • 打开 命令提示符 (Windows)终端 (Linux)
    • 输入 nvidia-smi 然后回车。
      • 成功: 如果你看到一堆关于你显卡型号、驱动版本、温度、显存占用等信息,恭喜,驱动没问题!
      • 失败: 如果提示“不是内部或外部命令”或类似错误,说明你得去 NVIDIA 官网下载并安装最新的驱动程序了。
  3. CUDA 工具包?(通常不用你操心): CUDA 是 NVIDIA 搞的一套让程序能利用 GPU 计算的东西。好在 Ollama 通常很聪明,能自己搞定这部分依赖。你可以用 nvcc --version 检查下(方法同上)。
    • 如果能看到 CUDA 版本号,说明你装过。
    • 如果提示找不到命令,也别急着装!Ollama 很可能不需要你手动安装。只有在后面配置完 GPU 加速,发现还是用不了时,再考虑是不是需要手动装一下 CUDA Toolkit。
  4. (可选) 知道你的 GPU“身份证号”(UUID): 如果你有不止一块 NVIDIA 显卡,想指定 Ollama 用哪一块,就需要知道它的 UUID(唯一标识符)。
    • 还是在 命令提示符/终端 里,输入 nvidia-smi -L 回车。
    • 你会看到类似 GPU 0: NVIDIA GeForce RTX 3080 (UUID: GPU-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 这样的信息。把那个 GPU- 开头的长串字符串记下来,这就是你想指定的那块卡的 UUID。

准备好了?我们分系统开搞!

Windows 系统:让 GPU 发光发热!

第一步:设置“魔法开关”环境变量

我们要通过设置一个叫“环境变量”的东西,告诉 Ollama:“嘿,用 GPU 干活!”

  1. 找到“环境变量”设置:

    • 最快的方法:按 Win 键,直接搜“环境变量”,然后选“编辑系统环境变量”。
    • 在弹出的“系统属性”窗口里,点右下角的“环境变量(N)...”按钮。
  2. 创建 OLLAMA_GPU_LAYER 变量:

    • 下方的“系统变量(S)”区域(这样对所有用户生效),点“新建(W)...”。
    • 填入以下信息:
      • 变量名: OLLAMA_GPU_LAYER
      • 变量值: cuda (小写,这就是告诉 Ollama 使用 CUDA 路径来启用 GPU)
    • 点“确定”保存。

    小科普:系统变量 vs 用户变量? 系统变量对电脑上所有用户都生效,用户变量只对当前登录的用户生效。一般建议设为系统变量。如果同一个变量名在两处都设置了,用户变量的优先级更高。

  3. (可选) 如果你有多个 GPU,指定用哪块:

    • 还记得前面查到的 UUID 吗?派上用场了!
    • 同样在“系统变量”区域,再新建一个变量:
      • 变量名: CUDA_VISIBLE_DEVICES
      • 变量值: 粘贴你之前记下的 GPU UUID,比如 GPU-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    • 点“确定”保存。

    为啥用 UUID 不用数字编号 (0, 1, 2...)? 强烈推荐用 UUID!因为 GPU 的数字编号(像 nvidia-smi 里显示的 0, 1)可能会因为驱动更新、重启甚至插拔硬件而改变,导致你的设置失效。UUID 是显卡独一无二的“身份证”,稳定可靠!

第二步:重启!重启!重启!(重要的事情说三遍)

  • 超级关键: 为了让 Windows 和 Ollama 完全识别并应用你刚才设置的环境变量,强烈建议你重启电脑!虽然有时只重启 Ollama 或终端也行,但重启电脑是最保险、最彻底的方式,确保万无一失。

第三步:验证 GPU 是否已被“征用”

  1. 运行 Ollama 模型:
    • 打开一个新的 命令提示符 窗口。
    • 随便运行一个模型,比如:ollama run llama3 (或者你常用的模型)。让它跑起来。
  2. 召唤 nvidia-smi 监控:
    • 再打开一个 命令提示符窗口。

    • 输入 nvidia-smi 并回车。

    • 观察输出:

      • 看到 GPU 利用率 (GPU-Util) 不再是 0% 了吗?
      • 看到显存使用量 (Memory-Usage) 有明显增加了吗?
      • 在下方的 Processes 部分,能看到有 ollama 或类似进程在使用 GPU 显存吗?
      • 如果以上几点都满足,那么恭喜!你的 Ollama 已经成功用上 GPU 加速了!享受速度的提升吧!
    • 你也可以尝试运行 ollama ps,虽然它不直接显示 GPU 信息,但确认 Ollama 进程在运行是前提。主要还是靠 nvidia-smi 来确认 GPU 是否在工作。

Linux 系统:释放企鹅的 GPU 潜力!

Linux 下,如果 Ollama 是通过 systemd 服务运行的(很多安装方式默认是这样),我们需要修改服务配置文件来指定 GPU。手动改容易出错,我们用个小脚本来帮忙。

第一步:用脚本智能配置 GPU

这个脚本能帮你自动找到 Ollama 的 systemd 服务文件,并安全地添加或修改 CUDA_VISIBLE_DEVICES 设置。

  1. 创建脚本文件:

    • 打开终端,用你喜欢的编辑器(比如 nanovim)创建一个文件,名字叫 ollama_gpu_selector.sh
      bash
      nano ollama_gpu_selector.sh
  2. 复制粘贴脚本代码:

    • 把下面的整段代码复制粘贴到编辑器里:
    bash
    #!/bin/bash
    
    # --- Ollama GPU Selector Script ---
    # Purpose: Safely sets CUDA_VISIBLE_DEVICES for the Ollama systemd service.
    
    OLLAMA_SERVICE_FILE="/etc/systemd/system/ollama.service"
    
    # Function to validate input (must be comma-separated numbers, e.g., 0 or 0,1)
    validate_input(){
      local input="$1"
      # Basic check: allow digits, commas, and ensure it doesn't start/end with a comma or have consecutive commas
      if [[ ! "$input" =~ ^[0-9]+(,[0-9]+)*$ ]]; then
        echo "Error: Invalid input '$input'. Please enter GPU indices (like 0, or 0,1) separated by commas, no spaces."
        exit 1
      fi
      # You could add more checks here, e.g., verify indices against nvidia-smi -L output if needed
    }
    
    # Function to update the systemd service file
    update_service(){
      local devices="$1"
      local env_line="Environment=\"CUDA_VISIBLE_DEVICES=$devices\""
    
      echo "Attempting to update $OLLAMA_SERVICE_FILE..."
      echo "Setting CUDA_VISIBLE_DEVICES to: $devices"
    
      # Check if the service file exists
      if [ ! -f "$OLLAMA_SERVICE_FILE" ]; then
        echo "Error: Ollama service file not found at $OLLAMA_SERVICE_FILE"
        echo "Please ensure Ollama is installed correctly as a systemd service."
        exit 1
      fi
    
      # Use sudo tee to write the changes with proper permissions
      # Try to replace the line if it exists, otherwise add it under [Service]
      if grep -q '^Environment="CUDA_VISIBLE_DEVICES=' "$OLLAMA_SERVICE_FILE"; then
          echo "Updating existing CUDA_VISIBLE_DEVICES line..."
          sudo sed -i 's|^Environment="CUDA_VISIBLE_DEVICES=.*|'"$env_line"'|' "$OLLAMA_SERVICE_FILE"
      else
          echo "Adding new CUDA_VISIBLE_DEVICES line under [Service]..."
          # Insert the line after the [Service] tag
          sudo sed -i '/\[Service\]/a '"$env_line"'' "$OLLAMA_SERVICE_FILE"
      fi
    
      if [ $? -ne 0 ]; then
        echo "Error: Failed to modify $OLLAMA_SERVICE_FILE. Check permissions or file content."
        exit 1
      fi
    
      echo "Reloading systemd daemon and restarting Ollama service..."
      sudo systemctl daemon-reload
      sudo systemctl restart ollama.service
    
      if [ $? -eq 0 ]; then
          echo "Successfully updated and restarted Ollama service."
          echo "Run 'systemctl status ollama.service' and 'nvidia-smi' while running a model to verify."
      else
          echo "Warning: Ollama service might not have restarted correctly. Check 'systemctl status ollama.service'."
      fi
    }
    
    # --- Main script logic ---
    # Display available GPUs using nvidia-smi -L for user reference
    echo "Available GPUs on this system:"
    nvidia-smi -L
    echo "-------------------------------------"
    
    # Check if arguments are passed
    if [ "$#" -eq 0 ]; then
      # Prompt user for CUDA_VISIBLE_DEVICES values if no arguments are passed
      read -p "Enter the GPU index/indices you want Ollama to use (e.g., 0 or 0,1): " cuda_values
      validate_input "$cuda_values"
      update_service "$cuda_values"
    else
      # Use the first argument as CUDA_VISIBLE_DEVICES values
      cuda_values="$1"
      echo "Using provided argument for GPU indices: $cuda_values"
      validate_input "$cuda_values"
      update_service "$cuda_values"
    fi
    
    exit 0
    • 保存并退出编辑器 (nano: Ctrl+X, Y, Enter)。

    这段脚本干了啥? 它会先用 nvidia-smi -L 显示你有哪些 GPU 和它们的编号,然后问你要用哪个(或哪些,用逗号隔开)。接着,它会用 sudo 权限帮你修改 /etc/systemd/system/ollama.service 这个文件,添加或更新 Environment="CUDA_VISIBLE_DEVICES=你输入的编号" 这一行。最后,它会自动帮你重新加载配置并重启 Ollama 服务。比手动改安全方便!

  3. 给脚本加上执行权限:

    bash
    chmod +x ollama_gpu_selector.sh
  4. 运行脚本 (需要 sudo):

    bash
    sudo ./ollama_gpu_selector.sh
    • 脚本会先显示你的 GPU 列表。
    • 然后提示你输入想用的 GPU 编号 (index)。看 nvidia-smi -L 的输出,通常是从 0 开始。想用第一块卡就输入 0,想同时用第一和第二块(如果你的卡支持且驱动配置允许多卡并行)就输入 0,1
    • 按回车,脚本会自动完成剩下的工作。

第二步:(可选) 检查一下配置文件

如果你不放心,可以看看配置文件是不是真的改对了:

bash
cat /etc/systemd/system/ollama.service

在输出的内容里找找,应该能看到类似 Environment="CUDA_VISIBLE_DEVICES=0" (或者你输入的其他编号)这一行。

第三步:(脚本已做) 重启 Ollama 服务

上面那个脚本在最后已经帮你执行了重启服务的命令:

bash
sudo systemctl daemon-reload
sudo systemctl restart ollama.service

如果你是手动修改的配置文件,或者想再次确认,可以手动运行这两条命令。

第四步:验证 GPU 是否在工作

和 Windows 一样:

  1. 运行一个 Ollama 模型:ollama run llama3
  2. 在另一个终端窗口运行 nvidia-smi,观察 GPU 利用率、显存占用和进程列表。看到 Ollama 在用 GPU 就对了!

现在,你的 Ollama 应该已经成功切换到 GPU 加速模式了!去试试看,感受一下 AI 推理速度的飞跃吧!