用 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…

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

文章目录 操作系统(Operator System)为什么要有操作系统操作系统是如何进行管理的为什么说操作系统是安全,稳定,高效的理解系统调用和库函数 操作系统(Operator System) 概念: 操作系统(Operating System,简称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博客后,进行自我检测,每个练习分为效果显示、需求分析、静态代码、完整代码、总结 四个部分,效果显示和准备代码已给出,我们需要完成“完整代码”部分。 目录 练习1&#xff1…

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

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

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

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

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

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

循环单链表的介绍与操作

定义 区别 链表合并 整合代码 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 应始终生成与本地构建相同的结果,易于安装和使用,并且通常比本地编译快得多。 distcc 不要求所有机器共享文件系统、同步时钟或安装相同的…

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

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

HTTP、模块化

HTTP协议 包括请求行、请求头、请求体 http常见请求方法: url统一资源请求符,其本身也是一个字符串 响应体的内容格式是非常灵活的,常见的响应体格式有: 1.HTML 2.CSS 3. JavaScript 4.图片 5.视频 6.JSON 响应状态码: IP本身是一个数字…

20240427纳米多孔石墨烯力学性能的调控

文献来源:Tuning the mechanical properties of nanoporous graphene: a molecular dynamics study DOI:https://orcid.org/0000-0003-3598-5439 结论:在这项工作中,使用经典MD模拟分析了扶手椅和锯齿形的NPG(纳米多…

Ubuntu2004 CMake 使用基础

一、环境安装 win10安装wsl ubuntu2004 #windows c盘工程目录建立软链 ln -s /mnt/c /home/vrviu/ 安装cmake、c编译工具 apt install -y cmake g 二、CMakeLists.txt讲解 准备工作 首先,在/home/vrviu 目录建立一个 cmake 目录 以后我们所有的 cmake 练习都会放…

如何借模板助力小程序开发

不论是奶茶店还是其他行业,想要开发小程序,乔拓云都为你提供了便捷的方案。无需复杂的编程技术,通过套用模板的方式,即可快速打造专属小程序。 在线访问乔拓云官方网站,免费注册账号后,即可进入商城小程序的…

RabbitMQ知识点总结(一)

为什么要使用RabbitMQ? 异步,解耦,削峰。 异步 提高效率;一个挂了,另外的服务不受影响。 解耦 增加或减少服务比较方便。 削峰 每天0点到16点,A系统风平浪静,每秒并发数量就100个。结果每次到了16点到…