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 (…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
