Ollama使用NVIDIA GPU运行大模型

安装

  • 安装 ollama 执行程序:

手工本地安装
curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz
sudo tar -C /usr -xzf ollama-linux-amd64.tgz
Debian 12操作系统添加NVIDIA官方软件仓库配
wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt-get update

# cuda-drivers和cuda-toolkit需要分别安装
apt-get -y install cuda-drivers cuda-toolkit

配置

当完成 使用Ollama运行DeepSeek R1 后,我发现默认情况下 Ollama 是使用CPU进行推理的:

  • CPU跑满了一个core,但是 nvidia-smi 显示GPU "纹丝不动"

简单参考 ollama/docs/gpu.md 就可以看到 Ollama 是通过环境变量 CUDA_VISIBLE_DEVICES 来使用 NVIDIA GPU 的,也就是说需要给 ollama 服务进程传递这个环境变量。

由于 使用Ollama运行DeepSeek R1 使用了 Systemd进程管理器 来运行 ollama 服务,所以需要配置 Systemd环境变量

  • 找出GPU的id,对于 NVIDIA GPU 使用 nvidia-smi 命令:

通过 nvidia-smi 命令获取GPU的id
nvidia-smi -L

输出显示:

通过 nvidia-smi 命令获取GPU的id
GPU 0: NVIDIA Graphics Device (UUID: GPU-794d1de5-b8c7-9b49-6fe3-f96f8fd98a19)

  • 修订 /etc/systemd/system/ollama.service 添加环境变量:

/etc/systemd/system/ollama.service 设置 ollama 服务运行环境变量
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"
Environment="OLLAMA_MODELS=/huggingface.co/ollama/models"
Environment="CUDA_VISIBLE_DEVICES=GPU-794d1de5-b8c7-9b49-6fe3-f96f8fd98a19"

[Install]
WantedBy=default.target
  • 重新加载 ollama.service 配置以及重启服务:

重启 ollama 服务
systemctl daemon-reload
systemctl restart ollama
  • 现在再次使用ollama进行推理的时候,就会看到GPU满负荷运行,证明已经将推理由GPU完成(不过 ollama 的CPU也是满负荷,有点吃惊)

指定GPU之后运行 ollama 推理就可以看到 nvidia-smi 输出显示GPU满负荷工作
Every 2.0s: nvidia-smi                                                                debian12: Sun Feb 16 17:34:57 2025

Sun Feb 16 17:34:57 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.86.15              Driver Version: 570.86.15      CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA Graphics Device         On  |   00000000:05:00.0 Off |                    0 |
| N/A   36C    P0            147W /  150W |   21447MiB /  23040MiB |     96%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            6259      C   /usr/bin/ollama                       21444MiB |
+-----------------------------------------------------------------------------------------+

参考