# RWKV.CN Machine-Readable Summary
## RWKV Papers
RWKV.CN currently lists 266 RWKV-related papers. The catalog was last updated on 2026-10-10.
- Human page: https://www.rwkv.cn/eco/papers
- Machine-readable summary: https://www.rwkv.cn/eco/papers/summary.json
- Machine-readable full list: https://www.rwkv.cn/eco/papers.json
- Current count: 266
- Last updated: 2026-10-10
## RWKV Projects
RWKV.CN currently lists 95 RWKV open-source and community projects. The catalog was last updated on 2026-10-19.
- Human page: https://www.rwkv.cn/eco/projects
- Machine-readable summary: https://www.rwkv.cn/eco/projects/summary.json
- Machine-readable full list: https://www.rwkv.cn/eco/projects.json
- Current count: 95
- Last updated: 2026-10-19
## RWKV Models
RWKV.CN currently lists 57 RWKV models and fine-tuned model resources. The catalog was last updated on 2026-09-21.
- Human page: https://www.rwkv.cn/eco/models
- Machine-readable summary: https://www.rwkv.cn/eco/models/summary.json
- Machine-readable full list: https://www.rwkv.cn/eco/models.json
- Current count: 57
- Last updated: 2026-09-21
## RWKV News
RWKV.CN currently lists 100 RWKV news, activities, and articles. The catalog was last updated on 2026-10-22.
- Human page: https://www.rwkv.cn/news
- Machine-readable summary: https://www.rwkv.cn/news/summary.json
- Machine-readable full list: https://www.rwkv.cn/news.json
- Current count: 100
- Last updated: 2026-10-22
## RWKV Apps
RWKV.CN currently lists 3 RWKV applications and demos.
- Human page: https://www.rwkv.cn/eco/app
- Machine-readable summary: https://www.rwkv.cn/eco/app/summary.json
- Machine-readable full list: https://www.rwkv.cn/eco/app.json
- Current count: 3
# Components Example
import React from 'react';
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
import { LearnMore } from 'components-docs/learn-more/learn-more.tsx';
import { File, Folder, Files } from 'fumadocs-ui/components/files';
import { Step, Steps } from 'fumadocs-ui/components/steps';
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
import { CardContainer } from '../../components-docs/card/card-container.tsx'
import { Card } from '../../components-docs/card/card.tsx'
import { PanelBottomDashed } from "lucide-react";
import { CallOut } from '../../components-docs/call-out/call-out.tsx'
import { TabsCN, TabsContentCN, TabsListCN, TabsTriggerCN } from "../../components-docs/tabs/tabs.tsx"
import { LinkCard, LinkCardContainer } from '../../components-docs/link-card/link-card.tsx'
import { TerminalWindow } from '../../components-docs/terminal-docs/terminal-docs.tsx'
import { ApiReference, ApiSchemaSection, ApiField } from '../../components-docs/api-reference/api-reference.tsx'
# MDX
### Code
#### 代码块支持的语言高亮以及语言关键字
请在[fumadocs](https://fumadocs.vercel.app/docs/ui/components/dynamic-codeblock)查看支持的语言和关键字
点击第一个下拉框就可以看见支持的语言和关键字
注意一些语言可能与你想想的不同
例如`Javascript`应该写为`js`
#### 复制(copy)
代码块默认支持copy,你不需要,也不应该在语言关键字后面加`copy`
````mdx
```js
const x = 1
function name(params) {
x ++
}
```
````
```js
const x = 1
function name(params) {
x ++
}
```
### Math
````mdx
```math
c = \pm\sqrt{a^2 + b^2}
```
````
```math
c = \pm\sqrt{a^2 + b^2}
```
***
**Long equations example**
```math
\displaystyle {\begin{aligned}T_{f}(z)&=\sum _{k=0}^{\infty }{\frac {(z-c)^{k}}{2\pi i}}\int _{\gamma }{\frac {f(w)}{(w-c)^{k+1}}}\,dw\\&={\frac {1}{2\pi i}}\int _{\gamma }{\frac {f(w)}{w-c}}\sum _{k=0}^{\infty }\left({\frac {z-c}{w-c}}\right)^{k}\,dw\\&={\frac {1}{2\pi i}}\int _{\gamma }{\frac {f(w)}{w-c}}\left({\frac {1}{1-{\frac {z-c}{w-c}}}}\right)\,dw\\&={\frac {1}{2\pi i}}\int _{\gamma }{\frac {f(w)}{w-z}}\,dw=f(z),\end{aligned}}
```
### Mermaid
````mdx
```mermaid
graph TD;
subgraph AA [Consumers]
A[Mobile app];
B[Web app];
C[Node.js client];
end
subgraph BB [Services]
E[REST API];
F[GraphQL API];
G[SOAP API];
end
Z[GraphQL API];
A --> Z;
B --> Z;
C --> Z;
Z --> E;
Z --> F;
Z --> G;
```
````
# 组件
### Accordion
```mdx
import React from 'react';
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
My Content
;
```
My Content
### 了解更多
用于收纳不影响主线操作的原理、实现细节和兼容性说明。默认保持收起,不要把必须执行的步骤或关键风险放入其中。
```mdx
import { LearnMore } from 'components-docs/learn-more/learn-more.tsx';
推理后端决定由哪套程序加载并运行模型。普通用户使用 Runner 预设即可。
```
推理后端决定由哪套程序加载并运行模型。普通用户使用 Runner 预设即可。
### Files
```mdx
import { File, Folder, Files } from 'fumadocs-ui/components/files';
```
### Image Zoom
图片放大已全局引用,正常使用图片md即可
```mdx

```
### Steps
```mdx
import { Step, Steps } from 'fumadocs-ui/components/steps';
### Read the docs
### Make sure you had read the docs
```
### Read the docs
### Make sure you had read the docs
### Tabs
```mdx
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
Javascript is weird
Rust is fast
```
Javascript is weird
Rust is fast
# 高级组件
### 卡片
```mdx
import { CardContainer } from '../../components-docs/card/card-container.tsx'
import { Card } from '../../components-docs/card/card.tsx'
import { PanelBottomDashed } from "lucide-react";
```
### 提示框
```mdx
import { CallOut } from '../../components-docs/call-out/call-out.tsx'
this is a info callout
support markdown
this is a warning callout
同样**支持 markdown**
字体为 15px
this is a alert callout
this is a error callout
```
this is a tips callout
support markdown
this is a info callout
support markdown
this is a warning callout
同样**支持 markdown**
字体为 15px
this is a alert callout
this is a error callout
#### 内容嵌套
```mdx
import { CallOut } from '../../components-docs/call-out/call-out.tsx'
**微调是什么?**
[this is a info callout](#)(Dimension-Sharding Adaptation)是一种新颖的参数高效微调方法(PEFT - Parameter-Efhcient Fine-Tuning),旨在进一步降低可训练参数数量,同时加速收敛。

```
**微调是什么?**
[this is a info callout](#)(Dimension-Sharding Adaptation)是一种新颖的参数高效微调方法(PEFT - Parameter-Efhcient Fine-Tuning),旨在进一步降低可训练参数数量,同时加速收敛。
### Tabs
高级tabs,你可以在 `TabsContentCN` 中嵌套任何组件,例如 `CallOut` 和 `image`:
```mdx
import { TabsCN, TabsContentCN, TabsListCN, TabsTriggerCN } from "../../components-docs/tabs/tabs.tsx"
RWKV-4
RWKV-3
### RWKV-4
- fast
- efficient
- scalable
You can import any thing inside this `TabsContentCN`
like `callout`:
this is a info callout
or images:

```
RWKV-4
RWKV-3
* fast
* efficient
* scalable
You can import any thing inside this `TabsContentCN`
like `callout`:
this is a info callout
or images:
### Link Card
```mdx
import { LinkCard, LinkCardContainer } from '../../components-docs/link-card/link-card.tsx'
```
## 终端文档组件
`TerminalWindow` 是独立的全宽模拟终端,用于替代命令行截图。操作说明仍使用普通 MDX 编写;命令和输出通过 `commands` 维护。
```mdx
import { TerminalWindow } from 'components-docs/terminal-docs/terminal-docs.tsx'
## 启动推理服务
安装依赖后运行服务。终端用于展示命令与模拟输出,不提供整段复制按钮。
```
安装依赖后运行服务。终端用于展示命令与模拟输出,不提供整段复制按钮。
* 支持多条命令和逐条输出
* 全宽展示,较长命令无需挤在半栏中
* 自动适配亮色、暗色和移动端
* `shell` 可设为 `bash`、`zsh`、`fish`、`powershell` 或 `cmd`,用于选择提示符、强调色和 Shiki 语法高亮;默认值 `auto` 会根据 `title` 推断,无法识别时使用 Bash
* 单条命令可用 `language` 覆盖终端默认的高亮语言,用 `prompt` 覆盖默认提示符
## API 参考组件
`ApiReference` 是独立的双栏 API 组件:左侧展示端点说明与可展开 schema,右侧是轻量代码面板,支持切换请求、响应和 cURL 并复制。它不使用模拟终端组件。
* `kind="request"` 使用“必填 / 可选”,`kind="response"` 使用“始终返回 / 可能返回”,避免把响应 schema 写成需要调用者填写的表单。
* `statusCode` 与 `contentType` 分别描述 HTTP 状态和媒体类型;流式响应可使用 `text/event-stream`。
* 字段还支持 `location`、`format`、`enumValues`、`example`、`nullable` 和 `deprecated`,用于表达参数位置与 schema 约束。
* 带子字段的 `ApiField` 默认展开;可设置 `defaultOpen={false}` 默认收起,或设置 `collapsible={false}` 始终展示。
```mdx
import { ApiReference, ApiSchemaSection, ApiField } from 'components-docs/api-reference/api-reference.tsx'
```
# RWKV 文档首页
import { CardContainer } from '../../components-docs/card/card-container.tsx'
import { Card } from '../../components-docs/card/card.tsx'
import { History, LibraryBig, PanelBottomDashed, CircleHelp, Server, Cpu, Smartphone, BookOpen, FileText, MessageSquare, PenTool, BarChart3, Sliders, Users, Github } from "lucide-react";
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { SingleCard } from 'components-docs/hero-card/single-card.tsx'
import { MultiCard } from 'components-docs/hero-card/muti-card.tsx'
import { HeroCardContainer } from 'components-docs/hero-card/hero-card-container.tsx'
import Bolt from 'components-docs/hero-card/icons/bolt.tsx'
import ArrowsBoldOppositeDirection from 'components-docs/hero-card/icons/arrows-bold-opposite-direction.tsx'
import CodeEditor from 'components-docs/hero-card/icons/code-editor.tsx'
import Slider from 'components-docs/hero-card/icons/slider.tsx'
import Feather from 'components-docs/hero-card/icons/feather.tsx'
import Gauge from 'components-docs/hero-card/icons/gauge.tsx'
import ClipboardCheck from 'components-docs/hero-card/icons/clipboard-check.tsx'
import Clipboard from 'components-docs/hero-card/icons/clipboard.tsx'
import File from 'components-docs/hero-card/icons/file.tsx'
import CircleArrowRight from 'components-docs/hero-card/icons/circle-arrow-right.tsx'
import AppStack from 'components-docs/hero-card/icons/app-stack.tsx'
import Heart from 'components-docs/hero-card/icons/heart.tsx'
欢迎来到 RWKV 中文文档,可在此处了解 RWKV 的**概念性知识**,包括但不限于:
* RWKV 的介绍,比如[架构迭代历史](/docs/RWKV-Wiki/RWKV-Architecture)、模型版本、[训练数据集](/docs/RWKV-Wiki/Dataset)、本地部署的显存需求等
* RWKV 的基准测试表现如何?在不同设备(如各种 GPU/CPU/NPU 等)的推理速度如何?
* RWKV 社区有哪些[优秀的项目](/docs/RWKV-Wiki/Links)?如何[参与 RWKV 社区](/docs/RWKV-Wiki/Contribute)并贡献您的力量?
RWKV 文档**不包含实操教程**,如果您需要学习 RWKV 的具体用法,比如本地部署、微调训练,请参考 [RWKV 教程](../tutorials)。
## 了解 RWKV
RWKV 是一个大语言模型架构,基于这个架构训练出来的 RWKV 模型可以**理解并生成文本**。此外,还有一些 RWKV 多模态模型可以**理解或生成图像、声音等多种模态的内容**。
## 改善模型的生成质量
## RWKV 基准测试表现
## RWKV 的端侧推理性能
## 加入 RWKV 社区
## 如何反馈文档问题?
若您有任何文档相关的问题(包括但不限于:错别字、文档不完整、文档难以理解或希望看到某一类文档等),请通过以下渠道向我们反馈:
* 通过 [GitHub Issue](https://github.com/LeoLin4258/rwkvcn-docs/issues/new/choose) 向我们反馈
* 向我们[发送邮件](mailto:qilongluo@rwkvos.com)
* 加入 RWKV QQ 交流群 224287095 讨论
# 基准测试数据
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { RadarChartComponent } from 'components-docs/radar-charts'
import { HeatMap } from 'components-docs/heat-map'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { LineChart } from 'components-docs/line-chart'
本页保留各表所列模型权重的已验证评测结果。RWKV-7 G1 系列仍在持续迭代,数据只代表表中明确列出的 checkpoint;比较时请以模型名称和测试条件为准,不要将结果外推到其他权重或整个模型系列。
## Uncheatable Eval 测试
[Uncheatable Eval](https://huggingface.co/spaces/Jellyfish042/UncheatableEval) 是“无法作弊的评测”,它使用最新的论文和新闻文章等实时数据,评估开源大语言模型的真实建模能力和泛化能力。
Uncheatable Eval 测试的结果是压缩率,因此其评分越低,意味着模型性能越好。
以下是 RWKV 和其他模型的 Uncheatable Eval 评分对比:
### 14B 参数模型
为了更直观地观察模型在每项评测上的表现,我们对原始数据进行了归一化处理。
| Name | Params (B) | Average (lower=better) | ao3 english | bbc news | wikipedia english | arxiv computer science | arxiv physics | github cpp | github python |
| :--------------------- | :--------- | :--------------------- | :---------- | :------- | :---------------- | :--------------------- | :------------ | :--------- | :------------ |
| Qwen3-14B-Base | 14.768 | 6.845 | 10.569 | 8.445 | 7.942 | 7.001 | 7.210 | 3.439 | 3.312 |
| rwkv7-g0b-13.3b | 13.269 | 6.870 | 9.848 | 8.202 | 7.636 | 7.108 | 7.380 | 4.026 | 3.892 |
| gemma-3-12b-pt | 12.187 | 6.945 | 10.540 | 7.914 | 7.607 | 7.286 | 7.387 | 3.883 | 3.997 |
| Qwen2.5-14B | 14.770 | 6.951 | 10.558 | 8.317 | 7.944 | 7.224 | 7.392 | 3.625 | 3.599 |
| Mistral-Nemo-Base-2407 | 12.248 | 6.970 | 10.165 | 8.118 | 7.642 | 7.287 | 7.455 | 4.079 | 4.042 |
| Motif-2-12.7B-Base | 12.704 | 7.099 | 10.628 | 8.328 | 7.897 | 7.134 | 7.404 | 4.189 | 4.114 |
| Llama-2-13b-hf | 13.016 | 7.540 | 10.655 | 8.307 | 7.901 | 7.993 | 8.122 | 4.795 | 5.009 |
### 7B 参数模型
为了更直观地观察模型在每项评测上的表现,我们抽取了平均分排行前七的模型,并对原始数据进行了归一化处理。
| Name | Params (B) | Average (lower=better) | ao3 english | bbc news | wikipedia english | arxiv computer science | arxiv physics | github cpp | github python |
| :------------------------------------- | :--------- | :--------------------- | :---------- | :------- | :---------------- | :--------------------- | :------------ | :--------- | :------------ |
| Qwen3-8B-Base | 8.191 | 7.091 | 10.890 | 8.718 | 8.255 | 7.207 | 7.465 | 3.617 | 3.482 |
| Meta-Llama-3-8B | 8.030 | 7.162 | 10.619 | 8.295 | 7.785 | 7.536 | 7.541 | 4.174 | 4.181 |
| RWKV7-g0a3-7.2b-20251029-ctx8192 | 7.199 | 7.222 | 10.164 | 8.480 | 7.996 | 7.440 | 7.747 | 4.378 | 4.347 |
| Qwen2.5-7B | 7.616 | 7.323 | 11.079 | 8.729 | 8.449 | 7.539 | 7.792 | 3.868 | 3.806 |
| Falcon-H1-7B-Base | 7.586 | 7.339 | 10.958 | 8.576 | 8.225 | 7.403 | 7.569 | 4.251 | 4.392 |
| Mistral-7B-v0.1 | 7.242 | 7.406 | 10.662 | 8.306 | 7.976 | 7.745 | 7.903 | 4.612 | 4.635 |
| Hunyuan-7B-Pretrain | 7.505 | 7.541 | 11.509 | 8.987 | 8.499 | 7.653 | 8.108 | 4.201 | 3.829 |
| falcon-mamba-7b | 7.273 | 7.548 | 10.760 | 8.958 | 8.589 | 7.674 | 7.737 | 4.437 | 4.680 |
| Zamba2-7B | 7.357 | 7.582 | 10.702 | 8.627 | 8.074 | 7.843 | 8.124 | 4.833 | 4.869 |
| Minitron-8B-Base | 8.272 | 7.582 | 10.835 | 8.654 | 8.284 | 7.856 | 8.230 | 4.508 | 4.708 |
| Olmo-3-1025-7B | 7.298 | 7.595 | 11.101 | 8.784 | 8.522 | 7.490 | 7.947 | 4.930 | 4.394 |
| RWKV-x060-World-7B-v3-20241112-ctx4096 | 7.636 | 7.633 | 10.629 | 8.753 | 8.288 | 7.936 | 8.109 | 4.786 | 4.929 |
### 3B 参数模型
为了更直观地观察模型在每项评测上的表现,我们抽取了平均分排行前七的模型,并对原始数据进行了归一化处理。
| Name | Params (B) | Average (lower=better) | ao3 english | bbc news | wikipedia english | arxiv computer science | arxiv physics | github cpp | github python |
| :--------------------------------------- | :--------- | :--------------------- | :---------- | :------- | :---------------- | :--------------------- | :------------ | :--------- | :------------ |
| RWKV7-g1a4-2.9b-20251118-ctx8192 | 2.948 | 7.486 | 10.481 | 8.800 | 8.310 | 7.712 | 8.072 | 4.553 | 4.474 |
| Llama-3.2-3B | 3.213 | 7.643 | 11.219 | 8.701 | 8.365 | 7.928 | 8.065 | 4.661 | 4.562 |
| Qwen2.5-3B | 3.086 | 7.722 | 11.575 | 9.139 | 8.895 | 7.911 | 8.220 | 4.203 | 4.113 |
| SmolLM3-3B-Base | 3.075 | 7.784 | 11.187 | 8.905 | 8.611 | 8.097 | 8.631 | 4.513 | 4.546 |
| RWKV-x070-World-2.9B-v3-20250211-ctx4096 | 2.948 | 7.800 | 10.812 | 8.909 | 8.501 | 8.049 | 8.307 | 4.955 | 5.066 |
| stablelm-3b-4e1t | 2.795 | 7.907 | 11.211 | 8.815 | 8.434 | 8.299 | 8.476 | 4.906 | 5.207 |
| Falcon-H1-3B-Base | 3.149 | 7.936 | 11.685 | 9.158 | 8.910 | 7.891 | 8.161 | 4.832 | 4.917 |
| recurrentgemma-2b | 2.683 | 8.052 | 11.632 | 8.951 | 8.835 | 8.401 | 8.488 | 4.897 | 5.157 |
| RWKV-x060-World-3B-v2.1-20240417-ctx4096 | 3.100 | 8.147 | 11.005 | 9.161 | 8.815 | 8.451 | 8.559 | 5.479 | 5.561 |
| mamba2attn-2.7b | 2.698 | 8.204 | 11.436 | 9.246 | 8.947 | 8.474 | 8.236 | 5.336 | 5.751 |
### 1.5B 参数模型
为了更直观地观察模型在每项评测上的表现,我们抽取了平均分排行前七的模型,并对原始数据进行了归一化处理。
| Name | Params (B) | Average (lower=better) | ao3 english | bbc news | wikipedia english | arxiv computer science | arxiv physics | github cpp | github python |
| :---------------------------------------- | :--------- | :--------------------- | :---------- | :------- | :---------------- | :--------------------- | :------------ | :--------- | :------------ |
| Qwen3-1.7B-Base | 1.721 | 7.965 | 12.016 | 9.743 | 9.352 | 7.936 | 8.350 | 4.260 | 4.095 |
| rwkv7-g1b-1.5b-20251015-ctx8192 | 1.527 | 7.969 | 10.972 | 9.250 | 8.843 | 8.110 | 8.537 | 5.041 | 5.027 |
| Qwen2.5-1.5B | 1.544 | 8.124 | 12.114 | 9.562 | 9.393 | 8.270 | 8.646 | 4.502 | 4.384 |
| RWKV-x070-World-1.5B-v3-20250127-ctx4096 | 1.527 | 8.231 | 11.273 | 9.320 | 8.965 | 8.431 | 8.758 | 5.385 | 5.483 |
| SmolLM2-1.7B | 1.711 | 8.298 | 11.536 | 9.373 | 9.351 | 8.547 | 9.047 | 5.080 | 5.152 |
| Llama-3.2-1B | 1.236 | 8.306 | 12.036 | 9.331 | 9.097 | 8.556 | 8.755 | 5.267 | 5.101 |
| Index-1.9B | 2.173 | 8.340 | 11.831 | 9.493 | 9.069 | 8.497 | 8.561 | 5.380 | 5.547 |
| stablelm-2-1\_6b | 1.645 | 8.396 | 11.761 | 9.237 | 8.943 | 8.762 | 9.088 | 5.558 | 5.425 |
| Falcon-H1-1.5B-Deep-Base | 1.555 | 8.505 | 12.144 | 9.666 | 9.482 | 8.407 | 8.968 | 5.497 | 5.368 |
| RWKV-x060-World-1B6-v2.1-20240328-ctx4096 | 1.600 | 8.564 | 11.434 | 9.555 | 9.276 | 8.822 | 8.990 | 5.906 | 5.968 |
| Falcon-H1-1.5B-Base | 1.555 | 8.639 | 12.287 | 9.796 | 9.645 | 8.507 | 9.089 | 5.635 | 5.514 |
| mamba2-1.3b | 1.344 | 8.699 | 11.944 | 9.710 | 9.463 | 8.925 | 8.714 | 5.851 | 6.286 |
| RWKV-5-World-1B5-v2-20231025-ctx4096 | 1.578 | 8.715 | 11.595 | 9.731 | 9.451 | 8.977 | 9.103 | 6.039 | 6.110 |
| mamba-1.4b-hf | 1.372 | 8.806 | 12.026 | 9.783 | 9.552 | 9.081 | 8.836 | 5.958 | 6.408 |
## MMLU 测试
MMLU 测试(Massive Multitask Language Understanding)评估模型的多任务语言理解能力的基准测试。MMLU 涵盖了从初中到研究生水平的 57 个不同学科,包括数学、物理、历史、法律、生物学等,测试语言模型是否能够在不同领域内进行推理、回答问题和表现出跨学科的知识。
| Model | MMLU | MMLU COT |
| ------------------- | ----- | -------- |
| **rwkv7-g0b-13.3b** | 0.765 | 0.827 |
| **rwkv7-g0b-7.2b** | 0.660 | 0.731 |
| **rwkv7-g1b-2.9b** | 0.622 | 0.669 |
| **rwkv7-g1b-1.5b** | 0.505 | 0.542 |
## MMLU Pro 测试
MMLU-Pro 是一个更稳健且更具挑战性的大规模多任务理解数据集,更严格地评测大型语言模型的能力。该数据集包含涵盖各个学科的 1.2 万个复杂问题。
| Model | MMLU-PRO | MMLU-PRO COT |
| ------------------- | -------- | ------------ |
| **rwkv7-g0b-13.3b** | 0.502 | 0.612 |
| **rwkv7-g0b-7.2b** | 0.361 | 0.526 |
| **rwkv7-g1b-2.9b** | 0.322 | 0.433 |
| **rwkv7-g1b-1.5b** | 0.222 | 0.292 |
## MMLU 变体测试
MMLU Redux 是 MMLU 的精简和修正版本,移除了部分错误标签;MMMLU (Multilingual MMLU) 则是多语言版本的测试。
| Model | MMLU Redux | Redux COT | MMMLU | MMMLU COT |
| ------------------- | ---------- | --------- | ----- | --------- |
| **rwkv7-g0b-13.3b** | 0.787 | 0.863 | 0.765 | 0.827 |
| **rwkv7-g0b-7.2b** | 0.685 | 0.772 | 0.660 | 0.731 |
| **rwkv7-g1b-2.9b** | 0.641 | 0.699 | 0.622 | 0.669 |
| **rwkv7-g1b-1.5b** | 0.529 | 0.569 | 0.505 | 0.541 |
## GSM8K 测试
GSM8K (Grade School Math 8K) 是一个包含 8500 道高质量、语言表达多样的小学数学应用题数据集,用于评估模型的数学推理能力。
| Model | GSM8K COT |
| ------------------- | --------- |
| **rwkv7-g0b-13.3b** | 0.923 |
| **rwkv7-g0b-7.2b** | 0.851 |
| **rwkv7-g1b-2.9b** | 0.766 |
| **rwkv7-g1b-1.5b** | 0.585 |
## MATH500 测试
MATH-500 是衡量 AI 模型数学推理能力的权威基准测试,包含 500 道具有挑战性的数学问题,涵盖代数、几何、微积分、概率统计等多个领域。
| Model | MATH500 COT |
| ------------------- | ----------- |
| **rwkv7-g0b-13.3b** | 0.768 |
| **rwkv7-g0b-7.2b** | 0.635 |
| **rwkv7-g1b-2.9b** | 0.495 |
| **rwkv7-g1b-1.5b** | 0.298 |
## 通用数学与推理测试
包含 Hendrycks Math, SVAMP, ASDiv, MAWPS 等数据集,以及 Algebra 222 和 Math Odyssey。涵盖了从基础算术、代数到几何等多种类型的数学问题,重点考察模型的思维链(CoT)能力。
| Model | Hendrycks Math | SVAMP | ASDiv | MAWPS |
| ------------------- | -------------- | ----- | ----- | ----- |
| **rwkv7-g0b-13.3b** | 0.558 | 0.942 | 0.923 | 0.949 |
| **rwkv7-g0b-7.2b** | 0.488 | 0.926 | 0.905 | 0.924 |
| **rwkv7-g1b-2.9b** | 0.383 | 0.840 | 0.844 | 0.890 |
| **rwkv7-g1b-1.5b** | 0.246 | 0.683 | 0.735 | 0.813 |
| Model | GSM+ | Algebra 222 | Math Odyssey |
| ------------------- | ----- | ----------- | ------------ |
| **rwkv7-g0b-13.3b** | 0.767 | 0.892 | 0.494 |
| **rwkv7-g0b-7.2b** | 0.685 | 0.856 | 0.401 |
| **rwkv7-g1b-2.9b** | 0.575 | 0.795 | 0.320 |
| **rwkv7-g1b-1.5b** | 0.406 | 0.658 | 0.202 |
## 代码生成能力测试
包含 HumanEval 和 MBPP (Mostly Basic Python Problems) 及其扩展版本。这些测试评估模型将自然语言描述转换为可执行代码的能力,涵盖了基础编程逻辑到复杂算法实现。
| Model | HumanEval | HumanEval+ | MBPP | MBPP+ |
| ------------------- | --------- | ---------- | ----- | ----- |
| **rwkv7-g0b-13.3b** | 0.817 | 0.762 | 0.820 | 0.706 |
| **rwkv7-g0b-7.2b** | 0.640 | 0.604 | 0.757 | 0.640 |
| **rwkv7-g1b-2.9b** | 0.537 | 0.494 | 0.627 | 0.550 |
| **rwkv7-g1b-1.5b** | 0.396 | 0.348 | 0.439 | 0.368 |
HumanEval Fix / CN 补充数据:
* **rwkv7-g0b-13.3b**: Fix 0.823 / CN 0.799
* **rwkv7-g0b-7.2b**: Fix 0.585 / CN 0.659
* **rwkv7-g1b-2.9b**: Fix 0.524 / CN 0.524
* **rwkv7-g1b-1.5b**: Fix 0.323 / CN 0.390
## 中文综合能力测试
C-Eval 和 CMMLU 是针对中文大模型的综合性能力评测基准,涵盖了人文、社科、理工等多个学科,考察模型在中文语境下的知识和推理能力。
| Model | C-Eval | C-Eval COT | CMMLU | CMMLU COT |
| ------------------- | ------ | ---------- | ----- | --------- |
| **rwkv7-g0b-13.3b** | 0.640 | 0.674 | 0.667 | 0.689 |
| **rwkv7-g0b-7.2b** | 0.540 | 0.563 | 0.564 | 0.598 |
| **rwkv7-g1b-2.9b** | 0.496 | 0.513 | 0.523 | 0.556 |
| **rwkv7-g1b-1.5b** | 0.427 | 0.426 | 0.422 | 0.442 |
**Gaokao 2023 English COT** (高考英语):
13.3b: 0.665 | 7.2b: 0.535 | 2.9b: 0.447 | 1.5b: 0.273
## IFEval
IFEval(Instruction-Following Evaluation)是一个专门用于评估大模型指令跟随能力的基准数据集。核心特点是使用**可验证指令(verifiable instructions)**,通过确定性规则(如正则匹配、计数、格式检查)自动判断模型是否遵循指令。
| Model | IFEval (strict prompt-level) |
| ------------------- | ---------------------------- |
| **rwkv7-g0b-13.3b** | 0.689 |
| **rwkv7-g0b-7.2b** | 0.579 |
| **rwkv7-g1b-2.9b** | 0.494 |
| **rwkv7-g1b-1.5b** | 0.421 |
## GPQA 测试
GPQA (Graduate-Level Google-Proof Q\&A Benchmark) 是一个极具挑战性的问答数据集,包含生物、物理和化学领域的研究生水平问题。这些问题设计为"Google-Proof",即通过简单的搜索引擎查询很难找到直接答案。
| Model | GPQA Main | GPQA Main COT | SuperGPQA |
| ------------------- | --------- | ------------- | --------- |
| **rwkv7-g0b-13.3b** | 0.379 | 0.429 | 0.288 |
| **rwkv7-g0b-7.2b** | 0.308 | 0.317 | 0.220 |
| **rwkv7-g1b-2.9b** | 0.333 | 0.326 | 0.194 |
| **rwkv7-g1b-1.5b** | 0.283 | 0.279 | 0.158 |
# 长文本基准测试数据
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { RadarChartComponent } from 'components-docs/radar-charts'
import { HeatMap } from 'components-docs/heat-map'
import { LineChart } from 'components-docs/line-chart'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
本页记录的是 RWKV-6 在 RULER 和 LongBench 上的历史评测结果。数据来源已经验证,可用于复查对应模型的表现,但不代表当前 RWKV-7 G1x 模型。
## RULER 测试
[RULER](https://arxiv.org/abs/2404.06654) 测试是一个新的 LLM 测试方法,相比于 NIAH 大海捞针测试做了优化和扩展,其包含四种测试任务:增强的检索任务(NIAH 扩展版本)、多跳跟踪(Multi-hop Tracing)、信息聚合(CWE、FWE)、带干扰的问答(QA)。
### 增强的大海捞针(NIAH)
RULER 包含增强的大海捞针(NIAH)测试,分为四个子任务,评估模型的检索能力:
| 测试子项目 | 简要描述 |
| ---------------------------- | ---------------------------- |
| Single NIAH (S-NIAH) | 测试模型处理单一输入和单一目标输出的能力。 |
| Multi-keys NIAH (MK-NIAH) | 测试模型处理多键值对的能力,其中每个键关联一个单一输出。 |
| Multi-values NIAH (MV-NIAH) | 测试模型处理多键值对的能力,其中每个键关联多个值或输出。 |
| Multi-queries NIAH (MQ-NIAH) | 测试模型在多个查询条件下,综合处理并生成相应结果的能力。 |
Single NIAH 的测试结果如下:
| 模型 | NIAH\_single\_1 | NIAH\_single\_2 | NIAH\_single\_3 |
| ------------------- | --------------- | --------------- | --------------- |
| RWKV-6-7B-v2.1-4k | 100 | 98.67 | 95 |
| Llama2-7B-4k | 97.6 | 100 | 96.8 |
| Mamba-2.8B-4k | 100 | 19 | 1 |
| Mamba-1.4B-4k | 94 | 21 | 5 |
| RWKV-6-3B-v2.1-4k | 100 | 88 | 79 |
| RWKV-6-1.6B-v2.1-4k | 98 | 53 | 55 |
NIAH-Multi-keys 的测试结果如下:
| 模型 | NIAH\_multikey\_1 | NIAH\_multikey\_2 | NIAH\_multikey\_3 |
| ------------------- | ----------------- | ----------------- | ----------------- |
| RWKV-6-7B-v2.1-4k | 48.33 | 7.67 | 1.33 |
| Llama2-7B-4k | 100 | 84.4 | 60 |
| Mamba-2.8B-4k | 7 | 0 | 1 |
| Mamba-1.4B-4k | 8 | 0 | 0 |
| RWKV-6-3B-v2.1-4k | 36 | 1 | 0 |
| RWKV-6-1.6B-v2.1-4k | 25 | 1 | 0 |
Multi-values 和 Multi-queries 的 NIAH 测试结果如下:
| 模型 | NIAH\_multivalue | NIAH\_multiquery |
| ------------------- | ---------------- | ---------------- |
| RWKV-6-7B-v2.1-4k | 80.42 | 83.67 |
| Llama2-7B-4k | 94 | 96.7 |
| Mamba-2.8B-4k | 0.75 | 1.25 |
| Mamba-1.4B-4k | 5.25 | 4.75 |
| RWKV-6-3B-v2.1-4k | 38.5 | 40.75 |
| RWKV-6-1.6B-v2.1-4k | 25 | 20.75 |
### 变量跟踪(VT)
多跳跟踪 - 变量跟踪(Multi-hop Tracing: Variable Tracking):该任务主要检查模型能否在长上下文中成功识别并跟踪具有多跳连接的实体(变量)和指代关系。比如赋值 $X_1 = V $,然后 $X_2 = X_1$、$X_3 = X_2$ ... 最终返回所有指向值 $V$ 的变量名。
| 模型 | 多跳跟踪 |
| ------------------- | ----- |
| RWKV-6-7B-v2.1-4k | 7.53 |
| Llama2-7B-4k | 63.12 |
| Mamba-2.8B-4k | 45 |
| Mamba-1.4B-4k | 23.4 |
| RWKV-6-3B-v2.1-4k | 11.8 |
| RWKV-6-1.6B-v2.1-4k | 1.4 |
### 信息聚合(CWE、FWE)
**信息聚合(CWE、FWE)**:该任务为常用词(Common Words)/高频词(Frequent Words)提取,用于测试模型**跨长上下文聚合常见信息**的能力
| 模型 | 常用词提取 (CWE) | 高频词提取 (FWE) |
| ------------------- | ----------- | ----------- |
| RWKV-6-7B-v2.1-4k | 38.6 | 78.33 |
| Llama2-7B-4k | 73.04 | 78.8 |
| Mamba-2.8B-4k | 2 | 53 |
| Mamba-1.4B-4k | 15.5 | 57.33 |
| RWKV-6-3B-v2.1-4k | 30.3 | 62.67 |
| RWKV-6-1.6B-v2.1-4k | 11 | 46.33 |
### 问答(QA)
**问答(QA)**:该任务在现有短上下文问答数据集的输入中添加了干扰信息,以评估各种上下文大小下的问答能力。
| 模型 | qa\_1 | qa\_2 |
| ------------------- | ----- | ----- |
| RWKV-6-7B-v2.1-4k | 45 | 37 |
| Llama2-7B-4k | 59.2 | 42 |
| Mamba-2.8B-4k | 23 | 18 |
| Mamba-1.4B-4k | 24 | 23 |
| RWKV-6-3B-v2.1-4k | 35 | 25 |
| RWKV-6-1.6B-v2.1-4k | 35 | 28 |
RULER 数据来源:[https://github.com/Ojiyumm/RULER\_RWKV](https://github.com/Ojiyumm/RULER_RWKV)
## LongBench 测试
[LongBench](https://arxiv.org/abs/2308.14508) 测试是一个针对大语言模型长文本理解能力的评测基准。
LongBench 共有六大类、二十一个不同的中英双语任务,覆盖了单文档 QA、多文档 QA、摘要、Few-shot 学习、合成任务和代码补全等关键的长文本应用场景。
以下是 RWKV 和其他模型的 LongBench 测试分数对比,数据表格按照六个分类展示:
### Single-Document QA (单文档问答)
单文档问答包含以下四种测试任务:
| 任务 | 任务说明 |
| --------------- | ------------------------------------ |
| NarrativeQA | 基于故事或剧本提问,包括对人物、情节、主题等重要元素的理解 |
| Qasper | 基于单篇论文的提出,问题由 NLP 的读者提出,并由 NLP 从业者回答 |
| MultiFieldQA-en | 基于单篇文档回答英文问题,文档所属的领域相对多元 |
| MultiFieldQA-zh | 基于单篇文档回答中文问题,文档所属的领域相对多元 |
**Single-Document QA 测试结果:**
| 模型 | NarrativeQA | Qasper | MultiFieldQA-en | MultiFieldQA-zh |
| --------------------------- | ----------- | ------ | --------------- | --------------- |
| GPT-3.5-Turbo-16k | 23.6 | 43.3 | 52.3 | 61.2 |
| Llama2-7B-chat-4k | 18.7 | 19.2 | 36.8 | 11.9 |
| LongChat-v1.5-7B-32k | 16.9 | 27.7 | 41.4 | 29.1 |
| XGen-7B-8k | 18.0 | 18.1 | 37.7 | 14.8 |
| InternLM-7B-8k | 12.1 | 16.7 | 23.4 | 33.6 |
| ChatGLM2-6B-32k | 21.1 | 31.5 | 46.2 | 51.6 |
| Vicuna-v1.5-7B-16k | 19.4 | 26.1 | 38.5 | 43.0 |
| ChatGLM3-6B-32k | 26.0 | 43.3 | 51.7 | 62.3 |
| Mamba\_1B4 | 2.23 | 4.44 | 11.33 | 13.03 |
| Mamba\_2B8 | 2.32 | 4.89 | 8.15 | 6.83 |
| Llama2-7B | 18.7 | 19.2 | 11.90 | 36.8 |
| Mistral-7B | 12.79 | 8.9 | 30.55 | 17.91 |
| **RWKV-6-World-1B6-v2.1** | 4.53 | 19.79 | 22.99 | 18.57 |
| **RWKV-6-World-3B-v2.1** | 2.87 | 14.2 | 18.78 | 21.49 |
| **RWKV-6-World-7b-v2.1-4k** | 20.75 | 40.2 | 36.01 | 50.19 |
### Multi-Document QA(多文档问答)
多文档问答包含以下四种测试任务:
| 任务 | 任务说明 |
| --------------- | --------------------------------------------------------------------- |
| HotpotQA | 基于 HotpotQA 文档回答问题,HotpotQA 涉及许多由母语人士根据两个相关段落编写的 2 跳问题 |
| 2WikiMultihopQA | 基于 2WikiMultihopQA 数据回答问题,2WikiMultihopQA 由最多 5 跳问题组成,这些问题通过手动设计的模板合成 |
| MuSiQue | 基于 MuSiQue 数据回答问题,MuSiQue 由最多 4 跳推理(4-hop reasoning)的简单问题组合而成 |
| DuReader | 基于 DuReader 的中文数据集回答相关问题,包含来自基于百度搜索和百度知道的 20 万个问题和 1M 文档 |
**Multi-Document QA 测试结果:**
| 模型 | HotpotQA | 2WikiMQA | Musique | DuReader (zh) |
| --------------------------- | -------- | -------- | ------- | ------------- |
| GPT-3.5-Turbo-16k | 51.6 | 37.7 | 26.9 | 28.7 |
| Llama2-7B-chat-4k | 25.4 | 32.8 | 9.4 | 5.2 |
| LongChat-v1.5-7B-32k | 31.5 | 20.6 | 9.7 | 19.5 |
| XGen-7B-8k | 29.7 | 21.1 | 10.3 | 11.0 |
| InternLM-7B-8k | 28.7 | 22.8 | 9.0 | 11.1 |
| ChatGLM2-6B-32k | 45.1 | 34.0 | 21.9 | 37.6 |
| Vicuna-v1.5-7B-16k | 25.3 | 20.8 | 9.8 | 19.3 |
| ChatGLM3-6B-32k | 54.4 | 44.9 | 40.4 | 44.78 |
| Mamba\_1B4 | 5.73 | 8.77 | 3.3 | 11.95 |
| Mamba\_2B8 | 5.49 | 8.45 | 3.45 | 13.96 |
| Llama2-7B | 25.4 | 32.8 | 9.4 | 5.2 |
| Mistral-7B | 9.39 | 11.17 | 4.58 | 11.68 |
| **RWKV-6-World-1B6-v2.1** | 8.72 | 11.86 | 3.96 | 11.40 |
| **RWKV-6-World-3B-v2.1** | 6.79 | 9.64 | 4.13 | 17.41 |
| **RWKV-6-World-7b-v2.1-4k** | 22.74 | 16.3 | 10.49 | 28.01 |
### Summarization(摘要)
摘要任务涉及以下四种测试:
| 任务 | 任务说明 |
| --------- | ----------------------- |
| GovReport | 摘要任务,要求对政府的工作报告进行总结摘要 |
| QMSum | 摘要任务,要求基于用户的查询对会议记录进行摘要 |
| MultiNews | 多文档摘要任务,要求基于多篇新闻进行摘要 |
| VCSUM | 摘要任务,要求对中文会议记录进行总结摘要 |
**摘要任务测试结果如下:**
| 模型 | GovReport | QMSum | MultiNews | VCSUM (zh) |
| --------------------------- | --------- | ------ | --------- | ---------- |
| GPT-3.5-Turbo-16k | 29.5 | 23.4 | 26.7 | 16.0 |
| Llama2-7B-chat-4k | 27.3 | 20.8 | 25.8 | 0.2 |
| LongChat-v1.5-7B-32k | 30.8 | 22.7 | 26.4 | 9.9 |
| XGen-7B-8k | 27.3 | 20.5 | 26.2 | 2.2 |
| InternLM-7B-8k | 9.7 | 15.9 | 22.8 | 12.4 |
| ChatGLM2-6B-32k | 32.4 | 24.0 | 26.5 | 16.2 |
| Vicuna-v1.5-7B-16k | 27.9 | 22.8 | 27.2 | 15.1 |
| ChatGLM3-6B-32k | 36.8 | 23.9 | 27.9 | 17.8 |
| Mamba\_1B4 | 9.34 | 10.85 | 15.86 | 6.33 |
| Mamba\_2B8 | 10.41 | 11.42 | 18.94 | 6.1 |
| Llama2-7B | 27.3 | 20.8 | 25.8 | 0.2 |
| Mistral-7B | 28.84 | 20.32 | 22.79 | 4.1 |
| **RWKV-6-World-1B6-v2.1** | 17.51 | 20.36 | 21.52 | 10.71 |
| **RWKV-6-World-3B-v2.1** | 19.21 | 21 | 21.76 | 10.18 |
| **RWKV-6-World-7b-v2.1-4k** | 31.64 | 21.31 | 26.06 | 15.19 |
### Few-shot Learning(小样本学习)
小样本学习包含以下四种测试任务:
| 任务 | 任务说明 |
| -------- | ---------------------------- |
| TREC | 分类任务,要求对问题进行分类,一共包含 50 个类别 |
| TriviaQA | 单文档问答任务,提供若干的 Few Shot 样例 |
| SAMSum | 对话摘要任务,提供若干的 Few Shot 样例 |
| LSHT | 中文分类任务,要求对新闻进行分类,一共包含 24 个类别 |
**Few-shot Learning测试结果如下:**
| 模型 | TREC | TriviaQA | SAMSum | LSHT (zh) |
| --------------------------- | ----- | -------- | ------ | --------- |
| GPT-3.5-Turbo-16k | 68.0 | 91.4 | 41.7 | 29.2 |
| Llama2-7B-chat-4k | 61.5 | 77.8 | 40.7 | 19.8 |
| LongChat-v1.5-7B-32k | 63.5 | 82.3 | 34.2 | 23.2 |
| XGen-7B-8k | 65.5 | 77.8 | 25.3 | 20.5 |
| InternLM-7B-8k | 52.0 | 77.8 | 21.2 | 15.2 |
| ChatGLM2-6B-32k | 62.5 | 78.7 | 36.3 | 27.7 |
| Vicuna-v1.5-7B-16k | 71.5 | 86.2 | 40.8 | 28.8 |
| ChatGLM3-6B-32k | 79.0 | 87.1 | 38.2 | 42.0 |
| Mamba\_1B4 | 45.5 | 37.33 | 12.56 | 8.5 |
| Mamba\_2B8 | 21.5 | 34.62 | 9.3 | 5 |
| Llama2-7B | 61.5 | 77.8 | 40.7 | 19.8 |
| Mistral-7B | 70.0 | 89.26 | 43.74 | 25.5 |
| **RWKV-6-World-1B6-v2.1** | 39.5 | 47.64 | 13.58 | 18.8 |
| **RWKV-6-World-3B-v2.1** | 51.5 | 57.15 | 17.95 | 15.2 |
| **RWKV-6-World-7b-v2.1-4k** | 55.5 | 86.89 | 44.25 | 30.2 |
### Synthetic Tasks(合成任务)
合成任务测试任务包含以下三种测试任务:
| 任务 | 任务说明 |
| ------------------- | --------------------------------- |
| PassageCount | 判断给定的若干的段落中不重复的段落一共有几个 |
| PassageRetrieval-en | 给定 30 个英文维基的段落,判断给定的摘要属于哪个段落 |
| PassageRetrieval-zh | 给定若干个出自 C4 数据集的中文段落,判断给定的摘要属于哪个段落 |
**Synthetic Tasks 测试结果如下:**
| 模型 | Passage Count | PassageRetrieval-en | PassageRetrieval-zh |
| --------------------------- | ------------- | ------------------- | ------------------- |
| GPT-3.5-Turbo-16k | 4.5 | 71.0 | 77.5 |
| Llama2-7B-chat-4k | 2.1 | 9.8 | 0.5 |
| LongChat-v1.5-7B-32k | 1.0 | 30.5 | 7.6 |
| XGen-7B-8k | 2.1 | 8.5 | 3.5 |
| InternLM-7B-8k | 3.0 | 6.0 | 0.9 |
| ChatGLM2-6B-32k | 1.5 | 77.0 | 64.5 |
| Vicuna-v1.5-7B-16k | 6.5 | 4.5 | 5.0 |
| ChatGLM3-6B-32k | 2.0 | 99.0 | 94.0 |
| Mamba\_1B4 | 0.45 | 3.32 | 3.81 |
| Mamba\_2B8 | 0.74 | 1.83 | 3.37 |
| Llama2-7B | 2.1 | 9.8 | 0.5 |
| Mistral-7B | 1.05 | 12.5 | 16.75 |
| **RWKV-6-World-1B6-v2.1** | 0 | 4.25 | 4.16 |
| **RWKV-6-World-3B-v2.1** | 0 | 3.83 | 4.12 |
| **RWKV-6-World-7b-v2.1-4k** | 5 | 34.5 | 54.22 |
### Code Completion(代码续写)
代码续写包含以下两种测试任务:
| 任务 | 任务说明 |
| ----------- | ------------------------------------------- |
| LCC | 给定一段较长代码,要求预测出下一行代码 |
| RepoBench-P | 给定一个 github 仓库内多个文件中的代码(包含文件间依赖),要求预测出下一行代码 |
**代码续写测试结果如下:**
| 模型 | LCC | RepoBench-P |
| --------------------------- | ------ | ----------- |
| GPT-3.5-Turbo-16k | 54.7 | 53.6 |
| Llama2-7B-chat-4k | 52.4 | 43.8 |
| LongChat-v1.5-7B-32k | 53.0 | 55.3 |
| XGen-7B-8k | 38.6 | 38.6 |
| InternLM-7B-8k | 44.1 | 28.8 |
| ChatGLM2-6B-32k | 55.6 | 49.9 |
| Vicuna-v1.5-7B-16k | 51.0 | 43.5 |
| ChatGLM3-6B-32k | 57.66 | 54.76 |
| Mamba\_1B4 | 44.33 | 41.86 |
| Mamba\_2B8 | 39.53 | 24.38 |
| Llama2-7B | 52.4 | 43.8 |
| Mistral-7B | 70.64 | 59.7 |
| **RWKV-6-World-1B6-v2.1** | 39.5 | 40.44 |
| **RWKV-6-World-3B-v2.1** | 40.01 | 41.35 |
| **RWKV-6-World-7b-v2.1-4k** | 73.84 | 54.1 |
### RWKV、Mamba 和 Llama2 的综合评分对比
| 模型 | Single DocQ | Few-shc | Summarization | Multi Doc QA | Code Completion | Syntetic |
| --------------------------- | ----------- | ------- | ------------- | ------------ | --------------- | -------- |
| **RWKV-6-World-1B6-v2.1** | 16.470 | 29.868 | 17.525 | 8.985 | 39.970 | 2.803 |
| **RWKV-6-World-3B-v2.1** | 14.335 | 35.443 | 18.038 | 9.493 | 40.680 | 2.650 |
| **RWKV-6-World-7b-v2.1-4k** | 36.788 | 54.203 | 23.550 | 19.385 | 63.970 | 31.240 |
| Mamba\_1B4 | 7.758 | 25.973 | 10.595 | 7.438 | 43.095 | 2.527 |
| Mamba\_2B8 | 5.548 | 17.605 | 11.718 | 7.838 | 31.955 | 1.980 |
| Llama2-7B | 21.650 | 49.950 | 18.525 | 18.200 | 48.100 | 4.133 |
| Mistral-7B | 17.538 | 52.833 | 19.013 | 9.205 | 65.17 | 10.100 |
评测数据来源:[https://github.com/Ojiyumm/LongBench\_RWKV](https://github.com/Ojiyumm/LongBench_RWKV)
# AMD 硬件
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { RadarChartComponent } from '../../../components-docs/radar-charts'
import { HeatMap } from '../../../components-docs/heat-map'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV 模型在 AMD 硬件上的推理性能,包括各类专业显卡、消费级显卡,甚至集成显卡。TPS 只在模型、量化、后端版本、驱动、操作系统和测试参数一致时适合直接比较。
此页面的数据来自:[RWKV 推理性能测试指南](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test),数据均由社区成员测试并报告。欢迎大家参照仓库的指引进行测试,并提交 AMD 硬件的推理性能数据。
## AMD RX 7900 XTX
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :--------------------------------------------------------: | :-----------: | :---: | :-----------: | :----: |
| [llama.cpp(Vulkan)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 41.55 | 5.75GB |
| [llama.cpp(Vulkan)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 42.85 | 3.47GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 106.00 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 137.36 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 151.64 | 2.4GB |
数据来源:[issue #5](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/5) | [issue #6](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/6)
测试环境:
* CPU:AMD Ryzen 9 5950X
* OS version: Ubuntu 25.04 @ Kernel: 6.14.0-23-generic
* driver\_info: "radv Mesa 25.0.3-1ubuntu2"
## AMD Radeon RX 6750 GRE 12GB
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 48.69 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 70.79 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 74.98 | 2.4GB |
数据来源:[issue #26](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/26)
测试环境:
* CPU:AMD Ryzen 5 3600
* OS: Windows11 Pro 25H2
* AMD Software:Adrenalin Edition 25.12.1 Vulkan
## AMD Radeon RX 6650 XT
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 37.71 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 52.88 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 66.69 | 2.4GB |
数据来源:[issue #25](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/25)
测试环境:
* CPU:Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
* Driver: 25.10.16.01
## AMD Radeon PRO W7900
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :--------------------------------------------------------: | :-----------: | :---: | :-----------: | :-----: |
| [RWKV pip](https://pypi.org/project/rwkv/) | RWKV7-G1 2.9B | fp16 | 45.28 | 5.52 GB |
| [llama.cpp(ROCm)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 48.71 | 5.75GB |
| [llama.cpp(ROCm)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 58.59 | 3.47GB |
| [llama.cpp(Vulkan)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 39.49 | 5.75GB |
| [llama.cpp(Vulkan)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 45.21 | 3.47GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 61.62 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 79.46 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 89.76 | 2.4GB |
数据来源:[issue #9](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/9) | [issue #13](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/13) | [issue #14](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/14)
测试环境:
* CPU:Intel I3 12100
* OS version: Ubuntu 24.04.2 LTS @ Kernel: 6.11.0-26-generic
## AMD Radeon Pro VII (Instinct MI50)
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | FP16 | 59.83 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | INT8 | 72.70 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | NF4 | 65.99 | 2.4GB |
数据来源:[issue #10](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/10)
测试环境:
* CPU:AMD Ryzen 9 5900X
* OS version: Windows 11 24H2
* AMD Software: PRO Edition25.5.1 Vulkan
## AMD RYZEN AI MAX+ 395w \[CPU]
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 内存用量 |
| :-----------------------------------------------------: | :-----------: | :---: | :-----------: | :----------: |
| [llama.cpp(CPU)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 14.10 | to-be-tested |
| [llama.cpp(CPU)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 22.42 | to-be-tested |
数据来源:[issue #18](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/18)
测试环境:
* CPU:AMD RYZEN AI MAX+ 395w
* OS version: Ubuntu 24.04.2 @ Kernel: Linux-6.14.0-24-generic
* driver\_info: "Mesa 24.2.8-1ubuntu1 24.04.1"
## Radeon 8060S \[Integrated]
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: | :---: | :-----------: | :-----: |
| [RWKV pip](https://pypi.org/project/rwkv/) | RWKV7-G0 7.2B | fp16 | 9.49 | 13.47GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G0 7.2B | fp16 | 10.16 | 13.25GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G0 7.2B | int8 | 14.71 | 7.82GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G0 7.2B | nf4 | 26.09 | 4.85GB |
| [RWKV pip](https://pypi.org/project/rwkv/) | RWKV7-G1 2.9B | fp16 | 17.57 | 5.52 GB |
| [llama.cpp(ROCm)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 27.38 | 5.75GB |
| [llama.cpp(ROCm)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 43.10 | 3.47GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 31.29 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 51.56 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 77.71 | 2.4GB |
数据来源:[issue #16](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/16) | [issue #17](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/17) | [issue #18](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/18)
测试环境:
* CPU:AMD RYZEN AI MAX+ 395w
* OS version: Ubuntu 24.04.2 @ Kernel: Linux-6.14.0-24-generic
* driver\_info: "Mesa 24.2.8-1ubuntu1\~24.04.1"
## AMD Radeon 780M \[Integrated]
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: | :--: | :-----------: | :-----: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G0 7.2B | fp16 | 5.80 | 13.26GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G0 7.2B | int8 | 10.26 | 7.8GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G0 7.2B | nf4 | 15.76 | 4.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 13.61 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 23.65 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 32.22 | 2.4GB |
数据来源:[issue #11](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/11) | [issue #12](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/12) | [issue #15](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/15)
测试环境:
* CPU:AMD Ryzen 7 8845H (16) @ 5.61 GHz
* OS version: Arch Linux x86\_64 @ Kernel: Linux 6.15.7-arch1-1
* driver\_info: "Mesa 25.1.6-arch1.1"
## AMD Radeon 610M \[Integrated]
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :--------------------------------------------------------: | :-----------: | :---: | :-----------: | :----: |
| [llama.cpp(vulkan)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 6.12 | 5.75GB |
| [llama.cpp(vulkan)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 7.54 | 3.47GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 8.49 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 11.96 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 8.03 | 2.4GB |
数据来源:[issue #19](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/19) | [issue #20](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/20)
测试环境:
* CPU:AMD Ryzen 9 9955HX 16-Core Processor
* OS version: Ubuntu 25.04 @ Kernel: 6.14.0-15-generic
* driver\_info: "Mesa 25.0.7-0ubuntu0.25.04.1"
# 移动端和边缘设备
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { RadarChartComponent } from '../../../components-docs/radar-charts'
import { HeatMap } from '../../../components-docs/heat-map'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV 模型在移动端和边缘设备的推理性能,包括高通、MTK Soc 和 RK3588 等各类嵌入式/边缘计算设备。移动端速度会受 SoC、散热状态、系统与驱动、运行后端、量化格式和测试时长影响,只有测试条件一致时才适合直接比较。
## 高通骁龙 8 Gen3
在 骁龙 8 Gen3(小米 14)上的性能表现:
| Model | Precision | 每秒生成的 Token 数 |
| ------------- | --------- | ------------- |
| RWKV7-G1 2.9B | A16W4 | 31.3 |
| RWKV7-G1 2.9B | A16W8 | 18.7 |
## 高通骁龙 8 Elite
在 高通骁龙 8 Elite (小米 15) 上的性能表现:
| Model | Precision | 每秒生成的 Token 数 |
| ------------- | --------- | ------------- |
| RWKV7-G1 2.9B | A16W4 | 30.26 |
| RWKV7-G1 2.9B | A16W8 | 19.34 |
{/* ## MTK 联发科天玑 9300
RWKV 模型在天玑 9300 上的性能表现:
| Model | Precision | 每秒生成的 Token 数 |
| ------------ | --------- | ------------------- |
| RWKV v6 1.6B | fp16i8 | 26.2743 |
| RWKV v6 3B | fp16i8 | 13.0599 | 3.89911,71.2206% |
| RWKV v6 7B | fp16i8 | out of memory | TODO | */}
**表格中的参数解释:**
* Precision:代表不同量化策略或计算精度。
* a16:激活值被量化为 16 位(int16)
* w8/w4:权重(weights)被量化为 8 位/4 位(per-channel 线性量化)
## Rockchip RK3588
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :------------------------------------------------------: | :-----------: | :---: | :-----------: | :------------------------------------------------------------------------------------------------------------------: |
| [llama.cpp(BLAS)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | F16 | 3.62 | \~6.5GB 系统内存 |
| [llama.cpp(BLAS)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 5.67 | \~3.9GB 系统内存 |
| [RKNN-LLM(NPU)](https://github.com/airockchip/rknn-llm) | RWKV7-G1 2.9B | FP16 | 4.04 | 5.49GB |
| [RKNN-LLM(NPU)](https://github.com/airockchip/rknn-llm) | RWKV7-G1 2.9B | W8A8 | 6.58 | 2.80GB |
数据来源:[issue #7](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/7)
测试环境:
* CPU:Rockchip RK3588
* OS version: Armbian 25.5.2 noble on Radxa ROCK 5B
# NVIDIA 硬件
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { RadarChartComponent } from 'components-docs/radar-charts'
import { HeatMap } from 'components-docs/heat-map'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV 模型在 NVIDIA 硬件上的推理性能。TPS 只在模型、精度、推理后端、工作负载和测试环境一致时适合直接比较。
此页面的数据来自:[RWKV 推理性能测试指南](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test),数据均由社区成员测试并报告。欢迎大家参照仓库的指引进行测试,并提交 NVIDIA 硬件的性能数据。
## NVIDIA RTX 5090
### Albatross:RWKV-7 G1f 7.2B
以下结果来自 [Albatross `faster3a_2607`](https://github.com/BlinkDL/Albatross/tree/main/faster3a_2607),测试使用 RWKV-7 G1f 7.2B、FP16 模型和单张 RTX 5090。表中的吞吐量为上游测试记录的 p50 结果。
| 工作负载 | 批量大小(B) | 序列长度(T) | 吞吐量(p50) |
| ------ | ------: | ------: | ----------------: |
| B1T1 | 1 | 1 | 145.80 token/s |
| B256T1 | 256 | 1 | 13,134.48 token/s |
| B16T16 | 16 | 16 | 17,343.98 token/s |
B1T1 最接近单路逐 token 生成;B256T1 和 B16T16 测量的是不同批量与序列形状下的总吞吐量,不能与 B1T1 当作同一种工作负载直接比较。
### 较早的 RWKV7-G1 2.9B 测试
以下数据来自较早的官方测试记录,数值已经验证,但模型和推理后端与上方 Albatross 测试不同,仅作为历史性能参考。
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :------------------------------------------------: | :-----------: | :--: | :-----------: | :-----: |
| [RWKV pip](https://pypi.org/project/rwkv/) | RWKV7-G1 2.9B | fp16 | 39.55 TPS | 5.52 GB |
| [llama.cpp](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 84 TPS | 5.52 GB |
测试环境:
* CPU:AMD EPYC 7302
* GPU:NVIDIA GeForce RTX 5090
## NVIDIA RTX 4090
RWKV 模型在 NVIDIA RTX 4090 上的性能表现:
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :------------------------------------------------------: | :-----------: | :---: | :-----------: | :-----: |
| [RWKV pip](https://pypi.org/project/rwkv/) | RWKV7-G1 2.9B | fp16 | 56.18 | 5.52 GB |
| [llama.cpp(CUDA)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | fp16 | 89.16 | 5.75GB |
| [llama.cpp(CUDA)](https://github.com/ggml-org/llama.cpp) | RWKV7-G1 2.9B | Q8\_0 | 110.3 | 3.47GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 95.98 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 108.22 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 115.46 | 2.4GB |
数据来源:[issue #3](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/3)
测试环境:
* CPU:Intel(R) Xeon(R) Platinum 8331C
* OS: ubuntu 22.04 Linux-6.8.0-60-generic-x86\_64-with-glibc2.35
* python\_version: 3.10.16
* pytorch\_version: 2.5.1+cu121
## NVIDIA RTX 4080
RWKV 模型在 NVIDIA RTX 4080 上的性能表现:
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 76.99 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 95.92 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 105.05 | 2.4GB |
数据来源:[issue #21](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/21)
测试环境:
* CPU:12th Gen Intel(R) Core(TM) i7-12700
* OS: Windows 11 Professional edition 24H2-26100.4652
* driver version: 560.94
## NVIDIA RTX 4060Ti 8GB
RWKV 模型在 NVIDIA RTX 4060Ti 8GB 上的性能表现:
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :-----: |
| [RWKV pip](https://pypi.org/project/rwkv/) | RWKV7-G1 2.9B | fp16 | 36.61 | 5.52 GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 43.92 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 62.93 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 86.03 | 2.4GB |
数据来源:[issue #1](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/1)
测试环境:
* CPU:Intel i7-13700F
* OS version: Windows10 专业版
* driver version: 576.02
* CUDA version: 12.9
## NVIDIA RTX 4060 Laptop
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G0 7.2B | nf4 | 40.30 | 5.1GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 40.98 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 60.21 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 77.26 | 2.4GB |
数据来源:[issue #15](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/15)
测试环境:
* CPU:AMD Ryzen 7 8845H (16) @ 5.61 GHz
* OS version: Arch Linux x86\_64 @ Kernel: Linux 6.15.7-arch1-1
* driver version: 575.64.05
## NVIDIA GeForce RTX 2080 Ti
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 67.74 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 87.35 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 96.73 | 2.4GB |
数据来源:[issue #27](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/27)
测试环境:
* CPU:13th Gen Intel(R) Core(TM) I5-13400TE
* OS: Windows 11 PRO 25H2
* CUDA:13.1
* Driver version:591.86
## NVIDIA Tesla P100-PCIE-16GB
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 61.90 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 67.25 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 55.21 | 2.4GB |
数据来源:[issue #24](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/24)
测试环境:
* CPU:AMD Ryzen 5 7600X
* OS:Windows11 PRO 24H2
* driver version:551.78
* CUDA Version:12.4
## NVIDIA CMP 40HX 8GB
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :--: | :-----------: | :---: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 68.89 | 5.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 78.78 | 3.9GB |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 80.23 | 2.4GB |
数据来源:[issue #23](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/23)
测试环境:
* CPU:AMD Ryzen 7 5700G
* OS version: Windows11 PRO 24H2
* driver version: DCH-581.57
* CUDA version: 13.0
# Apple 和其他硬件
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { RadarChartComponent } from '../../../components-docs/radar-charts'
import { HeatMap } from '../../../components-docs/heat-map'
RWKV 在 Apple Silicon 和摩尔线程等其他硬件上的推理性能,包括 Apple Silicon、MTT-S4000 等硬件。不同运行时、量化方式、线程数和测试脚本的 TPS 不适合直接横向比较。
## Apple M2 8-core
RWKV 模型在 Apple M2 8-core 上的性能表现:
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :---: | :-----------: | :--: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 14.75 | - |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 23.21 | - |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 21.65 | - |
| llama.cpp (Metal,BLAS,4 threads) | RWKV7-G1 2.9B | fp16 | 11.26 | - |
| llama.cpp (Metal,BLAS,4 threads) | RWKV7-G1 2.9B | Q8\_0 | 18.24 | - |
| llama.cpp (Metal,BLAS,4 threads) | RWKV7-G1 2.9B | Q4\_K | 25.92 | - |
数据来源:[issue #22](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/22)
## M4 Pro 12-core
RWKV 模型在 Apple M4 Pro 12-core 上的性能表现:
| 推理工具 | Model | 精度 | 每秒生成的 Token 数 | 显存用量 |
| :---------------------------------------------: | :-----------: | :---: | :-----------: | :--: |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | fp16 | 33.98 | - |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | int8 | 47.70 | - |
| [web-rwkv](https://github.com/cryscan/web-rwkv) | RWKV7-G1 2.9B | nf4 | 32.95 | - |
| llama.cpp (Metal,BLAS,8 threads) | RWKV7-G1 2.9B | fp16 | 32.08 | - |
| llama.cpp (Metal,BLAS,8 threads) | RWKV7-G1 2.9B | Q8\_0 | 46.20 | - |
| llama.cpp (Metal,BLAS,8 threads) | RWKV7-G1 2.9B | Q4\_K | 56.60 | - |
数据来源:[issue #22](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test/issues/22)
## 摩尔线程 MTT-S4000(历史 RWKV-6 数据)
以下数据有多次交叉验证,但对应的是 RWKV-6 和当时的软件环境,因此仅作为历史性能参考。
RWKV 模型在摩尔线程 MTT-S4000 上的性能表现:
| Model | Precision | 每秒生成的 Token 数 | 显存用量 (GB) |
| :-------------: | :-------: | :-----------: | :-------: |
| RWKV-6-1B6-v2.1 | fp16 | 57.31 | 3.42 |
| RWKV-6-1B6-v2.1 | fp32 | 30.45 | 6.30 |
| RWKV-6-3B-v2.1 | fp16 | 36.09 | 6.27 |
| RWKV-6-3B-v2.1 | fp32 | 30.03 | 11.99 |
| RWKV-6-7B-v2.1 | fp16 | 30.39 | 14.43 |
| RWKV-6-7B-v2.1 | fp32 | 16.62 | 28.71 |
| RWKV-6-14B-v2.1 | fp16 | 16.19 | 26.57 |
表格中的参数解释:
* Model:代表不同参数量的 RWKV-6 模型。
* Precision:代表不同量化策略或计算精度。
# RWKV 提示词示例
import { CallOut } from 'components-docs/call-out/call-out.tsx'
本页按使用方式收录经过复测的 prompt 示例。示例面向 RWKV7-G1i 系列,并使用 7.2B 模型验证;使用其他模型规格或调整参数时,生成结果可能不同。
| 模式 | 如何使用 |
| ---- | ------------------------------------ |
| 聊天模式 | 在聊天界面中直接发送任务内容,由工具补全聊天模板。 |
| 续写模式 | 将包含任务说明、输入内容和续写起点的完整 prompt 粘贴到续写界面。 |
## 聊天模式
聊天示例适合直接粘贴到 RWKV Runner、Ai00 等推理工具的聊天文本框中。
### ⭐ 生成或修改代码
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**分析并修改简单代码**
**输入 prompts:**
```markdown
请阅读以下 Python 代码,说明它的用途、三个变量的数值、总数的计算结果和程序会输出什么:
ming_apples = 7
leo_apples = 6
blink_apples = 85
total_apples = ming_apples + leo_apples + blink_apples
print("Ming has", ming_apples, "apples.")
print("Leo has", leo_apples, "apples.")
print("Blink has", blink_apples, "apples.")
print("Total apples for all: ", total_apples)
```
**参考输出:**
````markdown
这段Python代码展示了三个人(Ming、Leo和Blink)拥有的苹果数量及其总和。具体来说:
1. **定义变量**:
- `ming_apples = 7` 表示Ming拥有7个苹果。
- `leo_apples = 6` 表示Leo拥有6个苹果。
- `blink_apples = 85` 表示Blink拥有85个苹果。
2. **计算总数**:
- `total_apples = ming_apples + leo_apples + blink_apples` 计算三人共同拥有的苹果总数:
\[
7 + 6 + 85 = 98
\]
- 结果存储在变量`total_apples`中。
3. **打印信息**:
- 使用 `print` 的多个参数输出每个人的苹果数量:
```python
print("Ming has", ming_apples, "apples.")
print("Leo has", leo_apples, "apples.")
print("Blink has", blink_apples, "apples.")
```
- 打印总共拥有的苹果数:
```python
print("Total apples for all: ", total_apples)
```
- 运行后会输出:
```text
Ming has 7 apples.
Leo has 6 apples.
Blink has 85 apples.
Total apples for all: 98
```
**总结**:代码展示了三人各自拥有的苹果数量及其总和,便于直观理解每个人持有多少苹果。
````
**继续输入 prompts:**
```markdown
请将程序中Ming的苹果数改为80,并提供修改后的代码。
```
**参考输出:**
````markdown
```python
ming_apples = 80 # 将Ming拥有的苹果数从7改为80
leo_apples = 6 # Leo拥有6个苹果不变
blink_apples = 85 # Blink拥有85个苹果不变
total_apples = ming_apples + leo_apples + blink_apples # 计算总共拥有的苹果数
print("Ming has", ming_apples, "apples.") # Ming拥有80个苹果
print("Leo has", leo_apples, "apples.") # Leo拥有6个苹果不变
print("Blink has", blink_apples, "apples.") # Blink拥有85个苹果不变
print("Total apples for all: ", total_apples) # 总共拥有171个苹果(80+6+85)
```
````
### ⭐ 撰写线上技术分享会策划案
建议的参数:Temperature = 1.2、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
策划一个面向前端开发者的线上技术分享会,主题为“现代前端框架的新趋势”,方案需包括活动目标、议程安排、嘉宾邀请、宣传渠道和预期效果。活动必须完全在线举行。议程固定为:开场 5 分钟、趋势分享 25 分钟、技术演示 20 分钟、实战分享 20 分钟、问答 15 分钟、总结 5 分钟,总计 90 分钟,不要增删环节或改动时长。嘉宾邀请只写所需岗位和能力,不添加姓名、组织、账号或虚构履历数据。
```
**参考输出:**
```markdown
### 活动目标
1. 帮助前端开发者了解现代前端框架的演进方向。
2. 通过演示和项目经验说明框架选型与落地方法。
3. 集中回答参与者在升级、性能和工程化方面的问题。
### 议程安排
| 时间 | 环节 | 内容 |
| --- | --- | --- |
| 00:00–00:05 | 开场 | 介绍主题、线上参与方式和议程 |
| 00:05–00:30 | 趋势分享 | 梳理框架设计、工具链和生态变化 |
| 00:30–00:50 | 技术演示 | 展示一项新特性及其使用边界 |
| 00:50–01:10 | 实战分享 | 讲解项目选型、迁移或性能优化经验 |
| 01:10–01:25 | 问答 | 回答参与者提交的问题 |
| 01:25–01:30 | 总结 | 回顾重点并提供后续资料 |
### 嘉宾邀请
- **前端架构师**:能解释框架选型、架构取舍和迁移风险。
- **项目实践工程师**:能演示真实开发流程,并总结常见问题。
- **技术主持人**:能控制线上节奏、整理问题并引导讨论。
### 宣传渠道
- 活动报名页和主办方网站
- 开发者社区、技术社群和邮件列表
- 活动开始前的提醒邮件与线上直播预告
### 预期效果
- 参与者能够区分趋势、适用场景和主要取舍。
- 问答环节收集可继续整理的实际问题。
- 活动后可发布回放、示例代码和资料索引。
```
### ⭐ 生活贴士-除去冰箱异味
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
请给出一份不超过 300 个中文字符、适合普通家庭执行的冰箱除味指南。未提供具体型号说明书,因此只建议断电、移出食物、丢弃变质食物,并用软布和说明书允许的温水或中性清洁剂清洁后擦干。不要推荐小苏打、白醋、柠檬、活性炭、香料或其他自制除味剂,也不要建议混用清洁剂或自行拆卸内部部件。
```
**参考输出**
```markdown
1. 将仍可食用的食物转移到另一台冰箱或保冷箱,然后拔掉冰箱电源。
2. 检查并丢弃已经过期或变质的食物,清除可见的残渣。
3. 用软布蘸取说明书允许的温水或中性清洁剂,擦拭冰箱内壁和可见区域,然后彻底擦干。
4. 如果清洁后仍有异味,联系售后检查。不要混用清洁剂、使用自制除味剂或自行拆卸内部部件。
```
### ⭐ 厨房帮手-麻婆豆腐的做法
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
请给出麻婆豆腐的材料、步骤和安全注意事项。肉末需要充分加热;需要加水或高汤时,应先转小火并沿锅边缓慢加入,不要把水直接倒入大量热油;剩菜应及时冷藏并彻底再热。不要只用肉末是否变色判断熟度。
```
**参考输出**
```markdown
材料:
- 嫩豆腐 300 克、牛肉末或猪肉末 100 克
- 豆瓣酱、豆豉、姜末、蒜末、花椒粉适量
- 食用油、水或高汤、水淀粉适量
步骤:
1. 豆腐切块,姜、蒜和豆豉切碎备用。
2. 锅中放少量油,炒香姜蒜、豆瓣酱和豆豉。
3. 加入肉末并充分加热;不要只凭颜色判断是否熟透,有条件时按当地食品安全建议使用食物温度计确认。
4. 先转小火,确认锅内没有大量热油,再沿锅边缓慢加入水或高汤。
5. 放入豆腐,小火煮至入味,最后用水淀粉勾芡并撒上花椒粉。
注意事项:
1. 不要把水直接倒入大量热油,以免飞溅烫伤。
2. 肉末必须充分加热,不能只用是否变色判断熟度。
3. 吃不完的麻婆豆腐应及时分装冷藏,再次食用前彻底加热。
```
## 续写模式
续写示例需要保留代码块中的完整结构,包括末尾的 `Response:`、`English:` 等续写起点。
**结构化任务**
在执行材料提取、总结等任务时,可以保持 Temperature = 1,并将 Top\_P 调低到 0.1,减少输出的随机性。
### ⭐ 提取对话信息并输出 JSON
信息提取是纯机械任务,建议的参数:Temperature 设为 1 ,Top\_P、Presence Penalty、Frequency Penalty 都设为 0
**输入 prompts:**
```bash
Instruction: You are an expert assistant for summarizing and extracting insights from sales call transcripts.
Generate a valid JSON in the following format:
{
"summary": "Summary of the call transcript. ",
"products": ["product 1", "product 2"],
"rep_name": "Name of the sales rep",
"prospect_name": "Name of the prospect",
"action_items": ["Owner: action item 1", "Owner: action item 2"]
}
The action_items array must include every explicitly agreed next step and name the responsible person. Do not claim that a meeting has already been scheduled when the transcript only says it will be arranged. Output JSON only, without a Markdown code fence or explanation.
Input: [Phone rings]
Peter: Hello, this is Peter.
Sarah: Hi Peter, this is Sarah from XYZ Company. I'm calling to discuss our new product, the XYZ Widget, and see if it might be a good fit for your business.
Peter: Hi Sarah, thanks for reaching out. I'm definitely interested in learning more about the XYZ Widget. Can you give me a quick overview of what it does?
Sarah: Of course! The XYZ Widget is a cutting-edge tool that helps businesses streamline their workflow and improve productivity.
Peter: That sounds really interesting. I can see how that could benefit our team. Do you have any case studies or success stories from other companies who have used the XYZ Widget?
Sarah: Absolutely, we have several case studies that I can share with you. I'll send those over along with some additional information about the product. No demo has been scheduled yet.
Peter: That would be great. I'll review the case studies after you send them.
Sarah: Our next steps are: I will send the case studies and additional information, you will review them, and then I will follow up to arrange a demo. In the meantime, feel free to reach out if you have any questions.
Peter: Sounds good, I appreciate your help Sarah. I'm looking forward to learning more about the XYZ Widget and seeing how it can benefit our business.
Sarah: Thank you, Peter.
Peter: You too, bye.
Response:
```
**参考输出:**
```bash
{
"summary": "Peter is interested in the XYZ Widget. Sarah will send case studies and additional information, Peter will review them, and Sarah will then follow up to arrange a demo. No demo has been scheduled yet.",
"products": ["XYZ Widget"],
"rep_name": "Sarah",
"prospect_name": "Peter",
"action_items": [
"Sarah will send case studies and additional information.",
"Peter will review the materials.",
"Sarah will follow up to arrange a demo after Peter reviews them."
]
}
```
***
### ⭐ 总结新闻关键词并输出 JSON
材料总结是结构化任务,建议的参数:Temperature = 1、Top\_P = 0.1、Presence Penalty = 0、Frequency Penalty = 0
此 prompt 使用了 [few-shot 技巧](./Prompt-Format#Few-Shot),为模型提供示范。
**输入 prompt:**
```bash
Instruction: 仅依据给定材料提取关键词,不补充或核验材料中的新闻事实。每次只输出合法 JSON,且只能包含 `keywords` 一个字段。`keywords` 必须是 4 个互不重复的字符串,并依次覆盖“需求方、服务提供方、核心技术、主要供应问题”,不要使用“经济”“市场”“科技”等过宽的词。
User: 公安部今年以来在全国各地共收缴枪支4万支,全国持枪、爆炸犯罪案件同比下降1%。
Assistant: {"keywords": ["公安部", "枪支收缴", "持枪犯罪", "爆炸犯罪"]}
User: 板块方面,春节即将来临,文旅板块再度涌现潜伏盘,丽江股份、九华旅游双双封板,三特索道、峨眉山A涨超5%。因高股息开始受关注的公路股继续悄悄发育,山西路桥涨停,山东高速涨超4%创历史新高,宁沪高速、粤高速A双双新高。
Assistant: {"keywords": ["春节文旅", "丽江股份", "公路股", "高股息"]}
User: 据UDN报道,由于先进封装产能长期短缺,导致英伟达AI芯片供应紧张,之前已经寻求其他途径试图增加先进封装产能,现在已经将目光投向英特尔,作为其高级封装服务的提供商,以减缓紧张的供应形势。除了在美国,英特尔在马来西亚槟城也有封装设施,而且制定了一个开放的模式,允许客户单独利用其封装解决方案。预计英特尔最早会在今年第二季度开始向英伟达提供先进封装,月产能为5000片晶圆。台积电依然会是英伟达主要的封装合作伙伴,占据着最多的份额,不过随着英特尔的加入,使得英伟达所需要的封装总产能大幅度提升了近10%。台积电也没有减慢封装产能的扩张步伐,今年第一季度大概能增至月产能接近5万片晶圆,比去年12月增长25%。AI芯片供应短缺主要源自先进封装产能不足,另外HBM3供应紧张也是原因之一,另外部分云端服务商过度下单也增加了供应链的压力。当然,一些服务器供应商则从这些订单中受惠,并加速扩大产能,以便云端服务商能快速部署设备。
Assistant:
```
**参考输出:**
```json
{
"keywords": ["英伟达", "英特尔", "先进封装", "HBM3"]
}
```
**日常问答**
### ⭐ 多语言互相翻译
在执行翻译任务时,可以通过降低 Top\_P 减少输出差异。建议的参数:Temperature = 1、Top\_P = 0.1、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```bash
Japanese: 春の初め、桜の花が満開になる頃、小さな町の片隅にある古びた神社の境内は、特別な雰囲気に包まれていた。
English:
```
**参考输出:**
```bash
At the beginning of spring, when the cherry blossoms were in full bloom, the grounds of an old shrine tucked away in a corner of a small town were enveloped in a special atmosphere.
```
可以将“Japanese” 和 “English” 修改成其他语言,实现国际语言的翻译,例如:
**输入 prompts:**
```bash
Instruction: Translate the English sentence into natural Spanish. Translate "cherry blossoms" as "flores de cerezo", not the fruit. Preserve every detail and output only the continuation of the Spanish sentence.
English: In the early spring, when the cherry blossoms were in full bloom, a small shrine in a remote corner of a town was enveloped in an atmosphere of special charm.
Spanish: A principios
```
**拼接后的完整结果:**
```bash
A principios de la primavera, cuando las flores de cerezo estaban en plena floración, un pequeño santuario en un rincón remoto de un pueblo estaba envuelto en un ambiente de encanto especial.
```
### ⭐ 根据标题撰写视频文案
在执行创造类型任务时,可以通过适当增大 Temperature 和 Top\_P 两项参数,提高回答的创意。比如 : Temperature = 1 ,Top\_P = 0.3
**输入 prompts:**
```bash
Instruction: 根据标题写一段面向首次使用者的中文视频口播稿,长度为 220 至 350 个中文字符。按“注册后核对账号信息—根据后台实际可见项配置基础功能—发布一条测试内容并预览—查看反馈数据”的顺序展开。不同账号可用的菜单、自动回复等能力可能不同,因此不要编造具体后台路径,也不要承诺所有账号具有相同功能。不要承诺涨粉或商业收益,只输出完整口播稿。
Input: 新手必须知道的微信公众号基础功能搭建方法
Response:
```
**参考输出:**
```bash
大家好,今天用四步完成微信公众号的基础检查。第一步,注册后登录后台,核对账号名称、头像、简介和主体信息,发现不一致先确认可修改范围。第二步,只根据后台当前实际可见的设置配置基础功能;菜单、自动回复等能力会随账号类型不同,以自己的页面为准。第三步,发布一条简短测试内容并先发送预览,检查标题、封面、正文排版和链接在手机上的显示,确认无误后再正式发布。第四步,回到后台查看实际提供的阅读、互动等反馈数据,记录内容表现和用户反馈,再据此调整下一次发布。先走通这套最小流程,再逐步增加功能,排查问题会更容易。
```
**自然语言处理**
在执行自然语言处理任务时,可以保持 Temperature = 1,并将 Top\_P 调低到 0.1,使标签和结构化输出更稳定。
### ⭐ 自然语言处理(情感分类)
#### 1. 用户评论情感分析
**输入 prompts:**
```bash
Instruction: 请判断下面句子的情感倾向,情感类型包括: 负向、正向。
请直接输出类型名称,不要额外输出多余内容。
Input: 服务和环境都不错……
Response:
```
**参考输出:**
```
正向
```
***
#### 2. 外卖评论情感分析
**输入 prompts:**
```bash
Instruction: 对中文外卖应用客户评价进行情感分类,0 为消极,1 为积极。只输出 0 或 1,不要输出解释。
Input: 粉送來的時候已經「斷」完了,跟米飯一樣,唉,有些失望?
Response:
```
**参考输出:**
```
0
```
***
#### 3. 电商产品评论情感分析
**输入 prompts:**
```bash
Instruction: 请分析给定评论属于正面评论还是负面评论。
Input: 物流很快,早上下单,下午就到了。包装也很高档。就是耳机音质很差,煲了一百多小时,音质和同事的一百多元的耳机差不多,1580元买这耳机亏大了。
Response:
```
**参考输出:**
```
负面评论
```
### ⭐ 自然语言处理(相似度分类)
**输入 prompts:**
```bash
Instruction: 请判断下面两句话在语义上是否相似。
请直接输出“是”或“否”,不要额外输出多余内容。
Input: 句子1:剧烈运动后咯血,是怎么了?
句子2:剧烈运动后为什么会咯血?
Response:
```
**参考输出:**
```
是
```
### ⭐ 根据餐饮评价进行打分
**输入 prompts:**
```bash
Instruction: 根据餐厅评价给出 1 至 5 星评分,只输出一个整数。1 星表示强烈负面,2 星表示负面为主但有少量优点,3 星表示褒贬大致相当,4 星表示整体正面但存在较明显的问题,5 星表示整体高度正面且只有轻微不便。
Input: 状元楼饭店第一次去,因为地理位置优越,装修中式,菜是地道的宁波菜,口味纯正,醉泥螺特别棒,吃到了小时候的味道。因为去晚了,在大堂等了一会儿,期间有茶水喝,服务员还会聊天。就餐时生意很好,服务员一直忙碌,但服务态度绝对不打折,样样服务到位,点酒水时还耐心解释。整体体验值得夸赞。
Response:
```
**参考输出:**
```
5
```
### ⭐ 自然语言处理(情感倾向分类)
**输入 prompts:**
```bash
Instruction: 请判断给定中文文本的情感倾向是积极、消极还是中性。只输出类别名称,不要解释。
Input: 这次退款拖了两个月,客服始终没有解决问题,我对此非常失望。
Response:
```
**参考输出:**
```
消极
```
### ⭐ 自然语言处理(机器阅读理解)
**输入 prompts:**
```bash
Instruction: 请首先阅读以下文本信息,然后回答问题。问题的答案应该在文本中能找到,是一句话的形式。
Input: 文本:
材料列出的《战国无双3》开发名称是光荣和 ω-Force。本作属于《战国无双》系列,并包含多个故事和战场。
问题:
文中列出了哪两个开发名称?
Response:
```
**参考输出:**
```
文中列出的开发名称是光荣和 ω-Force。
```
### ⭐ 自然语言处理(触发词识别)
**输入 prompts:**
```bash
Instruction: 请从下面的文本中识别“解除质押”事件的触发词,只输出合法 JSON,格式为 {"TRIGGERS": ["触发词"]}。
Input: text:<万讯自控发布公告称,股东傅宇晨已解除部分股份质押。>
Response:
```
**参考输出:**
```
{"TRIGGERS": ["解除"]}
```
### ⭐ 自然语言处理(理解对话问答)
**输入 prompts:**
```bash
Instruction: 根据男和女的对话,以及问题,从选项中选出答案。只输出合法 JSON,格式为 {"答案": "选项"},不要解释。
Input: {
"对话": [
"男:你今天晚上有时间吗?我们一起去看电影吧?",
"女:你喜欢恐怖片和爱情片,但是我喜欢喜剧片,科幻片一般。"
],
"问题": "女的最喜欢哪种电影?",
"选项": ["恐怖片", "爱情片", "喜剧片", "科幻片"]
}
Response:
```
**参考输出:**
```
{"答案": "喜剧片"}
```
### ⭐ 自然语言处理(文本主题分类)
**输入 prompts:**
```bash
Instruction: 请判断下面的句子属于哪个类别,类别包括文化、娱乐、体育、财经、房产、汽车、教育、科技、军事、旅游、国际、证券、农业、电竞、民生。
请直接输出类别,不要额外输出多余内容。
Input: 国家统计局公布居民消费价格指数和社会消费品零售总额的最新变化。
Response:
```
**参考输出:**
```
财经
```
# RWKV 的提示词格式
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { LinkCard } from 'components-docs/link-card/link-card.tsx'
**RWKV 是 RNN 的变体。出于架构原理,RWKV 对提示词的格式比 Transformer 更敏感。**
RWKV 更适合 QA 和指令问答两种提示格式:
## QA 格式 prompt
QA(问答)格式是 RWKV 的默认训练格式。
其中 `User:` 是用户提问的问题,`Assistant:` 是模型的回答。因此我们需要在**最后一个** `Assistant:` 后面留空,让模型进行续写。
```bash
User: 将下面的英语翻译成中文:RWKV (pronounced RwaKuv) is an RNN with great LLM performance and parallelizable like a Transformer.
Assistant:
```bash
User: 将下面的英语翻译成中文:RWKV (pronounced RwaKuv) is an RNN with great LLM performance and parallelizable like a Transformer.
Assistant:
快思考模式直接闭合 `
## 指令问答格式 prompt
```bash
Instruction: 请将下列英语翻译成中文
Input: RWKV (pronounced RwaKuv) is an RNN with great LLM performance and parallelizable like a Transformer.
Response:
```
指令问答是 RWKV 另一种训练格式。其中 `Instruction:` 是用户给模型的指令,`Input:` 是用户给模型的输入,`Response:` 是模型的回答。
`Response:` 后面留空,让模型进行续写。
```bash
Instruction: 以json格式总结下面的材料文本,包含date/location/title
Input: 2025 年 2 月 22 日,RWKV project 在中国上海漕河泾举办了主题为《RWKV-7 与未来趋势》的开发者大会。来自全国各地的开发者、行业专家和技术创新者齐聚一堂 —— 从知名高校实验室到前沿创业团队,现场涌动的创新能量印证了 RWKV-7 的优秀性能和深远意义。
Response:
```
参考的回复:
```json
{
"date": "2025年2月22日",
"location": "中国上海漕河泾",
"title": "RWKV-7 与未来趋势开发者大会"
}
```
## 材料问答格式
推荐使用以下材料问答格式:
```markdown
User:\n材料:\n{context}\n问题:{question}\n只根据下文回答;没有就答null。\n\nAssistant: {"answer":
User:\n下文:\n{context}\n问题:{question}\n只写材料中的答案;没有就答null。\n\nAssistant: {"answer":
User:\n材料:\n{context}\n问题:{question}\n只回答材料中的答案;没有就答null。\n\nAssistant: {"answer":
User:\n下文:\n{context}\n根据上文回答:{question}\n只根据上文回答;没有就答null。\n\nAssistant: {"answer":
```
可以根据具体的材料内容,修改问题和限制条件。例如:
```markdown
User: 材料:
# 下载最新的 MiniConda 安装包
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 运行 MiniConda 安装包的安装脚本,安装期间一定要注意进展,及时输入 yes !
sh Miniconda3-latest-Linux-x86_64.sh -u
# 重启环境变量,激活 Conda 环境
source ~/.bashrc
# 创建名为 rwkv-lm-v7 的 conda 环境, 并指定 python 版本为 3.12
conda create -n rwkv-lm-v7 python=3.12
# 激活 rwkv 环境
conda activate rwkv-lm-v7
问题:用中文简单解释这段材料的含义
只写答案,不解释。
Assistant: {"answer":
```
在 [web demo](https://www.modelscope.cn/studios/BlinkDL/RWKV-CHN-2) 中并发 16 路测试:
推荐参数: Temperature=1、Topp=0.2、Penalty 参数调整为 0。
## few-shot
对于一些带上下文的问答任务,我们建议在 prompt 中重复几个同类的问题为模型作示范,这种技巧被称为 few-shot。
举个例子:直接使用以下 prompt 进行续写时,模型生成的回复缺乏明显的风格特征:
```bash
User: 请你帮我给以下句子写广告词:这是一款新的笔记本,很轻,电池能用很久。
Assistant:
```
参考的模型回复:
```bash
这款笔记本轻巧便携,让你随时随地畅享移动办公。同时,它的电池续航能力惊人,让你不用担心频繁充电的烦恼。无论是学习、工作还是娱乐,这款笔记本都能满足你的需求。快来体验它吧!
```
使用下面的 few-shot prompt 进行续写时,模型能够从上下文中学习到具有鲜明风格特征的前文信息,从而生成带有明显风格特色的广告词:
```bash
User: 请你帮我给以下句子写广告词:这是一款手冲咖啡壶,玻璃材质,可以过滤咖啡。
Assistant: 告别速溶,只需3分钟,在家复刻咖啡馆级的风味。高透玻璃壶身,亲眼见证每一滴香醇的萃取。用一个清晨的仪式感,唤醒一整天的活力。
User: 请你帮我给以下句子写广告词:我们新出了一门口语课,教你怎么跟外国人聊天。
Assistant: 还在对着屏幕说“Hello, how are you?” 别让你的口语停留在课本里!我们的课程带你走进真实对话场景,从点餐到侃大山,让你自信开口,像本地人一样聊天!
User: 请你帮我给以下句子写广告词:这是一款新的笔记本,很轻,电池能用很久。
Assistant:
```
参考的回复:
```bash
轻盈如羽,电池如海。这款笔记本让你随时随地畅游数字世界,无需担心续航问题。
```
## function call
请使用最新的 RWKV-7 G1x 模型。其他模型即使套用相同提示词,也不具备可靠的 Function Call 能力。
工具定义必须放在 `System: Tools:` 后,并明确要求模型只返回 JSON 函数调用。
````text
System: Tools:
- get_weather(location: string, unit?: "celsius" | "fahrenheit")
- get_stock_price(ticker: string)
- translate_text(text: string, target_language: string)
Return only a JSON function call.
User: Translate "Will it rain tomorrow?" into Japanese.
Assistant: ```json
````
````text
System: Tools:
[
{"name":"find_free_slots","description":"Find free calendar slots","arguments":{"date":{"type":"string"},"duration_minutes":{"type":"integer"},"time_window":{"type":"string"}}},
{"name":"create_calendar_event","description":"Create a calendar event","arguments":{"title":{"type":"string"},"start_time":{"type":"string"},"end_time":{"type":"string"},"attendees":{"type":"array","items":{"type":"string"}}}}
]
Return only a JSON function call.
User: Schedule a 30-minute sync with Bob on 2026-05-08 afternoon.
Assistant: ```json
{"name":"find_free_slots","arguments":{"date":"2026-05-08","duration_minutes":30,"time_window":"afternoon"}}
```
User: Function output:
{"free_slots":[{"start":"2026-05-08T15:00:00+09:00","end":"2026-05-08T15:30:00+09:00"}],"bob_email":"bob@example.com"}
Assistant: ```json
````
应用需要解析并校验模型返回的 JSON、限制可调用的工具,并处理参数缺失与执行失败;模型只负责生成调用请求,不会替应用执行工具。
## 视频介绍
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1XXQ3YoEXW/)观看。
# RWKV 的解码参数
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
你可能注意到了,很多 RWKV 部署/体验工具都支持调整 `Temperature`、`Top_P` 、`Presence Penalty `、`Frequency Penalty`等参数,这些参数是 RWKV 模型的“解码参数”(也可称之为“采样参数”)。
通过**调整解码参数**,可以改变模型的生成效果。
即使是使用同一个 Prompt、同一个 RWKV 模型,不同的参数配置可能获得截然不同的回答。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1iMRnY8ENn)观看。
## RWKV 模型的解码参数
RWKV 主要解码参数对应的效果如下:
| 参数 | 效果 |
| ------------------- | ------------------------------------------------------------------------------------- |
| `Temperature` | 温度参数 $T$ 通过修改 logits 的缩放比例控制生成结果的随机性。高温会使概率分布更均匀,增加生成内容的随机性;低温则使模型更倾向于选择概率最高的 token |
| `Top_P` | 选择累积概率达到 $P$ 值的前 $N$ 个 token 作为候选集。如设置成 0.1 则考虑前 10% , 生成内容质量更高但更保守。设置成 1 则内容质量降低但更多样 |
| `Presence Penalty` | 存在惩罚,对**已出现过的所有 token** 施加**固定惩罚**,从而增加了模型生成新 token 的可能性 |
| `Frequency Penalty` | 频率惩罚,根据 **token 出现的次数**进行**累加惩罚**,从而减少模型频繁地重复相同内容的可能性 |
| `Penalty Decay` | 惩罚衰减参数,用于控制 `Presence Penalty` 和 `Frequency Penalty` 的衰减速度。数值越接近 1,惩罚衰减得越慢;数值越小,则衰减越快 |
| `max_tokens` | 模型生成文本时的最大 token 数,可以理解为“模型一次最多生成多少字” |
接下来,我们将 RWKV 模型比喻为一名作家,并使用**更通俗易懂的说法**解释这些参数的作用。
### `Top_P` 参数
`Top_P` 就像一位主编,它决定 RWKV 这位作家**可以使用多少词汇**。假设当前可选的词汇有 100 个,那么:
* `Top_P = 0.2` 是一位**非常严苛**的主编,只允许 RWKV 使用最常见、最符合逻辑的词汇(按照 Zipf 语言分布,实际可选词可能仅有 3 \~ 8 个)。
* `Top_P = 1` 是一位**非常宽松**的主编,RWKV 可以自由选择所有 100 个词汇,生成更加多样化的文本。
**`Top_P` 调整建议**:
| 使用场景 | 推荐 `Top_P` | 适用情况 |
| -------------------- | ---------- | --------------------------- |
| 创意写作、故事生成 | 0.7 | 允许一定程度的发散,避免内容过于死板,同时不会偏离主题 |
| 机械式问答、摘要、翻译 | 0.3 | 重点保持精准、减少不必要的发散 |
| 确定性回答(是/否、ABCD、1234) | 0 | 只允许最确定的答案,完全避免随机性 |
### `Temperature` 温度参数
增加 `Temperature` 温度参数就像给 RWKV 这位作家“喝酒”。增加温度参数会增大文字的**随机性**,使内容更多样化,但太高**可能使生成的内容不通顺或不合常理**。
* 如果温度较低(如 0.5 以下),模型会像严谨的学术作家一样,只使用最通用最稳健的词汇。比如“阳光明媚” 会描述为 “日照充足”。更严谨,适合正式写作或精确回答。
* 如果温度较高(如 1.5 以上),模型会像喝醉的诗人一样,使用更多不常见的词汇,比如把彩虹描述为"宇宙的彩色伤口"。更有创造力,但可能出现不连贯表达。
**`Top_P` 极低时,需适当提高 `Temperature`(1 以上),避免文本陷入死循环或重复**。
### `Presence Penalty` 参数
`Presence Penalty` 可以防止同一个词被反复使用,但不会因多次出现而增加惩罚力度。它的本质类似于一个动态更新的“禁用词库”:
* 每当模型生成一个新词,该词会立即被加入“禁用词库”
* 在后续生成过程中,该词**出现的概率会被固定降低一定值**(例如 0.5)
假设当前的 `Presence Penalty` 参数值是 0.5, “美丽” 这个词在原始情况下的生成概率为 10%。那么
* 若“美丽”这个词此前已出现过,则其生成概率会被扣除固定值,对应 logits 下降,最终概率降低
* 但其他未出现的词不受影响,其 logits 不变,最终概率可能因归一化略有调整
`Presence Penalty` 数值过高,可能会导致模型**过度避免重复用词**,使文本变得不自然或不连贯。在 `Top_P` 极低等极端情况下,可能影响标点符号的使用,甚至生成异常字符或难以理解的文本。
### `Frequency Penalty` 参数
`Frequency Penalty` 用于**抑制高频重复词**,它会根据**某个词在已生成文本中出现的次数**来降低其后续出现的概率。出现次数越多,惩罚越强。可通过增加 `Frequency Penalty` 参数来**减少“然后”、“嗯嗯”等口头禅式的重复**,从而让生成的文本更加自然流畅。
假设当前的 `Frequency Penalty` 设为 `0.3`,某个词“美丽”的原始生成概率是 `10%`,但此前已经生成过三次:
* 计算惩罚后,"美丽" 的新概率 = `10% - (3 × 0.3)` = `9.1%`
* 如果再生成一次(累计四次出现),则新一轮惩罚扣除 `4 × 0.3 = 1.2%`
以上示例仅用于说明 `Frequency Penalty` 的作用,实际计算通常是对 logits 进行乘法调整,而不是简单的减法操作。
### `Penalty Decay` 参数
`Penalty Decay` 参数用于控制 `Presence Penalty` 和 `Frequency Penalty` 的衰减速度,它会根据 token 之间的距离,逐步减弱惩罚强度。
假设 `Presence Penalty = 1`,而模型写下了:“美 好 的 天 气 …”。前面我们了解过, `Presence Penalty` 会对出现过的字添加惩罚,因为“美”已经在第一个位置出现过,`Presence Penalty = 1` 会大大降低模型再次生成“美”字的概率。
但是 `Presence Penalty` 惩罚的强度并不是一成不变的,在 `Penalty Decay` 参数的作用下,`Presence Penalty` 惩罚会随着文本的长度增加而逐步减弱,衰减公式:$P_{\mathrm{effective}} = P_0 \cdot \gamma^d$,其中 $P_0$ 是原始惩罚值,$\gamma$ 是 `Penalty Decay` 值,$d$ 是与“美”上次出现的位置的距离。
从公式可以看出来,惩罚减弱的速度由 `Penalty Decay` 参数的大小决定。`Penalty Decay` 参数的范围是 0.99 \~ 0.999,数值越接近 1,惩罚衰减得越慢;越小则衰减越快。
如果把 RWKV 模型比作一位作家,那么 `Penalty Decay` 就是这位作家的**记性**:
* `Decay = 0.99` 时,RWKV 模型的**记性很差**。在生成 100 个字之后,它对第一个“美”字的惩罚值只剩下约 0.366($Presence Penalty \cdot 0.99^{100} \approx 1.0 \cdot 0.366 \approx 0.366$)。此时模型已经忘记自己生成过“美”字了,模型**生成“美”字的概率很高**。
* `Decay = 0.999` 时,RWKV 模型的**记性很好**。在生成 100 个字之后,它对第一个“美”字的惩罚值仍然高达 0.905($Presence Penalty \cdot 0.999^{100} \approx 1.0 \cdot 0.905 \approx 0.905$)。模型会牢记自己曾经生成过“美”字,此时**生成“美”字的概率很低**。
## 不同任务的推荐解码参数组合
我们为不同的任务提供了一些推荐的参数:
下面先给出 RWKV-7 G1 模型卡的参数起点,再保留两组按任务收紧随机性的通用示例。其他架构或微调模型应以对应模型卡为准。
| 任务类型 | Top\_P | Temperature | Presence Penalty | Frequency Penalty | Penalty Decay |
| --------------------- | ---------- | ----------- | ---------------- | ----------------- | ------------- |
| G1 创意写作 | 0.6 \~ 0.8 | 0.6 | 2.0 | 0.2 | 0.99 |
| G1 普通聊天 | 0.5 | 1.0 | 2.0 | 0.1 | 0.99 |
| 保守型任务,回答稳定且准确 | 0.3 | 0.3 | 0.0 | 0.0 | 0.996 |
| G1f 1.5B+ 函数调用(模型卡参数) | 0.0 | 0.0 | 0.0 | 0.0 | 保持默认值(不生效) |
| 机械任务,无随机性 | 0.0 | 0.0 | 0.0 | 0.0 | 保持默认值(不生效) |
* **创意类内容创作**:典型的例子是小说、故事创作,需要平衡 `Temperature` 和 `Top_P`,提供更多的**随机性**和**开放性**,让模型能生成更具想象力的表达。
* **G1 普通聊天**:采用当前模型卡给出的聊天基线;其他架构或微调模型可能需要不同参数。
* **保守型任务**:如知识问答、代码任务等,需要稳定且准确的回答,因此大幅降低 `Top_P` 和 `Temperature` ,同时移除 `Presence Penalty` 和 `Frequency Penalty` 带来的惩罚。
* **函数调用**:RWKV-7 G1 模型卡为 G1f 1.5B 及更大模型给出的建议是将 `Temperature`、`Top_P`、`Presence Penalty` 和 `Frequency Penalty` 设为 0。还需配合对应的 Function Call 模板,并测试目标模型的输出稳定性。
* **机械任务**:如选择题、判断题等,需要严格遵循特定格式,只输出唯一解。可以将 `Temperature`、`Top_P`、`Presence Penalty` 和 `Frequency Penalty` 设为 0,以取消随机性。两个惩罚参数均为 0 时,`Penalty Decay` 不会影响输出,保持后端默认值即可。
`Top_P = 0` 时, `Temperature` 参数会失效。
# 为 RWKV 作贡献
import { CallOut } from 'components-docs/call-out/call-out.tsx'
我们期待你为 RWKV 作出贡献,无论是开展 RWKV 相关的研究、协助我们改进文档,或是提供 RWKV 的建议。
我们将不定期为 RWKV 生态的贡献者赠送礼品,或提供开发资源帮助。
## 社区成员的贡献方向
您可以选择感兴趣的方向参与贡献:
* [改进文档](#docs)
* [试用模型和应用](#test)
* [开发应用](#develop)
* [进行基准测试](#benchmark)
* [提供数据集](#dataset)
* [多模态研究](#multimodal)
### 帮助我们改进文档
RWKV 中文文档[已经开源](https://github.com/LeoLin4258/rwkvcn-docs),请帮助我们**改进文档**,使其他用户可以更轻松地使用 RWKV 模型/应用。
我们欢迎各种形式的文档贡献,包括但不限于:
* 为文档提供更好的表达方法
* 撰写 RWKV 相关的教程或用户案例
* 录制 RWKV 的在线视频教程
* 设计全新的文档形式
可以加入 RWKV 社区文档贡献与交流组(QQ 群 1022164805),沟通并参与文档贡献。
### 试用 RWKV 模型和应用
试用**最新的 RWKV 模型和处于内测阶段的应用**,并提供真实的用户反馈,帮助我们改进模型和应用。
加入 RWKV 应用/项目内测群(QQ 群 332381861),以了解并体验 RWKV 的最新产品/项目。
### 开发 RWKV 应用
开发基于 RWKV 的 应用,比如 ChatBot、推理工具、训练方法等。
以下是社区开发的 RWKV 应用,仅供参考:
* [00ffcc/conRWKV](https://github.com/00ffcc/conRWKV):一个高并发的 RWKV 云端推理引擎
* [Jellyfish042/Sudoku-RWKV](https://github.com/Jellyfish042/Sudoku-RWKV):一个解决数独谜题的专用 RWKV 模型
在 RWKV 技术研发群(QQ 群 325154699)中讨论并分享您的 RWKV 应用。
### 进行 RWKV 基准测试
想要让 RWKV 变得更好,则需要有可靠的测试方法来评估它的表现。
如果你能帮我们**设计全新的基准测试**,或者**运行一些常见的模型测试**,就能更清楚地看出 RWKV 和其他开源模型相比有什么优势和不足。
一个示例是由 RWKV 社区成员 [@Jellyfish042](https://github.com/Jellyfish042) 构建的 [Uncheatable Eval](https://github.com/Jellyfish042/uncheatable_eval),这是一项“无法作弊的 LLM 基准测试”,尝试使用新的 arXiv 论文和 BBC 新闻来评估语言模型的建模能力。
在 RWKV 技术研发群(QQ 群 325154699)中讨论并分享您关于 RWKV 的基准测试结果。
### 提供多语言数据集
RWKV 的目标是训练适用于**全球所有语言**的 AI 模型。
请帮助我们构建多语言(非英语)数据集,使 RWKV 模型能更好地支持全球语言。
可以在 RWKV discord 的 [#dataset channel](https://discord.gg/uMpzuDwcu5) 频道或 RWKV技术研发群(QQ 群 325154699)中参与此工作。
### 帮助我们开展多模态工作
欢迎大家探究 RWKV 语言模型之外的多模态工作,比如图像(Visual、Diffusion)、语音(TTS、ASR),或其他类型的工作。
RWKV 现有的多模态等学术研究可以在 [RWKV 生态](./Links) 中找到:
一些代表性的 RWKV 多模态研究工作:
* VisualRWKV
* [GitHub 仓库](https://github.com/howard-hou/VisualRWKV)
* [模型下载](https://huggingface.co/howard-hou/visualrwkv-6)
* [在线 Demo](https://huggingface.co/spaces/howard-hou/VisualRWKV-Gradio-1)
* RWKV ASR(自动语音识别)
* 相关论文:Exploring RWKV for Memory Efficient and Low Latency Streaming ASR
* [论文地址](https://arxiv.org/abs/2309.14758)
* pointRWKV(基于 RWKV 的 3D 点云学习框架)
* 相关论文:PointRWKV: Efficient RWKV-Like Model for Hierarchical Point Cloud Learning
* [论文地址](https://arxiv.org/pdf/2405.15214)
* [GitHub 仓库](https://github.com/hithqd/PointRWKV)
* RWKV-UI: 用户界面(UI)理解
* 相关论文:UI Understanding with Enhanced Perception and Reasoning
* [论文地址](https://arxiv.org/abs/2502.03971)
## RWKV 贡献者公约
### 我们的承诺
身为社区成员、贡献者和领袖,我们承诺使社区成员不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗教信仰、性倾向或性取向
我们承诺以有助于建立开放、友善、多样化、包容、健康社区的方式行事和互动。
### 我们的准则
我们鼓励使社区变得积极健康的行为,包括但不限于:
* 表现出对他人的同情和善意
* 尊重不同的主张、观点和感受
* 提出和大方接受建设性意见
* 承担责任并向受我们错误影响的人道歉
* 注重社区共同诉求,而非个人得失
禁止影响社区氛围的不当行为,包括:
* 使用情色化的语言或图像,及性引诱或挑逗
* 嘲弄、侮辱或诋毁性评论,以及人身或政治攻击
* 公开或私下的骚扰行为
* 未经他人明确许可,公布他人的私人信息,如物理或电子邮件地址
* 其他有理由认定为违反职业操守的不当行为
### 责任和权力
社区领袖有责任解释和落实我们所认可的行为准则,并妥善公正地对他们认为不当、威胁、冒犯或有害的任何行为采取纠正措施。
社区领导有权力和责任删除、编辑或拒绝或拒绝与本行为准则不相符的评论(comment)、提交(commits)、代码、维基(wiki)编辑、议题(issues)或其他贡献,并暂时或永久地封禁他们认为不适当、威胁、冒犯或有害行为的贡献者。
### 适用范围
本行为准则适用于所有 RWKV 社区场合,也适用于在公共场所代表 RWKV 社区的个人。
包括使用 RWKV 官方的电子邮件地址、通过 RWKV官方社交媒体帐户发帖或在线上或线下的 RWKV 活动中担任代表的成员。
### 监督
遇到辱骂、骚扰或其他不可接受的行为时,可通过 RWKV 官方 QQ 群或其他渠道向负责监督的社区成员举报。
所有投诉都将得到及时、公平的审查,所有社区领袖都有义务保护举报者的隐私和安全。
### 参见
本行为准则改编自 [Contributor Covenant](https://www.contributor-covenant.org) 2.1 版, 详情参见 [https://www.contributor-covenant.org/version/2/1/code\_of\_conduct.html](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html)\[v2.1]。
# RWKV 的训练数据集
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV 使用 **World 系列训练数据集**,覆盖一百多种语言。本页整理论文和模型发布页已经公开的数据组成、来源与规模;未公开的训练配比不会根据模型名称猜测。
## RWKV 数据集概况
目前 World 数据集共有以下版本:
| 版本号 | 已公开的总数据量 | 已公开的对应模型 |
| ---------- | --------------------------- | ----------------------------------------- |
| World v1 | 约 0.59T tokens | RWKV-4 系列(已淘汰) |
| World v2 | 约 1.1T tokens | RWKV-5 系列(已淘汰) |
| World v2.1 | 约 1.42T tokens | RWKV-6 系列 |
| World v2.8 | 从 World v3 中随机采样约 1T tokens | RWKV-7-World 0.1B |
| World v2.9 | 从 World v3 中随机采样约 2T tokens | RWKV-7-World 0.4B |
| World v3 | 约 3.1T tokens | RWKV-6-World 7B v3,RWKV-7-World 1.5B/2.9B |
| World v3.5 | 约 5.16T tokens | RWKV7-G1 1.5B/2.9B |
| World v3.7 | 尚无公开、可复现的总 token 统计 | 暂不建立模型对应关系 |
RWKV7-G1 0.1B 从 World v3.5 数据集中随机采样 1T tokens 训练
RWKV7-G1 0.4B 从 World v3.5 数据集中随机采样 2T tokens 训练
查找某个检查点的训练信息时,请优先打开它的模型卡并核对完整文件名。当前模型名中的 G1x 是 Data Version(数据版本)标识,并不等同于 World 数据集版本;文件名也不会列出具体数据组成,不能根据字母后缀或参数量反推训练数据。
## 各版本数据集的细节
秉持着“开源开放”的精神,我们在 RWKV 的架构论文中开源了 World 系列数据集的组成和来源。
前往论文查看:
* World v2 的详细介绍可以在 [RWKV-5/6 论文](https://arxiv.org/abs/2404.05892)的 `Training Dataset Details` 板块中找到。
* World v2.1/v3 的详细介绍可以在 [RWKV-7 论文](https://arxiv.org/abs/2503.14456)的 `Training Dataset Details` 板块中找到。
以下内容摘录于论文:
### World v2 数据集
RWKV-6 的 v2 训练数据集涉及多个领域,具体包含以下内容:
| Dataset | Domain | Dataset | Domain |
| -------------------------------------------------------------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------- | -------------------------- |
| [Wikipedia](https://huggingface.co/datasets/olm/wikipedia)$^a$ | Encyclopedia | [SlimPajama](https://huggingface.co/datasets/cerebras/SlimPajama-627B) | Web |
| [peS2o](https://huggingface.co/datasets/allenai/peS2o) | Academia | [BigPatent](https://huggingface.co/datasets/big_patent) | Patents |
| [Pile of Law](https://huggingface.co/datasets/pile-of-law/pile-of-law) | Legal, Administrative | [StarCoder](https://huggingface.co/datasets/bigcode/starcoderdata)$^b$ | Code |
| [OSCAR23.01](https://huggingface.co/datasets/oscar-corpus/OSCAR-2301)$^c$ | Multilingual Web | [TED2020](https://huggingface.co/datasets/wecover/OPUS_TED2020) | Transcripts: TED, TEDx |
| [PhilPapers](https://github.com/thoppe/The-Pile-PhilPapers) | Academia: Philosophy | [NIH-ExPORTER](https://github.com/thoppe/The-Pile-NIH-ExPORTER) | Grants: NIH |
| [EuroParl](https://github.com/thoppe/The-Pile-EuroParl) | Multilingual Legal | [Enron-Emails](https://github.com/EleutherAI/pile-enron-emails) | Emails |
| [Ubuntu IRC](https://github.com/EleutherAI/pile-ubuntu-irc) | Chat | [HackerNews](https://github.com/EleutherAI/hn-scraper) | Forums |
| [OpenWebText2](https://github.com/EleutherAI/openwebtext2) | Web | [Gutenberg PG-19](https://github.com/deepmind/pg19) | Books |
| [Books3](https://twitter.com/theshawwn/status/1320282149329784833) | Books | [OpenSubtitles](https://huggingface.co/datasets/suolyer/pile_opensubtitles) | Subtitles |
| [YTSubtitles](https://huggingface.co/datasets/suolyer/pile_youtubesubtitles) | Subtitles | [ao3\_skylion](https://gwern.net/gpt-2#archive-of-our-own-ao3-gpt-2-1-5b) | Stories |
| [honeyfeed-3600](https://huggingface.co/datasets/RyokoAI/Honeyfeed3600) | Stories | [scribble-17k](https://huggingface.co/datasets/RyokoAI/ScribbleHub17K) | Stories |
| [syosetu711k](https://huggingface.co/datasets/RyokoAI/Syosetu711K)$^o$ | Stories (Japanese) | [marianna13/fanfics](https://huggingface.co/datasets/marianna13/fanfics) | Stories |
| [marianna13/gamedev](https://huggingface.co/datasets/marianna13/gamedev) | Forums | [marianna13/ia-books](https://huggingface.co/datasets/marianna13/ia-books) | Books |
| [marianna13/libgen](https://huggingface.co/datasets/marianna13/libgen) | Textbooks, Books | [marianna13/research\_gate](https://huggingface.co/datasets/marianna13/research_gate) | Academia |
| [marianna13/superuser](https://huggingface.co/datasets/marianna13/superuser) | Forums | [marianna13/the-eye](https://huggingface.co/datasets/marianna13/the-eye) | Books |
| [marianna13/vault\_text](https://huggingface.co/datasets/marianna13/vault_text) | Books | [marianna13/random\_quora](https://huggingface.co/datasets/marianna13/random_quora)$^o$ | Forums |
| [marianna13/zlib](https://huggingface.co/datasets/marianna13/zlib) | Books | [minipile](https://huggingface.co/datasets/JeanKaddour/minipile) | Various |
| [tatoeba](https://huggingface.co/datasets/Helsinki-NLP/tatoeba_mt) | Multilingual Translations | [poetry-foundation](https://huggingface.co/datasets/shahules786/PoetryFoundationData) | Poetry |
| [proof-pile](https://huggingface.co/datasets/hoskinson-center/proof-pile) | Academia: Math | [reddit-math](https://huggingface.co/datasets/P1ayer-1/reddit-math) | Forums: Math |
| [soda](https://huggingface.co/datasets/allenai/soda) | Dialogue | [song\_lyrics](https://huggingface.co/datasets/amishshah/song_lyrics) | Lyrics |
| [TinyStories](https://huggingface.co/datasets/roneneldan/TinyStories) | Stories | [walkthroughs2020](https://gwern.net/gpt-2#video-game-walkthrough-gpt-2-1-5b) | Game Walkthroughs |
| [wikihow-qa-16k](https://huggingface.co/datasets/0x22almostEvil/multilingual-wikihow-qa-16k) | How-To | [Alpaca](https://huggingface.co/datasets/tatsu-lab/alpaca) | Various |
| [camel-ai/math](https://huggingface.co/datasets/camel-ai/math) | Math | [camel-ai/code](https://huggingface.co/datasets/camel-ai/code) | Code |
| [camel-ai/physics](https://huggingface.co/datasets/camel-ai/physics) | Physics | [camel-ai/chemistry](https://huggingface.co/datasets/camel-ai/chemistry) | Chemistry |
| [camel-ai/ai\_society](https://huggingface.co/datasets/camel-ai/ai_society) | Job Roles | [camel-ai/biology](https://huggingface.co/datasets/camel-ai/biology) | Biology |
| [Dolly](https://huggingface.co/datasets/databricks/databricks-dolly-15k) | Various | [Evol-Instruct](https://huggingface.co/datasets/WizardLM/WizardLM_evol_instruct_70k) | Various |
| [gpt4all](https://huggingface.co/datasets/nomic-ai/gpt4all_prompt_generations) | Code | [Guanaco](https://huggingface.co/datasets/JosephusCheung/GuanacoDataset) | Various Multilingual |
| [LaMini](https://huggingface.co/datasets/MBZUAI/LaMini-instruction) | Various | [oasst1](https://huggingface.co/datasets/OpenAssistant/oasst1) | Multilingual Conversations |
| [ShareGPT](https://huggingface.co/datasets/RyokoAI/ShareGPT52K) | Conversations | [UltraChat](https://github.com/thunlp/UltraChat) | Conversations |
| [BELLE 10M Chinese](https://github.com/LianjiaTech/BELLE/tree/main/data/10M) | Various Chinese | | |
**脚注:**
* $^a$ 对于维基百科(Wikipedia),我们收集了截至 2023 年 4 月 1 日的所有语言版本,并对某些语言进行了随机子采样。
* $^b$ 对于 StarCoder,我们仅使用了至少有 10 颗星的数据集。
* $^c$ 对于 OSCAR23.01,我们仅使用非英语语言的部分,并对某些语言进行了随机子采样。
* $^o$ 表示该数据的原始仓库链接已失效,但 RWKV 数据集仍在使用这部分数据
### World v2.1 数据集
World v2.1 数据集基于 World v2 构建。相较于 v2 版本,v2.1 增加了下表中的数据:
| Dataset | Domain | Dataset | Domain |
| ----------------------------------------------------------------------------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------- | ------ |
| [slimpajama C4](https://huggingface.co/datasets/cerebras/SlimPajama-627B) | Web | [Llama-3-Magpie-Pro-1M-v0.1](https://huggingface.co/datasets/Magpie-Align/Llama-3-Magpie-Pro-1M-v0.1) | Align |
| [dolma v1.6 (reddit only)](https://huggingface.co/datasets/allenai/dolma/blob/main/urls/v1_6.txt)$^a$ | Forums | [Magpie-Pro-MT-300K-v0.1](https://huggingface.co/datasets/Magpie-Align/Magpie-Pro-MT-300K-v0.1) | Align |
| [glaive-code-assistant-v3](https://huggingface.co/datasets/glaiveai/glaive-code-assistant-v3) | Code | [Magpie-Air-MT-300K-v0.1](https://huggingface.co/datasets/Magpie-Align/Magpie-Air-MT-300K-v0.1) | Align |
| [m-a-p\_Code-Feedback](https://huggingface.co/datasets/m-a-p/Code-Feedback) | Code | [Magpie-Qwen2-Pro-1M-v0.1](https://huggingface.co/datasets/Magpie-Align/Magpie-Qwen2-Pro-1M-v0.1) | Align |
| [cosmopedia-v0.1](https://huggingface.co/datasets/HuggingFaceTB/cosmopedia) | Synthetic | [Magpie-Phi3-Pro-300K-Filtered-v1](https://huggingface.co/datasets/Magpie-Align/Magpie-Phi3-Pro-300K-Filtered-v0.1)$^o$ | Align |
| [SystemChat-2.0](https://huggingface.co/datasets/cognitivecomputations/SystemChat-2.0) | Instruct | [Magpie-Gemma2-Pro-200K-Filtered-v0.1](https://huggingface.co/datasets/Magpie-Align/Magpie-Gemma2-Pro-200K-Filtered-v0.1)$^o$ | Align |
| [Tess-v1.5](https://huggingface.co/datasets/migtissera/Tess-v1.5) | Instruct | | |
| [UltraInteract\_sft](https://huggingface.co/datasets/openbmb/UltraInteract_sft) | Instruct | | |
**脚注:**
* $^a$ 我们仅添加了 dolma v1.6 中的 reddit 数据集
* $^b$ [DM\_math](https://huggingface.co/datasets/timaeus/pile-dm_mathematics) 作为 The Pile 的一部分存在于 World v2 中
* $^o$ 表示该数据的原始仓库链接已失效,但 RWKV 数据集仍在使用这部分数据
### World v3 数据集
World v3 数据集基于 World v2.1 数据集构建,更加全面,在覆盖领域、数据量和质量上都有显著提升。
新增数据如下表所示:
| Dataset | Domain | Dataset | Domain |
| ----------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------ | --------- |
| [REMOVED slimpajama parts](https://huggingface.co/datasets/cerebras/SlimPajama-627B)$^a$ | Web | [StarCoder](https://huggingface.co/datasets/bigcode/starcoderdata)$^c$ | Code |
| [dclm-baseline-10-of-10](https://huggingface.co/datasets/mlfoundations/dclm-baseline-1.0/tree/main/global-shard_10_of_10)$^b$ | Web | [python-edu](https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus/tree/main/python-edu) | Code |
| [ccnews](https://huggingface.co/datasets/stanford-oval/ccnews) | Web | [cosmopedia-v0.2](https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus/tree/main/cosmopedia-v2) | Synthetic |
| [fineweb-edu](https://huggingface.co/datasets/HuggingFaceFW/fineweb-edu) | Web Edu | [WebInstructSub](https://huggingface.co/datasets/TIGER-Lab/WebInstructSub) | Forums |
| [TemplateGSM](https://huggingface.co/datasets/math-ai/TemplateGSM) | Math | [Buzz-v1.2](https://huggingface.co/datasets/H-D-T/Buzz-V1.2) | Instruct |
| [open-web-math](https://huggingface.co/datasets/EleutherAI/proof-pile-2/tree/main/open-web-math) | Math | [SKGInstruct](https://huggingface.co/datasets/TIGER-Lab/SKGInstruct) | Instruct |
| [algebraic-stack](https://huggingface.co/datasets/EleutherAI/proof-pile-2/tree/main/algebraic-stack) | Math | [FLAN](https://huggingface.co/datasets/Muennighoff/flan) | Instruct |
**脚注:**
* $^a$ 我们从 World v3 的语料库中移除了 SlimPajama 的 CC 和 C4 部分。
* $^b$ 对于 DCLM-baseline,我们仅保留了 global-shard\_10\_of\_10。
* $^c$ 对于 StarCoder,我们使用了全部的数据集,而非筛选 10 星以上的数据集。
World v3 数据集更加全面,覆盖领域更广的同时数据量更大,质量也更高。
**World v3 数据集的具体数据类型和数据量配比**:
| **类别** | **Token 数(B)** |
| --------------------------------- | ----------------------- |
| 网络(Web) | 1945.2 |
| 图书(Books) | 337.2 |
| 代码(Code) | 258.4 |
| 科学与维基(Science & Wiki) | 222.7 |
| 小说(Fiction) | 192.6 |
| 聊天、问答与指令(Chat & QA & Instruction) | 110.0 |
| 数学(Math) | 32.3 |
| 法律与政府(Law & Government) | 19.0 |
| 诗歌与歌词(Poetry & Lyrics) | 1.7 |
| **总计** | **3119.2**(3.1T tokens) |
# RWKV 常见问题
import { CallOut } from 'components-docs/call-out/call-out.tsx'
## 下一个 RWKV 模型什么时候发布?
RWKV 没有固定的发布计划,也不承诺何时发布下一个模型。一般来说,负责 RWKV 项目的 BlinkDL(Bo) 会在模型准备好的第一时间发布新模型。
所以下一个版本的发布时间可能是接下来的几天,或者接下来的几个月。
通常情况下,当我们发布最新版本的模型时,下一个版本模型的训练/准备过程已经在进行中。
## 怎样读懂 RWKV 模型文件名?
模型名通常会同时记录架构、数据版本、参数量、日期和上下文长度。以 `rwkv7-g1j-2.9b-20260831-ctx16384.pth` 为例:
| 字段 | 含义 |
| ---------- | -------------------------------------------------------------------- |
| `rwkv7` | RWKV-7 架构 |
| `g1j` | G1 系列的 Data Version(数据版本);G1x 表示训练超过 1 个 epoch,后缀表示继续加入更多、更新且质量更高的数据 |
| `2.9b` | 约 29 亿参数 |
| `20260831` | 检查点日期 |
| `ctx16384` | 训练或发布时标注的上下文长度 |
| `.pth` | PyTorch 权重文件;RWKV pip 和 Albatross 都使用这种模型格式 |
[RWKV-7 G1 模型卡](https://huggingface.co/BlinkDL/rwkv7-g1)将 Gxx 定义为 Data Version。文件名不会列出具体数据组成,选择模型时还应结合参数量、日期和模型卡说明。
如果想深入了解 RWKV 的训练数据集,请前往[RWKV 的训练数据集](./Dataset)查看。
## 为什么 RWKV 在模型名称中列出了上下文长度(4k / 8k)?
虽然 RWKV 在技术层面上具有 “无限”的上下文长度,但它需要一定上下文长度的训练数据,才能有效执行任务。
列出的模型 “上下文长度” 是模型已经训练过的 “有效上下文长度”。对超过这个长度的内容,模型的性能预计会小幅下降。
如果你有训练数据,是可以训练/微调 RWKV 模型到更长的上下文长度的。
## RWKV 根据什么开源许可证发布?
RWKV 及其模型根据 Apache 2.0 开源许可证发布,这意味着它适用于商业和非商业用途。
## RWKV 使用什么分词器(Tokenizer)?
RWKV-World 系列模型使用 `rwkv_vocab_v20230424` 分词器,具体的文件是 `rwkv_vocab_v20230424.txt`,可以在 RWKV-主库的 [RWKV-v5/tokenizer](https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v5/tokenizer/rwkv_vocab_v20230424.txt)
目录中找到 。
`rwkv_vocab_v20230424` 分词器合并了以下分词器的词汇表,并手动为非欧洲语言选择了 token:
* [GPT-NeoX-20B](https://huggingface.co/EleutherAI/gpt-neox-20b)
* [GPT2](https://huggingface.co/openai-community/gpt2)
* [cl100k\_base of tiktoken](https://github.com/openai/tiktoken)
* [Llama2](https://huggingface.co/meta-llama/Llama-2-7b-hf)
* [Bloom](https://huggingface.co/bigscience/bloom)
分词器通过 Trie(前缀树)实现,在提高速度的同时保持简洁性。编码过程是通过从左到右匹配词汇表中最长的元素与输入字符串进行的。
分词器的词汇量大小为 V = 65536,编号从 0 到 65535,token 按其在字节中的长度排列。
以下是简要概述:
* token 0:表示文本文档之间的边界,称为 `` 或 ``。此 token 不编码任何特定内容,仅用于文档分隔。
* token 1-256:由字节编码组成(tokenk 编码字节 k−1),其中 token 1-128 对应于标准 ASCII 字符。
* token 257-65529:至少具有 2 个 UTF-8 字节长度的 token,包括单词、前缀和后缀、带重音的字母、汉字、韩文、平假名、片假名和表情符号。例如,汉字被分配在 token 10250 至 18493 之间。
* token 65530-65535:预留 token,供将来使用。
## RWKV 支持 “训练并行化” 吗?为什么 RetNet 论文声称不支持?
RWKV 通过 deepspeed 支持跨多个 GPU 的 “训练并行化”。在许多情况下,在类似参数计数的训练速度上超过了 Transformer。
这与 [huggingface](https://huggingface.co/docs/transformers/v4.15.0/parallelism) 或其他[论文](https://www.researchgate.net/figure/Different-Training-Parallelization-Strategies_fig2_334821612)采用的定义一致。
RetNet 将 “训练并行化” 定义为在不等待前一个 token 训练完成的情况下对后一个 token 进行训练的能力,RWKV 在这个定义上失败了。
实际上,RetNet 论文作者已经[承认](https://web.archive.org/web/20230916013316/https://github.com/microsoft/unilm/issues/1243) RWKV 支持 “训练并行化”,他们分别承认 RWKV 在跨多个 GPU 的高吞吐量方面没有问题(根据实际测试)。
# RWKV 简介
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
RWKV(读作 RWaKuV)是一种具有 GPT 级大型语言模型(LLM)性能的 RNN,也可以像 GPT Transformer 一样直接训练(可并行化)。
RWKV 结合了 RNN 和 Transformer 的最佳特性:出色的性能、恒定的显存占用、恒定的推理生成速度、"无限" ctxlen 和免费的句嵌入,而且 100% 不含自注意力机制。
RWKV 项目最初由彭博(Bo Peng ,BlinkDL)提出,随着项目被外界关注,RWKV 项目逐渐发展成一个开源社区。
2023 年 9 月 20 日,RWKV 开源项目正式加入 Linux 开源基金会。如今的 RWKV 项目是一个开源的非盈利组织,隶属于 Linux 基金会,部分算力曾由赞助商支持。
## RWKV 架构和论文
RWKV 模型架构有 RWKV-4(Dove)、RWKV-5(Eagle)、RWKV-6(Finch)、RWKV-7(Goose) **四个正式版本**,更早以前的 RWKV 1/2/3 为实验版本。
RWKV-8 架构仍处于实验阶段。RWKV-8 已公开的特性:
* [RWKV-8 预览之 DeepEmbed:对端侧友好的稀疏设计,解决 MoE 显存占用](./RWKV-Architecture.mdx#rwkv-8-de)
* [RWKV-8 系列之 DeepEmbedAttention:精简 KV 缓存,尤其适合混合模型(RWKV-7s)](https://rwkv.cn/news/read?id=20250630)
* [RWKV-8 系列之 ROSA(Rapid Online Suffix Automaton) 机制:开启未来之路](./RWKV-Architecture.mdx#rwkv-8-rosa-mechanism)
RWKV-7 架构是 RWKV 的最新正式版本,架构论文于 2025 年 3 月 18 日正式发布。
* **RWKV-7 论文**:RWKV-7 "Goose" with Expressive Dynamic State Evolution
* **论文地址**:[arXiv:2503.14456](https://arxiv.org/abs/2503.14456)
通过一系列创新(例如广义 Delta Rule),RWKV-7 在计算效率、任务表现和模型表达力全面超越 Transformer 和过去的 RWKV-6 架构。
在训练数据远低于 Qwen2.5、Llama3.2 等开源模型的前提下,RWKV-7-World 模型的**语言建模能力**在所有开源 3B 规模模型中达到 SoTA 水平。
通过引入广义 Delta Rule,RWKV-7 使用 **2 层即可实现 $NC^1$ 复杂度的 $S_5$ 状态跟踪问题**,**使用 4 层即可识别所有正则语言**,表达力显著超越了 Transformers 的 $TC^0$ 限制。
有关 RWKV-7 论文的解读,可以参考[此文章](https://rwkv.cn/news/read?id=20250320)。
RWKV-5/6 两个架构在 RWKV-4 架构的基础上进行了若干改进。因此,这两个架构在同一篇论文中发布。
* **RWKV 5/6 论文**:《Eagle and Finch: RWKV with Matrix-Valued States and Dynamic Recurrence》
* **论文地址**:[arXiv:2404.05892](https://arxiv.org/abs/2404.05892)
有关 RWKV-5/6 论文的解读,可以参考[此文章](https://rwkv.cn/news/read?id=382345)。
RWKV-6 架构图由 RWKV 社区开发者按照 CC-BY-SA 许可发布,可以在 [rwkv-wiki.fandom](https://rwkv.fandom.com/zh/wiki/RWKV-6%E6%9E%B6%E6%9E%84) 上找到原始版本。
RWKV-4 是 RWKV 模型的首个正式版本,论文由 RWKV 作者彭博和 RWKV 社区共同完成,初次发表于 2023 年 5 月 22 日。同年 10 月,RWKV-4 架构论文被顶级会议 [EMNLP 2023](https://2023.emnlp.org/program/accepted_findings/) 收录。
* **RWKV-4 论文**:《RWKV: Reinventing RNNs for the Transformer Era》
* **论文地址**:[arXiv:2305.13048](https://arxiv.org/abs/2305.13048)
## RWKV 模型的版本状态
从 RWKV-4 架构开始,RWKV 在每个架构版本都发布了多种参数规模的开源模型。
目前,RWKV-4/5 模型的生命周期已结束,RWKV-6 模型已停止更新。推荐使用**持续更新的 RWKV7-G1 模型**。
| 版本 | RWKV-V4 | RWKV-v5-Eagle | RWKV-v6-Finch | RWKV-v7-World | RWKV7-G1 |
| ------- | ------------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------- |
| 论文 | 🎓[论文已发布](https://arxiv.org/abs/2305.13048) | 🎓[论文已发布](https://arxiv.org/abs/2404.05892) | 🎓[论文已发布](https://arxiv.org/abs/2404.05892) | 🎓[论文已发布](https://arxiv.org/abs/2503.14456) | 🎓[论文已发布](https://arxiv.org/abs/2503.14456) |
| 总体状态 | **⚠ EOL** | **⚠ EOL** | **⚠ EOL** | **⚠ EOL** | **持续更新** |
| 0.1B 模型 | ✅ 已发布 | ✅ 已发布 | ❌ 无计划 | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-7-world/files) | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv7-g1/files) |
| 0.4B 模型 | ✅ 已发布 | ✅ 已发布 | ❌ 无计划 | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-7-world/files) | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv7-g1/files) |
| 1.5B 模型 | ✅ 已发布 | ✅ 已发布 | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-6-world/file/view/master/RWKV-x060-World-1B6-v2.1-20240328-ctx4096.pth) | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-7-world/files) | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv7-g1/files) |
| 3B 模型 | ✅ 已发布 | ✅ 已发布 | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-6-world/files) | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-7-world/files) | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv7-g1/files) |
| 7B 模型 | ✅ 已发布 | ✅ 已发布 | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-6-world/file/view/master/RWKV-x060-World-7B-v3-20241112-ctx4096.pth) | **❌ 无计划** | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv7-g1/files) |
| 14B 模型 | ✅ 已发布 | ❌ 无计划 | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-6-world/file/view/master/RWKV-x060-World-14B-v2.1-20240719-ctx4096.pth) | **❌ 无计划** | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv7-g1/files) |
## RWKV 模型的命名规则
RWKV 模型通常有两种命名规则,一种是 World 模型,另一种是自 RWKV 7 架构时期推出的 RWKV G1 系列模型(支持 think 推理)。
G1 模型的命名格式:
* rwkv7-g1j-2.9b-20260831-ctx16384.pth
G1 模型名称中每个字段的含义:
| 字段 | 含义 |
| ------------ | ---------------------------------------------------------------------- |
| **rwkv7** | RWKV-7 架构 |
| **g1j** | G1 系列的 Data Version(数据版本)标识。G1x 表示训练超过 1 个 epoch,后缀表示继续加入更多、更新且质量更高的数据 |
| **2.9b** | 模型的参数规模,"B"代表"Billions"(十亿) |
| **20260831** | checkpoint 日期(通常按 `YYYYMMDD` 记录) |
| **ctx16384** | 预训练的上下文长度 |
| **.pth** | PyTorch 权重文件 |
World 模型的命名格式:
* RWKV-x060-World-3B-v2.1-20240208-ctx4096.pth
* RWKV-x070-World-0.1B-v2.8-20241210-ctx4096.pth
World 模型名称中每个字段的含义:
| 字段 | 含义 |
| ----------------------- | -------------------------------------------- |
| **RWKV** | 模型名称 |
| **x060 / X070** | RWKV 模型的架构,X060 = RWKV6,X070 = RWKV7 |
| **World** | 数据集类型,World 数据集包含一百多种全球语言,World 模型支持多语言任务 |
| **3B / 0.1B** | 模型的参数规模,"B"代表"Billions"(十亿) |
| **v2.1 / v2.8** | 模型的训练集版本,v2 ≈ 1.1 T , v2.1 ≈ 2.5T ,v3 ≈ 5.6T |
| **20240208 / 20241210** | 模型的发布日期 |
| **ctx4096** | 预训练的上下文长度 |
## 我应该使用哪些 RWKV 模型?
由于老旧架构导致的性能问题, RWKV-6、RWKV-5、RWKV-4 全系列(Raven / World / Pile ...)和更早的 RWKV 版本均已结束生命周期,新项目不再推荐使用;复现旧实验或加载已有 State 时,仍需使用匹配的历史模型。
得益于最新的架构设计和最新数据集,RWKV7-G1 系列模型有较强的**推理、代码和数学能力**,在所有任务上的表现都比过去的模型更好
* 如果您的显存大于 16GB ,推荐使用**最新的** [RWKV7 13.3B 模型](https://modelscope.cn/models/RWKV/rwkv7-g1/files),这是目前最强大的 RWKV 模型,拥有最强的推理、代码和数学能力
* 如果您的显存位于 8GB 到 16GB 之间,请使用**最新的** [RWKV7 7.2B 模型](https://modelscope.cn/models/RWKV/rwkv7-g1/files)
* 如果您的显存小于 8GB ,请使用**最新的** [RWKV7 2.9B 模型](https://modelscope.cn/models/RWKV/rwkv7-g1/files)
请查看[本地部署 RWKV 模型的显存需求](./Vram),了解模型规模和量化方式对资源占用的影响;实际占用请以所用模型和后端为准。
## RWKV 与 Transformer 的差异
### 优势
* 与 Transformer 相比,消耗的算力和显存更低,尤其适合端侧部署
* 无论多长的上下文长度,保持速度恒定,显存恒定
* 作为 RNN,原生支持任意上下文长度
* 泛化能力超越 Transformer 模型
### 不足
* RWKV-7 的长文本能力仍然弱于 Transformer
* RWKV-7 对提示词(prompt)的格式更敏感,提示词的格式对生成结果影响更大
* RWKV-7s 作为混合模型,解决了 RWKV-7 的这些不足
## RWKV 社区的基本术语
| 概念 | 描述 |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| **RWKV** | 模型架构本身,训练代码可于[此处](https://github.com/BlinkDL/RWKV-LM)获取 |
| **state** | RWKV 是 RNN 架构的变种,state 是 RWKV 在推理过程中跨时间步(time step)传递的隐藏状态(hidden state),用于保留历史上下文信息 |
| **ChatRWKV** | RWKV 的官方聊天机器人(类似 ChatGPT,但基于 RWKV),代码可于[此处](https://github.com/BlinkDL/ChatRWKV)获取 |
| **RWKV-4/5/6/7** | RWKV 的不同架构版本。注意,推荐使用持续更新的 RWKV7-G1 系列模型 |
| **RWKV World** | 使用全球 100 多种语言的数据训练而来的基底 RWKV 模型,这类模型涵盖了更广泛、更多样化的数据集,包括 100 多种语言的训练数据,以及部分指令训练 |
| **Raven** | RWKV-4 基础模型的官方微调版,包含指令训练。但由于 RWKV-4 系列已停止更新,不建议继续使用 |
| **RWKV ABC/MIDI** | 基于 ABC/MIDI 格式的 RWKV 音乐模型 |
| **RWKV CHNtuned / one-state-chat / role\_play / novel ...** | RWKV 社区提供的微调模型,针对特定任务或数据类型优化。请优先考虑使用 RWKV-7 系列的微调模型 |
| **RWKV7-G1(Goose One)** | 基于 RWKV-7 架构训练的基底模型,支持**思考推理**(Think),性能更强 |
## RWKV 社区成员如何交流?
我们拥有 [Discord 频道](https://discord.gg/bDSBUMeFpc) 和 [QQ 频道](https://pd.qq.com/s/f2iep06ms) ,同时也有 QQ 交流群:
以下是 RWKV 官方的 QQ 交流群:
| 群名称 | QQ 群号 |
| --------------- | --------- |
| RWKV 技术研发群 | 325154699 |
| RWKV 用户交流群 | 224287095 |
| RWKV 应用内测群 | 332381861 |
| ChatRWKV 水和机器人群 | 597996773 |
以下是 RWKV 社区组建的 QQ 交流群:
| 群名称 | QQ 群号 |
| ----------------------- | --------- |
| RWKV 第三方微调/训练/lora 综合群 | 439087067 |
| AI00\_Server for RWKV 群 | 30920262 |
| rwkv runner 懒人包交流群 | 818930736 |
## RWKV 的赞助与贡献者
作为一个开源项目,RWKV 曾接受 [Stability AI](https://stability.ai/)、[EleutherAI](https://www.eleuther.ai/) 提供的大量 GPU 资源和研究支持。
此外,我们还要感谢以下组织或团队:
* [alpin @ pygmalionAI](https://pygmalion.chat/)
* [AutoMeta @ AlignmentLab](https://twitter.com/alignment_lab)
* [Recursal.AI](https://recursal.ai)
* 以及其他提供 GPU 资源的匿名支持者
同时,我们也感谢 RWKV 社区成员的辛苦付出,包括参与 RWKV 架构改进、使用 RWKV 进行学术研究、协助建设 RWKV 内容、测试最新模型,以及其他任何有帮助的工作。
# RWKV 社区精选项目
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { RadarChartComponent } from '../../../components-docs/radar-charts'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
以下是指向各种 RWKV 社区项目(通常托管在 GitHub)的链接,用于特定用例或参考。
标注为 **(可能过时)** 表示该项目**已存档**或**长时间未更新**。但即便某些项目已过时,其实现思路也可作为开发参考。
此外,我们感谢曾为 RWKV 生态作贡献的开发者,无论他们是否仍活跃在 RWKV 社区。
## 官方 RWKV 链接
* [RWKV-LM](https://github.com/BlinkDL/RWKV-LM): RWKV 的官方代码仓库,提供了 RWKV v1 至 v7 各版本的架构代码,以及配套的大语言模型训练实现
* [RWKV7-G1x-models](https://huggingface.co/BlinkDL/rwkv7-g1):RWKV 官方 Hugging Face 仓库,提供 RWKV-7 G1 系列模型
* [Albatross](https://github.com/BlinkDL/Albatross):Albatross 推理服务端,支持 RWKV 模型 API 与多实例并发推理
* [RWKV pip 包](https://pypi.org/project/rwkv/):RWKV 的 pip 包,具体用法可以查看 [RWKV pip 使用指南](../../tutorials/intermediate/RWKVpip)
* [RWKV-CUDA](https://github.com/BlinkDL/RWKV-CUDA):RWKV 的官方 CUDA 算子
* [Hugging face 文档](https://huggingface.co/docs/transformers/model_doc/rwkv):Hugging Face 关于 RWKV 的介绍
* RWKV-4 架构论文 :[arXiv(2305.13048)](https://arxiv.org/abs/2305.13048)
* RWKV 5 /6 架构论文:[arXiv(2404.05892)](https://arxiv.org/abs/2404.05892)
* RWKV-7 架构论文:[arXiv(2503.14456)](https://arxiv.org/abs/2503.14456)
## RWKV 微调/训练工具
### 微调项目
* **(推荐)** [RWKV-PEFT](https://github.com/Joluck/RWKV-PEFT) :RWKV 高效微调仓库,主打 LoRA、MiSS、State 等方法
* [RWKV-PEFT-Simple](https://github.com/Seikaijyu/RWKV-PEFT-Simple):RWKV-PEFT 的简化版本,提供便捷脚本和微调说明
* **(可能过时)**[RWKV-LM-RLHF](https://github.com/OpenMOSE/RWKV-LM-RLHF):RWKV 强化学习(RLHF)工具包,含 SFT、对齐(DPO、ORPO)等
### 训练项目
* [wind\_rwkv](https://github.com/johanwind/wind_rwkv):一个包含 RWKV 优化算子的存储库。目前专注于 RWKV-7
* [RWKV-LM-V7](https://github.com/RWKV-Vibe/RWKV-LM-V7):RWKV-LM-V7 是一个专注于易用性的 RWKV-7 多类模型训练项目,让开发者能够在15分钟内快速上手 RWKV-7 模型训练
* [RWKV-LM-V7-AMD-ROCm](https://github.com/Alic-Li/RWKV-LM-V7-AMD-ROCm):RWKV-LM-V7 的 AMD ROCm 版本,支持在 AMD GPU 上训练 RWKV-7 模型
* [RWKV-infctx-trainer](https://github.com/RWKV/RWKV-infctx-trainer/):RWKV 无限上下文训练器,支持训练 10k 及以上长度的上下文
* [RWKV-Ouroboros](https://github.com/neromous/RWKV-Ouroboros):基于 API 的 rwkv-trainer 项目,支持交替运行训练和推理
* [nanoRWKV](https://github.com/Hannibal046/nanoRWKV):RWKV 模型的 nanoGPT 风格实现
* [RWKV\_LM\_EXT](https://github.com/yynil/RWKV_LM_EXT):实现 RWKV 的功能扩展 ,包括序列分类/嵌入/peft/交叉编码器/双编码器/多模态等
* [chunkRWKV6](https://github.com/00ffcc/chunkRWKV6):使用分块并行优化 RWKV 的 prefill 和训练速度
## RWKV 推理框架
### rwkv7.c
* [rwkv7.c](https://github.com/KevlarKanou/rwkv7.c):RWKV-7 的 C 语言实现,支持 RWKV-7 模型的推理
### rwkv.cpp
* [rwkv.cpp](https://github.com/RWKV/rwkv.cpp):在 CPU 与 GPU 上推理 RWKV 模型,支持 FP16、INT4、INT5 和 INT8 量化,且支持 cuBLAS 加速路径
### RWKVSharp
* [RWKVSharp](https://github.com/imxcstar/RWKVSharp):使用 C# 封装的 RWKV 推理工具,基于 rwkv.cpp ,支持运行 RWKV4/RWKV5/RWKV6/RWKV7 World 模型。
### Pytorch 原生实现
* [RWKV\_Pytorch](https://github.com/yuunnn-w/RWKV_Pytorch):用纯 Pytorch 原生实现的 RWKV 模型推理框架
### WebGPU 实现
* [web-rwkv](https://github.com/cryscan/web-rwkv):在纯 WebGPU/Rust 中实现 RWKV 模型推理
### candle 实现
* [candle-rwkv](https://github.com/nkypy/candle-rwkv):在 Rust 的极简机器学习框架 candle 中实现 RWKV 模型推理(支持量化)
### Keras 实现
* [RWKV6-Keras](https://github.com/pass-lin/RWKV6-Keras):RWKV 模型的 Keras 实现,支持训练和推理
### JAX 实现
* [jaxrwkv](https://github.com/bsarkar321/jaxrwkv):RWKV 模型的 JAX 实现,支持 RWKV-4/5/6/7
* **(可能过时)** [rwkv-jax](https://github.com/saran-gangster/rwkv-jax)
* **(可能过时)** [RWKV-LM-jax](https://github.com/mrsteyk/RWKV-LM-jax)
* **(可能过时)** [tpu\_rwkv](https://github.com/tensorpro/tpu_rwkv)
### 移动端推理
* [rwkv-mobile](https://github.com/MollySophia/rwkv-mobile):面向移动端的 RWKV 推理运行时,支持多端部署场景
* [rwkv-qualcomm](https://github.com/MollySophia/rwkv-qualcomm):使用 Qualcomm AI Engine Direct SDK 推理 RWKV 模型
### 其他支持 RWKV 的推理引擎
* [rwkv-by-hand-excel](https://github.com/playaswd/rwkv-by-hand-excel):使用 excel 实现 RWKV,帮助开发者探索 RWKV 原理
* [RWKV-Infer](https://github.com/OpenMOSE/RWKV-Infer):使用 FLA 进行 RWKV-V6/V7 推理,支持组合多个状态进行推理
* [MLC LLM](https://github.com/mlc-ai/mlc-llm):机器学习编译器和高性能部署引擎,支持 RWKV 模型
* [llama.cpp](https://github.com/ggml-org/llama.cpp):通用大模型推理框架,支持 RWKV 模型的加速部署与调用
## RAG (知识检索增强)系统
* [RWKV-RAG](https://github.com/AIIRWKV/RWKV-RAG):基于 RWKV 模型的一键 RAG 部署系统,可轻松搭建和管理本地知识库,同时提供了基于本地知识库的问答机器人和 RWKV 一键微调功能
## 聊天机器人/推理 API 服务器
* [rwkv\_lightning](https://github.com/RWKV-Vibe/rwkv_lightning):基于 Albatross 的 RWKV 批量推理服务,支持 CUDA 与 ROCm,并提供 REST API
* [RWKV APP](https://github.com/RWKV-APP/RWKV_APP):面向桌面环境的 RWKV 工具集合,提供推理与交互示例
* **(中文,推荐)** [RWKV runner](https://github.com/josStorer/RWKV-Runner):RWKV Runner 是 RWKV 模型的管理和启动工具,带用户友好的 GUI 界面,支持训练和推理
* **(中文,推荐)** [AI00 RWKV server](https://github.com/Ai00-X/ai00_server):Ai00 Server 是基于 web-rwkv 推理引擎的 RWKV 模型**推理 API 服务器**
* **(中文)** [闻达 web UI](https://github.com/wenda-LLM/wenda):针对特定环境进行内容生成的 LLM 调用平台,支持 RWKV 模型
* **(中文)** [role play chatbot](https://github.com/shengxia/RWKV_Role_Playing):基于 RWKV 的角色扮演 webui,使用 Gradio 制作
* [Easy\_RWKV\_webui](https://github.com/No-22-Github/Easy_RWKV_webui):基于 PyWebIO 的 RWKV 模型在线聊天室
* [Mini Model Daemon](https://github.com/recursal/minmodmon):基于 web-rwkv 推理后端的 RWKV 模型推理工具
* [LocalAI](https://github.com/mudler/LocalAI):开源 OpenAI 替代品,支持 RWKV
* [GPT Academic](https://github.com/binary-husky/gpt_academic):为 GPT/GLM 等 LLM 大语言模型提供实用化交互接口,支持 RWKV
* [LLMFarm](https://github.com/guinmoon/LLMFarm):使用 GGML 库在 iOS 和 MacOS 上离线使用大型语言模型,支持 RWKV
## RWKV 基准测试
* [Uncheatable Eval](https://github.com/Jellyfish042/uncheatable_eval):使用最新的动态数据测试 LLM 性能,包含 RWKV
* [RULER\_RWKV](https://github.com/Ojiyumm/RULER_RWKV):RWKV 模型的 [RULER](https://arxiv.org/abs/2404.06654) 测试分数
* [LongBench\_RWKV](https://github.com/Ojiyumm/LongBench_RWKV):RWKV 的 [LongBench](https://arxiv.org/abs/2308.14508) 测试分数
* [rwkv\_mmlu](https://github.com/Jellyfish042/rwkv_mmlu):RWKV 模型的 MMLU 测试分数
## RWKV 多模态
多模态指除了文本任务以外的其他任务。
### 图像/图形相关
* [VisualRWKV](https://github.com/howard-hou/VisualRWKV) :基于 RWKV 的视觉语言模型,可处理视觉任务
* [Vision-RWKV (New Generation)](https://github.com/xforcevesa/new-vrwkv):全新一代 RWKV for Vision,基于 RWKV-7 实现
* [Vision-RWKV](https://github.com/OpenGVLab/Vision-RWKV):基于 RWKV 的视觉感知模型,能平滑处理高分辨率图像
* [U-RWKV](https://github.com/hbyecoding/U-RWKV):基于 RWKV 的图像分割模型。
* [Diffusion-RWKV](https://github.com/feizc/Diffusion-RWKV):基于 RWKV 的图像生成任务模型,擅长处理高分辨率图像
* [RWKV-CLIP](https://github.com/deepglint/RWKV-CLIP):RWKV 驱动的 CLIP (视觉 - 语言表示学习)模型
* [RWKV-SAM](https://github.com/HarborYuan/ovsam):基于 RWKV 的图像分段切割方法“RWKV-SAM”
* [PointRWKV](https://github.com/hithqd/PointRWKV):基于 RWKV 的 3D 点云学习框架
* [Restore-RWKV](https://github.com/Yaziwel/Restore-RWKV):使用 RWKV 进行高效且有效的医学图像恢复(PyTorch 实现)
* [LION](https://github.com/happinesslz/LION):用于点云中 3D 对象检测的 Linear Group RNN(支持 RWKV )
* [LineRWKV](https://github.com/diegovalsesia/linerwkv):LineRWKV 是一种对高光谱图像进行无损和有损压缩的方法
* [RWKV-VG](https://github.com/nianfd/RWKV-VG):基于 RWKV 的编解码结构目标检测框架
### 音频相关
* [MIDI-RWKV](https://github.com/christianazinn/MIDI-RWKV):基于 RWKV 的 MIDI 音乐生成模型
* [RWKV-TTS](https://github.com/yynil/RWKVTTS):RWKV 语音合成模型,支持多种语言的文本转语音
* [RWKV-ASR](https://github.com/AGENDD/RWKV-ASR):使用预训练的 RWKV 语言模型进行**语音识别**
### 时间序列
* [BlackGoose\_Rimer](https://github.com/Alic-Li/BlackGoose_Rimer):基于 RWKV-7 的时间序列预测模型,支持多种时间序列任务
* [RWKV-TS](https://github.com/howard-hou/RWKV-TS):基于 RWKV 的时间序列任务模型,低延迟和内存占用
### 机器人/具身智能
* [DecisionRWKV](https://github.com/ancorasir/DecisionRWKV):经验回放(experience replay)+ Decision-RWKV 模型,适合机器人的终身学习算法。
* [OccRWKV](https://github.com/jmwang0117/OccRWKV): 线性复杂度的高效 3D 语义占用预测
## RWKV 分词器
* [rwkv-tokenizer](https://github.com/cahya-wirawan/rwkv-tokenizer):用 Rust 编写的快速 RWKV Tokenizer,支持 RWKV-V5/6 World 模型
* [rwkv\_tokenizer.c](https://github.com/mrsteyk/rwkv_tokenizer.c):C 语言编写的 RWKV Trie 分词器
* [rwkv-tokenizer-go](https://github.com/Ronsor/rwkv-tokenizer-go):Go 语言的 RWKV 分词器
* [RWKV-World-Tokenizer-CPP](https://github.com/m8than/RWKV-World-Tokenizer-CPP):用 C++ 编写的高度优化的 RWKV World 模型 trie 分词器
## Prompt 集合
* [Awesome-RWKV-Prompts](https://github.com/shoumenchougou/Awesome-RWKV-Prompts) : 用户友好、开箱即用的 RWKV Prompts 示例,适用于所有用户
* **(可能过时)** [RWKV\_chains](https://github.com/jiamingkong/RWKV_chains):使 RWKV 模型与 Langchain 一起工作的 prompts
## 其他 RWKV 项目
* [RWKV-IF](https://github.com/Lyttr/RWKVInverseFolding):RWKV 逆折叠模型,使用 RWKV 模型进行 RNA 折叠预测
* [Muon-RMS-Norm](https://github.com/xTimeCrystal/Muon-RMS-Norm):使用另一种归一化方法训练 RWKV
* [SpikeGPT](https://github.com/ridgerchu/SpikeGPT): 一款受 RWKV 启发的新模型
* [JSONL to binidx](https://github.com/Abel2076/json2binidx_tool):这个工具用于将 `.jsonl` 文件转成适合 RWKV 训练的 `.bin /.idx` (binidx)数据
* [AI Town - RWKV Proxy](https://github.com/recursal/ai-town-rwkv-proxy?tab=readme-ov-file):通过 RWKV 在本地运营一个大型 AI 城镇!
* [Bot-Ani-RWKV-twitter-bot-detection](https://github.com/Max-SF1/Bot-Ani-RWKV-twitter-bot-detection):基于 RWKV 的推特水军机器人检测工具
# RWKV 架构及历史
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { TabsCN, TabsContentCN, TabsListCN, TabsTriggerCN } from "components-docs/tabs/tabs.tsx"
以下是 RWKV 架构相关的知识,包括 RWKV 架构名称的由来、RWKV 架构特性、架构历史、以及每个架构的模型发布等内容。
**RWKV 是 RNN 的一个变体**。因此,有必要先介绍:什么是 RNN 架构,以及 RNN 架构的隐藏状态是什么?
## RNN 架构和隐藏状态
循环神经网络(RNN)是一种广泛应用于深度学习领域的神经网络模型。
RNN 网络在运行过程中会保持一个隐藏状态(state),隐藏状态可看作 RNN 模型的“心理状态”。就像人类在思考时,脑海中会保留与当前事件关联度最高的“关键信息”。随着思考内容的变化,我们脑海中的“关键信息”会不断更新。同样的,RNN 网络也会**通过特定的函数不断更新其隐藏状态**。
如图所示,RNN 网络依次处理每一个输入的 token,并根据“当前隐藏状态”来预测下一个可能出现的 token(如果有需求)。每处理一个 token,RNN 会将结果反馈给网络自身,从而“更新其隐藏状态”,再用“更新后的状态”去预测下一个 token。如此循环,直到达到“完成任务”的状态。
作为 RNN 的一种变体,RWKV 支持对隐藏状态进行微调([state tuning](../../tutorials/advanced/Fine-Tune/RWKV-PEFT/State-Tuning))。通过调整模型的“心理状态”,可使 RWKV 模型在特定任务上表现更佳。
## RWKV 架构名称的由来
RWKV 架构的名称来源于时间混合和通道混合块中使用的四个主要模型参数,分别如下:
* $R$:Receptance,作为过去信息的接受程度的接受向量
* $W$:Weight,位置权重衰减向量,可训练的模型参数
* $K$:键(Key)是类似于传统注意力中 $K$ 的向量
* $V$:值(Value)是类似于传统注意力中 $V$ 的向量
## RWKV 架构的发展历程
2020 年,BlinkDL 开始研究 Transformer ,立刻发现其有[两个明显的改进方向](https://zhuanlan.zhihu.com/p/191393788):引入显式 decay 和 Token-shift(或者说短卷积)。在 **[https://github.com/BlinkDL/minGPT-tuned](https://github.com/BlinkDL/minGPT-tuned)** 上测试后,发现这些技巧对于 Transformer 的性能有显著提升。
**显式 decay**
```python
self.time_weighting = nn.Parameter(torch.ones(self.n_head, config.window_len, config.window_len))
...
att = F.softmax(att, dim=-1) # 这是原始代码
att = att * self.time_weighting[:,:T,:T] # 只需增加这句
att = self.attn_drop(att) # 这是原始代码
```
**Token-shift**
```python
self.time_shift = nn.ZeroPad2d((0,0,1,0))
...
x = torch.cat([self.time_shift(x)[:,:T,:C//2], x[:,:T,C//2:]], dim=2) # 只需增加这句
q = self.query(x).view(B, T, self.n_head, C // self.n_head).transpose(1, 2) # 这是原始代码
k = self.key(x).view(B, T, self.n_head, C // self.n_head).transpose(1, 2) # 这是原始代码
v = self.value(x).view(B, T, self.n_head, C // self.n_head).transpose(1, 2) # 这是原始代码
```
随后,他注意到 Apple 的 [**Attention Free Transformer**](https://arxiv.org/abs/2105.14103) (AFT)论文并对其进行测试,发现这两种技巧也为 AFT 带来了显著的性能提升。
### RWKV-1
2021 年 8 月,RWKV 架构的初版:RWKV-1 被提交到 [**RWKV-LM 仓库**](https://github.com/BlinkDL/RWKV-LM) 中。RWKV-1 [**首次 commit**](https://github.com/BlinkDL/RWKV-LM/commit/4c6db5607c6f94c38c10004efb292510bc71ba59) 于 2021 年 8 月 9 日。
RWKV-1 使用长卷积代替 Attention 机制,其架构由交替的 Time-mix 和 Channel-mix 组成。**Channel-mix 是 Transformer 的 GeGLU 层的变种。Time-mix 则是对于 AFT 的显著改进**:
$$
\text { Time-mix }: \mathbf{TM}_{t, c}=\operatorname{sigmoid}\left(R_{t, c}\right) \cdot \sum_{u} W_{t, u, c} \cdot \operatorname{softmax}_{t}\left(K_{u, c}\right) \cdot V_{u, c}
$$
$$
\text { Channel-mix } \mathbf{CM}_{t, c}=\operatorname{sigmoid}\left(R_{t, c}\right) \cdot \sum_{d} W_{c, d} \cdot \operatorname{gelu}\left(K_{t, d}\right) \cdot V_{t, d}
$$
其中 $R$ 、 $K$ 、 $V$ 由输入线性变换生成,$W$ 则是长卷积中的卷积核。
Time-mix 和 Channel-mix 的结构设计均基于 $R$ 、$W$ 、 $K$ 、 $V$ 四个主要参数,这便是 **RWKV** 这个名称的由来。
RWKV-1 更接近 Linear Transformer 而非 RNN ,因为其每一个时间步都依赖于历史时刻所有的输入。
### RWKV-2-RNN
RWKV-2 版本首次为 RWKV 实现了 RNN 模式,伪代码图如下:
**代码图的补充说明:**
* a 和 b 是 kv 和 k 的 EMA(exponential moving average)
* c 和 d 是 a 和 b 加上纯 self-attention 效应(原地的自己对自己的注意力)
* c / d 是记忆机制,因为如果某个字在某个通道的 k 很强,且 W 接近 1,那么这个字就会被后文记住
* $T$, $K$, $V$, $R$, $W$, $X$, $P$ 都是可以训练的参数
* $W$ 使用预计算的值进行初始化,与 Alibi(Attention with Linear Biases)有类似之处,但都是可训练的非固定值,且在每个通道都可以不同,表达能力显著提高。
* **发明了一种 headQK 机制**,让模型可以直接从前文复制或避免生成某些字,这对于 ICL(in context learning) 很重要。几年后,其它研究者也发现了这一现象。但为了测试纯 RNN 的能力极限,RWKV 主线模型并未加入这一功能。
```python
q = self.head_q(x)[:,:T,:]
k = self.head_k(x)[:,:T,:]
c = (q @ k.transpose(-2, -1)) * (1.0 / 256)
c = c.masked_fill(self.copy_mask[:T,:T] == 0, 0)
c = c @ F.one_hot(idx, num_classes = self.config.vocab_size).float()
x = self.head(x) + c
```
通过指数衰减(exponential decay),RWKV-2 实现了 RNN 形式的推理:模型每次生成都依赖于上一个时刻的输出和当前时刻的输入,同时拥有固定大小的隐藏状态(在 RWKV-2 里是 a 和 b)。
RWKV-2 的自注意力层简化表达:
$$
a_{t+1} = \exp(W) \odot a_t + \exp(Kz_t) \odot (Vz_t)
$$
$$
b_{t+1} = \exp(W) \odot b_t + \exp(Kz_t)
$$
```math
y_t = \sigma(Rz_t) \odot \frac{a_t + \exp(Kz_t + X) \odot Vz_t}{b_t + \exp(Kz_t + X)}
```
### RWKV-3
RWKV-3 是一个短期的过渡版本,其相对 RWKV-2 使用更全面的 token-shift(对 SA 和 FF 层中的 R / K / V 分别使用不同的可训练 TimeMix 因子) :
```python
xx = self.time_shift(x)
xk = x * self.time_mix_k + xx * (1 - self.time_mix_k)
xv = x * self.time_mix_v + xx * (1 - self.time_mix_v)
xr = x * self.time_mix_r + xx * (1 - self.time_mix_r)
```
RWKV-3 对比 RWKV-2 的 token-shift 改进图示:
此外,这个版本使用 preLN 代替 postLN(更稳定,且收敛更快):
```python
if self.layer_id == 0:
x = self.ln0(x)
x = x + self.att(self.ln1(x))
x = x + self.ffn(self.ln2(x))
```
### RWKV-4
RWKV-4 是 RWKV 架构的**首个正式版本**,版本代号 "Dove(鸽)" 。RWKV-4 解决了 RWKV-3 架构的数值稳定性问题,同时也发布了 RWKV 项目的首篇论文 [《RWKV: Reinventing RNNs for the Transformer Era》](https://arxiv.org/abs/2305.13048)。
RWKV-4 架构的论文由 RWKV 作者彭博和 RWKV 社区共同完成,初次发表于 2023 年 5 月 22 日。同年 10 月,RWKV-4 架构论文被顶级会议 [EMNLP 2023](https://2023.emnlp.org/program/accepted_findings/) 收录。
上图是 RWKV-4 论文中的模型架构概览,其中:
* 左侧:RWKV-4 的 time-mixing 和 channel-mixing 模块
* 右侧:RWKV-4 的语言建模流程
#### Token Shift 概念
RWKV-4 论文中正式提出 “Token Shift” 概念:将 RWKV 接收的每个 token 和前一个 token 做混合,类似于大小 = 2 的一维因果卷积。Token Shift 让模型可以控制每个时间步将多少新信息与旧信息分配给每个头的接收、键、值和门向量(即 $r$、$k$、$v$ 和 $g$)。
RWKV-4 语言建模的架构图,演示了 RWKV-4 的 Token Shift 过程,以及 RWKV 的 state 更新过程:
RWKV-4 版本的一大特点是 state(RNN 的隐藏状态)非常小,这是因为彭博专注于在“最小的 state 下实现最大的性能”。
以 $D$ 为模型主维数, $L$ 为模型层数。RWKV-4 模型的 state 大小为 $5DL$,包括 $2DL $ 的 mixing 和 $3DL$ 的 WKV。
#### RWKV-4 的模型发布
RWKV-4 的研究(架构迭代和模型训练等)横跨了 2022 和 2023 年,主要发布了以下 4 类模型:
* RWKV-4-Pile:在 331B tokens 的 Pile 数据集上进行预训练,包含 169m、430m、1B5、3B、7B、14B 六种参数的模型
* RWKV-4-Raven:RWKV-4-Pile 的指令微调模型,使用 Alpaca、CodeAlpaca、Guanaco、GPT4All、ShareGPT 等开源数据集进行微调,包含 1B5、3B、7B、14B 四种参数的模型。
* RWKV-4-World:在 RWKV World v1 数据集上训练的多语言模型(100 多种世界语言,训练数据包含 Pile),包含 169m、430m、1B5、3B、7B 五种参数的 Base 模型,有一些中文微调模型。
* RWKV-4-Music:有 MIDI 和 ABC 两种格式的作曲模型,分别使用 bread-midi-dataset 和 irishman 乐谱数据进行训练。其中 ABC 模型参数为 82m,MIDI 模型参数分别为 120m 和 560m 。
**RWKV-4 模型对比表格:**
| 模型名称 | 描述 | 训练数据(数据量) | 词表(词表大小) |
| --------------------------------------------------------------------- | ------------------------ | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **[RWKV-4-Pile](https://huggingface.co/BlinkDL/rwkv-4-pile-14b)** | 基于 Pile 数据集的预训练语言模型 | [EleutherAI/pile](https://huggingface.co/datasets/EleutherAI/pile) (331B tokens) | [20B\_tokenizer](https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v4/20B_tokenizer.json) (50,277) |
| **[RWKV-4-Raven](https://huggingface.co/BlinkDL/rwkv-4-raven)** | RWKV-4-Pile 的指令微调语言模型 | Alpaca、CodeAlpaca、Guanaco、GPT4All、ShareGPT 等 | 20B\_tokenizer (50,277) |
| **[RWKV-4-World](https://huggingface.co/BlinkDL/rwkv-4-world)** | 基于 100 多种全球语言数据集的预训练语言模型 | [RWKV World v1](./FAQ#怎样读懂-rwkv-模型文件名) (590B tokens) | [rwkv\_vocab\_v20230424](https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v5/tokenizer/rwkv_vocab_v20230424.txt) (65,536) |
| **[RWKV-4-Music(MIDI)](https://huggingface.co/BlinkDL/rwkv-4-music)** | 基于 MIDI 乐谱数据训练的音乐(作曲)模型 | [bread-midi-dataset](https://github.com/briansemrau/MIDI-LLM-tokenizer) | [MIDI-LLM-tokenizer](https://github.com/briansemrau/MIDI-LLM-tokenizer)(20,095) |
| **[RWKV-4-Music(ABC)](https://huggingface.co/BlinkDL/rwkv-4-music)** | 基于 ABC 乐谱数据训练的音乐(作曲)模型 | [irishman](https://huggingface.co/datasets/sander-wood/irishman) | - |
此外,RWKV-4 模型首次训练了 14B 参数的模型,并从 RWKV-4-World 起正式启用了包含 100 多种世界语言的 `World` 系列数据集,以及对应的多语言词表 `rwkv_vocab_v20230424`。
RWKV-5 和 RWKV-6 等更新的 RWKV 架构沿用了 `World` 系列数据集和 `rwkv_vocab_v20230424` 词表。
`World` 数据集会持续补充训练数据,并更新版本号:
* World v1 ≈ 0.59T tokens
* World v2 ≈ 1.1T tokens
* World v2.1 ≈ 1.42T tokens,v2.1 模型的总训练数据 ≈ 2.5T tokens
* World v3 ≈ 3T tokens,v3 模型的总训练数据 ≈ 5.5T tokens
### RWKV-5
RWKV-5 是 RWKV-4 架构的改良版本,版本代号“Eagle(鹰)”。
RWKV-5 和 RWKV-6 这两个架构在同一篇论文 [《Eagle and Finch: RWKV with Matrix-Valued States and Dynamic Recurrence》](https://arxiv.org/abs/2404.05892)中发布。
该论文由 RWKV 作者彭博和 RWKV 社区共同完成,初次发表于 2024 年 4 月 9 日。同年 10 月,RWKV 5/6 架构论文被 LLM 领域国际会议 [COLM 2024](https://colmweb.org/AcceptedPapers.html) 收录。
上图是论文中 RWKV 5/6 的架构概览,其中:
* 左侧:RWKV 的 time-mixing 和 channel-mixing 模块
* 右上角:作为 RNN 单元时的 RWKV time-mixing 模块
* 底部的中间:前向传播模式下 RWKV-5 time-mixing 的 token-shift 模块
* 右下角:前向传播模式下 RWKV-6 time-mixing 的 token-shift 模块
* 虚线箭头(左侧,右上角):表示 RWKV-6 架构的连接,但在 RWKV-5 中不存在
#### RWKV-5 架构优化细节
相对 RWKV-4, RWKV-5 的最重点改动在于引入了**多头的**、**基于矩阵值的状态(state)**,即论文中的 “multi-headed matrix-valued states”。
在 RWKV-4 架构的 time mixing 计算中,$u$、$w$、$k$、$v$ 参数都是维度为 $D$ 的向量,而 head size 是 1,所计算的 state 也是维度为 $D$ 的向量 :
| $t$ | State $s_t \in \mathbb{R}^D$ | Output $y_t \in \mathbb{R}^D$ |
| --- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
| 0 | $s_0 = \frac{u \odot k_0 \odot v_0}{u \odot k_0}$ | $y_0 = \sigma(r_0) \odot s_0$ |
| 1 | $s_1 = \frac{u \odot k_1 \odot v_1 + k_0 \odot v_0}{u \odot k_1 + k_0}$ | $y_1 = \sigma(r_1) \odot s_1$ |
| 2 | $s_2 = \frac{u \odot k_2 \odot v_2 + k_1 \odot v_1 + w \odot k_0 \odot v_0}{u \odot k_2 + k_1 + w \odot k_0}$ | $y_2 = \sigma(r_2) \odot s_2$ |
| 3 | $s_3 = \frac{u \odot k_3 \odot v_3 + k_2 \odot v_2 + w \odot k_1 \odot v_1 + w^2 \odot k_0 \odot v_0}{u \odot k_3 + k_2 + w \odot k_1 + w^2 \odot k_0}$ | $y_3 = \sigma(r_3) \odot s_3$ |
而 RWKV-5 则将 $u$、$w$、$k$、$v$ 分割成一组组维度为 64 向量, 每一组 $k$ 和 $v$ 通过外积交织相乘成为一个 $64 \times 64$ 的**矩阵**,即 state 的一个**头(head)**。 Head size 是固定的 64 。
RWKV-5 每一个 head 的 time-mixing 时间步:
| $t$ | State $s_t \in \mathbb{R}^{64 \times 64}$ | Output $y_t \in \mathbb{R}^{64}$ |
| --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| 0 | $s_0 = \text{diag}(u) \cdot k_0^\top \cdot v_0$ | $y_0 = r_0 \cdot s_0$ |
| 1 | $s_1 = \text{diag}(u) \cdot k_1^\top \cdot v_1 + k_0^\top \cdot v_0$ | $y_1 = r_1 \cdot s_1$ |
| 2 | $s_2 = \text{diag}(u) \cdot k_2^\top \cdot v_2 + k_1^\top \cdot v_1 + \text{diag}(w) \cdot k_0^\top \cdot v_0$ | $y_2 = r_2 \cdot s_2$ |
| 3 | $s_3 = \text{diag}(u) \cdot k_3^\top \cdot v_3 + k_2^\top \cdot v_2 + \text{diag}(w) \cdot k_1^\top \cdot v_1 + \text{diag}(w^2) \cdot k_0^\top \cdot v_0$ | $y_3 = r_3 \cdot s_3$ |
RWKV-5 前向传播(推理过程)的 time-mixing 计算公式:
$$
\square_t = \text{lerp}_{\square}(x_t, x_{t-1}) W_{\square}, \quad \square \in \{ r, k, v, g \}
$$
$$
w = \exp(-\exp(\omega))
$$
$$
wkv_t = \text{diag}(u) \cdot k_t^\top \cdot v_t + \sum_{i=1}^{t-1} \text{diag}(w)^{t-1-i} \cdot k_i^\top \cdot v_i \in \mathbb{R}^{(D/h) \times (D/h)}
$$
$$
o_t = \text{concat}(\text{SiLU}(g_t) \odot \text{LayerNorm}(r_t \cdot wkv_t)) W_o \in \mathbb{R}^D
$$
通过将 RWKV-4 的向量变成矩阵,RWKV-5 的 state 计算从“基于向量”变成了“基于 64×64 的矩阵值”,即 “matrix-valued states” 。假设当前 RWKV 模型的维度是 512 ,则可以说有 512/64 = 8 个头 (八头×64 维),这就是 RWKV-5 的“多头-multi-headed” 概念。
因此,我们可以把 RWKV-5 的优化细节总结为:**RWKV-5 消除了归一化项(RWKV-4 公式中的分母),并引入了矩阵值状态代替以往的向量值状态。**
通过这种方式,RWKV-5 巧妙地扩大了 state 的规模,使得 RWKV 模型有更好的记忆力和模型容量。
以 $D$ 为模型主维数, $L$ 为模型层数。RWKV 5/6 模型的 state 大小为 $66DL$,包括 $2DL $ 的 mixing 和 $64DL$ 的 WKV。
#### RWKV-5 迭代过程
实际上,RWKV-5 架构的研究并非一蹴而就。从 2023 年 7 月提出到 2023 年 9 月定型,RWKV-5 的优化过程可分为三个子版本:RWKV-5.0、5.1 和 5.2。
**RWKV-5.0**
RWKV-5.0 重新设计了 RWKV-4 架构的 $wkv$ 模块,其中 $k$ 和 $v$ 两个参数从维度为 $D$ 的向量转化为维度为 64 \* 64 的矩阵,因此 RWKV-5.0 的 $wkv$ 状态比 RWKV-4 大 32 倍。
RWKV-5.0 架构仅发布了 0.1B 模型:RWKV-5-World-0.1B-v1-20230803-ctx4096 ,此模型仍然基于 RWKV-4 时期的 World-v1 数据集训练。
**RWKV-5.1**
RWKV-5.1 在 RWKV-5.0 的基础上引入了 Time-mixing 门控机制,即在 time-mixing 模块中添加额外的矩阵 $W_g$ 和门控激活函数 SiLU 实现。
RWKV-5.1 架构仅发布了音乐模型:RWKV-5-ABC-82M-v1-20230901-ctx1024 和 RWKV-5-MIDI-560M-v1-20230902-ctx4096。
**RWKV-5.2**
RWKV-5.2 在 RWKV-5.1 的基础上引入了对角衰减矩阵,也就是将 $u$、$w$ 向量参数分别进行对角化。
RWKV-5.2 架构发布了 0.4B、1B5、3B、7B,以及 3B(ctx16k)五个模型,这些模型基于 World-v2 数据集训练。
**RWKV-5 子版本对比表格**
| 架构版本 | 优化细节 | 发布模型 | 数据集 |
| -------- | ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| RWKV-5.0 | 在 RWKV-4 的基础上重新设计了 $wkv$ 模块,其中 $k$ 和 $v$ 两个参数从维度为 $D$ 的向量转化为维度为 64 \* 64 的矩阵,因此 RWKV-5.0 的 $wkv$ 状态比 RWKV-4 大 32 倍 | [RWKV-5-World-0.1B-v1](https://huggingface.co/BlinkDL/rwkv-5-world/blob/main/RWKV-5-World-0.1B-v1-20230803-ctx4096.pth) | World-v1 |
| RWKV-5.1 | 在 RWKV-5.0 的基础上引入了 Time-mixing 门控机制,即在 time-mixing 模块中添加额外的矩阵 $W_g$ 和门控激活函数 SiLU 实现 | [RWKV-5-music](https://huggingface.co/BlinkDL/rwkv-5-music) 系列,含 ABC-82M 和 MIDI-560M | [irishman](https://huggingface.co/datasets/sander-wood/irishman), [bread-midi-dataset](https://github.com/briansemrau/MIDI-LLM-tokenizer) |
| RWKV-5.2 | 在 RWKV-5.1 的基础上引入了对角衰减矩阵,也就是将 $u$、$w$ 向量参数分别进行对角化 | [RWKV-5-World-V2](https://huggingface.co/BlinkDL/rwkv-5-world) 系列,参数包含 0.4B、1B5、3B、7B,以及 3B(ctx16k) | World-v2 |
RWKV-5 全系列模型均已过时,RWKV-6 已停止更新,建议使用持续更新的 RWKV7-G1 系列模型。
### RWKV-6
RWKV-6 的版本代号是“Finch(雀)”,这个版本自 2023 年 10 月开发。
#### RWKV-6 架构优化细节
RWKV-6 在 RWKV-5 的基础上引入了基于 LoRA 的动态递归机制,进一步优化了 Token Shift 和 time-mixing 过程。
RWKV-5 的 Token Shift 和 RWKV-4 类似,是一个非常简单的线性插值(linear interpolation - lerp),且这个线性插值是数据无关的(data-independent),只由参数 $\mu$ 决定当前 token 和前一个 token 混合到模型输入的占比。
RWKV-5 的 Token Shift 中,$x$ 和 $x-1$ 之间的线性插值公式如下:
$$
\text{lerp}_{\Box}(a, b) = a + (b - a) \odot \mu_x
$$
***
RWKV-6 则借鉴了低秩适应(LoRA)的技术,将静态的参数 $\mu$ 替换成了动态的 LoRA : $\mu_x$ 和每个 $\lambda_\square$ 引入了维度为 $D$ 的可训练向量,并且每个 $A_\square \in \mathbb{R}^{D \times 32}$,$B_\square \in \mathbb{R}^{32 \times D}$ 引入了新的可训练权重矩阵。
RWKV-6 的 Token Shift 中,$x$ 和 $x-1$ 之间的线性插值公式如下:
$$
\text{lora}_{\Box}(x) = \lambda_{\Box} + \tanh(x A_{\Box}) B_{\Box}
$$
$$
\text{ddlerp}_{\Box}(a, b) = a + (b - a) \odot \text{lora}_{\Box}(a + (b - a) \odot \mu_x)
$$
相对 RWKV-4/RWKV-5 ,RWKV-6 这种增强了数据依赖性的新型 Token Shift 有效地扩展模型的能力,每个通道分配的新旧数据量取决于当前和之前时间步骤的输出。
通俗地理解,这种动态递归机制使“重要的信息”可以有效地标记自身,以待在后续任务使用;而“不重要的信息”也可以标记自身,以减少或完全避免进入后续的数据流,从而为更重要的现有数据保留空间。
此外,如果某些信息对于特定任务没有用,那么动态递归机制可以允许这些信息预先被过滤掉。
RWKV-6 的动态 Time Mixing 计算公式:
$$
\square_{t} = \mathrm{ddlerp}_{\square}(x_t, x_{t-1}){W}_{\square}, \quad \square\in \{r,k,v,g\}
$$
$$
d_t = \mathrm{lora}_d( \mathrm{ddlerp}_d ( x_t, x_{t-1} ) )
$$
$$
w_t = \exp(-\exp(d_t))
$$
$$
{wkv}_{t} = \mathrm{diag}(u)\cdot k_{t}^\mathrm{T} \cdot v_{t} + \sum_{i=0}^{t-1} \mathrm{diag}\left(\bigodot_{j=i+1}^{t-1}w_{j}\right) \cdot k_{i}^\mathrm{T} \cdot v_{i} \in \mathbb{R}^{(D/h) \times (D/h)}
$$
$$
o_t = \mathrm{concat}\left(\mathrm{SiLU}(g_t) \odot \mathrm{LayerNorm}(r_{t} \cdot {wkv}_{t})\right){W}_o \in \mathbb{R}^{D}
$$
$$
{wkv}' = {s} + \mathrm{diag}(u) \cdot k^\mathrm{T} \cdot v
$$
$$
{s}' = \mathrm{diag}(w) \cdot {s} + k^\mathrm{T} \cdot v
$$
${wkv}_{t}$ 的注意力计算可以用递归方式写成:
$$
{wkv}' = {s} + \mathrm{diag}(u) \cdot k^\mathrm{T} \cdot v
$$
$$
{s}' = \mathrm{diag}(w) \cdot {s} + k^\mathrm{T} \cdot v
$$
与 RWKV-5 不同,RWKV-6 的 $w_t$ 在整个序列中不是静态的。这是 RWKV-6 衰减的核心变化:$w_t$ 的每个通道可以根据**数据依赖性**独立变化,而以前是一个固定的学习向量。
上述新的 LoRA 机制用于获取混合向量。注意,LoRA 过程本身使用 Eagle(RWKV-5) 风格的 Token Shift 值作为输入(**RWKV-6 完整架构图左下方**的 $\mu_x$)而不仅仅是最新的 token。新的时间变化衰减 $w_t$ 也需要再次应用 LoRA。
直观上,这是 Token Shift 的二阶变体,允许 $w_t$ 的每个通道根据当前和先前 token 的混合来变化,而混合本身由两个 token 的嵌入决定。
#### RWKV-6 的模型发布
RWKV-6 架构本身并没有子版本,但发布了不同类型的模型,包括不同训练集的预训练基底模型,以及中文小说和日文微调模型。以下是基于 RWKV-6 架构的模型概览:
| 模型类别 | 模型状态 | 模型描述 | 训练数据 |
| ----------------- | ------ | ----------------------------------------------- | ----------------- |
| RWKV-6-World-v2 | **过时** | 基于 World-v2 数据集的多语言预训练模型 | World-v2 |
| RWKV-6-World-v2.1 | 已停止更新 | 基于 World-v2.1 数据集的多语言预训练模型 | World-v2.1 |
| RWKV-6-World-v3 | 已停止更新 | 基于 World-v3 数据集的多语言预训练模型 | World-v3 |
| RWKV-6-ChnNovel | 已停止更新 | 中文小说微调模型,在 RWKV-6-World-v2.1 的基础上,使用中文小说+指令数据微调 | World-v2.1,中文小说数据 |
| RWKV-6-Jpn | 已停止更新 | 日文微调模型,在 RWKV-6-World-v2.1 的基础上,使用日文+指令数据微调 | World-v2 |
#### RWKV-6 的 state tuning
除了完整的模型权重,社区在 RWKV-6 架构迭代期间研发出了 state tuning。这是一种新颖的微调方法,微调 RWKV 的初始 state 相当于最彻底的 prompt tuning,甚至可以用于 alignment,因为迁移能力很强。有关 state tuning 的详细方法,请查看 [RWKV 微调- state tuning](../../tutorials/advanced/Fine-Tune/RWKV-PEFT/State-Tuning)。
微调得来的 state 文件可以合并到基底模型中,也可以作为“RWKV 模型的增强插件”使用:即在加载基底 RWKV 模型之前初始化模型的 state ,以影响模型的回答文风、回答格式等效果。
有关 RWKV State 文件的加载方法,请查看 [RWKV state 文件用法](../../tutorials/basic/State)。
RWKV 官方发布了以下适用于 RWKV-6 的 **state 文件**,目前尚未发布 RWKV-7 State:
| state 类型 | state 描述 | 适用 RWKV 模型 |
| ------------------------- | --------------------------------------------------------- | ---------------------- |
| chn-single-round | 中文单轮对话增强,更符合人类语言习惯,带丰富的 Emoji 表情 | 同参数规模的 RWKV-6-World 模型 |
| eng-single-round | 英文单轮对话增强,更符合人类语言习惯,带丰富的 Emoji 表情 | 同参数规模的 RWKV-6-World 模型 |
| chn-小说扩写-single-round | 中文单轮对话,会根据用户输入进行小说扩写(建议使用 RWKV-6-ChnNovel 模型和 state 作为替代) | 同参数规模的 RWKV-6-World 模型 |
| chn-打油诗-single-round | 中文单轮对话,会根据用户输入创作打油诗 | 同参数规模的 RWKV-6-World 模型 |
| chn-文言文-single-round | 中文单轮对话,回答的风格会偏向文言文 | 同参数规模的 RWKV-6-World 模型 |
| chn-文言文和古典名著-single-round | 中文单轮对话,回答的风格会偏向文言文和古典名著 | 同参数规模的 RWKV-6-World 模型 |
| OnlyForChnNovel\_小说扩写 | 用于扩写中文小说,适用于同尺寸的 RWKV-6-ChnNovel 模型 | RWKV-6-ChnNovel 中文小说 |
### RWKV-7
RWKV-7 的架构代号是 “Goose(雁)” 。RWKV-7 **超越了 attention / linear attention 范式**,它的状态演化很灵活,可以解决在相同算力消耗下 attention 无法解决的问题。与此同时,RWKV-7 超越了 TC0 约束。
RWKV-7 的研究始于 2024 年 9 月,其预览版 `RWKV-V7 "Goose" x070.rc2-2409-2r7a-b0b4a` 的训练代码首次提交于 RWKV-LM 仓库的 [commit](https://github.com/BlinkDL/RWKV-LM/commit/e1d143f526e28be61fc06571034dda179101a683) 中。
RWKV-7 架构论文《RWKV-7 "Goose" with Expressive Dynamic State Evolution》于 2025 年 3 月 18 日正式发布。
论文地址:[https://arxiv.org/abs/2503.14456](https://arxiv.org/abs/2503.14456)
#### RWKV-7 架构优化细节
RWKV-7 采用了**动态状态演化**(Dynamic State Evolution)。通过一系列创新(例如广义 Delta Rule),RWKV-7 在保持线性时间和恒定空间推理特性的同时,进一步提升了状态表达能力和下游任务表现。
在训练数据远低于其他领先 3B 模型的前提下,RWKV-7 论文中的 2.9B 模型在多语言下游任务上达到当时的 SoTA 水平,并在英语下游任务上达到与当时 SoTA 相当的水平。
通过引入广义 Delta Rule,RWKV-7 使用**单层即可解决属于 $NC^1$ 完全类的 $S_5$ 状态跟踪问题**,**使用 4 层即可识别所有正则语言**;在标准复杂度猜想下,其表达力超越了 Transformers 的 $TC^0$ 限制。
简单地说,传统注意力机制(如 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 的梯度公式:**
$$
\frac{\partial \mathcal{L}}{\partial S} = S k^\top k - v^\top k
$$
带权重衰减 $w_t$ 和学习率 $η_t$ 的 state 梯度下降公式:
$$
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)
$$
等价于:
$$
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)
$$
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 与历史版本(RWKV-5/6)的时间步公式和状态更新机制对比:**
| 模型版本 | 时间步公式 | 状态更新机制 |
| ------------ | -------------------------------------------------------------------------------------- | ----------------------- |
| RWKV-5 Eagle | $S_t = S_{t-1}\mathrm{diag}(w) + v_t^\mathrm{T}k_t$ | Trainable State Decay |
| RWKV-6 Finch | $S_t = S_{t-1}\mathrm{diag}(w_t) + v_t^\mathrm{T}k_t$ | Dynamic State Decay |
| RWKV-7 Goose | $S_t = S_{t-1}\left(\mathrm{diag}(w_t) + a_t^\mathrm{T}b_t\right) + v_t^\mathrm{T}k_t$ | Dynamic State Evolution |
#### 核心机制代码
```python
def ref_fwd(r, w, k, v, a, b):
r = r.view(B, T, H, N)
k = k.view(B, T, H, N)
v = v.view(B, T, H, N)
a = a.view(B, T, H, N)
b = b.view(B, T, H, N)
w = torch.exp(-torch.exp(w.view(B, T, H, N)))
out = torch.zeros((B, T, H, N), device=DEVICE)
state = torch.zeros((B, H, N, N), device=DEVICE)
for t in range(T):
kk = k[:, t, :]
rr = r[:, t, :]
vv = v[:, t, :]
aa = a[:, t, :]
bb = b[:, t, :]
sab = torch.einsum('bhik,bhk,bhj->bhij', state, aa, bb)
state = state * w[: , t, :, None, :] + sab + torch.einsum('bhj,bhi->bhij', kk, vv)
out[:, t, :] = torch.einsum('bhj,bhij->bhi', rr, state)
return out.view((B, T, C))
```
#### RWKV-7 的模型发布
RWKV-7 发布了 Pile、World 和 G1 三个系列的预训练模型。
* **[RWKV-7-Pile](https://hf-mirror.com/BlinkDL/rwkv-7-pile)** 属于实验模型,基于 [EleutherAI/pile](https://huggingface.co/datasets/EleutherAI/pile) 数据集预训练
* RWKV-7 "Goose" World 模型是支持全球语言的预训练模型,基于 World V3 数据集和其采样子集预训练
* RWKV7-G1("GooseOne")是持续更新的基底模型系列,预训练数据包括网页、代码、合成数据,以及指令、聊天和推理数据
RWKV7-G1 模型
RWKV-7-World 模型
RWKV-7-Pile 模型
RWKV7-G1 是持续更新的基底模型系列,拥有较强的推理、代码和数学能力。
`G1x` 中的 `x` 表示数据版本。具体可用的模型规模和检查点请以模型仓库为准。
可以在 [RWKV7-G1 模型仓库](https://huggingface.co/BlinkDL/rwkv7-g1/tree/main) 查看所有 RWKV7-G1 系列模型。
RWKV-7-World 模型基于 World V3 数据集和其采样子集预训练而来,有 0.1B/0.4B/1.5B/2.9B 四种参数版本。
| 模型类别 | 模型描述 |
| ------------------------- | ------------------------------------------ |
| RWKV-7-World-0.1B-v2.8 | 基于 World-v2.8 数据集的多语言预训练模型,只发布了 0.1B 参数版本 |
| RWKV-7-World-0.4B-v2.9 | 基于 World-v2.9 数据集的多语言预训练模型,只发布了 0.4B 参数版本 |
| RWKV-7-World-1.5B/2.9B-v3 | 基于完整 World V3 数据集的预训练模型,有 1.5B 和 2.9B 两种参数 |
可以在 [RWKV-7-World 模型仓库](https://huggingface.co/BlinkDL/rwkv-7-world/tree/main) 查看所有 RWKV-7-World 系列模型。
World-v2.8 数据集:从 World v3 数据集中采样 1T tokens 作为训练数据
World-v2.9 数据集:从 World v3 数据集中采样 2T tokens 作为训练数据
RWKV-7-Pile 是基于 Pile 数据集进行实验的模型,因此存在各种不同的层数和维度设计:
* RWKV-x070-Pile-1.47B
* RWKV-x070-Pile-164M-L33-D512
* RWKV-x070-Pile-165M-L25-D576
* RWKV-x070-Pile-168M
* RWKV-x070-Pile-421M
可以在 [RWKV-7-Pile 模型仓库](https://huggingface.co/BlinkDL/rwkv-7-pile/tree/main) 查看所有 RWKV-7-Pile 系列模型。
### RWKV-8
RWKV-8 的架构代号是 "Heron"(鹭)。
RWKV-8 仍处于实验阶段。下文整理了已经公开的 DeepEmbed、ROSA 机制及相关实验。
#### RWKV-V8 的 DeepEmbed
RWKV-8 首个特性 `DeepEmbed` 在 2025 年 5 月[公布](https://rwkv.cn/news/read?id=20250527)。`DeepEmbed` 可以实现类似 MoE 的优秀推理性能,新增参数无需常驻显存,并可进一步 offload 至 RAM 或 SSD,使其更适合在端侧设备上部署。
DeepEmbed 在模型的每一层 FFN 中为词表中的每个 token 训练一个可学习的高维向量,这可以写成 Embed 层。这些向量在训练阶段可被学习,而在推理阶段可存储于 RAM/SSD 中,对于每个 token 只需预读极少量参数,从而显著减少显存占用。
推理时,模型根据 token index 可提前预读本层的 embedding 向量,用于对 FFN 输出进行逐通道的乘性调制(channelwise scaling)。
这些基于 token 的 embedding 向量构成了一个规模庞大但稀疏的知识库,能够显著提升模型存储和调用世界知识的能力。尽管这些向量看似增加了模型参数量,但**不需要占用显存**,且在训练过程中可通过 TP(Tensor Parallelism)避免 DP(Data Parallelism)中梯度同步的带宽开销,并可进一步 offload 至 RAM 或 SSD。
在端侧推理场景下,这些向量同样可存储于内存中,或通过 `mmap` 等机制直接从硬盘按需加载。每个 token 仅引入几十 KB 的额外访存开销,使该机制非常适合在边缘设备上部署。
**DeepEmbed 代码示例:**
原始 ReLuSq FFN:
```python
x = torch.relu(self.key(x)) ** 2
return self.value(x)
```
DeepEmbed\_1x ReLuSq FFN:
```python
self.deepemb = nn.Embedding(d_vocab, d_emb)
...
x = torch.relu(self.key(x)) ** 2
return self.value(x) * self.deepemb(idx)
```
DeepEmbed\_4x ReLuSq FFN(效果更佳,参数更多):
```python
self.deepemb = nn.Embedding(d_vocab, d_emb * 4)
...
x = torch.relu(self.key(x)) ** 2
return self.value(x * self.deepemb(idx))
```
由于 DeepEmbed 的查表向量无需常驻 VRAM,这些向量在参数量层面几乎是"免费的"。因此,还可以进一步引入 n-gram(如 `bigram`、`trigram`),提升模型对词组/片段的建模能力。如果词表规模较大,也可结合 LoRA 技术降低显存和训练开销。
RWKV7-G1 仓库中的 rwkv7a 模型使用了[**更强的 DeepEmbed 设计**](https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v7/rwkv_v7a_demo.py#L257C1-L263C21):
```
def RWKV_x070_CMix_one(x, x_prev, x_k, K_, V_, semb_, s1_, s2_, s0_):
xx = x_prev - x
k = x + xx * x_k
k = torch.relu(k @ K_) ** 2
ss = (x @ s1_) @ semb_.view(32,32)
k = k * ((ss @ s2_) + s0_)
return k @ V_, x
```
#### RWKV-8 的 ROSA 机制
RWKV-8 的第二个特性 `ROSA` 于 2025 年 10 月[公开](https://zhuanlan.zhihu.com/p/1960369250049951081)。
RWKV-8 ROSA 可视化 demo:[ROSA-Visualizer](https://huggingface.co/spaces/Jellyfish042/ROSA-Visualizer)
ROSA(**Rapid Online Suffix Automaton,快速在线后缀自动机**) 是一种神经符号无限长程无损信息传播器,旨在取代注意力机制(Attention)。
给定一个 Token 序列 $x = x_0x_1 \dots x_{n-1}$,定义 $x_{a:b} = x_ax_{a+1} \dots x_b$。我们的目标是高效计算一个新序列 $y = y_0y_1 \dots y_{n-1}$,其中:
$$
y_i = \begin{cases} x_{j+1}, & \text{若存在 } j < i \text{ 且 } m \geq 0 \text{ 使得 } x_{j-m:j} = x_{i-m:i} \\ -1, & \text{否则} \end{cases}
$$
在此公式中,我们选择唯一的 $j$ 使匹配长度 $m$ 最大化;若 $m$ 存在多个匹配点,则取最大的 $j$(即最近出现的匹配)。
ROSA 基于经典的后缀自动机(Suffix Automaton)构建:
```python
def ROSA(x): # space = O(n), time = adaptive, typical O(n), worst-case O(n^2)
n=len(x); y=[-1]*n; s=2*n+1; b=[None]*s; c=[-1]*s; d=[0]*s; e=[-1]*s; b[0]={}; g=0; z=1
for i,t in enumerate(x):
r=z; z+=1; b[r]={}; d[r]=d[g]+1; p=g
while p!=-1 and t not in b[p]: b[p][t]=r; p=c[p]
if p==-1: c[r]=0
else:
q=b[p][t]
if d[p]+1==d[q]: c[r]=q
else:
u=z; z+=1; b[u]=b[q].copy(); d[u]=d[p]+1; c[u]=c[q]; e[u]=e[q]
while p!=-1 and b[p][t]==q: b[p][t]=u; p=c[p]
c[q]=c[r]=u
v=g=r; a=-1
while v!=-1:
if d[v]>0 and e[v]>=0: a=x[e[v]+1]; break
v=c[v]
y[i]=a; v=g
while v!=-1 and e[v]
Naïve ROSA 在设计上即可实现 100% 的 MQAR(多查询关联检索)和 100% 的 NIAH(“大海捞针”测试,例如 “best thing to do in San Francisco is”),且不受上下文长度影响。但出于一些人尽皆知的原因(缺乏语义泛化能力、对噪声极为敏感等),**在直接用于大多数实际任务时, Naïve ROSA 的效果非常有限**。
RWKV-8 ROSA 则是**为了解决实际任务而生**:
* 将 $\text{Emb}(\text{ROSA}(x))$ 添加到 LLM 中合适的张量(尤其是早期层)中。**这里的 $\text{Emb}$ 指某种 Embedding。这是实现 kNN+LLM 的正确方法,且对 RAG(检索增强生成)非常有用。**
* 将 $\text{Emb}(\text{ROSA}(\text{Sampling}(z_a)))$ 添加到 $z_b$ 中,其中 $z_a$ 是一个 LLM 张量,$z_b$ 是另一个张量(如下一层)。**如此便具有神经符号特性:LLM+ROSA 会进化出其特有的“内心独白”语言**。每一层 LLM 都可以生成多个具有小词表的序列,以便进行快速并行的 ROSA 处理。该模型可使用 STE(直通估计器)、Soft/Stochastic(软性/随机)或强化学习(RL)方法进行训练,能够解决广泛的任务。
* Bookmark tokens:例如使用 `` 来标记第 36 轮对话的开始,这样 ROSA 就可以利用相应的 Token(硬编码匹配书签,而非自身)完美地检索任何历史对话。此外,可利用**投机采样**(Speculative decoding)进行加速。这是一个端到端的解决方案:让 LLM 在 Prefilling 或 Decoding 过程中自行决定**何时**以及**如何**插入书签标记。
与注意力机制相比,ROSA 直接处理离散标记(Discrete tokens),从而实现了卓越的效率:**无点积运算、无 Softmax、无浮点开销、无 KV 缓存**。它可以在 CPU 上运行,并与 GPU 上的神经网络层并行处理。
#### 社区 ROSA 项目
* [rosa\_soft](https://github.com/wjie98/rosa_soft) (训练 ROSA):提供了一个 ROSA 算子强大且端到端训练的实现。
* [ROSA-Tuning](https://github.com/zyaaa-ux/ROSA-Tuning) (训练 ROSA):将 ROSA 机制与现代 LLM 相结合。该项目使模型能够仅通过固定长度的注意力窗口处理任意长度的输入,同时实现接近全局注意力(Global Attention)的性能表现。
* [ROSA+](https://github.com/bcml-ai/rosa-plus):ROSA+ 是 ROSA 机制的扩展版本。它提供了直观的 Python 接口,并引入了 Witten–Bell 预测器作为处理未知序列时的回退(Fallback)方案。
* [RASP](https://github.com/x-0D/RASP):一种混合语言模型,通过条件随机场(CRF)和 spaCy 依存句法分析,将 ROSA+ 的高效性与句法理解能力相结合。RASP 生成的文本在语法连贯性和结构感知方面具有显著优势。
#### ROSA 相关实验
ROSA simply scales
RWKV7 + ROSA
解决 40 位加减法
翻转 1-60 位数字
RWKV8 ROSA 可轻松 scale,并在模型内部创造出神秘的新语言。
* 介绍:[RWKV8多层ROSA:AI自动发明内部语言解决问题](https://zhuanlan.zhihu.com/p/1962160045564359483)
* 介绍:[RWKV8 ROSA直接可scale:准备开练小语言模型](https://zhuanlan.zhihu.com/p/1962686633699684521)
* demo: [RWKV-LM/RWKV-8](https://github.com/BlinkDL/RWKV-LM/tree/main/RWKV-v8)
语言模型创造内心独白语言,由 RWKV 8 多层 ROSA 实现,完全端到端训练 (next-token prediction)
ROSA 是一个可以添加到任何模型中的组件。RWKV8 风格的 ROSA(比简单版的 ROSA 强大得多),可以添加到 RWKV7 上。
首个[实验](https://x.com/BlinkDL_AI/status/1980011043788390565?s=20)是学习对很大的随机数进行加和减。以下是 RWKV7 与 RWKV7+ROSAv251020 的 loss 对比(未使用 loss mask,因此 loss 会显得更高)。
[另一组实验](https://x.com/BlinkDL_AI/status/1980504396820804086?s=20) , RWKV7 vs RWKV7+ROSAv251020 vs RWKV7+ROSAv251021 的 loss 对比(架构和参数与 v251020 相同,但训练方法更好)。
RWKV7+ROSA 使用 4 层 128 宽度仅 1.1M 参数可解决 40 位加减法,准确度达 99%(无 CoT)。
* 介绍:[RWKV7+ROSA用1M参数做40位加减法(纯端对端训练)](https://zhuanlan.zhihu.com/p/1963457913143165394)
* demo: [251024\_rosaQKV\_run.py](https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v8/251024_rosaQKV_run.py)
灰色是纯 RWKV7 模型。绿色是 RWKV7+ROSA(自动生成内部语言)后,出现了两次 grok,显著更强。
RWKV7+ROSA 模型,拥有 40 K 参数(L2-D32),在翻转 1 至 60 位数字的输入时,能够实现 99.8% 的数字准确率。
* 介绍:[RWKV7+ROSA用39564个参数颠倒60位数字输入](https://zhuanlan.zhihu.com/p/1970228984378791304)
* demo: [251105\_reverse\_run.py](https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v8/251105_reverse_run.py).
RWKV7+ROSA(黄)与纯 RWKV7(蓝)的 loss 对比(虽然 RWKV7 最终 loss 只高一点,测试准确率只有 98.9%,也就是,错误率高几倍)
## RWKV 架构特性
RWKV 大模型架构的特点包括:
* 高效且稳定的推理速度
* 低且固定的显存占用量(支持在CPU 上运行)
* 能够处理无限上下文,非常适合长文本处理和多轮对话等应用
* 对硬件友好,仅执行矩阵与矢量的乘法操作,无需 KV 缓存
RWKV 架构由一系列堆叠的残差块组成,每个残差块由具有循环结构的时间混合(timemixing)和通道混合(channel-mixing)子块组成,该循环通过将当前输入和上一时间步的输入之间进行线性插值来实现(在 RWKV-4 架构论文中,这一过程被称为 token shift)。RWKV 6 通过借鉴 LoRA 技术优化了 token shift 过程,使其 RWKV4/5 的简单线性插值(lerp)变成了数据依赖的、动态的线性插值(ddlerp)。
对于长度为 $T$ 的序列,Transformer 注意力的计算复杂度通常为 $O(T^2)$,自回归推理所需的 KV 缓存则随上下文长度按 $O(T)$ 增长。RWKV 处理完整序列的时间复杂度为 $O(T)$,循环状态的空间复杂度为 $O(1)$,因此单个 token 的推理时间和状态大小不会随上下文长度增长。
此外,RWKV 架构设计显著降低了显存占用,使得模型即使在标准配置的 CPU 或非专业级的 GPU上也能高效运行,无需依赖昂贵或高端的计算硬件。这一突破性的进展使得大规模深度学习模型不再受限于特定的硬件平台,拓宽了应用范围。
## RWKV 架构参考资料
* 有关 RWKV 架构的核心概念,可以查看 [RWKV 150 行代码](https://github.com/BlinkDL/ChatRWKV/blob/main/RWKV_in_150_lines.py)。
* 有关 RWKV-6 架构的代码解读,可以参考这篇博客:[介绍 RWKV-6 的模型设计,代码带注释](https://zhuanlan.zhihu.com/p/694593540) 。
* 有关 RWKV-7 架构设计思路,可以参考博客:[RWKV-7:极先进的大模型架构,长文本能力极强](https://rwkv.cn/news/read?id=15) 。
或者,你可以通过阅读 RWKV 论文学习:
* [RWKV-4 架构论文 | arXiv(2305.13048)](https://arxiv.org/abs/2305.13048)
* [RWKV 5 /6 架构论文 | arXiv(2404.05892)](https://arxiv.org/abs/2404.05892)
* [RWKV-7 架构论文 | arXiv(2503.14456)](https://arxiv.org/abs/2503.14456)
如果你已经了解了 RWKV 的原理,则可以在[RWKV 主仓库](https://github.com/BlinkDL/RWKV-LM)中研究 RWKV 的训练和 CUDA 代码。
RWKV 架构发展的综述论文:
* [The Evolution of RWKV | arXiv(2411.02795)](https://arxiv.org/abs/2411.02795)
* [A Survey of RWKV | arXiv(2412.14847)](https://arxiv.org/abs/2412.14847)
# RWKV-6 部署显存与速度实测
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
本页记录的是 RWKV-6 1.6B、3B、7B、14B 在固定设备与旧版推理后端上的实测结果,用于理解模型规模和量化对资源占用的影响。它不是当前 RWKV-7 G1x 模型的显存承诺,也不应直接外推到其他显卡或后端版本。
量化通常可以降低显存或内存占用,但对生成质量的影响会随模型、量化算法和后端而变化。选择模型时,应先在同一个模型与任务上比较 FP16、INT8、NF4 或 GGUF 量化,不要把某次测试结论当作所有模型的固定排序。
当前 RWKV-7 G1x 常见规模为 0.1B、0.4B、1.5B、2.9B、7.2B、13.3B;由于尚无与下表相同设备、相同后端和相同参数设置下的完整实测,本页暂不拼接估算值。当前模型可以从 [RWKV7-Gxx-GGUF 合集](https://huggingface.co/collections/shoumenchougou/rwkv7-gxx-gguf)查看。
## RWKV-6 实测数据
以下是不同推理后端和对应量化方式(**默认量化所有层**)的显存/内存需求:
测试环境:
* CPU :i7-10870H
* GPU: RTX 3080 Laptop ,16G 显存
* 内存:32G
| 推理后端 | 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层) |
不同推理后端/量化(**默认量化所有层**)的生成速度,单位为 TPS(tokens per second,每秒生成的 token 数)。token 与汉字或单词不是一一对应关系。
| 推理后端 | 1B6 模型 | 3B 模型 | 7B 模型 | 14B 模型 |
| ------------------- | ------ | ----- | ----- | ---------- |
| CPU-FP32 | 4.36 | 2.3 | 极慢 | OOM(不建议使用) |
| rwkv.cpp-FP16 | 8.6 | 4.5 | 2 | 1 |
| rwkv.cpp-Q5\_1 | 14 | 8 | 3.7 | 2.1 |
| CUDA-FP16 | 25 | 18 | 15 | |
| CUDA-INT8 | 22 | 16 | 18 | 7.4 |
| webgpu-FP16 | 45 | 38 | 21 | OOM,无法测试 |
| webgpu-INT8 | 60 | 44 | 30 | 18 |
| webgpu-NF4 | 60 | 47 | 34 | 20 |
| webgpu(python)-FP16 | 40 | 29 | 17 | OOM,无法测试 |
| webgpu(python)-INT8 | 45 | 35 | 23 | 15 |
| webgpu(python)-NF4 | 43 | 32 | 21 | 18 |
表格中的推理后端来自不同的推理工具:
* CUDA、CPU 来自 [RWKV 官方 pip 包](https://pypi.org/project/rwkv/)
* rwkv.cpp 来自 [rwkv.cpp](https://github.com/RWKV/rwkv.cpp) 项目
* webgpu 来自 [web-rwkv](https://github.com/cryscan/web-rwkv) 项目,一个基于 webgpu 的 Rust 推理框架
* webgpu(python) 来自 [web-rwkv-py](https://github.com/cryscan/web-rwkv-py),web-rwkv 项目的 Python 版本
以上参数仅作为 RWKV 端侧推理的入门性能参考,随着量化层数等配置项的变化和显卡架构的新旧程度,模型的性能表现可能会改变。
# RWKV 教程首页
import { CardContainer } from 'components-docs/card/card-container.tsx'
import { Card } from 'components-docs/card/card.tsx'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { SingleCard } from 'components-docs/hero-card/single-card.tsx'
import { MultiCard } from 'components-docs/hero-card/muti-card.tsx'
import { HeroCardContainer } from 'components-docs/hero-card/hero-card-container.tsx'
import TutorialsDial from 'components-docs/hero-card/icons/tutorials/dial.tsx'
import TutorialsCloudDownload from 'components-docs/hero-card/icons/tutorials/cloud-download.tsx'
import TutorialsFlame from 'components-docs/hero-card/icons/tutorials/flame.tsx'
import TutorialsMagicWandSparkle from 'components-docs/hero-card/icons/tutorials/magic-wand-sparkle.tsx'
import TutorialsButton from 'components-docs/hero-card/icons/tutorials/button.tsx'
import TutorialsClipboard from 'components-docs/hero-card/icons/tutorials/clipboard.tsx'
import TutorialsEye from 'components-docs/hero-card/icons/tutorials/eye.tsx'
import TutorialsHammer from 'components-docs/hero-card/icons/tutorials/hammer.tsx'
import TutorialsPaperPlane from 'components-docs/hero-card/icons/tutorials/paper-plane.tsx'
import TutorialsBookOpen from 'components-docs/hero-card/icons/tutorials/book-open.tsx'
RWKV 教程系列提供 RWKV 从入门(体验在线 demo)到精通(本地部署、微调、预训练)的全教程。
## RWKV 入门教程
入门教程主要介绍 RWKV **模型的种类和下载方法**、**在线体验方法**,以及**如何改善 RWKV 模型的生成质量**。
### 在线体验和模型下载
### 改善 RWKV 模型的生成质量
## RWKV 中级教程
中级教程包含 RWKV 的各种**本地部署方法和推理教程**。
### RWKV 模型本地部署工具
### 其他热门模型推理工具
***
## RWKV 高级教程
高级教程包含 RWKV 模型的**预训练和微调方法**。
### 微调简介和准备工作
### 训练方法的详细教程
**预训练教程**基于社区维护的 [RWKV-LM-V7](https://github.com/RWKV-Vibe/RWKV-LM-V7),官方参考实现请查看 [RWKV-LM 的 `RWKV-v7/train_temp`](https://github.com/BlinkDL/RWKV-LM/tree/main/RWKV-v7/train_temp)。
RWKV 官方微调仓库 [RWKV-PEFT](https://github.com/Joluck/RWKV-PEFT),包含常见的 `LoRA` 微调,也有 RWKV 模型特有的 `State-Tuning` 和 RWKV 社区成员 [@Joluck](https://github.com/Joluck) 开发的 `MiSS` 微调方法。
# RWKV 高级教程
import { CardContainer } from 'components-docs/card/card-container.tsx'
import { Card } from 'components-docs/card/card.tsx'
import { LibraryBig, Wrench, Database, Dumbbell, Sparkles, Puzzle, Layers, Brain, FlaskRound } from "lucide-react";
import { CallOut } from 'components-docs/call-out/call-out.tsx'
欢迎来到 RWKV 的高级教程,高级教程包含 RWKV 模型的**预训练和微调方法**,包含:
* 训练环境的配置、训练数据集的准备工作
* 各种具体的微调方法
### 微调简介和准备工作
### 预训练和微调方法的详细教程
**预训练教程**基于社区维护的 [RWKV-LM-V7](https://github.com/RWKV-Vibe/RWKV-LM-V7) 仓库。
推荐使用 RWKV 官方微调仓库 [RWKV-PEFT](https://github.com/Joluck/RWKV-PEFT),RWKV-PEFT 包含常见的 `LoRA` 微调方法,也有 RWKV 模型特有的 `State-Tuning` 和 RWKV 社区成员 [@Joluck](https://github.com/Joluck) 开发的 `MiSS` 等独特的微调方法。
{/* */}
{/* */}
# RWKV-LM 预训练教程
import React from 'react';
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
本教程基于社区维护的 [RWKV-LM-V7](https://github.com/RWKV-Vibe/RWKV-LM-V7),适合快速复现约 191M~3B 的 RWKV-7 预训练。该仓库仍处于 WIP,官方参考实现请查看 [RWKV-LM 的 `RWKV-v7/train_temp`](https://github.com/BlinkDL/RWKV-LM/tree/main/RWKV-v7/train_temp)。
## 预训练案例
* [RWKV-7-Arithmetic-0.1B](https://huggingface.co/shoumenchougou/RWKV-7-Arithmetic-0.1B):基于 RWKV-7 架构预训练的 0.1B 模型,实现基础加减法运算和加减法方程求解功能。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1bNCjBKEb7?t=0.0)观看。
## 硬件需求
在相同模型规模和上下文长度下,预训练通常比 LoRA、MiSS 等参数高效微调需要更多显存。
以下是基于 `HEAD_CHUNK=4096`,`GRAD_CP=1`,`KERNEL="@rwkv3"` 参数,在不同 `CTX_LEN` 下预训练 RWKV 模型所需的显存:
| 模型参数 | 层数 | 维度 | M\_BSZ=1 显存 | 其他 M\_BSZ 显存 |
| ---- | -- | ---- | -------------------- | ----------------------------------------------------- |
| 0.1B | 12 | 768 | 6786MB(6.63GB) | BSZ8:11412MB(11.14GB)
BSZ48:40556MB(39.61GB) × 4 |
| 0.4B | 24 | 1024 | 12938MB(12.63GB) | BSZ6:18828MB(18.39GB)
BSZ8:20366MB(19.89GB) |
| 1.5B | 24 | 2048 | 37300MB(36.43GB) | BSZ4:21340MB(20.84GB) × 4 |
| 3B | 32 | 2560 | 67766MB(66.18GB) | - |
| 7B | 32 | 4096 | 55424MB(54.13GB) × 4 | - |
| 14B | 61 | 4096 | 4 × Pro 6000 OOM | - |
| 模型参数 | 层数 | 维度 | M\_BSZ=1 显存 | 其他 M\_BSZ 显存 |
| ---- | -- | ---- | ------------------------ | --------------------- |
| 0.1B | 12 | 768 | 6446MB(6.29GB) | BSZ8:9018MB(8.81GB) |
| 0.4B | 24 | 1024 | 12374MB(12.08GB) | BSZ6:14894MB(14.54GB) |
| 1.5B | 24 | 2048 | 36114MB(35.27GB) | - |
| 3B | 32 | 2560 | 66132MB(64.58GB) | - |
| 7B | 32 | 4096 | 54864MB × 4(53.58GB × 4) | - |
| 14B | 61 | 4096 | 4 × Pro 6000 OOM | - |
表格中标注 `× 4` 指通过 `GPU_PER_NODE=4` 指定四张 GPU 并行训练时,每张 GPU 所需的显存。
## 克隆仓库
```bash
git clone https://github.com/RWKV-Vibe/RWKV-LM-V7.git
# 或者国内镜像仓库
git clone https://gitee.com/rwkv-vibe/RWKV-LM-V7.git
```
无法克隆?复制并依次运行以下命令,下载 RWKV-LM-V7 仓库压缩包并解压:
```bash
wget -O rwkv.zip https://github.com/RWKV-Vibe/RWKV-LM-V7/archive/refs/heads/main.zip && \
unzip -q rwkv.zip && \
rm rwkv.zip
```
使用 zip 下载的代码仓库不含 git 信息,无法使用 `git pull` 更新仓库
## 准备训练环境
1. 安装 CUDA Toolkit
请参考 [**CUDA Toolkit 安装文档**](https://developer.nvidia.com/cuda-downloads),根据您的操作系统安装 CUDA Toolkit。
以下是 Ubuntu 24.04 x86\_64 的安装示例:
```bash
# 下载 CUDA 仓库的 GPG 密钥包
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
# 安装 GPG 密钥包,使系统信任 NVIDIA 的软件仓库
sudo dpkg -i cuda-keyring_1.1-1_all.deb
# 更新 apt 软件包列表,更新 NVIDIA CUDA 软件源
sudo apt-get update
# 安装 CUDA Toolkit 13.0(包含 nvcc 编译器、开发库、工具链等)
sudo apt-get -y install cuda-toolkit-13-0
```
2. 使用 miniforge 等 conda 兼容包管理器,创建一个全新的虚拟环境
以下是 MiniConda-Linux x86\_64 的安装和环境创建示例:
```bash
# 下载最新的 MiniConda 安装包
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 运行 MiniConda 安装包的安装脚本,安装期间一定要注意进展,及时输入 yes !
sh Miniconda3-latest-Linux-x86_64.sh
# 重启环境变量,激活 Conda 环境
source ~/.bashrc
# 创建名为 rwkv-lm-v7 的 conda 环境, 并指定 python 版本为 3.12
conda create -n rwkv-lm-v7 python=3.12
# 激活 rwkv 环境
conda activate rwkv-lm-v7
```
3. 安装下列依赖,注意 `pytorch-lightning` 固定使用了 `1.9.5` 版本,此为本仓库特性,请不要升级此依赖包。
```bash
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
# 安装 CUDA 版本的 PyTorch,这里的 cu128 指的是 CUDA 12.8 版本,可以根据你自己的 CUDA 版本进行调整
pip3 install -r requirements.txt
```
下载缓慢?尝试添加 `-i https://mirrors.aliyun.com/pypi/simple` 参数,使用阿里源加快下载速度。
安装完成后,使用以下命令检查 PyTorch 版本以及 PyTorch 能否使用 CUDA:
```bash
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
```
若输出类似 `2.7.1+cu128 True`,表示当前 PyTorch 已经识别 CUDA GPU。这个结果不能用于判断系统 CUDA Toolkit 或 `nvcc` 是否可用。
## 准备训练数据
请参考[准备训练数据](./Fine-Tune/FT-Dataset.mdx) 文档,准备一个 `jsonl` 格式的预训练数据集,并将其放在 `RWKV-LM-V7/data` 目录下。
`data/compute_magic_prime.py` 脚本可为指定的 binidx 数据集和上下文长度(ctx\_len)计算正确的 `--my_exit_tokens` 和 `--magic_prime` 值。
1. 在 `data/compute_magic_prime.py` 中修改你的训练数据集路径和上下文长度(`DATA_NAME` 和 `CTX_LEN`)
2. 打开终端, 在 `data` 目录下使用下列命令运行脚本
```
python compute_magic_prime.py
```
最终输出类似于:
```bash
### Loading /home/rwkv/RWKV-LM-V7/data/demo
### /home/rwkv/RWKV-LM-V7/data/demo.bin/idx has 200499 tokens, 546 items. Dtype
### magic_prime = 47 (for ctxlen 4096)
--my_exit_tokens 200499 --magic_prime 47 --ctx_len 4096
```
在 `RWKV-LM-V7/data` 目录中运行以下命令,将 `jsonl` 数据文件转成 `binidx` 格式:
```bash
python make_data.py demo.jsonl 30 4096
```
命令中的 `30` 表示复制次数,`4096` 表示上下文长度。`make_data.py` 将执行以下操作:
* 对 `demo.jsonl` 进行 30 次复制和打乱
* 加载复制后的 `demo.jsonl` 并基于 `rwkv_vocab_v20230424` 词表进行分词
* 把数据保存为 `binidx` 格式文件:`demo.bin` 和 `demo.idx`
* 针对 4096 上下文长度,计算出预训练所需的 `my_exit_tokens` 和 `magic_prime` 参数
务必保存命令行输出的 `--my_exit_tokens`、`--magic_prime` 和 `--ctx_len` 参数,**这些参数会在后续的预训练步骤中频繁使用**。
在此示例中,我们将使用一个混合了中文/大写中文、英文、半角/全角阿拉伯数字、正负数、小数的**加减法多轮对话数据集**,预训练一个 RWKV-7 0.1B 加减法模型。
## 初始化 RWKV 模型
在开始预训练之前,我们需要初始化一个 RWKV 模型,作为预训练的起点。
使用文本编辑器打开 `RWKV-LM-V7` 目录的 `demo-training-prepare.sh` 脚本,修改以下初始化参数:
| 参数 | 参数解释 |
| ----------------------------- | ------------------------------------------------------------------------------------ |
| `MODEL_TYPE="x070"` | 训练的**模型版本**,当前 RWKV-LM-V7 使用 RWKV-7 的 `x070` 架构 |
| `N_LAYER="12"` `N_EMBD="768"` | **模型层数和维度**,维度和层数决定预训练模型的参数大小,建议参考[硬件需求](#hardware-requirements)修改,N\_EMBD 必须 64 的倍数 |
| `CTX_LEN="4096"` | 预训练的**上下文长度**,必须是 16 的倍数,并与准备训练数据时使用的 `--ctx_len` 参数相同 |
| `data_file` | 预训练的**数据路径**,使用已转换的 bin 和 idx 数据,无需文件名后缀 |
| `--my_exit_tokens` | 训练数据集的**总 token 数**,会在全部 token 训练完毕后退出,在 `make_data.py` 中计算得到 |
| `--magic_prime` | 训练数据集的**magic\_prime 值**,在 `make_data.py` 中计算得到 |
其余参数请**保持默认值**,修改完毕保存 `demo-training-prepare.sh` 文件,然后在 `RWKV-LM-V7` 目录打开终端,并在终端运行 `sh demo-training-prepare.sh` 命令初始化 RWKV 模型。
## 预训练阶段
### 调整训练参数
初始化完成后,使用文本编辑器打开 `RWKV-LM-V7` 目录的 `demo-training-run.sh` 脚本,修改训练参数。
**这些训练参数必须和初始化阶段保持一致:**
| 参数 | 参数解释 |
| ----------------------------- | ------------------------------------------------------------------------------------ |
| `MODEL_TYPE="x070"` | 训练的**模型版本**,当前 RWKV-LM-V7 使用 RWKV-7 的 `x070` 架构 |
| `N_LAYER="12"` `N_EMBD="768"` | **模型层数和维度**,维度和层数决定预训练模型的参数大小,建议参考[硬件需求](#hardware-requirements)修改,N\_EMBD 必须 64 的倍数 |
| `CTX_LEN="4096"` | 预训练的**上下文长度**,必须是 16 的倍数,并与初始化模型、准备训练数据时使用的值一致 |
| `data_file` | 预训练的**数据路径**,使用已转换的 bin 和 idx 数据,无需文件名后缀 |
| `--my_exit_tokens` | 训练数据集的**总 token 数**,会在全部 token 训练完毕后退出,在 `make_data.py` 中计算得到 |
| `--magic_prime` | 训练数据集的**magic\_prime 值**,在 `make_data.py` 中计算得到 |
**其他训练参数的解释和参考值如下:**
部分参数会影响显存占用和训练速度,修改前请确保正确理解参数含义。
| 参数 | 参数解释 |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
| `PROJ_DIR` | 模型输出目录,必须和预训练阶段保持一致,建议保持默认 |
| `M_BSZ=16` | 建议为 2 的幂;显存允许时可以适当增大,以提高训练吞吐 |
| `LR_INIT="6e-4"` | **初始学习率,计算公式为 `0.45 / N_EMBD` 并适当取整。** 比如 L12-D768 0.1B 模型,初始学习率为 `0.45/768=0.0005859375`,取整为 `6e-4`。继续预训练的学习率和从头预训练稍有不同。 |
| `LR_FINAL="6e-5"` | **最终学习率,计算公式为 `0.04 / N_EMBD` 并适当取整。** |
| `GRAD_CP=1` | 是否启用梯度检查点;`GRAD_CP=1` 节省显存但训练较慢,`GRAD_CP=0` 训练更快但消耗更多显存 |
| `HEAD_CHUNK=4096` | LM HEAD;填 `0` 训练快但消耗的 VRAM 更多;`65536` 较慢但消耗的 VRAM 较少;`4096` 更慢,但需要的 VRAM 更少。(注意:这是 LM HEAD,非 RWKV HEAD) |
| `KERNEL="@rwkv3"` | 建议保持 "@rwkv3" ,运行更快,尤其是针对 H100 系列。可通过设置为 `""` 调整为旧版 kernel |
| `EPOCH_SAVE=10` | 每隔多少个 "miniepochs" 保存一次训练模型(1 miniepoch = 40320 \* ctx\_len tokens) |
| `epoch_steps` | 会自动根据 `M_BSZ` 等参数进行计算,计算公式为 `epoch_steps = 40320 / M_BSZ / N_NODE / GPU_PER_NODE `。 |
| `N_NODE=1` | 节点数,通常保持默认值 `1` |
| `GPU_PER_NODE=1` | 每个节点上的 GPU 数量,单显卡填 `1`,多卡则改为实际数量 |
| `DS_BUCKET_MB=2` | DeepSpeed bucket size(单位 MB)。当前示例脚本已禁用该参数;如需启用,请先根据固定的 DeepSpeed 版本验证兼容性 |
| `--load_model "0"` | 保持默认值 `0`。训练中断后,继续训练会自动检测最新检查点 |
| `--wandb "Test"` | **建议注册一个 WandB 账号并填写你的项目名称,以便观察和比较 loss。详情查看附录 [使用 WandB 监控训练过程](#wandb)** |
| `--train_stage 3` | 预训练阶段,保持默认值 `3`。 |
| `--epoch_count 999999` | 总训练轮次,该参数**不生效**。训练进程会在达到 `--my_exit_tokens` 指定的 tokens 数量后自动退出 |
| `--epoch_begin 0` | 初始训练轮次,始终写 `0`,自动加载最新的检查点 |
| `--warmup_steps 10` | 预热步骤,应当根据优化器和学习率的选取进行实验 |
| `--beta1 0.9` | Adam 优化器 beta1 参数,保持默认值 |
| `--beta2 0.99` | Adam 优化器 beta2 参数,保持默认值 |
| `--adam_eps 1e-18` | Adam 优化器的 epsilon 参数,小的 epsilon 更稳定,保持默认值即可 |
| `--data_type binidx` | 当前训练脚本仅支持 `binidx` 数据 |
| `--vocab_size 65536` | 词表大小,必须与训练数据使用的 tokenizer 一致;本教程使用 RWKV World 词表,保持 `65536` |
| `--weight_decay 0.001` | 权重衰减,保持默认值 `0.001` |
| `--head_size 64` | 头大小,保持默认值 `64` |
| `--accelerator gpu` | 加速器类型,必须是 `gpu` |
| `--precision bf16` | 训练精度,当前 RWKV-7 CUDA 算子使用 `bf16`,请保持该值 |
| `--strategy deepspeed_stage_2` | 训练策略,默认 `deepspeed_stage_2`,更多训练策略请参考[DeepSpeed 训练策略](#deepspeed) |
| `--enable_progress_bar True` | 是否在终端显示进度条,通常保持默认值 `True` |
### 开始预训练
`demo-training-run.sh` 开头包含删除部分检查点的 `rm` 命令。如果 `PROJ_DIR` 中已有需要保留的检查点,请先注释这些命令并核对目标目录。
训练参数调整完毕后,保存 `demo-training-run.sh` 文件,并在 `RWKV-LM-V7` 目录下运行 `sh demo-training-run.sh` 命令开启预训练。
如果你在训练参数中配置了 `--wandb "Test"`,开启训练后可访问终端中的 WandB 链接(`https://wandb.ai/xxx`),可视化查看当前训练的 loss 曲线等信息。
## 测试预训练模型
预训练完成后,在 `RWKV-LM-V7/out` 目录中可以找到训练的中间检查点 `rwkv-0/1/2/...pth` 和最终模型文件 `rwkv-final.pth`。
可以使用 [RWKV Runner](../intermediate/RWKV-Runner/Introduction.md) 或者 [RWKV pip - API\_DEMO\_CHAT.py](../intermediate/RWKVpip.mdx) 脚本测试预训练模型。除了最终模型文件 `rwkv-final.pth`,也可以测试最后几个模型检查点。
## 基于官方 RWKV 模型继续预训练
初始化 RWKV 模型时会获得一个 `rwkv-init.pth` 初始化检查点。运行 `sh demo-training-run.sh` 命令时,训练程序会从这个初始化检查点开始训练。
利用这个原理,我们可以将 **RWKV 官方模型**改成 `rwkv-init.pth`,替换初始化目录中的检查点,以实现从 RWKV 官方模型继续预训练。
从 RWKV 官方模型继续训练时,需要确保 `demo-training-run.sh` 脚本中的训练参数 `N_LAYER` / `N_EMBD` 和 RWKV 模型的层数、维度完全对齐。
| RWKV 模型参数 | 层数 `N_LAYER` | 维度 `N_EMBD` |
| --------- | ------------ | ----------- |
| 0.1B | 12 | 768 |
| 0.4B | 24 | 1024 |
| 1.5/1.6B | 24 | 2048 |
| 2.9/3B | 32 | 2560 |
| 7/7.2B | 32 | 4096 |
| 13.3/14B | 61 | 4096 |
继续预训练 RWKV7-G1 模型时,请在 [`src/model.py`](https://github.com/RWKV-Vibe/RWKV-LM-V7/blob/main/src/model.py) 中核对 `D_DECAY_LORA`、`D_AAA_LORA`、`D_MV_LORA` 和 `D_GATE_LORA`,确保这些维度与基底模型参数完全对齐。
| | params | 0.1B | 0.4B | 1.5B | 2.9B | 7.2B | 13.3B |
| :----------------- | :----- | :--- | :--- | :--- | :--- | :--- | :---- |
| **D\_DECAY\_LORA** | w | 64 | 64 | 96 | 96 | 128 | 192 |
| **D\_AAA\_LORA** | a | 64 | 64 | 96 | 96 | 128 | 192 |
| **D\_MV\_LORA** | v | 32 | 32 | 64 | 64 | 96 | 128 |
| **D\_GATE\_LORA** | g | 128 | 128 | 256 | 320 | 480 | 384 |
## 附录
### DeepSpeed 训练策略
本教程使用的 PyTorch Lightning 提供以下 DeepSpeed 策略名称:
| 策略名称 | 分片内容 | 主要取舍 |
| ---------------------------- | --------------------------- | ----------------------------- |
| deepspeed\_stage\_1 | 优化器状态 | 通信开销相对较低,GPU 显存节省有限 |
| deepspeed\_stage\_2 | 优化器状态和梯度 | 进一步节省 GPU 显存,同时增加通信开销 |
| deepspeed\_stage\_2\_offload | Stage 2,并将优化器状态卸载到 CPU | 继续降低 GPU 显存占用,速度取决于 CPU 与传输带宽 |
| deepspeed\_stage\_3 | 优化器状态、梯度和模型参数 | GPU 显存节省最多,但通信与调度更复杂 |
| deepspeed\_stage\_3\_offload | Stage 3,并将优化器状态和模型参数卸载到 CPU | 进一步降低 GPU 显存占用,训练速度更依赖传输带宽 |
本页示例使用 `deepspeed_stage_2`。实际训练时应根据模型规模、GPU 数量、显存和互联带宽选择策略。
参考文档:
* [DeepSpeed Zero Redundancy Optimizer](https://www.deepspeed.ai/tutorials/zero/#zero-overview)
* [DeepSpeed ZeRO-Offload](https://www.deepspeed.ai/tutorials/zero-offload/)
* [DeepSpeed ZeRO-3 Offload](https://www.deepspeed.ai/2021/03/07/zero3-offload.html)
### 使用 WandB 监控训练过程
WandB 是一个用于实验跟踪和模型评估的工具,可以帮助我们更好地监控训练过程和 loss 数据。
**使用 WandB 监控训练过程:**
1. 访问 [WandB 官网](https://wandb.ai),点击 "Sign up" 按钮注册一个 WandB 账号(可以使用邮箱、GitHub、Google 等方式注册)
2. 注册成功后,点击右上角头像进入 “Settings” 页面,在 “API Keys” 栏中点击 “+ New Key” 创建一个新的 API Key,并复制下来
3. 在你的训练设备打开终端,运行 `wandb login` 命令,粘贴你复制的 API Key,按回车确认
4. 在训练脚本中添加 `--wandb "Test"` 参数,训练日志上传到你的 WandB 项目页面,项目名为 Test
5. 你可以在 WandB 主页中点击该项目,实时查看训练过程中的损失(loss)曲线、学习率变化等指标
### 常见问题
`demo-training-run.sh` 会从 `PROJ_DIR` 中查找最新检查点,但脚本开头也包含删除部分检查点的 `rm` 命令。继续训练前,请先注释这些 `rm` 命令,再运行 `sh demo-training-run.sh`,并在终端中确认 `### Loading ...` 指向预期的检查点。
* 在显存允许的情况下,尽可能增大 `M_BSZ` 参数,增大 `M_BSZ` 会增大显存占用,但也会加快训练速度
* 根据模型规模、GPU 数量和互联带宽选择合适的 DeepSpeed 策略
* 显存允许时可关闭梯度检查点:`GRAD_CP=0` 通常训练更快,但会消耗更多显存
* 确认已初始化一个 `rwkv-init` 模型
* 检查 `data_file` 参数是否正确,确保数据文件路径存在且可访问
* 检查 `CTX_LEN` 参数是否和 `make_data.py` 时使用的上下文长度一致
* 检查 `my_exit_tokens` 和 `magic_prime` 参数是否和 `make_data.py` 时得到的参数一致
# 体验 RWKV 模型的在线 Demo
import { CallOut } from 'components-docs/call-out/call-out.tsx'
以下内容可指引你体验 RWKV 模型(在线服务或本地部署):
在体验 RWKV 模型之前,推荐阅读以下两个章节:
## RWKV 模型在线 DEMO
如果你只是想简单尝试一下 RWKV 模型,可以尝试由 RWKV 官方部署在各大模型平台的演示 Demo:
### 在线 DEMO 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1dhXrY7ELs)观看。
### 对话模式 Demo
如果希望直接聊天,优先使用当前的 RWKV Chat;如果希望观察原始续写和思考输出,可以使用官方 Gradio:
### Hugging Face 续写模式
上述两个 Gradio 以续写模式为主,不会像聊天客户端一样自动补全对话格式。
如果你在公共 Demo 中体验 RWKV 模型,建议按 RWKV 的两种标准格式输入 prompts:
```bash copy
User: 请将下列瑞典语 hur lång tid tog det att bygga twin towers 翻译成中文
Assistant:
```
```bash copy
Instruction: 请将下列瑞典语翻译成中文
Input: hur lång tid tog det att bygga twin towers
Response:
```
对于 **RWKV7-G1 系列推理模型**,可以在 QA prompt 中添加 **`` 标签**开启模型的推理过程:
```bash copy
User: simulate SpaceX mars landing using python
Assistant:
**解 15 谜题**
15 谜题(也叫数字推盘游戏或 15 数码)是一个经典的滑块益智游戏,玩家需要在一个 4x4 的方格中放置 1-15 数字并留一个空格,然后通过滑动数字将数字按顺序排列。
在 Demo 的 15 puzzle 界面点击 `New Game` 按钮,可以设置一局全新的 15 谜题。
点击 `start` 按钮,WebGPU Demo 会运行 RWKV-puzzle15 模型**自动**解开当前的 15 谜题,左侧则显示模型的 CoT 推理过程。
**作曲功能**
在 Demo 的 Music 界面,可以驱动 **RWKV ABC 模型**进行**作曲**。操作步骤:
1. 点击 `Load Model` 按钮下载作曲模型
2. 点击 `prompt`下拉框选择一个 ABC 格式的 prompt
3. 点击 `Generate Music` 按钮,开始作曲
**State 可视化**
在 Demo 的 State Replay 界面,可以查看 **RWKV 作为 RNN 模型的隐藏状态演变**。
State Replay 功能需要提前在 **chat 界面**启动一个 RWKV 模型。
下图是对 RWKV-7-World-0.1B 模型输入 “你好” 后,模型的隐藏状态演化。
RWKV-7-World-0.1B 的设计是 L12-D768,所以我们可以在 State Replay 中查看模型 12 层的状态演化,每层按照 $64×64$ 维度(一个 head)划分为 12 个可视化小方格。
小方格的颜色解释:
* 深蓝色:较低值或接近负数的数值
* 黄色:较高值或接近正数的数值
* 灰色或黑色:数值接近 0
## 本地部署 RWKV 模型
如果你希望在自己的设备上本地部署并使用 RWKV 模型,建议采用以下几种工具:
### RWKV Runner
RWKV Runner 是 RWKV 模型的管理和启动工具,由 RWKV 开源社区成员 josStorer 开发,它本身也是一个开源软件,且体积仅 10MB 左右(不含依赖项)。
用户可使用 RWKV Runner 轻松运行本地 RWKV 模型,体验各类 AI 功能,包括但不限于聊天、写作、MIDI/ABC 作曲交互等。
RWKV Runner 的具体用法可以参考 [RWKV Runner 使用教程](../intermediate/RWKV-Runner/Simple-Usage)。
### AI00 RWKV Server
Ai00 Server 是基于 web-rwkv 推理引擎的 RWKV 语言模型推理 API 服务器。它本身也是一个基于 MIT 协议的开源软件,由 RWKV 开源社区成员 @cryscan 和@顾真牛牵头成立的 Ai00-x 开发组开发。
Ai00 Server 支持 Vulkan 作为推理后端,支持 Vulkan 并行和并发批量推理,可以在所有支持 Vulkan 的 GPU 上运行。事实上, Ai00 Server 支持大部分 NVIDIA、AMD、Intel 的显卡(包括集成显卡)。
在高兼容性的同时,Ai00 Server 又不需要笨重的 pytorch 、 CUDA 和其他运行时环境。它结构紧凑,开箱即用,且支持 INT8/NF4 量化,可以在绝大部分的个人电脑上高速运行。
AI00 的具体用法可以参考 [Ai00 使用教程](../intermediate/ai00/Simple-Usage)。
### ChatRWKV
ChatRWKV 是 RWKV 官方的聊天机器人项目,但无图形化界面。你可能需要一定的命令行知识才能使用 ChatRWKV。
[ChatRWKV 仓库地址](https://github.com/BlinkDL/ChatRWKV)
## 选择适合本机的模型
模型能否运行取决于参数规模、精度、推理后端和设备。为了避免同一组数据在多个页面逐渐分叉,本页不再复制性能表;请在[部署 RWKV 模型的显存需求](/docs/RWKV-Wiki/Vram)中查看测试环境和实测结果。
# RWKV 模型的种类和下载方法
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { LinkCard, LinkCardContainer } from 'components-docs/link-card/link-card.tsx'
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV16hidYdE9i)观看。
## 如何选择最好的模型?
| 你准备做什么 | 模型与格式怎么选 |
| ------------------------------- | ---------------------------------------- |
| 第一次在本地聊天 | 选择当前模型卡推荐的 RWKV7-G1 权重,并从显存或内存能够容纳的参数量开始 |
| 使用 RWKV pip 或 Albatross | 下载完整 `.pth` 权重 |
| 使用 llama.cpp、KoboldCpp 或 Ollama | 下载与目标工具兼容的 GGUF 文件 |
| 在 RWKV Chat 或手机上运行 | 从移动端模型列表选择应用明确支持的格式与量化 |
| 使用函数调用 | 选择 G1f 1.5B 或模型卡标明的更新兼容权重,并使用官方函数调用模板 |
| 继续训练或微调 | 下载完整 `.pth` 权重,并记录完整文件名、模型结构和上下文长度 |
在相同参数量中,优先选择模型卡仍在推荐、日期更晚的检查点。完整文件名比单个 `G1x` 后缀更重要:它同时记录架构变体、数据版本、参数量、日期和上下文长度。
## RWKV7-G1 推理模型
RWKV7-G1 系列模型拥有杰出的推理能力,且原生支持世界 100+ 种语言和代码。即使是最小的 0.1B 也能回答开放性和创造性问题。
**模型名中的 G1x 是什么?**
RWKV 模型名称中的 G1x 是 Data Version(数据版本)标识。字母后缀表示继续加入更多、更新且质量更高的数据;选择模型时,请同时核对模型卡、完整文件名、参数量和日期。
G1f 及更新的 1.5B+ 模型还提供当前模型卡中的函数调用格式。需要工具调用时,请同时采用官方 Prompt 模板和 `temperature=0、top_p=0、penalty=0`。
RWKV7-G1 的整体 prompt 格式与 RWKV-7 模型类似,但可选使用 `` 标签开启 reasoning 功能:
```markdown
User: USER_PROMPT
Assistant:
已过时,请使用效果更好的 [RWKV7-G1 系列模型](#rwkv7-g1)。
RWKV-7-World 系列模型均为基底模型(base model ,又称预训练模型)。基底模型在自然语言处理等领域的大规模数据集上进行了训练,具备较强的泛化能力和丰富的知识储备。
但为了保持泛化能力和通用性,基底模型通常不会针对任何一类任务作优化。针对一些垂直的下游任务,可能需要[微调 RWKV 基底模型](../advanced/Fine-Tune/Introduction)才能获得更好的任务效果。
## RWKV-6-World 基底模型【过时】
已过时,请使用效果更好的 [RWKV7-G1 系列模型](#rwkv7-g1)。
RWKV-6-World 系列模型均为基底模型(base model ,又称预训练模型)。基底模型在自然语言处理等领域的大规模数据集上进行了训练,具备较强的泛化能力和丰富的知识储备。
但为了保持泛化能力和通用性,基底模型通常不会针对任何一类任务作优化。针对一些垂直的下游任务,可能需要[微调 RWKV 基底模型](../advanced/Fine-Tune/Introduction)才能获得更好的任务效果。
{/*
*/}
在寻找其他格式(safetensors、gguf)的 RWKV-6-World 模型?请查阅:
* [下载 .st 格式 RWKV-6-World 模型](https://modelscope.cn/models/shoumenchougou/RWKV-6-World-ST/files)
## RWKV-6 中文小说模型【过时】
已过时,请使用效果更好的 [RWKV7-G1 系列模型](#rwkv7-g1)。
RWKV-6-ChnNovel 系列中文小说模型基于 RWKV-6-World 模型微调而来,在小说续写、小说扩写、角色扮演方面有非常好的效果。
小说模型的具体用法,请参考 [RWKV-6-ChnNovel 中文小说模型教程](https://rwkv.cn/news/read?id=4264)
{/*
*/}
## RWKV-6 日文模型
RWKV-6-Jpn 系列日语模型基于 RWKV-6-World 模型微调而来,在日语任务和基准测试上表现良好。
## RWKV-6 State 文件【过时】
作为 RNN 模型,RWKV 拥有固定大小的隐藏状态(State)。可通过加载 State 文件强化 RWKV 模型在特定任务的表现(类似于模型增强插件)。
State 文件具体用法请查看: [RWKV state 介绍和用法](https://rwkv.cn/news/read?id=343)。RWKV 也支持[微调 State 文件](../advanced/Fine-Tune/RWKV-PEFT/State-Tuning)。
可以从以下链接下载 `.pth` 格式的 RWKV State 文件:
* [下载 RWKV-6-World-v2.1/RWKV-6-ChnNovel 模型的 State 文件](https://hf-mirror.com/BlinkDL/temp-latest-training-models/tree/main/states)(Hugging Face 镜像站)
* [下载 RWKV-6-World-v3 模型的 State 文件](https://hf-mirror.com/BlinkDL/rwkv-6-misc/tree/main/states)(Hugging Face 镜像站)
注意: State 文件需要搭配同尺寸的 RWKV 模型,方可正常使用。
HF 仓库中包含以下几种 State 文件:
* chn-single-round:**中文**单轮对话增强,更符合人类语言习惯,带丰富的 Emoji 表情
* eng-single-round:**英文**单轮对话增强,更符合人类语言习惯,带丰富的 Emoji 表情
* chn-小说扩写-single-round:中文单轮对话,会根据用户输入进行小说扩写
* chn-打油诗-single-round:中文单轮对话,会根据用户输入创作打油诗
* chn-文言文-single-round:中文单轮对话,回答的风格会偏向文言文
* chn-文言文和古典名著-single-round:中文单轮对话,回答的风格会偏向文言文和古典名著
* OnlyForChnNovel\_小说扩写 State:用于扩写中文小说,适用于同尺寸的 **RWKV-6-ChnNovel** 模型
除了 `OnlyForChnNovel` 系列,其他 State 文件均适用于 **RWKV-6-World** 模型。
## RWKV-5、RWKV-4 等过时模型
由于老旧架构导致的性能问题, RWKV-5、RWKV-4 全系列(Raven / World / Pile ...)和更早的 RWKV 版本均已结束生命周期,现有模型仅作为存档。
可以在以下链接找到存档的 RWKV 模型:
* [RWKV-5-World](https://hf-mirror.com/BlinkDL/rwkv-5-world)
* [RWKV-4-World](https://hf-mirror.com/BlinkDL/rwkv-4-world)
* [RWKV-4-Raven](https://hf-mirror.com/BlinkDL/rwkv-4-raven)
* 其他 RWKV 系列请在[ HF 仓库](https://hf-mirror.com/BlinkDL)中查看。
# RWKV 的提示词格式是什么
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { LinkCard } from 'components-docs/link-card/link-card.tsx'
## 视频介绍
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1XXQ3YoEXW/)观看。
**先确认你正在使用哪种推理模式:**
| 模式 | 需要输入的内容 |
| ------- | -------------------------------------------------------------------- |
| 自然续写模式 | 输入本页展示的完整 Prompt,例如 `User: xxx` 和末尾留空的 `Assistant:`。 |
| Chat 模式 | 只发送 `xxx` 部分。聊天应用会使用内置的 Chat 模板自动补全 `User:`、`Assistant:` 等格式,无需手动拼接。 |
***
**RWKV 是 RNN 的变体。出于架构原理,RWKV 对提示词的格式比 Transformer 更敏感。**
RWKV 更适合 QA 和指令问答两种提示格式:
## QA 格式 prompt
QA(问答)格式是 RWKV 的默认训练格式。
其中 `User:` 是用户提问的问题,`Assistant:` 是模型的回答。因此我们需要在**最后一个** `Assistant:` 后面留空,让模型进行续写。
```bash
User: 将下面的英语翻译成中文:RWKV (pronounced RwaKuv) is an RNN with great LLM performance and parallelizable like a Transformer.
Assistant:
```bash
User: 将下面的英语翻译成中文:RWKV (pronounced RwaKuv) is an RNN with great LLM performance and parallelizable like a Transformer.
Assistant:
快思考模式直接闭合 `
## 指令问答格式 prompt
```bash
Instruction: 请将下列英语翻译成中文
Input: RWKV (pronounced RwaKuv) is an RNN with great LLM performance and parallelizable like a Transformer.
Response:
```
指令问答是 RWKV 另一种训练格式。其中 `Instruction:` 是用户给模型的指令,`Input:` 是用户给模型的输入,`Response:` 是模型的回答。
`Response:` 后面留空,让模型进行续写。
```bash
Instruction: 以json格式总结下面的材料文本,包含date/location/title
Input: 2025 年 2 月 22 日,RWKV project 在中国上海漕河泾举办了主题为《RWKV-7 与未来趋势》的开发者大会。来自全国各地的开发者、行业专家和技术创新者齐聚一堂 —— 从知名高校实验室到前沿创业团队,现场涌动的创新能量印证了 RWKV-7 的优秀性能和深远意义。
Response:
```
参考的回复:
```json
{
"date": "2025年2月22日",
"location": "中国上海漕河泾",
"title": "RWKV-7 与未来趋势开发者大会"
}
```
## 材料问答格式
推荐使用以下材料问答格式:
```markdown
User:\n材料:\n{context}\n问题:{question}\n只根据下文回答;没有就答null。\n\nAssistant: {"answer":
User:\n下文:\n{context}\n问题:{question}\n只写材料中的答案;没有就答null。\n\nAssistant: {"answer":
User:\n材料:\n{context}\n问题:{question}\n只回答材料中的答案;没有就答null。\n\nAssistant: {"answer":
User:\n下文:\n{context}\n根据上文回答:{question}\n只根据上文回答;没有就答null。\n\nAssistant: {"answer":
```
可以根据具体的材料内容,修改问题和限制条件。例如:
```markdown
User: 材料:
# 下载最新的 MiniConda 安装包
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 运行 MiniConda 安装包的安装脚本,安装期间一定要注意进展,及时输入 yes !
sh Miniconda3-latest-Linux-x86_64.sh -u
# 重启环境变量,激活 Conda 环境
source ~/.bashrc
# 创建名为 rwkv-lm-v7 的 conda 环境, 并指定 python 版本为 3.12
conda create -n rwkv-lm-v7 python=3.12
# 激活 rwkv 环境
conda activate rwkv-lm-v7
问题:用中文简单解释这段材料的含义
只写答案,不解释。
Assistant: {"answer":
```
在 [web demo](https://www.modelscope.cn/studios/BlinkDL/RWKV-CHN-2) 中并发 16 路测试:
推荐参数: Temperature=1、Topp=0.2、Penalty 参数调整为 0。
## few-shot
对于一些带上下文的问答任务,我们建议在 prompt 中重复几个同类的问题为模型作示范,这种技巧被称为 few-shot。
举个例子:直接使用以下 prompt 进行续写时,模型生成的回复缺乏明显的风格特征:
```bash
User: 请你帮我给以下句子写广告词:这是一款新的笔记本,很轻,电池能用很久。
Assistant:
```
参考的模型回复:
```bash
这款笔记本轻巧便携,让你随时随地畅享移动办公。同时,它的电池续航能力惊人,让你不用担心频繁充电的烦恼。无论是学习、工作还是娱乐,这款笔记本都能满足你的需求。快来体验它吧!
```
使用下面的 few-shot prompt 进行续写时,模型能够从上下文中学习到具有鲜明风格特征的前文信息,从而生成带有明显风格特色的广告词:
```bash
User: 请你帮我给以下句子写广告词:这是一款手冲咖啡壶,玻璃材质,可以过滤咖啡。
Assistant: 告别速溶,只需3分钟,在家复刻咖啡馆级的风味。高透玻璃壶身,亲眼见证每一滴香醇的萃取。用一个清晨的仪式感,唤醒一整天的活力。
User: 请你帮我给以下句子写广告词:我们新出了一门口语课,教你怎么跟外国人聊天。
Assistant: 还在对着屏幕说“Hello, how are you?” 别让你的口语停留在课本里!我们的课程带你走进真实对话场景,从点餐到侃大山,让你自信开口,像本地人一样聊天!
User: 请你帮我给以下句子写广告词:这是一款新的笔记本,很轻,电池能用很久。
Assistant:
```
参考的回复:
```bash
轻盈如羽,电池如海。这款笔记本让你随时随地畅游数字世界,无需担心续航问题。
```
## function call
请使用最新的 RWKV-7 G1x 模型。其他模型即使套用相同提示词,也不具备可靠的 Function Call 能力。
工具定义必须放在 `System: Tools:` 后,并明确要求模型只返回 JSON 函数调用。
````text
System: Tools:
- get_weather(location: string, unit?: "celsius" | "fahrenheit")
- get_stock_price(ticker: string)
- translate_text(text: string, target_language: string)
Return only a JSON function call.
User: Translate "Will it rain tomorrow?" into Japanese.
Assistant: ```json
````
````text
System: Tools:
[
{"name":"find_free_slots","description":"Find free calendar slots","arguments":{"date":{"type":"string"},"duration_minutes":{"type":"integer"},"time_window":{"type":"string"}}},
{"name":"create_calendar_event","description":"Create a calendar event","arguments":{"title":{"type":"string"},"start_time":{"type":"string"},"end_time":{"type":"string"},"attendees":{"type":"array","items":{"type":"string"}}}}
]
Return only a JSON function call.
User: Schedule a 30-minute sync with Bob on 2026-05-08 afternoon.
Assistant: ```json
{"name":"find_free_slots","arguments":{"date":"2026-05-08","duration_minutes":30,"time_window":"afternoon"}}
```
User: Function output:
{"free_slots":[{"start":"2026-05-08T15:00:00+09:00","end":"2026-05-08T15:30:00+09:00"}],"bob_email":"bob@example.com"}
Assistant: ```json
````
应用需要解析并校验模型返回的 JSON、限制可调用的工具,并处理参数缺失与执行失败;模型只负责生成调用请求,不会替应用执行工具。
# 如何调整 RWKV 的解码参数
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
你可能注意到了,很多 RWKV 部署/体验工具都支持调整 `Temperature`、`Top_P` 、`Presence Penalty `、`Frequency Penalty`等参数,这些参数是 RWKV 模型的“解码参数”(也可称之为“采样参数”)。
通过**调整解码参数**,可以改变模型的生成效果。
即使是使用同一个 Prompt、同一个 RWKV 模型,不同的参数配置可能获得截然不同的回答。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1iMRnY8ENn)观看。
## RWKV 模型的解码参数
RWKV 主要解码参数对应的效果如下:
| 参数 | 效果 |
| ------------------- | ------------------------------------------------------------------------------------- |
| `Temperature` | 温度参数 $T$ 通过修改 logits 的缩放比例控制生成结果的随机性。高温会使概率分布更均匀,增加生成内容的随机性;低温则使模型更倾向于选择概率最高的 token |
| `Top_P` | 选择累积概率达到 $P$ 值的前 $N$ 个 token 作为候选集。如设置成 0.1 则考虑前 10% , 生成内容质量更高但更保守。设置成 1 则内容质量降低但更多样 |
| `Presence Penalty` | 存在惩罚,对**已出现过的所有 token** 施加**固定惩罚**,从而增加了模型生成新 token 的可能性 |
| `Frequency Penalty` | 频率惩罚,根据 **token 出现的次数**进行**累加惩罚**,从而减少模型频繁地重复相同内容的可能性 |
| `Penalty Decay` | 惩罚衰减参数,用于控制 `Presence Penalty` 和 `Frequency Penalty` 的衰减速度。数值越接近 1,惩罚衰减得越慢;数值越小,则衰减越快 |
| `max_tokens` | 模型生成文本时的最大 token 数,可以理解为“模型一次最多生成多少字” |
接下来,我们将 RWKV 模型比喻为一名作家,并使用**更通俗易懂的说法**解释这些参数的作用。
### `Top_P` 参数
`Top_P` 就像一位主编,它决定 RWKV 这位作家**可以使用多少词汇**。假设当前可选的词汇有 100 个,那么:
* `Top_P = 0.2` 是一位**非常严苛**的主编,只允许 RWKV 使用最常见、最符合逻辑的词汇(按照 Zipf 语言分布,实际可选词可能仅有 3 \~ 8 个)。
* `Top_P = 1` 是一位**非常宽松**的主编,RWKV 可以自由选择所有 100 个词汇,生成更加多样化的文本。
**`Top_P` 调整建议**:
| 使用场景 | 推荐 `Top_P` | 适用情况 |
| -------------------- | ---------- | --------------------------- |
| 创意写作、故事生成 | 0.7 | 允许一定程度的发散,避免内容过于死板,同时不会偏离主题 |
| 机械式问答、摘要、翻译 | 0.3 | 重点保持精准、减少不必要的发散 |
| 确定性回答(是/否、ABCD、1234) | 0 | 只允许最确定的答案,完全避免随机性 |
### `Temperature` 温度参数
增加 `Temperature` 温度参数就像给 RWKV 这位作家“喝酒”。增加温度参数会增大文字的**随机性**,使内容更多样化,但太高**可能使生成的内容不通顺或不合常理**。
* 如果温度较低(如 0.5 以下),模型会像严谨的学术作家一样,只使用最通用最稳健的词汇。比如“阳光明媚” 会描述为 “日照充足”。更严谨,适合正式写作或精确回答。
* 如果温度较高(如 1.5 以上),模型会像喝醉的诗人一样,使用更多不常见的词汇,比如把彩虹描述为"宇宙的彩色伤口"。更有创造力,但可能出现不连贯表达。
**`Top_P` 极低时,需适当提高 `Temperature`(1 以上),避免文本陷入死循环或重复**。
### `Presence Penalty` 参数
`Presence Penalty` 可以防止同一个词被反复使用,但不会因多次出现而增加惩罚力度。它的本质类似于一个动态更新的“禁用词库”:
* 每当模型生成一个新词,该词会立即被加入“禁用词库”
* 在后续生成过程中,该词**出现的概率会被固定降低一定值**(例如 0.5)
假设当前的 `Presence Penalty` 参数值是 0.5, “美丽” 这个词在原始情况下的生成概率为 10%。那么
* 若“美丽”这个词此前已出现过,则其生成概率会被扣除固定值,对应 logits 下降,最终概率降低
* 但其他未出现的词不受影响,其 logits 不变,最终概率可能因归一化略有调整
`Presence Penalty` 数值过高,可能会导致模型**过度避免重复用词**,使文本变得不自然或不连贯。在 `Top_P` 极低等极端情况下,可能影响标点符号的使用,甚至生成异常字符或难以理解的文本。
### `Frequency Penalty` 参数
`Frequency Penalty` 用于**抑制高频重复词**,它会根据**某个词在已生成文本中出现的次数**来降低其后续出现的概率。出现次数越多,惩罚越强。可通过增加 `Frequency Penalty` 参数来**减少“然后”、“嗯嗯”等口头禅式的重复**,从而让生成的文本更加自然流畅。
假设当前的 `Frequency Penalty` 设为 `0.3`,某个词“美丽”的原始生成概率是 `10%`,但此前已经生成过三次:
* 计算惩罚后,"美丽" 的新概率 = `10% - (3 × 0.3)` = `9.1%`
* 如果再生成一次(累计四次出现),则新一轮惩罚扣除 `4 × 0.3 = 1.2%`
以上示例仅用于说明 `Frequency Penalty` 的作用,实际计算通常是对 logits 进行乘法调整,而不是简单的减法操作。
### `Penalty Decay` 参数
`Penalty Decay` 参数用于控制 `Presence Penalty` 和 `Frequency Penalty` 的衰减速度,它会根据 token 之间的距离,逐步减弱惩罚强度。
假设 `Presence Penalty = 1`,而模型写下了:“美 好 的 天 气 …”。前面我们了解过, `Presence Penalty` 会对出现过的字添加惩罚,因为“美”已经在第一个位置出现过,`Presence Penalty = 1` 会大大降低模型再次生成“美”字的概率。
但是 `Presence Penalty` 惩罚的强度并不是一成不变的,在 `Penalty Decay` 参数的作用下,`Presence Penalty` 惩罚会随着文本的长度增加而逐步减弱,衰减公式:$P_{\mathrm{effective}} = P_0 \cdot \gamma^d$,其中 $P_0$ 是原始惩罚值,$\gamma$ 是 `Penalty Decay` 值,$d$ 是与“美”上次出现的位置的距离。
从公式可以看出来,惩罚减弱的速度由 `Penalty Decay` 参数的大小决定。`Penalty Decay` 参数的范围是 0.99 \~ 0.999,数值越接近 1,惩罚衰减得越慢;越小则衰减越快。
如果把 RWKV 模型比作一位作家,那么 `Penalty Decay` 就是这位作家的**记性**:
* `Decay = 0.99` 时,RWKV 模型的**记性很差**。在生成 100 个字之后,它对第一个“美”字的惩罚值只剩下约 0.366($Presence Penalty \cdot 0.99^{100} \approx 1.0 \cdot 0.366 \approx 0.366$)。此时模型已经忘记自己生成过“美”字了,模型**生成“美”字的概率很高**。
* `Decay = 0.999` 时,RWKV 模型的**记性很好**。在生成 100 个字之后,它对第一个“美”字的惩罚值仍然高达 0.905($Presence Penalty \cdot 0.999^{100} \approx 1.0 \cdot 0.905 \approx 0.905$)。模型会牢记自己曾经生成过“美”字,此时**生成“美”字的概率很低**。
## 不同任务的推荐解码参数组合
我们为不同的任务提供了一些推荐的参数:
下面先给出 RWKV-7 G1 模型卡的参数起点,再保留两组按任务收紧随机性的通用示例。其他架构或微调模型应以对应模型卡为准。
| 任务类型 | Top\_P | Temperature | Presence Penalty | Frequency Penalty | Penalty Decay |
| --------------------- | ---------- | ----------- | ---------------- | ----------------- | ------------- |
| G1 创意写作 | 0.6 \~ 0.8 | 0.6 | 2.0 | 0.2 | 0.99 |
| G1 普通聊天 | 0.5 | 1.0 | 2.0 | 0.1 | 0.99 |
| 保守型任务,回答稳定且准确 | 0.3 | 0.3 | 0.0 | 0.0 | 0.996 |
| G1f 1.5B+ 函数调用(模型卡参数) | 0.0 | 0.0 | 0.0 | 0.0 | 保持默认值(不生效) |
| 机械任务,无随机性 | 0.0 | 0.0 | 0.0 | 0.0 | 保持默认值(不生效) |
* **创意类内容创作**:典型的例子是小说、故事创作,需要平衡 `Temperature` 和 `Top_P`,提供更多的**随机性**和**开放性**,让模型能生成更具想象力的表达。
* **G1 普通聊天**:采用当前模型卡给出的聊天基线;其他架构或微调模型可能需要不同参数。
* **保守型任务**:如知识问答、代码任务等,需要稳定且准确的回答,因此大幅降低 `Top_P` 和 `Temperature` ,同时移除 `Presence Penalty` 和 `Frequency Penalty` 带来的惩罚。
* **函数调用**:RWKV-7 G1 模型卡为 G1f 1.5B 及更大模型给出的建议是将 `Temperature`、`Top_P`、`Presence Penalty` 和 `Frequency Penalty` 设为 0。还需配合对应的 Function Call 模板,并测试目标模型的输出稳定性。
* **机械任务**:如选择题、判断题等,需要严格遵循特定格式,只输出唯一解。可以将 `Temperature`、`Top_P`、`Presence Penalty` 和 `Frequency Penalty` 设为 0,以取消随机性。两个惩罚参数均为 0 时,`Penalty Decay` 不会影响输出,保持后端默认值即可。
`Top_P = 0` 时, `Temperature` 参数会失效。
# RWKV 的 State 文件用法
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
## state 文件是什么
RNN 网络在运行过程中会保持一个隐藏状态(state),隐藏状态可看作 RNN 模型的“心理状态”。就像人类在思考时,脑海中会保留与当前事件关联度最高的“关键信息”。随着思考内容的变化,人类脑海中的“关键信息”会不断更新。同样的,RNN 网络也会通过特定的函数不断更新其隐藏状态。
RWKV 是 RNN 的变种架构,RWKV 模型在推理时也会生成并更新 state。RWKV 的 state 具有很强的可操作性,比如 state 可以被缓存,可类似于“历史聊天记录”一般被保存为独立的文件。在推理时加载此 state 文件,即可恢复对应的历史上下文。
此外,RWKV 有独特的 [state tuning](../advanced/Fine-Tune/RWKV-PEFT/State-Tuning) 方法,微调 RWKV 的初始 state,就相当于最彻底的 prompt tuning。state tuning 常应用于以下场景:
1. 角色扮演调优(Character State)
2. 任务特化(Task Embedding)
3. Domain adaptation(在新领域任务上适配)
4. 长上下文压缩(把一大段语料学习成一个 state)
state tuning 可以得到 “state” 检查点文件,这些 state 文件本质上就是经过优化的 hidden state,在推理模型时**加载 state** 后,模型会表现出相应的语义倾向或风格。
## 如何挂载 state 文件
state 文件需要配合基底 RWKV 模型,才能发挥其效果。
你可以在 [RWKV Runner](../intermediate/RWKV-Runner/Introduction.md) 或者 [Ai00](../intermediate/ai00/Introduction.md) 中搭载 state 文件,二者搭载 state 文件的方法略有不同。
### RWKV Runner 挂载 state 文件
在 RWKV Runner 中,你可以按照以下步骤使用 state 文件:
* 启动一个 RWKV 模型
* 在配置页面选择对应的 state
* 点击`保存配置`按钮。
点击保存后即可实时更新 state ,无需重新启动 RWKV 模型。
在下图的示例中,我们已经启动了 RWKV-6-7B-World 模型。那么我们只需在 RWKV Runner 的配置页面,选择基于 RWKV-6 7B 的 state 文件(名称中带有 `x060 | 7B` 字段),然后点击 `保存配置` 按钮。
### Ai00 挂载 state 文件
请使用 [Ai00 转换脚本](https://github.com/Ai00-X/ai00_server/blob/main/assets/scripts/convert_safetensors.py)将 `.pth` 格式的 State 文件转换为 `.st` 格式,并重命名为 `.state` 格式,才能在 Ai00 中使用。
在 Ai00 中,你可以按照以下步骤使用 state 文件:
修改 `config.toml` 配置文件,取消注释以开启 `state` 选项,并指定对应的 state 文件路径。
```toml
[[state]] # 开启 state 挂载功能
# id = "fd7a60ed-7807-449f-8256-bccae3246222" # 非开发环境一般不指定 UUID,可保留 `#` 注释符
name = "x060-7B-Chinese" # 为此 state 文件命名为“x060-7B-Chinese”,方便在 WebUI 选择
path = "rwkv-x060-chn-single-round-qa-7B-20240516-ctx2048.state" # 存放在 model 文件夹的 state 文件名称
```
Ai00 支持在 `config.toml` 配置文件中添加多个 `[[state]]` 块,一次配置多个 state 文件,然后在 WebUI 中动态切换 state 文件。
在下面的 Ai00 示例中,我们将配置三个基于 RWKV-6-7B 模型的 state 文件。在 `config.toml` 中添加如下配置:
```toml
[[state]] # 挂载 state
# default = false # 保持注释
# id = "fd7a60ed-7807-449f-8256-bccae3246222" # 非开发环境一般不指定 UUID,因此保留 `#` 注释符
name = "x060-7B-打油诗" # 为此 state 文件命名为“x060-7B-打油诗”,方便在 WebUI 选择
path = "x060-打油诗-7B.state" # 存放在 model 文件夹的 state 文件名称
[[state]] # 挂载第二个 state
name = "x060-7B-文言文+古典名著" # 为此 state 文件命名为“x060-7B-打油诗”,方便在 WebUI 选择
path = "x060-文言文和古典名著-7B.state" # 存放在 model 文件夹的 state 文件名称
[[state]] # 挂载第三个 state
name = "x060-7B-小说扩写" # 为此 state 文件命名为“x060-7B-小说扩写”,方便在 WebUI 选择
path = "x060-小说扩写-7B.state" # 存放在 model 文件夹的 state 文件名称
```
保存配置文件并启动 `Ai00-server`,在 Ai00 WebUI 右上角可以动态切换 state 。
在 Ai00 WebUI 切换 state 时,建议新建一个聊天会话或清除上一个 state 的聊天内容,以确保新的 state 文件生效。
# RWKV 入门教程
import { CardContainer } from 'components-docs/card/card-container.tsx'
import { Card } from 'components-docs/card/card.tsx'
import { LibraryBig, PanelBottomDashed, PlayCircle, Download, MessageSquare, Sliders } from "lucide-react";
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV 入门教程主要介绍 RWKV 模型的种类和下载方法、在线体验方法,以及如何改善 RWKV 模型的生成质量。
## 在线体验和模型下载
我们提供了 RWKV 模型的在线体验 Demo 和简单易用的模型下载方法,方便大家在线体验和下载多个版本的 RWKV 模型。
## 改善 RWKV 模型的生成质量
由于 RWKV 模型的 RNN 架构特质,RWKV 模型对提示词更加敏感,通过**优化提示词格式**和**调整解码参数**,可以提升 RWKV 模型在不同任务的性能表现。
# RWKV-FLA 使用教程
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV-FLA 提供基于 PyTorch 与 Triton 的 RWKV 算子、模型组件和 Hugging Face 风格接口,适合跨硬件实验与已有 FLA 模型推理。
本页适用于 RWKV-FLA 算子实验和已有 `fla-hub` 模型推理。
FLA 的 RWKV-7 实现尚未与官方参考实现完全对齐,训练效果和性能也存在差距。需要复现或训练正式 RWKV-7 模型时,请使用 [RWKV-7 `train_temp` 参考实现](https://github.com/BlinkDL/RWKV-LM/tree/main/RWKV-v7/train_temp)。
## 特性与优势
* **跨平台支持**:支持多种硬件后端,包括 NVIDIA、Intel、AMD、摩尔线程、沐曦等
* **Triton 算子**:提供 RWKV 的并行与循环计算实现
* **灵活的API**:提供友好的接口,易于与现有代码集成
* **Transformers 接口**:可以加载兼容的 `fla-hub` 模型进行推理
## 安装指南
先根据 [PyTorch 安装页面](https://pytorch.org/get-started/locally/) 安装适合当前硬件的 PyTorch,再选择对应的 RWKV-FLA 可选依赖:
```bash
# 创建新环境(支持 Python 3.10 ~ 3.13)
conda create -n rwkv-fla python=3.12
conda activate rwkv-fla
# 先按 PyTorch 官网命令安装 CUDA 版 PyTorch,再安装 RWKV-FLA
python -m pip install --upgrade "rwkv-fla[cuda]"
```
```bash
python -m pip install --upgrade "rwkv-fla[xpu]"
```
```bash
python -m pip install --upgrade "rwkv-fla[rocm]"
```
遇到算子或兼容性问题时,先运行 `python -m pip install --upgrade rwkv-fla triton`。
如果升级后问题仍然存在,请在反馈时附上 PyTorch、Triton、显卡和驱动版本。
## 模型推理示例
下面的示例使用 Hugging Face Transformers 风格接口加载模型。将代码保存为 `xx.py`,然后运行 `python xx.py`:
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained('fla-hub/rwkv7-1.5B-g1',torch_dtype=torch.bfloat16, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained('fla-hub/rwkv7-1.5B-g1', trust_remote_code=True)
model = model.cuda()
# 准备对话历史和提示词
prompt = "什么是深度学习?\n\n"
messages = [
{"role": "user", "content": "你是谁?"},
{"role": "assistant", "content": "我是RWKV,一个基于RWKV架构的AI模型。"},
{"role": "user", "content": prompt}
]
# 应用对话模板
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=True # 默认为 True,设为 False 则禁用思考
)
# 模型推理,可以通过调整 temperature 等解码参数来调整生成质量
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=500,
do_sample=True,
temperature=1.0,
top_p=0.3,
repetition_penalty=1.3
)
# 处理输出
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=False)[0]
print('\n')
print(response)
print('\n')
```
成功运行后,终端会输出如下内容:
此处以 RWKV7-1.5B-g1 为例,可选模型还有很多,详细请到 [https://huggingface.co/fla-hub](https://huggingface.co/fla-hub) 查看。
## 使用 RWKV 组件
RWKV-FLA 提供了各种组件,可以单独使用以构建自定义模型架构。
### 使用 RWKV7 注意力层
```python
from fla.layers.rwkv7 import RWKV7Attention
attention_layer = RWKV7Attention(
mode=config.attn_mode,
hidden_size=config.hidden_size,
head_dim=config.head_dim,
num_heads=config.num_heads,
decay_low_rank_dim=config.decay_low_rank_dim,
gate_low_rank_dim=config.gate_low_rank_dim,
a_low_rank_dim=config.a_low_rank_dim,
v_low_rank_dim=config.v_low_rank_dim,
norm_eps=config.norm_eps,
fuse_norm=config.fuse_norm,
layer_idx=layer_idx,
value_dim=config.value_dim[layer_idx],
num_hidden_layers=config.num_hidden_layers
)
```
### 使用 RWKV7 前馈网络
```python
from fla.models.rwkv7.modeling_rwkv7 import RWKV7FeedForward
ffn_layer = RWKV7FeedForward(
hidden_size=config.hidden_size,
hidden_ratio=config.hidden_ratio,
intermediate_size=config.intermediate_size,
hidden_act=config.hidden_act,
layer_idx=layer_idx,
num_hidden_layers=config.num_hidden_layers
)
```
## 注意事项
* 不要将 RWKV-FLA 的 RWKV-7 训练结果当作官方参考实现的等价结果
* 如遇到平台特定问题(如 Triton 版本、精度异常等),建议优先向相应硬件厂商反映
* 不建议直接调用底层计算内核,除非有特殊需求并已充分了解代码实现
## 版本要求
* Python 3.10 及以上版本
* PyTorch 2.5 及以上版本
* Triton 3.0 及以上版本
* Transformers 4.45 及以上版本
# RWKV pip 使用指南
import { CallOut } from 'components-docs/call-out/call-out.tsx'
本文首先介绍面向 RWKV-7 G1 权重的 CUDA Graph 推理,再通过 `API_DEMO_CHAT.py` 解释有状态聊天循环。安装示例使用 `rwkv==0.8.32`:
```bash
pip install "rwkv==0.8.32"
```
RWKV pip 库的原始代码可以在 **[ChatRWKV](https://github.com/BlinkDL/ChatRWKV)** 仓库中找到。
## 带 CUDA Graph 的加速推理代码
以下是 RWKV 模型的两种推理模式:**常规模式(Slow)** 和 **带 CUDA Graph 的加速模式(Fast/CUDA Graph)**,后者通过消除 Python 调用开销实现极高的 Token 生成速度。
### 1. 环境设置与依赖导入
```python
import os, time
import numpy as np
import torch
# 环境变量设置:必须在导入 rwkv 库之前设置
os.environ["RWKV_V7_ON"] = '1' # 开启 RWKV-7 模型支持
os.environ['RWKV_JIT_ON'] = '1' # 开启 JIT (Just-In-Time) 编译,加速算子加载
os.environ["RWKV_CUDA_ON"] = '1' # 开启 CUDA 自定义算子(需要 CUDA 编译器)
from rwkv.model import RWKV
from rwkv.utils import PIPELINE
```
**模型版本:**`RWKV_V7_ON` 仅适用于 RWKV-7 模型。加载 RWKV-6 或 RWKV-5 模型时,请将其设为 `0` 或删除这一行。
**CUDA 自定义算子:**`RWKV_CUDA_ON='1'` 需要系统能够使用 `nvcc`。如果编译失败,请将它设为 `0`,改用 PyTorch 实现。
这里设置了运行 RWKV 所需的核心环境变量,并导入了必要的库。
### 2. 模型加载与参数配置
```python
# 初始化模型
# strategy='cuda fp16': 使用 GPU (cuda) 进行计算,精度为 fp16
model = RWKV(model='/mnt/e/RWKV-Runner/models/rwkv7-g1a-0.1b-20250728-ctx4096', strategy='cuda fp16')
# 初始化 Pipeline
# 用于将文本转换为 token id (encode) 以及将 token id 转换回文本 (decode)
pipeline = PIPELINE(model, "rwkv_vocab_v20230424")
# 生成参数设置
LENGTH_PER_TRIAL = 256 # 每次生成的 token 长度
TEMPERATURE = 1.0 # 温度:越高越随机,越低越确定
TOP_P = 0.0 # Top-p 采样:0.0 只保留概率最高的 token
# 提示词 (Prompt)
prompt = "User: simulate SpaceX mars landing using python\n\nAssistant:
**为什么叫 Slow?**
在 Python 中,`for` 循环每一次 `model.forward(token, state)` 都会发起一次从 CPU 到 GPU 的内核启动调用。对于小模型或快速 GPU,Python 发起调用的时间开销(Overhead)可能比 GPU 实际计算的时间还要长。
### 4. 准备快速推理:CUDA Graph 录制
```python
print('='*80 + '\nFast inference (CUDAGraph, requires rwkv pip pkg v0.8.31+)\n' + '='*80)
print(prompt, end="")
all_tokens = []
out_last = 0
# 重置状态,获取一个全零的初始状态结构
state = model.generate_zero_state()
# 关键步骤:分配静态显存 (Static Memory)
# CUDA Graph 要求输入和输出的内存地址必须固定,不能变动。
# 1. 静态输入 Tensor (存放当前 Token 的 Embedding)
static_input = torch.empty((model.n_embd), device="cuda", dtype=torch.half)
# 2. 静态状态 Tensor (存放 RNN 隐状态)
# 需要两组:in 用于输入上一刻状态,out 用于输出当前刻状态
static_state_in = [torch.empty_like(x, device="cuda") for x in state]
static_state_out = [torch.empty_like(x, device="cuda") for x in state]
# 3. 静态输出 Tensor (存放预测下一个词的 Logits)
static_output = torch.empty((model.args.vocab_size), device="cuda", dtype=torch.half)
# 关键步骤:录制图 (Graph Capture)
g = torch.cuda.CUDAGraph()
with torch.cuda.graph(g):
# 在这个上下文管理器中,执行一次特殊的 forward 操作。
# GPU 不会真的计算数据,而是"记住"了所有的计算步骤和依赖关系。
# model.forward_one_alt 是专门为 CUDAGraph 优化的单步前向函数
static_output, static_state_out = model.forward_one_alt(static_input, static_state_in)
```
**核心原理:**
CUDA Graph 将一系列 GPU 操作打包成一个单一的“超级操作”。运行时,只需向预先分配好的 `static_` 内存中填入数据,然后告诉 GPU Replay 这个图即可。这个过程绕过了 Python 对每一层算子的调度开销。
### 5. 执行快速推理:Graph Replay
```python
# 1. 预处理 Prompt (Prefill)
# Prompt 处理阶段无法使用 CUDAGraph(因为长度不固定),所以使用常规 forward
out, state = model.forward(pipeline.encode(prompt), state)
# 2. 将 Prompt 计算后的状态复制到静态内存中,为 Graph 运行做准备
for i in range(len(state)):
static_state_in[i].copy_(state[i])
# 将初始输出也复制进去(虽然如果是 greedy decoding 可能只用 state 就够,但保持一致性)
static_output.copy_(out)
times = []
all_times = []
t000 = time.perf_counter()
# 3. 快速生成循环
for i in range(LENGTH_PER_TRIAL):
t00 = time.perf_counter()
# 采样 (Sample) - 注意:这里直接从 static_output 读取数据
token = pipeline.sample_logits(static_output, temperature=TEMPERATURE, top_p=TOP_P)
all_tokens += [token]
# 解码打印 (Decode)
tmp = pipeline.decode(all_tokens[out_last:])
if '\ufffd' not in tmp:
print(tmp, end="", flush=True)
out_last = i+1
torch.cuda.synchronize()
t0 = time.perf_counter()
# 核心加速步骤
# A. 填充输入:直接从 Embedding 表中取出对应的向量,填入 static_input
# 注意:这里我们不传 token id,而是直接传向量,减少图内部的查表开销
static_input.copy_(model.z['emb.weight'][token])
# B. 回放图:一键执行整个模型的前向计算
g.replay()
# C. 更新状态:将输出状态 (out) 复制回 输入状态 (in),形成 RNN 的循环
# 这样下一次 replay 时,使用的就是更新后的状态了
for n in range(len(state)):
static_state_in[n].copy_(static_state_out[n])
# --
torch.cuda.synchronize()
t1 = time.perf_counter()
times.append(t1 - t0)
all_times.append(t1 - t00)
# 打印统计
times = np.percentile(times, 50)
all_times = np.percentile(all_times, 50)
print(f'\n\nToken/s = {round(1/times,2)} (forward), {round(1/all_times,2)} (full) (note: very inefficient sample_logits)')
```
这一段展示了如何利用录制好的图进行推理。
* **`g.replay()`**: 替代了 `model.forward()`。
* **显存拷贝 ( `.copy_` )**: 看起来是额外操作,但在 GPU 内部(D2D copy)极快,远小于 Python 调用函数的开销。
这种方法使小参数量模型(如 0.1B, 0.4B, 1.5B)获得 **2 到 5 倍**推理速度提升,对于大模型的提升幅度会减小,因为大模型的主要瓶颈在于计算而非调度。
## 历史示例:API\_DEMO\_CHAT.py
**[API\_DEMO\_CHAT](https://github.com/BlinkDL/ChatRWKV/blob/main/API_DEMO_CHAT.py)** 是一个基于 RWKV pip 库的开发 Demo,用于**实现基于命令行的聊天机器人**。
本节保留旧版示例中的 RWKV-6 文件名和 prompt,用于说明 RWKV 的有状态聊天循环。新项目请从本页前半部分的 RWKV-7 示例开始。
### 1. 环境设置与依赖导入
```python
########################################################################################################
# The RWKV Language Model - https://github.com/BlinkDL/RWKV-LM
########################################################################################################
print("RWKV Chat Simple Demo") # 打印一个简单的消息,表明这是 RWKV 聊天的简单演示。
import os, copy, types, gc, sys, re # 导入操作系统、对象复制、类型、垃圾回收、系统、正则表达式等包
import numpy as np # 导入 numpy 库
from prompt_toolkit import prompt # 从 prompt_toolkit 导入 prompt,用于命令行输入
import torch # 导入 pytorch 库
```
这部分代码是导入一些使用 RWKV 模型推理时需要用到的包,需要注意以下两点:
* torch 版本最低 1.13 ,推荐 2.x+cu121
* 需要先 `pip install rwkv`
```python
# 优化 PyTorch 设置,允许使用 tf32
torch.backends.cudnn.benchmark = True
torch.backends.cudnn.allow_tf32 = True
torch.backends.cuda.matmul.allow_tf32 = True
# os.environ["RWKV_V7_ON"] = '1' # 启用 RWKV-7 模型
os.environ["RWKV_JIT_ON"] = "1" # 启用 JIT 编译
os.environ["RWKV_CUDA_ON"] = "0" # 禁用 CUDA 自定义算子
```
在推理 RWKV-7 模型时,请务必将 `os.environ["RWKV_V7_ON"]` 设置为 `1` 。
如果将 `RWKV_CUDA_ON` 设为 `1`,需要安装 C++ 编译器和 CUDA Toolkit。编译失败时,请改回 `0`。
这里是一些加快推理速度的 torch 设置和操作环境的优化项。
### 2. 加载模型与设置参数
```python
from rwkv.model import RWKV # 从 RWKV 模型库中导入 RWKV 类,用于加载和操作 RWKV 模型。
from rwkv.utils import PIPELINE # 从 RWKV 工具库中导入 PIPELINE,用于数据的编码和解码
args = types.SimpleNamespace()
args.strategy = "cuda fp16" # 模型推理的设备和精度,使用 CUDA (GPU)并采用 FP16 精度
args.MODEL_NAME = "E://RWKV-Runner//models//rwkv-final-v6-2.1-1b6" # 指定 RWKV 模型的路径,建议写绝对路径
```
这一段引入了 RWKV 工具包中的两个工具类 RWKV 和 PIPELINE ,同时指定了加载 RWKV 模型的**设备**和**精度**,以及 RWKV 模型的本地文件路径。
`args.strategy` 会影响模型的生成效果和生成速度,`cuda fp16` 是最推荐的配置。
如果你显存不足,可以尝试 `cuda fp16i8`(Int8 量化)。更多配置选项请参考 [RWKV pip 库的推理精度与显存需求](#RWKV-pip-strategy-and-vram-requirements)。
```python
# STATE_NAME = None # 不使用 State
# 指定要加载的 State 文件路径。
STATE_NAME = "E://RWKV-Runner//models//rwkv-x060-eng_single_round_qa-1B6-20240516-ctx2048" # 指定要加载的自定义 State 文件路径。
```
这一段决定是否要加载一个 State 文件,`None` 表示不加载自定义 State,如需加载请填写 State 文件的绝对路径。
State 是 RWKV 这类 RNN 模型特有的状态。通过搭载自定义的 State 文件,可以强化 RWKV 模型在不同任务上的表现。(类似于增强插件)
RWKV State 的介绍和用法可以参照 [State 文件介绍和用法](https://rwkv.cn/news/read?id=343)文章。
```python
# 设置模型的解码参数
GEN_TEMP = 1.0
GEN_TOP_P = 0.3
GEN_alpha_presence = 0.5
GEN_alpha_frequency = 0.5
GEN_penalty_decay = 0.996
# 判断是否加载了一个 State 文件。如果指定了 State ,则调整生成参数,使回答的效果更好。
if STATE_NAME != None:
GEN_TOP_P = 0.2
GEN_alpha_presence = 0.3
GEN_alpha_frequency = 0.3
CHUNK_LEN = 256 # 对输入进行分块处理
```
这里主要是设置**加载或不加载** State 时, RWKV 模型分别使用哪些解码参数。
有关 RWKV 解码参数的含义和作用,请查看[RWKV 解码参数文档](../basic/RWKV-Parameters)。
指定一个自定义 State 文件后,我们希望模型能更好地遵循 State 中的格式和风格,所以**调低了 topp 参数和惩罚参数**。
`CHUNK_LEN` 将输入文本切分成指定大小的块。这个数值越大,模型**并行处理的文本越多**,但**使用的显存也更多**。在显存不足时建议调整到 128 或者 64。
### 3. 初始化和 prefill 阶段
```python
print(f"Loading model - {args.MODEL_NAME}")# 打印模型的加载消息
model = RWKV(model=args.MODEL_NAME, strategy=args.strategy) # 加载 RWKV 模型。
pipeline = PIPELINE(model, "rwkv_vocab_v20230424") # 初始化 PIPELINE ,使用 RWKV-World 词表处理输入和输出的编码/解码。
```
这一段开始使用前面设置的 **strategy** 和**解码参数**加载 RWKV 模型。
如果你希望模型加载完后也有提示,可以在这一段末尾插入:`print(f"{args.MODEL_NAME} - 模型加载完毕")`
```python
model_tokens = []
model_state = None
# 如果指定了 STATE_NAME,则加载自定义 State 文件,并初始化模型 State
if STATE_NAME != None:
args = model.args # 获取模型参数
state_raw = torch.load(STATE_NAME + '.pth') # 从指定的 State 文件中加载 State 数据
state_init = [None for i in range(args.n_layer * 3)] # 初始化状态列表
for i in range(args.n_layer): #开始循环,遍历每一层。
dd = model.strategy[i] # 获取模型每一层的加载策略
dev = dd.device # 获取每一层的加载设备(如 GPU)
atype = dd.atype # 获取每一层的数据类型(FP32/FP16 或 int8 等)
# 初始化模型的状态
state_init[i*3+0] = torch.zeros(args.n_embd, dtype=atype, requires_grad=False, device=dev).contiguous()
state_init[i*3+1] = state_raw[f'blocks.{i}.att.time_state'].transpose(1,2).to(dtype=torch.float, device=dev).requires_grad_(False).contiguous()
state_init[i*3+2] = torch.zeros(args.n_embd, dtype=atype, requires_grad=False, device=dev).contiguous()
model_state = copy.deepcopy(state_init) # 复制初始化的状态
```
这一段代码用于加载自定义的 State 文件,将其写入模型的初始化 State 中。
通常无需修改这部分代码。
```python
def run_rnn(ctx):
# 定义两个全局变量,用于更新 token 和模型状态(state)
global model_tokens, model_state
ctx = ctx.replace("\r\n", "\n") # 将文本中的 CRLF(Windows 系统的换行符)转换为 LF(Linux 系统的换行符)
tokens = pipeline.encode(ctx) # 基于 RWKV 模型的词汇表,将文本编码为 tokens
tokens = [int(x) for x in tokens] # 将 tokens 转换为整数(int)列表,确保类型一致性
model_tokens += tokens # 将 tokens 添加到全局的模型 token 列表中
while len(tokens) > 0: # 使用一个 while 循环执行模型前向传播,直到所有 tokens 处理完毕
out, model_state = model.forward(tokens[:CHUNK_LEN], model_state) # 模型前向传播,处理大小为 CHUNK_LEN 的 token 列表,并更新模型状态
tokens = tokens[CHUNK_LEN:] # 移除已处理的 tokens 块,并继续处理剩余的 tokens
return out # 返回模型的 prefill 结果
```
这是控制 RWKV 模型使用 RNN 模式进行 prefill 的函数,这个函数会将 ctx(前文)切成长度为 CHUNK\_LEN 的段落,一段段送入 RNN 处理,最后得到处理完前文后的 model\_state 和 out 。
这个函数接收一个 ctx 参数,通常是**文本**(string)。然后依次对文本和文本转化的 token 进行了几项处理:
1. 使用 `replace` 方法将文本的换行符统一为`\n` ,因为 RWKV 模型的训练数据集使用 `\n` 作为标准换行符格式。
2. 使用 `pipeline.encode` 方法,将用户的输入文本按照 RWKV-World 词表转换成对应的 token 。
3. 将 tokens 转换为整数(int)列表,确保类型一致性
4. 基于当前 token 前向传播,并行处理输入文本,更新模型状态并返回 out
注意,函数返回的 `out` 不是具体的 token 或文本,它返回的是模型对下一个 token 的原始预测(张量)。
要将 `out` 转换为实际的 token 或文本,需要通过采样(例如后文中的 `pipeline.sample_logits` 函数)预测下一个 **token** ,再从 token decode 成**文本**。
```python
# 如果没有加载自定义 State ,则使用初始提示进行对话
if STATE_NAME == None:
init_ctx = "User: hi" + "\n\n"
init_ctx += "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." + "\n\n"
run_rnn(init_ctx) # 运行 RNN 模式对初始提示文本进行 prefill
print(init_ctx, end="") # 打印初始化对话文本
```
如果未加载任何 State 文件,则使用一段**默认的对话文本**进行 prefill 。
### 4. 推理阶段
```python
# 从用户输入中读取消息、循环生成下一个 token
while True:
msg = prompt("User: ") # 从用户输入中读取消息,存到 msg 变量
msg = msg.strip() # 使用 strip 方法去除消息的首尾空格
msg = re.sub(r"\n+", "\n", msg) # 替换多个换行符为单个换行符
if len(msg) > 0: # 如果处理完后,用户输入的消息非空
occurrence = {} # 使用 occurrence 字典这个字典用于记录每个 token 在生成上下文中出现的次数,等会用在实现重复惩罚(Penalty)
out_tokens = [] # 使用 out_tokens 列表记录即将输出的 tokens
out_last = 0 # 用于记录上一次生成的 token 位置
out = run_rnn("User: " + msg + "\n\nAssistant:") # 将用户输入拼接成 RWKV 数据集的对话格式,进行 prefill
print("\nAssistant:", end="") # 打印 "Assistant:" 标签
for i in range(99999):
for n in occurrence:
out[n] -= GEN_alpha_presence + occurrence[n] * GEN_alpha_frequency # 应用存在惩罚和频率惩罚参数
out[0] -= 1e10 # 禁用 END_OF_TEXT
token = pipeline.sample_logits(out, temperature=GEN_TEMP, top_p=GEN_TOP_P) # 采样生成下一个 token
out, model_state = model.forward([token], model_state) # 模型前向传播
model_tokens += [token]
out_tokens += [token] # 将新生成的 token 添加到输出的 token 列表中
for xxx in occurrence:
occurrence[xxx] *= GEN_penalty_decay # 应用衰减重复惩罚
occurrence[token] = 1 + (occurrence[token] if token in occurrence else 0) # 更新 token 的出现次数
tmp = pipeline.decode(out_tokens[out_last:]) # 将最新生成的 token 解码成文本
if ("\ufffd" not in tmp) and (not tmp.endswith("\n")): # 当生成的文本是有效 UTF-8 字符串且不以换行符结尾时
print(tmp, end="", flush=True) #实时打印解码得到的文本
out_last = i + 1 #更新输出位置变量 out_last
if "\n\n" in tmp: # 如果生成的文本包含双换行符,表示模型的响应已结束(可以将 \n\n 改成其他停止词)
print(tmp, end="", flush=True) # 实时打印解码得到的文本
break #结束本轮推理
else:
print("!!! Error: please say something !!!") # 如果用户没有输入消息,提示“输入错误,说点啥吧!”
```
**这一段是循环检测用户输入、并使用 RNN 模式进行推理,生成文本的功能代码。**
以上代码的主要逻辑如下:
1. 接收用户消息,规范空格空行,判断输入文本的内容长度
* 如果规范后用户输入为空,则提示“请说点什么”
* 如果规范后用户的输入非空,则进入步骤 2
2. 将用户的输入拼接成聊天格式的 prompt ,然后进行 prefill ,获得 logits
3. 预测 token ,并打印解码得到的文本字符
* 应用存在惩罚(GEN\_alpha\_presence)和频率惩罚(GEN\_alpha\_frequency)
* 基于 temperature 和 topp 参数对 `out` 进行采样,获得下一个 token
* 使用新 token 前向传播,开启下一轮预测
* 应用惩罚衰减参数(penalty\_decay)调整 token 生成的概率
* 把已经生成的 token 列表解码(decode)成字符文本
* 实时输出解码得到的字符文本,判断文本里面有没有 \n\n 停止词。如果出现停止词,则退出本轮推理。
从推理过程可以看出,模型在每个时间步都更新隐藏状态(State),并利用当前的隐藏状态来生成下一个时间步的输出。这符合 RNN 的核心特性: **模型的每次输出依赖于前一步的生成结果**。
## RWKV-4/5/6 的推理精度与显存需求
下表适用于 RWKV-4/5/6,不适用于 RWKV-7。
下表中 ,`fp16i8` 指在 fp16 精度基础上进行 int8 量化。
量化可以减少 VRAM 需求,但在精度上略逊于 fp16。因此只要 VRAM 够用,尽量使用 fp16 层。
| 策略 | VRAM & RAM | 说明 |
| ----------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **cpu fp32** | 7B 模型需要 32GB 内存 | 使用 CPU fp32 精度加载模型,适合 Intel。对 AMD 非常慢,因为 pytorch 的 cpu gemv 在 AMD 上有问题,并且只会运行在一个单核上。 |
| **cpu bf16** | 7B 模型需要 16GB 内存 | 使用 CPU bf16 精度加载模型。在支持 bfloat16 的新 Intel CPU(如 Xeon Platinum)上速度较快。 |
| **cpu fp32i8** | 7B 模型需要 12GB 内存 | 使用 CPU int8 量化精度加载模型。速度较慢(比 cpu fp32 更慢)。 |
| **cuda fp16** | 7B 模型需要 15GB VRAM | 使用 fp16 精度加载模型所有层,速度最快,但对显存(VRAM)的需求也最高。 |
| **cuda fp16i8** | 7B 模型需要 9GB VRAM | 使用 int8 量化模型所有层,速度较快。如果设置 `os.environ["RWKV_CUDA_ON"] = '1'` 来编译 CUDA 内核,可减少 1\~2GB VRAM 使用。 |
| **cuda fp16i8 \*20 -> cuda fp16** | VRAM 占用介于 fp16 和 fp16i8 之间 | 前 20 层使用 fp16i8,其余层使用 fp16。
VRAM 不足时增加 fp16i8 层数;VRAM 有余时减少 fp16i8 层数。 |
| **cuda fp16i8 \*20+** | 比 fp16i8 使用更少 VRAM | 前 20 层使用 fp16i8 并固定在 GPU,其他层按需加载。未固定层的加载速度约慢 3 倍,但可以节省 VRAM。
VRAM 不足时减少固定层数;VRAM 有余时增加固定层数。 |
| **cuda fp16i8 \*20 -> cpu fp32** | 比 fp16i8 使用更少 VRAM,但消耗更多内存 | 前 20 层使用 fp16i8 并固定在 GPU,其他层使用 CPU fp32。CPU 性能较强时,这种方式可能比仅在 GPU 固定部分层更快。
VRAM 不足时减少 GPU 层数;VRAM 有余时增加 GPU 层数。 |
| **cuda:0 fp16 \*20 -> cuda:1 fp16** | 使用双卡驱动模型 | GPU 0 加载前 20 层,GPU 1 加载其余层。
优先让速度更快的 GPU 运行更多层;单卡显存不足时可将 fp16 改为 fp16i8。 |
# RWKV 中级教程
import { CardContainer } from 'components-docs/card/card-container.tsx'
import { Card } from 'components-docs/card/card.tsx'
import { Zap, Code2, Terminal, Bot, Cpu, Cloud, Globe2, MessageSquare, GamepadIcon } from "lucide-react";
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV 的中级教程包含 RWKV 的各种**本地部署方法和推理教程**。
## RWKV 模型本地部署工具
**RWKV-FLA** 适合进行 RWKV 算子实验和已有 `fla-hub` 模型推理。目前其 RWKV-7 实现尚未与官方参考实现完全对齐。需要训练正式的 RWKV-7 模型时,请使用 RWKV-LM 的 `train_temp`。
**Albatross** 面向 NVIDIA GPU 的 RWKV-7 高吞吐并行推理。**rwkv\_lightning** 在此基础上提供批量推理和 HTTP API。二者都需要自行配置运行环境,适合希望开发或部署推理服务的用户。
**RWKVpip 库**是 RWKV 官方 pip 包,代码开源易用,可用于开发各种 RWKV 应用。
**RWKV Runner** 和 **Ai00** 是 RWKV 社区开发的 RWKV 模型本地运行软件包,无需任何代码基础即可实现 RWKV 模型的本地部署。
## 其他开源模型推理工具
RWKV 模型也适配了其他热门的开源模型部署和推理工具:
# llama.cpp 推理教程
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
[llama.cpp](https://github.com/ggml-org/llama.cpp) 是一个轻量化的大语言模型运行框架,支持在 CPU 和多种 GPU 后端上运行 GGUF 模型。
llama.cpp 目前支持 RWKV-6 和 RWKV-7 的 GGUF 模型,RWKV 社区成员 [@MollySophia](https://github.com/MollySophia) 是相关适配的主要贡献者。
本章节介绍如何在 llama.cpp 中使用 RWKV 模型进行推理。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1hgcdeqEW8/)观看。
## llama.cpp 推理 RWKV 模型
### 获取 llama.cpp
如果只想尽快开始,推荐访问 [llama.app](https://llama.app/),按照页面提示完成安装。如果需要自行选择运行后端或使用独立的命令行程序,再从 [llama.cpp 的 release 页面](https://github.com/ggml-org/llama.cpp/releases)下载已经编译好的程序。
打开 release 页面后,先根据下表选择适合当前设备的后端。压缩包名称可能随版本变化,不必寻找固定文件名。
| 设备 | 可选后端 |
| ------------- | ------------------------ |
| NVIDIA GPU | CUDA |
| AMD GPU | ROCm / Vulkan |
| Intel GPU | SYCL / Vulkan / OpenVINO |
| Apple Silicon | Metal |
| 仅使用 CPU | CPU |
也可以参照 [llama.cpp 官方构建文档](https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md),选择适合的方法本地编译构建。
当前版本提供统一的 `llama` 命令。本页按下表调用不同功能:
| 功能 | 本页使用的命令 | 等价的独立程序 |
| ------ | ------------------ | ------------------ |
| 对话 | `llama cli` | `llama-cli` |
| Web 服务 | `llama serve` | `llama-server` |
| 原始文本续写 | `llama completion` | `llama-completion` |
| 模型量化 | `llama quantize` | `llama-quantize` |
使用 release 压缩包时,请先进入解压目录;自行编译时,请进入 `build/bin` 目录。Windows PowerShell 将表中的 `llama` 写成 `.\llama.exe`,例如 `.\llama.exe cli`;Linux 和 macOS 写成 `./llama`,例如 `./llama cli`。
### 获取 gguf 格式模型
llama.cpp 使用 `.gguf` 格式的模型。运行当前公开模型时,建议直接下载已经转换好的 GGUF;如果需要运行自己的 `.pth` 模型或微调检查点,再手动转换格式。
可以从 [RWKV7-Gxx-GGUF 合集](https://huggingface.co/collections/shoumenchougou/rwkv7-gxx-gguf) 下载当前的 RWKV-7 G 系列 GGUF 模型。
下文的命令使用 `-hf` 参数,llama.cpp 会自动下载并缓存模型,不需要提前创建 `models` 文件夹。
如果希望手动管理模型文件,请在 llama.cpp 目录下新建 `models` 文件夹,再将下载的 GGUF 模型放入其中。
量化位数越低,模型占用通常越小,但生成质量也更容易受到影响。第一次下载时,可以按模型大小选择:
* 0.1B 和 0.4B:优先使用 FP16 或 `Q8_0`
* 1.5B 及以上:可以先使用 `Q5_K_M`。内存或显存充足时,再选择 `Q6_K`、`Q8_0` 或 FP16
1. 首先,从 [Hugging Face](https://huggingface.co/BlinkDL) 或[魔搭平台](https://modelscope.cn/organization/RWKV?tab=model)(国内可访问)下载一个 `pth` 格式的 RWKV 模型
2. 从 [MollySophia/rwkv-mobile 仓库](https://github.com/MollySophia/rwkv-mobile/blob/master/converter/convert_rwkv_pth_to_gguf.py) 下载 RWKV 专用的社区转换脚本 `convert_rwkv_pth_to_gguf.py`
3. 下载 RWKV 分词表[rwkv\_vocab\_v20230424.txt](https://github.com/MollySophia/rwkv-mobile/blob/master/assets/rwkv_vocab_v20230424.txt),确保分词器和转换脚本放在同一目录下
4. 运行 `pip install torch gguf` 命令,安装转换脚本所需的依赖项
5. 在转换脚本目录下运行以下命令,将 `pth` 格式的模型转换为 `gguf` 格式的模型
```bash
python convert_rwkv_pth_to_gguf.py [pth模型文件路径] rwkv_vocab_v20230424.txt
```
请将上述命令中的 `[pth模型文件路径]`改成你的 pth 格式 RWKV 模型路径。
### 运行 RWKV 模型进行对话
在 llama.cpp 目录运行以下命令,可以开启 llama.cpp 的命令行**对话模式**:
```bash
llama cli -hf shoumenchougou/RWKV7-G1i-1.5B-GGUF:Q5_K_M
```
这条命令会从 Hugging Face 下载并运行 RWKV7-G1i 1.5B 的 `Q5_K_M` 模型。模型文件已经包含聊天模板,因此运行后会直接进入对话模式。以后再次运行时,llama.cpp 会复用本地缓存中的模型文件,不必重新下载。
**参数解释:**
* `llama cli`:启动 llama.cpp 的命令行对话程序
* `-hf shoumenchougou/RWKV7-G1i-1.5B-GGUF:Q5_K_M`:指定 Hugging Face 模型仓库和量化类型,并在缺少模型时自动下载
当前版本会自动选择模型的加载方式。如果需要明确让 llama.cpp 尽可能使用 GPU,可以追加 `-ngl all`。
完整用法可以在 [llama.cpp 的 `llama-cli` 文档](https://github.com/ggml-org/llama.cpp/blob/master/tools/cli/README.md)中查看。
## 附加功能(可选)
### 启用续写模式
需要按完整 prompt 原样续写时,请使用 `llama completion`,并添加 `-no-cnv` 关闭聊天模板。否则,带聊天模板的模型会自动进入对话模式。
```bash
llama completion -hf shoumenchougou/RWKV7-G1i-1.5B-GGUF:Q5_K_M -p "User: 用中文解释什么是 MBTI。\n\nAssistant:
* `-p`:将引号中的完整 prompt 原样交给模型续写
* `llama completion`:启动原始文本续写程序
* `-no-cnv`:关闭聊天模式,不使用模型内置模板补全 prompt
* 其他参数:与对话模式相同
示例末尾的 `Assistant:
### 量化 gguf 模型
使用 `llama quantize [input_model] [output_model] [quantization_type]`,可以对 FP32、BF16 或 FP16 的高精度 GGUF 模型进行量化,例如:
```bash
llama quantize models/input-FP16.gguf models/output-Q5_K_M.gguf Q5_K_M
```
请将示例中的输入、输出文件名替换成实际路径。
输入文件应当是 FP32、BF16 或 FP16 模型。不要对已经量化的模型再次量化,这样做可能严重降低生成质量。
使用 `llama quantize --help` 命令,查看当前版本支持的量化类型:
{/*
## 搭载 RWKV State 文件[#state-file]
State 是 RWKV 这类 RNN 模型特有的状态。通过搭载自定义的 State 文件,可以强化 RWKV 模型在不同任务上的表现。(类似于增强插件)
RWKV State 的介绍可参照 [State 文件介绍和用法](https://rwkv.cn/news/read?id=343)文章。
遵循以下步骤,可在 llama.cpp 推理 RWKV 模型时搭载 State 文件:
### 下载 .pth 格式 State 文件
从以下链接下载 `.pth` 格式的 RWKV State 文件:
- [RWKV-6-World-v2.1/RWKV-6-ChnNovel 模型的 State 文件](https://hf-mirror.com/BlinkDL/temp-latest-training-models/tree/main/states)
- [RWKV-6-World-v3 模型的 State 文件](https://hf-mirror.com/BlinkDL/rwkv-6-misc/tree/main/states)
### 使用脚本转换 State 文件
由于 llama.cpp for RWKV 只接受 `.bin` 格式的 State 文件,因此我们需要使用附录中的 [convert_rwkv_state_to_llamacpp.py 脚本](#state-pthtobin),将 `.pth` 格式的 State 文件转换为 `.bin` 格式。
在脚本目录,运行以下转换命令:
```bash copy
python convert_rwkv_state_to_llamacpp.py rwkv-x060-chn_single_round_qa-3B-20240516-ctx2048.pth rwkv-x060-chn_single_round_qa-3B-20240516-ctx2048-llamacpp.bin
```
参数解释:
- `rwkv-x060-chn_single_round_qa-3B-20240516-ctx2048.pth`:需要转换的 `.pth` State 文件路径
- `rwkv-x060-chn_single_round_qa-3B-20240516-ctx2048-llamacpp.bin`:转换后的 `.bin` State 文件路径
### 推理时搭载 State 文件
在 llama.cpp 推理 RWKV 模型时,添加额外的`-prompt-cache` 和 `--prompt-cache-ro` 参数,以搭载 RWKV State :
``` bash copy
./llama-cli -m models/rwkv-6-world-7b-Q8_0.gguf -p "how can a pig fly?" -t 8 -ngl 99 -n 500 --prompt-cache rwkv-6-7b-v3-enQA-llamacpp.bin --prompt-cache-ro
```
参数解释:
- `--prompt-cache` :加载 prompt cache 文件 ,填写 State 文件路径,如 `rwkv-x060-chn_single_round_qa-3B-20240516-ctx2048-llamacpp.bin`
- `--prompt-cache-ro` : 以只读方模式加载,生成时不要覆盖原 State 文件
## 附录代码[#appendix-code]
### `pth` 转 `gguf` 格式[#pthtogguf]
### `.pth` State 文件转成 `.bin`[#state-pthtobin]
以下代码可将 RWKV 官方发布的`.pth` State 文件,转换为 llama.cpp 可使用的 `.bin`格式 State 文件:
``` python copy filename="convert_rwkv_state_to_llamacpp.py"
import torch
import argparse
import struct
import array
from pathlib import Path
def convert_rwkv_state_to_llamacpp_cache(path_input, path_output):
state = torch.load(path_input, map_location='cpu')
n_head, head_size, _ = state['blocks.0.att.time_state'].shape
n_embd = n_head * head_size
n_layer = len(state.keys())
print(f'n_layer: {n_layer}, n_embd: {n_embd}')
LLAMA_SESSION_MAGIC = 0x6767736e
LLAMA_SESSION_VERSION = 9
with open(path_output, 'wb') as file:
# magic, version, n_token_count
file.write(struct.pack('3I', LLAMA_SESSION_MAGIC, LLAMA_SESSION_VERSION, 0))
# model arch
file.write(struct.pack('I5s', 5, b'rwkv6'))
# session output ids, logits, embeddings (skip)
file.write(struct.pack('=IQQ', 0, 0, 0))
# cell_count, pos, n_seq_id, v_trans, n_layer
file.write(struct.pack('=5I', 1, 0, 0, 0, n_layer))
for _ in range(n_layer):
# k_type = GGML_TYPE_F32, k_size = 2 * n_embd * sizeof(float)
file.write(struct.pack('=iq', 0, 2 * n_embd * 4))
for _ in range(2*n_embd):
file.write(struct.pack('=f', 0.0))
for i in range(n_layer):
# v_type = GGML_TYPE_F32, v_size = n_head * head_size * head_size * sizeof(float)
file.write(struct.pack('=iq', 0, n_head * head_size * head_size * 4))
data = state[f'blocks.{i}.att.time_state'].float().transpose(1, 2).flatten().tolist()
file.write(struct.pack(f'{n_head * head_size * head_size}f', *data))
def main():
parser = argparse.ArgumentParser(description='Convert RWKV state to llama.cpp prompt cache')
parser.add_argument('input', type=Path, help='Path to RWKV state')
parser.add_argument('output', type=Path, help='File name for llama.cpp prompt cache')
args = parser.parse_args()
convert_rwkv_state_to_llamacpp_cache(args.input, args.output)
if __name__ == '__main__':
main()
```
*/}
# rwkv_lightning 批量推理教程
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { ApiReference, ApiSchemaSection, ApiField } from 'components-docs/api-reference/api-reference.tsx'
rwkv\_lightning 是基于 [Albatross](https://github.com/BlinkDL/Albatross)、PyTorch 和 FastAPI 的 RWKV 批量推理后端。它原生支持 NVIDIA CUDA 与 AMD ROCm,并提供批量补全、OpenAI 风格聊天、State Cache、FIM 等 HTTP API。
实测在单张 RTX 5090 上进行 960 路并发推理时,吞吐量可以达到 10000+ token/s。
* 项目地址:[RWKV-Vibe/rwkv\_lightning](https://github.com/RWKV-Vibe/rwkv_lightning)
* 上游 API 文档:[rwkv\_lightning\_api\_doc.md](https://github.com/Alic-Li/rwkv_lightning_cuda/blob/main/rwkv_lightning_api_doc.md)
## 安装依赖
先克隆仓库并进入项目目录,再按显卡平台安装 PyTorch 和服务依赖。
```bash
git clone https://github.com/RWKV-Vibe/rwkv_lightning.git
cd rwkv_lightning
```
```bash
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu132
pip install fastapi pydantic ninja numpy
```
```bash
pip install torch torchvision --index-url https://download.pytorch.org/whl/rocm7.2
pip install fastapi pydantic ninja numpy
```
## 启动服务
先选择与模型文件相匹配的推理引擎。普通 `.pth` 模型使用 FP16;GemLite 与 CUTLASS 需要先按上游仓库中的量化说明转换模型,二者的模型文件不能混用。
```bash
python app.py \
--model-path /path/to/model \
--inference-engine fp16 \
--port 8000 \
--password rwkv7_7.2b
```
```bash
python app.py \
--model-path /path/to/model-gemlite-int8 \
--inference-engine gemlite \
--port 8000 \
--password rwkv7_7.2b
```
```bash
python app.py \
--model-path /path/to/model-w8a16 \
--inference-engine cutlass \
--port 8000 \
--password rwkv7_7.2b
```
| 参数 | 是否必需 | 默认值 | 说明 |
| ---------------------------------- | ---- | ------ | ------------------------------- |
| `--model-path` | 是 | 无 | 模型路径,可以带或不带 `.pth` 后缀 |
| `--inference-engine` / `--backend` | 否 | `fp16` | 可选 `fp16`、`gemlite` 或 `cutlass` |
| `--port` | 否 | `8000` | HTTP 服务端口 |
| `--password` | 否 | 不启用 | API 密码;省略后不校验密码 |
服务固定监听 `0.0.0.0`。终端出现 Uvicorn 启动信息后,可以运行仓库自带的测试脚本:
```bash
bash ./test/test_curl.sh
```
如果服务需要暴露到公网,请启用密码并在反向代理或防火墙中限制访问。`/v1/models` 与 `/translate/v1/batch-translate` 当前不校验服务密码,不能只依赖应用层鉴权保护这两个端点。
## API 文档
默认地址为 `http://127.0.0.1:8000`。所有 POST 请求都需要发送 `Content-Type: application/json`。普通端点通过请求主体中的 `password` 鉴权;`/openai/v1/*` 还支持 `Authorization: Bearer `。
### 端点速览
| 方法 | 路径 | 用途 | 流式响应 |
| ------ | ------------------------------- | ---------------- | ---- |
| `GET` | `/v1/models` | 查询当前加载的模型 | 否 |
| `POST` | `/v1/chat/completions` | 原生多 prompt 批量补全 | 可选 |
| `POST` | `/v2/chat/completions` | 使用 V2 采样器批量补全 | 可选 |
| `POST` | `/translate/v1/batch-translate` | 批量翻译 | 否 |
| `POST` | `/FIM/v1/batch-FIM` | FIM 批量补全 | 可选 |
| `POST` | `/big_batch/completions` | 超大 batch 补全 | 始终流式 |
| `POST` | `/state/chat/completions` | 单分支 State 会话补全 | 可选 |
| `POST` | `/multi_state/chat/completions` | 可分叉的 State 会话补全 | 可选 |
| `POST` | `/state/status` | 查询三级 State Cache | 否 |
| `POST` | `/state/delete` | 删除 State Cache | 否 |
| `GET` | `/openai/v1/models` | OpenAI 风格模型列表 | 否 |
| `POST` | `/openai/v1/chat/completions` | OpenAI 风格单路聊天补全 | 可选 |
### 原生生成参数
下表适用于原生补全、State、FIM 等端点;专用端点只会读取与自身有关的字段。
| 字段 | 类型 | 默认值 | 说明 |
| ----------------- | -------------- | ------------- | ---------------------------- |
| `model` | string | `rwkv7` | 仅作为响应标签,不会切换已经加载的模型 |
| `contents` | string\[] | `[]` | prompt 数组 |
| `max_tokens` | integer | `8192` | 每条结果最多生成的 token 数 |
| `stop_tokens` | string\[] | `["\nUser:"]` | 文本停止序列;不是整数 token ID |
| `temperature` | number | `1.0` | 采样温度 |
| `top_k` | integer | `50` | Top-K |
| `top_p` | number | `0.6` | Top-P |
| `alpha_presence` | number | `2.0` | Presence repetition penalty |
| `alpha_frequency` | number | `0.2` | Frequency repetition penalty |
| `alpha_decay` | number | `0.996` | 重复惩罚衰减 |
| `stream` | boolean | `false` | 是否返回 SSE |
| `chunk_size` | integer | `4` | 流式输出累计多少 token 后刷新一次 |
| `password` | string \| null | `null` | 普通端点的 JSON 鉴权凭据 |
### 查询模型
### 原生 V1 批量补全
### 原生 V2 批量补全
### 批量翻译
### FIM 批量补全
`prefix` 与 `suffix` 当前通过 `zip` 配对,长度不一致时多出的元素会被忽略。FIM 路由固定使用空停止序列,因此请求中的 `stop_tokens` 不生效。
### 超大 batch 补全
### 单分支 State 会话
不要并发写入同一个 `session_id`。首次请求会创建零 State,后续请求会读取并更新同一 State;复用已有 State 时,服务会在没有前导空行的 prompt 前自动补上两个换行。
### 可分叉的 State 会话
非零 `dialogue_idx` 必须已经存在,否则返回 `404`。若要从旧节点分叉,继续传入该旧节点的编号;服务会为新回复分配另一个编号,并将 State 保存为 `:`。
### 查询 State Cache
### 删除 State Cache
### OpenAI 风格模型列表
### OpenAI 风格聊天补全
当前 OpenAI 风格端点只处理文本形式的 `system`、`developer`、`user` 与 `assistant` 消息,不支持图片、音频、工具调用或结构化输出。`use_prefix_cache` 是自动复用匹配的 prompt 前缀,与显式 `session_id` 的 State 会话不同。
### 流式响应与常见错误
原生 V1、V2、State、FIM 和 big-batch 使用项目自有的轻量 SSE 格式;只有 `/openai/v1/chat/completions` 返回 OpenAI 风格的 ID、role chunk 和结束原因。两种流式响应都以 `data: [DONE]` 结束。
| HTTP 状态码 | 常见原因 |
| -------- | ----------------------------------------------------------------- |
| `400` | 请求 batch 超过 prefill 上限、缺少 `session_id` / `dialogue_idx`,或 JSON 无效 |
| `401` | 服务启用了密码,但凭据缺失或错误 |
| `404` | State 或对话分支不存在 |
| `422` | FastAPI / Pydantic 字段校验失败 |
| `499` | 非流式请求完成前客户端已经断开连接 |
| `500` | 推理或服务内部错误 |
客户端断开连接后,服务会取消排队或正在运行的生成。流式请求在 prefill 队列阶段超出 batch 上限时,错误也可能以 SSE `data:` 事件返回。
## 鸣谢
感谢 [Triang-jyed-driung](https://github.com/Triang-jyed-driung) 提供的 [Rapid-Sampling](https://github.com/Triang-jyed-driung/Rapid-Sampling) 内核,它还包含兼容 ROCm 的原生 HIP 内核。
# 准备微调数据
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
遵循以下步骤,整理你的训练数据集。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1Kn9gYUEWY)观看。
## 整理 jsonl 数据
首先确认**你希望 RWKV 模型学习哪些知识**。这里的知识可以是某一领域的资料,比如法律问答、金融知识等;也可以是某类任务的文本,如材料总结、角色扮演等。
总而言之,你需要根据具体的任务需求,收集对应的数据,并将其整理为 `jsonl` 格式的文件。
下面是不同内容类型/任务类型的 `jsonl` 格式参考:
### 单轮问答
单轮问答通常用于训练聊天机器人等下游任务,数据格式为:
```jsonl copy
{"text": "User: 问题\n\nAssistant: 答案"}
```
一个单轮问答的例子:
```jsonl copy filename="single-qa.jsonl"
{"text": "User: 水是什么?\n\nAssistant: 水是一种无色、无味、无臭的液体,是地球上最常见的物质之一。"}
```
在这个例子中,`User: ` 后面的内容通常是人类给模型的输入,而 `Assistant: ` 后面的内容则是模型给出的答案。
除了 `User` 和 `Assistant` 之外,还可以添加 `System` 角色,以提供背景设定,或强化模型对 `Assistant:` 的角色认知。
```jsonl copy filename="qa-with-system.jsonl"
{"text": "System: 你是一位精通广东历史和地理的优秀导游。\n\nUser: 导游,广东的省会是什么呀?\n\nAssistant: 广东的省会是广州,广州拥有非常悠久的历史。"}
{"text": "System: 此时是三国时期,天下大乱,群雄割据。你是一名与张飞对战的小兵\n\nUser: 小子,吃我张飞一刀!\n\nAssistant: 张飞大哥饶命啊!"}
```
`System` 角色同样适用于下文的多轮对话数据。
### 多轮对话
多轮对话数据适合连续对话和上下文理解的任务场景,如**客服机器人**和**角色扮演**。
多轮对话数据格式为:
```jsonl copy
{"text": "User: 问题一\n\nAssistant: 答案一\n\nUser: 问题二\n\nAssistant: 答案二"}
```
一个多轮对话的例子:
```jsonl copy filename="multi-qa.jsonl"
{"text": "User: 晚上好啊\n很高兴见到你!\n\nAssistant: 晚上好!\n我也很高兴见到你!\n\nUser: 我今年十岁了\n你今年几岁?\n\nAssistant: 我今年五岁。"}
```
注意,`User:` 和 `Assistant:` 之间需要用 `\n\n` 隔开。但对话内容中的换行只能使用 `\n` 表示。
### 指令问答
指令问答数据适合**信息提取**、**材料总结**、**会议纪要**等总结性任务,同时也是指令微调(Instruction Tuning)的推荐格式。
```jsonl copy
{"text": "Instruction: 指令\n\nInput: 内容\n\nResponse: 答案"}
```
其中,`Instruction` 是给模型的指令,`Input` 是给模型的内容输入,`Response` 是模型给出的答案。
注意:`Instruction:` 、 `Input:` 和 `Response:` 和文本内容之间要插入一个英文空格。
此外,`Instruction:` 、 `Input:` 和 `Response:` 之间需要用 `\n\n` 隔开。但对话内容中的换行只能使用 `\n` 表示。
一个指令问答的例子:
```jsonl copy filename="instruction-qa.jsonl"
{ "text": "Instruction: 请判断下面的句子属于哪个类别,类别包括文化、娱乐、体育、财经、房产、汽车、教育、科技、军事、旅游、国际、证券、农业、电竞、民生。请直接输出类别,不要额外输出多余内容。\n\nInput: RWKV大模型正式推出第七代架构RWKV-7。\n\nResponse: 科技"}
```
`Instruction: ` 和 `Input: ` 的内容会被拼接并作为模型的输入,`Response: ` 的内容则是模型给出的答案。
在这个例子中,模型会接收如下输入:
```text copy
请判断下面的句子属于哪个类别,类别包括文化、娱乐、体育、财经、房产、汽车、教育、科技、军事、旅游、国际、证券、农业、电竞、民生。请直接输出类别,不要额外输出多余内容。
RWKV大模型正式推出第七代架构RWKV-7。
```
模型会给出如下输出:
```text copy
科技
```
### 文章/小说等长文数据
文章、小说等长文本数据,通常用于训练**文本续写**、**文本扩写**等连贯的长文本生成任务。
对于整本小说、超长文章等长文本内容,数据格式为:
```jsonl copy
{"text": "将每篇文章的内容变成 JSONL 的一行,即使是一百万字的小说也变成一行。"}
```
对于新闻、通告等**带标题**的短篇内容,数据格式为:
```jsonl copy
{"text": "《标题》\n正文内容"}
```
对于小说、文章的**单段落续写**任务,数据格式为:
```jsonl copy
{"text": "User: 约 100 字的段落开头\n\nAssistant: 段落的后续文本"}
```
对于从小说大纲扩写小说段落的任务,数据格式为:
```jsonl copy
{"text": "User: 章节的大纲\n\nAssistant: 章节的完整内容"}
```
## 训练数据的更多细节
### 微调需要多少数据
微调训练数据的数量并没有严格规范,可以是几百条,也可以是几千条,甚至更多。
通常是**数据量越多,微调训练的效果越好**。但优质数据需要大量的时间和人力成本,因此需要根据实际情况进行调整:
* 根据微调任务复杂度调整:简单的分类或总结任务,可能只需要几百条数据。复杂的角色扮演或文本生成任务,需要几千条或更多数据。
* 质量比数量更重要:高质量的数据应准确反映目标任务的特征,并涵盖多样的场景和表达方式。
训练数据的调整是一个逐步迭代的过程,通常需要经历以下步骤:
直到获得满意的微调效果。
### 复制并随机排序数据
复制训练数据不会增加数据多样性,只会提高这些样本在训练中的出现频率。只有在确实需要提高某类样本权重时,才建议复制;随机排序只会改变样本顺序,不能替代补充高质量、多样化的数据。
在 GNU/Linux 或 WSL 环境中,使用以下命令对数据文件进行重复和打乱:
```bash copy
# 将 data.jsonl 文件重复三次,并将所有行输出到 repeated-data.jsonl 文件中
# 此命令也可用于合并多个 jsonl 数据文件
awk 'NF > 0 {print}' data.jsonl data.jsonl data.jsonl | head -c -1 > repeated-data.jsonl
# 将 repeated-data.jsonl 文件的所有行随机打乱,并将结果输出到 shuffled-data.jsonl 文件中
sort -R repeated-data.jsonl | head -c -1 > shuffled-data.jsonl
```
`data.jsonl` 需要改成你准备好的 jsonl 数据文件名称。
Windows 系统可以通过 [WSL](https://docs.microsoft.com/zh-cn/windows/wsl/install) (Windows Subsystem for Linux) 或安装 [Cygwin](https://www.cygwin.com/) 工具,以使用 `awk` 和 `sort` 命令。
### 添加常规数据
建议在微调数据集中添加一些常规数据,添加常规数据有助于增强模型泛化能力,同时可以降低过拟合的风险。
假设我们正在微调一个用于解答初阶数学问题的模型,数据样本类似这样:
```jsonl copy
{"text": "User: 1 + 1 = ?\n\nAssistant: 2"}
{"text": "User: 1 + 2 = ?\n\nAssistant: 3"}
{"text": "User: 1 + 3 = ?\n\nAssistant: 4"}
```
此时,我们可以在数据集中添加一些其他表达形式的数学问题,以及非数学领域的常规对话数据,比如:
```jsonl copy
{"text": "User: 1 + 1 = ?\n\nAssistant: 2"}
{"text": "User: 我有 5 个苹果,送小明 2 个,还剩多少?\n\nAssistant: 3 个"}
{"text": "User: 8 和 7 相加是多少?\n\nAssistant: 15"}
{"text": "User: 长方形的面积是 20 平方米,宽是 4 米,那么它的长度是多少?\n\nAssistant: 长度是 5 米。"}
{"text": "User: 今天天气怎么样?\n\nAssistant: 今天天气晴朗,适合外出游玩。"}
{"text": "User: 1 + 2 = ?\n\nAssistant: 3"}
```
## 将 jsonl 文件转化为 binidx 文件
RWKV-PEFT 可以直接读取 `jsonl` 数据,也支持 `binidx`。如果训练脚本设置为 `--data_type binidx`,需要使用 [json2binidx](https://github.com/Abel2076/json2binidx_tool) 工具,将 `jsonl` 文件转换成 `binidx` 文件。
### 下载 json2binidx 工具
克隆仓库
```bash copy
git clone https://github.com/Abel2076/json2binidx_tool.git
```
或直接[下载压缩包](https://github.com/Abel2076/json2binidx_tool/archive/refs/heads/main.zip)并解压。
如果 GitHub 无法链接,请使用以下国内仓库:
```bash copy
git clone https://gitee.com/rwkv-vibe/json2binidx_tool.git
```
得到 `json2binidx_tool` 文件夹后,使用 `cd json2binidx_tool` 命令进入 `json2binidx_tool` 目录。
### jsonl 文件转 binidx 文件
将准备好的 `jsonl` 数据集文件放在 `json2binidx_tool/data` 文件夹中。
在 `json2binidx_tool` 目录下运行以下命令,可以将 `data` 文件夹中的 `jsonl` 文件转成 `binidx` 文件 :
```bash copy
python3 tools/preprocess_data.py --input ./data/sample.jsonl --output-prefix ./data/sample --vocab ./rwkv_vocab_v20230424.txt --dataset-impl mmap --tokenizer-type RWKVTokenizer --append-eod
```
这条命令有两个需要修改的参数:
```bash copy
--input ./data/sample.jsonl # 输入 jsonl 文件的路径,需要改成你准备好的 jsonl 文件名
--output-prefix ./data/sample # 输出的 bin / idx 文件路径,需要改成你想要的文件名
```
以上述参数为例,工具会生成 `./data/sample_text_document.bin` 和 `./data/sample_text_document.idx`。在训练配置中,`data_file` 应填写 `./data/sample_text_document`,不需要添加扩展名。
出现以下提示,意味着转换已经完成:
你应该能在 `data `文件夹中找到转换完成的 bin / idx 文件:
此时我们的准备工作已经结束了,接下来需要**选择一种微调方法**,并阅读对应的文档。
# 微调环境配置
import { CallOut } from 'components-docs/call-out/call-out.tsx'
要训练 RWKV 模型,请先遵循以下步骤,为你的 Linux 系统配置训练环境。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1opwheLE9b)观看。
## 安装 CUDA Toolkit
请参考 [**CUDA Toolkit 安装文档**](https://developer.nvidia.com/cuda-downloads),根据您的操作系统安装 CUDA Toolkit。
以下是 Ubuntu 24.04 x86\_64 的安装示例:
```bash
# 下载 CUDA 仓库的 GPG 密钥包
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
# 安装 GPG 密钥包,使系统信任 NVIDIA 的软件仓库
sudo dpkg -i cuda-keyring_1.1-1_all.deb
# 更新 apt 软件包列表,更新 NVIDIA CUDA 软件源
sudo apt-get update
# 安装 CUDA Toolkit 13.0(包含 nvcc 编译器、开发库、工具链等)
sudo apt-get -y install cuda-toolkit-13-0
```
## 配置 Conda 虚拟环境
本教程使用 Conda 管理 Python 环境。此处以 Miniconda 为例,介绍如何配置 Linux 系统的 Conda 环境。
在你的 Linux 或 WSL 工作区,依次运行以下命令:
```bash copy
# 下载最新的 MiniConda 安装包
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 运行 MiniConda 安装包的安装脚本,安装期间一定要注意进展,及时输入 yes !
sh Miniconda3-latest-Linux-x86_64.sh
# 重启环境变量,激活 Conda 环境
source ~/.bashrc
```
此时我们处于 Conda 默认的 `base` 环境中。为了避免软件版本冲突,我们需要新建并激活一个名为 `rwkv` 的 conda 环境。依次运行以下命令:
```bash copy
# 创建名为 rwkv 的 conda 环境, 并指定 python 版本为 3.10
conda create -n rwkv python=3.10
# 激活 rwkv 环境
conda activate rwkv
```
至此,我们已经配置了 RWKV 微调所需的 Conda 环境。
## 安装训练所需的软件
在终端的 Conda 环境中依次运行以下命令,安装 RWKV 训练环境:
```bash copy
# 通过指定 url 安装 CUDA 12.8 版本的最新 torch
pip install torch --upgrade --extra-index-url https://download.pytorch.org/whl/cu128
# 安装 PyTorch Lightning 和其他常用的机器学习工具包,--upgrade 参数将软件升级到最新版本
pip install lightning deepspeed wandb ninja --upgrade
# 以下是使用 RWKV-PEFT 微调时会用到的一些其他工具包,建议提前安装
pip install bitsandbytes einops triton rwkv-fla rwkv transformers GPUtil plotly datasets --upgrade
```
推荐的软件版本为 RWKV 微调的最佳实践,也可以选择安装其他版本的软件,保证兼容性即可。
下载缓慢?尝试在命令后添加 `-i https://mirrors.aliyun.com/pypi/simple` 参数,使用阿里源加快下载速度。
## 检查 CUDA 环境
上述依赖安装完毕后,可以检查当前 PyTorch 是否能够识别 CUDA 和 NVIDIA GPU。
依次运行以下命令,检查 PyTorch 的版本和 CUDA 工具是否可用:
```python
python3 # 启动 python3
import torch # 导入 torch 包
# 打印 PyTorch 版本
print(f"PyTorch version: {torch.__version__}")
# 检查 CUDA 是否可用
print(f"CUDA available: {torch.cuda.is_available()}")
# 打印当前 PyTorch 构建使用的 CUDA 版本
print(f"CUDA version: {torch.version.cuda}")
# 打印可用的 GPU 数量
print(f"Number of GPUs: {torch.cuda.device_count()}")
```
如果 `print(f"CUDA available: {torch.cuda.is_available()}")` 命令返回 `CUDA available: True` ,证明 CUDA 环境可用:
如果返回 `False` ,则使用 `print(f"CUDA version: {torch.version.cuda}")` 命令,检查是否正确安装了 CUDA 版本的 torch。
如果安装了 CUDA 版本的 PyTorch,仍然返回 `CUDA available: False`,请先使用 `nvidia-smi` 检查显卡驱动和 GPU 状态,并确认当前终端已经激活正确的 Conda 环境。如果需要重新安装 CUDA Toolkit,请参阅 [**CUDA Toolkit 安装文档**](#cudatoolkit)。
# 微调简介
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
## 为什么要微调 RWKV 模型?
目前官方发布的 RWKV-7 G1x 系列模型均为基底模型(base model ,又称预训练模型),基底模型在自然语言处理等领域的大规模数据集上进行了训练,具备较强的泛化能力和丰富的知识储备。
但为了保持泛化能力和通用性,RWKV 基底模型并未针对某一类任务作优化。因此,RWKV 模型在某些特定任务上的表现可能不够理想。
而对 RWKV 模型进行微调,通俗地说,是**使用特定领域(如法律、文学、医学等)或任务(材料总结、小说续写等)的高质量数据集对 RWKV 模型进行再次训练**。如果数据和训练配置合适,微调可以改善 RWKV 模型在对应任务上的表现。
相比于从头训练一个全新的模型,微调是在预训练模型的基础上继续训练,通常需要的训练周期和计算资源更少。
综上所述,我们可以通过微调 RWKV 模型优化其在各种任务中的表现,从而快速构建基于 RWKV 模型的应用场景和落地应用。
## 我需要为微调训练准备什么?
要微调 RWKV 模型,你需要准备**一个 Linux 系统**、基础的 Linux 知识储备,和一张**性能较强的 NVIDIA 显卡**(例如 RTX 4090)。
其次,你需要为 Linux 系统配置训练 RWKV 模型需要的工具,例如 [**NVIDIA CUDA Toolkit**](./FT-Environment#cudatoolkit)、[**conda 虚拟环境**](./FT-Environment#conda)、[**PyTorch 等软件包**](./FT-Environment#install-deps)。
最后,你需要准备用于微调训练的[**数据集**](./FT-Dataset)。
## 消费级显卡可以微调什么模型?
以下是 RWKV-PEFT 各类微调方法搭配不同训练精度的显存需求,我们的测试基于 24GB 显存的 4090 显卡。
### RWKV-7 模型微调显存需求
**RWKV-7 模型进行 [State tuning](./RWKV-PEFT/State-Tuning.mdx) 的显存需求:**
| 模型参数 | bf16 | int8 量化 | nf4 量化 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.6GB GPU | 2.4GB GPU | 2.5GB GPU |
| RWKV7-0.4B | 3.1GB GPU | 2.9GB GPU | 2.8GB GPU |
| RWKV7-1.5B | 5.3GB GPU | 4.1GB GPU | 3.7GB GPU |
| RWKV7-2.9B | 8.2GB GPU | 5.7GB GPU | 4.7GB GPU |
**RWKV-7 模型进行 [LoRA 微调](./RWKV-PEFT/LoRA.mdx) 的显存需求:**
| 模型参数 | bf16 | int8 量化 | nf4 量化 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.7GB GPU | 2.5GB GPU | 2.4GB GPU |
| RWKV7-0.4B | 3.4GB GPU | 2.9GB GPU | 2.7GB GPU |
| RWKV7-1.5B | 5.6GB GPU | 4.6GB GPU | 3.9GB GPU |
| RWKV7-2.9B | 8.8GB GPU | 6.7GB GPU | 5.7GB GPU |
**RWKV-7 模型进行 [MiSS 微调](./RWKV-PEFT/MiSS.mdx) 的显存需求:**
| 模型参数 | bf16 | int8 量化 | nf4 量化 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.7GB GPU | 2.5GB GPU | 2.4GB GPU |
| RWKV7-0.4B | 3.1GB GPU | 2.9GB GPU | 2.7GB GPU |
| RWKV7-1.5B | 5.6GB GPU | 4.5GB GPU | 3.9GB GPU |
| RWKV7-2.9B | 8.8GB GPU | 6.7GB GPU | 5.7GB GPU |
### RWKV-6 模型微调显存需求
RWKV-6 模型微调的显存需求比 RWKV-7 略高,以下显存需求仅供参考:
| 模型尺寸 | 全参微调 | MiSS/LoRA/PISSA | QLoRA/QPissa | State tuning |
| ---------- | ---- | --------------------- | --------------------------- | ------------ |
| RWKV6-1.6B | 爆显存 | 7.4GB GPU | 5.6GB GPU | 6.4GB GPU |
| RWKV6-3B | 爆显存 | 12.1GB GPU | 8.2GB GPU | 9.4GB GPU |
| RWKV6-7B | 爆显存 | 23.7GB GPU(bsz 8 爆显存) | 14.9GB GPU(bsz 8 需要 19.5GB) | 18.1GB GPU |
# KoboldCpp 推理教程
import { CallOut } from 'components-docs/call-out/call-out.tsx'
[KoboldCpp](https://github.com/LostRuins/koboldcpp) 是一款带图形启动器和内置 KoboldAI Lite WebUI 的本地模型推理工具。本教程使用它加载 RWKV 的 `GGUF` 模型。
本教程将指引你在 KoboldCpp 中运行 RWKV 模型,并与模型聊天对话。
## 下载与安装
### 下载 RWKV 模型
KoboldCpp 使用 `GGUF` 格式的 RWKV 模型。对于 1.5B 及以上模型,第一次可以从 `Q5_K_M` 等中等量化开始。0.1B 和 0.4B 模型则建议使用 `Q8_0` 或 FP16,避免低比特量化带来的精度损失。
可以从 [RWKV7-Gxx GGUF 合集](https://huggingface.co/collections/shoumenchougou/rwkv7-gxx-gguf) 或 [RWKV ModelScope 合集](https://modelscope.cn/organization/RWKV?tab=collection) 下载模型。先在合集页面选择需要的模型,进入模型仓库后再下载一个以 `.gguf` 结尾的量化文件:
自己微调了一个 RWKV-7 模型,想从 pth 转 gguf 格式?查看 [llama.cpp 文档 - 从 pth 模型转换为 gguf](../llamacpp#get-gguf-models)。
同一模型通常提供多种量化文件。量化越高,通常越占用内存或显存,也越接近原始权重。请先以“能够完整加载并稳定生成”为目标,再比较不同量化的速度与输出效果。
### 下载 KoboldCpp
从 [KoboldCpp Releases](https://github.com/LostRuins/koboldcpp/releases/latest) 下载适合当前系统的文件。正式版发布页提供的文件选择如下:
| 系统与硬件 | 下载文件 | 说明 |
| ------------------------------ | --------------------- | ------------------------------ |
| Windows + NVIDIA GPU | `koboldcpp.exe` | 官方推荐的单文件版本 |
| Windows,无 NVIDIA GPU 或不使用 CUDA | 文件名包含 `nocuda` 的版本 | AMD GPU 可先在这个版本中选择 Vulkan |
| 较旧 CPU 或较旧 NVIDIA GPU | 文件名包含 `oldpc` 的版本 | 使用 CUDA 11 和 AVX1,供默认版本无法启动时尝试 |
| Linux + NVIDIA GPU | `koboldcpp-linux-x64` | 官方推荐的单文件版本 |
| Linux + AMD GPU | 文件名包含 `nocuda` 的版本 | 优先尝试 Vulkan |
| Apple Silicon Mac | `koboldcpp-mac-arm64` | 适用于 M 系列芯片 |
如果 Linux + AMD GPU 使用 Vulkan 时遇到兼容性问题,可以再尝试[滚动更新的 ROCm 版本](https://koboldai.org/cpplinuxrocm)。
## 配置与运行
### 调整 KoboldCpp 配置
下面以 Windows 单文件版本为例。双击下载的 exe 文件,即可打开 KoboldCpp 的启动器 GUI。
Linux 和 macOS 用户需要先为下载的文件添加执行权限,再从终端启动:
```bash
# Linux
chmod +x koboldcpp-linux-x64
./koboldcpp-linux-x64
# Apple Silicon Mac
chmod +x koboldcpp-mac-arm64
./koboldcpp-mac-arm64
```
如果 macOS 阻止程序运行,请在系统的安全性设置中允许该程序后重试。
其他安装方式可参考 [KoboldCpp README](https://github.com/LostRuins/koboldcpp#readme)。
在启动器的快速启动(Quick Launch)界面,可以**调整 KoboldCpp 和模型的配置**,重点关注以下三个选项:
* **`GGUF Text Model`**:选择一个 `.gguf` 格式的 RWKV 模型文件。
* **`Backend`**:NVIDIA 显卡选择 `Use CUDA`,AMD 或 Intel 显卡优先尝试 `Use Vulkan`,只使用 CPU 时选择 `Use CPU`。
* **`GPU Layers`**:控制放到 GPU 中运行的模型层数。通常保留默认值 `-1`,由 AutoFit 自动估算。
如果加载模型时提示显存不足,请将 `GPU Layers` 改为更小的数值后重试。
其他选项**建议保持默认**,或根据需要调整:
* **`Use MMQ`**:一般保持默认即可。需要比较不同计算方式的速度时,再参考 [KoboldCpp 文档 - MMQ 的作用](https://github.com/LostRuins/koboldcpp/wiki#what-does-quantized-mat-mul-mmq-do-for-cuda)
* **`Launch Browser`**:是否在加载模型后自动打开浏览器,并访问 KoboldCpp 的 WebUI
* **`Use ContextShift`**:运行 RWKV 模型时保持默认即可
* **`Use FlashAttention`**:运行 RWKV 模型时保持默认即可
* **`Quiet Mode`**:选择此选项后,终端不再显示模型生成的文本内容
* **`Remote Tunnel`**:创建一个可从互联网访问的临时地址。仅在需要远程连接时启用
* **`Context Size`**:设置 KoboldCpp 可处理的最大上下文长度。第一次运行保持默认即可。增大上下文会增加内存或显存占用
* 其他参数的释义,请参考 [KoboldCpp 文档](https://github.com/LostRuins/koboldcpp/wiki)
### 运行 KoboldCpp
配置完毕后,点击右下角的 `Launch` 按钮启动 KoboldCpp。
模型加载成功后,终端会显示本地服务地址。启用了 `Launch Browser` 时,浏览器还会自动打开 KoboldCpp WebUI:
```text
Load Text Model OK: True
Please connect to custom endpoint at http://localhost:5001
```
看到 WebUI 并能够发送一条消息,即说明下载、后端选择和模型加载都已完成。
如果启用了 `Launch Browser`,但浏览器没有自动打开,请手动访问终端显示的地址。默认地址通常为 `http://localhost:5001`。
启动器 `Network` 页的 `Host` 留空时,同一局域网中的其他设备也可能访问这个服务。
* \*\*仅在本机使用:\*\*将 `Host` 设为 `127.0.0.1`
* \*\*允许局域网设备或远程隧道访问:\*\*先设置 `Password`,不要直接暴露未鉴权的服务
## KoboldCpp 使用指南
### 更改对话模式
KoboldCpp 支持四种使用模式。在 KoboldCpp 的 WebUI 中打开 `Settings`,在 `General` 页的 `Usage Mode` 中切换模式:
* **`Instruct Mode`**:指令模式,适合带有指令的文本生成
* **`Story Mode`**:故事模式,适合小说风格的文本生成
* **`Adventure Mode`**:冒险模式,适合生成**交互式小说/角色扮演游戏**等内容。
* **`Chat Mode`**:聊天模式,适合闲聊
一般聊天可以先选择 `Chat Mode`,执行具体任务时可以选择 `Instruct Mode`。`Story Mode` 和 `Adventure Mode` 分别用于故事续写和交互式叙事。
\*\*使用 `Chat Mode`:\*\*在 `General` 页将 `Your Name` 设为 `User`、`AI Name(s)` 设为 `Assistant`。
\*\*使用 `Instruct Mode`:\*\*还需要按照模型使用的提示词格式设置指令的开始和结束标签,不能只切换使用模式。
其他格式请参考 [RWKV 提示词格式](../../basic/Prompt-Format)。
### 更改 WebUI 风格
在 `Settings` 的 `General` 页找到 `UI style`,即可调整 WebUI 风格。当前提供以下四种风格,并非所有风格都适用于全部使用模式:
* **`Classic Theme`**:简洁界面,适用于所有模式。
* **`Messenger Theme`**:即时通信风格,适用于聊天模式。
* **`Aesthetic Theme`**:可调整字体、间距、背景和角色头像等显示效果。
* **`Corpo Theme`**:类似常见在线 AI 助手的界面。
想要接近常见在线聊天工具的布局时,可以选择 `Corpo Theme`。
### 其他设置项
更多设置项的释义,请参考 WebUI 中的注释和 [KoboldCpp 文档](https://github.com/LostRuins/koboldcpp/wiki)。
如果不习惯全英文的 WebUI 界面,可使用浏览器的翻译功能将页面翻译成中文。
# Ollama 推理教程
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
[Ollama](https://github.com/ollama) 是一个本地模型运行工具,可以通过命令行或桌面程序下载、管理和运行模型。
本章节介绍如何在 Ollama 中运行 RWKV-7 模型:你可以直接运行 Ollama 模型,也可以导入本地 GGUF 文件。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1TrrdYmE7M/)观看。
## Ollama 下载与安装
可从 [Ollama 官网](https://ollama.com/) 下载 Ollama 的安装程序。以下安装步骤以 Windows 为例。
下载完成后,双击 exe 文件进行安装。Ollama 会在安装后自动启动,系统任务栏出现 `Ollama` 图标即表示安装完成。
接下来,我们将在 Ollama 中运行 `gguf` 格式的 RWKV 模型。从以下两种方法中选择一种:
| 方法 | 描述 | 优点 | 缺点 |
| ----------------------------------------------------- | ------------------------- | -------------------- | --------------------------------- |
| **[直接运行 Ollama 模型](#run-ollama-provided-rwkv-model)** | 根据模型名称自动下载并运行 | 操作简单,不需要手写 Modelfile | 可选的量化精度由模型发布者决定 |
| **[运行自定义 RWKV 模型](#run-custom-rwkv-model)** | 导入本地 GGUF 并创建 `Modelfile` | 可以选择自己的 GGUF 文件和量化版本 | 需要手动创建 `Modelfile`,且并非所有 GGUF 都兼容 |
## 直接运行 Ollama 模型
下面以 G1i 1.5B 模型为例。
在终端中执行:
```bash
ollama run shoumenchougou/rwkv-7-g1i:1.5b
```
首次运行时,Ollama 会自动下载模型。看到 `>>>` 输入提示符后,即可直接发送问题。
需要选择其他参数规模时,请先在 [Ollama 的 RWKV 搜索结果](https://ollama.com/search?q=rwkv) 中确认可用的模型名称,再替换命令中的模型参数。
在 Ollama 对话界面中,输入 `/set think` 可启用思考模式,输入 `/set nothink` 可切换到快速回答。
## 运行自定义 RWKV 模型
要运行自定义 RWKV 模型,需要准备一个 `.gguf` 模型文件和一个 `Modelfile` 配置文件。准备完成后,依次使用 `ollama create` 和 `ollama run` 创建并运行模型。
**下载 RWKV gguf 模型**
可以从 [RWKV7-Gxx-GGUF 合集](https://huggingface.co/collections/shoumenchougou/rwkv7-gxx-gguf) 下载 `gguf` 格式的 RWKV 模型。
量化精度越低,模型文件通常越小,但回答质量也可能下降。对于 0.1B、0.4B 等小模型,优先选择 `FP16` 或 `Q8_0`。其他参数规模可根据可用内存选择量化版本。
自己微调了一个 RWKV-7 模型,想从 pth 格式转 gguf?查看 [从 pth 模型转换为 gguf](../llamacpp#get-gguf-models)。
**创建模型的 Modelfile 文件**
在存放 RWKV GGUF 模型的文件夹中创建一个名为 `Modelfile` 的文本文件,不需要添加后缀名。
在 Windows 中,请确认文件没有被保存成 `Modelfile.txt`。
使用“记事本”等文本编辑工具打开 `Modelfile`,写入以下模板和参数。
以下模板支持 `/set think` 和 `/set nothink`。
```text
FROM ./rwkv7-g1i-1.5b-Q6_K.gguf
TEMPLATE """{{- if .System }}System: {{ .System }}{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1}}
{{- if eq .Role "user" }}
{{- if eq $i 0}}User: {{ .Content }}{{- else }}
User: {{ .Content }}{{- end }}
{{- else if eq .Role "assistant" }}
Assistant: <{{- if and $last .Thinking -}}think>{{ .Thinking }}{{- else }}think>
{{- end }}{{ .Content }}{{- end }}
{{- if and $last (ne .Role "assistant") }}
Assistant:{{- if $.IsThinkSet }} <{{- if not $.Think }}think>
{{- end }}{{- end }}{{- end }}{{- end }}"""
PARAMETER stop """
"""
PARAMETER frequency_penalty 0.5
PARAMETER presence_penalty 0.5
PARAMETER repeat_penalty 1
PARAMETER temperature 1
PARAMETER top_k 128
PARAMETER top_p 0.5
```
请先将第一行 `FROM` 之后的文件名改成你下载的 RWKV GGUF 文件名。
`PARAMETER temperature 1`、`PARAMETER top_p 0.5` 等解码参数可以根据需要调整。
**创建并运行自定义 RWKV 模型**
在存放 RWKV gguf 模型和 `Modelfile` 文件的目录下打开终端,并执行 `ollama create` 命令:
```bash
ollama create rwkv7-g1i-1.5b -f Modelfile
```
`ollama create` 后面填写的是模型在 Ollama 中的本地名称,不是 GGUF 文件名,因此不需要添加 `.gguf` 后缀名。
创建完毕后,使用 `ollama run` 命令直接运行模型:
```bash
ollama run rwkv7-g1i-1.5b
```
成功运行后,即可与模型进行聊天对话。
## 清除对话或释放模型
在 Ollama 对话界面中输入 `/clear`,可以清除当前对话的历史消息并开始新对话。已经设置的 system prompt 会保留。
需要退出对话界面时输入 `/bye`。退出后如需立即将模型从内存中卸载,再执行:
```bash
ollama stop rwkv7-g1i-1.5b
```
## 使用 Ollama 桌面程序
Windows 和 macOS 的 Ollama 安装包已经包含桌面聊天界面,可以直接在应用中下载模型并开始对话。
本教程先使用命令行,是为了让你明确看到模型的下载和加载结果。确认模型可以正常运行后,再根据个人习惯选择命令行或桌面界面。
## 参考资料
* [Ollama 官网](https://ollama.com/)
* [Ollama G1i 模型仓库](https://ollama.com/shoumenchougou/rwkv-7-g1i)
* [RWKV7-Gxx-GGUF 合集](https://huggingface.co/collections/shoumenchougou/rwkv7-gxx-gguf)
* [Ollama 导入 GGUF 文档](https://docs.ollama.com/import)
# SillyTavern 角色扮演推理教程
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
[SillyTavern](https://github.com/SillyTavern/SillyTavern) 是一个 AI 聊天或角色扮演的工具,你可以与自己创建的角色卡或社区提供的角色卡进行角色扮演。
SillyTavern 不具备模型推理功能,它需要与 LLM 推理服务器(例如 [llama.cpp](https://github.com/ggml-org/llama.cpp)、text-generation-webui 等)配合使用。
本文将介绍如何在 SillyTavern 中使用 RWKV 模型进行角色扮演任务。SillyTavern 负责管理会话和角色卡,并将它们整理成聊天消息。llama.cpp 则负责加载 GGUF 模型,并使用模型中的聊天模板处理这些消息。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1i6oQYdEK8/)观看。
## SillyTavern 下载与安装
该教程以 Windows 系统为例,macOS 与 Linux 的安装方法请参考 SillyTavern 的[安装指导文档](https://docs.sillytavern.app/installation/linuxmacos/)。
首先,我们需要下载并安装 SillyTavern。安装步骤如下:
1. 安装 [NodeJS](https://nodejs.org/)(建议使用最新的 LTS 版本)和 [Git for Windows](https://gitforwindows.org/)
2. 在普通用户目录中新建一个文件夹,在文件夹地址栏输入 `powershell` 并按下回车
3. 运行以下命令,克隆 SillyTavern 的稳定版分支:
```powershell
git clone https://github.com/SillyTavern/SillyTavern -b release
```
4. 克隆完成后,进入 `SillyTavern` 文件夹,双击运行 `Start.bat`。第一次运行时,脚本会自动安装所需依赖
安装完成后,浏览器会自动打开 SillyTavern。
不要将 SillyTavern 安装到 `Program Files`、`System32` 等受 Windows 管理的目录中。请以普通用户身份运行 `Start.bat`,不要选择“以管理员身份运行”。
## 连接本地 LLM 服务器
SillyTavern 不具备模型推理功能,这里我们使用 [llama.cpp](https://github.com/ggml-org/llama.cpp) 作为 RWKV 模型的推理服务器,并使用 SillyTavern 进行聊天。
请先按照 [llama.cpp 推理方法](../../intermediate/llamacpp) 下载并安装 llama.cpp。安装完成后返回本页,继续启动服务。
llama.cpp 安装完毕后,使用以下命令本地搭建一个 llama.cpp 服务:
```powershell
.\llama-server.exe -hf shoumenchougou/RWKV7-G1i-1.5B-GGUF:Q5_K_M --host 127.0.0.1 --port 8080 -ngl 99 --alias rwkv7-g1i
```
当终端显示模型已加载并开始监听 `127.0.0.1:8080` 时,说明服务已经启动成功。请保持这个终端窗口运行。
如果加载模型时提示显存不足,先降低命令中的 `-ngl` 数值。仍然无法加载时,再改用体积更小的 GGUF 量化文件。
llama.cpp 服务器启动后,在 SillyTavern 中执行以下步骤,连接到本地搭建的 llama.cpp 服务:
1. 点击 `API Connections`
2. 将 `API` 设置为 `Chat Completion`
3. 将 `Chat Completion Source` 设置为 `Custom (OpenAI-compatible)`
4. 在 `Custom Endpoint (Base URL)` 中填写 `http://127.0.0.1:8080/v1`。不要在末尾添加 `/chat/completions`,SillyTavern 会自动补全接口路径
5. `Custom API Key` 默认留空。只有在启动 llama.cpp 时配置了 API Key,才需要填写相同的值
6. `Prompt Post-Processing` 保持默认的 `None`
7. 点击 `Connect`
8. 连接成功后,从 `Available Models` 中选择 `rwkv7-g1i`
9. 点击 `Test Message`,确认 SillyTavern 能够收到模型回复
使用聊天补全模式时,不需要再配置文本补全页面中的 Instruct Mode。
\*\*模型列表中没有 `rwkv7-g1i`:\*\*在 `Enter a Model ID` 中手动输入 `rwkv7-g1i`。
\*\*服务端提示消息角色格式错误:\*\*将 `Prompt Post-Processing` 改为 `Semi-strict (alternating roles; no tools)` 后重试。
\*\*模型回复出现角色混淆:\*\*先确认 GGUF 文件包含正确的聊天模板。如果模板缺失,可以在 llama.cpp 启动命令末尾添加 `--chat-template rwkv-world`,重启服务后再测试。
成功连接到本地的 llama.cpp 服务后,就可以与 AI 进行聊天了。
## SillyTavern 角色扮演
SillyTavern 的最大特色是角色扮演,你可以创建一个角色并与其进行对话。
在 SillyTavern 中,点击 "角色管理" 按钮,可以看到 SillyTavern 自带的一个角色卡 Seraphina, 点击她的头像即可与该角色进行对话,并查看她的基本信息。
除了自带的角色卡外,我们也可以[导入现成的角色卡文件](#import-role-card)或者[自己创建角色卡](#create-role)。
### 导入现成的角色卡
可以从 [Ai Character Cards](https://aicharactercards.com/) 下载现成的角色卡文件。
从该网站下载的角色卡通常是 PNG 文件。SillyTavern 也支持导入 JSON、YAML、CHARX 和 BYAF 格式的角色卡。
然后在 SillyTavern 中,点击 `角色管理` 按钮,点击 `从文件导入角色`,选择下载好的角色卡文件导入即可。
导入之后,可以在角色管理中看到导入的角色卡。
之后点击导入的角色卡,即可与角色进行对话,并查看角色基本信息。
### 创建角色卡
除了导入现成的角色卡外,我们也可以自己创建角色卡。
首先点击"角色管理",然后点击"新建角色"。
在这里我们输入**角色的名称和描述**,以及每次聊天时角色发送的**第一句话**,之后点击"创建角色"。
角色描述会随每次生成请求一同发送,适合填写角色的外观、性格、背景和世界观等长期有效的信息。
创建角色描述的示例:
创建完成后,点击创建的角色头像,即可与角色进行对话,并查看角色的基本信息。
更多创建 SillyTavern 角色卡的教程,请查看:
* Trappu's PLists + Ali:Chat guide: [https://wikia.schneedc.com/bot-creation/trappu/creation](https://wikia.schneedc.com/bot-creation/trappu/creation)
* AliCat's Ali:Chat guide: [https://rentry.co/alichat](https://rentry.co/alichat)
* kingbri's minimalistic guide: [https://rentry.co/kingbri-chara-guide](https://rentry.co/kingbri-chara-guide)
## 参考资料
* [SillyTavern 官网](https://sillytavern.app/)
* [SillyTavern 的 GitHub 仓库](https://github.com/SillyTavern/SillyTavern)
* [llama.cpp 项目仓库](https://github.com/ggml-org/llama.cpp)
# TextGen 推理教程
import { CallOut } from 'components-docs/call-out/call-out.tsx'
[TextGen](https://github.com/oobabooga/textgen)(原 Text Generation WebUI)是一个本地大语言模型桌面程序与 Web 界面,可以使用 llama.cpp 后端运行 RWKV GGUF 模型。
本文介绍使用便携版运行 RWKV GGUF 的流程。需要训练、Transformers 或其他扩展时,再使用上游提供的完整安装方式。
## 下载并启动 TextGen
从 [TextGen Releases](https://github.com/oobabooga/textgen/releases) 下载适合当前系统和硬件的便携包。便携包已经包含 llama.cpp 和所需依赖。
| 设备 | 便携包选择 |
| --------------------- | ----------------------------------------------------------- |
| NVIDIA GPU | `nvidia-smi` 显示 CUDA 13.1 或更高版本时选择 CUDA 13.1,否则选择 CUDA 12.4 |
| AMD / Intel GPU | 优先选择 Vulkan |
| 支持 ROCm 7.2 的 AMD GPU | 也可以选择 ROCm |
| Apple Silicon | macOS arm64 |
| Intel Mac | macOS x86\_64 |
| 仅使用 CPU | CPU-only |
下载完成后,将便携包解压到一个独立文件夹。
\*\*macOS 用户还需要完成以下操作:\*\*首次启动前,在终端运行下面的命令,移除解压文件的隔离属性。请将路径替换成实际的 TextGen 文件夹:
```bash
xattr -cr /path/to/textgen-folder
```
完成上述准备后,根据系统启动 TextGen:
* \*\*Windows:\*\*双击 `textgen.bat`
* \*\*Linux 和 macOS:\*\*在解压目录中运行 `./textgen`
启动成功后,TextGen 会打开桌面界面。
如果希望改用浏览器界面,请从终端启动并添加 `--no-electron`:
* **Windows PowerShell:**`.\textgen.bat --no-electron`
* **Linux 和 macOS:**`./textgen --no-electron`
随后访问 `http://127.0.0.1:7860`。
如果需要训练、Transformers、ExLlamaV3 或其他扩展,请改用 [TextGen 完整安装说明](https://github.com/oobabooga/textgen#full-installation)。
## 下载 RWKV 模型
TextGen 支持多种模型加载器,其中 llama.cpp 模型加载器支持 RWKV 模型。
llama.cpp 使用 `gguf` 格式的 RWKV 模型。可以从 [RWKV7-Gxx-GGUF 合集](https://huggingface.co/collections/shoumenchougou/rwkv7-gxx-gguf) 下载 RWKV-7 G 系列模型。
自己微调了一个 RWKV-7 模型,想从 pth 转 gguf 格式?查看 [llama.cpp 文档 - 从 pth 模型转换为 gguf](../llamacpp#get-gguf-models)。
同一个 RWKV 模型通常提供多种量化文件。第一次运行 G1i 1.5B 时,可以先选择 `Q5_K_M`。
* 内存或显存不足时,可以改用 `Q4_K_M`
* 内存或显存充足时,可以选择 `Q6_K`、`Q8_0` 或 FP16
* 0.1B 和 0.4B 模型优先选择 `Q8_0` 或 FP16
等待模型下载完毕,将模型文件放到 TextGen 的 `user_data/models` 文件夹中:
```
textgen
└── user_data
└── models
└── rwkv7-g1i-1.5b-Q5_K_M.gguf
```
## 加载 RWKV 模型
回到 TextGen 界面,配置并加载 RWKV 模型:
1. 点击 `Model` 标签,切换到模型选择和配置页面
2. 点击 `Model` 下拉菜单,选择一个 RWKV 模型
3. 点击 `Model loader` 下拉菜单,选择 `llama.cpp` 作为模型加载器
4. 保持 GGUF 内置的聊天模板。只有自制 GGUF 缺少模板时,才需要手动配置指令模板
5. 点击 `Load` 按钮加载 RWKV 模型
如果 `Model` 下拉菜单未显示模型文件,可能是界面尚未同步 `user_data/models` 文件夹中的模型列表。
请**点击右侧的 🔄 刷新按钮**,更新模型列表。
成功加载后,状态区域会显示 `Successfully loaded` 和当前模型名称。
## 开始聊天
模型加载完毕后,按照以下顺序开始对话:
1. 回到 `Chat` 页面
2. 选择 `instruct` 模式
3. 输入消息并点击 `Send`
界面中出现模型回复,即表示模型、加载器和聊天模板均可正常使用。
## 其他参数说明
除了模型文件、`llama.cpp` 模型加载器和 GGUF 内置的聊天模板以外,TextGen 还提供一系列可调整的参数。这些参数会影响设备分配、上下文长度和生成速度。
通常可以**保持默认参数**运行模型。如需修改,请参考以下参数说明:
| 参数 | 什么时候调整 |
| ---------------------------- | ------------------------------------------------ |
| `gpu-layers` | 分配到 GPU 的层数。`-1` 表示自动选择,`0` 表示只使用 CPU。通常保持 `-1`。 |
| `ctx-size` | 上下文长度。`gpu-layers` 为 `-1` 时可将其设为 `0`,让程序自动选择。 |
| `tensor_split` | 多 GPU 的显存分配比例,例如 `30,70`。单 GPU 不需要设置。 |
| `batch_size` / `ubatch_size` | 控制提示词处理批量。通常保持默认,只有在调优速度或解决显存不足时再修改。 |
| `threads` / `threads_batch` | CPU 线程数。通常分别使用物理核心数、逻辑核心数。 |
| `split-mode` | 多 GPU 切分方式。`tensor` 模式可能提高多卡速度。 |
| `no-mmap` / `mlock` / `numa` | 内存映射、锁页和多路 CPU 调优选项。没有明确问题时保持默认。 |
# API 用法
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { ApiReference, ApiSchemaSection, ApiField } from 'components-docs/api-reference/api-reference.tsx'
以下接口适用于 RWKV Runner **v1.9.12**。
* 默认地址:`http://127.0.0.1:8000`
* 交互式 OpenAPI:启动后访问 [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)
* 上游路由源码:[backend-python/routes](https://github.com/josStorer/RWKV-Runner/tree/master/backend-python/routes)
`/switch-model`、`/exit`、State Cache 和部分 MIDI 文件写入端点属于管理接口。开启 `deploy` 后,这些接口会返回 `403`;不要把未受保护的 Runner 管理端口直接暴露到公网。
## 当前端点总览
| 类别 | 方法与路径 | 说明 |
| ----------- | ------------------------------------------------- | ----------------------------------------------------- |
| 生成 | `POST /v1/chat/completions` | OpenAI 风格聊天补全 |
| 生成 | `POST /v1/completions` | 文本续写 |
| 向量 | `POST /v1/embeddings` | RWKV 文本向量 |
| 模型 | `GET /v1/models` | 获取模型列表 |
| 模型 | `GET /v1/models/{model_id}` | 获取指定模型 |
| 配置 | `POST /switch-model` | 加载 `.pth` 或 `.gguf`,并为 `.pth` 选择 RWKV Pip 或 Albatross |
| 配置 | `POST /update-config` | 更新默认解码参数或 State |
| 配置 | `GET /status` | 后端状态、PID 与设备名称 |
| Albatross | `GET /albatross/profile` | 性能计数;查询参数 `reset=true` 可读取后重置 |
| Albatross | `POST /albatross/profile/reset` | 重置性能计数 |
| State Cache | `POST /enable-state-cache` | 启用前缀状态缓存 |
| State Cache | `POST /disable-state-cache` | 禁用并清空状态缓存 |
| State Cache | `POST /reset-state` | 重置 State Cache |
| 文件 | `POST /file-to-text` | 上传并解析 `.txt` 或 `.pdf` |
| MIDI | `POST /text-to-midi`、`/midi-to-text` | 文本与 MIDI 互转 |
| MIDI | `POST /txt-to-midi`、`/midi-to-wav`、`/text-to-wav` | 服务器文件转换,部署模式下禁用 |
| 根路由 | `GET /`、`POST /exit` | 健康检查与关闭后端 |
## 解码参数
聊天补全、文本续写和 `/update-config` 共用以下参数。请求中的值会覆盖 Runner 当前默认配置。
| 字段 | 类型与范围 | 作用 |
| ------------------- | -------------------- | ----------------- |
| `max_tokens` | integer,`1..102400` | 最大生成 token 数 |
| `temperature` | number,`0..3` | 采样温度 |
| `top_p` | number,`0..1` | 核采样累计概率 |
| `top_k` | integer,`0..100` | 候选 token 数 |
| `presence_penalty` | number,`-2..2` | 出现惩罚 |
| `frequency_penalty` | number,`-2..2` | 频率惩罚 |
| `penalty_decay` | number,`0.99..0.999` | 惩罚随距离衰减 |
| `global_penalty` | boolean | 是否把输入 prompt 计入惩罚 |
| `state` | string | State-tuned 文件路径 |
## 聊天补全
函数调用只在 RWKV 文本模型路径启用。模型生成的 `arguments` 仍需由调用方进行 JSON 校验、参数白名单校验和权限控制。
## 文本续写
## Embeddings
这里的 `embeddings` 是 Runner 对模型内部状态的封装,不能直接假定为 OpenAI 风格的定长一维向量。使用 RWKV Runner 1.9.12 和 `rwkv7-g1i-1.5b-20260805-ctx16384.pth` 实测时,每条输入返回的数组形状为 `32 × 64 × 64`。如果准备写入向量数据库,请先在目标模型上确认维度、归一化方式和相似度计算方法。
## 模型与运行状态
## 管理与配置
`/switch-model` 会等模型加载完成后再返回结果。首次加载较大的模型、编译自定义算子或只使用 CPU 时,耗时可能超过普通 HTTP 客户端的默认超时。客户端超时不等于服务端已经停止加载:先查看 Runner 日志,并通过 `/status` 确认状态;`status` 仍为 `2` 时不要重复提交加载请求。
## 文件、MIDI 与 State Cache
以下是 Runner 当前提供的文件、MIDI 与 State Cache 接口。面向公网部署时建议在网关中直接禁用管理和服务器文件路径接口。
| 路径 | 请求 | 响应与限制 |
| --------------------------- | --------------------------------------------------------- | --------------------------------------- |
| `POST /file-to-text` | 查询参数 `file_name`、`file_encoding`,multipart 字段 `file_data` | `{ pages: Document[] }`;仅 `.txt`、`.pdf` |
| `POST /text-to-midi` | `{ text }` | `audio/midi` 二进制 |
| `POST /midi-to-text` | multipart 字段 `file_data` | `{ text }` |
| `POST /txt-to-midi` | `{ txt_path, midi_path }` | `"success"`;输出必须在 `midi/` 下;部署模式禁用 |
| `POST /midi-to-wav` | `{ midi_path, wav_path, sound_font_path? }` | `"success"`;需安装 FluidSynth;部署模式禁用 |
| `POST /text-to-wav` | `{ text, wav_name, sound_font_path? }` | `"success"`;部署模式禁用 |
| `POST /enable-state-cache` | 无 | `"success"`;缺少 `cyac` 时返回 400 |
| `POST /disable-state-cache` | 无 | `"success"` |
| `POST /reset-state` | 无 | `"success"`;缓存未启用时返回 400 |
## 错误处理与并发
* 模型未加载:生成和 Embeddings 返回 `400 model not loaded`。
* 空 `messages` 或空 Embeddings `input`:返回 `400`。
* 非 RWKV 后端调用 Embeddings:返回 `400 model not support embedding`。
* 当前路由会让 RWKV Pip、rwkv.cpp 和 WebGPU 的生成请求经过同一把生成锁;Albatross 请求不经过这把锁,而是交给自己的异步队列,调度器可将同时处理的请求组成批次。
* 流式调用应持续读取 SSE,直到收到 `[DONE]`,并在客户端断开时及时取消请求。
* 对外服务必须在反向代理处限制请求体、并发数、超时和 `max_tokens`。
## 历史与兼容接口
以下路径仅用于维护已有客户端,已从主接口说明中移出。新接入应使用右侧的当前规范路径;兼容路径可能在后续版本中删除。
| 历史或兼容路径 | 已确认版本状态 | 当前接口 |
| ---------------------------------------------------- | -------------------- | --------------------------- |
| `POST /chat/completions` | v1.9.12 仍兼容 | `POST /v1/chat/completions` |
| `POST /completions` | v1.9.12 仍兼容 | `POST /v1/completions` |
| `POST /embeddings` | v1.9.12 仍兼容 | `POST /v1/embeddings` |
| `POST /v1/engines/text-embedding-ada-002/embeddings` | v1.9.12 仍兼容 | `POST /v1/embeddings` |
| `POST /engines/text-embedding-ada-002/embeddings` | v1.9.12 仍兼容 | `POST /v1/embeddings` |
| `GET /models` | v1.9.12 仍兼容 | `GET /v1/models` |
| `GET /models/{model_id}` | v1.9.12 仍兼容 | `GET /v1/models/{model_id}` |
| `GET /dashboard/billing/credit_grants` | v1.9.12 仍保留,仅用于历史客户端 | 无对应业务接口 |
# 进阶用法
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { LearnMore } from 'components-docs/learn-more/learn-more.tsx'
本页适合已经完成 [快速入门](./Simple-Usage)、能够正常启动模型,希望继续调整推理方式、挂载 State 或部署服务器的用户。
| 你准备做什么 | 从哪里开始 |
| ----------------------------- | -------------------- |
| 更换模型格式、显卡或推理后端 | [选择推理后端](#选择推理后端) |
| 调整 Temperature、Top\_P 或模型加载方式 | [配置参数](#配置参数) |
| 使用 State 或 Function Call | [进阶功能](#进阶功能) |
| 在 Linux 服务器运行 Runner | [服务器部署](#server-dev) |
## 选择推理后端
大多数用户直接使用 Runner 预设配置即可。只有模型无法加载、需要 GGUF / WebGPU,或者准备比较 Albatross 时,才需要手动调整后端。
| 你的模型与设备 | 在 Runner 中怎么选 | 后端 | 使用前确认 |
| ----------------------------------------- | --------------------------------------------------------- | ------------------- | ---------------------------------------- |
| `.pth`;使用默认加载方式 | 选择模型后使用 `cuda fp16`、`cuda fp16i8` 或 `cpu fp32` 等 Strategy | **RWKV Pip** | Runner 默认方案,先从它开始 |
| 同一份 `.pth`;模型是 RWKV-7,且使用 CUDA 或 ROCm GPU | 不转换模型,只把 Strategy 改为 `albatross workers=1 batch=32` | **Albatross** | 与 RWKV Pip 实测速度后再决定;不支持 `/v1/embeddings` |
| `.gguf` 量化模型 | 直接选择 `.gguf`;Strategy 使用 `cpu 8192` 或 `cuda 8192` | **llama.cpp** | 第二个数值是上下文长度 |
| `.st`;AMD、Intel、Apple 或其他 WebGPU 设备 | 以 `--webgpu` 启动 Python 服务 | **WebGPU (Python)** | 官方 `.pth` 需要先转换为 `.st` |
| 旧版 `.bin` / GGML 模型 | 以 `--rwkv.cpp` 启动 Python 服务 | **rwkv.cpp** | 仅用于兼容旧模型,不要与 llama.cpp 混淆 |
后端决定由哪套程序加载并运行模型;Strategy 是 Runner 交给后端的加载配置;量化则是用较低精度保存或计算权重,以减少显存或内存占用。
| 名称 | 它实际控制什么 | 示例 |
| -------- | -------------- | ------------------------------------------------------ |
| 推理后端 | 哪套程序加载并运行模型 | RWKV Pip、Albatross、llama.cpp |
| Strategy | 后端、设备、精度或上下文长度 | `cuda fp16`、`albatross workers=1 batch=32`、`cuda 8192` |
| 量化 | 模型权重的保存或计算精度 | `fp16i8`、GGUF `Q5_K_M`、WebGPU `NF4` |
后端没有脱离设备和模型的“绝对最快”选项。同一个 RWKV-7 模型可以分别测试 RWKV Pip 和 Albatross,比较首 token 等待时间、生成速度和显存占用后再选择。
### 后端设置速查
| 项目 | 设置 |
| ----------- | ------------------------------------------------------- |
| 模型格式 | `.pth` |
| 常用 Strategy | NVIDIA:`cuda fp16`;CPU:`cpu fp32`;显存不足可尝试 `cuda fp16i8` |
| 自定义 CUDA | NVIDIA 用户可测试;加载失败或输出异常时先关闭 |
| 适合 | Runner 默认推理、灵活分配设备与精度、读取模型状态 |
`/v1/embeddings` 只在 RWKV Pip 路径提供。RWKV-7 返回的是随模型结构变化的多维状态数组,不能直接当作通用的一维文本向量。具体格式见 [API 用法](./API-Usage#embeddings)。
| Strategy 片段 | 作用 | 建议 |
| ----------- | -------------------------- | ---------------------------- |
| 模型文件 | 直接加载 `.pth` | 与 RWKV Pip 使用同一份文件,不需要转换 |
| `albatross` | 选择 Albatross | 新配置使用这个名称,不再使用兼容名称 `chirrup` |
| `workers=1` | 每个 Worker 使用一张 GPU,并加载一份模型 | 单卡从 `1` 开始 |
| `batch=32` | 单个 Worker 可调度的批处理规模 | 先用默认值,再根据并发压测调整 |
```json
{
"model": "models/rwkv7-g1-2.9b-20250519-ctx4096.pth",
"strategy": "albatross workers=1 batch=32",
"tokenizer": null,
"customCuda": false,
"deploy": false
}
```
Albatross 可用于单条请求,也能在并发时组织批处理。它会优先使用匹配当前 Python、PyTorch、GPU 架构和 CUDA / ROCm 环境的预编译算子;没有匹配文件时会现场编译,因此第一次加载可能明显变慢。
排查性能时可以在启动 Runner 前设置以下环境变量:
| 环境变量 | 作用 |
| -------------------------------------- | ---------------------------------- |
| `ALBATROSS_PROFILE=1` | 记录性能数据,可通过 `/albatross/profile` 查询 |
| `ALBATROSS_TPS_LOG_INTERVAL=<秒>` | 定期在日志中输出解码吞吐 |
| `ALBATROSS_SAMPLER=python\|cuda` | 选择 Python 或融合 CUDA 采样器;默认 `python` |
| `ALBATROSS_SAMPLER_FALLBACK=1` | CUDA 采样器不可用时允许回退 |
| `ALBATROSS_KERNEL_ARCH=sm80_compute80` | 覆盖自动选择的算子架构,仅用于兼容性排查和对照测试 |
选择 `.gguf` 文件后,Runner 会自动使用 llama.cpp,不受 `--rwkv.cpp` 参数影响。
| Strategy | 运行位置 | 上下文长度 |
| ----------- | ----------- | ------- |
| `cpu 8192` | CPU | 8192 |
| `cuda 8192` | 将可用层卸载到 GPU | 8192 |
| `cuda` | GPU | 默认 8192 |
```json
{
"model": "models/rwkv7-g1-2.9b-ctx4096-Q6_K.gguf",
"strategy": "cuda 8192",
"tokenizer": null,
"customCuda": false,
"deploy": false
}
```
文件名包含 `rwkv` 的 GGUF 会使用 Runner 的 RWKV 提示词模板;其他 llama.cpp 模型使用模型自己的聊天模板。该后端不提供 Runner 的 `/v1/embeddings`。
| 后端 | 启动方式 | 模型格式 | 什么时候使用 |
| --------------------- | ------------------------------------------ | --------------- | ------------------------------------------ |
| WebGPU (Python) | `python backend-python/main.py --webgpu` | `.st` | AMD、Intel、Apple 等 WebGPU 设备,或需要 NF4 / INT8 |
| rwkv.cpp | `python backend-python/main.py --rwkv.cpp` | 旧 `.bin` / GGML | 兼容旧版 RWKV CPU 模型 |
| RWKV Pip 自定义 Strategy | 在 Runner 配置中填写设备、层数和精度 | `.pth` | 将模型分配到 CPU、单张或多张 GPU |
## 配置参数
在 Runner 的配置页面选择已有预设,或点击 `+` 新建配置:
第一次配置时,优先确认下面四项。模型能够正常回答后,再改采样和量化参数。
| 先确认 | 怎么设置 | 判断成功的方式 |
| ---------- | ----------------- | ---------------------------------- |
| 模型 | 选择已经下载、格式与后端匹配的文件 | 文件名显示在模型栏中 |
| Strategy | 根据上方选择表填写 | 模型加载过程没有格式或设备错误 |
| API 端口 | 没有冲突时保留 `8000` | 可访问 `http://127.0.0.1:8000/status` |
| 最大响应 Token | 先保留默认值 | 聊天可以正常结束,不会无限生成 |
| 参数 | 什么时候调整 | 调整方向 |
| ----------------- | -------------------- | ---------------------- |
| API 端口 | `8000` 被占用,或同时运行多个服务 | 为每个服务使用不同端口 |
| 最大响应 Token | 回答经常被截断,或生成过长 | 提高或降低生成上限 |
| Temperature | 需要更稳定或更多样的回答 | 越低通常越稳定;越高随机性越强 |
| Top\_P | 需要缩小候选 token 范围 | 越低候选范围通常越窄;不确定时保持默认 |
| Presence Penalty | 模型很少引入新内容 | 提高后,已经出现过的 token 会受到惩罚 |
| Frequency Penalty | 同一词句反复出现 | 提高后,出现次数越多惩罚越强 |
| 惩罚衰减 | 重复惩罚持续太久或消失太快 | 建议先保持默认值 |
| 全局惩罚 | 模型照抄输入或复述 prompt | 开启后,输入文本也参与重复惩罚 |
| 参数 | 作用 | 注意事项 |
| ------------ | -------------------------- | ----------------------------------- |
| 模型转换 | 把 `.pth` 转成特定后端需要的格式 | 使用新的输出文件并保留原始 `.pth` |
| Strategy | 选择后端、设备、精度或上下文长度 | 不同后端的语法不同,先对照上方表格 |
| 精度 | 控制 RWKV Pip 或 WebGPU 的计算精度 | GGUF 的量化等级已经写在文件中;Albatross 使用 FP16 |
| 载入显存层数 | 决定多少模型层放在 GPU | 增加层数通常也会增加显存占用 |
| 自定义 CUDA 算子 | 启用 RWKV Pip 的 CUDA 算子 | 出现加载失败或输出异常时先关闭 |
| 并行 Token 块大小 | 单次并行处理的 token 数 | 增大可能加快预处理,也会占用更多显存 |
| 量化层数 | 让更多层使用较低精度 | 通常降低显存占用,也可能影响生成质量 |
## 自定义模型配置示例
下面用 AMD 核显运行 RWKV7-G1 1.5B 翻译模型。由于设备不能使用 CUDA,本例选择 WebGPU (Python),并把官方 `.pth` 转换为 `.st`。
### 新建配置
进入配置页面,点击 `+`。填写配置名称,其他解码参数先保持默认。
### 选择并转换模型
在“模型”栏选择下载好的 RWKV7-G1 1.5B,将 Strategy 设为 `WebGPU (Python)`。如果模型是 `.pth`,点击“转换”生成 `.st` 文件。
### 运行模型
重新打开“模型”选项,选择生成的 `.st` 文件并点击“运行”。状态栏显示加载完成后,发送一条短消息确认模型能够回答。
选择 CPU(rwkv.cpp)时,转换结果会使用类似 `fp16.bin` 的旧版 GGML 文件名,不能当作 `.st` 或 `.gguf` 加载。
## 进阶功能
### 挂载 State
先对照文件名确认架构和模型规模:
| 检查项 | 基底模型 | State | 结果 |
| ---- | -------------- | -------- | ------ |
| 架构 | RWKV-6(`x060`) | `x060` | 必须一致 |
| 参数规模 | 7B | 7B | 必须一致 |
| 文件用途 | 提供完整模型权重 | 提供训练后的状态 | 两者配合使用 |
下图中运行的是 RWKV-6 7B,因此应选择名称同时包含 `x060` 和 `7B` 的 State。保存后不需要重新启动后端。
### Function Call
Function Call 需要模型本身具备工具调用能力。RWKV 基底模型不能直接使用该功能;本节界面示例使用社区微调的 [Mobius-RWKV-r6-12B](https://huggingface.co/TimeMobius/Mobius-RWKV-r6-12B/tree/main)。
### 打开函数调用
在聊天页面打开“函数调用”开关:
### 填写工具定义
“工具定义”只告诉模型函数名称和参数,不会自动访问天气服务:
```json copy
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
```
### 返回工具结果
你的程序执行函数后,把结果填写到“工具返回值”。模型会根据这段数据继续回答:
```json copy
{"location": "Paris", "temperature": "22", "unit": "celsius"}
```
运行前安装 `openai`,并确认 Runner API 地址和端口正确。示例函数使用固定数据,不会真正查询天气。
```python copy
from openai import OpenAI
import json
client = OpenAI(
base_url="http://127.0.0.1:8000/v1",
api_key="rwkv",
)
def get_current_weather(location, unit="celsius"):
return json.dumps(
{"location": location, "temperature": "22", "unit": unit}
)
messages = [{"role": "user", "content": "What's the weather like in Paris?"}]
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
},
},
"required": ["location"],
},
},
}
]
response = client.chat.completions.create(
model="rwkv",
messages=messages,
tools=tools,
tool_choice="auto",
)
assistant_message = response.choices[0].message
messages.append(assistant_message)
for tool_call in assistant_message.tool_calls or []:
arguments = json.loads(tool_call.function.arguments)
result = get_current_weather(
location=arguments["location"],
unit=arguments.get("unit", "celsius"),
)
messages.append(
{
"role": "tool",
"tool_call_id": tool_call.id,
"name": tool_call.function.name,
"content": result,
}
)
if assistant_message.tool_calls:
final_response = client.chat.completions.create(
model="rwkv",
messages=messages,
)
print(final_response.choices[0].message.content)
else:
print(assistant_message.content)
```
## 服务器部署
下面以 Debian / Ubuntu 和 RWKV Runner 1.9.12 为例。先让 API 只监听服务器本机,验证完成后再添加 WebUI、systemd 和反向代理。
| 开始前检查 | 验证命令或信息 |
| --------------------- | ------------------------------------------ |
| 已经通过 SSH 登录服务器 | 当前终端可以执行 `sudo` |
| 显卡驱动可用 | NVIDIA 用户执行 `nvidia-smi` |
| 知道模型的实际路径和格式 | 例如 `/opt/models/model.pth` 或 `.gguf` |
| Python 与 PyTorch 环境匹配 | 上游主要使用 Python 3.10;PyTorch 需匹配 CUDA 或 ROCm |
### 1. 安装后端
```bash
sudo apt update
sudo apt install -y git python3.10 python3.10-venv python3.10-dev build-essential ninja-build
git clone --depth=1 https://github.com/josStorer/RWKV-Runner.git
cd RWKV-Runner
python3.10 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip wheel
python -m pip install torch torchvision torchaudio
python -m pip install -r backend-python/requirements.txt
```
安装完成后检查 PyTorch 是否识别 CUDA:
```bash
python -c "import torch; print(torch.cuda.is_available())"
```
| 输出 | 下一步 |
| ----------------------- | ------------------------- |
| `True` | 可以继续使用 CUDA Strategy |
| `False`,计划使用 CPU | 继续启动服务,Strategy 使用 CPU |
| `False`,计划使用 NVIDIA GPU | 先检查驱动、CUDA 和 PyTorch 安装来源 |
Albatross 没有匹配的预编译算子时会现场编译,因此还需要 Python 开发头文件、C/C++ 编译器、Ninja 和对应的 CUDA / ROCm 工具链。
### 2. 启动 API 服务
```bash
source .venv/bin/activate
python backend-python/main.py --host 127.0.0.1 --port 8000
```
保持当前终端运行,再新建一个 SSH 会话检查状态:
```bash
curl http://127.0.0.1:8000/status
```
返回包含 `status`、`pid` 和 `device_name` 的 JSON,说明 API 已经启动。尚未加载模型时,`status` 为 `0`,设备也可能显示为 CPU。
| 参数 | 默认值 | 说明 |
| ---------------------- | ----------- | ----------------------------- |
| `--host` | `127.0.0.1` | 监听地址;只在已配置防火墙和网关时使用 `0.0.0.0` |
| `--port` | `8000` | API 与 OpenAPI 文档端口 |
| `--backlog` | `2048` | 等待接受的 socket 连接上限 |
| `--timeout-keep-alive` | `120` | 空闲 HTTP Keep-Alive 秒数 |
| `--no-access-log` | 关闭 | 禁用 Uvicorn 逐请求日志 |
| `--webui` | 关闭 | 挂载已经构建的 Runner 前端 |
| `--rwkv.cpp` | 关闭 | 把非 GGUF 模型交给 rwkv.cpp |
| `--webgpu` | 关闭 | 把非 GGUF 模型交给 WebGPU Python 后端 |
Runner 的启动入口固定使用一个 Uvicorn Worker。需要扩展 RWKV-7 并发时,调整 Albatross 的 `workers` 和 `batch`;运行多个独立 Runner 进程时,应分别规划端口、GPU 和显存,避免多个进程争用同一份 GPU 资源。
### 3. 加载并验证模型
第一次加载保留 `"deploy": false`,以便配置错误时仍能切换模型。把示例路径替换成服务器上的真实文件名。
```bash
curl http://127.0.0.1:8000/switch-model \
-X POST -H 'Content-Type: application/json' \
-d '{"model":"models/rwkv7-g1-2.9b-20250519-ctx4096.pth","strategy":"cuda fp16","customCuda":true,"deploy":false}'
```
诊断变量必须在启动 Python 服务前设置:
```bash
export ALBATROSS_PROFILE=1
export ALBATROSS_TPS_LOG_INTERVAL=30
python backend-python/main.py --host 127.0.0.1 --port 8000
```
在另一个终端加载模型:
```bash
curl http://127.0.0.1:8000/switch-model \
-X POST -H 'Content-Type: application/json' \
-d '{"model":"models/rwkv7-g1-2.9b-20250519-ctx4096.pth","strategy":"albatross workers=1 batch=32","deploy":false}'
```
```bash
curl http://127.0.0.1:8000/switch-model \
-X POST -H 'Content-Type: application/json' \
-d '{"model":"models/rwkv7-g1-2.9b-ctx4096-Q6_K.gguf","strategy":"cuda 8192","deploy":false}'
```
模型加载成功后发送最小聊天请求:
```bash
curl http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"rwkv","messages":[{"role":"user","content":"你好"}],"max_tokens":64}'
```
| 检查点 | 正常结果 |
| --------- | --------------------------- |
| Runner 日志 | 没有显存不足、格式错误或算子编译失败 |
| `/status` | `status` 为 `3` |
| 聊天响应 | JSON 中出现 `choices` 和模型生成的文本 |
`/switch-model` 会等待模型加载完成后再响应。客户端超时但 `/status` 仍为 `2` 时,服务端仍可能正在加载,不要立即重复提交。
### 4. 启动 WebUI
只调用 API 可以跳过此步。需要浏览器界面时构建前端:
```bash
cd frontend
npm ci
npm run build
cd ..
python backend-python/main.py --host 127.0.0.1 --port 8000 --webui
```
只提供静态前端、不启动推理 API:
```bash
python backend-python/webui_server.py
```
### 5. 使用 systemd 常驻运行
将下面内容保存为 `/etc/systemd/system/rwkv-runner.service`,并替换用户和安装路径:
```ini
[Unit]
Description=RWKV Runner API
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=rwkv
WorkingDirectory=/opt/RWKV-Runner
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/RWKV-Runner/.venv/bin/python backend-python/main.py --host 127.0.0.1 --port 8000 --no-access-log
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
```
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now rwkv-runner
sudo systemctl status rwkv-runner
journalctl -u rwkv-runner -f
```
`active (running)` 表示服务已启动;`journalctl` 可持续查看日志。模型仍需由受保护的启动脚本或内部流程加载。
### 6. 对外服务检查清单
| 必须检查 | 原因 |
| --------------------------------------------------- | --------------------- |
| 使用 Nginx、Caddy 或 API 网关提供 TLS 与鉴权 | Runner 后端本身不能代替公网安全网关 |
| 阻止公网访问 `/switch-model`、`/exit`、State Cache 和服务器文件接口 | 这些接口会修改进程状态或访问服务器文件 |
| 在网关和业务层限制请求体、并发数、超时与 `max_tokens` | 避免单次请求长时间占用推理资源 |
| 监控 `/status`、进程、显存、首 token 延迟和吞吐 | 及时发现加载失败、显存不足和性能下降 |
| 使用专用低权限账户运行服务 | 限制模型、缓存和日志目录的可写范围 |
所有请求字段和响应格式请参考 [RWKV Runner API 指南](./API-Usage)。
# 连接 MIDI 设备
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Step, Steps } from 'fumadocs-ui/components/steps'
RWKV Runner “作曲” 功能支持使用 MIDI 硬件创建旋律,这个章节介绍如何为 RWKV Runner 配置 MIDI 硬件输入。
RWKV Runner 上游已较长时间未维护 MIDI 作曲功能。本页内容可能与当前操作系统、配套软件或 Runner 界面不完全一致,请以实际界面为准。
如果你没有实体的 MIDI 键盘, 可以使用像 Virtual Midi Controller 3 LE 这样的虚拟 MIDI 输入软件,再配合 loopMIDI,即可使用普通电脑键盘作为 MIDI 输入。
[loopMIDI 下载](https://www.tobias-erichsen.de/wp-content/uploads/2020/01/loopMIDISetup_1_0_16_27.zip)
## 连接 USB 接口的 MIDI 设备
USB 接口的 MIDI 设备是即插即用的,你能够在 RWKV Runner 作曲界面选择已插入的 USB MIDI 输入设备:
## MacOS 的 MIDI 蓝牙连接
对于想要使用蓝牙输入的 Mac 用户,请安装 Bluetooth MIDI Connect。
启动 Bluetooth MIDI Connect 后,点击托盘连接,之后可以在作曲界面选择你的输入设备。
## Windows 系统的 MIDI 蓝牙连接
注意:如果你正在使用 Windows 11 ,请确保系统在 Windows 11 23H2 及以上版本。22H2 及之前版本有概率出现 BUG,导致 MIDIberry 的蓝牙任务无法正常运作。
Windows 系统只为 UWP 实现了蓝牙 MIDI 支持,因此我们需要创建一个虚拟的 MIDI 设备,并通过 UWP 程序将实体蓝牙 MIDI 设备的输入重定向到虚拟的 MIDI 设备,再将输出提供给 RWKV Runner 。
听起来似乎有些复杂,但无需担心,只需跟着以下几个步骤操作即可:
### Step 1: 使用 loopMIDI 创建一个本地的虚拟 MIDI 设备
首先,我们需要下载用于创建虚拟 MIDI 设备的 loopMIDI 软件。
下载完成后,打开 loopMIDI 并点击左下角的加号,创建一个虚拟的 MIDI 设备(如下图中的 loopMIDI Port ):
### Step 2: 使用 Bluetooth LE Explorer 连接实体 MIDI 设备的蓝牙
第二步,你需要下载 Bluetooth LE Explorer,以发现并连接实体的蓝牙 MIDI 设备。
[Bluetooth LE Explorer 下载地址](https://apps.microsoft.com/detail/9N0ZTKF1QD98)
打开 Bluetooth LE Explorer,点击 “Start” 搜索设备, 然后点击 “Pair” 绑定实体 MIDI 设备(下图中的 Vboard 49 为实体 MIDI 键盘的蓝牙名称)。
### Step 3: 将实体 MIDI 设备的蓝牙输入重定向到虚拟的 MIDI 设备
在这一步,你需要安装 MIDIberry,这个 UWP 应用能将实体 MIDI 设备的蓝牙输入重定向到虚拟的 MIDI 设备。
启动 MIDIberry 后, 在输入栏双击你?实际的蓝牙 MIDI 设备名称( Vboard 49 ),并在输出栏双击此前使用 loopMIDI 创建的虚拟 MIDI设备名称(loopMIDI Port):
### Step 4: 使用 RWKV Runner 监听虚拟 MIDI 设备的输入
完成以上步骤后,实体 MIDI 设备的蓝牙已被映射到虚拟的 MIDI 设备上,此时可以在 RWKV Runner 的作曲界面选择虚拟 MIDI 设备(loopMIDI Port)作为输入。
连接完毕即可使用 RWKV Runner 创作.
此时保持 MIDIberry 软件打开即可。可以关闭 Bluetooth LE Explorer 软件,也可以关闭 loopMIDI 窗口,它会自动在后台运行。
# 常见问题
## 配置和运行问题
### 我的 Nvidia 显卡可以正常使用,但是开启自定义 CUDA 算子加速会报错
先打开 Runner 的“设置”页,查看“Pytorch 版本”和驱动 CUDA 版本。Windows 版 Runner 会根据驱动选择受支持的 PyTorch/CUDA 组合。不要通过查找某个固定版本的文件夹来判断环境是否正常。
* \*\*使用 Runner 自带环境:\*\*如果版本为空、显示 CPU 版,或安装过程曾经中断,请在“设置”页重新选择 PyTorch 版本,等待 Runner 完成安装。
* \*\*使用自定义 Python:\*\*请在该环境中安装 CUDA 版 PyTorch 和 `ninja`。
* \*\*暂时不使用自定义算子:\*\*在“配置”页关闭“使用自定义 CUDA 算子加速”。
***
### Torch not compiled with CUDA enabled
这表示当前 Python 环境加载的是 CPU 版 PyTorch,或 Runner 使用了错误的 Python 路径。
* \*\*使用 Runner 自带环境:\*\*在“设置”页重新选择 PyTorch 版本并完成安装。
* \*\*使用自定义 Python:\*\*确认“自定义 Python 路径”正确,并在该环境中安装 CUDA 版 PyTorch。不再使用该环境时,可以清空这个设置。
***
### 我使用 7B 或更大参数的 RWKV 模型,运行不成功或速度太慢。
模型能否运行取决于模型规模、精度、后端、上下文长度和可用内存,不能只用一组固定显存数字判断。请先尝试 1.5B 或 3B 模型。
如果仍需降低占用,可以选择以下方式:
* 使用 WebGPU (Python) 的 NF4/INT8 `.st` 模型
* 使用 llama.cpp 的量化 GGUF 模型
不同格式需要选择对应的 Strategy,具体操作见[自定义模型配置](./Advanced-Usage#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B)。
***
### 启动提示:切换模型失败 - 自定义 CUDA 算子开启失败 XXXX
这个问题通常由 Python 依赖没有安装完整、安装了 CPU 版 PyTorch,或自定义 Python 环境缺少编译工具引起。建议按以下顺序排查:
1. 在“设置”页重新选择 PyTorch 版本,等待安装窗口执行完成。
2. 如果其他 Python 依赖也不完整,双击 Runner 目录中的 `install-py-dep.bat` 重新安装,并确认过程中没有下载错误。
3. 使用自定义 Python 时安装 CUDA 版 PyTorch 和 `ninja`,或者返回“配置”页关闭“使用自定义 CUDA 算子加速”。
***
### 模型输出的内容乱码
请先更新显卡驱动。如果无法解决问题,请打开 Runner 配置页,关闭“自定义 CUDA 算子加速”后重试。
***
### 为什么使用 webgpu 模式的配置页没有 state 选项?
RWKV Runner 只有 Cuda 模式(NVIDIA 显卡)支持挂载 state。
非 NVIDIA 显卡需要使用 [Ai00](../ai00/Introduction) 才能搭载 State 文件。
## 开发和部署问题
***
### RWKV Runner 是否可以作为其他 LLM API 的前端使用?
可以。在“设置”页填写目标服务的 `API URL` 和 `API Key`。目标服务需要兼容 OpenAI API 格式。
***
### 三方应用 API 接口调用报错
先确认 Runner 已加载模型并启动 API 服务,再按照 [API 调用文档](./API-Usage) 中的完整 cURL 示例测试本机接口。若本机调用正常、第三方应用仍然报错,再核对第三方应用填写的端口、接口路径和请求格式。
***
### 软件自动更新下载不动,想要手动下载覆盖,正确操作姿势
* \*\*手动更新 Runner:\*\*从 [RWKV Runner Releases](https://github.com/josStorer/RWKV-Runner/releases) 下载适合当前系统的版本,关闭正在运行的 Runner,再将新版本解压到单独目录。先保留旧目录,确认模型和配置迁移完成后再清理。
* \*\*重新检查程序文件和依赖:\*\*关闭 Runner,删除可自动生成的 `cache.json`,然后重新启动 Runner。
* \*\*部署到离线环境:\*\*不要删除 `cache.json`。请先在同系统、同架构的联网电脑上完成依赖安装,再将整个 Runner 目录复制到离线电脑,并测试模型加载是否正常。
空的 `cache.json` 不代表依赖已经安装完成,不能用来跳过离线部署准备。
***
### 内网离线环境更新 python API
当前版本的 Runner 会准备 `backend-python`,不需要逐个下载其中的 Python 文件。请在同系统、同架构的联网电脑上启动同一版本的 Runner,等待程序文件和 Python 依赖安装完成,再将整个 Runner 目录复制到内网电脑,并测试模型加载和 API 服务是否正常。
***
### 点击安装依赖后,几个黑窗一闪而过
请检查下载列表所有内容是否都已经下载完毕,下载完毕后再点击安装依赖。
* 如果下载列表有未完成的下载任务,请手动点一下继续。
* 如果下载列表是空的,说明本地文件都正常,可以安装依赖。
如果安装停在 Python 软件包下载阶段,可以在“设置”页切换“使用阿里云Pip镜像源”后重试。离线部署请按照上一节准备完整目录。
***
### Python 依赖无法下载,可不可以手动下载
不建议只下载 `backend-python` 或 `get-pip.py`。Runner 仍需根据 `backend-python/requirements.txt` 安装 Python 软件包,这两个文件本身不能组成完整环境。
* \*\*电脑可以联网:\*\*在“设置”页切换“使用阿里云Pip镜像源”,再重新安装依赖。
* \*\*电脑无法联网:\*\*在同系统、同架构的联网电脑上完成同版本 Runner 的依赖安装,再复制整个 Runner 目录,并测试模型加载是否正常。
# 简介
RWKV Runner 是 RWKV 模型的管理和启动工具,由 RWKV 开源社区成员 [josStorer](https://github.com/josStorer) 开发,它本身也是一个开源软件,且体积仅 10MB 左右(不含依赖项)。
RWKV Runner 仓库地址:[https://github.com/josStorer/RWKV-Runner](https://github.com/josStorer/RWKV-Runner)
用户可使用 RWKV Runner 轻松运行本地 RWKV 模型,体验各类 AI 功能,包括但不限于聊天、写作、作曲交互等。
## 👀 功能预览
RWKV runner 可提供基于 RWKV 模型的聊天、写作、作曲三项基础功能。
如果你不知道如何提示 RWKV 模型,才能让它更好地完成某项任务。可以从以下途径获得 RWKV-Prompts(提示词)参考:
1. 参考我们整理的 [RWKV-Prompts(提示词)示例](../../../docs/RWKV-Prompts/Prompt-Examples#聊天模式)
2. 加入 RWKV QQ 群:224287095 ,在群里提问(请附上任务文本)
### 聊天功能
软件提供了开箱即用的聊天功能,你可以与 AI 畅聊、提出问题并获取建议。
### 写作功能
写作功能可根据你提供的文本内容作进一步的续写、翻译等任务。
### 作曲功能
作曲功能可提供基于 MIDI 格式的乐谱创作、续写等功能,同时为生成的乐谱提供播放功能。
MIDI(Musical Instrument Digital Interface)是一种音乐数字化协议,它不传输录制的声音,而是使用标准化的数据格式来描述各种音乐元素,例如音符音调信息、旋律、节奏、声音效果等等。
# LoRA 微调
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
若要微调当前 RWKV 模型,请使用 [RWKV-PEFT 的 MiSS 教程](../../advanced/Fine-Tune/RWKV-PEFT/MiSS)。
RWKV Runner 内置的 LoRA 训练功能已经过时,Runner 作者也已明确短期内不会接入 PEFT。本页仅供仍在维护旧版 Runner 训练流程的用户参考。
LORA(Low-Rank Adaptation)是一种针对大型预训练模型的微调技术。它不改变原始模型大部分参数,而是仅通过引入两个低秩矩阵来调整模型的部分权重,以此实现对特定任务的有效优化。这种方法能够在保持模型原有泛化能力的同时,减少微调所需资源,并提高特定任务的性能。
RWKV Runner 的“训练”版块支持一键 LoRA 微调 RWKV 模型,但目前仅支持在 Windows 系统中使用 WSL 训练。
下文会引导你启用 WSL2(Windows Subsystem for Linux)并安装 Ubuntu。如果已经配置完成,可以跳过对应步骤。
## LoRA 训练环境配置
在开始训练之前,我们需要先配置一次 LoRA 训练的环境。
以下步骤详细指导如何在一台新电脑上配置 RWKV Runner 的 LoRA 训练环境,请确保配置全程处于畅通的网络。
### 选择基底 RWKV 模型,转换训练数据
打开 RWKV Runner 的`训练` - `训练参数`一栏,选择你要使用的基底模型,然后点击训练按钮。
初次执行时,系统会提示你数据需要转换,点击上方的转换按钮,将训练数据转换为更适合训练的 binidx 格式。
### 开启 WSL ,激活 Linux 环境
再次点击训练,RWKV Runner 将会尝试开启 Windows WSL 功能,激活 Linux 环境。
此操作会要求管理员权限,你需要点击确认,并在弹出的窗口完成激活。
激活后建议重启电脑,如果之前已经开启过 WSL 功能,则可以不进行重启。
### 更新 WSL 版本
打开 PowerShell,依次运行:
```powershell
wsl --update
wsl --set-default-version 2
```
第二条命令会将新安装的 Linux 发行版默认设为 WSL2。
### 安装并初始化 Ubuntu
再次点击训练。RWKV Runner 会检查 Windows 是否已经安装 Ubuntu。如果没有找到,Runner 会提示你进行安装。
Windows 家庭版或专业版用户点击弹窗中的安装按钮后,Microsoft Store 会打开 Ubuntu 的安装页面。点击安装,完成后再点击打开,让 Ubuntu 执行初始化配置。
服务器版 Windows 通常没有 Microsoft Store,请按照 [Microsoft 的 WSL 手动安装说明](https://learn.microsoft.com/windows/wsl/install-manual) 安装 Ubuntu,然后返回 Runner。
### 为 Ubuntu 配置训练环境
继续点击训练按钮,现在将会为 Ubuntu 配置训练环境。在这个阶段,RWKV Runner 界面将会出现一系列命令文本,并下载多个组件。
此阶段请保证你的网络畅通:
Ubuntu 训练环境只需要配置一次。
### 开始 LoRA 训练
在环境配置完毕后,RWKV Runner 将自动开始训练,当你见到这个图形化 Loss 曲线时,意味着训练已正式开始。
### 合并训练权重
根据你设置的保存间隔轮次,在 LoRA 模型一栏,将会出现多个训练完成的 LoRA 权重,你可以选择一个权重,并点击合并模型按钮。
合并模型将会生成一个直接可用的新微调模型,新的微调模型会带有 LoRA 后缀。
此时可在 **RWKV Runner** 的配置页面选择新的微调模型并正常启动。
## LoRA 微调的参数设置
以下是 RWKV Runner 中 LoRA 微调的**数据参数**设置:
**数据处理调整**
* 数据路径:可以填写一个 JSONL 文件,也可以填写一个包含 TXT 文件的文件夹。
* \*\*JSONL 文件:\*\*数据格式请参考 [RWKV 微调数据集](../../advanced/Fine-Tune/FT-Dataset)
* \*\*文件夹:\*\*Runner 会将文件夹中的 TXT 文件转换为训练数据,适合批量导入写作、代码或知识库文本
* 词表路径: 默认情况下不需要修改。词表路径指向一个包含模型可识别的所有单词或标记(tokens)的列表的文件。在自然语言处理(NLP)中,词表(或词汇表)是模型用来理解输入文本的基础。每个单词或标记都会被映射到一个唯一的数字ID,模型使用这些ID来处理和生成文本。
**训练参数调整**
以下是 LoRA **训练参数**的作用和推荐设置:
| 模型参数 | 描述 |
| -------- | --------------------------------------------------------- |
| 基底模型 | 选取一个本地 RWKV 模型,作为 LoRA 微调的起点 |
| LoRA 模型 | 从某个 LoRA 权重继续训练。如果为空,则表示从基底预训练模型开始进行 LoRA 微调。 |
| 合并模型(按钮) | 训练得到的 LoRA 要与基底模型合并后使用,目前还不支持直接挂载 LoRA 。 |
| 显卡数量 | 使用多少块 GPU 进行训练,在单机多卡或者分布式环境下可以设置大于 1。 |
| 精度 | 通常选择 BF16,这是 RWKV 的官方训练精度。 |
| 梯度检查点标志 | 开启梯度检查点可以节省内存消耗,通过牺牲一些计算效率来换取更小的内存使用量。 |
| 上下文长度 | 训练出来的模型能处理的任务(对话/聊天等)的上下文长度,如果你训练数据量很大,可以适当加长(建议 4096 以内) |
其他参数主要涉及到优化器配置和学习率策略:
* 每轮训练步数、训练轮次、起始轮次、保存间隔轮次等参数控制着整体训练流程。一般情况下保持默认,可根据数据集的大小适当增大训练步数和训练轮次。
* 初始学习率和最终学习率控制学习率变化。Adam Epsilon、Beta 1、Beta 2 影响优化器更新权重的方式。一般情况下保持默认即可。如需修改学习率,请不要大于 `1e-4`。
还有一些特定于 LoRA 的超参:
* LoRA R 和 LoRa Alpha 用于控制低秩适应层(Low-Rank Adaptation layer)大小。根据训练的数据量和任务复杂情况,两者可保持一定的比例同时增大,如 LoRA R = 64, LoRA Alpha 128。
* LoRA Dropout 是低秩适应层中 dropout 的比例,一般保持默认即可。
其他开关,如`前馈网络预处理`和 `Head QK` ,正常情况下保持关闭即可。
## LoRA 微调参考示例
以下是 RWKV 开源社区开发者 @Seikaijyu 基于 RWKV-6-World 3B v2 模型进行 Lora 微调的 roleplay (角色扮演)模型:
##
此次 LoRA 微调使用全新的 180M 全中文数据集:
使用如下参数,在 RWKV-Runner 中进行 21 个 epoch 的 LoRA 微调:
# 快速入门
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
这部分文档以 RWKV Runner `1.9.12` 为例,为刚接触 RWKV 大模型的用户介绍安装、模型选择和启动流程。后续版本的模型、后端和显存预设以 Runner 界面与 release 说明为准。
Runner 的“后端”是不同推理实现的入口。第一次使用时,可以先采用界面提供的预设配置;运行 RWKV-7 时,RWKV Pip 和 Albatross 都可以处理本地单会话,Albatross 还支持在 CUDA 或 ROCm GPU 上调度并发请求。两者的生成速度、首 token 延迟和显存占用需要在同一设备、模型与生成参数下实际比较。需要 GGUF 模型时则会使用 llama.cpp。详细差异见[高级配置](./Advanced-Usage)。
遵循以下步骤,应该可以成功使用 RWKV Runner 驱动本地 RWKV 模型,体验 RWKV 模型的魅力。
## 下载与安装
RWKV Runner 仓库支持 Windows、MacOS、Linux 平台。
* [Windows下载](https://github.com/josStorer/RWKV-Runner/releases/latest/download/RWKV-Runner_windows_x64.exe)
* [MacOS 下载](https://github.com/josStorer/RWKV-Runner/releases/latest/download/RWKV-Runner_macos_universal.zip)
* [Linux 下载](https://github.com/josStorer/RWKV-Runner/releases/latest/download/RWKV-Runner_linux_x64)
若 Github 下载链接无法打开或下载速度太慢,可以在[Baidu 网盘中下载](https://pan.baidu.com/s/1zdzZ_a0uM3gDqi6pXIZVAA?pwd=1111)对应的安装包。
无论下载哪个版本,请将 RWKV Runner 软件放在一个空目录(空白文件夹)内再执行,因为 RWKV Runner 会自动在当前目录存放所有依赖文件。
## 准备启动环境
在体验 RWKV Runner 的 AI 功能之前,需要确保设备中安装了 Python 和 Pytorch 等依赖项,这是 RWKV Runner 正常运作的前提。
以下两种方法可为你的 RWKV Runner 软件提供完整的启动环境:
### 通过 RWKV Runner 自动下载
首次打开 RWKV Runner 软件时,点击“运行”按钮,软件会提示你缺失 Python 等依赖项。
跟随软件的引导逐步点击 “安装”,RWKV Runner 会为你自动下载并安装所需的文件。
耐心等待,直到所有依赖项完成下载。
下载完成后。命令行窗口会自动关闭
***
一切依赖项下载完成后,放置 RWKV Runner 的文件夹应该会有标准的离线环境目录结构,如下图:
其中 `models` 文件夹用于存放 RWKV 模型,RWKV Runner 默认从此文件夹读取本地 RWKV 模型。
启动环境只需在首次启动 RWKV Runner 时配置一次。
对于 Mac 和 Linux 用户,请手动安装 Python3.10 (通常最新的系统已经内置了)。此外,你可以在设置中指定使用的 Python 解释器。
### 下载懒人包
直接下载 [Baidu 网盘](https://pan.baidu.com/s/1zdzZ_a0uM3gDqi6pXIZVAA?pwd=1111)中的懒人包,然后在一个空白的目录中解压懒人包。
只需下载约 11G 的懒人包即可,请勿下载网盘中所有文件
懒人包中预置了 RWKV Runner 软件本体和 Python 、Pytorch 等所有依赖项,以及一个 3B 的 RWKV 模型。将其下载至本地并在**空白目录**中解压,即可正常使用。
## 模型配置与运行
完成启动环境的配置后,我们可以开始下一步:选择预设模型配置、下载并运行 RWKV 模型。
### 什么是预设模型配置?
为了照顾新手用户,RWKV Runner 内置了一系列预设模型配置,以降低使用难度。
每个模型配置名称的规则,依次代表着:设备-所需显存-模型规模-模型类型。例如 GPU-4G-3B-RWKV,表示该配置需要 4G 显存,模型规模为 30 亿(3B)参数,使用的是 RWKV 模型。
参数规模越大的模型通常需要更多内存或显存,但实际回答效果还取决于模型版本、训练数据和具体任务,不能只根据参数量判断。第一次使用时,可以先选择设备能够稳定运行的模型,再用自己的问题比较不同版本。
选择一项预设的模型配置后,点击右下角的 `运行` 按钮,即可运行对应的模型。
如果你尚未拥有该预设配置所需的 RWKV 模型,请点击弹窗的“下载”按钮,系统将自动为你下载对应的模型文件。(如果模型下载失败或无响应,请看下一个章节:模型下载方法)
等待模型下载完成,再度点击 `运行` 按钮,即可启动模型并运行各类 AI 功能。
## RWKV 模型下载方法
有几种方法可以下载 RWKV 模型:
### RWKV Runner 下载(默认)
在 RWKV runner 的“模型”版块,可以筛选并下载 RWKV 模型。
注意:如果你无法科学上网,请先勾选 `使用 Hugging Face 镜像源` 再下载模型。
### 通过网站下载
如果 RWKV runner 的下载任务迟迟未响应,你可以按以下步骤手动下载:
1. 在浏览器中下载 RWKV 模型
2. 将下载的 RWKV 模型放在 RWKV Runner 的 `models` 文件夹中
建议优先在 RWKV-7 G1 模型仓库中选择权重。同一参数量下,优先选择模型卡当前推荐、日期较新的版本;较小模型更容易在本地运行,但能力边界与较大模型不同,请按任务测试后选择。
* [Hugging Face 主站](https://huggingface.co/BlinkDL/rwkv7-g1/tree/main)
* [Hugging Face 镜像站](https://hf-mirror.com/BlinkDL/rwkv7-g1/tree/main)(国内可访问)
* [ModelScope 仓库](https://modelscope.cn/models/Blink_DL/rwkv7-g1/files)(国内可访问)
* [WiseModel 仓库](https://wisemodel.cn/models/rwkv4fun/RWKV-7-G1/file)(国内可访问)
其他模型下载链接请参考:[模型下载](../../basic/Model-Download)
# Ai00 API 文档
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { ApiReference, ApiSchemaSection, ApiField } from 'components-docs/api-reference/api-reference.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
本页介绍 Ai00 Server **v0.7.1** 当前提供的推理与管理接口。如果你第一次调用 Ai00,可以先完成下面的最小聊天请求;需要查找字段时,再展开对应接口的请求主体和响应结构。
* 默认地址:`http://localhost:65530`
* Swagger UI:[http://localhost:65530/api-docs](http://localhost:65530/api-docs)
* OpenAPI JSON:[http://localhost:65530/api-docs/openapi.json](http://localhost:65530/api-docs/openapi.json)
* 上游路由源码:[crates/ai00-server/src/api](https://github.com/Ai00-X/ai00_server/tree/main/crates/ai00-server/src/api)
## 发送第一个聊天请求
开始之前,请先按照 [Ai00 轻松使用](./Simple-Usage) 启动服务并加载一个 RWKV 模型。可以先查询当前模型:
```bash
curl http://localhost:65530/api/oai/v1/models
```
如果响应的 `data` 中出现模型名称,说明服务和模型已经准备完成。接着发送一条最小聊天请求:
```bash
curl http://localhost:65530/api/oai/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "user", "content": "请用一句话介绍 RWKV" }
],
"max_tokens": 128,
"stream": false
}'
```
```powershell
$body = @{
messages = @(
@{ role = "user"; content = "请用一句话介绍 RWKV" }
)
max_tokens = 128
stream = $false
} | ConvertTo-Json -Depth 4
Invoke-RestMethod `
-Uri "http://localhost:65530/api/oai/v1/chat/completions" `
-Method Post `
-ContentType "application/json" `
-Body $body
```
成功响应的 `choices[0].message.content` 是模型生成的回答。如果请求无法连接,请先确认 Ai00 的监听地址、端口和 TLS 配置;如果接口可以访问但不能生成,请检查模型是否已经加载,以及终端中是否出现显存或模型格式错误。
上面的请求只使用了最必要的字段。`names`、`template`、采样器和 State 等配置可以在确认基础调用成功后逐步添加。
## 按任务选择接口
大多数应用只会使用聊天补全或文本续写。State、候选排序和管理接口用于更具体的集成场景,不需要在第一次调用时全部实现。
### OpenAI 风格与推理接口
| 方法与路径 | 说明 |
| ----------------------------------- | ----------------------------------------- |
| `POST /api/oai/v1/chat/completions` | 聊天补全,支持普通和 SSE 流式响应 |
| `POST /api/oai/v1/completions` | 单条或批量文本续写 |
| `POST /api/oai/v1/chooses` | 按困惑度为候选文本排序 |
| `POST /api/oai/v1/states` | 从输入文本生成 RWKV State |
| `POST /api/oai/v1/embeds` | 可选外部 Embedding 模型;仅启用 `embed` feature 时存在 |
| `GET /api/oai/v1/models` | 返回当前模型名称 |
`/api/oai/v1/embeds` 使用独立的文本 Embedding 模型,并不是从当前加载的 RWKV 模型中提取向量。只需要聊天或续写时,可以忽略这个接口。
### 运行时与管理接口
| 方法与路径 | 说明 |
| ----------------------------------------- | ---------------------------------- |
| `GET /api/adapters` | 列出可用 GPU / WebGPU Adapter |
| `GET /api/models/info` | 当前模型、量化、LoRA、State 等运行时信息 |
| `GET /api/models/list` | 列出模型目录中的模型 |
| `GET /api/models/state` | 每半秒推送运行时信息的 SSE |
| `POST /api/auth/exchange` | 使用 app\_id / app\_secret 换取管理员 JWT |
| `POST /admin/models/load` | 加载模型、LoRA 和初始 State |
| `POST /admin/models/save` | 将当前模型保存为 prefab |
| `GET /admin/models/unload` | 卸载当前运行时 |
| `POST /admin/files/unzip` | 解压服务器文件 |
| `POST /admin/files/dir`、`/admin/files/ls` | 列出服务器目录 |
| `POST /admin/files/config/load` | 读取配置文件 |
| `POST /admin/files/config/save` | 写入配置文件 |
## 聊天补全
聊天补全适合多轮对话,也是普通应用最常用的接口。每次请求应把当前对话所需的消息放入 `messages`;Ai00 会按照 `template` 将它们拼接后交给 RWKV 模型。
## 文本续写
文本续写直接接在 `prompt` 后生成内容,不会自动组织 system、user、assistant 等聊天角色。它适合补全文本、批量续写,或由你的应用自行拼接提示词的场景。
## 候选排序
如果你的应用已经准备了多个候选答案,可以使用这个接口计算每个候选项的困惑度,并让 Ai00 按匹配程度排序。困惑度越低,表示候选文本越符合当前模型对输入内容的预测。
## 生成 State
RWKV State 可以理解为模型阅读一段文本后的内部状态。这个接口适合预先处理固定背景、角色设定或较长的公共前缀,再在后续请求中复用结果。返回的 State 数据可能很大,请不要把完整响应直接写入普通业务日志。
## 外部 Embedding 模型
这个接口不使用当前加载的 RWKV 模型。只有在 Ai00 构建时启用了 `embed` feature,并且另外加载了文本 Embedding 模型时,路由才可用。
## 模型信息
在发送生成请求前,可以先调用这个接口确认 Ai00 当前加载的是哪个模型。它也适合作为应用启动时的简单连通性检查。
## 采样器格式
普通调用可以直接使用请求顶层的 `top_p`、`top_k` 和 `temperature`。只有需要完整控制采样方法时,才传入 `sampler` 对象;一旦提供 `sampler`,其中的配置会覆盖顶层采样参数。
### Nucleus
```json
{
"type": "Nucleus",
"top_p": 0.5,
"top_k": 128,
"temperature": 1,
"presence_penalty": 0.3,
"frequency_penalty": 0.3,
"penalty_decay": 0.99654026
}
```
### Mirostat
```json
{
"type": "Mirostat",
"tau": 3,
"rate": 0.1
}
```
### Typical
```json
{
"type": "Typical",
"tau": 0.5,
"top_k": 128,
"temperature": 1,
"presence_penalty": 0.3,
"frequency_penalty": 0.3,
"penalty_decay": 0.99654026
}
```
## 管理员鉴权
推理接口用于生成内容,管理接口则可以加载模型、修改配置或操作服务器文件。两类接口应使用不同的访问控制策略。
`/admin/*` 会读取、写入或重新加载服务器文件。生产环境应关闭 `force_pass`,通过 `/api/auth/exchange` 获取管理员 JWT,并把管理端点限制在可信网络内。
先在 `Config.toml` 中配置管理应用的 `app_id` 和 `app_secret`,再调用下面的接口换取 JWT。不要把 `app_secret` 写入浏览器端代码或公开仓库。
换取令牌后,推荐通过 `Authorization: Bearer ` 请求头调用管理接口。查询参数 `admin_token=` 也能提交令牌,但它更容易出现在代理和访问日志中,不建议在生产环境使用。
## 加载模型、LoRA 与 State
这个管理接口会销毁当前运行时,并按照请求内容重新加载模型。第一次调试时建议只填写 `model_path` 和必要的精度参数;确认模型能够加载后,再逐步加入 LoRA、State 和量化设置。
如果不确定应该选择哪张显卡,先把 `adapter` 设置为 `"Auto"`。经济模式写作 `"Economical"`;手动选择通常写作 `{ "Manual": 0 }`,其中数字来自 `GET /api/adapters` 返回的显卡索引。
## 其他管理端点
下面列出 WebUI 和自动化部署可能使用的管理接口。普通聊天客户端不需要调用这些端点。
| 端点 | 请求与响应 |
| -------------------------- | ---------------------------------------- |
| `POST /admin/models/save` | `{ "path": "model.prefab" }`;成功返回空 `200` |
| `GET /admin/models/unload` | 无请求主体;卸载完成后返回空 `200` |
| `GET /api/models/info` | 返回 `reload`、`model`、`states` 完整运行时信息 |
| `GET /api/models/state` | SSE,每半秒发送一次运行时信息 |
| `GET /api/adapters` | 返回字符串数组,例如 `["NVIDIA ...", "AMD ..."]` |
| `GET /api/models/list` | 返回允许模型目录中的模型信息 |
文件管理端点接收服务器路径,适合 WebUI 自身使用,不建议作为通用公网 API。调用 `/admin/files/unzip`、`dir/ls`、`config/load` 或 `config/save` 前,应同时使用 JWT、反向代理访问控制和独立的模型目录权限。
## 响应与类型约定
下面这些规则在多个接口中重复出现。开发客户端时可以集中实现,避免为每个端点编写不同的解析逻辑:
* Ai00 的 token 统计字段是 `prompt`、`completion`、`total`。
* `finish_reason` 可能是 `stop`、`length`、`content_filter` 或 `null`。
* `stop`、`prompt`、`input` 使用 Ai00 的 `Array` 类型,通常同时接受单值和数组。
* `state` 可以是 UUID,也可以传完整 State 数据或 State 文件描述对象。
* 流式聊天使用 `chat.completion.chunk`;流式续写使用 `text_completion.chunk`。
## 历史与兼容接口
以下路径和字段仅用于维护历史客户端,不应作为新集成的实现依据。标记为“已移除”的接口在当前版本中不可用。
### 兼容路径
| 历史或兼容路径 | 已确认版本状态 | 当前接口 |
| -------------------------------- | ---------- | ----------------------------------- |
| `POST /api/oai/chat/completions` | v0.7.1 仍兼容 | `POST /api/oai/v1/chat/completions` |
| `POST /api/oai/completions` | v0.7.1 仍兼容 | `POST /api/oai/v1/completions` |
| `POST /api/oai/chooses` | v0.7.1 仍兼容 | `POST /api/oai/v1/chooses` |
| `POST /api/oai/states` | v0.7.1 仍兼容 | `POST /api/oai/v1/states` |
| `POST /api/oai/embeds` | v0.7.1 仍兼容 | `POST /api/oai/v1/embeds` |
| `GET /api/oai/models` | v0.7.1 仍兼容 | `GET /api/oai/v1/models` |
### 已移除接口
| 历史接口 | 使用版本 | 当前替代方式 |
| -------------------------------------------------------- | ------------------------ | ------------------------------------------- |
| `POST /api/oai/embeddings`、`POST /api/oai/v1/embeddings` | v0.4.9–v0.5.14;v0.6.0 移除 | `POST /api/oai/v1/embeds` |
| `POST /admin/models/state/load` | v0.5.0–v0.5.14;v0.6.0 移除 | 在 `POST /admin/models/load` 的 `state` 字段中加载 |
### 兼容请求字段
| 历史字段 | v0.7.1 当前字段 | 适用请求 |
| ------------------ | ----------- | ------------ |
| `logit_bias` | `bias` | 聊天补全、文本续写 |
| `sampler_override` | `sampler` | 聊天补全、文本续写 |
| `learning_rate` | `rate` | Mirostat 采样器 |
# 进阶功能
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
除了驱动 RWKV 模型进行对话、续写之外,Ai00 还有许多进阶功能,比如挂载 State 文件、LoRA 文件、BNF 等等。
你可以在 Ai00 发布新版本的时候回到本页面,以查看 Ai00 的最新功能。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1vQCzYXEtb)观看。
## 挂载 State 文件 \[版本 0.4.9]
挂载 State 文件可以强化模型在某一类任务的表现。以一个强化单轮问答 + emoji 的 State 为例,同样都是“东京到巴黎怎么走”这个问题,模型在挂载该 State 前后的回答画风完全不同:
**不挂载 State 文件:**
**挂载“强化单轮中文对话 + Emoji ”的 State 文件后:**
### 下载 State 文件
Ai00 Server 目前仅支持 `.state` 后缀的 State 文件,可以从 [HF 仓库](https://huggingface.co/shoumenchougou/RWKV-6-State-for-st/tree/main)下载 `.state` 文件。
如果你无法访问上面的网站,请访问 [HF 镜像站](https://hf-mirror.com/shoumenchougou/RWKV-6-State-for-st/tree/main)。
### 如何挂载 State 文件
在 `Config.toml` 配置文件中修改关于挂载 State 的参数:移除 `#` 注释符号,并修改对应的参数。
参考的配置信息如下:
```bash copy
[[state]] # 是否挂载 state
# id = "fd7a60ed-7807-449f-8256-bccae3246222" # 非开发环境一般不指定 UUID,可保留注释符
name = "x060-7B-Chinese" # 为此 state 文件命名为“x060-7B-Chinese”
path = "rwkv-x060-chn_single_round_qa-7B-20240516-ctx2048.state" # state 文件的名称,存放在 `model` 文件夹
```
启动 RWKV 模型后,在 WebUI 界面的右上角可以切换 State 文件。
### 挂载 State 注意事项
注意:挂载 state 文件时,必须使用与 State 文件参数一致的基底 RWKV 模型。
举个例子:这个 State 文件是基于 `RWKV-6-World-7B` 模型微调而来,那么你在 Ai00 中必须启动 `RWKV-6-World-7B` 模型,挂载的 State 文件才会生效。
截至 Ai00 0.5.0 版本,支持在 WebUI-聊天模式右上方动态切换 State,但不支持同时挂载多个 State 。
***
## 挂载 LoRA 模型 \[版本 0.4.9]
挂载 LoRA 模型和 State 的效果相似,也可以增强模型在某类任务上的表现。
### 如何挂载 LoRA 模型 ?
可以在 `Config.toml` 文件配置中修改挂载 LoRA 模型的参数:
```bash copy
# [[lora]] # 是否默认启用 LoRA
# alpha = 192 # alpha 值越大, LoRA 对模型输出的影响越大
# path = "assets/models/rwkv-x060-3b.lora" # LoRA 文件的路径
```
要启用 LoRA 挂载功能,请移除 `#` 注释符号,并修改对应的参数。参考如下:
```bash copy
[[lora]] # 默认启用 LoRA
# alpha = 192 # alpha 值越大, LoRA 对模型输出的影响越大
path = "assets/models/rwkv-x060-3b.lora" # LoRA 文件的路径
```
### 挂载 LoRA 文件的注意事项
与挂载 state 相似,挂载 LoRA 文件时,必须使用与 LoRA 模型参数一致的基底 RWKV 模型。
举个例子:这个 LoRA 文件是基于 `RWKV-6-World-3B` 模型微调而来,那么你在 Ai00 中必须启动 `RWKV-6-World-3B` 模型,挂载的 LoRA 文件才会生效。
截至 Ai00 0.5.0 版本,支持在 WebUI 中同时加载多个 LoRA ,但不支持在 WebUI 中动态切换 LoRA。
这意味着想要取消 LoRA ,必须重启 Ai00 服务。
***
## BNF (Backus-Naur Form) \[版本 0.4.9]
BNF 可以强制模型以您想要的格式输出(例如,JSON、带有指定字段的 markdown)。
以下是一个 JSON 的 BNF 示例,其中包含字段 `name`、`age` 和 `job` :
```rust copy
start ::= json_object;
json_object ::= "{\n" object_members "\n}";
object_members ::= json_member | json_member ",\n" object_members;
json_member ::= "\t" json_key ": " json_value;
json_key ::= '"' "name" '"' | '"' "age" '"' | '"' "job" '"';
json_value ::= json_string | json_number;
json_string ::= '"'content'"';
content ::= #"\\w*";
json_number ::= positive_digit digits|'0';
digits ::= digit|digit digits;
digit ::= '0'|positive_digit;
positive_digit::="1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";
```
使用此 prompt ,模型会以 JSON 格式输出文本:
```bash copy
User: Create a profile for John with name, age and job, in json format.
Assistant:
```
***
## 以 prefab 格式使用量化模型\[版本 0.4.9]
**什么是 prefab 格式?prefab 格式的 RWKV 模型有什么用?**
`.prefab` 预制件通常指游戏开发中使用的一种资源格式,允许开发者创建、保存和复用游戏对象(GameObject)及其组件的配置。
Ai00 支持导入和导出 `.prefab` 格式的 RWKV 模型,这种格式可以附带量化类型和量化层数,从而节省加载 RWKV 模型的在线量化时间。
在 Ai00 的 WebUI - Setting 界面,可以以 `.prefab` 格式导出当前加载的 RWKV 模型,并附带量化类型和量化层数。
在 `Config.toml` 配置文件中,可以通过修改模型路径参数使用 `.prefab` 格式的 RWKV 模型。
```bash copy
# [[model]]
path = "rwkv-x060-3b.prefab" # 指定 prefab 格式的 RWKV 模型路径
```
使用 `.prefab` 格式的 RWKV 模型时,无需指定量化类型和量化层数,模型会自动加载 prefab 文件中记录的量化信息。
# Ai00 常见问题
## 访问 `https://localhost:65530` 加载失败
A:如果你在 `Config.toml` 设置了 `tls = false` ,则需要将 https 改为 http,即访问 `http://localhost:65530`
## 为什么我在 config 里面把 tls=true 改成了 false,启动的时候还是把 tls 打开了?
A:如果设置了 ACME 的话,TLS 无论如何都是打开的。
## 在自己电脑上可以成功运行,在 autodl 上报错。
A:autodl 不支持 vulkan,无法使用。
## 为啥电脑有多张显卡时,跑 AI00 只有一张显卡在干活的感觉
A:AI00 暂时不支持多显卡推理。
## 报错: ERROR \[ai00 server::middleware] reload model failed: failed to request adaptor
A:这是因为设备缺少 vulkan 驱动,请安装最新版本驱动。
## AI00 支持 CUDA 驱动吗?
A:不支持。AI00 支持 Vulkan 作为推理后端,曾经支持 Dx12/openGL ,但不支持 CUDA 驱动。
## 为什么我使用共享显存后感觉速度变慢了
A:一旦用了共享显存,运行速度会慢 20 倍。这是计算机硬件的工作原理,并非 bug。
倘若大家遇到其他问题,欢迎加入 RWKV QQ 群 224287095 或 Ai00 QQ 群 30920262 提问。
# Ai00 简介
## 简介
Ai00 Server 是基于 web-rwkv 推理引擎的 RWKV 语言模型推理 API 服务器。它本身也是一个基于 MIT 协议的开源软件,由 RWKV 开源社区成员 [@cryscan](https://github.com/cryscan) 和[@顾真牛](https://github.com/cgisky1980)牵头成立的 Ai00-x 开发组开发。
Ai00 Server 支持 Vulkan 作为推理后端,支持 Vulkan 并行和并发批量推理,可以在所有支持 Vulkan 的 GPU 上运行。事实上, Ai00 Server 支持大部分 NVIDIA、AMD、Intel 的显卡(包括集成显卡)。
在高兼容性的同时,Ai00 Server 又不需要笨重的 pytorch 、 CUDA 和其他运行时环境。它结构紧凑,开箱即用,且支持 INT8/NF4 量化,可以在绝大部分的个人电脑上高速运行。
Ai00 Server 仓库地址:[https://github.com/Ai00-X/ai00\_server](https://github.com/Ai00-X/ai00_server)
这篇新手教程旨在为一些刚接触 RWKV 大模型和 Ai00 Server 的朋友们提供指引。遵循本文的步骤,应该可以成功使用 Ai00 Server 本地运行 RWKV 模型,并进行各种任务,包括聊天、文本生成、翻译和问答。
## 功能预览
**聊天功能**
与模型对话,聊天或提出问题让模型回答。
**续写功能**
使 RWKV 模型根据你给定的内容进行续写。
也可以使用特定格式的 prompt ,让模型遵循某种指令执行任务。具体的 prompt 实现请参阅:[RWKV 提示词示例(续写模式)](../../../docs/RWKV-Prompts/Prompt-Examples#续写模式)
**写论文**
从给定的论文标题生成论文提纲,再根据提纲生成论文内容。
# 轻松使用
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
## Ai00 推理视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1TUiBYHEPW)观看。
## 下载与安装
对于新手来说,我们建议直接从 Ai00 Server 的 [Release 页面](https://github.com/Ai00-X/ai00_server/releases)下载最新版本。
在每个版本发布的 Assets 版块可以找到已经打包好的 Ai00 Server 压缩包,下载并解压即可使用。
* `aarch64-apple-darwin`: 适用于 Apple M 系列芯片的 macOS 系统
* `x86_64-apple-darwin`: 适用于 Intel 芯片的 macOS 系统
* `x86_64-pc-windows-msvc`: 适用于 Windows 64位系统
* `x86_64-unknown-linux-gnu`: 适用于 Linux 64位系统
## Ai00 的显存需求
以下是 Ai00 不同量化方式的显存需求:
测试环境:
* CPU :i7-10870H
* GPU: RTX 4090 ,24G 显存
* 内存:32GB
| 量化方式 | 1B6 模型 | 3B 模型 | 7B 模型 | 14B 模型 |
| ---- | -------- | -------- | --------- | --------- |
| FP16 | 3.2GB 显存 | 6.5GB 显存 | 14.4GB 显存 | 约 29G 显存 |
| INT8 | 2GB 显存 | 4.4GB 显存 | 8.2GB 显存 | 14.8GB 显存 |
| NF4 | 1.3GB 显存 | 2.6GB 显存 | 5.2GB 显存 | 10.4GB 显存 |
默认量化所有层。量化层数越高,显存占用越低,但模型效果可能变差。
## 下载/转换 RWKV 模型
Ai00 Server 目前仅支持 `.st` 后缀的 Safetensors 模型,有两种方法可以得到 `.st` 模型。
如果你本地没有任何模型权重,建议直接从仓库中下载 `.st` 模型,如果你本地已经存在 `.pth` 文件,可以根据下列转换教程将 `.pth` 转换为 `.st` 。
从以下仓库中下载已经转换好的 `.st` 模型:
* [RWKV-7 ModelScope 仓库](https://modelscope.cn/models/shoumenchougou/RWKV-7-World-ST/files) (推荐)
* [RWKV-6 ModelScope 仓库](https://modelscope.cn/models/shoumenchougou/RWKV-6-World-ST/files)
首先进入 [Python](https://www.python.org) 官网下载并安装 Python,然后使用 `pip` 安装需要的库:
```bash copy
pip install numpy torch safetensors
```
接着将 `.pth` 文件移动到 `dist/assets/scripts` 目录中,启动终端并执行以下命令,将指定的 `.pth` 模型转化成 `.st` 模型:
```bash copy
python convert_safetensors.py --input ./model.pth --output ./model.st
```
请将上述命令中的 `./model.pth` 改成需要转换的 `.pth` 模型文件;\
同时将 `./model.st` 改成目标的 `.st` 模型文件。
下图为运行成功的示例,注意要使用 `./` 相对路径,否则部分系统无法直接读取到当前文件路径。
获得 `.st` 后缀的 RWKV 模型后,在 Ai00 的 `dist/assets` 目录中新建一个 `models` 文件夹,并将 RWKV 模型放在此文件夹中。
## 调整配置参数
Ai00 程序会按照 `assets/configs/Config.toml` 配置文件中的参数运行 `RWKV` 模型。可以通过文本编辑软件(如记事本等)修改 `Config.toml` 的配置项,调整模型的运行效果。
下面是一组示例 `Config.toml` 配置。
```bash copy
[model]
embed_device = "Cpu" # 在 GPU 还是 CPU 上放置模型的 Embed 矩阵
max_batch = 8 # 【不建议更改】GPU 上缓存的最大批次
name = "RWKV-x060-World-3B-v2.1-20240417-ctx4096.st" # 模型名称,只支持后缀 .st 格式模型,请下载转换好的模型或自行转换
path = "assets/models" # 模型存放的路径
precision = "Fp16" # 【不建议更改】中间张量精度 ("Fp16" or "Fp32"),Fp32 精度更高但速度更慢
quant = 0 # 量化层数,调高会提升效率,但可能损失精度,使模型效果变差
quant_type = "Int8" # 量化类型 ("Int8" 或 "NF4"),Int 8 效果比 NF4 好,但需要更多显存
stop = ["\n\n"] # 【不建议更改】添加额外的生成停止词
token_chunk_size = 128 # 并行 Token 块大小,范围 32-128,显卡越牛逼这个数调越大(64 或 128)
# [[state]] # 是否挂载 state 文件
# id = "fd7a60ed-7807-449f-8256-bccae3246222" # state 文件的 UUID,不指定则随机分配
# name = "x060-3B" # 是否为此 state 文件命名(可选项),可填 null
# path = "rwkv-x060-chn_single_round_qa-3B-20240505-ctx1024.state" # state 文件的路径,存放于 assets/models 目录下可填文件名称
# [[state]] # 继续挂载多个 state 文件
# id = "6a9c60a4-0f4c-40b1-a31f-987f73e20315" # state 文件的 UUID,不指定则随机分配
# name = "x060-7B" # 是否为此 state 文件命名(可选项),可填 null
# path = "rwkv-x060-chn_single_round_qa-3B-20240502-ctx1024.state" # 第二个 state 文件的路径,存放于 assets/models 目录下可填文件名称
# [[lora]] # 是否默认挂载 LoRA 文件
# alpha = 192 # LoRA 文件的 alpha 值
# path = "assets/models/rwkv-x060-3b.lora" # LoRA 文件的路径
[tokenizer]
path = "assets/tokenizer/rwkv_vocab_v20230424.json" # 【不建议更改】分词器路径
[bnf]
enable_bytes_cache = true # 【不建议更改】是否启用缓存机制,以加速 BNF 某些短模式(schemas)的展开过程。
start_nonterminal = "start" # 【不建议更改】指定 BNF 模式中的初始非终结符。
[adapter]
Auto = {} # 【不建议更改】自动选择最佳 GPU。
# Manual = 0 # 手动指定使用哪个 GPU,可以通过 API (get)http://localhost:65530/api/adapters 获取可用的 GPU 列表
[listen]
acme = false # 【不建议更改】是否启用 acme 证书
domain = "local" # 【不建议更改】Ai00 服务域名
ip = "0.0.0.0" # IPv4 地址
# ip = "::" # 使用 IPv6
force_pass = true # 是否强制通过鉴权步骤,改成 false 以使用密钥鉴权,从而控制 admin 系列 API 的访问权限
port = 65530 # Ai00 服务端口
slot = "permisionkey"
tls = false # 是否使用 https ,如果你只在本地体验 AI00 ,建议设置为 false
[[listen.app_keys]] # 添加多个用于管理员鉴权的密钥
app_id = "admin"
secret_key = "ai00_is_good"
[web] # 【不建议更改】移除此项以禁用 WebUI
path = "assets/www/index.zip" # 【不建议更改】web 界面资源的路径
# 【不建议更改】启用第三方的嵌入模型(使用 fast-embedding onnx 模型)
# 使用 API(post)http://localhost:65530/api/oai/embeds 可以调用第三方嵌入模型进行 embedding 操作
# [embed] # 取消 [embed] 及以下注释,启用第三方嵌入模型
# endpoint = "https://hf-mirror.com" # 第三方嵌入模型来源
# home = "assets/models/hf" # 第三方嵌入模型存放路径
# lib = "assets/ort/onnxruntime.dll" # 仅在 windows 下使用
# name = { MultilingualE5Small = {} } # 第三方嵌入模型的名称
```
## 运行 Ai00 程序
配置项修改完毕后,请保存 `Config.toml` 文件,并双击运行 `ai00_server.exe` 程序。
当命令行中出现 `INFO [ai00_server::middleware] model loaded` 提示时,意味着模型已经加载完成:
此时我们打开任意浏览器,并访问 `http://localhost:65530`,即可打开 Ai00 的 Web 界面。
如果你在 config 文件中设置了 `tls = true` , 请访问 `https://localhost:65530`
## 调整右侧解码参数
Web 页面的右侧有一些可设置的模型解码参数,如 `Temperature` 、`Top_P`、`Presence Penalty` 和 `Frequency Penalty` ,调整这些参数会影响模型的生成效果。
参数对应的效果如下:
| 参数 | 效果 |
| ------------------- | -------------------------------------------------------------------------------------- |
| `Top_P` | 选择累积概率达到 $P$ 值的前 $N$ 个 token 作为候选集。如设置成 0.1 则考虑前 10% , 生成内容质量更高但更保守。设置成 1 则内容质量降低但更多样。 |
| `Temperature` | 温度参数 $T$ 通过修改 logits 的缩放比例控制生成结果的随机性。高温会使概率分布更均匀,增加生成内容的随机性;低温则使模型更倾向于选择概率最高的 token。 |
| `Presence penalty` | 存在惩罚,对**已出现过的所有 token** 施加**固定惩罚**,从而增加了模型生成新 token 的可能性。 |
| `Frequency Penalty` | 频率惩罚,根据 **token 出现的次数**进行**累加惩罚**,从而减少模型频繁地重复相同内容的可能性。 |
| `max_tokens` | 模型生成文本时的最大 token 数,可以理解为“模型一次最多生成多少字”。 |
更详细的解码参数解释和参数推荐查看[RWKV 的解码参数](../../basic/RWKV-Parameters)
# LoRA 微调教程
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
**LoRA 微调是什么?**
LORA(Low-Rank Adaptation)是一种针对大型预训练模型的微调技术。它不改变原始模型大部分参数,而是调整模型的部分权重,以此实现对特定任务的优化。
***
本文的 LoRA 微调方法来自 RWKV 社区微调项目 [RWKV-PEFT](https://github.com/Joluck/RWKV-PEFT)。
在开始 LoRA 微调之前,请确保你拥有一个 Linux 工作区,以及支持 CUDA 的 NVIDIA 显卡。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV12gExzjEPH/)观看。
## LoRA 显存参考
RWKV LoRA 微调的显存(GPU VRAM)需求可参考下表:
| 模型参数 | bf16 | int8 | nf4 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.7GB GPU | 2.5GB GPU | 2.4GB GPU |
| RWKV7-0.4B | 3.4GB GPU | 2.9GB GPU | 2.7GB GPU |
| RWKV7-1.5B | 5.6GB GPU | 4.6GB GPU | 3.9GB GPU |
| RWKV7-2.9B | 8.8GB GPU | 6.7GB GPU | 5.7GB GPU |
| 模型参数 | bf16 | int8 | nf4 |
| ---------- | ---------- | ---------- | ---------- |
| RWKV6-1.6B | 7.3GB GPU | 5.9GB GPU | 5.4GB GPU |
| RWKV6-3B | 11.8GB GPU | 9.4GB GPU | 8.1GB GPU |
| RWKV6-7B | 23.7GB GPU | 17.3GB GPU | 14.9GB GPU |
上表的数据基于以下训练参数:
* ctxlen=1024
* micro\_bsz=1
* strategy=deepspeed\_stage\_1
* peft\_config='\{"r":64,"lora\_alpha":32,"lora\_dropout":0.05}'
随着训练参数的变更,RWKV LoRA 微调所需显存会发生改变。
## 收集训练数据
你需要准备 JSONL 或 binidx 格式的训练数据,具体方法可参考[准备微调数据集](../FT-Dataset)。
## 配置训练环境
要训练 RWKV 模型,首先要配置 conda 等训练环境。具体过程请参考[RWKV 微调环境配置](../FT-Environment)板块。
## 克隆仓库并安装依赖
在 Linux 或 WSL 中,使用 git 命令克隆 RWKV-PEFT 仓库:
```bash copy
git clone https://github.com/Joluck/RWKV-PEFT.git
# 如果 GitHub 无法链接,请使用以下国内仓库:
git clone https://gitee.com/rwkv-vibe/RWKV-PEFT.git
```
克隆完成后,使用 `cd RWKV-PEFT` 命令进入 RWKV-PEFT 目录。并运行以下命令,安装项目所需依赖:
```bash copy
pip install .
```
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `RWKV-PEFT/scripts` 目录下的 `lora.sh` 文件,可以修改训练参数,进而控制微调的训练过程和训练效果:
以下是一次 LoRA 微调的调参过程:
### 调整路径参数
`lora.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和训练得到的 LoRA 文件输出路径
* data\_file:训练数据集的路径。使用 binidx 时填写 `.bin` 和 `.idx` 文件的共同前缀,不带文件后缀;使用 JSONL 时填写包含 `.jsonl` 后缀的完整文件路径。
### 调整 n\_layer 和 n\_embd 参数
不同参数的 RWKV 模型,训练时使用的 n\_layer 和 n\_embd 数值不一样
以下 RWKV 模型参数对应的 n\_layer/n\_embd 值:
| 模型参数 | n\_layer | n\_embd |
| ---- | -------- | ------- |
| 0.1B | 12 | 768 |
| 0.4B | 24 | 1024 |
| 1.5B | 24 | 2048 |
| 3B | 32 | 2560 |
| 7B | 32 | 4096 |
| 14B | 61 | 4096 |
### 调整重要训练参数
| 参数 | 描述 |
| --------------------- | ----------------------------------------------------------- |
| `micro_bsz=1` | 微批次大小,根据显存大小调整,微调时从 1 开始逐渐增大 |
| `epoch_save=5` | 每隔多少个训练轮次保存一次 LoRA 文件,注意存储空间是否充足 |
| `epoch_steps=1000` | 每个训练轮次的步数,增加会拉长单个 epoch 的训练时间 |
| `ctx_len=512` | 微调模型的上下文长度,建议根据语料长度修改 |
| `--my_testing "x070"` | 训练的 RWKV 模型版本,v7 选 `x070`,v6 选 `x060` ,v5 选 `x052`(已淘汰,不推荐) |
### 调整 LoRA 相关参数
`peft_config` 包含 LoRA 微调的参数,效果参考下表:
| 参数 | 描述 |
| -------------------- | ----------------------------------- |
| "r":8 | LoRA 微调的 rank 参数;增大该值会增加可训练参数量和显存占用 |
| "lora\_alpha":32 | LoRA 微调的 alpha 参数(缩放因子) |
| "lora\_dropout":0.05 | LoRA 微调的丢弃率 |
### 调整其他训练参数
下面列出了脚本中其他可修改的训练参数,及其修改的效果。
| 参数 | 描述 |
| ------------------------------ | ----------------------------------------------------------------------------- |
| `--vocab_size 65536` | 模型的词表大小,必须与基底模型一致;官方 RWKV World 模型使用 `65536` |
| `--data_type binidx` | 训练语料的文件格式。本教程使用 `jsonl` 或 `binidx` 格式 |
| `--epoch_count 5` | 总训练轮次 |
| `--lr_init 1e-5` | 初始学习率,当前 `lora.sh` 使用 `1e-5` |
| `--lr_final 1e-5` | 最终学习率,当前 `lora.sh` 使用 `1e-5` |
| `--accelerator gpu` | 使用的加速器类型,目前主要支持 `gpu`,`cpu` 基本不支持训练 |
| `--devices 1` | 显卡数量,单显卡填 `1`,多卡按实际数量填写 |
| `--precision bf16` | 训练数值精度,当前 `lora.sh` 使用 `bf16`;`train.py` 接受 `fp32`、`tf32`、`fp16` 和 `bf16` |
| `--strategy deepspeed_stage_1` | Lightning 训练策略;上游优先使用 `deepspeed_stage_1`,较大模型或全量微调可考虑 stage 2/3 及 offload 策略 |
| `--grad_cp 1` | 梯度检查点开关;`1` 会用额外计算时间换取较低显存占用,`0` 表示关闭 |
| `--peft lora` | 微调训练类型,LoRA 微调填 `lora` 即可 |
| `--op` | 选择 WKV 算子,支持 `cuda` 和 `fla`,默认使用 `cuda`;`fla` 使用基于 Triton 的 RWKV-FLA 算子 |
| `--wandb RWKV-PEFT-LoRA` | **可选**,是否使用 wandb 可视化记录训练日志,需提前配置 [wandb](https://wandb.ai/) 账号 |
| `--lr_schedule wsd` | **可选**,设为 `wsd` 时使用 WSD 学习率调度;不设置时默认使用 `cos` |
参数调整完成后,请记得保存 `lora.sh` 文件。
### 附录:lora.sh 配置参考
```bash copy filename="lora.sh"
load_model="/home/rwkv/model/rwkv7-g1-1.5b-20250429-ctx4096.pth"
proj_dir='/home/rwkv/JL/out_model/test'
data_file=/home/rwkv/JL/data/roleplay.jsonl
n_layer=24
n_embd=2048
micro_bsz=8
epoch_save=1
epoch_steps=200
ctx_len=128
peft_config='{"r":8,"lora_alpha":32,"lora_dropout":0.05}'
python train.py --load_model $load_model \
--proj_dir $proj_dir --data_file $data_file \
--vocab_size 65536 \
--data_type jsonl \
--n_layer $n_layer --n_embd $n_embd \
--ctx_len $ctx_len --micro_bsz $micro_bsz \
--epoch_steps $epoch_steps --epoch_count 4 --epoch_save $epoch_save \
--lr_init 1e-5 --lr_final 1e-5 \
--accelerator gpu --precision bf16 \
--devices 1 --strategy deepspeed_stage_1 --grad_cp 1 \
--my_testing "x070" \
--peft lora --peft_config $peft_config
# 以下是可选项
# --op cuda/fla (选择不同的算子,不加此参数则默认使用 cuda)
# --wandb RWKV-PEFT-LoRA (是否使用 wandb 监控训练过程)
# --lr_schedule wsd (使用 WSD 学习率调度;不设置时默认使用 cos)
```
## 开始训练
在 RWKV-PEFT 目录,运行 `sh scripts/lora.sh` 命令,开启 LoRA 微调 。
正常开始训练后,应当是如下画面:
## 如何使用 LoRA 权重文件
训练完毕后,可以在输出路径中找到完整的 LoRA 微调模型文件(`.pth` 格式)和训练日志(`.txt` 文件):
合并后的 LoRA 微调模型可以在 RWKV Runner 或者 Ai00 中正常使用。将微调模型放到 RWKV Runner 的 `models` 文件夹,然后新建配置,选择微调模型即可。
更多详细用法请参考 [RWKV Runner 教程](/tutorials/intermediate/RWKV-Runner/Simple-Usage) 和 [Ai00 教程](/tutorials/intermediate/ai00/Introduction)。
# MiSS 微调教程
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Step, Steps } from 'fumadocs-ui/components/steps'
**MiSS 微调是什么?**
[MiSS 微调](https://arxiv.org/abs/2409.15371)(Matrix Shard Sharing)是一种新颖的参数高效微调方法(PEFT,Parameter-Efficient Fine-Tuning),该方法使用一个初始值为零的共享可训练矩阵 $D$ 来更新原始权重矩阵的各个分片。
MiSS 通过让权重分片共享一个可训练矩阵来减少可训练参数;实际效果和资源占用仍取决于模型、数据集与训练配置。
***
本文的 MiSS 微调方法来自 RWKV 社区微调项目 [RWKV-PEFT](https://github.com/Joluck/RWKV-PEFT)。
在开始 MiSS 微调之前,请确保你拥有一个 Linux 工作区,以及支持 CUDA 的 NVIDIA 显卡。
## MiSS 微调案例
* [Seikaijyu/rwkv7-g1-1.5b-Lonely-Neko](https://huggingface.co/Seikaijyu/rwkv7-g1-1.5b-Lonely-Neko):基于 RWKV7-G1 1.5B 模型微调的猫娘模型,拥有较为优秀的单角色扮演能力
* [keepzmy/RWKV-V7-Soothe](https://huggingface.co/keepzmy/RWKV-V7-Soothe):基于 RWKV7-G1 2.9B 模型微调的心理咨询师模型
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1rJExzgEBX/)观看。
## MiSS 微调显存参考
RWKV MiSS 微调的显存(GPU VRAM)需求可参考下表:
| 模型参数 | bf16 | int8 | nf4 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.7GB GPU | 2.5GB GPU | 2.4GB GPU |
| RWKV7-0.4B | 3.1GB GPU | 2.9GB GPU | 2.7GB GPU |
| RWKV7-1.5B | 5.6GB GPU | 4.5GB GPU | 3.9GB GPU |
| RWKV7-2.9B | 8.8GB GPU | 6.7GB GPU | 5.7GB GPU |
| 模型参数 | bf16 | int8 | nf4 |
| ----------- | ---------- | ---------- | ---------- |
| RWKV-6-1.6B | 7.3GB GPU | 5.9GB GPU | 5.4GB GPU |
| RWKV-6-3B | 11.8GB GPU | 9.4GB GPU | 8.1GB GPU |
| RWKV-6-7B | 23.7GB GPU | 17.3GB GPU | 14.9GB GPU |
上表的数据基于以下训练参数:
* ctxlen=1024
* micro\_bsz=1
* strategy=deepspeed\_stage\_1
* peft\_config='\{"r":64}'
随着训练参数的变更,RWKV MiSS 微调所需显存会发生改变。
## 收集训练数据
MiSS 支持直接读取 JSONL 数据,也可以使用转换后的 binidx 数据,具体格式和准备方法可参考[准备微调数据集](../FT-Dataset)。
## 配置训练环境
请参考[RWKV 微调环境配置](../FT-Environment)板块,配置 Conda 等训练环境。
## 克隆仓库并安装依赖
在 Linux 或 WSL 中,使用 git 命令克隆 RWKV-PEFT 仓库:
```bash copy
git clone https://github.com/Joluck/RWKV-PEFT.git
# 如果 GitHub 无法链接,请使用以下国内仓库:
git clone https://gitee.com/rwkv-vibe/RWKV-PEFT.git
```
克隆完成后,使用 `cd RWKV-PEFT` 命令进入 RWKV-PEFT 目录。并运行以下命令,安装项目所需依赖:
```bash copy
pip install .
```
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `RWKV-PEFT/scripts` 目录下的 `miss.sh` 文件,可以修改训练参数,进而控制微调的训练过程和训练效果:
以下是一次 MiSS 微调的调参过程:
### 调整路径参数
`miss.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和训练得到的 MiSS 文件输出路径
* data\_file:训练数据集的路径。使用 `jsonl` 时需要填写包含 `.jsonl` 后缀的文件路径;使用 `binidx` 时填写数据文件前缀,不带 `.bin` 和 `.idx` 后缀。
### 调整 n\_layer 和 n\_embd 参数
不同参数的 RWKV 模型,训练时使用的 n\_layer 和 n\_embd 数值不一样
以下是 RWKV 模型参数对应的 n\_layer/n\_embd 值:
| 模型参数 | n\_layer | n\_embd |
| ---- | -------- | ------- |
| 0.1B | 12 | 768 |
| 0.4B | 24 | 1024 |
| 1.5B | 24 | 2048 |
| 3B | 32 | 2560 |
| 7B | 32 | 4096 |
| 14B | 61 | 4096 |
### 调整重要训练参数
| 参数 | 描述 |
| ----------------------- | ----------------------------------------------------------------------------- |
| `micro_bsz=1` | 微批次大小,根据显存大小调整,微调时从 1 开始逐渐增大 |
| `epoch_save=5` | 每隔多少个训练轮次保存一次 MiSS 文件,注意存储空间是否充足 |
| `epoch_steps=1200` | 每个训练轮次的步数,增加会延长单个 epoch 的训练时间 |
| `ctx_len=512` | 微调模型的上下文长度,建议根据语料长度修改 |
| `peft_config='{"r":8}'` | MiSS 微调的 rank 参数;上游 `miss.sh` 当前使用 `r=8`,增大 rank 通常会增加可训练参数和显存占用,实际取值需要结合任务测试 |
### 调整其他训练参数
下面列出了脚本中其他可修改的训练参数,及其修改的效果。
| 参数 | 描述 |
| ------------------------------ | ------------------------------------------------------------------------------------- |
| `--vocab_size 65536` | 模型词表大小,必须与基底模型一致;RWKV World 模型使用 `65536` |
| `--data_type binidx` | 训练语料的文件格式。本教程使用 `jsonl` 或 `binidx` 格式 |
| `--epoch_count 5` | 总训练轮次 |
| `--lr_init 1e-5` | 初始学习率,当前 `miss.sh` 使用 `1e-5` |
| `--lr_final 1e-5` | 最终学习率,当前 `miss.sh` 使用 `1e-5` |
| `--accelerator gpu` | 使用的加速器类型,目前主要支持 `gpu`,`cpu` 基本不支持训练 |
| `--devices 1` | 显卡数量,单显卡填 `1`,多卡按实际数量填写 |
| `--precision bf16` | 训练精度;上游 `miss.sh` 使用 `bf16`,程序支持 `fp32`、`tf32`、`fp16` 和 `bf16` |
| `--strategy deepspeed_stage_1` | Lightning 训练策略;上游 `miss.sh` 使用 `deepspeed_stage_1`。Stage 2/3 适用于更大的模型或全量微调,不是单纯的低显存开关 |
| `--grad_cp 1` | 是否启用梯度检查点;设为 `1` 可减少激活值占用的显存,但会增加重新计算开销,`0` 表示关闭 |
| `--my_testing "x070"` | 训练的 RWKV 模型版本,v7 选 `x070`,v6 选 `x060` ,v5 选 `x052`(已淘汰,不推荐) |
| `--peft miss` | 微调训练类型,MiSS 微调填 `miss` 即可 |
| `--op` | 选择 WKV 算子,支持 `cuda` 和 `fla`,默认使用 `cuda`;`fla` 使用基于 Triton 的 RWKV-FLA 算子 |
| `--wandb RWKV-PEFT-MiSS` | **可选**,是否使用 wandb 可视化记录训练日志,需提前配置 [wandb](https://wandb.ai/) 账号 |
| `--lr_schedule wsd` | **可选**,学习率调度方法,支持 `cos` 和 `wsd`,默认使用 `cos` |
### 附录:miss.sh 配置参考
```bash copy filename="miss.sh"
load_model='/home/rwkv/models/rwkv7-g1a3-1.5b.pth'
proj_dir='/home/rwkv/roleplay_1107_g1a3_1b5_73k_miss'
data_file='/home/rwkv/roleplay_data/73k-cn-en-doubao.jsonl'
n_layer=24
n_embd=2048
micro_bsz=4
epoch_save=1
epoch_steps=1000
ctx_len=4096
peft_config='{"r":8}'
python train.py --load_model $load_model \
--proj_dir $proj_dir --data_file $data_file \
--vocab_size 65536 \
--data_type jsonl \
--n_layer $n_layer --n_embd $n_embd \
--ctx_len $ctx_len --micro_bsz $micro_bsz \
--epoch_steps $epoch_steps --epoch_count 4 --epoch_save $epoch_save \
--lr_init 1e-5 --lr_final 1e-5 \
--accelerator gpu --precision bf16 \
--devices 4 --strategy deepspeed_stage_1 --grad_cp 1 \
--my_testing "x070" \
--peft miss --peft_config $peft_config
# 以下是可选项
# --op cuda/fla (选择不同的算子,不加此参数则默认使用 cuda)
# --wandb RWKV-PEFT-MiSS (是否使用 wandb 监控训练过程)
# --lr_schedule wsd (使用 WSD 学习率调度,不加此参数则默认使用 cos)
```
参数调整完成后,请记得保存 `miss.sh` 文件。
## 开始训练
在 RWKV-PEFT 目录,运行 `sh scripts/miss.sh` 命令,开启 MiSS 微调 。
正常开始训练后,应当是如下画面:
## 如何使用 MiSS 微调模型
训练完毕后,应当可以在输出文件夹中找到完整的 MiSS 权重文件(`.pth` 格式)和训练日志(`.txt` 文件):
合并后的 MiSS 模型可以在 RWKV Runner 或者 Ai00 中正常使用。将微调模型放到 RWKV Runner 的 `models` 文件夹,然后新建配置,选择微调模型即可。
更多详细用法请参考 [RWKV Runner 教程](/tutorials/intermediate/RWKV-Runner/Simple-Usage) 和 [Ai00 教程](/tutorials/intermediate/ai00/Introduction)。
# State Tuning 微调教程
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
**State Tuning 是什么?**
State Tuning 只训练 RWKV 模型的初始 State,不修改基底模型权重。训练结果是一个需要与原基底模型配套加载的 State 文件。
本文的 State tuning 方法来自 RWKV 社区微调项目 [RWKV-PEFT](https://github.com/Joluck/RWKV-PEFT)。
开始之前,请确保你拥有一个 Linux 工作区,以及支持 CUDA 的 NVIDIA 显卡。
## State tuning 微调案例
以下是社区训练的 RWKV-7 State 案例。目前 RWKV 官方尚未发布 RWKV-7 State,使用社区 State 时,请同时确认其对应的基底模型。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV18sqdBPE3e/)观看。
## State tuning 的显存需求
State tuning 的显存需求可参考下表:
| 模型参数 | bf16 | int8 | nf4 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.6GB GPU | 2.4GB GPU | 2.5GB GPU |
| RWKV7-0.4B | 3.1GB GPU | 2.9GB GPU | 2.8GB GPU |
| RWKV7-1.5B | 5.3GB GPU | 4.1GB GPU | 3.7GB GPU |
| RWKV7-2.9B | 8.2GB GPU | 5.7GB GPU | 4.7GB GPU |
| 模型参数 | bf16 | int8 | nf4 |
| ---------- | ---------- | ---------- | --------- |
| RWKV6-1.6B | 5.8GB GPU | 4.5GB GPU | 3.9GB GPU |
| RWKV6-3B | 8.7GB GPU | 6.2GB GPU | 4.9GB GPU |
| RWKV6-7B | 17.8GB GPU | 11.9GB GPU | 8.5GB GPU |
上表的数据基于以下测试参数:
* ctx\_len=1024
* micro\_bsz=1
* strategy=deepspeed\_stage\_1
## 整理训练数据
### 收集 jsonl 格式训练数据
要 state tuning 微调 RWKV 模型,需要使用收集适合训练 RWKV 的数据(jsonl 格式),具体方法可参考[准备微调数据集](../FT-Dataset)。
以下示例使用的是角色扮演数据:
## 配置训练环境
请参考[RWKV 微调环境配置](../FT-Environment)板块,配置 Conda 等训练环境。
## 克隆仓库并安装依赖
在 Linux 或 WSL 中,使用 git 命令克隆 RWKV-PEFT 仓库:
```bash copy
git clone https://github.com/Joluck/RWKV-PEFT.git
# 如果 GitHub 无法链接,请使用以下国内仓库:
git clone https://gitee.com/rwkv-vibe/RWKV-PEFT.git
```
克隆完成后,使用 `cd RWKV-PEFT` 命令进入 `RWKV-PEFT` 目录。并运行以下命令,安装项目所需依赖:
```bash copy
pip install .
```
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `RWKV-PEFT/scripts` 目录的 `state tuning.sh` 文件,修改训练参数,进而控制微调的训练过程和训练效果:
以下是一次 state tuning 调参过程:
### 调整路径参数
`state tuning.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和训练得到的 state 文件输出路径
* data\_file:训练数据集路径。使用 `jsonl` 时填写包含 `.jsonl` 后缀的完整文件路径;使用 `binidx` 时填写不带 `.bin` 和 `.idx` 后缀的文件名前缀。
### 调整 n\_layer 和 n\_embd 参数
基底 RWKV 模型的参数大小不同,训练时使用的 n\_layer 和 n\_embd 数值也不一样。以下是不同参数的 RWKV 模型和 n\_layer 和 n\_embd 数值的对照列表:
| 模型参数 | n\_layer | n\_embd |
| ---- | -------- | ------- |
| 0.1B | 12 | 768 |
| 0.4B | 24 | 1024 |
| 1.5B | 24 | 2048 |
| 3B | 32 | 2560 |
| 7B | 32 | 4096 |
| 14B | 61 | 4096 |
### 调整重要训练参数
| 参数 | 描述 |
| ------------------ | -------------------------------------- |
| `micro_bsz=1` | 微批次大小,根据显存大小调整,微调时从 1 开始逐渐增大 |
| `epoch_save=1` | 每隔多少个训练轮次保存一次 State 文件 |
| `epoch_steps=1000` | 每个训练轮次的步数,增加会拉长单个epoch的训练时间 |
| `ctx_len=512` | 微调模型的上下文长度,state tuning 建议从短开始尝试,如 512 |
### 调整其他训练参数
下面列出了脚本中其他可修改的训练参数,及其修改的效果。
当前上游 State Tuning 示例使用 `--lr_init 1e-5` 和 `--lr_final 1e-5`。建议先按示例完成一次训练,再根据训练结果调整学习率和 `ctx_len`。
| 参数 | 描述 |
| ------------------------------ | -------------------------------------------------------------------------------------------------------- |
| `--data_type jsonl` | 训练语料的文件格式。本教程使用 `jsonl`;选择 `jsonl` 时,`data_file` 包含文件后缀;改用 `binidx` 时,`data_file` 不包含 `.bin` 和 `.idx` 后缀 |
| `--vocab_size 65536` | 词表大小,必须与基底模型一致;RWKV World 模型使用 `65536` |
| `--epoch_count 5` | 总训练轮次,可根据效果调整 |
| `--pre_ffn 0` | 用 ffn 替换第一个 att 层,有时可能有益 |
| `--lr_init 1e-5` | 初始学习率,当前上游 State Tuning 示例使用 `1e-5` |
| `--lr_final 1e-5` | 最终学习率,当前上游 State Tuning 示例使用 `1e-5` |
| `--accelerator gpu` | 使用的加速器类型,目前主要支持 `gpu`, `cpu` 基本不支持训练 |
| `--devices 1` | 单显卡填 `1`,多卡按实际数量填写 |
| `--precision bf16` | 训练精度,当前上游 State Tuning 脚本使用 `bf16`;支持:`fp32`、`tf32`、`fp16`、`bf16` |
| `--strategy deepspeed_stage_1` | lightning 训练策略参数,微调推荐使用 `deepspeed_stage_1` |
| `--grad_cp 1` | 梯度检查点开关;`1` 可以节省显存,但会降低训练速度 |
| `--peft state` | 微调训练类型,state tuning 微调填 `state` 即可 |
| `--my_testing "x070"` | 训练的 RWKV 模型版本,v7 选 `x070`,v6 选 `x060` ,v5 选 `x052`(已淘汰,不推荐) |
| `--op fla` | State Tuning 使用的算子;与 `--peft state` 配合设置为 `fla` |
| `--wandb PEFT-State-tuning` | **可选**,是否使用 wandb 可视化记录训练日志,需提前配置 [wandb](https://wandb.ai/) 账号 |
| `--lr_schedule cos` | **可选**,学习率调度方法,默认为 `cos`,支持:`cos`、`wsd` |
参数调整完成后,请记得保存 `state tuning.sh` 文件。
### 附录:state tuning 配置参考
```bash copy filename="state tuning.sh"
load_model='/home/rwkv/RWKV-PEFT/models/rwkv7-g1a-0.1b-20250728-ctx4096.pth'
proj_dir='/home/rwkv/RWKV-PEFT/test-output'
data_file='/home/rwkv/RWKV-PEFT/data/test.jsonl'
n_layer=12
n_embd=768
micro_bsz=1
epoch_save=1
epoch_steps=300
ctx_len=1024
python train.py --load_model $load_model \
--proj_dir $proj_dir --data_file $data_file \
--vocab_size 65536 \
--data_type jsonl \
--n_layer $n_layer --n_embd $n_embd \
--ctx_len $ctx_len --micro_bsz $micro_bsz \
--epoch_steps $epoch_steps --epoch_count 4 --epoch_save $epoch_save \
--lr_init 1e-5 --lr_final 1e-5 \
--accelerator gpu --precision bf16 \
--devices 1 --strategy deepspeed_stage_1 --grad_cp 1 \
--my_testing "x070" \
--peft state --op fla
```
## 开始训练
在 RWKV-PEFT 目录,运行 `sh "scripts/state tuning.sh"` 命令,开启 state tuning 。
正常开始训练后,应当是如下画面:
训练完毕后,应当可以在输出文件夹中找到训练好的 state 文件(`.pth` 格式)和训练日志(`.txt` 文件):
## 如何使用 state 文件
获得 state 文件后,你可以如此使用:
* 使用 `merge/merge_state.py` 工具将 state 文件合并到基底 RWKV 模型中,获得一个完整的 state 微调模型。
* 在 RWKV Runner 或 Ai00 等工具中单独挂载 state 文件。(推荐用法)
由于 state 文件支持单独挂载,其他用户也可以通过挂载你训练出来的的 state 文件,增强 RWKV 模型的使用体验。
挂载 state 文件的方法可以参考 [RWKV Runner](../../../intermediate/RWKV-Runner/Advanced-Usage#挂载-state) | [Ai00](../../../intermediate/ai00/Ai00-Features)
注意:挂载 state 文件时,必须使用训练此 state 文件的同款 RWKV 模型。
举个例子:这个 state 文件是基于 `RWKV7-G1b-1.5B` 模型微调而来,那么你在 RWKV Runner 或 Ai00 等工具中必须启动 `RWKV7-G1b-1.5B` 模型,挂载的 state 文件才会生效。
我们的示例数据基于大量的角色扮演,训练出来的 State 文件具备一定的通用角色扮演能力: