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

Ollama的底层实现原理分析

一、背景

        Ollama我们可以很方便的对DeepSeek等开源大模型进行部署,几条命令便能部署一个本地大模型服务,降低了非专业大模型开发者的门槛。

        我们从中可以看到类似Docker的影子,ollama run 、ollama list等等,拉取对应大模型镜像,通过镜像运行"大模型容器",并且还提供管理这些"大模型容器"的API接口,方便我们进行大模型对话、停止容器、运行容器、重启容器等等。

        那我们来看下Ollama到底是怎么将大模型运行起来的?是底层使用Docker做了一层嵌套包装呢? Ollama的大模型镜像怎么制作? Modelfile和Dockerfile相似之处等神秘面纱

二、分析过程

1、Ollama是开源项目

        首先我们知道Ollama是开源项目,项目地址在github进行开源:

        开源地址: https://github.com/ollama/ollama

        开源意味着代码都是公之于众的,那么"神秘面纱"自然也不是过于神秘,我们可以通过源代码去分析整个实现原理

2、项目使用Go语言实现

        进入Ollama的开源仓库,我们发现,原来Ollama这个项目整体是使用Go语言进行开发实现的。docker、k8s这些云原生的组件,很多都使用Go进行开发, 因为其易并发编程、资源低消耗、轻量级、跨平台性好,深受广大开发者喜爱。 Ollama自然选中了Go

3、llama.cpp项目

        我们假设,没有使用Ollama运行大模型。那么直接原生运行大模型,该怎么办?  这就不得不提到llama.cpp这个项目.

        项目地址: https://github.com/ggml-org/llama.cpp

        lama.cpp 项目主要解决了在本地设备(尤其是资源受限的设备)上高效运行 Llama 模型的问题,具体体现在以下几个方面:

  1. 设备端推理:Llama 是 Meta 公司开发的大型语言模型,原始的 Llama 模型运行需要强大的计算资源,如 GPU 集群等。而 llama.cpp 项目通过优化代码实现,使得 Llama 模型可以在普通的 CPU 设备上(如个人电脑、移动设备等)运行。这对于那些无法访问大规模计算资源的用户或场景(如没有 GPU 支持的个人电脑、边缘设备等)非常有帮助,使得用户可以在本地设备上进行模型推理,而不需要依赖云端服务,增强了模型使用的灵活性和隐私性。
  2. 降低计算资源需求:该项目对 Llama 模型的计算过程进行了优化,减少了内存占用和计算量。通过采用量化技术(如将模型参数从高精度数据类型转换为低精度数据类型),在一定程度上牺牲模型的精度来换取计算资源的大幅降低,从而能够在资源有限的设备上顺利运行模型。例如,在一些内存较小的设备上,也能够加载和运行 Llama 模型的较小版本。
  3. 促进模型的研究和应用:llama.cpp 使得更多的研究人员和开发者能够在本地方便地对 Llama 模型进行研究、实验和应用开发。它为自然语言处理领域的研究提供了一个更易于访问和使用的平台,加速了相关研究的进展。同时,也为一些基于 Llama 模型的应用开发提供了可能,如本地的文本生成工具、智能助手等,促进了语言模型在不同领域的应用和创新。
  4. 提升模型的可定制性:由于是在本地运行,开发者可以根据自己的需求对模型进行定制和修改,如调整模型的参数、添加特定的功能模块等。这种可定制性使得 llama.cpp 能够更好地满足不同用户和应用场景的需求,而不像使用云端服务那样受到一定的限制。

        llama.cpp可以友好的对GGUF大模型文件格式进行运行,只需要提供GGUF文件,一条命令就能将这个模型运行起来。  同时llama.cpp提供了c++的SDK库,c++可以通过llama.cpp的API就能操作大模型。

4、llama.cpp运行大模型过程

1、Hugging Face下载对应大模型的GGUF文件

国内镜像地址: https://hf-mirror.com/

https://hf-mirror.com/unsloth/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/tree/main

我下载了一个DeepSeek最小模型1.5b做本地测试

2、docker运行llama.cpp容器,进入容器启动大模型

docker-compose.yml文件:

version: "3"
services:llama:image: yusiwen/llama.cppvolumes:- ./models/:/models/entrypoint: ["tail", "-f", "/dev/null"]

modes目录存放模型文件: DeepSeek-R1-Distill-Qwen-1.5B-Q2_K.gguf

docker-compose up -d   #运行容器#进入容器执行, 就可以进行模型对话
docker-compose exec llama bash./llama-cli  -m /models/DeepSeek-R1-Distill-Qwen-1.5B-Q2_K.gguf

 5、Ollama和llama的关系

        Ollama 在 llama.cpp 的基础上进行了更高层次的封装和功能拓展,以下是具体说明:

  • llama.cpp 是基础:llama.cpp 是一个用 C/C++ 实现的推理框架,用于加载和运行 LLaMA 等大型语言模型13。它为在各种硬件平台上高效运行大模型提供了底层支持,实现了量化等功能以降低模型运行对资源的需求,让 LLaMA 模型能在如个人电脑 CPU 甚至手机、树莓派等设备上运行3。比如在谷歌 Pixel5 手机上能以 1token/s 的速度运行 7B 参数模型,在 M2 芯片的 Macbook Pro 上使用 7B 参数模型的速度约为 16token/s3。
  • Ollama 基于 llama.cpp 拓展:Ollama 利用了 llama.cpp 提供的底层能力,如量化等。但它不是对 llama.cpp 的简单复用,而是在此基础上进行了功能的拓展和封装,提供了更友好的用户界面和更便捷的操作方式13。比如,用户使用 llama.cpp 时,需要获取模型权重、克隆项目代码、执行模型量化等一系列复杂操作,而 Ollama 简化了这些流程,通过简单的安装指令和命令,就能让用户在本地快速运行开源大型语言模型。此外,Ollama 还提供了类似 OpenAI 的 API 接口和聊天界面,方便用户使用不同模型,并且具备模型库管理系统1。

        通过Ollama的源代码我们发现,其实创建运行大模型,Ollama使用Go语言CGO调用了llama.cpp的C++库,从而实现运行大模型. 

        可以看到代码CGO的影子.     

        所以底层运行的机制是靠llama.cpp作为底层运行大模型的支撑.

6、Docker的理念加持

        Ollama参考了Docker的理念,将大模型文件和所需配置信息等也进行了封装为镜像的概念,镜像便于分发,同时降低了开发者运行的门槛,只需要拉取对应大模型镜像,使用ollama run一键就能启动大模型服务。

        Ollama的镜像文件本质就是一个特殊的压缩包,压缩包里包含了GGUF大模型文件、一些配置参数文件.  构建自己的Ollama镜像使用Modelfile的方式进行构建,整个语法有点参照Dockerfile.以下是构建一个自定义Model镜像的Modelfile:

# 基础模型
FROM deepseek:1.5b# 自定义模型的名称和描述
NAME my_custom_deepseek
DESCRIPTION "A custom model based on deepseek:1.5b with custom data"# 自定义数据的路径,这里假设自定义数据文件在当前目录下
PARAMETER file "./custom_data.txt"# 可以根据需要调整的其他参数
PARAMETER num_train_epochs 3
PARAMETER learning_rate 2e-5
PARAMETER per_device_train_batch_size 4
  1. FROM 指令:指定基础模型,这里使用 deepseek:1.5b 作为基础,后续的微调操作将基于这个模型进行。
  2. NAME 指令:为自定义模型指定一个名称,这里命名为 my_custom_deepseek,方便后续引用和管理。
  3. DESCRIPTION 指令:对自定义模型进行简要描述,说明该模型是基于 deepseek:1.5b 并加入了自定义数据。
  4. PARAMETER 指令
    • file:指定自定义数据文件的路径,你需要将实际的自定义数据文件路径替换为 ./custom_data.txt
    • num_train_epochs:指定训练的轮数,这里设置为 3 轮,你可以根据实际情况调整。
    • learning_rate:学习率,控制模型在训练过程中参数更新的步长,这里设置为 2e-5,也是一个常见的取值,可根据效果调整。
    • per_device_train_batch_size:每个设备(如 GPU)上的训练批次大小,这里设置为 4,你可以根据设备的内存情况进行调整

构建build Model镜像命令:

ollama create my_custom_deepseek -f Modelfile

运行镜像:

ollama run my_custom_deepseek

        Ollama只是参考借鉴了Docker的思想,但是底层并没有关于容器的相关使用。 

7、透过现象看本质

        1、Ollama的本质就是,使用Go作为编程语言,构建HTTP服务提供API接口对内部的Ollama镜像、Ollama运行"大模型容器"进行管理, 内部使用CGO调用llama.cpp的能力来运行大模型. 降低了我们从零开始部署大模型的门槛。 底层运行还是依赖llama.cpp,只是应用层使用Go包了一层,让我们更方便、快捷的管理和运行大模型.

        2、Ollama上面提供的镜像,要么是大模型的维护者,要么是一些开发者、官方维护者,首先去对应官网渠道、Hugging Face获取GGUF文件或者其他大模型格式文件, 通过编写Modelfile的构建镜像,最后在Ollama进行发布。 用户拉取镜像进行运行即可。

三、总结

        知其然也要知其所以然, Ollama第一次使用我就很疑惑是不是底层套了一层docker容器化技术,然后再结合大模型做的包装。 后来经过分析,确实和容器没太大关系,就是思想做了一些借鉴。

        并且从分析过程中知道了,GGUF大模型文件的运行依靠的是llama.cpp底层进行支撑运行,那就意味着性能其实不差,毕竟是c++底层来支撑的,之前以为是使用python sdk之类的来运行的。

相关文章:

Ollama的底层实现原理分析

一、背景 Ollama我们可以很方便的对DeepSeek等开源大模型进行部署,几条命令便能部署一个本地大模型服务,降低了非专业大模型开发者的门槛。 我们从中可以看到类似Docker的影子,ollama run 、ollama list等等,拉取对应大模型镜像&a…...

nginx 动态计算拦截非法访问ip

需求:在Nginx上实现一个动态拦截IP的方法,具体是当某个IP在1分钟内访问超过60次时,将其加入Redis并拦截,拦截时间默认1天。 技术选型:使用NginxLuaRedis的方法。这种方案通过Lua脚本在Nginx处理请求时检查Redis中的黑…...

商业秘密维权有哪些成本开支?

企业商业秘密百问百答之六十三:商业秘密维权费用项目有哪些? 在商业秘密维权过程中,原告可能需要支付多种费用,一般费用项目包括: 1、诉讼费。诉讼费是向法院支付的费用,包括起诉费、案件受理费等。这些费…...

使用UA-SPEECH和TORGO数据库验证自动构音障碍语音分类方法

使用UA-SPEECH和TORGO数据库验证自动构音障碍语音分类方法 引言 原文:On using the UA-Speech and TORGO databases to validate automatic dysarthric speech classification approaches 构音障碍简介 构音障碍是一种由于脑损伤或神经疾病(如脑瘫、肌萎缩侧索硬化症、帕金森…...

WebSocketHandler 是 Spring Framework 中用于处理 WebSocket 通信的接口

WebSocketHandler 是 Spring Framework 中用于处理 WebSocket 通信的接口,其主要作用是定义了如何处理 WebSocket 的各种事件和消息。以下是 WebSocketHandler 的主要作用和功能: ### 1. 处理 WebSocket 生命周期事件 WebSocketHandler 定义了多个方法来…...

Pikachu

一、网站搭建 同样的,先下载安装好phpstudy 然后启动Apache和Mysql 然后下载pikachu,解压到phpstudy文件夹下的www文件 然后用vscode打开pikachu中www文件夹下inc中的config.inc.php 将账户和密码改为和phpstudy中的一致(默认都是root&…...

如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程

如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程 在软件开发过程中,持续集成(CI)和持续交付(CD)已经成为现代开发和运维的标准实践。随着代码的迭代越来越频繁,传统的手动部署方式不仅低效,而且容易出错。为了提高开发效率和代码质量,Jenkins作为一款…...

Vue.js 学习笔记

文章目录 前言一、Vue.js 基础概念1.1 Vue.js 简介1.2 Vue.js 的特点1.3 Vue.js 基础示例 二、Vue.js 常用指令2.1 双向数据绑定(v-model)2.2 条件渲染(v-if 和 v-show)2.3 列表渲染(v-for)2.4 事件处理&am…...

数据存储:一文掌握RabbitMQ的详细使用

文章目录 一、RabbitMQ简介二、RabbitMQ的概述2.1 基本概念2.2 实际应用场景三、RabbitMQ的安装与配置3.1 安装RabbitMQ3.2 启用管理插件四、使用Python操作RabbitMQ4.1 安装Pika库4.2 生产者示例4.3 消费者示例4.4 发布/订阅模式示例五、RabbitMQ的高级特性5.1 消息持久化5.2 …...

辛格迪客户案例 | 祐儿医药科技GMP培训管理(TMS)项目

01 项目背景:顺应行业趋势,弥补管理短板 随着医药科技行业的快速发展,相关法规和标准不断更新,对企业的质量管理和人员培训提出了更高要求。祐儿医药科技有限公司(以下简称“祐儿医药”)作为一家专注于创新…...

FreeRtos实时系统: 十六.tickless低功耗模式

FreeRtos实时系统: 十六.tickless低功耗模式 一.tickless低功耗模式简介二.tickless模式详解三.tickless模式相关配置项四.tickless低功耗模式实验五.课堂总结 一.tickless低功耗模式简介 STM32低功耗模式: 二.tickless模式详解 为了可以降低功耗,又不…...

CSDN博客:Markdown编辑语法教程总结教程(上)

❤个人主页:折枝寄北的博客 Markdown编辑语法教程总结 前言1. CSDN Markdown编辑器功能简介1.1 基础操作界面1.2 创作助手和语法说明 2. Markdown编辑器语法2.1 目录2.2 标题2.2.1 标题级别设置2.2.2 标题居中 3. 文本样式3.1 强调文本(斜体&#xff09…...

多个pdf合并成一个pdf的方法

将多个PDF文件合并优点: 能更容易地对其进行归档和备份.打印时可以选择双面打印,减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf,双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …...

Spark基础篇 RDD、DataFrame与DataSet的关系、适用场景与演进趋势

一、核心概念与演进背景 1.1 RDD(弹性分布式数据集) 定义:RDD 是 Spark 最早的核心抽象(1.0版本引入),代表不可变、分区的分布式对象集合,支持函数式编程和容错机制。特点: 无结构化信息:仅存储对象本身,无法自动感知数据内部结构(如字段名、类型)。编译时类型安全…...

odoo初始化数据库

在 Odoo 中,初始化数据库的命令会因使用的环境和启动方式而有所不同,下面为你详细介绍几种常见的初始化数据库的方式。 1. 使用命令行工具初始化 在命令行中,你可以使用 Odoo 的启动脚本并结合相关参数来初始化数据库。以下是基本的命令格式…...

大模型WebUI:Gradio全解12——LangChain原理、架构和组件(2)

大模型WebUI:Gradio全解12——LangChain原理、架构和组件(2) 前言12. LangChain原理及agents构建Gradio UI12.2 学习资料12.2.1 学习文档12.2.2 用途示例12.2.3 OpenAI和DeepSeek例程1. OpenAI示例2. DeepSeek例程参考文献前言 本系列文章主要介绍WEB界面工具Gradio。Gradi…...

1. 搭建前端+后端开发框架

1. 说明 本篇博客主要介绍网页开发中,搭建前端和后端开发框架的具体步骤,框架中所使用的技术栈如下: 前端:VUE Javascript 后端:Python Flask Mysql 其中MySQL主要用来存储需要的数据,在本文中搭建基本…...

初会学习记录

目录 务实: 第一章 (1)会计概念,职能和目标: (2)会计假设: (3)会计核算基础: (4)会计信息质量要求: (5)会计人员职业道德规范 (6)会计准则制度体系概述: (7)会计要素与会计等式&#x…...

DeepSeek 使用窍门与提示词写法指南

一、通用提示词技巧 窍门分类技巧说明示例提示词明确需求用“角色任务要求”明确目标作为健身教练,为30岁上班族设计一周减脂计划,需包含饮食和15分钟居家训练结构化提问分步骤、分模块提问第一步:列出Python爬虫必备的5个库;第二…...

【大模型】DeepSeek核心技术之MLA (Multi-head Latent Attention)

文章目录 1. Multi-Head Attention (MHA)2. Multi-head Latent Attention (MLA)2.1 低秩压缩2.2 应用RoPE2.3 矩阵融合 参考资料 在讲解MLA之前,需要大家对几个基础的概念(KV Cache, Grouped-Query Attention (GQA), Multi-Query Attention (…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

12.找到字符串中所有字母异位词

🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

微信小程序云开发平台MySQL的连接方式

注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Go语言多线程问题

打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...