当前位置: 首页 > article >正文

【LLM】Ollama:容器化并加载本地 GGUF 模型

本教程将完整演示如何在支持多 GPU 的环境下,通过 Docker 实现 Ollama 的本地化部署,并深度整合本地 GGUF 模型。我们将构建一个具备生产可用性的容器化 LLM 服务,包含完整的存储映射、GPU 加速配置和模型管理方案。


前提与环境准备

  1. 操作系统
    Linux(推荐 Ubuntu 20.04+ / CentOS 7+),已安装 Docker 与 Docker Compose(≥1.27)。
    推荐使用 LTS 版本系统以获得长期内核支持

  2. Docker 验证

    docker --version
    docker compose --version
    

    若未安装,请参考 Docker 官方安装指南 和 Docker Compose 安装文档

  3. NVIDIA Container Toolkit(GPU 加速)

    • 安装指南:官方安装文档

    • 验证 GPU 可见性:

      docker run --gpus all nvidia/cuda:11.0-base nvidia-smi
      

      若输出包含 GPU 信息,则配置成功。常见问题可参考 NVIDIA 容器工具包故障排查

  4. 本地 GGUF 模型目录
    推荐目录结构:

    ~/models/mymodel/
    ├─ model.gguf      # GGUF 格式模型文件(支持 llama.cpp 系列模型)
    └─ Modelfile       # Ollama 模型定义文件
    

    GGUF 模型获取推荐平台:HuggingFace Hub


目录布局

~/
├── models              # 独立模型与 Modelfile 目录(只读挂载)
│   └── mymodel
│       ├── model.gguf  # GGUF 模型文件
│       └── Modelfile   # 使用相对路径的 Modelfile
└── ollama-deploy└── docker-compose.yml  # 部署配置

说明:模型目录设置为只读(ro)可防止容器意外修改模型文件,确保模型完整性


编写 Modelfile

~/models/mymodel/Modelfile 中,使用相对路径 FROM ./models(容器内部 /models 挂载点):

# 显式指定模型文件路径(相对于当前 Modelfile 所在目录)
# Modelfile 的参数语法类似 KEY VALUE,不能在同一行写注释FROM ./model.gguf# 模型元数据模板
TEMPLATE """[INST] {{ .System }} {{ .Prompt }} [/INST]"""# 推理参数配置# 控制生成随机性(值范围:0.0 - 1.0,越小越确定)
PARAMETER temperature 0.7# 核采样阈值(建议 0.7 - 0.95)
PARAMETER top_p 0.9# 上下文长度(需与模型训练参数一致)
PARAMETER num_ctx 4096

参数详解

  • temperature:值越大生成越随机,值小则更确定(技术文档推荐 0.2-0.8)
  • top_p:动态词表裁剪,与 temperature 配合使用效果更佳
  • 更多参数参考:Ollama Modelfile 官方文档

编写 docker-compose.yml

~/ollama-deploy/docker-compose.yml 配置:

services:ollama:image: ollama/ollama:latestcontainer_name: ollamacommand: serve  # 启动服务模式ports:- "11434:11434"  # API 端口restart: unless-stoppedvolumes:# ✅ 请根据实际 home 目录修改为绝对路径(例如 /home/touken)- /home/username/models:/models:ro        # 只读挂载模型目录(包含 Modelfile)- /home/username/.ollama:/root/.ollama    # 持久化模型缓存及配置deploy:  # 多 GPU 分配配置resources:reservations:devices:- driver: nvidiacount: all  # 使用全部可用 GPUcapabilities: [gpu]

配置解析

  • command: serve:启动服务模式而非 CLI 交互模式
  • ~/.ollama 目录存储模型运行时数据(建议 SSD 存储以获得更好性能)
  • GPU 分配策略可参考 Docker GPU 管理文档

启动 Ollama 服务

cd ~/ollama-deploy
docker compose up -d  # 后台启动服务

状态检查

docker logs ollama  # 查看实时日志
lsof -i :11434      # 验证端口监听状态

注册并加载模型

# 创建模型实例(名称自定义)
docker exec ollama ollama create mymodel -f /models/mymodel/Modelfile# 查看已注册模型
docker exec ollama ollama list

常见错误处理:若提示模型路径错误,请检查容器内路径是否匹配 /models/mymodel/Modelfile


验证与测试

# 基础 API 测试
curl http://localhost:11434/api/generate \-X POST -H "Content-Type: application/json" \-d '{"model": "mymodel","prompt": "Hello, Ollama! How are you?","stream": false}'# 使用 ollama-python 客户端测试(需额外安装)
from ollama import Client
client = Client(host='http://localhost:11434')
print(client.generate(model='mymodel', prompt='AI 的未来是什么?'))

推荐工具:ollama-python 客户端库


性能优化建议

  1. GPU 资源分配

    deploy:resources:reservations:devices:- driver: nvidiadevice_ids: ['0', '1']  # 指定 GPU 设备号capabilities: [gpu]
    
  2. 量化策略

    • 优先选择 Q4_K_M 或 Q5_K_S 量化版本(量化等级说明)
    • 使用 llama.cpp 进行自定义量化
  3. 显存管理

    # Modelfile 添加
    PARAMETER num_gpu 2          # 指定 GPU 数量
    PARAMETER main_gpu 0         # 主 GPU 设备号
    

总结

本文通过以下关键技术点实现生产级部署:

  1. 目录隔离设计:模型与配置的只读挂载确保系统可靠性
  2. GPU 动态分配:支持多卡推理和显存优化
  3. 服务化部署:通过 Docker Compose 实现一键启停

相关文章:

【LLM】Ollama:容器化并加载本地 GGUF 模型

本教程将完整演示如何在支持多 GPU 的环境下,通过 Docker 实现 Ollama 的本地化部署,并深度整合本地 GGUF 模型。我们将构建一个具备生产可用性的容器化 LLM 服务,包含完整的存储映射、GPU 加速配置和模型管理方案。 前提与环境准备 操作系统…...

实践项目开发-hbmV4V20250407-Taro项目构建优化

Taro项目构建优化实践:大幅提升开发效率 项目背景 在开发基于ReactTaro的前端项目时,随着项目规模的增长,构建速度逐渐成为开发效率的瓶颈。通过一系列构建优化措施,成功将开发环境的构建速度提升了30%-50%,显著改善…...

MySQL中根据binlog日志进行恢复

MySQL中根据binlog日志进行恢复 排查 MySQL 的 binlog 日志问题及根据 binlog 日志进行恢复的方法一、引言二、排查 MySQL 的 binlog 日志问题(一)确认 binlog 是否开启(二)查找 binlog 文件位置和文件名模式(三&#…...

Jenkins的地位和作用

所处位置 Jenkins 是一款开源的自动化服务器,广泛应用于软件开发和测试流程中,主要用于实现持续集成(CI)和持续部署(CD)。它在开发和测试中的位置和作用可以从以下几个方面来理解: 1. 在开发和测…...

【集合】底层原理实现及各集合之间的区别

文章目录 集合2.1 介绍一下集合2.2 集合遍历的方法2.3 线程安全的集合2.4 数组和集合的区别2.5 ArrayList和LinkedList的区别2.6 ArrayList底层原理2.7 LinkedList底层原理2.8 CopyOnWriteArrayList底层原理2.9 HashSet底层原理2.10 HashMap底层原理2.11 HashTable底层原理2.12…...

软考高级-系统架构设计师 论文范文参考(二)

文章目录 论企业应用集成论软件三层结构的设计论软件设计模式的应用论软件维护及软件可维护性论信息系统安全性设计论信息系统的安全性设计(二)论信息系统的架构设计论信息系统架构设计(二) 论企业应用集成 摘要: 2016年9月,我国某省移动通信有限公司决定启动VerisB…...

srp batch

参考网址: Unity MaterialPropertyBlock 正确用法(解决无法合批等问题)_unity_define_instanced_prop的变量无法srp合批-CSDN博客 URP | 基础CG和HLSL区别 - 哔哩哔哩 (bilibili.com) 【直播回放】Unity 批处理/GPU Instancing/SRP Batche…...

【Linux运维涉及的基础命令与排查方法大全】

文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议,Linux中常用命令,以及平时运维中使用的排查网络故障的…...

【2025最新Java八股】redis中io多路复用怎么回事,和多线程的关系

io多路复用 IO 多路复用和多线程是两种不同的技术,他们都是用于改善程序在处理多个任务或多个数据流时的效率和性能的。 但是他俩要解决的问题不一样!IO多路复用主要是提升I/O操作的效率和利用率,所以适合 IO 密集型应用。多线程则是提升CP…...

Webview+Python:用HTML打造跨平台桌面应用的创新方案

目录 一、技术原理与优势分析 1.1 架构原理 1.2 核心优势 二、开发环境搭建 2.1 安装依赖 2.2 验证安装 三、核心功能开发 3.1 基础窗口管理 3.2 HTML↔Python通信 JavaScript调用Python Python调用JavaScript 四、高级功能实现 4.1 系统级集成 4.2 多窗口管理 五…...

Nginx HTTP 414 与“大面积”式洪水攻击联合防御实战

一、引言 在大规模分布式应用中,Nginx 常作为前端负载均衡和反向代理服务器。攻击者若结合超长 URI/头部攻击(触发 HTTP 414)与海量洪水攻击,可在网络层与应用层形成双重打击:一方面耗尽缓冲区和内存,另一…...

Oracle高级语法篇-集合操作

Oracle 集合操作详解 作为数据库领域的佼佼者,Oracle 提供了功能强大的集合操作符,它们能够合并多个查询的结果集,极大提升数据处理效率。接下来,本文将从基础知识点到实战案例,全方位剖析 Oracle 的集合操作。 一、…...

克服储能领域的数据处理瓶颈及AI拓展

对于储能研究人员来说,日常工作中经常围绕着一项核心但有时令人沮丧的任务:处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格,研究人员的大量时间都花在了提取有意义的见解上。长期以来,该领域一直受到对专…...

包含物体obj与相机camera的 代数几何代码解释

反余弦函数的值域在 [0, pi] 斜体样式 cam_pose self._cameras[hand_realsense].camera.get_model_matrix() # cam2world# 物体到相机的向量 obj_tcp_vec cam_pose[:3, 3] - self.obj_pose.p dist np.linalg.norm(obj_tcp_vec) # 物体位姿的旋转矩阵 obj_rot_mat self.ob…...

excel解析图片pdf附件不怕

背景 工作中肯定会有导入excel还附带图片附件的下面是我解析的excel,支持图片、pdf、压缩文件实现 依次去解析excel,看看也没有附件,返回的格式是Map,key是第几行,value是附件list附件格式都被解析成pdf格式Reader.jav…...

【Spring】依赖注入的方式:构造方法、setter注入、字段注入

在Spring框架中,除了构造器注入(Constructor Injection)和Setter注入(Setter Injection),还有一种依赖注入方式:字段注入(Field Injection)。字段注入通过在Bean的字段上…...

mybatis实现增删改查1

文章目录 19.MyBatis查询单行数据MapperScan 结果映射配置核心文件Results自定义映射到实体的关系 多行数据查询-完整过程插入数据配置mybatis 控制台日志 更新数据删除数据小结通过id复用结果映射模板xml处理结果映射 19.MyBatis 数据库访问 MyBatis,MyBatis-Plus…...

Git,本地上传项目到github

一、Git的安装和下载 https://git-scm.com/ 进入官网,选择合适的版本下载 二、Github仓库创建 点击右上角New新建一个即可 三、本地项目上传 1、进入 要上传的项目目录,右键,选择Git Bash Here,进入终端Git 2、初始化临时仓库…...

基于flask+vue框架的灯饰安装维修系统u49cf(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,工单人员,服务项目,订单记录,服务记录,评价记录 开题报告内容 基于 FlaskVue 框架的灯饰安装维修系统开题报告 一、选题背景与意义 (一)选题背景 随着城市化进程的加速与居民生活品质的显著提升&#xf…...

【算法】BFS-解决FloodFill问题

目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思,假设有下面的一块田地,负数代表是凹地,正数代表是凸地,数字的大小表示凹或者凸的程度。现在下一场大雨&…...

GIS开发笔记(10)基于osgearth实现二三维地图的一键指北功能

一、实现效果 二、实现原理 获取视图及地图操作器,通过地图操作器来重新设置视点,以俯仰角 (0.0)和偏航角 (-90.0)来设置。 osgEarth::Util::Viewpoint(…) 这里创建了一个新的 Viewpoint 对象,表示一个特定的视角。构造函数的参数是: 第一个参数:是视角名称。 后面的 6 个…...

Spring Boot日志系统详解:Logback与SLF4J的默认集成

大家好呀!👋 今天我们来聊聊Spring Boot中一个超级重要但又经常被忽视的功能——日志系统! 一、日志系统的重要性 首先,咱们得明白为什么日志这么重要?🤷‍♂️ 想象一下,你正在玩一个超级复…...

【C++】Json-Rpc框架项目介绍(1)

项目介绍 RPC(Remote Procedure Call)即远程过程调用,是一种通过网络从远程计算机程序中请求服务而不需要了解底层网络实现细节的一种 协议 。 RPC(Remote Procedure Call)可以使用多种网络协议进行通信,如…...

Docker 部署 PostgreSQL 数据库

Docker 部署 PostgreSQL 数据库 基于 Docker 部署 PostgreSQL 数据库一、拉取 PostgreSQL 镜像二、运行 PostgreSQL 容器三、运行命令参数详解四、查看容器运行状态 基于 Docker 部署 PostgreSQL 数据库 一、拉取 PostgreSQL 镜像 首先,确保你的 Docker 环境已正确…...

用 Go 优雅地清理 HTML 并抵御 XSS——Bluemonday

1、背景与动机 只要你的服务接收并回显用户生成内容(UGC)——论坛帖子、评论、富文本邮件正文、Markdown 等——就必须考虑 XSS(Cross‑Site Scripting)攻击风险。浏览器在解析 HTML 时会执行脚本;如果不做清理&#…...

Python爬虫从入门到实战详细版教程

Python爬虫从入门到实战详细版教程 文章目录 Python爬虫从入门到实战详细版教程书籍大纲与内容概览第一部分:爬虫基础与核心技术1. 第1章:[爬虫概述](https://blog.csdn.net/qq_37360300/article/details/147431708?spm=1001.2014.3001.5501)2. 第2章:HTTP协议与Requests库…...

window上 elasticsearch v9.0 与 jmeter5.6.3版本 冲突,造成es 启动失败

[2025-04-22T11:00:22,508][ERROR][o.e.b.Elasticsearch ] [AIRUY] fatal exception while booting Elasticsearchjava.nio.file.NoSuchFileException: D:\Program Files\apache-jmeter-5.6.3\lib\logkit-2.0.jar 解决方案: 降低 es安装版本 ,选择…...

【C++初阶】第15课—模版进阶

文章目录 1. 模版参数2. 模版的特化2.1 概念2.2 函数模版特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化 3. 模版的分离和编译4. 总结 1. 模版参数 模版参数分为类型形参和非类型参数之前我们写过的大量代码,都是用模版定义类的参数类型,跟在class和typena…...

黑阈免激活版:智能管理后台,优化手机性能

在使用安卓手机的过程中,许多用户会遇到手机卡顿、电池续航不足等问题。这些问题通常是由于后台运行的应用程序过多,占用大量系统资源导致的。今天,我们要介绍的 黑阈免激活版,就是这样一款由南京简域网络科技工作室开发的手机辅助…...

C++17 新特性简解

C17 新特性简解 一、核心语言特性 1. 结构化绑定&#xff08;Structured Bindings&#xff09; 用途&#xff1a;解构复合类型&#xff08;如元组、结构体&#xff09;为独立变量 示例&#xff1a; #include <iostream> #include <tuple>int main() {// 解构 st…...