在Linux上如何让ollama在GPU上运行模型

之前一直在 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 官方讲述一些问题的解决方案。

### Linux环境下Ollama服务端口11434被占用解决方案 当尝试启动Ollama并发现端口11434已经被占用时,可以按照以下方式解决问题。 #### 修改Ollama的服务配置文件 如果确认是由于Ollama本身的原因导致端口不可访问,则可能是其配置文件存在问题。可以通过编辑`ollama.service`来调整设置: ```bash sudo vi /etc/systemd/system/ollama.service ``` 在此文件中查找有关监听地址和端口号的部分,并确保这些参数正确无误[^1]。 #### 查找实际占用该端口的进程 为了进一步诊断问题所在,建议先找出哪个程序正在使用这个特定端口。这一步骤有助于判断是否真的是由其他应用程序意外占据了目标端口而不是Ollama自身的错误引起的问题: ```bash sudo lsof -i :11434 ``` 上述命令会返回一系列信息,其中包含了PID(Process ID),即进程编号。如果有任何非预期的应用正占用着此端口,可以根据得到的结果采取相应措施终止它们的操作或更改其使用的端口。 #### 调整应用所用端口 假设确实存在冲突情况,那么可以选择让其中一个受影响较小的服务改变默认连接位置。对于Ollama而言,在修改后的`.service`文件里指定新的可用端口即可实现这一点;而对于第三方软件来说,则需查阅官方文档了解如何重新设定网络接口绑定选项。 #### 验证防火墙规则 考虑到安全策略的影响也可能造成看似“端口已占”的现象,因此还需要验证当前系统的防火墙状态以及针对HTTP(S)流量的相关规定。例如利用UFW(Uncomplicated Firewall),可通过下面这条指令查看现有规则集: ```bash sudo ufw status verbose ``` 假如发现有阻止外部请求到达所需端口的安全政策,记得适当放宽限制条件以允许合法通信发生。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值