Skip to content

Commit

Permalink
Merge pull request #42 from LeoLin4258/update-docs
Browse files Browse the repository at this point in the history
Update docs
  • Loading branch information
shoumenchougou authored Dec 26, 2024
2 parents 6e14be3 + d422fd0 commit eca46f1
Show file tree
Hide file tree
Showing 17 changed files with 210 additions and 124 deletions.
43 changes: 35 additions & 8 deletions pages/RWKV-Architecture.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -455,23 +455,50 @@ RWKV-7 的架构代号是 “Goose(雁)” 。RWKV-7 **超越了 attention /

RWKV-7 的研究始于 2024 年 9 月,其预览版 `RWKV-7 "Goose" x070.rc2-2409-2r7a-b0b4a` 的训练代码首次提交于 RWKV-LM 仓库的 [commit](https://github.com/BlinkDL/RWKV-LM/commit/e1d143f526e28be61fc06571034dda179101a683) 中。

`RWKV-7 "Goose" x070.rc2-2409-2r7a-b0b4a` 的时间步递归公式:
![RWKV-7 完整架构图](./images/RWKV-Architecture/rwkv-7-architecture.jpg)

#### RWKV-7 架构优化细节[#rwkv-7-optimization-details]

<Callout type="info" emoji="ℹ️">
RWKV-7 采用了**动态状态演化**(Dynamic State Evolution),超越了 attention / linear attention 范式 $TC0$ 表达能力的根本限制。RWKV-7 拥有 $NC1$ 的表达能力,使其可以解决许多 attention 无法解决的问题。
</Callout>

简单地说,传统注意力机制(如 Transformer 的 QKV-softmax-attention)会将多个 ${k, v}$(key 和 value 的向量对)存储起来,通过 $q$(query,查询向量)去匹配 key,得到对应的 value 输出。

RWKV-7 不直接存储 ${k, v}$ 对,而是通过动态计算更新 state,从上下文动态学习 key 和 value 之间的关系,再使用更新后的 state 处理新的输入 $q$(在 RWKV 中是 $r$) 并得到输出。

具体而言,RWKV-7 模型拥有一个内部模型 $v ≈ k S^\top$ 。它需要拟合一个简单的目标:对于给定的两个向量序列 ${k_t}$ 和 ${v_t}$,通过 $S$(state)把 $k_i$ 转化为 $v_i$ ,输出的 $v$ 需要和目标的 $v$ 尽量接近。

为实现这个目标,RWKV-7 在推理时,对于 L2 损失函数 $\mathcal{L} = \frac{1}{2} \| v - k S^\top \|^2$ 自动模拟出动态的梯度下降,以此来持续训练内部模型 $v ≈ kS^\top$。

**state 的梯度公式:**

$$
S_t = S_{t-1} \left( \text{diag}(w_t) - \alpha_t^\top \beta_t \right) + v_t^\top \tilde{k}_t
\frac{\partial \mathcal{L}}{\partial S} = S k^\top k - v^\top k
$$

带权重衰减 $w_t$ 和学习率 $η_t$ 的 state 梯度下降公式:

$$
\alpha_t = \text{normalize}(k_t + b_t)
S_t = S_{t-1} \cdot \text{diag}(w_t) - \left( S_{t-1} k_t^\top k_t - v_t^\top k_t \right) \text{diag}(\eta_t)
$$

等价于:

$$
\beta_t = \alpha_t \cdot a_t
S_t = S_{t-1} \left( \text{diag}(w_t) - k_t^\top k_t \text{diag}(\eta_t) \right) + v_t^\top k_t \text{diag}(\eta_t)
$$

<Callout type="info" emoji="ℹ️">
其中,$a_t$ 可看作 in-context learning rate。RWKV-7 拥有很强的 ICL 能力。
</Callout>
RWKV-7 广义公式
$$
S_t = S_{t-1} \left( \text{diag}(w_t) + \text{a}_t^\top \text{b}_t \right) + \text{v}_t^\top \text{k}_t
$$

其中,合理的初始值选择为:

$$
\text{a} = -k ,\quad \text{b} = k \cdot \eta, \quad \text{v} = v, \quad \text{k} = k \cdot \eta
$$

**RWKV -7 与历史版本(RWKV5/6)的时间步公式和状态更新机制对比:**

Expand Down Expand Up @@ -509,7 +536,7 @@ def ref_fwd(r, w, k, v, a, b):

```
<Callout type="warning" emoji="⚠️">
RWKV-7 处于**早期预览版本**,其论文仍然由 RWKV 作者彭博和社区成员共同撰写。截至 2024 年 11 月,论文仍处于撰写阶段,暂无具体发布计划。
RWKV-7 论文由 RWKV 作者彭博和社区成员共同撰写。截至 2024 年 12 月,论文仍处于撰写阶段,暂无具体发布计划。
</Callout>


Expand Down
73 changes: 45 additions & 28 deletions pages/RWKV-Inference/Ollama.mdx
Original file line number Diff line number Diff line change
@@ -1,34 +1,37 @@
---
title: Ollama 推理教程 - RWKV推理
title: Ollama推理教程 - RWKV推理
description: 本教程将介绍如何使用 Ollama 运行 RWKV 模型推理,并与模型聊天对话。
keywords: Ollama RWKV,RWKV Ollama教程,怎么在Ollama中使用RWKV模型
---

import { Callout } from 'nextra/components'
import { Tabs } from 'nextra/components'

Ollama 是一个简单易用的开源本地大语言模型运行框架,支持在个人电脑上一键部署和运行各类开源模型,具有配置简单、资源占用低等特点。
<Callout type="info" emoji="ℹ️">
[Ollama](https://github.com/ollama) 是一个简单易用的开源本地大语言模型运行框架,支持在个人电脑上一键部署和运行各类开源模型,具有配置简单、资源占用低等特点。
</Callout>

随着 RWKV 社区成员 [@MollySophia](https://github.com/MollySophia) 的工作,Ollama 现已适配 RWKV-6 模型。

本章节介绍如何在 Ollama 中使用 RWKV-6 模型进行推理。

## 下载 RWKV v6 的 gguf 模型文件
## 下载 gguf 格式 RWKV 模型

Ollama 中我们建议使用 ``.gguf`` 格式的RWKV模型
Ollama 支持 `.gguf` 格式的模型,但 RWKV 官方仅发布了 `.pth` 格式模型。因此,我们需要从 [RWKV - GGUF 仓库](https://huggingface.co/latestissue) 下载 gguf 格式的 RWKV 模型

下载 gguf 格式的 RWKV 模型可参考 [llama.cpp 推理方法](https://rwkv.cn/llamacpp) 中 “获取 gguf 格式模型” 章节。
<Callout type="warning" emoji="⚠️">
RWKV gguf 模型有各种量化版本,建议使用 `Q5_1``Q8_0` 两种量化精度,更低的量化精度(如 `Q4_0``Q3_0` 等)可能会使模型的回答变得很差。
</Callout>

![rwkv_gguf](./imgs/ollama_rwkv_gguf.png)
## 创建模型的 Modelfile 文件

## 创建文本文件
在存放 RWKV gguf 模型文件的文件夹下创建名为 `Modelfile` 的文本文件,不需要后缀名。

在存放模型文件的同文件夹下创建文本文件,命名为 ``Modelfile``,此处创建的文本文件不包含后缀名。
![Modelfile](./imgs/ollama-Modelfile.png)

![Modelfile](./imgs/ollama_Modelfile.png)
之后使用“记事本”等文本编辑工具打开该文本文件,写入以下内容:

之后使用“记事本”或 VS code 打开该文本文件,然后写入以下内容:

```
```bash copy
FROM rwkv-6-world-1.6b-Q8_0.gguf

TEMPLATE """
Expand All @@ -43,38 +46,52 @@ PARAMETER stop "\n\n"
PARAMETER stop "\nUser:"
```

之后将第一行 ``FROM`` 之后修改为使用 RWKV 模型文件的文件名
将第一行 `FROM` 之后的 `rwkv-6-world-1.6b-Q8_0.gguf` 修改为你下载的 RWKV 模型文件名

注意:建议直接复制上面的内容到 ``Modelfile`` 内,确保 ``User:`` 后有一个空格, ``Assistant:`` 后没有空格;``{{ end }}Assistant:"""`` 上有空行,后面没有多余字符。
<Callout type="warning" emoji="⚠️">
建议直接复制上面的内容到 `Modelfile` 内,以确保 `User:` 后有一个空格, `Assistant:` 后没有空格;`{{ end }}Assistant:"""` 上有空行,后面没有多余字符。
</Callout>

![Modelfile](./imgs/ollama_Modelfile_content.png)
![Modelfile](./imgs/ollama-Modelfile-content.png)

## 下载 Ollama 客户端并安装
## Ollama 的下载与安装

可从 [Ollama 官网](https://ollama.com/) 下载 Ollama 安装程序
可从 [Ollama 官网](https://ollama.com/) 下载 Ollama 的安装程序

下载完成后,双击 exe 文件进行安装安装完成后 ``Ollama`` 自动启动,启动之后可在右下角查看 Ollama 的图标
下载完成后,双击 exe 文件进行安装安装完成后 `Ollama` 会自动启动,启动后可在系统任务栏看到 `Ollama` 图标

![ollama_icon](./imgs/ollama_icon.png)
![ollama-icon](./imgs/ollama-icon.png)

## 使用 Ollama 运行 RWKV 模型
## Ollama 运行 RWKV 模型

使用命令行在模型文件夹下执行
在 RWKV gguf 模型文件夹下打开终端,并执行 `ollama create` 命令

``` bash
``` bash copy
ollama create rwkv-6-world-1.6b-Q8_0 -f Modelfile
```
<Callout type="info" emoji="ℹ️">
`ollama create` 后面的模型名称改成你本地的 RWKV 模型,与 `Modelfile` 中的模型名称保持一致。
</Callout>

此处模型名称需与 ``Modelfile`` 中模型名称保持一致。
![ollama-create](./imgs/ollama-create.png)

![ollama_create](./imgs/ollama_create.png)

之后便可直接运行模型:
创建完毕后,使用 `ollama run` 命令直接运行模型:

``` bash
ollama run rwkv-6-world-1.6b-Q8_0
```

运行之后即可与模型进行 Chat。
成功运行后,即可与模型进行聊天对话:

![ollama-chat](./imgs/ollama-chat.png)

## Ollama GUI 和桌面程序

Ollama 本身并没有提供 GUI 或 WebUI 服务,但其社区提供了第三方 GUI 和桌面程序。

可以在 [Ollama 的 GitHub 文档](https://github.com/ollama/ollama?tab=readme-ov-file#web--desktop) 中查看所有第三方 Ollama 工具。

## 参考资料

![ollama_chat](./imgs/ollama_chat.png)
- [Ollama 官网](https://ollama.com/)
- [RWKV gguf 模型仓库](https://huggingface.co/latestissue)
5 changes: 3 additions & 2 deletions pages/RWKV-Inference/_meta.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"Ollama": "Ollama 推理教程",
"text-generation-webui": "Text Generation WebUI",
"KoboldCpp": "KoboldCPP 使用教程",
"Ollama": "Ollama 使用教程"
"KoboldCpp": "KoboldCPP 推理教程"
}

File renamed without changes
File renamed without changes
File renamed without changes
Binary file removed pages/RWKV-Inference/imgs/ollama_rwkv_gguf.png
Binary file not shown.
98 changes: 51 additions & 47 deletions pages/RWKV-Wiki/How-To-Play.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,39 @@ import { LinkToSvg } from '/components/svgs.tsx'
### Hugging Face

<Cards>
<Card icon={< LinkToSvg />} title="RWKV-6-7B 基础模型" href="https://huggingface.co/spaces/BlinkDL/RWKV-Gradio-2" />
<Card icon={< LinkToSvg />} title="RWKV-6-3B 基础模型" href="https://huggingface.co/spaces/BlinkDL/RWKV-Gradio-1" />
<Card icon={< LinkToSvg />} title="RWKV-6-World-7B-v3" href="https://huggingface.co/spaces/BlinkDL/RWKV-Gradio-2" />
<Card icon={< LinkToSvg />} title="RWKV-7-World-0.1B" href="https://huggingface.co/spaces/BlinkDL/RWKV-Gradio-1" />
</Cards>

### ModelScope

<Cards>
<Card icon={< LinkToSvg />} title="RWKV-6-7B 中文小说模型" href="https://modelscope.cn/studios/BlinkDL/RWKV-CHN-PRO" />
<Card icon={< LinkToSvg />} title="RWKV-6-7B 基础模型" href="https://modelscope.cn/studios/BlinkDL/RWKV-CHN" />
<Card icon={< LinkToSvg />} title="RWKV-6-World-7B-v3" href="https://modelscope.cn/studios/BlinkDL/RWKV-CHN-PRO" />
<Card icon={< LinkToSvg />} title="RWKV-6-World-7B-v3" href="https://modelscope.cn/studios/BlinkDL/RWKV-CHN" />
</Cards>

<Callout type="warning" emoji="⚠️">
💡上述公共 Demo 只能使用续写模式,不支持直接对话。
上述公共 Demo 只能使用续写模式,不支持直接对话。

如果你在公共 Demo 中体验 RWKV 模型,建议按以下两种格式输入 prompts :
</Callout>

``` text copy
```bash copy
User: hi

Assistant: Hi. I am your assistant and I will provide expert full response in full details. Please feel free to ask any question and I will always answer it.

User: (你的问题,比如“请为我推荐三本适合五岁小孩阅读的世界名著” )

Assistant:
```
或者:

``` text copy
```bash copy
Instruction: (你希望模型进行什么操作,比如“请将下列瑞典语翻译成中文”)

Input:(你希望模型处理的内容,比如“hur l?ng tid tog det att bygga twin towers”)

Response:
```

Expand Down Expand Up @@ -78,17 +78,21 @@ AI00 的具体用法可以参考 [Ai00 使用教程](https://rwkv.cn/ai00/Simple

### ChatRWKV

ChatRWKV 是 RWKV 官方的聊天机器人项目,但无图形化界面。你可能需要一定的命令行知识才能使用 ChatRWKV
ChatRWKV 是 RWKV 官方的聊天机器人项目,但无图形化界面。你可能需要一定的命令行知识才能使用 ChatRWKV。

[ChatRWKV 仓库地址](https://github.com/BlinkDL/ChatRWKV)

## 本地部署 RWKV 模型的性能需求[#VRAM-of-RWKV]

我们推荐使用 **FP16** 精度在本地部署并推理 RWKV 模型。当你的显存和内存不足时,可以使用 INT8 / NF4 量化运行 RWKV 模型,降低显存和内存需求。
推荐使用 **FP16** 精度在本地部署并推理 RWKV 模型。当你的显存和内存不足时,可以使用 **INT8 NF4 等量化方法**运行 RWKV 模型,降低显存和内存需求。

从回答质量来说,同参数的模型 FP16 回答质量最好,INT8 与 FP16 质量相当,NF4 回答质量相比 INT8 较明显地降低。
<Callout type="info" emoji="ℹ️">
从回答质量来说,同参数的模型 FP16 回答质量最好,INT8 与 FP16 质量相当,NF4 回答质量相比 INT8 明显降低。

模型的参数比量化更重要,比如 7B 模型 + INT8 量化,生成效果比 3B 模型 + FP16 更好。
</Callout>

以下是使用不同推理后端,以及多种量化(FP16、INT8、NF4) 本地部署并运行 RWKV 模型的显存占用和生成速度
以下是本地部署并运行 RWKV 模型的显存需求和生成速度

<Tabs items={['显存需求', '生成速度']}>
<Tabs.Tab>
Expand All @@ -100,27 +104,27 @@ ChatRWKV 是 RWKV 官方的聊天机器人项目,但无图形化界面。你

- CPU :i7-10870H
- GPU: RTX 3080 Laptop ,16G 显存
- 内存:32GB
- 内存:32G
</Callout>

| Strategy | 1B6 模型 | 3B 模型 | 7B 模型 | 14B 模型 |
| 推理后端 | 1B6 模型 | 3B 模型 | 7B 模型 | 14B 模型 |
| --- | --- | --- | --- | --- |
| CPU-FP32 | 6.6G内存 | 12GB内存 | 21G内存 | OOM(不建议使用) |
| rwkv.cpp-FP16 | 3.5G内存 | 7.6GB内存 | 15.7G内存 | 30GB(内存) |
| rwkv.cpp-Q5_1 | 2GB内存 | 3.7GB内存 | 7.2GB内存 | 12.4GB(内存) |
| CUDA-FP16 | 3.2GB显存 | 6.2GB显存 | 14.3GB显存 | 约28.5G显存 |
| CUDA-INT8 | 1.9GB显存 | 3.4GB显存 | 7.7GB显存 | 15GB显存 |
| webgpu-FP16 | 3.2GB显存 | 6.5GB显存 | 14.4GB显存 | 约29G显存 |
| webgpu-INT8 | 2GB显存 | 4.4GB显存 | 8.2GB显存 | 16G显存(量化41层,60层约14.8GB|
| webgpu-NF4 | 1.3GB显存 | 2.6GB显存 | 5.2GB显存 | 15.1G显存(量化41层,60层约10.4GB|
| webgpu(python)-FP16 | 3GB显存 | 6.3GB显存 | 14GB显存 | 约28G显存 |
| webgpu(python)-INT8 | 1.9GB显存 | 4.2GB显存 | 7.7GB显存 | 15GB显存(量化41层) |
| webgpu(python)-NF4 | 1.2GB显存 | 2.5GB显存 | 4.8GB显存 | 14.3GB显存(量化41层) |
</Tabs.Tab>
<Tabs.Tab>
不同推理后端/量化的生成速度(单位:TPS,约等于每秒多少字)。

| Strategy | 1B6 模型 | 3B 模型 | 7B 模型 | 14B 模型 |
| CPU-FP32 | 6.6G内存 | 12G内存 | 21G内存 | OOM(不建议使用) |
| rwkv.cpp-FP16 | 3.5G内存 | 7.6G内存 | 15.7G内存 | 30G(内存) |
| rwkv.cpp-Q5_1 | 2G内存 | 3.7G内存 | 7.2G内存 | 12.4G(内存) |
| CUDA-FP16 | 3.2G显存 | 6.2G显存 | 14.3G显存 | 约28.5G显存 |
| CUDA-INT8 | 1.9G显存 | 3.4G显存 | 7.7G显存 | 15G显存 |
| webgpu-FP16 | 3.2G显存 | 6.5G显存 | 14.4G显存 | 约29G显存 |
| webgpu-INT8 | 2G显存 | 4.4G显存 | 8.2G显存 | 16G显存(量化41层,60层约14.8G|
| webgpu-NF4 | 1.3G显存 | 2.6G显存 | 5.2G显存 | 15.1G显存(量化41层,60层约10.4G|
| webgpu(python)-FP16 | 3G显存 | 6.3G显存 | 14G显存 | 约28G显存 |
| webgpu(python)-INT8 | 1.9G显存 | 4.2G显存 | 7.7G显存 | 15G显存(量化41层) |
| webgpu(python)-NF4 | 1.2G显存 | 2.5G显存 | 4.8G显存 | 14.3G显存(量化41层) |
</Tabs.Tab>
<Tabs.Tab>
不同推理后端/量化(**默认量化所有层**)的生成速度(单位:TPS,约等于每秒多少字)。

| 推理后端 | 1B6 模型 | 3B 模型 | 7B 模型 | 14B 模型 |
| --- | --- | --- | --- | --- |
| CPU-FP32 | 4.36 | 2.3 | 极慢 | OOM(不建议使用) |
| rwkv.cpp-FP16 | 8.6 | 4.5 | 2 | 1 |
Expand Down Expand Up @@ -151,21 +155,21 @@ ChatRWKV 是 RWKV 官方的聊天机器人项目,但无图形化界面。你

由于架构设计,RWKV 在“回顾”能力上较弱。因此,**不建议**使用下面这种格式:

```
```bash copy
Input: 输入给模型的上下文内容,比如 “hello,I love you.”

Instruction: 你给模型的指令,比如“请将上面的英文翻译成中文”

Response:
```

如果 RWKV 模型先接收了输入的上下文内容(Input)再接收指令(INSTRUCTION),它在执行指令时可能会漏掉内容中的重要信息。
如果 RWKV 模型先接收了材料内容(Input)再接收指令(Instruction),它在执行指令时可能会漏掉内容中的重要信息。

但如果你先告诉模型要执行什么指令,然后再给模型输入上下文。模型就会先理解指令,然后使用指令来处理上下文的内容。就像这样:
但如果你先告诉模型要执行什么指令,然后再给模型输入材料内容。模型就会先理解指令,然后使用指令来处理材料内容。就像这样:

```
```bash copy
Instruction: 给模型的指令,比如“请将上面的英文翻译成中文”

Input: 输入给模型的上下文内容,比如 “hello,I love you.”

Response:
Expand All @@ -174,17 +178,17 @@ Response:

如下所示:

``` text copy
```bash copy
User: 把“hello,I love you.”翻译成中文

Assistant: 你好,我爱你。

User: 把“how are you?”翻译成中文

Assistant: 你好吗?

User: 把“I am fine, thank you.”翻译成中文

Assistant:
```
<Callout type="info" emoji="ℹ️">
Expand All @@ -194,7 +198,7 @@ Assistant:
## 如何调整模型的解码参数?[#RWKV-Parameters]

<Callout type="warning" emoji="⚠️">
如果你熟悉 Transfoemer 的相关解码参数,则无需阅读此章节。
如果你熟悉 Transformer 的相关解码参数,则无需阅读此章节。
</Callout>

你可能注意到了,很多 RWKV 部署/体验工具都支持调整 `Temperature``Top_P` 等 RWKV 模型解码参数。
Expand Down
Loading

0 comments on commit eca46f1

Please sign in to comment.