前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Llama2.c 学习笔记4: run.c分析

Llama2.c 学习笔记4: run.c分析

原创
作者头像
flavorfan
修改2023-08-04 12:44:01
6K0
修改2023-08-04 12:44:01
举报
文章被收录于专栏:范传康的专栏范传康的专栏

llama2.c中,最想知道的的一个问题是:模型文件(bin)怎么手搓的(c)读取运行起来?延展开来是一下几个问题:

  • 图结构、权重如何存储、读取?
  • 训练模型的py脚本导出(export)如何匹配run.c的读取?基于二进制文件?
  • 计算图DAG运行过程需要保持哪些变量?状态保持、更新?
  • prompt如何处理?
  • 计算图那么多算子怎么实现?

在karpathy大神实现之前,一直认为是大厂的禁区,不可能完成的任务。看过大神micro-grad,nano-gpt等spelled-out系列教程,了解到karpathy就擅长与用基础语言构造toy轮子部件,然后完成一个五脏俱全的toy作品。花了2天的业余时间通读代码,画了结构图,大致形而上学了解些机理,在记忆模糊以及被其他事情拉扯去之前,写下笔记留恋。设计真是漂亮!!

1.struct/class结构类型设计

run.c 实现了3个struct结构类,具体可以看代码,图比代码感觉更容易理解。

1)Config: 模型超参数的结构配置

2)TransformerWeights:和图结构对应的权重存储

3)RunState: 运行时Context

其中,Config和TransformerWeight结构是通过model.bin二进制文件读取解析出来,二者和在一起是模型结构和权重;RunState是运行时上下文。

2.function

1)结构类相关的malloc、free、init函数

2)net blocks

这也回答了算子实现的问题,Llama2 LLM除了开始最后的token、pos处理,剩下都是标准化Transformer block的重复。特定系列的模型差别,就是Transformer block大小以及格式化配置的不同,其所用到的算子时有限的。

3)byte pair encode (BPE) tokenizer

就是读取tokenizer.bin文件,导出两个lookup类型的对象,然后就是per token process...

4) utils

argmax和sample用在有无温度参数的处理上。

3.main loop

run.c的主体流程非常传统,“果然应该这么设计。“的感觉,非常正统,设计精巧在于围绕结构结构的设计上。

4.模型文件传导:model.py > bin > run.c

简单的说: model.py::export --> bin --> run.c::Config TransformerWeight,具体结合下图,看以下代码:

  • model.py的export() 函数:输出模型配置(header)、权重到二进制文件;
  • run.c的Config、TransformerWeight从bin文件中依次初始化。

特别要指出的时,权重的保存是按照算子类型(Attension、ffn)、然后是Layer层的顺序进行分组存储;TransfoermerWeight中的变量都是指针指向真正存储权重的空间,这些又是根据先解析出来Config信息申请。这样设计的保证了Config,TransformerWeight结构占用空间大小一致(更模型大小无关)。

5.未尽之事

没有时间,或者价值不大,进行python、C推理引擎推理的比较;也没有充裕的时间,单步跟踪run.c代码看看数据的流转。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.struct/class结构类型设计
    • 1)Config: 模型超参数的结构配置
      • 2)TransformerWeights:和图结构对应的权重存储
        • 3)RunState: 运行时Context
        • 2.function
          • 1)结构类相关的malloc、free、init函数
            • 2)net blocks
              • 3)byte pair encode (BPE) tokenizer
                • 4) utils
                • 3.main loop
                • 4.模型文件传导:model.py > bin > run.c
                • 5.未尽之事
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档