挺有意思的一篇论文 Stealing Part of a Production Language Model(arxiv2403.06634),给出了一种通过black-box API查询来恢复LLM投影矩阵的方法。实际意义嘛...可以拿来蒸馏?但是成本还挺高的( 同期工作 Logits of API-Protected LLMs Leak Proprietary Information arxiv/2403.09539 简单讲一下Algorithm 1(其他的看不懂 这里假设攻击者的能力是可以拿到LLM的Logit-Vector API,也就意味着可以拿到每个token对应的logits,注意这里还没有过softmax,所以算法里没有考虑softmax的影响。这个假设其实很强,之后会慢慢放开到目前商用的API。 假设LLM的hidden-dim是$h$,词表大小是$l$。那么我们可以假设一个$n$,也就是查询API的次数,我们希望它比$h$要大。每次查询,我们输入LLM随机的前缀作为Prompt,那么我们会拿到一个长为$l$的logit-vector。 虽然论文里没讲,但这里
为什么开始看量化了,我也不知道 量化原理 我们一般谈LLM的精度,会涉及到FP32,FP16,BF16,INT8,INT4等字样。这些字段确定了LLM中一个参数所占的内存空间(如FP32指4字节浮点数,FP16和BF16指2字节浮点数,其中BF具有更多的指数位,INT8/4分别占8/4个比特)。其中INT8/4就涉及了模型量化,一个浮点数如何量化成一个定点数,这是量化干的最基本的事儿。 最直观的想法就是一组浮点数除去他们的ABS MAX,这些参数就落在了[-1,1]之间,然后根据量化位数N的不同乘以对应的步长$2^{N-1}$,接下来得到的数就是量化结果啦。 但上面这个问题在于浮点数的分布不均时,量化空间会有所浪费,所以实际应用时会进行一定的截断。 量化结束后,这组浮点数(weight/activation)就以定点数的形式存了下来。那么如何利用量化后的权重/激活呢?我们知道量化的时候一个浮点数先除了一个ABS MAX,再乘了一个$2^{N-1}$,那么$2^{N-1}/MAX$就是一个$\Delta$,我们实际做运算的时候额外把这个数除一下就可以了,比如$WX = \frac {
DDPM中建模的$q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)$满足正态分布, $$ q(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0) = \mathcal{N}(\mathbf{x}_{t-1}; \tilde{\boldsymbol{\mu}}(\mathbf{x}_t, \mathbf{x}_0), \tilde{\beta}_t \mathbf{I}) \\ \tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \cdot \beta_t $$ DDIM中建模的$q_\sigma(\mathbf{x}_{t-1} \vert \mathbf{x}_t, \mathbf{x}_0)$如下,第一个等式二三步用到了重参数技巧和多个独立高斯分布的等价形式, $$ \begin{aligned} \mathbf{x}_{t-1} &= \sqrt{\bar{\alpha}_{t-1}
最近看到一个写的挺好的多任务框架(https://github.com/SwinTransformer/AiT,参考了detectron2),分享一下~ 多任务训练一般分为两种:data mixing 和 batch mixing。简单来说,对于前者,一个batch中的样本可以来自不同任务,而后者一个batch中任务都是一样的。两者相比,后者实现更加容易,效率更高,并且做数据增强也更方便一点(由Pix2Seq提出,但其实数据增强我认为并不是两者的主要差异)。 先给出我写的一个batch mixing的例子(来自JJJYmmm/Pix2SeqV2-Pytorch): def get_multi_task_loaders(tokenizer,tasks): assert set(tasks) <= set(['detection', 'keypoint', 'segmentation', 'captioning']) train_loaders = {} valid_loaders = {} if 'detection' in tasks:
复现多卡训练项目经常会遇到一些匪夷所思的问题,包括但不限于numpy<1.2.0 && numpy>=1.2.0,OSError: [Errno 12]。以下给出尽可能"少犯错"的几个步骤: 拿到一个项目,首先检查包依赖(如requirements.txt),如果使用conda管理虚拟环境,建议每个项目都创建一个env,conda一般会存有各个包的cache,所以不用担心重新搭建一个环境的时间成本;如果作者提供了docker,优先使用docker 有些包会存在历史依赖,最经典的是numpy.float/numpy.int在numpy>=1.2.0后弃用,而有些包如boundary-iou还是沿用了旧版本的写法,所以遇到这种情况直接对着报错改包就行(如np.float->np.float64),当然也可以尝试版本回退 对于深度学习项目,如果允许先拿一张卡跑,因为多卡多进程debug信息很难处理 对于dataloader,统一先设置num_workers=0,有时候线程过多也会导致错误(例如共享内存shm不足导致的bus error)
Axuanz
Updating as per fate.