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

news2025/4/24 5:30:09

本教程将完整演示如何在支持多 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:latest
    container_name: ollama
    command: serve  # 启动服务模式
    ports:
      - "11434:11434"  # API 端口
    restart: unless-stopped

    volumes:
      # ✅ 请根据实际 home 目录修改为绝对路径(例如 /home/touken)
      - /home/username/models:/models:ro        # 只读挂载模型目录(包含 Modelfile)
      - /home/username/.ollama:/root/.ollama    # 持久化模型缓存及配置

    deploy:  # 多 GPU 分配配置
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all  # 使用全部可用 GPU
              capabilities: [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: nvidia
              device_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 实现一键启停

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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…

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中常用命令,以及平时运维中使用的排查网络故障的…

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 多窗口管理 五…

克服储能领域的数据处理瓶颈及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…

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 个…

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…

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

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

Mujoco robosuite 机器人模型

import ctypes import os# 获取当前脚本所在的目录 script_dir os.path.dirname(os.path.abspath(__file__))# 构建库文件的相对路径 lib_relative_path os.path.join(dynamic_models, UR5e, Jb.so)# 拼接成完整的路径 lib_path os.path.join(script_dir, lib_relative_path…

K8s:概念、特点、核心组件与简单应用

一、引言 在当今云计算和容器技术蓬勃发展的时代,Kubernetes(简称 K8s)已成为容器编排领域的事实标准。它为管理容器化应用提供了高效、可靠的解决方案,极大地简化了应用的部署、扩展和运维过程。无论是小型初创公司还是大型企业…

STM32的定时器输出PWM时,死区时间(DTR)如何计算

在 STM32F429(以及所有 STM32F4 “高级定时器”)中,死区时间由 TIMx_BDTR 寄存器的 8 位 “Dead‑Time Generator” 字段 DTG[7:0] 来配置。其计算分三步: 计算死区时钟周期 tDTS TIM1 时钟源为 APB2 定时器时钟(PCL…

STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统

STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统 NorFlash简介NorFlash操作驱动代码文件系统测试代码 NorFlash简介 NOR Flash是一种类型的非易失性存储器,它允许在不移除电源的情况下保留数据。NOR Flash的名字来源于其内部结构中使用的NOR逻辑门。…

ClickHouse 设计与细节

1. 引言 ClickHouse 是一款备受欢迎的开源列式在线分析处理 (OLAP) 数据库管理系统,专为在海量数据集上实现高性能实时分析而设计,并具备极高的数据摄取速率 1。其在各种行业中得到了广泛应用,包括众多知名企业,例如超过半数的财…