之前一直在 Mac 上使用 ollama 所以没注意,最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了,因为 Mac 上如果超内存的话,那么就只用 CPU,但是我发现 Llama3.2 3B 只占用 3GB,这远没有超。看了一下命令没发现有相关的选项。所以我查了一下。
运气很好,找到了一篇博客写了可以强制在 GPU 上的方法:用容器跑。
下面为2025年2月21日更新
感谢评论区两位读者的提醒。我才仔细看了一下文档,官方大部分虽然都是使用容器来进行操作的,但是并没有说明 Linux 上只支持在容器内使用 GPU。对于这一纰漏可能对您造成的误导深感抱歉。
所以在安装 Ollama 容器之前,我会告知如何判断是否要用和运行在 GPU 之上,你可以根据你的需要判断用不用容器。
直接安装使用 Ollama
安装 Ollama
安装起来很简单,直接一句话(装的慢可以找个镜像):
curl -fsSL https://ollama.com/install.sh | sh
然后随便安装个模型测试一下:
$ ollama run llama3.2 --verbose
>>> tell me a 100 words stroy
As the sun set over the ocean, Lena sat alone on the beach. She had just received
news that her grandmother, who had been her closest friend and confidant, had passed
away. Tears streamed down her face as she gazed out at the waves, feeling lost and
alone. But then she remembered the words of wisdom her grandmother had once shared:
"Life is like the tides, Lena. Sometimes it's calm, sometimes it's rough. But no
matter what, the beauty of the world will always be there." With a newfound sense of
peace, Lena let out a deep breath and smiled.
total duration: 1.64130885s
load duration: 56.215161ms
prompt eval count: 33 token(s)
prompt eval duration: 229ms
prompt eval rate: 144.10 tokens/s
eval count: 124 token(s)
eval duration: 1.354s
eval rate: 91.58 tokens/s
测试 Ollama 是否使用 GPU
接下来是就是如何判断你的ollama
是否运行在 GPU 上,其实你从上面的速度就能看出来了,不过还有一些其他的判断方法。
首先看 Ollama 自己的配置:
$ ollama ps
NAME ID SIZE PROCESSOR UNTIL
llama3.2:latest a80c4f17acd5 4.0 GB 100% GPU About a minute from now
可以看到是使用 100% 的 GPU,这表示 Ollama 要使用的是 GPU,不过实际上用没有,那么这里看不出来。
要想看到实际上用没用到,在运行时通过查看nvidia-smi
显示的信息,我一般使用如下选项,这样一秒刷新一次:
nvidia-smi -l 1
如果显卡利用率和功耗都是满载状态,那么说明是使用 GPU 进行的,这时候就恭喜你安装好了。
这种情况没有使用 GPU 怎么办
没有使用 GPU,其实是初始化 GPU 的时候出现了问题。
首先你可以尝试重装 Ollama,比如使用 Gitee 的镜像,因为有时候不能使用 GPU 是因为网络问题,它会在使用的时候下一些校验和检查,下不了就不行了,这点你运行ollama serve
然后运行,就可以看到错误信息了。
其次,参考官方给出的解决方案,如下:
可以看到第三个解决方案其实就是评论幻影3972提到的方法。
关于nvidia_uvm
还有一点,也是你需要考虑是否需要使用镜像的原因。据官方说挂起 Ollama 之后再次运行,可能会导致 Ollama 找不到 Nvidia GPU,这时候就开始使用 CPU 了。官方给出解决这个驱动问题的方法如下:
sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm
但是如果你使用的是桌面版本的 Linux,大概率会发现会提示正在使用:
$ sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm
rmmod: ERROR: Module nvidia_uvm is in use
你先看nvidia-smi
上显示的进程,把他们都kill
了。
但是桌面的两个(上图中前两个)杀了后会发现自动又开了,而且你强制重载驱动都不行。
$ sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm
rmmod: ERROR: ../libkmod/libkmod-module.c:799 kmod_module_remove_module() could not remove 'nvidia_uvm': Resource temporarily unavailable
rmmod: ERROR: could not remove module nvidia_uvm: Resource temporarily unavailable
服务器版本重载的时候没有这个问题。
如果你的需要能“忍受”和解决这一问题,那么直接使用 Ollama 当然更加方便。如果你一直无法解决,或者不能接受这点,那么还是使用 Docker 跑吧。
容器安装
准备工作
这里使用容器的时候,你不光要安装 Docker,还要安装 NVIDIA Container Toolkit,这样才能在容器中支持使用 GPU。
最新、最全面的介绍当然是官方文档,这里只记录一下 APT 的安装方法,也就是 Ubuntu 这种 Debian 上最常使用的方法。如果你是其他发行版,可以看看官方文档中的相关介绍,我会在相关部分贴上官方文档的地址,这里无意成为某些文档的翻译。
如果你 Ollama 安装模型、下载 NVIDIA Container Toolkit 等工具的时候很卡很慢,可以尝试把 DNS 换成阿里公共 DNS 223.5.5.5
,然后重启系统,过段时间就快了。我当时等了半天,到下午下载速度就能满速了。
安装 Docker
然后安装 Docker,由于我并不使用 GUI,所以安装的是 Docker Engine(docker-ce),如果你要使用 GUI,那么自行搜索 Docker Desktop,这个安装方法到处都是。其他版本请见官方文档 Install Docker Engine - Docker Docs:
# 这里要删除发行版可能自带的
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
# 添加Docker官方GPG key
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 添加仓库到APT源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完之后建议去华为云弄一个镜像加速器,不然拉取容器的时候真的太费劲了。文档地址是设置镜像加速器 - 华为云,里面介绍了相关步骤和使用方法,需要注意的是,需要实名认证,不然会显示无法使用(说这个是因为显示无法使用之后,并不会弹出实名认证的窗口,我找了半天才发现是因为这个)。
安装 NVIDIA Container Toolkit
安装 NVIDIA Container Toolkit 的时候,你需要提前安装好驱动。
其他版本请见官方文档 Installing the NVIDIA Container Toolkit - Nvidia Docs
安装
首先是配置包:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
配置完更新一下就加好了:
sudo apt-get update
然后就可以和其他软件一样安装了:
sudo apt-get install -y nvidia-container-toolkit
配置
这里是使用 root 配置,如果你想用其他模式,那么看看文档 Installing the NVIDIA Container Toolkit - Nvidia Docs
安装好需要配置一下:
sudo nvidia-ctk runtime configure --runtime=docker
然后重启一下 Docker 服务:
sudo systemctl restart docker
好了,现在就做好所有的前置准备了。
部署 Ollama 到 GPU 上
需要注意在下面的步骤之前,要确定当前主机系统的 Ollama 已经关闭了,不然端口会显示占用,你如果需要同时使用,那么换个端口号,后面代码中也要进行相应的修改。
首先看看有没有后台运行:
$ ps -A |grep ollama
1321 ? 00:02:50 ollama
发现还在,那么关闭它:
sudo kill 1321
此时,使用下面的命令可以很轻松的实现部署:
docker run -d --gpus=all -v ./ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
这个命令的意思是:
--gpus=all
使用所有的 GPU。-v ./ollama:/root/.ollama
把当前目录下的ollama
目录加载到容器的/root/.ollama
,这样可以实现一些文件的共享,比如 Llama3.2-Vision 需要使用的图片。这里说明一下为什么选择
/root/.ollama
,因为这个是 Ollama 模型的存放处,这样如果删除重装 Docker 容器之后,不用重新下载容器。-p 11434:11434
,把容器的端口11434
和系统的端口11434
对应起来。11434
是 Ollama 默认使用的端口号,官方示例也用的这个。--name ollama
是这个容器的名称为ollama
。ollama/ollama
是映像(image)的名称。
使用下面的命令进入容器:
sudo docker exec -it ollama /bin/bash
进入容器后,直接可以使用ollama
,不用再次安装。这里使用 Llama3.1 8B 的:
ollama run llama3.1 --verbose
--verbose
选项可以让你看到生成速度。
然后就会看到下载模型,等一会就进入 Ollama 了:
root@b82bf49334f9:/# ollama run llama3.1 --verbose
pulling manifest
pulling 667b0c1932bc... 100% ▕███████████████████████████████████████████████████████████████▏ 4.9 GB
pulling 948af2743fc7... 100% ▕███████████████████████████████████████████████████████████████▏ 1.5 KB
pulling 0ba8f0e314b4... 100% ▕███████████████████████████████████████████████████████████████▏ 12 KB
pulling 56bb8bd477a5... 100% ▕███████████████████████████████████████████████████████████████▏ 96 B
pulling 455f34728c9b... 100% ▕███████████████████████████████████████████████████████████████▏ 487 B
verifying sha256 digest
writing manifest
success
>>> 你好,请介绍一下你自己
大家好!我是 LLaMA,一个由 Meta 研发的语境理解和生成模型。我的主要功能是理解自然语言并根据上下文生成相关响应或内容。
total duration: 841.833803ms
load duration: 39.937882ms
prompt eval count: 17 token(s)
prompt eval duration: 5ms
prompt eval rate: 3400.00 tokens/s
eval count: 42 token(s)
eval duration: 795ms
eval rate: 52.83 tokens/s
>>> 你可以给我讲个故事吗
当然!这里有一个故事:
有一只小猴子名叫李莫,住在一个美丽的雨林里。他非常好奇,一天到晚都在探索周围的世界。有一天,他迷路了,找不到回家的路。
李莫沿着河流行走,希望能找到熟悉的地方。但是,无论他走多远,都不能见到熟悉的树木和花草。他开始感到害怕和孤独。
就在这时,他遇到了一个聪明的鸟儿。鸟儿问李莫:“你在哪里?你想去哪里?”李莫告诉了鸟儿自己的情况,鸟儿笑着说:“我知道这里的路
,你跟我走就可以找到回家的路。”
李莫和鸟儿一起行走,他们聊天、玩耍,这让小猴子觉得很开心。他慢慢地放下了担忧,感受到鸟儿的帮助和陪伴。
最后,他们来到一个熟悉的地方,小猴子看到家里熟悉的树木和花草,他高兴地冲向家门,鸟儿也跟着他一起欢笑。从那天起,李莫和鸟儿
成为好朋友,他们经常一起探索雨林里的秘密。
这个故事告诉我们,即使在迷路时,我们也可以寻找帮助和陪伴,而不是孤独地面对困难。
total duration: 6.86419438s
load duration: 35.787939ms
prompt eval count: 75 token(s)
prompt eval duration: 9ms
prompt eval rate: 8333.33 tokens/s
eval count: 306 token(s)
eval duration: 5.993s
eval rate: 51.06 tokens/s
在这种情况下不用担心性能损耗,因为 Docker 的实现模式和常规说的虚拟机不太一样,它其实就是基于主机系统的进行的。下面是我跑模型的时候nvidia-smi
显示的的信息(我不记得是跑哪个模型的了),可以看到利用率还是不错的,功耗快满了:
如何在主机系统上和容器内的 Ollama 沟通使用,这个我想放在另一篇博客中。因为我在使用 Llama 3.2-Vision 的时候需要传递图片,这个例子更加全面,就不在这里说了。
再次使用
关机之后,如果想再次使用容器,那么需要换一个命令启动。如果你熟悉 Docker,这点你应该很清楚。不过由于 Ollama 是一个服务,会随开机启动,所以你需要先再次终止进程:
$ ps -A | grep ollama
2060 ? 00:00:18 ollama
$ sudo kill 2060
然后启动前面创建的容器ollama
:
docker start ollama
需要注意不要用docker run
,不然会显示Unable to find image 'ollama:latest' locally
。
希望能帮到有需要的人~
参考资料
How to deploy the llama3 large model in CPU and GPU environments with Ollama - Gen. David L.:我是在这篇文章知道要用容器的。
Ollama is now available as an official Docker image - Ollama:Ollama 官方介绍容器映像的时候,说了 Linux 要使用 GPU 必须用容器,macOS 是反过来的,要用 GPU 必须是独立程序。
https://hub.docker.com/r/ollama/ollama - DockerHub:Ollama Docker 官方映像的界面。
GPU - Ollama GitHub:Ollama 官方文档关于 GPU 的一些描述。
How to troubleshoot issues - Ollama GitHub:Ollama 官方讲述一些问题的解决方案。