当前位置: 首页 > backend >正文

0719代码调试记录

文章目录

  • 工程介绍
  • 一开始的方案
  • 查找bug
    • 问题1
    • 问题2
    • 问题3

工程介绍

今年3、4月参加了CVPR Workshop,赛道是XGC AI-Generated Video Assessment,主要考虑到实验室最近一年一直在做这方面的工作,参赛结果也还可以。我们的方案具体的可以去看我们的论文,代码也一并开源了。这两天觉得之前比赛的时候很多疑问没有完全解决好,比如对LLM结构的理解、每个token对结果的贡献度等等,再往后就是探索一下LLM在VQA任务中有没有一些比较有意思的实验性结论。于是这两天就开始在想怎么做一些可视化的实验,可以先直观地看出每个token的贡献度。

一开始的方案

项目里的LLM采用的是LLaMA2 7B,我看很多教程上说Hugging Face的transformer封装的模型可以直接通过设置output_attentions=Trueoutputs中返回每一层attention权重,于是我就直接做了修改

outputs = self.llm_model(inputs_embeds=inputs_embeds,attention_mask=attention_mask,output_attentions=True,output_hidden_states=True,·
)

但是返回的attentions全部都是None

查找bug

既然如此其实就无非以下几个问题:

  1. LLaMA2不支持返回attentions
  2. output_attentions参数没有正确传递到forward里。
  3. attention计算的时候没有保存权重。

问题1

查看了一下hugging face里的LLaMA2的说明文档,确实是有返回attentions的,因此肯定是可以返回注意力权重的。
在这里插入图片描述

问题2

通过断点调试的方法,在LlamaForCausalLMforward函数中查看output_attentions是否正确传入:
在这里插入图片描述

事实上确实传入了,那就只有第三种可能了。

问题3

Attention的计算是在LlamaAttention中,如下所示:
在这里插入图片描述
这里一开哦是调用的是eager方法,但是我们发现:
self.config._attn_implementation = sdpa
经查询后发现,sdpa和eager是两种注意力计算方法。如果采用sdpa计算,是无法返回注意力权重矩阵的,其采用了 FlashAttention 这样的底层实现,通过分块(Tiling)计算,完全避免了实例化和存储完整的注意力分数矩阵,从而极大节省了显存。但是Eager注意力计算方法需要存储中间结果。
因此,一个很简单的解决方案就是,把注意力计算方法直接换成eager就可以:
在这里插入图片描述
如此,我们就可以在主函数中获得attention矩阵!

http://www.xdnf.cn/news/15893.html

相关文章:

  • IsaacLab学习记录(四)
  • Milvus Dify 学习笔记
  • 题单【循环结构】
  • 基于单片机出租车计价器设计
  • 30天打牢数模基础-决策树讲解
  • 【C语言】字符串与字符函数详解(上)
  • C++ 并发 future, promise和async
  • 数位 dp
  • 「Java案例」利用方法打印乘法表
  • WPF学习笔记(28)Interaction.Triggers的意义与使用方式
  • dify创建OCR工作流
  • NX584NX559美光固态闪存NX561NW993
  • AI(学习笔记第六课) 使用langchain进行AI开发 load documents(csv和文件夹)
  • 开源社区贡献指南:如何通过Three.js插件开发提升企业技术影响力?
  • Windows批量修改文件属性方法
  • swift-关联性/范型
  • 每日算法刷题Day50:7.20:leetcode 栈8道题,用时2h30min
  • 深度学习方法生成抓取位姿与6D姿态估计的完整实现
  • Python应用进阶DAY10--模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
  • 设计模式笔记(1)简单工厂模式
  • 【图论】图的定义与一些常用术语
  • thinkphp8\guzzlehttp上传文件应用示例
  • Linux基础命令详解:从入门到精通
  • prometheus 黑盒监控和docker检测
  • git操作
  • Node.js:常用工具、GET/POST请求的写法、工具模块
  • ByteBuf 体系的设计与实现
  • `tidyverse` 长表、宽表的处理
  • 【HarmonyOS】ArkUI - 自定义组件和结构重用
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM