minicpm-v 从以上这张图来看,达到gpt4v性能所需的模型体量越来越小;(还是模型越大性能越好);minicpm-2.5的优势主要在于:1.在opencompass上的评分性能优于gpt4v;2可在端侧部署;3.强大的ocr能力;4.支持30多种语言;
python不用ide也能进行调试 使用 import pdb 和 pdb.set_trace() 是一种有效的调试方法,可以帮助你深入检查代码的执行过程和状态。import pdb 和 pdb.set_trace() 是 Python 中用于调试代码的工具。调用 pdb.set_trace() 后,程序的执行会暂停,允许你检查当前的变量状态、调用栈等信息。pdb.set_trace() 是一个函数调用,当程序执行到这一行时,会触发调试器进入交互模式。通过 import pdb 语句,你可以引入这个模块,从而使用其提供的调试功能。
pytorch--流水线并行 为了构建PipelineStage,需要提供包含了nn.Parameters and nn.Buffers的nn.Module,同时定义了能够执行对应stage的forward函数。流水线并行(pipelining )部署实施起来非常困难,因为这需要根据模型的weights把模型分块(通常涉及到对源码的修改),此外,分布式的调度和数据流的依赖也是要考虑的点;PipelineStage需要知道输入输出的shape大小,方便创建通信缓存,shapes必须是固定大小的,也就是训练执行的时候它不能是变化的;
multimodel ocr dataset 再finetune阶段是混合的策略,对于需要高分辨率的任务,比如说图表,就采用的分辨率HD55,,有一些是origin_size。当固定token数目的时候,是否使用换行符影响不大,但是tokens数目非常动态的时候,不使用换行符会导致性能降低;在其他任务上,提升分辨率带来的收益比较小,但是对于ocr任务而言,提升分辨率带来的收益比较大;然后为了保留图片的2D信息,每一行结束的时候有个的分隔符,不同view之间有个sp分割符。blip3训练的时候没有带上框,论文里面说可以训练下带上框的潜力;
NLP大模型的训练 接下来会在特定任务上进行finetune==>supervised finetuning (SFT)这里列举两种:MLM和NSP,NSP由于在某些论文中被证明是无效的,所以用的少;1.先进行通用任务的训练;无监督的样本是无穷无尽的;
代码规范工具 然后可以在pre-commit的config里面配置需要的代码规范;这样子代码检查的规范的执行就会注册在git的hook当中。有些规范不会帮你修改,只会报错,比如flake8;然后可以在代码仓里面配置pre-commit。commit的时候会触发hook帮你检查;有些规范可以帮你修改,
关于- bounding box reparameterization 因为detr以及大部分detr的变体都是将box的x,y,w,h映射到[0~1]之间;这样对于小目标的检测的话就会比较困难,因为损失被大目标主导了,
Group DETR 所以groupDETR提出的方法是在训练的时候用多组query,每组内仍然保持一对一匹配,推理的时候只用任意一组query就可以不用NMS了;1.如果增加query的数量,是可以提升检测性能的,但是计算开销也会增大,原因在于query个数越多,越容易命中目标;2.如果改成一对多的匹配,比如把一个gt匹配上2个positive box,可以加速收敛,提升一点性能;groupDETR要解决的问题是:既能够一对多的匹配,又能够不用NMS,节约计算开销;但是会导致使用的时候需要用到NMS;
mmdetection及mmengine源码结构 mmdet的注册机机制是基于装饰器实现的,Register这个类中有一个装饰器函数register_module(),通过这个装饰器函数可以把类/函数装入到Register这个类的成员变量_module_dict中,_module_dict的目的是维护每个注册器中的类和函数到字符串的映射;个人感觉跟C++中的虚函数的概念和目的是有区别的,虚函数的目的是相同的函数名,不同的对象会调用不同的虚函数实现;然后我们就可以把需要的函数/类注册到对应的register的_module_dict里面;
transformer比CNN好在哪里 1.Dynamic比static好:transformer的参数是随着输入变化的,不像CNN是fixed住的;动态参数提取特征的能力会更强,所以很多CNN也在朝Dynamic的方向发展,比如Dynamic cov,Dynamic relu;2.attention机制更关注不同feature之间的相对关系,对于绝对的value值并不敏感(对于形变和噪声不敏感),所以相对于CNN具有更好的普适性;而CNN更关注对于局部的描述(类似于传统算法中的特征点提取);(在此过程中也会损失掉分辨率);
Tensor core原理 Tensor core是nvidia底层执行运算的硬件单元,不同于nvidia以往的cuda core(全浮点型),Tensor core是近几年推出来的、混合精度的、将累加和累乘放在一起的计算硬件;混合精度指的是在输入、输出的时候使用FP16,计算的时候使用FP32;在GPU编程中,"kernel"一词有特定的含义,与计算机操作系统中的内核不同。在GPU编程中,"kernel"是指在并行计算中由多个线程同时执行的函数。它是在GPU上执行的并行计算任务的入口点。
swin-transformer在Jeston Nx部署 1.arm\x86-64的区别指令集不一样2.arm架构上的conda要安装miniforge3.arm上的ubuntu的软件管理器是pacman,这个安装起来也有点麻烦,因为这个库有一些前置依赖库pkg-config;4.如果dockerfile里面的CMD和entrypoint什么都没写的,直接docker run起来的容器会很快退出,而且没有log,如果要在容器中停留比较久的话需要-it进入交互式界面;6.cmake。
关于深度学习训练的工程技巧 符号位表示数的正负,指数位用于表示数的指数部分,尾数位用于表示数的尾数部分。线性层和卷积层,本质上都是线性操作,卷积层相当于共享参数的线性操作,但是self-attention是高阶的非线性操作,ResNet是由齐次运算堆叠而成,关注局部区域,而transformer是由非齐次运算堆叠而成,关注更大区域和更高的语义,齐次和非齐次运算的雅可比矩阵有非常不同的特性,会导致不同的优化难度;雅可比矩阵的连乘可以得到对某个参数的导数,根据该导数可以对该参数进行更新,关于具体的更新方式,不同的优化器有不同的方式;
视觉目标检测及分割任务中使用解耦头的好处 什么是解耦头?在做实例分割时,我们需要输出分类置信度图和实例mask图;在做目标检测时,我们需要输出目标的分类和边框位置;所以,这两类任务都需要输出分类和位置!采用两个不同的头解耦输出分类和位置,称为decoupled;其中目标检测的解耦头如下图所示:solov2的解耦头如下图所示:为什么要用到解耦头?因为分类和定位的关注点不同!分类更关注目标的纹理内容!定位更关注目标的边缘信息!如上图所示分类更关注中心的内容区域,而边框回归更关注边缘信息!有实验表明使用解耦头之后目标检测任务
两个不规则的box求取IOU-python 第一步:构造该框以四条线段表示该框,构造一个二进制的mask因为框里的像素只需满足四个公式,在L4的下面,在L2的上面,在L1的左边,在L3的右边第二步:相与和相或两框的mask相与求交集,相或求交集,载相除得到iouimport osimport numpy as npdef get_k(x1,y1,x2,y2,x3,y3,x4,y4): k1=(y2-y1)/(x2-x1) k2=(y3-y2)/(x3-x2) k3=(y4-y3)/(x4-x3) k4=.