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

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.dtcms.com/a/288942.html

相关文章:

  • 【星海出品】python安装调试篇
  • 网络安全隔离技术解析:从网闸到光闸的进化之路
  • Spring Boot总结
  • RabbitMQ核心组件浅析:从Producer到Consumer
  • 深入理解设计模式:访问者模式详解
  • 深入理解浏览器解析机制和XSS向量编码
  • Java中List<int[]>()和List<int[]>[]的区别
  • React-Native开发环境配置-安装工具-创建项目教程
  • 数据并表技术全面指南:从基础JOIN到分布式数据融合
  • Pinia 核心知识详解:Vue3 新一代状态管理指南
  • 六边形滚动机器人cad【7张】三维图+设计书明说
  • [数据库]Neo4j图数据库搭建快速入门
  • 反激电源中的Y电容--问题解答
  • Python类中方法种类与修饰符详解:从基础到实战
  • linux shell从入门到精通(一)——为什么要学习Linux Shell
  • MybatisPlus-14.扩展功能-DB静态工具-练习
  • 0401聚类-机器学习-人工智能
  • VSCode中Cline无法正确读取终端的问题解决
  • Github 贪吃蛇 主页设置
  • hot100——第八周
  • 【文件IO】认识文件描述符和内核缓冲区
  • docker Neo4j
  • 【论文阅读笔记】RF-Diffusion: Radio Signal Generation via Time-Frequency Diffusion
  • Vue3虚拟滚动实战:从固定高度到动态高度,告别列表卡顿
  • 从零开始的云计算生活——番外5,使用ELK实现对应用日志的监控
  • lvs调度算法(10种)
  • 【Docker基础】Docker-compose常用命令实践(一):服务生命周期管理
  • LVS技术详解与实战
  • Python dataclass 高阶用法与技巧
  • QML 图形效果详解