当前位置: 首页 > 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 (…...

HarmonyOS 鸿蒙PC平台三方库移植:使用 vcpkg 移植 libzen(ZenLib)

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

重新理解AI:从工具到可协作的助手

动手的事在减少,动脑的事在增加。从AI正式出场算起,不过短短三年多时间,许多事都在喧嚣中悄悄变化。翻看2023年的对话,无非就是和AI说句话,让它写写工作报告,分析具体的业务或数据,心底里还是把…...

为ClaudeCode配置Taotoken作为备用API解决访问限制

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为ClaudeCode配置Taotoken作为备用API解决访问限制 基础教程类,指导经常遇到ClaudeCode访问限制的开发者,如…...

电玩城新政解读:价格趋势与消费避坑指南

行业现状:一场新规带来的市场洗牌最近,不少玩家发现,常去的那家电玩城变了——以前一块钱两个币,现在一块钱一个币,机器游戏规则也悄悄调整了。这背后,是2024年以来多地密集出台电玩城管理新规带来的连锁反…...

STM32MP1 M4内核定时器中断配置与调试实战

1. 项目概述:深入STM32MP1的M4内核定时器世界在嵌入式开发里,定时器(Timer)就像系统的心跳和闹钟,是驱动一切周期性任务和精确时序控制的基础。对于STM32MP1这颗强大的异构多核处理器,其Cortex-M4协处理器侧…...

Blender 3MF插件:开源3D打印数据交换的终极解决方案

Blender 3MF插件:开源3D打印数据交换的终极解决方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在3D打印行业快速发展的今天,数据交换的完整性…...

一句指令就能完成跨系统操作?——2026企业级智能体技术路径深度拆解

站在2026年的时间节点回望,企业数字化转型已从“流程驱动”全面转向“智能体驱动”。过去,跨系统操作往往意味着繁杂的API对接或编写脆弱的自动化脚本。而今,以实在智能推出的实在Agent为代表的方案,实现了“一句指令,…...

STM32CubeMX保姆级教程:从零配置STM32F103C8T6工程,5分钟点亮你的第一个LED

STM32CubeMX极简入门指南:5分钟实现LED控制全流程 第一次接触嵌入式开发时,那种既兴奋又忐忑的心情我至今记忆犹新。看着眼前这块小小的蓝色开发板,既想立刻让它"活"起来,又担心复杂的配置过程会让人望而却步。幸运的是…...

TikTok客户端关键字符串追踪与ttencrypt协议解析

1. 这不是“破解”,而是协议层的工程化还原很多人看到“TikTok算法逆向”第一反应是:这得用IDA Pro硬啃SO文件、在ARM汇编里找特征码、对着混淆后的Java层反复脱壳——其实大错特错。我过去三年深度参与过5个主流短视频App的客户端通信分析项目&#xff…...

【麒麟桌面系统】V10-SP1 2503 系统知识——常见日志文件及其作用

提示:分享麒麟桌面操作系统 V10 SP1 2503 ( Kylin-Desktop-V10-SP1 2503 )常见日志文件及其作用。 一、现象描述现象描述:在银河麒麟桌面操作系统使用过程中,若出现操作系统故障,需要查询日志排查具体原因&…...