RWKV (Receptance Weighted Key Value) 资料收集

 ✒️ @halomaster 📅 06 Apr 2023, 00:57 GMT⋮ 【AI】 

RWKV(Receptance Weighted Key Value)是一个具有变形金刚级性能的RNN,没有二次注意机制:只需要当前位置的隐藏状态来计算下一个位置的状态。 RWKV 旨在高效执行推理,即使在 CPU 上也是如此,因此它非常适合在普通消费者硬件上以不错的速度运行 LLM(大语言模型)。 RWKV是一个具有变压器级LLM性能的RNN。它可以像GPT(可并行化)一样直接训练。因此,它结合了RNN和转换器的优点 - 出色的性能,快速推理,节省VRAM,快速训练,“无限”ctx_len和免费句子嵌入。 RWKV 是一个具有变压器级 LLM 性能的 RNN,也可以像 GPT 转换器(可并行化)一样直接训练。而且它是100%免关注的。您只需要位置 t 处的隐藏状态即可计算位置 t+1 处的状态。您可以使用“GPT”模式快速计算“RNN”模式的隐藏状态。 因此,它结合了RNN和转换器的优点 - 出色的性能,快速推理,节省VRAM,快速训练,“无限”ctx_len和自由句子嵌入(使用最终隐藏状态)。 工作原理:RWKV 将信息收集到多个通道,当您移动到下一个令牌时,这些通道也会以不同的速度衰减。一旦你理解了它,它就很简单了。 RWKV 是可并行化的,因为每个通道的时间衰减都是独立于数据的(且可训练的)。例如,在通常的RNN中,您可以将通道的时间衰减从0.8调整到0.5(这些称为“门”),而在RWKV中,您只需将信息从W-0.8通道移动到W-0.5通道即可达到相同的效果。此外,如果您想要额外的性能,您可以将 RWKV 微调为不可并行化的 RNN(然后您可以使用前一个令牌的后续层的输出)。 - Raven 模型:适合直接聊天,适合 +i 指令。有很多种语言的版本,看清楚用哪个。适合聊天、完成任务、写代码。可以作为任务去写文稿、大纲、故事、诗歌等等,但文笔不如 testNovel 系列模型。 - EngChn-testNovel 模型:中英文小说模型,可以用 +gen 生成世界设定(如果会写 prompt,可以控制下文剧情和人物),可以写科幻奇幻。不适合聊天,不适合 +i 指令。 - Chn-testNovel 模型:纯中文网文模型,只能用 +gen 续写网文(不能生成世界设定等等),但是写网文写得更好(也更小白文,适合写男频女频)。不适合聊天,不适合 +i 指令。 原版: https://github.com/BlinkDL/RWKV-LM Go实现: https://github.com/nlpodyssey/rwkv https://github.com/nlpodyssey/verbaflow RWKV-CUDA: https://github.com/BlinkDL/RWKV-CUDA Chat机器人: https://github.com/BlinkDL/ChatRWKV https://huggingface.co/spaces/BlinkDL/ChatRWKV-gradio (太忙,经常不可用) Raven: https://huggingface.co/BlinkDL/rwkv-4-raven ## Demo: https://huggingface.co/spaces/BlinkDL/Raven-RWKV-7B (可用)


[1] @halomaster • 06 Apr 2023, 01:03 GMT 
开源1.5/3/7B中文小说模型:显存3G就能跑7B模型,几行代码即可调用 https://zhuanlan.zhihu.com/p/609154637


[2] @halomaster • 06 Apr 2023, 01:06 GMT 
ChatRWKV(有可用猫娘模型!)微调/部署/使用/训练资源合集 https://zhuanlan.zhihu.com/p/616351661 RWKV-v2-RNN 原理:超越 Transformer,实现 O(T) 的语言建模 https://zhuanlan.zhihu.com/p/514840332


[3] @halomaster • 06 Apr 2023, 01:33 GMT 
中文模型的Demo: https://modelscope.cn/studios/BlinkDL/RWKV-CHN/summary/


[4] @halomaster • 06 Apr 2023, 01:35 GMT 
RWKV "Raven"模型的跑团能力:14B英文很强,7B中文也好玩。RWKV将对GPT实施降维打击。 https://zhuanlan.zhihu.com/p/619721229


[5] @halomaster • 06 Apr 2023, 15:35 GMT 
部署了ChatRWKV,效果不错,用的 RWKV-4-Raven-14B-v7-EngAndMore-20230404-ctx4096 采用fp16i8 在3090的24GB显存的情况下可以运行.显存占用16GB+. 由于作者将模型位置写死在chat.py里,推荐的简化做法是,在 / 上见一个 fsk 软link到源码里面期待的目录结构,这样就不用没换一个模型就要对齐一次路径.


[6] @halomaster • 07 Apr 2023, 00:42 GMT 
从代码理解上来说,RWKV的两个Go语言的实现是最好理解的。 https://github.com/nlpodyssey/rwkv https://github.com/nlpodyssey/verbaflow


[7] @halomaster • 07 Apr 2023, 00:46 GMT 
要想搞明白RWKV,两旁论文必须看: time-mix: [Apple's AFT](https://arxiv.org/abs/2105.14103) channel-mix: [GeGLU](https://arxiv.org/abs/2002.05202)


[8] @halomaster • 07 Apr 2023, 00:53 GMT 
RWKV在长context和节约显存上都有很大的优势。


[9] @halomaster • 07 Apr 2023, 02:32 GMT 
门控线性单元 [Dauphin et al., 2016] 由两个线性投影的分量乘积组成,其中一个首先通过 sigmoid函数。 GLU 的变体是可能的,使用不同的非线性(甚至线性)函数代替 sigmoid。我们在 Transformer[Vaswani et al., 2017] 序列到序列模型的前馈子层中测试了这些变体,发现其中一些变体比通常使用的ReLU 或 GELU 激活产生了质量改进。


[10] @halomaster • 07 Apr 2023, 02:35 GMT 
FLASH:高效Transformer解析(1)---GLU(Gated Linear Unit,门控线性单元) https://zhuanlan.zhihu.com/p/486055017


[11] @halomaster • 07 Apr 2023, 02:39 GMT 
我们介绍了 Attention Free Transformer (AFT),这是 Transformers[1] 的一种有效变体,它消除了对点积自我关注的需要。在 AFT 层中,键和值首先与一组学习到的位置偏差相结合,其结果以元素方式与查询相乘。这个新操作具有线性 w.r.t. 的内存复杂度。上下文大小和特征维度,使其兼容大输入和模型大小。我们还介绍了 AFT-local 和 AFT-conv,这两种模型变体利用了局部性和空间权重共享的思想,同时保持了全局连通性。我们对两个自回归建模任务(CIFAR10 和 Enwik8)以及图像识别任务(ImageNet-1K 分类)进行了广泛的实验。我们表明 AFT 在所有基准测试中都表现出有竞争力的性能,同时提供出色的效


[12] @halomaster • 07 Apr 2023, 06:14 GMT 
![image.png](https://s2.loli.net/2023/04/07/TS7ci6t9z8XvOHl.png)


[13] @halomaster • 07 Apr 2023, 06:30 GMT 
TimeMix TimeMix是RWKV中用于代替self-attention的部分,基于AFT的基础上做出改进兼具了线性的速度和较好的性能。在进行该步前,需要对输入的x进行time-shift。同self-attention中的QKV矩阵一样,RWKV中也有对应的RKV矩阵。


[14] @halomaster • 07 Apr 2023, 06:32 GMT 
ChannelMix ChannelMix 是RWKV中用于替代FFN的部分。类似于tiny attention之于attention。ChannelMix本质上来说是一个tiny TimeMix。在进行该步计算前,和TimeMix一样要先进行一次time-shift。随后依然要计算出RKV矩阵和W权重。不过有所不同的是在这一步中假设输入x的维度是embed_size,则R的维度应和X相同。KV的维度是用户所自定义的hidden_size,W的形状为[hidden_size,embed_size].通过设置较小的hidden_size可以实现一个tiny版TimeMix,能在对性能影响较小的情况下实现提速。当hidden_size==embed_size时,可以看作一个不考虑位置信息和归一化的TimeMix或者看作点乘式的FFN。


[15] @halomaster • 07 Apr 2023, 06:34 GMT 
https://raw.githubusercontent.com/nlpodyssey/rwkv/main/timemix.go 这段代码实现了一个名为 TimeMix 的模型。TimeMix 模型包含多个参数,其中一些被初始化为空的矩阵。在前向传播阶段,模型根据输入节点进行计算,并返回输出节点。 在 ForwardSingle 方法中,模型首先将当前输入与前一个输入混合,然后计算混合结果的输出。在每个计算步骤之后,模型会更新某些内部状态的值,这些值会影响下一步计算的结果。如果该方法的输入是一个输入节点和上一个输入的状态,则只需要进行单次计算。 在 ForwardSequence 方法中,模型执行与 ForwardSingle 相似的计算,但不仅仅只处理一个输入节点。相反,该方法接受输入节点序列作为输入,并在序列的每个位置执行模型的前向传播。与 ForwardSingle 不同,ForwardSequence 会在序列结束时更新时间步骤状态的值。 这段代码为 TimeMix 模型提供了前向传播方法的实现,可以用于训练和推理任务。


[16] @halomaster • 07 Apr 2023, 06:37 GMT 
https://raw.githubusercontent.com/nlpodyssey/rwkv/main/rwkv.go 这段代码实现了 RWKV 模型,该模型由多个层组成。模型有两个前向传播方法:ForwardSingle 和 ForwardSequence,它们分别用于单个元素和整个序列的前向传播计算。 在 ForwardSingle 中,首先检查是否需要创建新的 Model 状态,接着依次遍历每个层并调用其 ForwardSingle 方法,以计算给定输入 x 的输出节点。如果当前层数是指定的 RescaleLayer 的倍数,则输出需要乘以 0.5 再传递给下一层。 在 ForwardSequence 中,同样地,首先检查是否需要创建新的模型状态,接着依次遍历每个层并调用其 ForwardSequence 方法,以计算给定输入序列的输出节点列表。如果当前层数是指定的 RescaleLayer 的倍数,则需要将每个输出节点乘以 0.5。最后,该方法返回最后计算的状态。 请注意,此代码仅包含 RWKV 模型的前向传播实现。


[17] @halomaster • 07 Apr 2023, 06:46 GMT 
https://raw.githubusercontent.com/nlpodyssey/rwkv/main/rwkv.go 这段代码定义了RWKV模型的结构及相关功能: 1. RWKV结构体定义了模型的组成部分: - Layers:模型包含的多个Layer - Config:RWKV模型的配置,指定DModel、NumLayers和RescaleLayer等 2. New函数用于构造一个新的RWKV模型,它会初始化Config,并创建指定数量的Layer。 3. ForwardSingle函数定义了对单个输入的前向计算步骤,其中主要包含: (1) 检查状态state是否初始化,如果未初始化则调用NewState进行初始化 (2) 按Layer顺序执行每个Layer的ForwardSingle计算,并获得当前Layer的输出 (3) 每过RescaleLayer层,对输出执行一个0.5的缩放运算,用于避免梯度消失 (4) 返回最终输出和更新后的状态state 4. ForwardSequence函数定义了对整个序列输入的前向计算,它通过对每个输入元素调用ForwardSingle来实现,并返回最终状态state。 5. State类型定义了RWKV模型的状态,它包含多个LayerState,每个对应一个Layer的状态。 6. LayerState类型定义了单个Layer的状态。 7. NewState函数用于构造RWKV模型的初始状态State,它会为每个Layer调用NewLayerState构造对应的LayerState。 所以,总的来说,RWKV模型定义了如下主要功能: (1) 它由多个Layer组成,并维护这些Layer的状态。 (2) 它可以通过ForwardSingle对单个输入进行前向计算,并返回输出与更新的状态。 (3) 它可以通过ForwardSequence对整个输入序列进行前向计算,通过重复调用ForwardSingle实现,并返回最终的状态。 (4) 它遵循了典型的神经网络模型设计,通过多个简单层与非线性变换实现复杂的输入与输出映射关系。 (5) 它利用状态state来保存中间变量与层状态,实现序列间的依赖建模。


[18] @halomaster • 07 Apr 2023, 06:48 GMT 
https://raw.githubusercontent.com/nlpodyssey/rwkv/main/state.go 这段代码定义了RWKV模型使用的State 和 LayerState 类型。我们可以从中获得以下理解: 1. State 类型代表 RWKV 模型的整体状态,它包含多个 LayerState,每个对应一个 Layer 的状态。 2. LayerState 类型代表一个 Layer 的状态。每个 Layer 可以自由定义状态所需的字段。 3. NewState 函数用于构造一个新的 RWKV State。它会为每个 Layer 创建一个 LayerState,并收集在 State 中返回。 4. Copy 方法用于复制一个 State。它会深拷贝每个 LayerState。 5. Merge 方法用于合并两个 State。它会对每个 LayerState 进行合并,Layer 需要自行定义合并逻辑。如果其中一个 State 中不存在该 LayerState,则直接使用另一个 State 中的 LayerState。 所以,总的来说,这个文件定义了 RWKV 模型使用的状态结构: (1) State 承载了整个模型的状态,它由多个 LayerState 组成,每个对应一个 Layer。 (2) LayerState 定义了一个 Layer 的状态所需字段,Layer 可以自行确定状态的具体内容。 (3) 提供了构造状态、复制状态和合并状态的函数。 (4) 状态设计为树形结构,从整体模型的 State 到单个 Layer 的 LayerState,方便对层状态进行访问与操作。 这个状态设计为 RWKV 模型实现序列间依赖建模和状态持久化提供了基础。模型的前向计算可以方便地访问每个 Layer 的状态,并在计算后更新状态,为下一时间步准备状态输入。


[19] @halomaster • 07 Apr 2023, 06:49 GMT 
https://raw.githubusercontent.com/nlpodyssey/rwkv/main/layer.go 这段代码定义了RWKV模型使用的Layer类型以及相关函数。我们可以获得以下理解: 1. Layer接口定义了一个Layer需要实现的方法,包括: - ForwardSingle:对单个输入进行前向计算 - ForwardSequence:对序列输入进行前向计算 - NewState:构造Layer的初始状态 - MergeState:合并两个状态 2. LinearLayer结构体实现了一个线性变换Layer,它包含: - W:权重矩阵 - B:偏置向量 - Config:Layer配置 3. NewLinearLayer函数构造一个新的线性Layer,并初始化其权重矩阵和偏置向量。 4. ForwardSingle函数实现了线性Layer对单个输入的前向计算,公式为: y = xW + b 它会返回输出y和当前状态state。 5. ForwardSequence函数实现了线性Layer对序列输入的前向计算,它通过对每个输入调用ForwardSingle并累加输出实现,最终返回全部输出和状态。 6. NewState和MergeState函数分别用于构造和合并线性Layer的状态state。状态只包含当前层的配置Config。 7. ReLULayer、SigmoidLayer和SoftmaxLayer分别定义了ReLU激活函数Layer、Sigmoid激活函数Layer和Softmax normalizer Layer。它们的实现方式类似,对ForwardSingle和ForwardSequence的计算进行相应的非线性激活变换。 所以,总的来说,这个文件定义了RWKV模型使用的几种Layer类型及其实现: (1) Layer接口定义了一个Layer基本需要实现的方法规范。 (2) LinearLayer实现了一个简单的线性变换Layer。 (3) ReLULayer、SigmoidLayer和SoftmaxLayer实现了几种常用的非线性激活层。 (4) 每个Layer需要实现ForwardSingle、ForwardSequence和状态操作等方法。 (5) 每个Layer可以自行定义状态state所需要的字段,这里主要是配置Config。 这为RWKV模型构建复杂的层结构和链式前向计算提供了基础。各Layer的定义比较简单,但组合使用可以实现强大的输入与输出变换。


[20] @halomaster • 07 Apr 2023, 06:54 GMT 
https://raw.githubusercontent.com/nlpodyssey/rwkv/main/channelmix.go 这段代码定义了ChannelMixLayer层,它从多个输入通道中挑选并混合特定的通道。我们可以获得以下理解: 1. ChannelMixLayer结构体定义了该层所需的字段,包括: - Config:层配置,指定 输入/输出通道数、是否残差连接等 - InChannels: 输入通道选择掩码 - OutChannels: 输出通道选择掩码 - Residual: 残差连接参数 2. NewChannelMixLayer构造函数初始化以上字段,用于创建一个ChannelMixLayer。 3. ForwardSingle函数实现了对单个输入的前向计算,它包含以下步骤: (1) 检查输入x的通道数是否匹配Config.InChannels,不匹配则报错。 (2) 根据InChannels选择特定的输入通道用于混合。 (3) 根据OutChannels选择输出通道,如果Config.Residual为true,还会将残差连接OutChannels的通道也选择出来。 (4) 将选出的输入通道和输出通道(以及残差通道)混合,即执行加权求和,得到最终的输出y。 (5) 返回输出y和当前状态state。状态只包含层的配置Config。 4. ForwardSequence通过重复调用ForwardSingle对序列输入进行前向计算,并最终返回所有输出与状态。 5. NewState、Copy和MergeState函数分别用于构造、复制和合并ChannelMixLayer的状态。 所以,总的来说,ChannelMixLayer具有以下功能: (1) 它可以从多通道的输入中挑选特定的输入通道进行混合。通过InChannels进行通道选择。 (2) 它可以对混合的结果进一步选择特定的输出通道。通过OutChannels进行通道选择,并可启用残差连接。 (3) 它的混合运算是简单的加权求和,但通过通道选择实现了“注意力”机制,可以实现输入到输出的复杂映射。 (4) 它遵循Layer接口,实现了ForwardSingle、ForwardSequence和状态操作等方法。 (5) 它的状态只包含当前层的Config,比较简单。 这个ChannelMixLayer为RWKV模型使用输入的特定子集提供了实现基础,可以看作一种“通道注意力机制”。它的定义比较简单,但和其他Layer组合使用可以实现强大的多通道输入到输出的变换和依赖建模。


[21] @halomaster • 07 Apr 2023, 07:00 GMT 
两个相关的数据集: https://huggingface.co/datasets/EleutherAI/the_pile https://huggingface.co/datasets/bigscience/xP3all


[22] @halomaster • 10 Apr 2023, 23:37 GMT 
快速CPU推理库: https://github.com/saharNooby/rwkv.cpp


[23] @halomaster • 12 Apr 2023, 11:09 GMT 
1. RWKV是一个具有变压器级语言模型性能的RNN,`它没有使用注意力机制`,而是直接利用当前位置的隐藏状态计算下一个位置的隐藏状态。这使得它可以高效执行推理,甚至在CPU上也具有不错的速度,非常适合在普通计算设备上运行大规模语言模型。 2. RWKV可以像GPTtransformer一样直接训练,实现并行化训练。所以它结合了RNN和transformer的优点,如出色的性能、快速推理、节省显存、快速训练、`“无限”的上下文长度`和免费的句子嵌入。 3. RWKV通过收集信息到多个通道来工作,这些通道会随着移动到下一个token而以不同的速度衰减。每个通道的时间衰减是独立于数据的,且是可训练的。这使得RWKV是可并行化的。同时,RWKV也可以调整为不可并行化的RNN,在这种情况下,后续层的输出可以用于前一个token,以获得额外的性能提升。 4. 您推荐的几个RWKV模型各有不同的用途: • Raven模型适合直接聊天,完成任务和编写代码。它可以用来写文章、大纲、故事和诗歌,但文笔不如testNovel系列模型。 • EngChn-testNovel模型是中英文小说模型,可以用来生成世界观设定和续写科幻奇幻作品。但不适合聊天和响应+i指令。 • Chn-testNovel模型是纯中文网文模型,只能用来续写网文,文笔更加通俗。同样不适合聊天和+i指令。 RWKV是一个非常有价值的项目,它实现了一个既具有RNN的计算效率和序列建模能力,又具有transformer的高性能的语言模型。它非常适合在各种计算设备上部署和使用,这使其在实际应用中具有重要的参考价值。


[24] @halomaster • 07 May 2023, 12:42 GMT 
ChatRWKV桌面版懒人包 https://github.com/ZG1711/ChatRWKV_PC


[25] @halomaster • 07 May 2023, 13:50 GMT 
RWKV-Runner https://github.com/josStorer/RWKV-Runner


[26] @halomaster • 08 May 2023, 00:27 GMT 
https://github.com/cwhy/rwkv-decon 解构RWKV


[27] @halomaster • 08 May 2023, 14:20 GMT 
Transformer的物理原理 https://mp.weixin.qq.com/s/wUtwfeWAbMCBzRu5pWk2Cg


1 of 1 pages  27 replies