用 C 语言进行大模型推理:探索 llama2.c 仓库(一)

文章目录

  • 前提
  • 有关huggingface社区
  • chinese-baby-llama2
  • llama2.c
    • export.py
      • 读取模型信息
      • 重建模型
      • 对重建出的模型初始化权重
      • 导出run.c要求的.bin文件
    • tokenizer.py
  • 一些思考
  • 参考链接

前提

最近发现了一个只用c语言就可以推理大模型的仓库llama2.c,作者是openAI的员工。对这个仓库产生了很大的兴趣,所以特地学习一番,这里做个记录。

有关huggingface社区

huggingface 应该是截至目前为止,世界上最大的llm社区了吧,huggingface社区收录了各种各样的模型共开发者使用,同时huggingface自己提供了一个Transformer库可以用来进行llm的推理。

之所以介绍huggingface社区,是因为在下文中我们要使用huggingface社区的模型。直接使用Meta发布的llama2来对程序进行运行分析的话,我的计算机因为配置问题运行不了,所以我们在huggingface社区中找一个和llama2有相同结构的模型,但是decode的层数要少很多的模型进行运行。

chinese-baby-llama2

chinese-baby-llama2是一个参数量115M左右的超微型小模型,采用Llama2架构,我们选择这个模型替代Meta的llama2对llama2.c仓库中的代码进行分析。

注意:在本文中,我们只关心推理代码的架构,以及代码是怎么写的,不关心llm的输出结果是否正确、是否合理。

llama2.c

我们将llama2.c和chinese-baby-llama2的仓库clone到本地。
关于llama.c仓库中每个文件是什么意思,这里不做过多的介绍,你将仓库中的README.md读完就明白了。简单地说下chinese-baby-llama2仓库中我们可能要用到的几个文件:
在这里插入图片描述
模型的权重文件是huggingface的格式。

export.py

因为权重文件和分词文件是huggingface的格式,因此按照README.md中指出的,为了可以使用run.c进行推理,我们首先要将hf模型文件转换为.bin文件,那么export.py这个文件就是用来做这个事情的。同理tokenizer.py也是干这个事情的,只不过对象换成了分词器。
export.py导出bin文件的大致流程如下:
在这里插入图片描述

读取模型信息

在这里插入图片描述

重建模型

在这里插入图片描述

对重建出的模型初始化权重

在这里插入图片描述
这里说明一下:从pytorch.model中提取的权重参数都存在hf_dict这个字典里,这个字典的长度为111,分别保存了每一层的参数、embedding的参数、最后一个norm的参数以及lm_head的参数。下面给出一个简易的网络结构图。
在这里插入图片描述
大概就是这个样子,我们根据这个也可以分析出为什么hf_dict的长度等于112,111 = 12 * 9(every layer) + 1(embedding) + 1(norm) +1(lm_head)。

导出run.c要求的.bin文件

第一步还是将模型结构等信息写入到.bin文件中,然后依次写入embedding权重文件等,写完以后,.bin文件的具体结构如下。
在这里插入图片描述

这里暂时没有搞清楚为什么不将lm_head的权重也写入到bin文件中。

tokenizer.py

tokenizer.py的逻辑更为简单,主要是借助了sentencepiece这个库。同样加载tokenizer.model然后将其保存为.bin文件。

一些思考

如果让我们自己使用C语言实现一个llama2的推理,我们会怎么做?对于我来说,一个很简单的想法就是翻译,我们已经知道用python语言是如何对llama2进行推理的,那我将python语言翻译为C语言。当然,这个翻译也没有那么简单,要保证python和C的数据是对齐的。举个例子来说,在python中基本的数据结构是tensor,那么在C中该用什么来表达这个tensor呢?所以还是要有较多的考量。
在这里插入图片描述

参考链接

  1. https://github.com/karpathy/llama2.c
  2. https://zhuanlan.zhihu.com/p/674666408

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

把私有数据接入 LLMs:应用程序轻松集成 | 开源日报 No.236

run-llama/llama_index Stars: 29.9k License: MIT llama_index 是用于 LLM 应用程序的数据框架。 该项目解决了如何最佳地利用私有数据增强 LLMs,并提供以下工具: 提供数据连接器,以摄取现有的数据源和各种格式(API、PDF、文档…

vite加密打包插件(vite-plugin-javascript-obfuscator)选项(option)详解

本文主要介绍vite加密打包插件(vite-plugin-javascript-obfuscator)选项(option)。 目录 一、选项(option)1. compact2. config3. controlFlowFlattening4. controlFlowFlatteningThreshold5. deadCodeInjection6. deadCodeInjectionThreshold7. debugProtection8.debugProtect…

【每日刷题】Day23

【每日刷题】Day23 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 138. 随机链表的复制 - 力扣(LeetCode) 2. 链表的回文结构_牛客题霸_牛客网 …

MySQL从入门到高级 --- 2.DDL基本操作

文章目录 第二章:2.基本操作 - DDL2.1 数据库的常用操作创建数据库选择要操作的数据库删除数据库修改数据库编码 2.2 表结构的常用操作创建表格式查看当前数据库的所有表名称查看指定某个表的创建语句查看表结构删除表 2.3 修改表结构添加列修改列名和类型删除列修改…

python之excel加工处理小案例一则

一、工具用途 工作中,需要对各类excel进行加工处理,当表和字段比较多时,关联条件又有多个,每次通过execl的vlookup之类的关联公式手工可以解决工作需求,但一般耗时较长,且人工统计匹配也存在出错的情况。 …

cnpm安装

npm install -g cnpm --registryhttps://registry.npmmirror.com # 注册模块镜像 npm set registry https://registry.npmmirror.com // node-gyp 编译依赖的 node 源码镜像 npm set disturl https://npmmirror.com/dist // 清空缓存 npm cache clean --force // 安装c…

《深入浅出.NET框架设计与实现》笔记6.3——ASP.NET Core应用程序多种运行模式之三——桌面应用程序

ASP.NET Core应用程序可以在多种运行模式下运行,包括自宿主(Self-Hosting)、IIS服务承载、桌面应用程序、服务承载。 因此选择和时的模式很重要。 桌面应用程序 ASP.NET Core也可以用于构建跨平台的桌面应用程序,利用跨平台界面…

【VUE】提升大数据量场景下el-table组件的性能

提升大数据量场景下el-table组件的性能 在现代Web应用程序开发中&#xff0c;使用Vue和Element UI快速构建高效的用户界面是非常普遍的做法。特别是对于需要展示大量数据的表格组件&#xff08;<el-table>&#xff09;&#xff0c;性能优化成为了不可忽视的关键。本文将…

C#面:泛型有哪些常见约束

C# 泛型提供了一种在编译时对类型进行参数化的方式&#xff0c;可以增加代码的灵活性和重用性。在使用泛型时&#xff0c;可以对泛型参数进行约束&#xff0c;以限制可以传递给泛型类型或方法的类型。 常见的泛型约束有以下几种&#xff1a; 类型约束&#xff08;class&#…

【Web应用技术基础】JavaScript学习手册(9、11、12、13、16)

目录 JavaScript学习手册九&#xff1a;字符串 第1关&#xff1a;查找字符串的位置 第2关&#xff1a;求指定位置的字符 第3关&#xff1a;字符串的截取 第4关&#xff1a;大小写转换 第5关&#xff1a;字符串的分割 JavaScript学习手册十一&#xff1a;JSON 第1关&…

C语言:实现N的阶乘

递归&#xff1a; #include<stdio.h> long long Fet(int n) { if (n < 1) return 1; else return n * Fet(n - 1); } int main() { int n 0; scanf_s("%d", &n); int r Fet(n); printf("%d",r); ret…

深入理解操作系统与计算机体系结构

文章目录 操作系统(Operator System)为什么要有操作系统操作系统是如何进行管理的为什么说操作系统是安全&#xff0c;稳定&#xff0c;高效的理解系统调用和库函数 操作系统(Operator System) 概念&#xff1a; 操作系统&#xff08;Operating System&#xff0c;简称OS&…

一文整理完MySQL关系型数据库相关知识

MySQL关系型数据库 1. 介绍1.1 MySQL 2. 安装3. SQL语句4. SQL分类5. DDL5.1 库的DDL5.2 表、列的DDL 6. DML6.1 添加数据6.2 修改数据6.3 删除数据 7. DQL7.1 基础查询7.2 条件查询7.3 排序查询7.4 聚合函数7.5 分组查询7.6 分页查询 8. 约束8.1 约束分类 9. 多表查询9.1 内连…

Vue阶段练习:tab栏、进度条、购物车

阶段练习旨在学习完Vue 指令、计算属性、侦听器-CSDN博客后&#xff0c;进行自我检测&#xff0c;每个练习分为效果显示、需求分析、静态代码、完整代码、总结 四个部分&#xff0c;效果显示和准备代码已给出&#xff0c;我们需要完成“完整代码”部分。 目录 练习1&#xff1…

【经验分享】MySQL集群部署一:主从模式

目录 前言一、基本介绍1.1、概念1.2、执行流程 二、部署2.1、通用配置2.2、主节点配置2.3、从节点配置2.4、主从测试2.5、谈一谈主节点历史数据同步问题 前言 MySQL的部署模式常见的包括以下几种&#xff1a; 独立服务器部署主从复制部署高可用性集群&#xff08;HA&#xff…

(mac)Promethues监控之mysqld_exporter(MySQL监控)

搭建Mysqld_exporterPrometheusGrafana监控系统 普罗米修斯是后端数据监控平台&#xff0c;通过Mysqld_exporter收集mysql数据&#xff0c;Grafana将数据用图形的方式展示出来 前提&#xff1a;已安装grafana和promethues 1.下载安装Mysql &#xff08;1&#xff09;启动MySQL…

基于51单片机的电梯仿真系统

基于51单片机的电梯设计 &#xff08;仿真&#xff0b;程序PPT&#xff09; 功能介绍 具体功能&#xff1a; 1.一共4层&#xff0c;数码管显示当前楼层&#xff1b; 2.六个按键模拟电梯外按键&#xff08;1上、2上、2下、3上、3下、4下&#xff09;&#xff0c;每当按下时有…

循环单链表的介绍与操作

定义 区别 链表合并 整合代码 typedef struct node{int data;node* next;; }lnode,*linklist; lnode* n; linklist l;//定义 void init(linklist &l){lnode lnew lnode;l->nextl;lnode *rl; } //单循环链表的合并 linklist merge(linklist &a,linklist b){//存头结…

debian配置distcc分布式编译

前言 distcc 是一个用于在网络上的多台机器上分发 C、C、Objective C 或 Objective C 代码构建的程序。 distcc 应始终生成与本地构建相同的结果&#xff0c;易于安装和使用&#xff0c;并且通常比本地编译快得多。 distcc 不要求所有机器共享文件系统、同步时钟或安装相同的…

数据结构 - 队列 [动画+代码注释超详解],萌新轻松上手!!!

一. 队列的概念 队列是一种特殊的线性表&#xff0c;用于存储元素&#xff0c;并且按照先进先出(First In First Out)的顺序进行管理&#xff0c;这意味着最先加入队列的元素将会是最先从队列中被移除的元素 队列的原型&#xff1a;只允许在一端进行插入数据的操作&#xff0c…