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

模型加载与初始化(3)

前言在 llama.cpp 中模型推理主要基于 GGUF 格式展开。GGUF 是一种专为存储基于 GGML 及其相关执行器进行推理的模型文件而设计的格式。作为一种二进制格式其设计初衷在于实现模型的高效加载与保存并确保良好的易读性。本章将深入探讨大语言模型推理的关键准备环节——模型的加载与初始化部分并从 GGUF格式介绍及GGUF格式加载与解析两个维度展开详细介绍。目录1 GGUF格式介绍2 GGUF格式加载与解析1 GGUF格式介绍GGUF具有单文件部署、高度可扩展、兼容mmap、简单易用、信息自包含等特点。即模型无需额外文件即可单独部署通过元数据键值对实现功能的平滑扩展配合 mmap 显著提升了加载与写入效率凭借无需外部依赖库的特性简化了读写流程并因内置所有必要信息而省去了用户的额外配置。GGUF文件结构如下图所示(引用自ggml/docs/gguf.md at master · ggml-org/ggml):GGUF 文件由头文件、张量信息(Tensor Info)及张量数据(Tensors)三部分构成头文件描述GGUF文件的全局信息包含基础文件信息(如格式标识(GGUF字符)、版本号、张量与元数据计数)及以键值对(Key-Value Pairs)形式存储的丰富元数据张量信息部分详细描述了各权重的名称、维度、数据类型及物理偏移量为权重数据读取提供索引张量数据区则存储实际的权重值并严格遵循元数据中 general.alignment 定义的对齐值通过填充0x00确保各张量首地址满足对齐要求-每个张量的首地址需为general.alignment的整数倍从而优化内存映射与推理性能。2 GGUF格式加载与解析接下来从代码层面剖析 GGUF 的解析过程。在上篇文章中(llama-server - 从命令行到HTTP Server(2)-CSDN博客)我们介绍了llama-server基于cpp-httplib的运行机制其整体架构主要分为server_http_context 与 server_context其中server_context负责管理模型推理而接下来的大模型加载相关逻辑则属于server_context的核心内容。本次调试的llama.cpp版本的hash值为7f5ee5...可通过git reset命令与本文保持一致。调试的命令如下在后续文章中除特别说明外都采用此命令llama-server -m gemma-3-1b-it-Q4_K_M.gguf -ngl 99回到 llama-server 项目 server.cpp 文件的第 252-259 行通过调用 server_context 类的 load_model 方法即可实现模型的加载。if (!ctx_server.load_model(params)) { clean_up(); if (ctx_http.thread.joinable()) { ctx_http.thread.join(); } LOG_ERR(%s: exiting due to model loading error\n, __func__); return 1; }函数传入的参数为common_params对象其包含了大模型服务所有的参数本文除n_gpu_layers取值99外其它参数取默认值。通过深入调试 load_model 方法可以总结出如下函数调用路径common_init_from_params - llama_model_load_from_file。其中 common_init_from_params 函数返回 common_init_result 对象而 common_init_result 主要包含 llama_model 与 llama_context 两类核心对象其类依赖关系如下图所示。而 llama_model_load_from_file 函数在 common_init_result 对象的构造过程中执行传入参数为记录了模型路径及配套参数的 common_params。接下来进入对 llama_model_load_from_file 函数的调试环节。从该函数的输入输出来看其接收模型路径与额外参数并输出 llama_model 对象初步观察可见llama_model 对象的成员变量涵盖了超参数、词汇表、ggml_tensor、llama_layer、以 std::unordered_map 形式表达的 KV 元数据、计算后端设备及后端缓存等其与成员变量的具体关系如下图所示。继续向下调试进入到 llama_model_load_from_file_impl 函数位于 llama.cpp 中其代码前半部分主要涉及 llama_model 指针的构造以及后端设备device的添加过程而有关 llama.cpp 的后端初始化逻辑将在后续章节详细讲解。接下来调试会遇到一个关键函数 llama_model_load进入该函数后可以发现其在实现上是先通过 llama_model_loader 对象加载模型再利用该对象逐步构建 llama_model 实例因此后续的代码解读部分将分为模型加载与 llama_model 对象构建两阶段进行。2.1模型加载首先从结构体llama_model_loader的成员变量来分析其主要包含一个gguf_context指针对象和ggml_context指针数组。ggml_context与gguf_context并不一定呈现一一对应关系这主要是由于GGUF格式支持跨多个文件拆分存储相关信息在KV元数据的split.count字段中有所体现在本次调试的模型中由于该值为0因此ggml_context与gguf_context在此时表现为一一对应关系。继续深入调试在llama_model_loader的构造函数中通过调用gguf_init_from_file函数返回gguf_context对象并同步初始化ggml_context对象观察gguf_context结构体可以发现其设计方案与2.1节介绍的GGUF格式组成高度契合即GGUF文件由文件头、张量信息TensorInfo及张量数据Tensors三部分构成其中文件头对应version与kv变量张量信息对应info而张量数据则对应offset、size与 data此外还特别包含对齐变量alignment用于计算首个张量数据需满足对齐要求的地址偏移量即offset变量值。struct gguf_context { uint32_t version GGUF_VERSION; std::vectorstruct gguf_kv kv; std::vectorstruct gguf_tensor_info info; size_t alignment GGUF_DEFAULT_ALIGNMENT; size_t offset 0; // offset of data from beginning of file size_t size 0; // size of data in bytes void * data nullptr; };2.2llama_model对象构建在模型加载完成后断点回退至 llama_model_load函数此时llama_model_loader对象构建完毕并转由其构造 llama_model对象。接着系统依次调用load_arch、load_hparams、load_vocab、load_stats及load_tensors方法并以llama_model_loader对象作为形参实现信息交换相关代码分布在llama.cpp文件的第844-861行。值得注意的是load_tensors方法的调用与GPU操作紧密相关通过对比调用前后的状态可以观察到GPU占用显著升高而load_tensors的具体实现细节将在后续章节深入剖析。2.3 小结本小节通过深入剖析代码的形式阐述了从server_context到llama_model、再到gguf_context与ggml_context的调用路径清晰还原了GGUF格式的加载与解析流程。其中底层gguf_context的设计与物理存储保持高度一致ggml_context负责张量的进一步解析而最顶层的llama_model则涉及数据从CPU到GPU的计算后端加载过程至于llama_context、后端初始化及load_tensors的细致实现等本节尚未涉及的知识点将在后续章节深入讲解。文末本文深入讲解了大语言模型(LLM)推理中重要的准备工作之一模型加载与初始化。从GGUF格式及其加载与解析两个角度去说明。同时在代码调试过程中留下了llama_context、后端初始化及load_tensors的细致实现等本节尚未涉及的知识点这些将在后续文章中深入讲解。在下一章中我们将进一步探索模型推理前的另一核心准备环节——从文本到Token。大语言模型无法直接处理原始字符串需要将输入文本映射为高维向量序列作为后续模型推理计算的输入此过程中有一个必不可少的环节——分词(tokenize即从文本到Token)。

相关文章:

模型加载与初始化(3)

前言 在 llama.cpp 中,模型推理主要基于 GGUF 格式展开。GGUF 是一种专为存储基于 GGML 及其相关执行器进行推理的模型文件而设计的格式。作为一种二进制格式,其设计初衷在于实现模型的高效加载与保存,并确保良好的易读性。本章将深入探讨大语…...

【花雕学编程】Arduino BLDC 之 AI 迷你小龙虾 MimiClaw 自主闭环控制机器人(带传感器反馈)

从工程视角来看,基于Arduino、使用互补滤波进行姿态控制的BLDC(无刷直流电机)机器人,是一个典型的嵌入式实时闭环控制系统。它集成了传感器数据融合、控制算法和电机驱动,广泛应用于对姿态稳定性有要求的场景。关于 Mi…...

Qwen3-ASR-0.6B在新闻行业的应用:采访录音快速转写

Qwen3-ASR-0.6B在新闻行业的应用:采访录音快速转写 1. 引言 新闻记者每天都要面对大量的采访录音,传统的手工转写方式耗时耗力。一段30分钟的采访录音,熟练的转录员可能需要2-3小时才能完成转写,而且还要面对口音、专业术语、背…...

【花雕学AI】打破AI轻量化极限!MimiClaw:5美元芯片上跑的纯 C 轻量 AI 智能体

提到AI智能体,很多人的第一印象是“需要高性能服务器支撑”“离不开复杂操作系统”“功耗高到不敢长时间运行”——但MimiClaw的出现,彻底打破了这种固有认知。作为全球首个能在仅售5美元的ESP32-S3芯片上流畅运行的纯C编写轻量AI智能体,Mimi…...

mPLUG-Owl3-2B在教育、工作、生活中的10个实用场景分享

mPLUG-Owl3-2B在教育、工作、生活中的10个实用场景分享 1. 引言:多模态AI如何改变我们的日常 想象一下,当你随手拍下一张植物照片,AI不仅能告诉你它的学名,还能详细解释它的生长习性和养护要点;当你面对一份复杂的工…...

RMBG-2.0模型量化压缩:减小体积提升速度

RMBG-2.0模型量化压缩:减小体积提升速度 1. 引言 抠图工具RMBG-2.0确实效果惊艳,但原版模型动不动就几个GB的大小,在普通电脑上跑起来慢吞吞的,更别说在手机或边缘设备上部署了。如果你也遇到过模型太大、推理太慢的问题&#x…...

试盘Z之主力操盘线

试盘K,以满足特定条件后对该K线标注为试盘字样方便查看。同时通达对9日最低值与9日最高值进行EMA移动平均,得出主力操盘线!试盘Z源码:X_1:REF(EMA((HLC)/3,9),1);X_2:EMA(HHV(HIGH,9),3);X_3:EMA(LLV(LOW,9),3);主力操盘线:EMA(X_1*2-X_3,5),…...

从 0 手写一个巡检调度系统(五):接入大模型实现巡检问题解读与修复建议

摘要:在既有「架构巡检 → 问题落库」链路中,第一次引入大模型能力:对单条 issue 做「解读 修复建议」,要求输出可解析的结构化 JSON 并落库可追溯。本文记录选型、配置、HTTP 客户端、Prompt 约束与踩坑,便于同类业务…...

【雷达信号优化】第八章 阵列校准与误差补偿

目录 第八章 阵列校准与误差补偿 8.1 阵列误差模型 8.1.1 幅相误差 8.1.1.1 互耦效应建模 8.1.1.1.1 互耦矩阵的逆矩阵简化 8.2 阵列自校准算法 8.2.1 信号子空间拟合算法 8.2.1.1 交替优化策略 8.2.1.1.1 信源方向与误差参数的迭代更新 8.2.2 辅助源校准 8.2.2.1 单…...

重庆银行:万亿新贵的高光与隐忧

对于重庆银行而言,2026年3月24日是一个值得载入史册的日子。就在这一天,该行正式发布了2025年年度报告,其资产规模突破以往周期,使其成功跻身“万亿级城商行俱乐部”。其中,该行的营收与净利润时隔五年再次实现了“双十…...

如何用“波特三大竞争战略”为你的新产品破局?

1. 成本领先战略 (Cost Leadership)核心理念: 成为整个行业中成本最低的生产商或服务提供商。注意,成本领先不等于价格战。它的本质是通过极致的运营效率、规模经济、供应链优化或技术创新,把产品的底层结构性成本降到最低。这意味着&#xf…...

南北阁Nanbeige 4.1-3B Git版本控制实战:从入门到团队协作

南北阁Nanbeige 4.1-3B Git版本控制实战:从入门到团队协作 本文面向刚接触版本控制的开发者,手把手教你用南北阁Nanbeige 4.1-3B掌握Git核心技能,从基础命令到团队协作全流程。 1. 为什么你需要Git版本控制? 刚开始写代码时&…...

群晖NAS人脸识别功能解锁指南:让旧设备焕发AI新活力

群晖NAS人脸识别功能解锁指南:让旧设备焕发AI新活力 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 为何老款群晖NAS需要AI能力升级&…...

SenseVoice-Small模型在运维监控中的语音告警应用

SenseVoice-Small模型在运维监控中的语音告警应用 1. 运维人员每天都在和告警“搏斗” 你有没有经历过这样的场景:凌晨三点,手机突然震动,一条告警短信跳出来——“数据库连接池使用率98%”。你立刻爬起来打开电脑,连上跳板机&a…...

终极防撤回解决方案:RevokeMsgPatcher完全攻略

终极防撤回解决方案:RevokeMsgPatcher完全攻略 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/GitHu…...

告别TeamViewer!用RustDesk自建服务器实现跨平台远程控制(Windows/Ubuntu客户端全配置)

告别商业远程控制软件:用RustDesk自建服务器全流程指南 远程控制软件已经成为现代工作场景中不可或缺的工具,无论是技术支持、远程办公还是跨设备协作,一个稳定高效的远程连接方案都能极大提升工作效率。然而,商业软件如TeamViewe…...

突破设备边界:开源串流解决方案Sunshine革新跨设备游戏共享体验

突破设备边界:开源串流解决方案Sunshine革新跨设备游戏共享体验 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器,支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/…...

3步解锁B站Hi-Res音频:使用BilibiliDown开源工具轻松获取无损音乐

3步解锁B站Hi-Res音频:使用BilibiliDown开源工具轻松获取无损音乐 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/g…...

3分钟上手!Balena Etcher:安全烧录系统镜像的终极解决方案

3分钟上手!Balena Etcher:安全烧录系统镜像的终极解决方案 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾因烧录系统镜像而丢失…...

暗黑破坏神2终极单机优化:PlugY生存工具包完整指南

暗黑破坏神2终极单机优化:PlugY生存工具包完整指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 厌倦了暗黑破坏神2单机模式的储物空间限制&#xff1f…...

龙虾为啥越养越贵,越用越蠢?极客老王揭秘Agent落地真相

进入2026年3月,科技圈的舆论风向标发生了一次剧烈偏移。曾经被誉为开启“AI代驾”时代的超级智能体OpenClaw(俗称“龙虾”),在经历了一年的野蛮生长后,正陷入一场空前的信任危机。根据最新的行业调研数据显示&#xff…...

ARM64架构下利用docker-compose实现tendis单机版高效离线部署指南

1. 为什么选择ARM64架构部署Tendis? 最近几年ARM架构处理器越来越流行,从树莓派到苹果M系列芯片,再到各种云服务器的ARM实例,性能提升明显的同时功耗还更低。我去年接手的一个项目就要求全部跑在ARM64服务器上,当时部署…...

3步实现Mac微信防撤回:零配置本地化解决方案

3步实现Mac微信防撤回:零配置本地化解决方案 【免费下载链接】WeChatIntercept 微信防撤回插件,一键安装,仅MAC可用,支持v3.7.0微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 告别消息遗憾&#xff1…...

APK Studio安全最佳实践:合规使用逆向工程工具

APK Studio安全最佳实践:合规使用逆向工程工具 【免费下载链接】apkstudio Open-source, cross platform Qt based IDE for reverse-engineering Android application packages. 项目地址: https://gitcode.com/gh_mirrors/ap/apkstudio 在移动应用开发与安全…...

Android崩溃分析进阶:结合addr2line与IDA Pro精准定位SO文件崩溃点

1. 从崩溃日志到问题定位:为什么SO文件这么难缠? 每次看到Android应用崩溃日志里出现"signal 11 (SIGSEGV)"这种字样,我就知道今晚又要加班了。特别是当崩溃发生在SO文件中时,那种无力感就像在漆黑的房间里找一根掉落的…...

开源串流新选择:用Sunshine打造跨设备游戏共享系统

开源串流新选择:用Sunshine打造跨设备游戏共享系统 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器,支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine …...

Ollama GUI架构解析:现代本地LLM交互界面的技术实现与隐私优先设计

Ollama GUI架构解析:现代本地LLM交互界面的技术实现与隐私优先设计 【免费下载链接】ollama-gui 项目地址: https://gitcode.com/gh_mirrors/ol/ollama-gui 在人工智能技术快速发展的今天,本地化部署的大语言模型(LLM)成为…...

三大痛点终结!猫抓插件:颠覆式网页资源提取与管理解决方案

三大痛点终结!猫抓插件:颠覆式网页资源提取与管理解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾遇到这样的困境:在视频网站看到精彩教程想保存离…...

Pi0 Web演示服务监控:Prometheus+Grafana指标采集与告警配置

Pi0 Web演示服务监控:PrometheusGrafana指标采集与告警配置 1. 项目概述与监控需求 Pi0作为一个先进的视觉-语言-动作流机器人控制模型,其Web演示服务的稳定运行对于用户体验和开发测试至关重要。在生产环境中,我们需要实时掌握服务的运行状…...

贾子公理体系全场景应用白皮书——从底层逻辑根服务器到数字政府、金融、AI等十大领域落地

GG3M贾子公理体系:一套底层公理贯通十大全场景应用落地副标题: 贾子公理体系全场景应用白皮书——从底层逻辑根服务器到数字政府、金融、AI等十大领域落地摘要: 贾子公理体系是GG3M项目的底层逻辑根服务器,以自洽可演绎的公理系统…...