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

之前一直在 Mac 上使用 ollama 所以没注意,最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了,因为 Mac 上如果超内存的话,那么就只用 CPU,但是我发现 Llama3.2 3B 只占用 3GB,这远没有超。看了一下命令没发现有相关的选项。所以我查了一下。

运气很好,找到了一篇博客写了可以强制在 GPU 上的方法:用容器跑。我找了一下,官方确实说过 Linux 上要用容器(见下图)。需要注意 macOS刚好是反过来,容器里不支持 GPU。

请添加图片描述

准备工作

这里使用容器的时候,你不光要安装 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 ollama1321 ?        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 ollama2060 ?        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 官方映像的界面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3478.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法(蓝桥杯)贪心算法7——过河的最短时间问题解析

一、题目描述 在漆黑的夜里,N位旅行者来到了一座狭窄且没有护栏的桥边。他们只带了一只手电筒,且桥窄得只够让两个人同时过。如果各自单独过桥,N人所需的时间已知;若两人同时过桥,则所需时间是走得较慢的那个人单独行动…

LDD3学习7--硬件接口I/O端口(以short为例)

1 理论 1.1 基本概念 目前对外设的操作,都是通过寄存器。寄存器的概念,其实就是接口,访问硬件接口,有I/O端口通信和内存映射I/O (Memory-Mapped I/O),I/O端口通信是比较老的那种,都是老的串口并口设备&am…

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一:使用 float 普通盒子实现横向布局 方法二:使用 display: inline-block 内联块级元素实现横向布局 方法三:使用弹性盒子 flexbox&#xff0…

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成(F1) FLASH读写过程(F1) 闪存的读取 闪存的写入 内部FLASH构成(F4 / F7 / H7) FLASH读写过程(F4 / F7 / H7) 闪存的读取 闪存的写入 …

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145188660 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…

【数据库】MySQL数据库SQL语句汇总

目录 1.SQL 通用语法 2.SQL 分类 2.1.DDL 2.2.DML 2.3.DQL 2.4.DCL 3.DDL 3.1.数据库操作 3.1.1.查询 3.1.2.创建 3.1.3.删除 3.1.4.使用 3.2.表操作 3.2.1.查询 3.2.2.创建 3.2.3.数据类型 3.2.3.1.数值类型 3.2.3.2.字符串类型 3.2.3.3.日期时间类型 3.2…

JavaEE之CAS

上文我们认识了许许多多的锁,此篇我们的CAS就是从上文的锁策略开展的新概念,我们来一探究竟吧 1. 什么是CAS? CAS: 全称Compare and swap,字⾯意思:“比较并交换”,⼀个CAS涉及到以下操作: 我们假设内存中…

【Go】Go数据类型详解—指针

1. 前言 在我看来,一门编程语言语法的核心就在于数据类型。而各类编程语言的基本数据类型大致相同:int整型、float浮点型、string字符串类型、bool布尔类型,但是在一些进阶数据类型上就有所不同了。本文将会介绍Go语言当中核心的数据类型——…

前端性能-HTTP缓存

前言 开启 HTTP 缓存是提升前端性能的常见手段之一。通过缓存,浏览器可以临时存储资源,在后续请求中直接使用本地副本,从而有效减少 HTTP 请求次数,显著缩短网页加载时间。以下是 HTTP 缓存的几个关键点: 1、减少重复…

2024CVPR《HomoFormer》

这篇论文提出了一种名为HomoFormer的新型Transformer模型,用于图像阴影去除。论文的主要贡献和创新点如下: 1. 研究背景与动机 阴影去除的挑战:阴影在自然场景图像中普遍存在,影响图像质量并限制后续计算机视觉任务的性能。阴影的空间分布不均匀且模式多样,导致传统的卷积…

arcgis提取不规则栅格数据的矢量边界

效果 1、准备数据 栅格数据:dem或者dsm 2、栅格重分类 分成两类即可 3、新建线面图层 在目录下选择预先准备好的文件夹,点击右键,选择“新建”→“Shapefile”,新建一个Shapefile文件。 在弹出的“新建Shapefile”对话框内“名称”命名为“折线”,“要素类型”选…

函数(函数的概念、库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、函数的声明和定义、static和extern)

一、函数的概念 •C语⾔中的函数:⼀个完成某项特定的任务的⼀⼩段代码 •函数又被翻译为子函数(更准确) •在C语⾔中我们⼀般会⻅到两类函数:库函数 ⾃定义函数 二、库函数 1 .标准库和头文件 •C语⾔的国际标准ANSIC规定了⼀…

Docker私有仓库管理工具Registry

Docker私有仓库管理工具Registry 1 介绍 Registry是私有Docker仓库管理工具,Registry没有可视化管理页面和完备的管理策略。可借助Harbor、docker-registry-browser完成可视化和管理。Harbor是由VMware开发的企业级Docker registry服务。docker-registry-browser是…

Adobe与MIT推出自回归实时视频生成技术CausVid。AI可以边生成视频边实时播放!

传统的双向扩散模型(顶部)可提供高质量的输出,但存在显著的延迟,需要 219 秒才能生成 128 帧的视频。用户必须等待整个序列完成才能查看任何结果。相比之下CausVid将双向扩散模型提炼为几步自回归生成器(底部&#xff…

MySQL(高级特性篇) 06 章——索引的数据结构

一、为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查看查询条件…

turtle教学课程课堂学习考试在线网站

完整源码项目包获取→点击文章末尾名片!

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令: playwright codegen…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一,它的作用是为电脑的各个部件提供冷却,防止电脑过热。然而,有时候我们会发现电脑风扇的声音特别大,不仅影响我们的使用体验,也可能是电脑出现了一些问题。那么,电脑风扇声音大…

python如何解析word文件格式(.docx)

python如何解析word文件格式(.docx) .docx文件遵从开源的“Office Open XML标准”,这意味着我们能用python的文本操作对它进行操作(实际上PPT和Excel也是)。而且这并不是重复造轮子,因为市面上操作.docx的…

PHP智慧小区物业管理小程序

🌟智慧小区物业管理小程序:重塑社区生活,开启便捷高效新篇章 🌟 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序,它犹如一股清新的科技之风,吹进了现代智慧小区的每一个角落…