你或许也想拥有专属于自己的AI模型文件格式(推理部署篇)-(6)

C++如何使用fsteam一次读完未知大小的文件 近期在写一个socket程序,在过程中遇到一个问题:如何将一个未知大小的文件按照8k字节的内存全部读完。 使用这种方法可以实现读出文件大小: ifstream infile("111.bmp",ifstream::binary);定义一个ifstream的输入 infile 文件流对象 infile.seekg(0,ios::end); length = infile.tellg(); 阅读详情

        如果有新的观众,如有疑惑,请从《专ai模》这个专栏从头开始阅读。特别是想要彻底搞清楚深度学习中模型的起源,以及如何一步一步构建自定义模型格式的观众来说,除了可视化篇,前面的三章必须要仔细阅读。

        而为什么我又有雅致来开启《推理部署篇》呢?主要原因是,目前个人野心有点大,想要从零构建一整套关于推理部署的工具链吧。也就是向着推理引擎的方向努力吧。特别是自从上次结束了《可视化篇》,总感觉意犹未尽。

        因此,全新的篇章开启了,该篇章的文章数可能会控制在10篇以下吧。不过也可能随着后续的深入,增加新文章。至少现阶段的一个目标就是能够让专ai模利用opencl进行推理部署吧。那么很自然地,任何一个推理引擎都包含一个叫做前端解析的功能,不同的推理框架对前端模型的支持各不相同,有的能够接入pytorch、tensorflow、darknet、caffe等。但是,我们的主要目的是支持自己的模型格式,因此对于我们而言前端解析工作量是少了许多。

        根据该专栏的第一篇文章的专ai模定义,我们可以很容易知道我们的前端解析的目标:解析生成的.pzkm模型文件,从中剥离出附属信息、张量信息、网络层信息等,这些信息最好是组织成C++结构体或者是类变量,以便后续的推理时接口组成推理时网络。

一、新增结构体

        之前我们只是编写了能够生成模型的接口,因此Tensor相关的结构体没有考虑专门,也就直接生成了模型文件。现在我们希望后续的代码能够脱离flatbuffers的使用,因此特意按照.fbs的定义使用C++结构体重写了一下,定义如下:

// TensorShape
struct TensorShapeS{
    uint8_t dimsize;
    std::vector<uint32_t> dims;
};
// Weights
struct WeightsS{
    uint8_t ele_bytes;
    uint64_t ele_num;
    std::vector<uint8_t> buffer;
};
// Tensor
struct TensorsS{
    uint32_t id;
    std::string name;
    TensorType tensor_type;
    DataType data_type;
    DataLayout data_layout;
    struct TensorShapeS shape;
    struct WeightsS weights;
};

二、定义读取模型文件的接口

        为了减少新的类的编写,尽可能复用代码,我们依然打算在PzkM类中增加前端解析接口来实现模型的读取,如下所示:

// main class for build pzkmodel
class PzkM
{
private:
    /* data */
public:
.....
    //前端解析接口,传入模型文件路径就可以实现解析
    bool ReadModel(std::string modelfile);
.....
}

三、编写读取模型文件的接口

        这里前端解析的逻辑其实非常简单,就是尽可能地使用到.fbs中PModel内部的所有元数据,解析流程如下所示:

bool PzkM::ReadModel(std::string modelfile)
{
    // 1.清空模型的所有数据,进行初始化
    this->clear_data();
    // 2.使用flatbuffer接口从读出来的模型二进制数据进行解析
    std::ifstream infile;
    infile.open(modelfile.c_str(), std::ios::binary | std::ios::in);
    infile.seekg(0, std::ios::end);
    int length = infile.tellg();
    infile.seekg(0, std::ios::beg);
    char* data = new char[length];
    infile.read(data, length);
    infile.close();
    auto my_model = GetPModel(data);
    
    // 3.从模型中读取网络信息
    // 3.1 读取附属信息
    this->author = std::string(my_model->author()->c_str());
    this->version = std::string(my_model->version()->c_str());
    this->model_name = std::string(my_model->model_name()->c_str());
    this->model_runtime_input_num = my_model->model_runtime_input_num();
    this->model_runtime_output_num = my_model->model_runtime_output_num();
    auto rt_input_id = my_model->model_runtime_input_id();
    for (size_t i = 0; i < rt_input_id->size(); i++)
        this->model_runtime_input_id.push_back(rt_input_id->Get(i));
    auto rt_output_id = my_model->model_runtime_output_id();
    for (size_t j = 0; j < rt_output_id->size(); j++)
        this->model_runtime_output_id.push_back(rt_output_id->Get(j));
    // 3.2 读取tensor信息
    auto rt_tensor_buffer = my_model->tensor_buffer();
    for (size_t m = 0; m < rt_tensor_buffer->size(); m++){
        auto one_tensor = rt_tensor_buffer->Get(m);
        struct TensorsS tess;
        tess.shape.dims.clear();
        tess.weights.buffer.clear();
        tess.id = one_tensor->id();
        tess.name = std::string(one_tensor->name()->c_str());
        tess.tensor_type = one_tensor->tesor_type();
        tess.data_type = one_tensor->data_type();
        tess.data_layout = one_tensor->data_layout();
        tess.shape.dimsize = one_tensor->shape()->dimsize();
        for (size_t n = 0; n < tess.shape.dimsize; n++)
            tess.shape.dims.push_back(one_tensor->shape()->dims()->Get(n));
        if (tess.tensor_type == TensorType_CONST){
            tess.weights.ele_bytes = one_tensor->weights()->ele_bytes();
            tess.weights.ele_num = one_tensor->weights()->ele_num();
            for (size_t n = 0; n < one_tensor->weights()->buffer()->size(); n++)
                tess.weights.buffer.push_back(one_tensor->weights()->buffer()->Get(n));
        }
        this->rTensors.push_back(tess);
    }
    // 3.3 读取网络层信息
    auto rt_layer_buffer = my_model->layer_buffer();
    for (size_t m = 0; m < rt_layer_buffer->size(); m++){
        auto one_layer = rt_layer_buffer->Get(m);
        layer_maker l = layer_maker(meta.get_meta(std::string(one_layer->type()->c_str())), one_layer->id(), std::string(one_layer->name()->c_str()));
        // 3.3.1 读取网络输入信息
        auto input_conn = one_layer->input_id();
        for (size_t n = 0; n < input_conn->size(); n++){
            auto one_conn = input_conn->Get(n);
            l.add_input(one_conn->tensor_id(), std::string(one_conn->name()->c_str()));
        }
        // 3.3.2 读取网络输出信息
        auto output_conn = one_layer->output_id();
        for (size_t n = 0; n < output_conn->size(); n++){
            auto one_conn = output_conn->Get(n);
            l.add_output(one_conn->tensor_id(), std::string(one_conn->name()->c_str()));
        }
        // 3.3.3 读取网络附属信息
        auto all_attrs = one_layer->attrs()->buffer();
        for (size_t n = 0; n < all_attrs->size(); n++){
            auto one_attr = all_attrs->Get(n);
            std::vector<uint8_t> a;
            for (size_t k = 0; k < one_attr->buffer()->size(); k++)
                a.push_back(one_attr->buffer()->Get(k));
            l.add_attr(std::string(one_attr->key()->c_str()), a);
        }
        this->rLayers.push_back(l);
    }
    delete data;
    return true;
}

        如此一来,对于模型的解析工作就已经完成了,后续将会正式开始推理运行时的网络构图、opencl核编写等文章的编写,尽情期待!

AI模型各种存储格式文件介绍(pb, onnx, ckpt, tflite, h5) .ckpt模型文件 tensorflow框架下保存的模型,包含以下几个子文件: model.ckpt.meta :保存Tensorflow计算图结构,可以理解为神经网络的网络结构 model.ckpt :保存Tensorflow程序中每一个变量的取值,变量是模型中可训练的部分 checkpoint :保存一个目录下所有模型文件列表 .pb 模型文件 pb是protocolbuffer的缩写。TensorFlow训练模型后存成的pb文件,是一种表示模型(神经网络)结构的二进制文件,不带有源代码,也. 阅读详情

相关推荐

《AI大模型技术应知应会100篇》No1. 大模型文件格式一篇读懂读全

大模型作为人工智能领域的核心技术,其文件格式和存储方式直接影响模型的训练、推理、部署和跨平台适配能力。根据现有研究和实践,大模型文件主要分为两类:**参数文件**和**代码文件**,前者存储神经网络的权重和偏差,后者包含运行模型的操作逻辑 。本文将详细介绍AI大模型的文件格式、对应的深度学习AI框架、主流应用场景、国内外主要厂商采用的文件格式以及技术趋势等,并提供了一个具体的大模型文件格式及参数说明,并提供了加载每一种大模型的代码示例,是比较全面的一篇介绍,建议收藏!

yweng18的博客 3210

部署快捷、使用简单、推理高效!大模型部署和推理框架 Xinference 来了!

Xorbits Inference(Xinference)是一个性能强大且功能全面的分布式推理框架。可用于各种模型的推理。通过 Xinference,你可以轻松地一键部署你自己的模型或内置的前沿开源模型。无论你是研究者,开发者,或是数据科学家,都可以通过 Xinference 与最前沿的 AI 模型,发掘更多可能。

2201_75499313的博客 1万+

pytorch 模型的保存与加载方法以及使用onnx模型部署推理

前言 在pytorch中,模型的保存和加载是一个比较麻烦的点,因为Pytorch保存模型的pkl格式中仅能记住每一层对应的参数,以及对应的模型结构所保存的位置也即是class所存放的位置,假如class位置改变的话,那么模型加载的时候就会报很多错误,大概的意思就是类存放的位置发生了改变。那么如何改变这一现状呢? 首先对于模型的重新加载和训练,我们可以使用pkl文件格式来进行,因为这一阶段的话并不涉及到模型结构存储文件的转移。但是到了推理部署阶段的时候,我们就必须把模型的结构以及权重保存下来,否则会给我们后面

qq_44930937的博客 1万+

C++ 记录文件复制filecopy

【代码】C++ 记录文件读取写入操作。

weijianjain的博客 555

AI 文件格式说明

文档包含了AI文件格式的基本说明,需要解析AI文件的可以参考

AI7文件格式详尽解析

AI格式文件是一种矢量图形文件,适用于Adobe公司的Illustrator软件的输出格式,与PSD格式文件相同,AI文件也是一种分层文件,用户可以对图形内所存在的层进行操作,所不同的是AI格式文件是基于矢量输出,可在任何尺寸大小下按最高分辨率输出,而PSD文件是基于位图输出。

文件部分-----(4)二进制文件读写操作

(1)进行二进制文件写入,随机输入一个字符串,写入到文件中 #include #include using namespace std; int main() { ofstream outFile("gyy1.txt",ios::binary); //建立一个输出文件流,以二进制方式ios::binary打开文件gyy1.txt if(!outFile) //文件打开失

smallgyy的专栏 1525

AI Agent技术架构与规模化应用:2025年技术深度解析

2025年,AI Agent(人工智能智能体)迎来了规模化应用的拐点时刻。根据Gartner等权威机构预测,企业软件中整合自主型AI的比例将从2024年的不足1%跃升至2028年的33%。本文深入剖析AI Agent的核心技术架构,从规划模块、记忆模块、工具调用模块到底层实现原理,结合Python和Go语言的实际代码示例,全面阐述AI Agent的技术实现路径。同时,本文探讨多智能体协作系统、企业级部署架构以及未来的技术演进方向,为开发者和技术决策者提供系统性的技术参考。关键词:AI Agent、大语言模型

shao.bing的专栏 1348

你或许也想拥有专属于自己的AI模型文件格式(推理部署篇)-(7)

距离上次的文章,已经有一个月之久了。要是再不继续推进,那么我17个粉丝又要催更了(纯属本人瞎说,实际情况是没人催更)。 今天就少扯皮了,直接开淦吧! 上次的文章中,说明了如何在C++代码中解析我们的专AI模模型文件格式,大概的思路无非和构建模型的时候是反着进行的。因为这份模型文件格式是完全由flatbuffers进行解析的,因此,解析的过程是一场清晰明了的。 而之所以解析模型文件,主要是这样我们就能够实现专AI模的跨平台传送,构建好的模型能够无差异地在各...

Pengcode的博客 2621

Cadence IC618版图DRC验证License报错排查:从虚拟机网络配置到HOSTID的实战解析

本文详细解析了Cadence IC618版图设计中DRC验证License报错的排查方法,重点从虚拟机网络配置到HOSTID获取的实战经验。通过对比ifconfig与ip add命令的差异,提供了正确的HOSTID获取方式及License文件修改技巧,帮助工程师快速解决IC618环境下的DRC验证问题。

weixin_30823001的博客 677

HWDB1.1数据集处理全攻略:从gnt文件到PNG图片的完整转换教程

本文提供了HWDB1.1数据集处理的完整教程,详细解析了gnt二进制文件格式,并给出了从文件解析、标签映射到批量转换为PNG图片的Python脚本。教程涵盖了环境准备、跨平台解压方案,以及为PyTorch等深度学习框架准备数据的最佳实践,是进行手写汉字识别研究不可或缺的实用指南。

2w3e4r5t6y的博客 628

你或许也想拥有专属于自己的AI模型文件格式(推理部署篇)-(8)

《你或许也想拥有专属于自己的AI模型文件格式》这个系列,上一次的文章更新是2022-03-05,距今已经4个月之久了。主要是这段时间有其他的事情在忙,期间也在断断续续地在完善该推理框架的。而让我思绪卡死的地方就是整网的推理时事件依赖问题,这个问题主要是因为OpenCL的clEnqueueNDRangeKernel这个核函数推理函数的局限性问题(正文仔细说明)。本次的进展内容:本次文章的主要内容:目前的工程整体结构: 2、有向图重排网络层 2.1、重排的原因和目的 模型的网络层顺序是乱序的:我们自定义的模型

Pengcode的博客 775

NVIDIA DGX Spark实战:如何在桌面上轻松运行200B参数大模型?

本文详细介绍了如何利用NVIDIA DGX Spark在桌面端轻松运行200B参数大模型。通过实战演示,从系统初始化、模型获取部署到内存管理与性能调优,重点解析了其统一内存架构如何解决本地推理的显存瓶颈,并探讨了进行轻量化微调(如LoRA)的可能性,为AI开发者和研究团队提供了高效的本地化大模型操作方案。

weixin_29054195的博客 882

你或许也想拥有专属于自己的AI模型文件格式(推理部署篇)-(9)

1、前言 本次的进展内容:本次文章的主要内容: 3、InferenceDebugByCpu调试推理接口 3.1、调用流程 具体的调用流程示例如下所示: 3.2、实现细节 具体的调用流程示例如下所示: 4、cpu_run调试推理部分如何从cl核函数转换 4.1、关于opencl的cl核函数说明 cl核函数内部遵循了C99编程语言标准,内部的代码跟C语言一致; cl核函数内部的逻辑只代表一个工作项的所有工作,具体的循环是靠外部调用clEnqueueNDRangeKernel函数时设置的globalWorkSi

Pengcode的博客 606

【C#程序员入门AI】向量数据库入门:C#集成Chroma/Pinecone,实现AI知识库检索(RAG基础)

向量存语义,检索补知识!向量数据库:解决AI知识库存储和语义检索问题,让AI有据可查C#集成:Chroma轻量本地练手,Pinecone企业云端落地,一套逻辑无缝切换RAG闭环:检索+大模型,让AI回答精准不瞎编,是AI落地的必经之路咱C#程序员有.NET生态加持,集成向量数据库比Python更简洁、更稳定,不管是个人做智能助手,还是企业做知识库,这套技术栈都能直接落地,2026年必学技能!

人工智能AI技术 1000

【AI智能体】全场景AI智能体工作台WorkBuddy实战操作详解

全场景AI智能体工作台WorkBuddy实战操作详解

congge 5490

【AI系统】推理文件格式

在训练好一个模型后,需要将其保存下来,以便在需要时重新加载并进行推理或进一步的训练。为了实现这一目标,需要一种有效的方式来将模型的参数、结构等保存起来。本文主要介绍在推理引擎中,针对神经网络模型的序列化与反序列化、不同的模型序列化方法,以及 Protobuf 和 FlatBuffers 两种在端侧常用的模型文件格式。

ZOMI酱 1213

芯片研发完整全流程

芯片研发全流程可分为需求与架构设计、前端逻辑设计、后端物理设计、晶圆制造、封装测试五大阶段,涉及16个核心步骤。研发过程需要多学科交叉协作,包括微电子、物理、材料、计算机等。关键注意事项包括验证优先、工艺约束遵循、可测性设计等。芯片设计需要绘制纳米级精度的物理版图,而非传统工程图纸,需使用专业EDA工具而非KiCad这类PCB设计软件。完整研发流程具有高投入、高风险特点,需严格遵循行业标准和规范。

weixin_44520581的博客 228

还在为模型加速推理发愁吗?不如看看这篇吧。手把手教你把pytorch模型转化为TensorRT,加速推理

文章目录摘要环境配置ONNX模型转化第一种推理写法第二种推理写法TensorRT模型转化动态推理静态推理 摘要 最近,学习了一些模型转化和加速推理的知识,本文是对学习成果的总结。 对模型的转化,本文实现了pytorch模型转onnx模型和onnx转TensorRT,在转为TensorRT模型的过程中,实现了模型单精度的压缩。 对于加速推理,本文实现GPU环境下的onnxruntime推理、TensorRT动态推理和TensorRT静态推理。 希望本文能帮助大家。 环境配置 CUDA版本:11.3.1 cuD

AI浩 5528

【skill】漫剧 AI 视频创作的知识库 + API 调用手册

方案适用场景在对话中使用,自动触发注入到任何 LLM(Cursor/Windsurf/Claude API)Python 模块集成到自动化管线/批量生成GitHub 又限速了,不过前几轮搜到的已经够用了。根据搜索结果,结合已分析过的项目,给你整理完整对比 🐮。

突围 983

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

模型部署-什么是模型部署?

0总结1 什么是模型部署?1 部署流程:2 为什么模型部署这么复杂?3 模型部署学习建议:2 详细介绍:1 模型转换2 模型优化3 模型压缩:剪枝:蒸馏稀疏化量化:4 模型推理与部署:TensorRTOpenVINO3 模型部署优化实例:参考。

2401_85328934的博客 2022

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

AI模型推理(1)——入门篇

本文主要介绍AI模型推理的相关基础概念,为后续云原生模型推理服务的学习做准备。

chenxy02的博客 4031

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

5个维度彻底理解AI模型文件格式

在当今机器学习模型部署的实践中,模型文件格式扮演着连接研发与生产的关键角色。一个高效的AI模型文件格式不仅能够显著提升机器学习推理优化效率,还能简化跨平台部署流程。本文将从概念本质、技术架构、行业对比、应用实践和未来演进五个维度,全面解析AI模型文件格式的核心原理与实践价值,为开发者提供从理论到落地的完整视角。 ## 一、概念本质:AI模型的"数字容器" ### 1.1 模型文件的核心功能定位

gitblog_00687的博客 486

深度学习模型文件格式总结记录

大语言模型(LLM)部署中主流文件格式可分为四类:1)原生训练格式(PyTorch的.pt/.bin、TensorFlow的.ckpt/.pb),便于训练但存在安全风险;2)安全格式.safetensors,具备零拷贝加载、纯数据存储特性,成为HuggingFace推荐格式;3)跨框架格式.onnx,支持标准化部署;4)硬件优化格式(CPU优化的.gguf、GPU加速的.trt、移动端的.tflite/.mlmodel)。这些格式在加载速度、推理性能、安全性和兼容性方面各具优势,开发者需根据应用场景(研究实

Together_CZ的博客 2164

【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(0)

轻量级人脸检测模型DBFace部署,基于Python和C++环境的ONNXRuntime。

liuz_notes的博客 2245
上一篇: The ROS_DOMAIN_ID,即ROS的领域标识的含义
下一篇: 你或许也想拥有专属于自己的AI模型文件格式(推理部署篇)-(7)
慷仔
博客等级 码龄9年 88粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值