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 模型的问题,具体体现在以下几个方面:
- 设备端推理:Llama 是 Meta 公司开发的大型语言模型,原始的 Llama 模型运行需要强大的计算资源,如 GPU 集群等。而 llama.cpp 项目通过优化代码实现,使得 Llama 模型可以在普通的 CPU 设备上(如个人电脑、移动设备等)运行。这对于那些无法访问大规模计算资源的用户或场景(如没有 GPU 支持的个人电脑、边缘设备等)非常有帮助,使得用户可以在本地设备上进行模型推理,而不需要依赖云端服务,增强了模型使用的灵活性和隐私性。
- 降低计算资源需求:该项目对 Llama 模型的计算过程进行了优化,减少了内存占用和计算量。通过采用量化技术(如将模型参数从高精度数据类型转换为低精度数据类型),在一定程度上牺牲模型的精度来换取计算资源的大幅降低,从而能够在资源有限的设备上顺利运行模型。例如,在一些内存较小的设备上,也能够加载和运行 Llama 模型的较小版本。
- 促进模型的研究和应用:llama.cpp 使得更多的研究人员和开发者能够在本地方便地对 Llama 模型进行研究、实验和应用开发。它为自然语言处理领域的研究提供了一个更易于访问和使用的平台,加速了相关研究的进展。同时,也为一些基于 Llama 模型的应用开发提供了可能,如本地的文本生成工具、智能助手等,促进了语言模型在不同领域的应用和创新。
- 提升模型的可定制性:由于是在本地运行,开发者可以根据自己的需求对模型进行定制和修改,如调整模型的参数、添加特定的功能模块等。这种可定制性使得 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
FROM指令:指定基础模型,这里使用deepseek:1.5b作为基础,后续的微调操作将基于这个模型进行。NAME指令:为自定义模型指定一个名称,这里命名为my_custom_deepseek,方便后续引用和管理。DESCRIPTION指令:对自定义模型进行简要描述,说明该模型是基于deepseek:1.5b并加入了自定义数据。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 强调文本(斜体)…...
多个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 (…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
