文章目录
- 前言
- 一、数据进入LlamaForCausalLM(LlamaPreTrainedModel)类
- 二、数据进入LlamaModel(LlamaPreTrainedModel)类
- 1、input_ids的embedding编码
- 2、position_ids位置获取
- 3、causal_mask因果mask构建
- 1、causal_mask调用
- 2、因果mask代码解读(_update_causal_mask)
- 4、hidden_states获取
- 5、decoder_layers解码
- 三、数据进入LlamaDecoderLayer(nn.Module)类
- 1、LlamaDecoderLayer类源码解读
- 2、input_layernorm结构处理hidden_states输入
- 四、数据进入LlamaSdpaAttention(LlamaAttention)类
- 1、LlamaSdpaAttention类源码解读
- 2、qkv获取
- 3、位置rotary_emb编码
- 1、位置编码调用
- 2、位置编码源码
- 4、位置编码应用
- 1、位置编码应用调用方法
- 2、位置编码apply_rotary_pos_emb应用
- 5、past_key_value更新
- 6、key与value重复
- 7、因果关系处理
- 8、attention实现方法torch.nn.functional.scaled_dot_product_attention
- 9、attn_output进行线性
- 10、返回值
- 五、数据再次进入LlamaDecoderLayer(nn.Module)类
- 1、hidden_states返回值处理
- 2、FFN操作
- 3、输出内容outputs
- 六、数据再次进入LlamaModel类
- 1、获取hidden_states内容
- 2、hidden_states的norm方法
- 3、后续源码
- 七、数据再次进入LlamaForCausalLM类
- 1、lm_head加工
- 2、loss计算?和返回内容
前言
如果只是简单构建训练与推理的大语言模型,还是比较简单,直接使用huggignface调用即可。然而,理解其源码或内部原理是比较麻烦的,尽管我在之前文章给出了很多解释,但我还是想通过数据流走向来解读模型整个流程与源码内部机理。这样,我们可方便更深入的理解大语言模型!
一、数据进入LlamaForCausalLM(LlamaPreTrainedModel)类
数据转成input_ids与attention_mask后该如何转换,我们首先看到原始数据会进入到下面调用方法self.model,其如下图:
我们知道input_ids与attention_mask是[1,96],是未进行embedding!