Ollama入门:Ollama技术架构与原理

Ollama在AI大模型领域与风靡一时的应用容器引擎Docker有着相似的角色。对于熟悉Docker的小伙伴,接触到Ollama时就会发现Ollama 的 shell 命令和 Docker 极其相似,比如 Ollama 通过ollama pull下载模型、ollama run运行模型 ,类似 Docker 拉取和运行镜像的命令。设计理念层面上,Docker 把应用程序及其依赖打包成镜像,方便在不同环境中部署和运行;与之对应的Ollama 则把大语言模型集合在一个仓库中,用户可以便捷地管理和运行各种 AI 模型,就像 Docker 管理镜像一样管理模型。

1、Ollama中模型的运行过程

在 Ollama 中运行一个模型的过程涉及模型管理、加载、推理等多个环节。下面从技术角度详细介绍一个完整的模型运行流程。

Ollama入门:Ollama技术架构与原理

STEP 1:运行入口:启动 Ollama

当你运行命令ollama run llama2时,Ollama 会执行以下步骤:

(1)命令解析
• 使用 Cobra 解析命令行参数。
• 判断是否是 run 命令,并读取指定的模型名称 (llama2)。

(2)API 调用
• 如果是通过 API 运行模型(如通过 RESTful API 或 OpenAI API 调用),会通过 api 模块处理请求。
• API 请求数据包括模型名称、输入文本、参数等。

STEP 2:模型管理和加载

在模型运行前,Ollama 会检查模型的状态,执行以下步骤:

(1)模型检查
• 通过 internal/model/manager.go 检查模型是否已下载或存在于本地缓存。
• 如果模型不存在或需要更新,调用 ollama pull 自动从远程仓库下载模型。

(2)Modelfile 解析
• 使用 internal/modelfile/parser.go 解析模型的 Modelfile。
• Modelfile 中包含模型基于哪个基础模型 (FROM)、环境变量、指令和自定义配置。

FROM llama2
SYSTEM "You are a helpful assistant"

(3)量化处理
• 如果模型支持量化(如 4-bit、8-bit),在 quantization.go 中执行量化加载。
• 使用 ggml 等格式加载量化模型,减少内存占用。

(4)推理引擎初始化
• 根据模型配置选择推理引擎。
• 默认情况下 Ollama 使用 llama.cpp 进行模型推理。
• 初始化推理上下文,分配内存和 GPU 资源。

STEP 3:推理执行**

加载完成后,模型进入推理阶段:

(1)请求解析
• 接收用户输入的 prompt,并进行预处理,包括分词和编码。
• Ollama 使用 tokenizer 将文本转换为 Token 序列。

(2) 模型前向推理
• 通过 internal/inference/engine.go 调用 llama.cpp 进行推理。
• 推理引擎会执行以下步骤:

  1. 读取 Token 序列并输入到神经网络中。
  2. 依次经过 Transformer 模型的各个层。
  3. 生成下一个 Token 的概率分布。
  4. 通过温度采样或 Top-K、Top-P 采样生成最终输出。

(3) 输出生成
• 推理结果通过 tokenizer 逆向转换为文本。
• Ollama 支持流式输出,用户可以实时看到推理结果。

STEP 4:API 或 CLI 返回结果

如果通过 API 请求运行模型,结果会通过 RESTful API 或 OpenAI 兼容 API 返回:

{
  "id": "chatcmpl-123",
  "object": "text_completion",
  "created": 1234567890,
  "model": "llama2",
  "choices": [
    {
      "text": "你好!有什么可以帮助你的吗?",
      "index": 0,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 15,
    "completion_tokens": 30,
    "total_tokens": 45
  }
}

STEP 5:后处理和资源管理

完成推理后,Ollama 会执行清理和优化步骤:

(1)缓存管理
• 将常用模型和权重保存在本地,减少重复加载的时间。
• 使用分块存储和校验文件完整性。

(2)内存释放
• 及时释放不再需要的 GPU 和 CPU 资源。

(3)日志记录
• 在 internal/utils/logger.go 中记录运行日志,便于调试和监控。

2、Ollama的技术架构

Ollama 的架构主要模型管理层、推理引擎层、API 服务层、数据存储与缓存等四部分组成。

模型管理层

• 支持多种 LLM 模型,包括 LLaMA 2/3MistralGemini 等。
• 使用 Modelfile 定义模型参数、环境配置和自定义指令。
• 支持模型导入与转换,便于从 Hugging Face 等平台迁移模型。

推理引擎层

•Ollama 使用 llama.cpp 进行高效推理,llama.cpp 以其轻量化和跨平台的特性而闻名。
• 支持量化模型推理(如 4-bit、8-bit),显著降低内存占用和推理时间。
• 支持 GPU 加速,充分利用 CUDA、Metal 等硬件加速。

API 服务层

• 提供 RESTful API,方便集成到 Web 应用或其他服务中。
• 支持 OpenAI API 兼容模式,方便开发者无缝迁移现有应用。

数据存储与缓存

• 本地缓存模型数据,避免重复下载。
• 使用分块管理模型文件,优化加载速度。

3、Ollama与llama.cpp、LLaMA、Transformer

Transformer、LLaMA、llama.cpp、ollama四者在人工智能领域的自然语言处理(NLP)中扮演不同的角色。简单来说,形成了一个从 架构设计模型实现,再到 推理运行用户友好化封装 的完整生态链。

Transformer -> LLaMA -> llama.cpp -> Ollama ->User

Transformer — 基础架构

Transformer 是由 Google 在 2017 年提出的神经网络架构,主要用于自然语言处理任务。它引入了 自注意力机制(Self-Attention),彻底改变了 NLP 的发展。

作用
• 为现代大语言模型提供基础架构。
• 支持训练和运行包括 GPT、BERT、LLaMA 等模型。

关系
LLaMA 的模型架构就是基于 Transformer 设计的,Transformer 是 LLaMA 的技术基础

LLaMA — 大语言模型

LLaMA(Large Language Model Meta AI)是由 Meta(Facebook 母公司)推出的大型语言模型,专为研究和商业应用设计。

作用
• 使用 Transformer 架构进行训练。
• 可以执行文本生成、对话理解、编写代码等任务。

关系
LLaMA 是基于 Transformer 的具体实现,LLaMA 基于 Transformer 构建,是一个可运行的 AI 模型

llama.cpp — 轻量级推理引擎

llama.cpp 是一个用 C++ 编写的轻量化推理引擎,用于高效地在本地设备上运行 LLaMA 等大型语言模型。

作用
• 提供模型加载、推理执行等功能。
• 支持 CPU 和 GPU 推理,优化内存占用。

特点
• 极致的性能优化,适合在消费级设备上运行。
• 兼容多种硬件,包括 macOS 的 Apple Silicon 和 NVIDIA GPU。

关系
llama.cpp 使用 LLaMA 等模型进行推理,llama.cpp 是 LLaMA 模型的推理引擎

Ollama — 模型管理和运行平台

Ollama 是一个基于 llama.cpp 构建的模型管理平台,它进一步封装了模型的下载、管理和运行过程。

作用
• 提供简单的命令行工具,用户可以快速加载和运行 LLaMA 等模型。
• 支持自定义模型、模型版本管理等功能。

特点
• 无需复杂环境配置,开箱即用。
• 支持 RESTful API 和本地推理。

关系
• Ollama 使用 llama.cpp 作为推理后端执行 LLaMA 模型。
• Ollama 让普通用户无需了解底层细节即可运行大型语言模型。
Ollama 是 llama.cpp 的封装,提供了易用的模型管理和推理工具

阅读剩余
THE END