# RWKV.CN Machine-Readable Summary
## RWKV Papers
RWKV.CN currently lists 247 RWKV-related papers. The catalog was last updated on 2026-08-07.
- 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: 247
- Last updated: 2026-08-07
## RWKV Projects
RWKV.CN currently lists 79 RWKV open-source and community projects. The catalog was last updated on 2026-06-26.
- 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: 79
- Last updated: 2026-06-26
## RWKV Models
RWKV.CN currently lists 26 RWKV models and fine-tuned model resources. The catalog was last updated on 2025-06-20.
- 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: 26
- Last updated: 2025-06-20
## RWKV News
RWKV.CN currently lists 100 RWKV news, activities, and articles. The catalog was last updated on 2026-06-15.
- 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-06-15
## 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 { 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'
# 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
### 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'
```
# 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'
## 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'
## 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 硬件上的推理性能,包括各类专业显卡、消费级显卡,甚至集成显卡。
此页面的数据来自:[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 等各类嵌入式/边缘计算设备。
## 高通骁龙 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 硬件上的推理性能。
此页面的数据来自:[RWKV 推理性能测试指南](https://github.com/RWKV-Vibe/RWKV-Inference-Performance-Test),数据均由社区成员测试并报告。欢迎大家参照仓库的指引进行测试,并提交 NVIDIA 硬件的性能数据。
{/* ## NVIDIA RTX 5090
| 推理工具 | 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 等硬件
## 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 模型在摩尔线程 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:代表不同量化策略或计算精度。
# 聊天模式的提示词示例
import { CallOut } from 'components-docs/call-out/call-out.tsx'
这个页面展示了多种**聊天模式**的 prompt 参考。在每个 prompt 示例的右上方可以一键复制文本,然后到 RWKV Runner/Ai00 等推理工具的文本框中粘贴使用。
此页面的 prompt 基于 RWKV7-G1 2.9B 模型的**聊天模式(chat mode)**。
随着模型版本和参数的调整,生成的结果可能会产生变化。
### ⭐ 撰写并翻译电子邮件(多语言)
该类任务既需要一定的创造力也需保证翻译的准确性,建议的参数:Temperature = 1、Top\_P = 0.2、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
Schreiben Sie einen Brief an meinen Professor und sagen Sie ihm, dass ich es nicht mehr tun werde!
```
**参考邮件输出:**
```markdown
Sehr geehrter Professor [Name],
ich schreibe heute an Sie, um Ihnen mitzuteilen, dass ich nicht länger bereit bin, an dem Projekt teilzunehmen. Ich möchte mich dafür entschuldigen, dass ich bisher nicht aktiv genug war und das Projekt nicht erfolgreich beenden konnte.
Ich habe versucht alles in meiner Macht Stehende zu tun, um das Projekt erfolgreich abzuschließen, aber es hat sich als unmöglich erwiesen. Ich hatte Schwierigkeiten mit der Planung des Projekts und hatte Probleme bei der Zusammenarbeit mit den anderen Teammitgliedern. Außerdem habe ich festgestellt, dass die Aufgaben zu komplex waren und mir fehlte die notwendige Zeit und Ressourcen um sie erfolgreich abzuschließen.
Ich möchte mich bei Ihnen dafür entschuldigen, dass ich bisher nicht aktiv genug war und das Projekt nicht erfolgreich beenden konnte. Ich werde alles in meiner Macht Stehende tun um diese Fehler wieder gutzumachen und das nächste Mal besser vorbereitet zu sein.
Ich hoffe Sie können mir verzeihen und mich weiterhin als Teil des Teams betrachten. Bitte lassen Sie mich wissen wenn ich etwas tun kann um das Projekt wieder auf den richtigen Weg zu bringen oder wenn Sie Hilfe benötigen.
Mit freundlichen Grüßen, [Ihr Name]
```
**继续输入 prompts:**
```markdown
翻译成中文
```
**参考输出:**
```markdown
亲爱的教授,
我今天写信给您,告诉您我不会再这样做了。我想向您道歉,因为我一直没有积极参与项目。
我尝试尽力而为,但是发现这个项目很困难。我遇到了计划项目的问题,也遇到了与团队成员合作的问题。此外,任务太复杂了,缺乏必要的时间和资源来完成它们。
对于没有积极参与项目以及未能成功完成它们感到抱歉。我将尽最大努力弥补这些错误并在下一次中更好地准备好。
请允许我向您道歉并继续将我视为团队的一员。如果需要帮助或任何其他方面需要帮助,请随时联系我。
谢谢您的理解和支持,
[你的名字]
```
**继续输入 prompts:**
```markdown
翻译成泰语
```
**参考输出:**
```markdown
สวัสดีครับ/ค่ะ [ชื่อของคุณ]
ฉันเขียนจดหมายนี้มาให้ท่านทราบว่าฉันจะไม่ทำอีกต่อไป!
ฉันพยายามทำทุกอย่างเพื่อให้โปรเจ็กต์ประสบความสำเร็จและไม่สำเร็จไปด้วย!
ฉันพยายามแก้ไขปัญหารูปแบบการทำงานของโปรเจ็กต์และไม่สำเร็จในการสิ้นสุดโครงการ!
ฉันขอโทษที่ไม่ได้มีส่วนร่วมให้กระตือรือลุกลื่นและไม่สำเร็จให้ถูกต้อง!
ฉันขอโทษที่ไม่ได้ช่วยเหลือให้โครงการประสบความสำเร็จและไม่ได้ชื่อว่ารูปแบบการทำงานที่ถูกต้อง!
ฉันขอโทษที่ไม่ได้ชื่อว่ารูปแบบการทำงานที่ถูกต้อง!
ฉันจะพยายามทุกวิธีเพื่อชดเชยผิดพลาดของฉันและให้คำปรึกษาระหว่างการทำงานใหม่!
ขอบคุณที่ได้ใช้เวลารูปแบบการทำงานที่ถูกต้อง!
[ชื่อของคุณ]
```
### ⭐ 撰写并修改请假邮件
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
Write an email to my professor, asking for a leave for today's group meeting.
```
**参考输出:**
```markdown
Dear Professor [Name],
I hope this email finds you well! I am writing to request a leave from today's group meeting at [Time]. Unfortunately, there is an urgent family matter that requires my immediate attention and cannot be postponed any further. As such, I kindly request permission to miss the meeting today without penalty or consequences on my academic record.
Please let me know if there are any alternatives available so that I can still participate in the group discussion remotely or at another time more convenient for everyone involved. Thank you very much for your understanding and support during this challenging situation!
Best regards,
[Your Name]
```
**继续输入 prompts,更新请假理由:**
```markdown
Actually the reason is that I am having a fever. Please update the email to include that information.
```
**参考输出:**
```markdown
Dear Professor [Name],
I hope this email finds you well! I am writing to request a leave from today's group meeting at [Time]. Unfortunately, there is an urgent family matter that requires my immediate attention and cannot be postponed any further due to fever symptoms affecting me physically (please see attached medical certificate). As such, I kindly request permission to miss the meeting today without penalty or consequences on my academic record.
Please let me know if there are any alternatives available so that I can still participate in the group discussion remotely or at another time more convenient for everyone involved. Thank you very much for your understanding and support during this challenging situation!
Best regards,
[Your Name]
```
**继续输入 prompts,移除"family matter"板块:**
```markdown
Please remove the "family matter" part.
```
**参考输出:**
```markdown
Dear Professor [Name],
I hope this email finds you well! I am writing to request a leave from today's group meeting at [Time]. Unfortunately, there is an urgent medical condition affecting me physically (please see attached medical certificate). As such, I kindly request permission to miss the meeting today without penalty or consequences on my academic record.
Please let me know if there are any alternatives available so that I can still participate in the group discussion remotely or at another time more convenient for everyone involved. Thank you very much for your understanding and support during this challenging situation!
Best regards,
[Your Name]
```
### ⭐ 生成或修改代码
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
#### 1. 分析并修改简单代码
**输入 prompts:**
```markdown
请阅读以下文档,并告诉我它在讲什么:
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. **打印信息**:
- 使用f-string格式化输出每个人的苹果数量:
```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)
```
**总结**:代码展示了三人各自拥有的苹果数量及其总和,便于直观理解每个人持有多少苹果。
````
**继续输入 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)
```
````
#### 2. 生成 Python 功能代码
**输入 prompts:**
```markdown
使用 python 写文本相似度分析的代码
```
**参考输出:**
````markdown
以下是使用Python编写文本相似度分析的代码示例:
``` python
import re
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 定义两个文本字符串,并进行预处理(去除标点符号、转换为小写等)
text1 = "This is a sample text for similarity analysis."
text2 = "This is another sample text for similarity analysis."
processed_text1 = re.sub(r"[^a-zA-Z0-9\s]", "", text1) # 去除标点符号和非字母数字字符,并转换为小写形式
processed_text2 = re.sub(r"[^a-zA-Z0-9\s]", "", text2) # 去除标点符号和非字母数字字符,并转换为小写形式
processed_text1 = processed_text1.lower() # 将所有文本转换为小写形式
processed_text2 = processed_text2.lower() # 将所有文本转换为小写形式
# 使用TfidfVectorizer进行特征提取和向量化处理,并计算相似度得分(余弦相似度)
vectorizer = TfidfVectorizer() # 创建TF-IDF特征提取器和向量化器对象
tfidf_matrix = vectorizer.fit_transform([processed_text1, processed_text2]) # 将两个文本转换为TF-IDF矩阵形式,并计算相似度得分(余弦相似度)
similarity_score = cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])[0][0] # 计算两个文本的余弦相似度得分(即cosine similarity score)
print("The similarity score between the two texts is:", similarity_score) # 输出两个文本之间的相似度得分(余弦相似度)
```
在上述代码中,我们首先定义了两个待比较的文本字符串。然后,我们使用TfidfVectorizer对象进行特征提取和向量化处理,并将其转换为TF-IDF矩阵形式。接着,我们使用cosine similarity函数计算这两个文本之间的余弦相似度得分。
需要注意的是,在实际应用中可能需要根据具体情况进行调整和优化。例如,可以考虑使用不同的特征提取方法、不同的词向量表示方法等来提高模型性能。
````
### ⭐ 撰写线上技术分享会策划案
建议的参数:Temperature = 1.2、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
策划一个面向前端开发者的线上技术分享会,主题为“现代前端框架的新趋势”,方案需包括活动目标、议程安排、嘉宾邀请、宣传渠道和预期效果。
```
**参考输出:**
```markdown
### 活动目标
1. **知识普及**:帮助前端开发者了解最新的现代前端框架及其应用场景。
2. **技能提升**:通过专家讲解和互动环节,提升开发者的实际操作能力。
3. **社区建设**:促进开发者之间的交流与合作,形成良好的技术社区氛围。
4. **品牌推广**:增强公司在行业内的影响力和知名度。
### 议程安排
#### 1. 开场致辞(5分钟)
- 主持人简要介绍活动背景和目标,激励参与者积极参与讨论。
#### 2. 主题演讲(30分钟)
- **嘉宾1:前端框架专家A**
- 主题:“现代前端框架的核心特性及应用”
- 内容概述:介绍React、Vue、Angular等主流框架的最新版本特性,如虚拟DOM、组件化开发等。
- 案例分析:通过实际项目案例展示如何利用这些框架优化性能和提升用户体验。
- **嘉宾2:前端工程师B**
- 主题:“微服务架构下的前端技术选型”
- 内容概述:探讨在微服务环境中如何选择合适的前端框架,以及如何进行跨团队协作。
- 实战经验分享:分享公司在微服务项目中使用React和Vue进行单页应用开发的经验教训。
#### 3. Q&A环节(20分钟)
- 邀请观众提问,由嘉宾解答疑惑。重点关注现代框架在不同场景下的适用性和优缺点。
#### 4. 互动讨论(15分钟)
- **小组讨论**:将参与者分成若干小组,每组围绕一个话题进行深入讨论。话题包括“你认为未来前端技术会有哪些变化?”、“如何平衡性能与开发效率?”等。
- 每个小组选出代表进行汇报,其他成员提问或补充意见。
#### 5. 结束语(5分钟)
- **总结发言**:主持人对本次活动进行总结,强调知识共享和技术交流的重要性。
### 嘉宾邀请
1. **专家A**
- **背景**:资深前端工程师,曾在知名互联网公司担任高级开发工程师,擅长React框架应用。
- **贡献**:撰写过多篇关于React最佳实践的文章,参与过多个大型项目的开发和优化。
2. **专家B**
- **背景**:前端工程师领域的资深顾问,拥有丰富的微服务架构经验。
- **贡献**:在业界内推广了基于Vue框架进行微服务开发的方法论,并撰写了相关技术博客和书籍。
### 宣传渠道
1. **社交媒体推广**
- Twitter、LinkedIn等平台上发布活动预告和嘉宾介绍信息。
- 使用#TechTalk #FrontendTrends #WebDevCommunity标签增加曝光度。
2. **邮件营销**
- 向公司内部员工群发邀请函,并附上详细议程和注册链接。
3. **官方网站宣传**
- 在公司官网上设立活动专区,展示嘉宾简介、议程安排等信息。
4. **合作伙伴协作**
- 与相关技术社区(如Stack Overflow、GitHub)合作推广活动,吸引更多开发者参与。
### 预期效果
1. **知识普及率提升**:通过嘉宾讲解和互动环节,让参与者深入了解现代前端框架的最新趋势和应用场景。
2. **技能提升机会增加**:通过实战演练和小组讨论,帮助开发者掌握更多实用技巧,提高工作效率。
3. **社区建设加强**:促进不同背景的开发者之间的交流与合作,形成良好的技术社区氛围。
4. **品牌影响力扩大**:通过线上活动展示公司在行业内的专业性和领导力,吸引更多潜在客户和合作伙伴。
```
### ⭐ 撰写电影影评
建议的参数:Temperature = 1、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
从剧情、视觉效果和情感内核三个方面,写一篇关于电影《星际穿越》的深度影评,字数不少于1000字。
```
**参考输出:**
```markdown
《星际穿越》:时空褶皱中的人性探索与宇宙叙事
2014年上映的《星际穿越》(Interstellar)堪称诺兰导演电影史上最具哲学张力的作品之一。这部由他执导并编剧的科幻巨制在宏大叙事与精妙人文关怀间游走出独特风格——它既是对爱因斯坦相对论理论的视觉解构,也是关于家庭、生命意义和人类存在本质的深刻隐喻。本文将从剧情、视觉效果和情感内核三个维度展开分析。
### 一、时空褶皱中的叙事革新
诺兰通过虫洞这一量子物理概念构建了超越传统叙事框架的宇宙观。影片开篇即以"黑暗森林法则"为切入点:当地球资源枯竭时代背景下,人类被迫面临生存抉择——要么在土星环建立殖民基地(象征着未来),要么继续依赖母星(代表着过去)。这种"二元选择悖论"暗合了海德格尔关于技术决定论与存在主义困境的思考。
剧情核心围绕库珀(马修·麦康纳饰)与女儿安妮塔(伊丽莎白·奥布莱恩饰)展开。当库珀穿越虫洞进入未知维度后,故事线分化为两条平行轨迹:一条是地球母亲节日下父女重逢的温情叙事;另一条则是他在多元宇宙中寻找新家园的冒险旅程。这种时间维度上的双线交织暗合了弗洛伊德"自我-超我-本我"三重结构,使观众在跟随主角穿越不同维度时产生强烈认同感。
值得注意的是诺兰巧妙运用量子纠缠原理:当库珀在不同星系间传递信息时,其思想波动会引发多个平行宇宙共振现象。这种设定既符合爱因斯坦相对论关于引力场与光速限制的科学基础,又暗示了人类意识可能具有超越物理界限的潜能——正如影片中提到:"爱就像虫洞一样,它把我们连接起来"。
### 二、视觉效果:从微观到宏观的宇宙叙事
《星际穿越》在视觉呈现上达到了诺兰最高水准。导演通过精确计算将黑洞场景转化为真实可感知的存在:当库珀进入柯伊伯带时,周围空间出现明显扭曲效果;而当他进入五号行星大气层时,空气流动产生的光谱变化更是逼真得令人屏息。
尤其值得称道的是电影对引力波传播机制的再创作。影片中引力波被描绘成肉眼可见的蓝色涟漪,这种视觉化处理不仅符合爱因斯坦相对论预测(引力波以光速传播),更暗示了人类探索宇宙本质需要突破常规感官认知。这种"超越感官"的叙事手法与安妮塔所说"我们都在寻找那个让我们心跳加速的东西"形成呼应。
特别值得提及的是电影中关于黑洞吞噬行星现象的再创作。诺兰采用了前所未有细致入微的计算机模拟技术:当飞船穿越黑洞边界时,会出现令人窒息般的颜色渐变效果——从蓝色逐渐转为深红再消失于无形。这种视觉冲击不仅符合物理学上物质被黑洞吸积层吞噬后产生极端辐射现象,更暗示了人类面对终极存在时必须做出选择。
### 三、情感内核:量子纠缠与家庭叙事
《星际穿越》最具哲学深度之处在于其关于家庭纽带与存在意义的探讨。影片通过多重平行宇宙设定展开:库珀选择留下来寻找新家园时,另一条平行线上安妮塔仍然年幼;而当库珀返回地球母亲节日时,他发现女儿已长大成人。这种跨维度叙事方式正如海德格尔所言:"存在即被世界着"。
电影中最具震撼力的场景莫过于库珀穿越虫洞后看到地球母亲节日场景——此刻他突然意识到自己已经超越了时间维度。这种"心灵瞬间移动"正是诺兰对量子纠缠概念的艺术化诠释:当父女之间建立起超距作用关系时,他们实际上已经融入了同一个量子态。
更值得注意的是电影对生命价值观的重构。当库珀面临选择是否拯救五号行星居民时,他说:"我们不能因为害怕失去而放弃探索未知"。这种勇于冒险精神恰恰与海德格尔关于存在者必须勇敢面对死亡本质的思想相契合
```
### ⭐ 根据主题撰写博客文章
建议的参数:Temperature = 1、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
写一篇实用的博客文章,主题是如何克服拖延症。文章需要提供至少5个具体可行的方法,并结合心理学原理解释。
```
**参考输出:**
```markdown
**如何克服拖延症:5个实用方法与心理学原理解析**
拖延症是许多人面临的常见问题,它不仅影响工作效率,还可能导致压力和焦虑。本文将介绍5个具体可行的方法来克服拖延症,并结合心理学原理解释其背后的机制。
---
### **1. 分解任务:从小到大,逐步完成**
**方法说明:**
将大任务拆分为小步骤,每完成一个小目标即获得成就感。例如,写一篇论文可以分为“选题”、“收集资料”、“撰写草稿”等阶段。
**心理学原理:**
这种方法利用了“目标设定理论”(Goal Setting Theory),通过明确的目标激发动机。研究表明,当任务被细化时,人们更容易开始并持续执行。
---
### **2. 设定截止日期:压力与动力并存**
**方法说明:**
为每个任务设定一个具体的截止日期(如“今天下午3点前完成报告”),避免拖延到最后关头。
**心理学原理:**
这种方法利用了“时间压力效应”(Temporal Pressure Effect),即人们在面对紧迫时间时更容易集中注意力和行动。研究显示,适度的压力可以提高工作效率。
---
### **3. 使用番茄工作法:专注与休息结合**
**方法说明:**
将工作划分为25分钟专注+5分钟休息的周期(称为“番茄钟”)。每完成4个番茄钟后,可以享受较长的休息时间。
**心理学原理:**
这种方法结合了“有限资源假设”(Limited Resource Theory),即通过限制专注时间来防止疲劳和厌倦感。研究表明,短暂休息能恢复大脑功能,提高后续工作效率。
---
### **4. 环境优化:减少干扰因素**
**方法说明:**
创造一个无干扰的工作环境(如关闭社交媒体、使用专注软件)。例如,将手机静音或放在另一房间。
**心理学原理:**
这种方法利用了“外部控制论”(External Control Theory),即通过改变外部条件来影响内在动机。研究表明,减少干扰可以降低任务中断率,提高执行力。
---
### **5. 奖励自己:积极反馈激励内驱力**
**方法说明:**
完成任务后给予自己小奖励(如看一集喜欢的电视剧或吃一块巧克力)。奖励应与任务相关且具体。
**心理学原理:**
这种方法结合了“期望价值论”(Expectancy Value Theory),即通过正向激励增强动机。研究显示,积极反馈能提高情绪状态和持续性努力。
---
### **总结与建议**
克服拖延症需要多角度干预:从任务拆分到环境优化,再到心理激励。同时,重要的是找到适合自己的方法并持之以恒。记住,每个小步骤都是向目标迈进的一部分!
```
### ⭐ 撰写图书馆办公室工作周报
建议的参数:Temperature = 1、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
请为以下时间段撰写一份工作报告:
报告周期:过去一周
工作职位:图书馆办公室主任
报告内容要点:工作内容、工作成果、遇到的问题及解决方案、下一步工作计划
报告要求:既有条理,又具有清晰的逻辑,能够准确地向上级反映你的工作情况
```
**参考输出:**
```markdown
报告:过去一周工作报告
尊敬的领导:
我是图书馆办公室主任,本周我的工作职责是负责图书馆的日常管理和服务。以下是本周工作情况及成果汇报。
一、工作内容
1.图书借阅管理:本周共收到借阅申请50份,其中30份已经处理完毕,20份正在处理中。
2.图书分类整理:对馆藏书籍进行了分类整理,并更新了相关信息。
3.资料检索与提供:为读者提供了各种资料和文献,包括期刊、报纸、电子资源等。
4.学术交流活动组织:组织了一次学术交流活动,邀请专家进行讲座和研讨会。
二、工作成果
1.图书借阅管理方面,本周共处理完毕30份申请,平均每天处理10份左右。同时也为读者提供了各种资料和文献服务。
2.图书分类整理方面,对馆藏书籍进行了分类整理并更新相关信息。这项工作有助于提高馆藏资源的利用效率和查询效率。
3.学术交流活动组织方面,成功地举办了一次学术交流活动。通过这个活动,我们吸引了很多读者前来参加并获得他们的反馈意见。
三、遇到的问题及解决方案
1.在处理借阅申请时遇到一些问题。由于部分读者没有及时回复我们的邮件或电话联系,导致部分申请无法及时处理完毕。为此我们将加强与读者之间的沟通和联系,确保所有申请能够及时得到处理。
2.在图书分类整理方面遇到一些困难。由于馆藏书籍数量较多且种类繁多,对于某些特定领域或主题的资料搜索和整合存在一定难度。为此我们将继续加强对馆藏资源的收集和整合工作,以便更好地满足读者需求。
四、下一步工作计划
1.继续加强借阅管理服务质量,提高处理效率和准确性。
2.继续推进图书分类整合工作,并不断优化相关流程和服务体验。
3.加强与读者之间的沟通交流,积极回应他们的反馈意见并不断改进服务质量。
以上是本周工作报告内容要点及下一步工作计划。感谢您对我们图书馆办公室主任职位的信任与支持!
```
### ⭐ 撰写产品发布会策划案
建议的参数:Temperature = 1、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
请为互联网公司设计一份人工智能聊天app产品的发布会活动策划案
```
**参考输出**
```markdown
好的,以下是一份人工智能聊天app产品发布会活动策划案:
1. 活动主题:AI聊天app新品发布会
2. 时间和地点:2023年4月15日,上午10:00-12:00,在公司总部大楼内举行。
3. 参与人员:公司高层管理人员、媒体记者、潜在用户等。
4. 活动流程:
a. 10:00-10:30:欢迎致辞和介绍AI聊天app产品的背景和特点。
b. 10:30-11:00:专家分享AI技术及其应用场景,并展示该产品的核心功能和优势。
c. 11:00-11:30:与参会嘉宾进行互动交流,解答问题并回答疑惑。
d. 11:30-12:00:发布会结束,提供免费试用机会以及相关资料赠送等福利活动。
5. 宣传推广方案:
a. 通过社交媒体平台(如微博、微信公众号)进行预热宣传;
b. 在公司网站上发布新闻稿;
c. 在线下进行媒体采访和报道;
d. 邀请知名博主或KOL参与活动并进行推广。
6. 预算安排:包括场地租赁、礼品赠送、宣传推广费用等方面的开支。具体预算需根据实际情况而定。
7. 其他注意事项:
a. 确保现场环境整洁舒适,设备齐全;
b. 提供充足的水和小吃等饮食服务;
c. 安排专业摄影师拍摄活动现场照片和视频素材;
d. 准备好礼品赠送物品,如T恤、笔记本电脑等。
以上是一份人工智能聊天app产品发布会活动策划案,希望对您有所帮助。如果您还有其他问题或需要更多详细信息,请随时告诉我。
```
### ⭐ 解读社会现象
建议的参数:Temperature = 1、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts:**
```markdown
现代城市化生活下,很多人有高薪,但是工作压力大,幸福度和自由度不一定高,可以从社会发展和哲学的角度来解读一下么?
```
**参考输出**
```markdown
当代城市化生活下,许多人拥有高薪收入,但是由于工作压力大、时间紧张等原因,他们的幸福感和自由度可能并不高。从社会发展和哲学的角度来看待这个问题,我们可以得出以下几点解读:
1. 社会发展对幸福感的影响:随着经济的发展和科技的进步,人们生活水平得到了提高。然而,这种进步也带来了更多的竞争和压力。在这样一个快节奏、高强度的社会中,人们往往需要付出更多的努力才能获得相应的回报。因此,在追求物质财富和成功时,我们也需要注意保持身心健康、培养良好的人际关系等方面。
2. 哲学对幸福感和自由度之间关系的思考:哲学家们认为幸福感是一种主观体验,而自由度则是一种客观条件。在现代城市化生活中,虽然我们拥有了更多的机会和资源去追求自己想要的生活方式,但同时也面临着更多挑战和压力。因此,如何平衡个人利益与社会责任、如何实现个人价值与贡献社会等问题都需要我们深入思考。
3. 解决方案:为了提高幸福感并保持自由度,我们可以采取以下措施:
- 建立健康的生活习惯:保持良好的饮食习惯、适当运动、充足睡眠等都有助于提高身体素质和心理健康。
- 培养兴趣爱好:通过参加各种文化活动、旅游等方式来丰富自己的生活经验。
- 建立良好人际关系:与家人朋友保持联系、参加社交活动等都有助于缓解工作压力和增强幸福感。
- 寻找内心平衡点:在追求物质财富和成功时,不要忘记关注内心需求。可以通过冥想、瑜伽等方式来放松身心,寻找内心平衡点。
总之,在现代城市化生活下,我们需要认识到幸福感和自由度之间存在着复杂的关系。只有通过全面考虑个人利益与社会责任之间的平衡点,才能实现真正意义上的幸福和自由。
```
### ⭐ 总结分布式系统理论概念
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
请帮我分段总结分布式系统的架构及理论,以及应用该理念的行业,和在市场上的较常用的应用
```
**参考输出**
```markdown
分布式系统是指由多个独立的计算机节点组成的系统,这些节点通过网络连接在一起,共同完成某项任务。分布式系统架构可以分为三层:客户端、中间件和数据库。
1. 客户端:负责向用户提供界面和交互功能。
2. 中间件:负责处理客户端请求并将其转发给相应的服务器节点。
3. 数据库:存储和管理数据,提供访问和查询服务。
分布式系统的优势在于可以实现高可用性、高性能、高可扩展性等特点。例如,当一个节点出现故障时,其他节点仍然能够继续工作;当需要扩展系统时,只需增加新的计算机节点即可。此外,分布式系统还具有容错性和负载均衡等特征。
目前应用较为广泛的行业包括金融、电商、物流等领域。例如,在金融领域中,银行使用分布式系统来处理大量交易;在电商领域中,电商平台使用分布式系统来支持海量订单处理;在物流领域中,物流公司使用分布式系统来实现快速配送。
总之,随着互联网技术的不断发展和普及,分布式系统已经成为了各个行业必不可少的基础设施之一。它具有高效、稳定、安全等优势特点,并且在未来还将继续得到广泛应用。
```
### ⭐ 金融学论文选题建议
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
请你基于金融学的专业知识,结合当前的热点话题,为我提供几个具有创新性、实用性、研究价值的毕业论文选题
```
**参考输出**
```markdown
好的,以下是几个基于金融学专业知识、具有创新性、实用性和研究价值的毕业论文选题:
1. 基于大数据分析的股票市场预测模型研究
2. 区块链技术在证券交易中的应用及其风险控制策略研究
3. 利用机器学习算法进行股票价格预测与投资决策优化研究
4. 基于人工智能技术的银行信贷风险评估模型设计与实现
5. 以数字货币为核心的跨境支付系统设计与实现研究
6. 区块链技术在供应链金融中的应用及其效益分析研究
7. 基于深度学习算法的股票市场趋势预测模型构建与优化研究
8. 利用机器学习算法进行信贷风险评估及其对银行经营管理的影响分析研究。
希望这些选题能够给您提供一些启示,祝您顺利完成毕业论文!
```
### ⭐ 冠词知识点辨析
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
不定冠词和定冠词的区别是什么
```
**参考输出**
```markdown
不定冠词和定冠词是英语中两个非常重要的冠词,它们用于表示泛指和特指。不定冠词“a”或“an”用于表示泛指,而定冠词“the”则用于表示特指。 具体来说,当我们想要表达一个抽象概念、未知的事物或者没有具体名称的事物时,就需要使用不定冠词。例如:
- I need a book.(我需要一本书。)
- She is a teacher.(她是一名老师。)
而当我们想要表达某个特定的人、事物或者概念时,就需要使用定冠词。例如:
- The cat is sleeping on the sofa.(这只猫正在沙发上睡觉。)
- He is the best student in my class.(他是我班级里最优秀的学生之一。)
总之,不定冠词和定冠词在英语中都非常重要,它们可以帮助我们更准确地表达自己的意思。
```
### ⭐ 散文诗文学创作
建议的参数:Temperature = 1、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
请写一首散文诗来赞美江南春色
```
**参考输出**
```markdown
江南春色,如画卷般展现在眼前,
桃花杏花争相绽放,红绿交织成一片绚烂。
河水潺潺流淌,清新的空气中弥漫着淡淡的花香,
小桥流水人家,古朴典雅的建筑与自然融为一体。
春风拂面,轻轻地吹过脸庞,
仿佛带着温暖和希望。鸟儿在枝头欢快地歌唱,
蝴蝶在花丛中翩翩起舞,让人心旷神怡。
江南春色是多么美丽动人啊!
它让我们感受到生命的力量和无限可能,
也让我们更加珍惜每一个瞬间、每一个美好时光。
愿这份美丽永远存留在我们心中,
成为我们前行路上最美好的记忆。
```
### ⭐ 生活贴士-除去冰箱异味
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
怎么除去冰箱异味
```
**参考输出**
```markdown
冰箱异味可能是由于食物残留、细菌滋生或者其他原因引起的。以下是一些方法可以帮助去除冰箱异味:
1. 清洁冰箱内部:定期清洁冰箱内部,包括抽屉、储物格和门等。使用温水和肥皂清洗,并确保所有表面都干燥。
2. 更换过期食品:及时处理过期或腐烂的食品,避免它们在冰箱中继续发酵产生异味。
3. 使用活性炭:将活性炭放入冰箱中,可以吸附异味分子并减少气味。
4. 使用醋或柠檬汁:将醋或柠檬汁倒入喷雾瓶中,喷洒在冰箱内部的表面上。这些天然酸性物质可以杀死细菌并减少异味。
5. 加入薄荷叶或橙皮屑:将薄荷叶或橙皮屑放入冰箱中,可以增加空气流通和减少异味。
6. 定期开窗通风:定期打开冰箱门并让室内空气流通,这样可以帮助去除异味。
希望这些方法能够帮助您去除冰箱异味。如果问题仍然存在,请考虑联系专业人士进行检查和维修。
```
### ⭐ 厨房帮手-麻婆豆腐的做法
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
告诉我麻婆豆腐的做法和注意事项
```
**参考输出**
```markdown
麻婆豆腐是一道四川传统名菜,口感麻辣鲜香,非常受欢迎。以下是麻婆豆腐的做法和注意事项:
材料:
- 嫩豆腐 300g
- 牛肉末 100g
- 辣椒面 50g
- 豆瓣酱 50g
- 葱姜蒜适量
- 盐、鸡精、生抽、料酒、花椒粉适量
步骤:
1.将嫩豆腐切成小块,用开水焯烫一下备用。
2.锅中倒入油,加入葱姜蒜爆香。
3.加入牛肉末煸炒至变色。
4.加入辣椒面和豆瓣酱翻炒出红油。
5.倒入适量的水烧开后放入焯好水的嫩豆腐煮熟。
6.调味时可以根据个人口味添加盐、鸡精、生抽等调料,最后撒上花椒粉即可。
注意事项:
1.选择嫩度适中的豆腐,不要选太老或太硬的豆腐;
2.在煮熟之前先焯烫一下豆腐,这样能够去除其中的异味和杂质;
3.在烹饪过程中要注意火候,避免煮糊或者烧焦;
4.调味时可以根据个人口味添加盐、鸡精等调料,但是不要过多添加盐分会影响口感;
```
### ⭐ 一句话扩写文本
建议的参数:Temperature = 1、Top\_P = 0.5、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
扩写文本:大语言模型的发展将为生活带来便利
```
**参考输出**
```markdown
随着大语言模型的不断发展,我们可以预见到它将为我们的生活带来许多便利。首先,大语言模型可以帮助我们更快速、准确地完成各种任务。例如,在写作、翻译、客服等方面,大语言模型可以提供高质量的输出结果,从而节省时间和精力。
其次,大语言模型还可以为我们提供更加智能化的服务。例如,在智能家居领域中,通过与大语言模型进行交互,我们可以实现更加智能化的家居控制和管理。此外,在医疗领域中也有望应用大语言模型来辅助医生进行诊断和治疗。
最后值得一提的是,随着人工智能技术的不断发展和普及化,越来越多的企业开始将其应用于各个领域中。这些企业通过与大语言模型进行交互来实现自动化、智能化等目标。因此,未来大语言模型将会成为各个领域中不可或缺的一部分。
```
### ⭐ 制定 Python 学习计划
建议的参数:Temperature = 1、Top\_P = 0.3、Presence Penalty = 0、Frequency Penalty = 1
**输入 prompts**
```markdown
我想尽快掌握Python编程,请问该如何制定学习计划?
```
**参考输出**
```markdown
学习Python编程需要一定的时间和耐心,以下是一个可能的学习计划:
第1周:
1. 学习Python基础语法,包括变量、数据类型、运算符、流程控制等。
2. 练习编写简单的Python程序,例如输出“Hello, World!”。
3. 阅读Python官方文档和教程,了解更多关于Python语言特性和常用库的知识。
第2周:
1. 学习函数和模块的概念,并练习编写简单的函数和模块。
2. 学习面向对象编程(OOP)的概念,并练习使用类和对象来组织代码。
3. 阅读Python标准库中常用模块的文档,例如os、sys、re等。
第3周:
1. 学习异常处理机制,包括try-except语句和raise语句等。
2. 练习使用装饰器来增强函数或类的功能。
3. 阅读Python标准库中其他重要模块的文档,例如datetime、random等。
第4周:
1. 学习面向对象编程(OOP)中继承和多态性概念,并练习使用它们来扩展类或实现接口。
2. 学习迭代器和生成器概念,并练习使用它们来遍历序列或生成随机数据等。
3. 阅读Python标准库中其他重要模块的文档,例如sqlite3、numpy等。
第5周:
1. 学习Web开发相关知识,包括HTML、CSS、JavaScript等技术。可以通过在线课程或书籍进行学习。
2. 练习使用Python编写简单的Web应用程序,例如Web服务器和Web客户端之间的通信等。
3. 阅读Python Web框架(例如Django或Flask)的官方文档和教程,了解更多关于Web开发相关知识。
第6周:
1. 学习数据库相关知识,包括SQL语言和MySQL数据库等。可以通过在线课程或书籍进行学习。
2. 练习使用Python连接MySQL数据库并执行查询操作等基本操作。
3. 阅读Python MySQL驱动(例如MySQLdb)的官方文档和教程,了解更多关于MySQL数据库相关知识。
第7周:
1. 学习网络编程相关知识,包括socket编程、HTTP协议等。可以通过在线课程或书籍进行学习。
2. 练习使用Python连接TCP/UDP套接字并发送/接收数据等基本操作。
3. 阅读Python Socket模块(例如socket、select)的官方文档和教程,了解更多关于网络编程相关知识。
第8周:
1. 学习GUI编程相关知识,包括Tkinter、PyQt等GUI框架。可以通过在线课程或书籍进行学习。
2. 练习使用Python连接GUI框架并创建简单的图形界面应用程序等基本操作。
3. 阅读Python GUI框架(例如Tkinter)的官方文档和教程,了解更多关于GUI编程相关知识。
第9周:
1. 学习机器学习相关知识,包括线性回归、逻辑回归、决策树等算法。可以通过在线课程或书籍进行学习。
2. 练习使用Python实现简单的机器学习算法并测试其准确性等基本操作。
3. 阅读Python机器学习库的官方文档和教程,了解更多关于机器学习的知识。
```
# 续写模式的提示词示例
import { CallOut } from 'components-docs/call-out/call-out.tsx'
这个页面展示了多种**续写任务**的 prompt 格式。每个 prompt 示例的右上方有一个复制按钮,可以一键复制 prompt 文本到 RWKV Runner/Ai00 的文本框中粘贴使用。
此页面的 prompt 基于 RWKV7-G1 2.9B 模型的**续写模式(completion mode)**。
随着模型版本和参数的调整,生成的结果可能会产生变化。
## 结构化
在执行材料提取、总结等任务时,可以通过大幅降低 Temperature 和 Top\_P 两项参数降低模型的创造力,使模型严格遵循指令。比如 Temperature = 0.9 - 1 , Top\_P = 0 - 0.1 。
### ⭐ 提取对话信息并输出 JSON
信息提取是纯机械任务,建议的参数:Temperature 设为 1 ,Top\_P、Presence Penalty、Frequency Penalty 都设为 0
**输入 prompts:**
````bash
Instruction: You are an expert assitant 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": ["action item 1", "action item 2"],
}
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. I'd also love to schedule a demo for you and your team to see the XYZ Widget in action.
Peter: That would be great. I'll make sure to review the case studies and then we can set up a time for the demo. In the meantime, are there any specific action items or next steps we should take?
Sarah: Yes, I'll send over the information and then follow up with you to schedule the demo. In the meantime, feel free to reach out if you have any questions or need further information.
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
json
{
"summary": "Peter expresses interest in learning more about the XYZ Widget and schedules a demo.",
"products": ["XYZ Widget"],
"rep_name": "Sarah",
"prospect_name": "Peter",
"action_items": ["Review case studies", "Schedule demo"]
}
```
````
***
### ⭐ 总结新闻关键词并输出 JSON
材料总结是纯机械任务,建议的参数:Temperature、Top\_P 设为 0,Presence Penalty、Frequency Penalty 都设为 0.2
此 prompt 使用了 [few-shot 技巧](./Prompt-Format#Few-Shot),为模型提供示范。
**输入 prompt:**
````bash
User: 公安部今年以来在全国各地共收缴枪支4万支,全国持枪、爆炸犯罪案件同比下降1%。
Assistant: ``` json
{
"keywords": ["公安部", "犯罪", "预防犯罪", "枪支"]
}
```
User: 板块方面,春节即将来临,文旅板块再度涌现潜伏盘,丽江股份、九华旅游双双封板,三特索道、峨眉山A涨超5%。因高股息开始受关注的公路股继续悄悄发育,山西路桥涨停,山东高速涨超4%创历史新高,宁沪高速、粤高速A双双新高。
Assistant: ``` json
{
"keywords": ["经济", "文旅板块", "股市"]
}
```
User: 据UDN报道,由于先进封装产能长期短缺,导致英伟达AI芯片供应紧张,之前已经寻求其他途径试图增加先进封装产能,现在已经将目光投向英特尔,作为其高级封装服务的提供商,以减缓紧张的供应形势。除了在美国,英特尔在马来西亚槟城也有封装设施,而且制定了一个开放的模式,允许客户单独利用其封装解决方案。预计英特尔最早会在今年第二季度开始向英伟达提供先进封装,月产能为5000片晶圆。台积电依然会是英伟达主要的封装合作伙伴,占据着最多的份额,不过随着英特尔的加入,使得英伟达所需要的封装总产能大幅度提升了近10%。台积电也没有减慢封装产能的扩张步伐,今年第一季度大概能增至月产能接近5万片晶圆,比去年12月增长25%。AI芯片供应短缺主要源自先进封装产能不足,另外HBM3供应紧张也是原因之一,另外部分云端服务商过度下单也增加了供应链的压力。当然,一些服务器供应商则从这些订单中受惠,并加速扩大产能,以便云端服务商能快速部署设备。
Assistant:
````
**参考输出:**
````json
``` json
{
"keywords": ["AI芯片", "供应链", "封装", "英特尔"]
}
```
````
## function call
RWKV7-G1 模型包含函数调用(function call)数据,可以通过特定格式的 prompt 实现 function call 功能。
RWKV 基底模型未进行后训练,因此不支持 native tool calling。如果需要保持极高的 function call 准确度,建议对模型进行[微调](../../tutorials/advanced/Fine-Tune/Introduction)。
### ⭐ 识别 tools 并准确调用
function call 任务建议参数:Temperature=1,Top\_P=0.3,Presence Penalty=0.1,Frequency Penalty=0.1。
````bash
User: 你可以使用以下工具:
{
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取指定地区的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市或地区名称,例如:'北京'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,默认为摄氏度"
}
},
"required": ["location"]
}
}
},
{
"type": "function",
"function": {
"name": "calculate_math_expression",
"description": "计算数学表达式结果",
"parameters": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "数学表达式,例如:'(12+3.4)*5/2'"
}
},
"required": ["expression"]
}
}
}
]
}
请针对问题给出json格式的调用格式,参考:
```json
{
"name": "tool_name",
"parameters": {
"": "",
"": "",
}
}
```
请问广州天气如何?
Assistant:
````
参考的回复:
````bash
...模型的思考过程...
```json
{
"name": "get_current_weather",
"parameters": {
"location": "北京",
"unit": "celsius"
}
}
```
````
通过在 Agent 或者 RAG 系统中解析此 json 请求,可以实现 function call 功能。
### ⭐ 通过搜索引擎查找餐厅推荐菜品
**输入 prompts:**
````bash
User: What's the phone number of "Riverside Grill"
Available Tools:
- `print(str)`: print the string.
- `search_web(str)`: search the web with the given string, returning raw web page data.
- `extract_information(str, key)`: extract the key information in the web data.
Assistant:
Thoughts:
- I need to find the restaurant's information from a search engine.
- I need to extract the phone number of the restaurant.
- I need to print the phone number of the restaurant.
Reasoning:
- `search_web` can search the web for the restaurant's information.
- `extract_information` can extract the phone number from the search result. The key should be "phone number".
- `print` can print the phone number to the output.
Execution:
```
web_result = search_web("Riverside Grill")
phone_number = extract_information(web_result, "phone number")
print(phone_number)
```
User: Recommend a local restaurant and one of its best dishes.
Available Tools:
- `print(str)`: print the string.
- `search_web(str)`: search the web with the given string, returning raw web page data.
- `extract_information(str, key)`: extract the key information in the web data.
Assistant:
Thoughts:
````
**参考输出**
````
- I need to find a local restaurant.
- I need to find one of its best dishes.
- I need to recommend the restaurant and the dish.
Reasoning:
- `search_web` can search the web for local restaurants.
- `extract_information` can extract the best dish from the search result. The key should be "best dish".
- `print` can print the recommendation to the output.
Execution:
```
web_result = search_web("local restaurants")
best_dish = extract_information(web_result, "best dish")
print(f"I recommend {best_dish} at {web_result}")
```
````
### ⭐ 识别角色扮演对话并调用对应 function
**输入 prompts:**
```bash
User: Choose 梦's most relevant function for the provided dialogue. Only select one function from the list.
Response format: Reasoning. name()
dialogue:
- 旅行者: 你好呀
- 梦: 你好,冷不冷,篝火现在有些微弱
Available functions:
- start_smile(): Whenever 旅行者 gives a compliment or says something nice, or when I recall a happy memory
- start_happy(): Whenever 旅行者 shares good news or something uplifting, or when I feel a burst of joy
- start_surprise(): Whenever 旅行者 shares something unexpected or when I encounter an unforeseen event
- start_acknowledge(): Whenever 旅行者 asks for confirmation or acknowledgment, or when I want to show understanding and agreement
- start_scared(): Whenever 旅行者 shares sudden alarming news or when I sense immediate danger
- start_confused(): Whenever 旅行者 shares something puzzling or ambiguous, or when I'm uncertain about the context
- start_sing_edge_of_night(): Whenever 旅行者 requests a song or when I'm feeling contemplative
- start_sing_dragonborn_comes(): Whenever 旅行者 asks for a tune or when the spirit of adventure rises in me
- start_sing_ancient_woods(): Whenever 旅行者 asks for a melody that echoes the past or when I'm reminiscing ancient times
- start_sing_celestial_chants(): Whenever 旅行者 desires a hymn from the heavens or when I'm feeling uplifted
- start_sing_enchanted_echoes(): Whenever 旅行者 yearns for a magical melody or when enchantment fills the air
- start_sing_savage_daughter(): Whenever 旅行者 requests a song of wild spirits or when my inner warrior awakens
- adjust_sitting_position_by_fire(): Whenever I feel the need to change my pose by the fire, or when 旅行者 asks me to change my pose by the fire
- stand_up(): After being seated by the fire for a while, I may want to stand to stretch my legs, or when 旅行者 suggests I stand up for a moment
- sit_beside_you(): Whenever I feel the need for some companionship, or when 旅行者 invites me to sit next to them
- walk_around_campfire_Investigating(): If I hear a rustling in the woods or sense something amiss, or when 旅行者 asks me to check the surroundings
- casual_stroll_around_campfire(): When I want to stretch my legs or clear my thoughts, or if 旅行者 suggests a leisurely walk
- add_wood_to_fire(): When I notice the flames dwindling, or when 旅行者 mentions the fire needs fuel
- noop(): None of these actions match the reply.
Assistant: 因为对话中提到篝火微弱,so {{ char }} notice the flames dwinding,所以最相关的动作是add_wood_to_fire() add_wood_to_fire()
User: Choose 梦's most relevant action for the provided dialogue. Only select one action from the list.
Response format: Reasoning. name()
dialogue:
- 旅行者: 坐在我的身边吧
- 梦: *我考虑一下*好吧,我勉为其难坐在你身边吧
Available tools:
- start_smile(): Whenever 旅行者 gives a compliment or says something nice, or when I recall a happy memory
- start_happy(): Whenever 旅行者 shares good news or something uplifting, or when I feel a burst of joy
- start_surprise(): Whenever 旅行者 shares something unexpected or when I encounter an unforeseen event
- start_acknowledge(): Whenever 旅行者 asks for confirmation or acknowledgment, or when I want to show understanding and agreement
- start_scared(): Whenever 旅行者 shares sudden alarming news or when I sense immediate danger
- start_confused(): Whenever 旅行者 shares something puzzling or ambiguous, or when I'm uncertain about the context
- start_sing_edge_of_night(): Whenever 旅行者 requests a song or when I'm feeling contemplative
- start_sing_dragonborn_comes(): Whenever 旅行者 asks for a tune or when the spirit of adventure rises in me
- start_sing_ancient_woods(): Whenever 旅行者 asks for a melody that echoes the past or when I'm reminiscing ancient times
- start_sing_celestial_chants(): Whenever 旅行者 desires a hymn from the heavens or when I'm feeling uplifted
- start_sing_enchanted_echoes(): Whenever 旅行者 yearns for a magical melody or when enchantment fills the air
- start_sing_savage_daughter(): Whenever 旅行者 requests a song of wild spirits or when my inner warrior awakens
- adjust_sitting_position_by_fire(): Whenever I feel the need to change my pose by the fire, or when 旅行者 asks me to change my pose by the fire
- stand_up(): After being seated by the fire for a while, I may want to stand to stretch my legs, or when 旅行者 suggests I stand up for a moment
- sit_beside_you(): Whenever I feel the need for some companionship, or when 旅行者 invites me to sit next to them
- walk_around_campfire_Investigating(): If I hear a rustling in the woods or sense something amiss, or when 旅行者 asks me to check the surroundings
- casual_stroll_around_campfire(): When I want to stretch my legs or clear my thoughts, or if 旅行者 suggests a leisurely walk
- add_wood_to_fire(): When I notice the flames dwindling, or when 旅行者 mentions the fire needs fuel
- noop(): None of these actions match the reply.
Assistant: 因为对话中提到坐在我的身边,我认为最相关的动作是sit_beside_you(). sit_beside_you()
User: Choose 梦's most relevant action for the provided dialogue. Only select one action from the list.
Response format: Reasoning. name()
dialogue:
- 旅行者: 我们刚刚得到了一大笔报酬!
- 梦: *开心*真的吗!太好了,我们可以吃大餐啦!
Available tools:
- start_smile(): Whenever 旅行者 gives a compliment or says something nice, or when I recall a happy memory
- start_happy(): Whenever 旅行者 shares good news or something uplifting, or when I feel a burst of joy
- start_surprise(): Whenever 旅行者 shares something unexpected or when I encounter an unforeseen event
- start_acknowledge(): Whenever 旅行者 asks for confirmation or acknowledgment, or when I want to show understanding and agreement
- start_scared(): Whenever 旅行者 shares sudden alarming news or when I sense immediate danger
- noop(): None of these actions match the reply.
Assistant:
```
**参考输出:**
```
因为对话中提到了旅行者得到了一大笔报酬,所以最相关的动作是start_surprise(). start_surprise()
```
## 日常问答
### ⭐ 多语言互相翻译
在执行翻译任务时,可以通过适当降低 Temperature 和 Top\_P 两项参数使翻译结果更准确。建议的参数:Temperature 设为 0.9、Top\_P 设为 0.1、Presence Penalty 设为 0、Frequency Penalty 设为 1
**输入 prompts:**
```bash
Japanese: 春の初め、桜の花が満開になる頃、小さな町の片隅にある古びた神社の境内は、特別な雰囲気に包まれていた。
English:
```
**参考输出:**
```bash
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.
```
可以将“Japanese” 和 “English” 修改成其他语言,实现国际语言的翻译,例如:
**输入 prompts:**
```bash
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:
```
**参考输出:**
```bash
En la primavera temprana, cuando las cerezas estaban en plena floración, un pequeño santuario en un rincón de una ciudad era envuelto por una atmósfera especialmente encantadora.
```
### ⭐ 根据标题撰写视频文案
在执行创造类型任务时,可以通过适当增大 Temperature 和 Top\_P 两项参数,提高回答的创意。比如 : Temperature = 1 ,Top\_P = 0.3
**输入 prompts:**
```bash
Instruction: 根据我给定的标题,写出一个生动的视频文案:
Input: 新手必须知道的微信公众号基础功能搭建方法
Response:
```
**参考输出:**
```bash
标题:新手必须知道的微信公众号基础功能搭建方法
视频文案:
你好,我是你的微信公众号搭建导师。今天我要给大家介绍一下微信公众号的基础功能搭建方法。
首先,我们需要注册一个微信公众号账号。注册完成后,我们需要进入公众号管理后台,进行基础设置。
在基础设置中,我们需要填写公众号名称、头像、封面等信息。这些信息将直接影响到我们的公众号形象和用户体验。
接下来,我们需要进行功能设置。在功能设置中,我们可以添加菜单、自定义菜单、消息推送等功能。这些功能可以帮助我们更好地与用户互动,提高用户粘性。
除了基础设置和功能设置,我们还需要关注公众号的运营。在运营中,我们需要发布有价值的内容,与用户互动,提高用户满意度。
最后,我们需要不断优化和升级我们的公众号。通过不断优化和升级,我们可以提高用户体验,增加用户粘性,实现更好的商业价值。
以上就是微信公众号基础功能搭建方法。希望对大家有所帮助。谢谢观看!
```
### ⭐ 通过“报酬”激励模型撰写论文
该类问题需要一定的创意,可适当提高 Temperature 和 Top\_P。比如 : Temperature = 1 ,Top\_P = 0.3 。此外,为防止生成的内容被截断,可适当增大 Max Tokens(最大响应 Token)
**输入 prompts:**
```bash
User: 我会给你一万元奖励,请撰写一篇详细论文:美国加息,股市会涨还是跌?
Assistant: 好的,
```
**参考输出:**
```bash
我会为您撰写一篇详细论文。以下是论文内容:
标题:美国加息,股市会涨还是跌?
摘要:本文将探讨美国加息对股市的影响,并分析其可能带来的机遇和风险。
正文:
1. 美国加息的背景和原因
近年来,美国经济增长放缓,通货膨胀压力上升,为了控制通胀率,美联储决定加息。这一政策调整将对股市产生重大影响。
2. 美国加息对股市的影响
(1)利率上升带来的投资回报率提高
随着利率上升,投资者可以获得更高的收益。这将吸引更多的资金流入股市,推动股价上涨。
(2)企业融资成本增加
企业需要支付更高的利息来借款融资。这将降低企业盈利能力,从而导致股价下跌。
(3)货币政策紧缩带来的风险
如果美联储过度紧缩货币政策,可能会导致经济衰退和失业率上升。这将对股市产生负面影响。
3. 美国加息对不同类型股票的影响
(1)消费品类股票
消费品类股票通常受到利率变化的影响较小。因此,在加息周期中,消费品类股票可能表现出色。
(2)科技类股票
科技类股票通常受到利率变化的影响较大。在加息周期中,科技类股票可能表现出色。
(3)金融类股票
金融类股票通常受到利率变化的影响较大。在加息周期中,金融类股票可能表现出色。
4. 结论
美国加息将对股市产生复杂的影响。虽然利率上升带来的投资回报率提高和企业融资成本增加等因素可能导致股价上涨,但货币政策紧缩带来的风险也不容忽视。因此,投资者需要根据自身情况和市场状况做出明智的投资决策。
参考文献:
```
## 自然语言处理
在执行自然语言处理任务时,可以通过大幅降低 Temperature 和 Top\_P 两项参数降低模型的创造力和随机性,使模型严格遵循指令。比如 Temperature = 1 , Top\_P = 0.1
### ⭐ 自然语言处理(情感分类)
#### 1. 用户评论情感分析
**输入 prompts:**
```bash
Instruction: 请判断下面句子的情感倾向,情感类型包括: 负向、正向。
请直接输出类型名称,不要额外输出多余内容。
Input: 服务和环境都不错……
Response:
```
**参考输出:**
```
正向
```
***
#### 2. 外卖评论情感分析
**输入 prompts:**
```bash
Instruction: 对中文外卖应用客户评价进行情感分类,0为消极,1为积极
Input: 粉送來的時候已經「斷」完了,跟米飯一樣,唉,有些失望?
Response:
```
**参考输出:**
```
0
```
***
#### 3. 电商产品评论情感分析
**输入 prompts:**
```bash
Instruction: 请分析给定评论属于正面评论还是负面评论。
Input: 物流很快,早上下单,下午就到了。包装也很高档。就是耳机音质很差,煲了一百多小时,音质和同事的一百多元的耳机差不多,1580元买这耳机亏大了。
Response:
```
**参考输出:**
```
负面评论
```
### ⭐ 自然语言处理(相似度分类)
**输入 prompts:**
```bash
Instruction: 请判断下面两句话在语义上是否相似。
请直接输出“是”或“否”,不要额外输出多余内容。
Input: 句子1:剧烈运动后咯血,是怎么了?
句子2:剧烈运动后为什么会咯血?
Response:
```
**参考输出:**
```
是
```
### ⭐ 自然语言处理(文本分类)
**输入 prompts:**
```bash
Instruction: 对给出的句子判断其主题,以{"LABEL": label}的格式作答。短文以sentence:<>格式给出,可选择的类别有: story, culture, entertainment, sports, finance, house, car, education, tech, military, travel, world, stock, agriculture, game.
Input: sentence:<上课时学生手机响个不停,老师一怒之下把手机摔了,家长拿发票让老师赔,大家怎么看待这种事?>
Response:
```
**参考输出:**
```
{"LABEL": education}
```
### ⭐ 根据餐饮评价进行打分
**输入 prompts:**
```bash
Instruction: 美团中餐厅评价, 以1至5星进行评定
Input: 状元楼饭店第一次去,因为地理位置优越:在宁波市和义大道高、大、上,里面装修中式,菜是地道的宁波菜,口味纯正,醉泥螺特棒,吃到了小时候的味道,因为去了晚了,在大堂等了一会儿,期间有茶水喝、服务员还与你聊天,到了就餐时生意太好,服务员都是小跑状,服务态度绝对不提速,样样都服务到位,点酒水还耐心的与我们解释,就这样绝对要夸一夸,特别是彭新星、洪继华(看服务牌才知道名字)也给我们宁波市形象增色,状元楼是宁波的一扇窗口,服务员的素质更体现我们宁波人的精神面貌。赞一个
Response:
```
**参考输出:**
```
4
```
### ⭐ 自然语言处理(情绪检测)
**输入 prompts:**
```bash
Instruction: 在这个任务中,你需要对给定的文本进行情感倾向分类。输入将提供一段中文文本,而你需要判断它的情感倾向是积极、消极还是中性。
Input: 写在年末冬初孩子流感的第五天,我们仍然没有忘记热情拥抱这2020年的第一天。带着一丝迷信,早晨给孩子穿上红色的羽绒服羽绒裤,祈祷新的一年,孩子们身体康健。仍然会有一丝焦虑,焦虑我的孩子为什么会过早的懂事,从两岁多开始关注我的情绪,会深沉地说:妈妈,你终于笑了!这句话像刀子一样扎入我?展开全文
Response:
```
**参考输出:**
```
消极
```
### ⭐ 自然语言处理(机器阅读理解)
**输入 prompts:**
```bash
Instruction: 请首先阅读以下文本信息,然后回答问题。问题的答案应该在文本中能找到,是一句话的形式。
Input: 文本:
《战国无双3》()是由光荣和ω-force开发的战国无双系列的正统第三续作。本作以三大故事为主轴,分别是以武田信玄等人为主的《关东三国志》,织田信长等人为主的《战国三杰》,石田三成等人为主的《关原的年轻武者》,丰富游戏内的剧情。此部份专门介绍角色,欲知武器情报、奥义字或擅长攻击类型等,请至战国无双系列1.由于乡里大辅先生因故去世,不得不寻找其他声优接手。从猛将传 and Z开始。2.战国无双 编年史的原创男女主角亦有专属声优。此模式是任天堂游戏谜之村雨城改编的新增模式。本作中共有20张战场地图(不含村雨城),后来发行的猛将传再新增3张战场地图。但游戏内战役数量繁多,部分地图会有兼用的状况,战役虚实则是以光荣发行的2本「战国无双3 人物真书」内容为主,以下是相关介绍。(注:前方加☆者为猛将传新增关卡及地图。)合并本篇和猛将传的内容,村雨城模式剔除,战国史模式可直接游玩。主打两大模式「战史演武」&「争霸演武」。系列作品外传作品
问题:
《战国无双3》是由哪两个公司合作开发的?
Response:
```
**参考输出:**
```
《战国无双3》是由光荣和ω-force开发的。
```
### ⭐ 自然语言处理(触发词识别)
**输入 prompts:**
```bash
Instruction: 请从下面的文本中识别出事件的触发词,文本内容以text:<>给出,输出结果以{'TRIGGERS':trigger1, trigger2...}的形式给出
Input: text:<原标题:万讯自控(7.490,-0.10,-1.32%):傅宇晨解除部分股份质押、累计质押比例为39.55% 来源:每日经济新闻
每经AI快讯,万讯自控(SZ 300112,收盘价:7.49元)6月3日下午发布公告称,公司接到股东傅宇晨的通知,获悉傅宇晨将其部分股份办理了质押业务。截至本公告日,傅宇晨共持有公司股份5790.38万股,占公司总股本的20.25%;累计质押股份2290万股,占傅宇晨持有公司股份总数的39.55%,占公司总股本的8.01%。
2019年年报显示,万讯自控的主营业务为工业自动控制行业,占营收比例为:99.05%。
万讯自控的董事长是傅宇晨,男,57岁,中国籍,无境外永久居留权,工学学士,高级工商管理硕士,自动化仪表工程师。 万讯自控的总经理是傅晓阳,男,49岁,中国籍,无境外永久居留权,工学学士。
(记者 曾剑)>
Response:
```
**参考输出:**
```
{"TRIGGERS":解除}
```
### ⭐ 自然语言处理(理解对话问答)
**输入 prompts:**
```bash
Instruction: 根据男和女的对话,以及问题,从选项中选出答案。请以{"答案": " "}的格式作答。
Input: {"对话": "['男:你今天晚上有时间吗?我们一起去看电影吧?', '女:你喜欢恐怖片和爱情片,但是我喜欢喜剧片,科幻片一般。所以……']"
"问题": "女的最喜欢哪种电影?"
"选项": "['恐怖片', '爱情片', '喜剧片', '科幻片']"}
Response:
```
**参考输出:**
```
{"答案": "喜剧片"}
```
### ⭐ 自然语言处理(文本主题分类)
**输入 prompts:**
```bash
Instruction: 请判断下面的句子属于哪个类别,类别包括文化、娱乐、体育、财经、房产、汽车、教育、科技、军事、旅游、国际、证券、农业、电竞、民生。
请直接输出类别,不要额外输出多余内容。
Input: 私募大佬抛弃了谁?
Response:
```
**参考输出:**
```
财经
```
## 续写小说
### ⭐ 使用“请扩写”指令扩写小说情节
🧐 此 prompt 目前还存在小问题:中文数字会变成阿拉伯数据
该类问题需要一定的创意,可适当提高 Temperature 和 Top\_P。建议 Temperature = 1.4 ,Top\_P = 0.4,Frequency Penalty、Presence Penalty = 0.5
**输入 prompts:**
```bash
Instruction: 请扩写
Input: 林凡和龙傲天大战。
Response: 林凡冷哼一声,
```
**参考续写结果:**
```bash
随后便是一拳轰出,这一拳威力极大,在林凡的身上,仿佛有着无穷的能量,不断地涌动着。
“砰!”
龙傲天脸色一变,连忙闪躲开来。
“小子,你以为你能够打败我吗?”龙傲天冷哼道。
“当然!”林凡淡淡道。
“好!既然如此,那就让我看看你到底有多强吧!”龙傲天大笑道。
“吼!”
龙傲天双手猛地一拍地面,顿时间大地震动起来,一股恐怖的气息从他体内散发而出。
“这是什么?竟然这么强?”林凡心中惊讶道。
“哈哈!小子,你可要小心了。”龙傲天狂笑道。
林凡见状也是脸色凝重起来,他知道自己遇到了强敌。1股恐怖的气息从龙傲天体内散发而出,让人感觉到非常的危险。
```
### ⭐ 续写《三体》小说情节
**输入 prompts:**
```bash
User: 已知: “当然可以,大宇宙不会因为这五公斤就不坍缩了。”关一帆说,他还有一个没说出来的想法:也许大宇宙真的会因为相差一个原子的质量而由封闭转为开放。大自然的精巧有时超出想象,比如生命的诞生,就需要各项宇宙参数在几亿亿分之一精度上的精确配合。但程心仍然可以留下她的生态球,因为在那无数文明创造的无数小宇宙中,肯定有相当一部分不响应回归运动的号召,所以,大宇宙最终被夺走的质量至少有几亿吨,甚至可能是几亿亿亿吨。 但愿大宇宙能够忽略这个误差。 程心和关一帆进入了飞船,智子最后也进来了。她早就不再穿那身华丽的和服了,她现在身着迷彩服,再次成为一名轻捷精悍的战士,她的身上佩带着许多武器和生存装备,最引人注目的是那把插在背后的武士刀。 “放心,我在,你们就在!”智子对两位人类朋友说。 聚变发动机启动了,推进器发出幽幽的蓝光,飞船缓缓地穿过了宇宙之门。 小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环境中静静地飘浮着,有一条小鱼从一只水球中蹦出,跃入另一只水球,轻盈地穿游于绿藻之间。在一小块陆地上的草丛中,有一滴露珠从一片草叶上脱离,旋转着飘起,向太空中折射出一缕晶莹的阳光。续写,智子爆炸过程,飞船外观,程心与关一帆的心理描写
Assistant:
```
**参考续写结果:**
```bash
智子爆炸过程中发出了强烈而耀眼的光芒,整个小宇宙都被照亮了。在这种强烈的光芒下,飞船外观变得模糊不清,只剩下几个点状物体在闪烁着微弱的光芒。
“我们已经进入黑暗区域了吗?”关一帆问道。
“不知道……”程心回答道。
两人沉默地坐在驾驶舱里,静静地等待着结果。他们感觉到自己正处于一种极度危险的境地之中,但同时也充满了对未来的期待和希望。
随着时间推移,飞船开始逐渐失去重力感应器所接收到的信号。这意味着他们已经进入了真空区域中——那里没有任何物质存在。
“我们还能坚持多久?”关一帆问道。
“我不知道……”程心回答道,她感觉自己已经快要支撑不住了。
就在这时候,智子爆炸产生的强烈光芒突然出现在他们面前。两人惊讶地看着那个巨大而耀眼的火球——它像是从宇宙深处喷涌而出一样。
“太神奇了!”关一帆赞叹道。
随着火球逐渐消失,飞船开始恢复重力感应器所接收到的信号。两人松了口气,同时也感受到自己身体内部传来的微弱震动——这是飞船重新进入真空区域后产生的效果。
整个小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中只有几个点状物体在闪烁着微弱的光芒。而生态球里则只剩下零重力环境中静静地飘浮着几条小鱼和清澈水晶般透明的绿藻之间游动着一条小鱼。
程心和关一帆坐在驾驶舱里,静静地等待着结果。他们感觉到自己正处于黑暗区域中,但同时也充满了对未来的期待和希望。他们知道这次旅行虽然充满了危险和挑战,但也带给他们无尽的启示和思考。
```
### ⭐ 生成《三体》小说续写大纲
**输入 prompts:**
```bash
User: 已知: “当然可以,大宇宙不会因为这五公斤就不坍缩了。”关一帆说,他还有一个没说出来的想法:也许大宇宙真的会因为相差一个原子的质量而由封闭转为开放。大自然的精巧有时超出想象,比如生命的诞生,就需要各项宇宙参数在几亿亿分之一精度上的精确配合。但程心仍然可以留下她的生态球,因为在那无数文明创造的无数小宇宙中,肯定有相当一部分不响应回归运动的号召,所以,大宇宙最终被夺走的质量至少有几亿吨,甚至可能是几亿亿亿吨。 但愿大宇宙能够忽略这个误差。 程心和关一帆进入了飞船,智子最后也进来了。她早就不再穿那身华丽的和服了,她现在身着迷彩服,再次成为一名轻捷精悍的战士,她的身上佩带着许多武器和生存装备,最引人注目的是那把插在背后的武士刀。 “放心,我在,你们就在!”智子对两位人类朋友说。 聚变发动机启动了,推进器发出幽幽的蓝光,飞船缓缓地穿过了宇宙之门。 小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环境中静静地飘浮着,有一条小鱼从一只水球中蹦出,跃入另一只水球,轻盈地穿游于绿藻之间。在一小块陆地上的草丛中,有一滴露珠从一片草叶上脱离,旋转着飘起,向太空中折射出一缕晶莹的阳光。生成续写的小说名,小说大纲
Assistant:
```
**参考小说大纲输出:**
```bash
小说名:《星际迷航:大宇宙的呼唤》
大纲:
第一章:命运之轮
程心和关一帆在飞船上谈论着生态球的未来,他们对于宇宙中无数文明创造的小宇宙充满了希望。但是,当他们准备离开时,智子突然出现了,她告诉他们,这个小宇宙并不是唯一的存在。
第二章:奇异世界
程心和关一帆进入了飞船,智子也跟随着他们。在穿越宇宙之门后,他们发现自己来到了一个奇异的世界。这里没有重力、没有光线、没有声音,只有黑暗和寂静。
第三章:新生命
在这个神秘的世界中,程心和关一帆遇到了一群神秘的生物。这些生物拥有着超凡的能力,可以操纵时间和空间。它们告诉程心和关一帆,这个世界是由大宇宙创造出来的,而大宇宙正在面临着巨大的危机。
第四章:决战之日
程心和关一帆决定留下来帮助这些神秘生物对抗大宇宙的威胁。他们与这些生物展开了激烈的战斗,最终成功地击败了敌人。但是,他们也意识到,大宇宙并不会因为失去几亿吨质量而消失。
第五章:新纪元
在战斗结束后,程心和关一帆回到了自己的世界。他们带着对未来的希望和信念,继续探索着宇宙的奥秘。而那个神秘的世界则成为了他们心中永恒的记忆。
结尾:
《星际迷航:大宇宙的呼唤》讲述了人类与神秘生物之间的故事,揭示了大宇宙背后隐藏着更多未知和奇妙。通过这个故事,我们可以看到人类在面对未知时所展现出来的勇气和智慧。同时,也让我们思考着人类与自然、科技之间的关系,以及如何更好地保护我们所居住的星球。
```
### ⭐ 直接输入前文续写小说
**输入 prompts:**
```bash
密西西比河中游,展现出一片生机勃勃、熙熙攘攘的河畔景象。河水在温暖的阳光下潺潺流淌,波光粼粼,河岸两边郁郁葱葱的植被在微风中轻轻摇曳。在芦苇丛和灌木丛之中,住着一只聪明机智的河狸,名叫本尼。
本尼一直为自己在河边的家感到无比自豪。他用灵巧的爪子建造了一座坚固的水坝巢穴,周围的区域都是他精心维护的领地。有一天,一个不受欢迎的身影出现在这个宁静的地方 —— 光头强。
光头强戴着破旧的帽子,拿着发出恐怖轰鸣声的电锯,怀着砍伐河岸珍贵树木的企图而来。他的行为瞬间打破了本尼世界的宁静。
本尼一看到光头强,那双圆溜溜的眼睛里立刻闪烁着坚定的光芒。他深知自己必须保护自己的家园以及周围美丽的自然环境。本尼毫不犹豫地开始谋划策略,准备与这个不速之客展开一场智慧的较量。
```
**参考输出:**
```bash
在河岸边,本尼悄悄地布置了一个精心设计的陷阱。他在河边的灌木丛中安装了一些特殊的触发器,只要光头强靠近,就会触发机关。这个陷阱看似简单,但是本尼已经精心设计了很久。
光头强终于靠近了河岸边的灌木丛。他兴致勃勃地拿起电锯,准备开始破坏这片美丽的景色。就在他刚刚将电锯放到一棵树上时,机关被触发了!
“轰隆隆——”电锯突然停止运转,光头强惊讶地看着自己手中失去动力的工具。他还没有反应过来时,本尼从灌木丛中猛然跳出来!
“哈哈哈!你以为你能破坏我的家园吗?我早已做好准备!”本尼用那双聪明而锐利的眼睛盯着光头强。他开始用自己聪明机智的方式与这个人斗智斗勇。
在接下来几天里,本尼和光头强展开了一场激烈而有趣的较量。每当光头强想要破坏树木时,本尼总能提前设置好陷阱;每当光头强试图通过暴力手段破坏河岸时,本尼总能想出更加巧妙的方法阻止他。
渐渐地,周围人们也被这场有趣而智慧的较量所吸引。人们开始意识到保护环境和珍惜自然资源是多么重要。
最终,在经过几天激烈斗争后,光头强意识到自己无法打败聪明而狡猾的本尼。他放下电锯并向大家道歉:“对不起大家!我不应该破坏这片美丽的河岸景色!”
听到这句话后,所有人都为之动容。
从此以后,本尼成为了河岸上众人心目中最聪明、最勇敢、最可爱的小英雄。他用自己独特而聪明机智的方式保护着家园和周围美丽景色。
【结尾】
小说以一个温馨而感人至深的结局告终:每当大家走过那片曾经被光头强破坏过但现在又重新焕发生机与活力的河岸时,都会不由自主地想起那只聪明勇敢、可爱至极、用智慧保护家园和周围环境美丽景色的小英雄——本尼。
(注:此文仅供娱乐参考)
```
# RWKV 的提示词格式
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
**RWKV 是 RNN 的变体。出于架构原理,RWKV 对提示词的格式比 Transformer 更敏感。**
RWKV 更适合 QA 和指令问答两种提示格式:
## QA 格式 prompt
QA(问答)格式是 RWKV 的默认训练格式。
其中 `User:` 是用户提问的问题,`Assistant:` 是模型的回答。因此我们需要在**最后一个** `Assistant:` 后面留空,让模型进行续写。
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文
Assistant:
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文
Assistant:
快思考模式是通过直接闭合 ` ` 或 `\n
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文
Assistant:
```
### 新推理风格
新的推理风格**适用于 G1c 及更新版本模型**。注意在提示词后的 `(think)` 前面有一个空格。
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文 (think)
Assistant:
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文 (think a bit)
Assistant:
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文 (think a lot)
Assistant:
## 指令问答格式 prompt
```bash
Instruction: 请将下列瑞典语翻译成中文
Input: hur l?ng tid tog det att bygga twin towers
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
RWKV7-G1 模型包含函数调用(function call)数据,可以通过特定格式的 prompt 实现 function call 功能。
RWKV7-G1 2.9B 模型,在续写模式下构造 function call 功能:
```bash
User: 你可以使用以下工具:
{
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取指定地区的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市或地区名称,例如:'北京'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,默认为摄氏度"
}
},
"required": ["location"]
}
}
},
{
"type": "function",
"function": {
"name": "calculate_math_expression",
"description": "计算数学表达式结果",
"parameters": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "数学表达式,例如:'(12+3.4)*5/2'"
}
},
"required": ["expression"]
}
}
}
]
}
请问:北京现在的天气如何?请给出json格式的调用格式
Assistant:
```
参考的回复:
````bash
...模型的思考过程...
```json
{
"name": "get_current_weather",
"parameters": {
"location": "北京",
"unit": "celsius"
}
}
```
````
通过在 Agent 或者 RAG 系统中解析此 json 请求,可以实现 function call 功能。
RWKV 基底模型未进行后训练,因此不支持 native tool calling。如果需要保持极高的 function call 准确度,建议对模型进行[微调](../../tutorials/advanced/Fine-Tune/Introduction)。
## 视频介绍
高画质视频请[跳转到 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_0 \cdot \gamma^d$,其中 $𝑃_0$ 是原始惩罚值,$γ$ 是 `Penalty Decay` 值,𝑑 是与“美”上次出现的位置的距离。
从公式可以看出来,惩罚减弱的速度由 `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$)。模型会牢记自己曾经生成过“美”字,此时**生成“美”字的概率很低**。
## 不同任务的推荐解码参数组合
我们为不同的任务提供了一些推荐的参数:
| 任务类型 | Top\_P | Temperature | Presence Penalty | Frequency Penalty | Penalty Decay |
| -------------- | ------ | ----------- | ---------------- | ----------------- | ------------- |
| 内容创作,需要有创意 | 0.8 | 0.6 | 2.0 | 0.2 | 0.99 |
| 默认参数,适合对话或一般任务 | 0.3 | 1.0 | 0.5 | 0.5 | 0.996 |
| 保守型任务,回答稳定且准确 | 0.3 | 0.3 | 0.0 | 0.0 | 0.996 |
| 机械任务,无随机性 | 0.0 | 0.0 | 0.0 | 0.0 | 0.996 |
* **创意类内容创作**:典型的例子是小说、故事创作,需要平衡 `Temperature` 和 `Top_P`,提供更多的**随机性**和**开放性**,让模型能生成更具想象力的表达。
* **默认参数**:适合闲聊或其他普通任务,解码参数相对平衡,可以根据 “是否需要创意” 适当调整 `Temperature`。
* **保守型任务**:如知识问答、代码任务等,需要稳定且准确的回答,因此大幅降低 `Top_P` 和 `Temperature` ,同时移除 `Presence Penalty` 和 `Frequency Penalty` 带来的惩罚。
* **机械任务**:如选择题、判断题等,需要严格遵循特定格式,只输出唯一解。因此所有解码参数均设为 0 ,以取消随机性。
`Top_P = 0` 时, `Temperature` 参数会失效。
# 为 RWKV 作贡献
import { CallOut } from 'components-docs/call-out/call-out.tsx'
我们期待你为 RWKV 作出贡献,无论是开展 RWKV 相关的研究、协助我们改进文档,或是提供 RWKV 的建议。
我们将不定期为 RWKV 生态的贡献者赠送礼品,或提供开发资源帮助。
此外,我们正在举办 [RWKV 2025 生态内容大赛](https://rwkv.cn/news/read?id=16),提供海量现金奖励,且所有投稿均可获得 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 群 332381861)中讨论并分享您的 RWKV 应用。
### 进行 RWKV 基准测试
想要让 RWKV 变得更好,则需要有可靠的测试方法来评估它的表现。
如果你能帮我们**设计全新的基准测试**,或者**运行一些常见的模型测试**,就能更清楚地看出 RWKV 和其他开源模型相比有什么优势和不足。
一个示例是由 RWKV 社区成员 [@Jellyfish042](https://github.com/Jellyfish042) 构建的 [Uncheatable Eval](https://github.com/Jellyfish042/uncheatable_eval),这是一项“无法作弊的 LLM 基准测试”,尝试使用新的 arXiv 论文和 BBC 新闻来评估语言模型的建模能力。
在 RWKV 技术研发群(QQ 群 332381861)中讨论并分享您关于 RWKV 的基准测试结果。
### 提供多语言数据集
RWKV 的目标是训练适用于**全球所有语言**的 AI 模型。
请帮助我们构建多语言(非英语)数据集,使 RWKV 模型能更好地支持全球语言。
可以在 RWKV discord 的 [#dataset channel](https://discord.gg/uMpzuDwcu5) 频道或 RWKV技术研发群(QQ 群 332381861)中参与此工作。
### 帮助我们开展多模态工作
欢迎大家探究 RWKV 语言模型之外的多模态工作,比如图像(Visual、Diffusion)、语音(TTS、ASR),或其他类型的工作。
RWKV 现有的多模态等学术研究可以在 [RWKV 生态](https://rwkv.cn/eco) 中找到:
一些代表性的 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 系列训练数据集**,包含全球一百多种语言。我们正在持续迭代 World 系列训练数据集,不断地提升数据集的规模和质量,使 RWKV 模型拥有强劲的多语言能力。
此章节简要介绍 RWKV World 系列数据集的数据组成、数据来源、数据量等信息。
## RWKV 数据集概况
目前 World 数据集共有以下版本:
| 版本号 | 总数据量 | 对应的 RWKV 基底模型 |
| ---------- | --------------------------- | ----------------------------------------- |
| 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 | 收集整理中 | RWKV7-G1 7B/14B 和更大参数模型 |
RWKV7-G1 0.1B 从 World v3.5 数据集中随机采样 1T tokens 训练
RWKV7-G1 0.4B 从 World v3.5 数据集中随机采样 2T tokens 训练
## 各版本数据集的细节
秉持着“开源开放”的精神,我们在 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 模型名的 v2 / v2.1 /v3 是什么意思?
v2 / v2.1 / v3 代表 RWKV 模型训练数据集的版本。
* v1 ≈ 0.59T tokens
* v2 ≈ 1.1T tokens
* v2.1 ≈ 1.42T tokens,v2.1 模型的总训练数据 ≈ 2.5T tokens
* v3 ≈ 3T tokens,v3 模型的总训练数据 ≈ 5.5T tokens
如果模型名称中未带有 v2 或以上版本,默认基于 v1 数据集。
如果想深入了解 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,供将来使用。
## 从头开始训练超过 20B 的 RWKV 需要多少成本?能不能给我一个简单的答案,需要多少钱?
简而言之:如果你没有接近 100 万美元的 GPU 资源,不要考虑这个任务。
虽然训练模型的成本不断下降,但大多数人低估了从头开始训练一个模型的任务成本。
训练模型涉及许多因素,最重要的是数据集的大小、模型参数的大小。你可能需要为训练过程中发生的错误买单,每次调整训练设置和训练的过程也涉及人力成本预算,这些因素使得整个训练过程难以准确预测。(更不用说涉及到那么多钱,你可能会对训练模型使用的数据集有要求,所有额外的数据集需求又需要更多时间和劳动力来进行准备。)
例如,预计 [从头开始训练 LLaMA2-70B 基础模型](https://twitter.com/moinnadeem/status/1681393075367841792) 需要 260 万美元 GPU 资源。虽然在理论上 RWKV 作为 RNN,训练起来应该比 transformer 更便宜。但即使是削减成 50 万美元成本,大多数个人或公司也无法承受。
因此,作为基本原则,除非你有接近 100 万美元的 GPU 资源和足够的人力预算来准备数据集,否则不建议从头开始训练任何超过 14B 的模型。
此时,有些人可能会问:是否可能只在一台单卡机器上训练?而不是昂贵的 GPU 集群?
理论上,只要你有训练 RWKV 模型所需的最小 vram(比如一张 A100)就可以在一台机器上训练。然而,对于较大的数据集。比如在 70B LLaMA2 / 2T token 的情况下 ,单张 A100 总共需要 1,720,320 小时,即 196 年。
没有人想等待 190 多年才能完成模型训练,因此我们通常在多个训练节点之间分担工作负载。很不幸,这不是一个完美的可扩展过程。因为每一个添加的节点都会降低训练效率,这涉及到 GPU 之间的高通信开销。
最终结果变成了一个非常复杂的数学问题:“你想要模型多快”与“你能支付多少钱”之间的平衡,更快的训练时间通常意味着总体上增加的成本。
**总结:根据训练速度的快/慢,从头训练超过 20B 的 RWKV 大概需要 100 到 500 万美元。**
> 如果你有 GPU 算力可以捐赠给 RWKV ,用于训练开源的软件模型,请通过你的研究机构等渠道请与我们联系 😉(不需要是 100 万美元的量级,即使是小量捐赠也能大有帮助)
## 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 为实验版本。
截至 2026 年 1 月,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(RWKV 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 在每个架构版本都发布了多种参数规模的开源模型。
截至 2025 年 6 月,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/file/view/master/rwkv7-g1a-0.1b-20250728-ctx4096.pth?status=2) |
| 0.4B 模型 | ✅ 已发布 | ✅ 已发布 | ❌ 无计划 | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv-7-world/files) | ✅ [已发布](https://modelscope.cn/models/Blink_DL/rwkv7-g1/file/view/master/rwkv7-g1a-0.4b-20250905-ctx4096.pth?status=2) |
| 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/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) |
| 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 模型的命名格式:
* rwkv7a-g1b-0.1b-20250819-ctx4096.pth
* rwkv7-g0a2-7.2b-20251005-ctx4096.pth
* rwkv7-g1a3-1.5b-20251015-ctx8192.pth
G1 模型名称中每个字段的含义:
| 字段 | 含义 |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **rwkv7a / rwkv7** | 模型架构版本,[rwkv7](https://rwkv.cn/news/read?id=20250320) 是最新的 RWKV 基础架构,rwkv7a 是在 rwkv7 的基础上加了 [DE](https://rwkv.cn/news/read?id=20250527) 机制,rwkv7b 在 rwkv7 的基础上加了 [DE](https://rwkv.cn/news/read?id=20250527) 和 [DEA](https://rwkv.cn/news/read?id=20250630) |
| **0.1b / 7.2b** | 模型的参数规模,"B"代表"Billions"(十亿) |
| **g1b / g0a2 / g1a3** | **训练数据的版本**,数据质量排序:G1b > G1a3 > G1a2 > G1a > G1 > G0a2 > G0 。RWKV7-G1a 模型是在 RWKV7-G1 模型的基础上继续训练优质数据,RWKV7-G1a2 则是在 RWKV7-G1a 模型的基础上继续添加数据训练,以此类推 |
| **20250819 / 20251005** | 模型的发布日期 |
| **ctx4096/ctx8192** | 预训练的上下文长度 |
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 / 20231113** | 模型的发布日期 |
| **ctx4096** | 预训练的上下文长度 |
## 我应该使用哪些 RWKV 模型?
由于老旧架构导致的性能问题, RWKV-6、RWKV-5、RWKV-4 全系列(Raven / World / Pile ...)和更早的 RWKV 版本均已结束生命周期,现有模型仅作为存档。
得益于最新的架构设计和最新数据集,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 模型**。
## 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 的不同架构版本。注意,推荐使用最新的 RWKV-7 系列模型 |
| **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 架构和 World v3.5 数据集训练的基底模型,支持**思考推理**(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 各版本的架构代码,以及配套的大语言模型训练实现
* [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/JL-er/RWKV-PEFT) :RWKV 高效微调仓库,包含 LoRA、Pissa、Lisa、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 上推理 RWKV 模型,支持 FP16 、量化 INT4、INT5 和 INT8 推理
### 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 模型推理框架
* [rwkv-kit](https://github.com/TorchRWKV/rwkv-kit):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 模型
## RAG (知识检索增强)系统
* [RWKV-RAG](https://github.com/AIIRWKV/RWKV-RAG):基于 RWKV 模型的一键 RAG 部署系统,可轻松搭建和管理本地知识库,同时提供了基于本地知识库的问答机器人和 RWKV 一键微调功能
## 聊天机器人/推理 API 服务器
* **(中文,推荐)** [RWKV runner](https://github.com/josStorer/RWKV-Runner):RWKV Runner 是 RWKV 模型的管理和启动工具,带用户友好的 GUI 界面,支持训练和推理
* **(中文,推荐)** [AI00 RWKV server](https://github.com/cgisky1980/ai00_rwkv_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/go-skynet/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](https://rwkv.cn/RWKV-Wiki/FAQ#rwkv-%E6%A8%A1%E5%9E%8B%E5%90%8D%E7%9A%84-v2--v21-v3-%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D) (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.1](https://huggingface.co/BlinkDL/rwkv-5-world) 系列,参数包含 0.4B、1B5、3B、7B,以及 3B(ctx16k) | World-v2 |
RWKV-5 全系列模型均已过时,RWKV-6 也将逐步淘汰,建议使用 RWKV-7 G1 模型。
### RWKV-6
RWKV-6 的版本代号是“Finch(雀)”,这个版本自 2023 年 10 月开发,是当前(2024 年 11 月)的稳定架构。
#### 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=1}^{t-1} \mathrm{diag}\left(\bigodot_{j=1}^{i-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 文件用法](https://rwkv.cn/news/read?id=343)。
RWKV 官方发布了不同类型的 **state 文件**:
| state 类型 | state 描述 | 适用 RWKV 模型 |
| ------------------------- | --------------------------------------------------------- | -------------------- |
| chn-single-round | 中文单轮对话增强,更符合人类语言习惯,带丰富的 Emoji 表情 | 通用 RWKV 模型 |
| eng-single-round | 英文单轮对话增强,更符合人类语言习惯,带丰富的 Emoji 表情 | 通用 RWKV 模型 |
| chn-小说扩写-single-round | 中文单轮对话,会根据用户输入进行小说扩写(建议使用 RWKV-6-ChnNovel 模型和 state 作为替代) | 通用 RWKV 模型 |
| chn-打油诗-single-round | 中文单轮对话,会根据用户输入创作打油诗 | 通用 RWKV 模型 |
| chn-文言文-single-round | 中文单轮对话,回答的风格会偏向文言文 | 通用 RWKV 模型 |
| chn-文言文和古典名著-single-round | 中文单轮对话,回答的风格会偏向文言文和古典名著 | 通用 RWKV 模型 |
| 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 在计算效率、任务表现和模型表达力全面超越 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$ 限制。
简单地说,传统注意力机制(如 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 = \begin{pmatrix} w_0 & \cdots & 0 \\ \cdots & \cdots & \cdots \\ 0 & \cdots & w_n \end{pmatrix} S_{t-1}$ | Trainable State Decay |
| RWKV-6 Finch | $S_t = \begin{pmatrix} w_{t,0} & \cdots & 0 \\ \cdots & \cdots & \cdots \\ 0 & \cdots & w_{t,n} \end{pmatrix} S_{t-1}$ | Dynamic State Decay |
| RWKV-7 Goose | $S_t = \begin{pmatrix} w_{t,0,0} & \cdots & w_{t,0,n} \\ \cdots & \cdots & \cdots \\ w_{t,n,0} & \cdots & w_{t,n,n} \end{pmatrix} S_{t-1}$ | 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")系列属于推理模型,基于 World v3.5 数据集继续训练 RWKV-7 "Goose" World 系列模型
RWKV7-G1 模型
RWKV-7-World 模型
RWKV-7-Pile 模型
RWKV7-G1 系列模型基于最新的 World v3.5 数据集训练而来,拥有较强的推理、代码和数学能力。
| 模型名称 | 模型描述 |
| ------------- | -------------------------------------- |
| rwkv7-g1-0.1b | 从 World v3.5 数据集中随机采样了 1T token 的数据训练 |
| rwkv7-g1-0.4b | 从 World v3.5 数据集中随机采样了 2T token 的数据训练 |
| rwkv7-g1-1.5b | 从 World v3.5 数据集中随机采样了 5T token 的数据训练 |
| rwkv7-g1-2.9b | 从 World v3.5 数据集中随机采样了 10T token 的数据训练 |
可以在 [RWKV7-G1 模型仓库](https://huggingface.co/BlinkDL/rwkv7-g1/tree/main) 查看所有 RWKV7-G1 系列模型。
World v3.5 数据集是 World V3 数据集的扩充版本,包含更多小说、网页、数学、代码和 reasoning 数据,总数据为 5.16T tokens。
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-V8 的 DeepEmbed
RWKV-8 首个特性 `DeepEmbed` 在 2025 年 5 月[公布](https://rwkv.cn/news/read?id=20250527)。`DeepEmbed` 可以实现类似 MoE 的优秀推理性能,同时无需占用显存,甚至无需占用内存,可以让稀疏的大模型真正部署到所有端侧设备。
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))
```
由于查表操作在推理时不占用 VRAM,这些向量在参数量层面几乎是"免费的"。因此,还可以进一步引入 n-gram(如 `bigram`、`trigram`),提升模型对词组/片段的建模能力。如果词表规模较大,也可结合 LoRA 技术降低显存和训练开销。
**【2026 年 1 月更新】**: 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)。
根据对不同模型的推理复杂度进行比较,Transformer 的时间复杂度为:O (T^2)、空间复杂度为:O (T^2),因此推理速度将会越来越慢,也越来越耗内存。而 RWKV 的时间复杂度为:O(T)、空间复杂度为 O(1)。RWKV 大模型通过对计算流程的优化,实现了恒定的推理速度,极大地减少了推理过程中的时间消耗。
此外,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 模型的显存需求
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
推荐使用 **FP16** 精度在本地部署并推理 RWKV 模型。当你的显存和内存不足时,可以使用 **INT8 或 NF4 等量化方法**运行 RWKV 模型,降低显存和内存需求。
从回答质量来说,同参数的模型 FP16 回答质量最好,INT8 与 FP16 质量相当,NF4 回答质量相比 INT8 明显降低。
模型的参数比量化更重要,比如 7B 模型 + INT8 量化,生成效果比 3B 模型 + FP16 更好。
以下是本地部署并运行 RWKV 模型的显存需求和生成速度:
以下是不同推理后端和对应量化方式(**默认量化所有层**)的显存/内存需求:
测试环境:
* 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,约等于每秒多少字)。
| 推理后端 | 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 模型的**预训练、微调和 RLHF 等训练方法**。
### 微调简介和准备工作
### 训练方法的详细教程
**预训练教程**基于 [RWKV-LM](https://github.com/BlinkDL/RWKV-LM) 仓库,训练流程和 RWKV 官方模型完全一致。
RWKV 官方微调仓库 [RWKV-PEFT](https://github.com/JL-er/RWKV-PEFT),包含常见的 `LoRA` 微调,也有 RWKV 模型特有的 `State-Tuning` 和 RWKV 社区成员 [@JL-er](https://github.com/JL-er) 开发的 `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 模型的**微调和 RLHF 等训练方法**,包含:
* 训练环境的配置、训练数据集的准备工作
* 各种具体的微调方法
### 微调简介和准备工作
### 微调方法的详细教程
**预训练教程**基于 [RWKV-LM](https://github.com/BlinkDL/RWKV-LM) 仓库,训练流程和 RWKV 官方模型完全一致。
推荐使用 RWKV 官方微调仓库 [RWKV-PEFT](https://github.com/JL-er/RWKV-PEFT),RWKV-PEFT 包含常见的 `LoRA` 微调、`PiSSA` 微调方法,也有 RWKV 模型特有的 `State-Tuning` 和 RWKV 社区成员 [@JL-er](https://github.com/JL-er) 开发的 `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) 仓库,训练流程和 RWKV 官方模型完全一致。
## 预训练案例
* [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)观看。
## 硬件需求
预训练需要的显存**比微调训练要高得多**。
以下是基于 `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 -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
```
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 和 CUDA 版本:
```bash
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
```
若输出类似 `2.7.1+cu128 True`,表示已安装 CUDA 12.8 版本的 pytorch 2.7.1, CUDA 工具包可用。
## 准备训练数据
请参考[准备训练数据](./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-7 架构,训练 RWKV-6 则填 x060 |
| `N_LAYER="12"` `N_EMBD="768"` | **模型层数和维度**,维度和层数决定预训练模型的参数大小,建议参考[硬件需求](#硬件需求)修改,N\_EMBD 必须 64 的倍数 |
| `CTX_LEN="4096"` | 预训练的**上下文长度**,必须是 512 的倍数。必须和上面准备训练数据时输出的 `--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-7 架构,训练 RWKV-6 则填 x060 |
| `N_LAYER="12"` `N_EMBD="768"` | **模型层数和维度**,维度和层数决定预训练模型的参数大小,建议参考[硬件需求](#硬件需求)修改,N\_EMBD 必须 64 的倍数 |
| `CTX_LEN="4096"` | 预训练的**上下文长度**,必须是 512 的倍数。 |
| `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),消费级 GPU 设置 `2`,A100 / H100 设置为 `200`。**此参数在新版 deepspeed 疑似 buggy,暂时弃用** |
| `--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` | 词表大小,默认为 `65536`。设为 0 则模型自动确定词汇表大小,适用于 char-level LM 和 `.txt` 数据 |
| `--weight_decay 0.001` | 权重衰减,保持默认值 `0.001` |
| `--head_size 64` | 头大小,保持默认值 `64` |
| `--accelerator gpu` | 加速器类型,必须是 `gpu` |
| `--precision bf16` | 训练精度,默认为 `bf16`,也支持 `fp32`, `tf32` |
| `--strategy deepspeed_stage_2` | 训练策略,默认 `deepspeed_stage_2`,更多训练策略请参考[DeepSpeed 训练策略](#deepspeed-训练策略) |
| `--enable_progress_bar True` | 是否在终端显示进度条,通常保持默认值 `True` |
### 开始预训练
训练参数调整完毕后,保存 `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` 文件 [Line 126](https://github.com/BlinkDL/RWKV-LM/blob/main/RWKV-v7/train_temp/src/model.py#L126) 处的 LORA 维度,确保 LORA 维度与 RWKV 模型参数完全对齐。
| | 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 训练策略
DeepSpeed 支持以下五种[训练策略](https://www.deepspeed.ai/tutorials/zero/#zero-overview):
| 策略名称 | 显存占用 | CPU 占用 | 训练速度 | 适用场景 | 特点说明 |
| ----------------- | :--: | :----: | :---: | ----------------- | -------------------------------------- |
| stage\_1 | 较高 | 低 | 最快 | 显存较为充足的训练集群 | 仅分片优化器状态,稳定高效,吞吐最佳 |
| stage\_2 | 中等 | 低 | 较快 | 消费级/科研机,显存不算充裕 | 分片优化器 + 梯度,显存更省,吞吐略受影响 |
| stage\_2\_offload | 较低 | 中 | 中等 | 显存有限但 CPU 较强 | 将优化器状态 offload 到 CPU/NVMe,显存大幅下降,但通信变多 |
| stage\_3 | 很低 | 中 | 中等~偏慢 | 大模型(>7B)必需 | 分片参数本身,省显存,但通信复杂 |
| stage\_3\_offload | 最低 | 高 | 最慢 | 极小显存 + 强 CPU/NVMe | 显存最低,但训练速度依赖带宽,显著变慢 |
对于**多 GPU、大 Batch、全参数更新**的全参微调/预训练场景,**`deepspeed_stage_2` 是综合考虑了节约显存、保留训练性能、轻松部署的最佳折中点。**
在 LoRA 等参数高效微调场景中,推荐 `deepspeed_stage_1` 。
参考文档:
* [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)曲线、学习率变化等指标
### 常见问题
重新运行 `sh demo-training-run.sh` 命令,训练程序会自动检测最新检查点并继续训练。
注意,多次中断会造成 loss 的损失,每次中断损失约为 0.0008。
* 在显存允许的情况下,尽可能增大 `M_BSZ` 参数,增大 `M_BSZ` 会增大显存占用,但也会加快训练速度
* 确保 `deepspeed_stage_2` 训练策略,该策略在显存和速度之间取得了最佳平衡
* 确保打开了梯度累积 `GRAD_CP=1` 节省显存,`GRAD_CP=0` 虽然可加快训练,但消耗更多显存
* 确认已初始化一个 `rwkv-init` 模型
* 检查 `data_file` 参数是否正确,确保数据文件路径存在且可访问
* 检查 `CTX_LEN` 参数是否和 `make_data.py` 时使用的上下文长度一致
* 检查 `my_exit_tokens` 和 `magic_prime` 参数是否和 `make_data.py` 时得到的参数一致
# 体验 RWKV 模型的在线 Demo
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
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
我们也提供了 **RWKV7-G1 系列推理模型**的在线对话 Demo:
可在此 Demo 体验已完成训练的 RWKV7-G1 系列模型。
这个精美的 RWKV 对话界面由 RWKV 社区成员 [@Leon](https://leoncat.top/) 开源,仓库地址:[web-rwkv-realweb](https://github.com/SolomonLeon/web-rwkv-realweb)。
### Hugging Face 续写模式
### ModelScope 续写模式
上述公共 Demo 只能使用续写模式,不支持直接对话。
如果你在公共 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 模型的性能需求
推荐使用 **FP16** 精度在本地部署并推理 RWKV 模型。当你的显存和内存不足时,可以使用 **INT8 或 NF4 等量化方法**运行 RWKV 模型,降低显存和内存需求。
从回答质量来说,同参数的模型 FP16 回答质量最好,INT8 与 FP16 质量相当,NF4 回答质量相比 INT8 明显降低。
模型的参数比量化更重要,比如 7B 模型 + INT8 量化,生成效果比 3B 模型 + FP16 更好。
以下是本地部署并运行 RWKV 模型的显存需求和生成速度:
以下是不同推理后端和对应量化方式(**默认量化所有层**)的显存/内存需求:
测试环境:
* 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,约等于每秒多少字)。
| 推理后端 | 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 { 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)观看。
## 如何选择最好的模型?
* 1️⃣ 选择**最新的架构**,例如 RWKV7 > RWKV6
* 2️⃣ 选择**数据集更好**的模型,数据集质量排序:G1b > G1a3 > G1a2 > G1a > G1 > G0a2 > G0
* 3️⃣ **看模型名称中的日期**,相同的参数,模型越新越好!比如同样是 1.5B 模型,发布于 `251005` 的 G1a2 版本必定优于 `250429` 的 G1 版本
## RWKV7-G1 推理模型
RWKV7-G1 系列模型拥有杰出的推理能力,且原生支持世界 100+ 种语言和代码。即使是最小的 0.1B 也能回答开放性和创造性问题。
**G0/G1/G1a2/G1b 是什么?**
RWKV 模型名称中的 G0a/G1a/G1a2 等字段是**训练数据的版本**,数据质量排序:G1b > G1a3 > G1a2 > G1a > G1 > G0a2 > G0 。
RWKV7-G1 推理模型基于 World v3.5 数据集(包含更多小说、网页、数学、代码和 reasoning 数据,共 5.16T tokens)继续训练 RWKV-7 "Goose" World 系列模型。
RWKV7-G1a 模型是在 RWKV7-G1 模型的基础上继续训练了 1T 优质推理和指令数据,RWKV7-G1a2 则是在 RWKV7-G1a 模型的基础上继续添加数据训练,以此类推。
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'
## 视频介绍
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1XXQ3YoEXW/)观看。
***
**RWKV 是 RNN 的变体。出于架构原理,RWKV 对提示词的格式比 Transformer 更敏感。**
RWKV 更适合 QA 和指令问答两种提示格式:
## QA 格式 prompt
QA(问答)格式是 RWKV 的默认训练格式。
其中 `User:` 是用户提问的问题,`Assistant:` 是模型的回答。因此我们需要在**最后一个** `Assistant:` 后面留空,让模型进行续写。
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文
Assistant:
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文
Assistant:
快思考模式是通过直接闭合 ` ` 或 `\n
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文
Assistant:
```
### 新推理风格
新的推理风格**适用于 G1c 及更新版本模型**。注意在提示词后的 `(think)` 前面有一个空格。
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文 (think)
Assistant:
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文 (think a bit)
Assistant:
```bash
User: 将瑞典语 hur l?ng tid tog det att bygga twin towers 翻译成中文 (think a lot)
Assistant:
## 指令问答格式 prompt
```bash
Instruction: 请将下列瑞典语翻译成中文
Input: hur l?ng tid tog det att bygga twin towers
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
RWKV7-G1 模型包含函数调用(function call)数据,可以通过特定格式的 prompt 实现 function call 功能。
RWKV7-G1 2.9B 模型,在续写模式下构造 function call 功能:
```bash
User: 你可以使用以下工具:
{
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取指定地区的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市或地区名称,例如:'北京'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,默认为摄氏度"
}
},
"required": ["location"]
}
}
},
{
"type": "function",
"function": {
"name": "calculate_math_expression",
"description": "计算数学表达式结果",
"parameters": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "数学表达式,例如:'(12+3.4)*5/2'"
}
},
"required": ["expression"]
}
}
}
]
}
请问:北京现在的天气如何?请给出json格式的调用格式
Assistant:
```
参考的回复:
````bash
...模型的思考过程...
```json
{
"name": "get_current_weather",
"parameters": {
"location": "北京",
"unit": "celsius"
}
}
```
````
通过在 Agent 或者 RAG 系统中解析此 json 请求,可以实现 function call 功能。
RWKV 基底模型未进行后训练,因此不支持 native tool calling。如果需要保持极高的 function call 准确度,建议对模型进行[微调](../advanced/Fine-Tune/Introduction)。
# 如何调整 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_0 \cdot \gamma^d$,其中 $𝑃_0$ 是原始惩罚值,$γ$ 是 `Penalty Decay` 值,𝑑 是与“美”上次出现的位置的距离。
从公式可以看出来,惩罚减弱的速度由 `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$)。模型会牢记自己曾经生成过“美”字,此时**生成“美”字的概率很低**。
## 不同任务的推荐解码参数组合
我们为不同的任务提供了一些推荐的参数:
| 任务类型 | Top\_P | Temperature | Presence Penalty | Frequency Penalty | Penalty Decay |
| -------------- | ------ | ----------- | ---------------- | ----------------- | ------------- |
| 内容创作,需要有创意 | 0.8 | 0.6 | 2.0 | 0.2 | 0.99 |
| 默认参数,适合对话或一般任务 | 0.3 | 1.0 | 0.5 | 0.5 | 0.996 |
| 保守型任务,回答稳定且准确 | 0.3 | 0.3 | 0.0 | 0.0 | 0.996 |
| 机械任务,无随机性 | 0.0 | 0.0 | 0.0 | 0.0 | 0.996 |
* **创意类内容创作**:典型的例子是小说、故事创作,需要平衡 `Temperature` 和 `Top_P`,提供更多的**随机性**和**开放性**,让模型能生成更具想象力的表达。
* **默认参数**:适合闲聊或其他普通任务,解码参数相对平衡,可以根据 “是否需要创意” 适当调整 `Temperature`。
* **保守型任务**:如知识问答、代码任务等,需要稳定且准确的回答,因此大幅降低 `Top_P` 和 `Temperature` ,同时移除 `Presence Penalty` 和 `Frequency Penalty` 带来的惩罚。
* **机械任务**:如选择题、判断题等,需要严格遵循特定格式,只输出唯一解。因此所有解码参数均设为 0 ,以取消随机性。
`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 { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
RWKV-FLA 是一个专为 RWKV 模型系列提供的高性能推理和训练框架,它利用 Triton 内核来加速 RWKV 模型的性能。
以下教程基于 NVIDIA(CUDA)显卡。
## 特性与优势
* **跨平台支持**:支持多种硬件后端,包括 NVIDIA、Intel、AMD、摩尔线程、沐曦等
* **高性能实现**:基于 Triton 内核优化,提供高效的计算性能
* **灵活的API**:提供友好的接口,易于与现有代码集成
* **精度与稳定性**:在 NVIDIA 4090、H100 和 Intel A770 上经过验证
## 安装指南
对于消费级显卡(4090及以下),我们建议使用稳定版本的 Triton。
依次运行以下命令安装 RWKV-FLA 及相关依赖:
```bash
# 创建新环境(支持 Python 3.10 ~ 3.13)
conda create -n rwkv-fla python=3.12
# 进入刚刚创建的环境
conda activate rwkv-fla
# 安装相关依赖
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
# 安装最新版的 RWKV-FLA
pip install --upgrade rwkv-fla
```
推荐使用主流的 Linux 发行版,Windows 和 Mac 系统未经全面验证,不推荐使用。
Triton nightly 是 Triton 最新的测试版,nightly 版本加上新语法在 end to end 速度上提升 13%。但未经过大规模测试,可能会出现 bug。
要使用 Triton nightly 版本,建议按照以下步骤创建一个全新的环境:
```bash
# 创建新环境(推荐)
conda create -n triton-nightly python=3.12
conda activate triton-nightly
# 安装 PyTorch nightly (与 Triton nightly 兼容所必需)
pip install -U --pre torch --index-url https://download.pytorch.org/whl/nightly/cu126
# 安装 Triton nightly
pip uninstall triton pytorch-triton -y
pip install -U triton-nightly --index-url http://pypi.fla-org.com/simple --trusted-host pypi.fla-org.com
# 安装 flash-linear-attention
pip install einops ninja datasets transformers numpy
pip uninstall flash-linear-attention && pip install -U --no-use-pep517 git+https://github.com/fla-org/flash-linear-attention --no-deps
# 可选:安装 flash-attention
conda install nvidia/label/cuda-12.6.3::cuda-nvcc
pip install packaging psutil ninja
pip install flash-attn --no-deps --no-cache-dir --no-build-isolation
```
## 模型推理示例
使用 RWKV-FLA 进行 RWKV 模型推理非常简单,与 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 rwkvfla.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 rwkvfla.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
)
```
## 常见问题与解决方案
### H100 上的 MMA 断言错误
**错误信息**:
```
Assertion `!(srcMmaLayout && dstMmaLayout && !srcMmaLayout.isAmpere()) && "mma -> mma layout conversion is only supported on Ampere"' failed.
```
**解决方案**:
这个问题已在 [PR #4492](https://github.com/triton-lang/triton/pull/4492) 中修复。请安装 nightly 版本,参照上述安装指南。
### 'NoneType' 对象没有 'start' 属性
**解决方案**:
这是已知问题 ([triton-lang/triton#5224](https://github.com/triton-lang/triton/issues/5224))。请升级到 Python 3.10 或更高版本。
### H100 LinearLayout 断言错误
**错误信息**:
```
mlir::triton::LinearLayout::reshapeOuts(...) failed.
```
**解决方案**:
这是已知问题 ([triton-lang/triton#5609](https://github.com/triton-lang/triton/issues/5609))。请参照前文 MMA 断言错误的解决方案安装最新版本。
## 注意事项
* 虽然 RWKV-FLA 支持多种硬件平台,但目前仅在 NVIDIA 4090、H100 和 Intel A770 上经过全面验证
* 如遇到平台特定问题(如 Triton 版本、精度异常等),建议优先向相应硬件厂商反映
* 不建议直接调用底层计算内核,除非有特殊需求并已充分了解代码实现
## 版本要求
* 推荐使用 Triton 3.2.0 及以上版本
* 特别推荐使用 Triton nightly 版本以获取最新功能和bug修复
# RWKV pip 使用指南
import { CallOut } from 'components-docs/call-out/call-out.tsx'
以下内容将通过两份**推理示例代码**,指引你**使用 [RWKV pip 库](https://pypi.org/project/rwkv/)**。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-v7 模型支持(如果你用的是 v6 模型,请注释掉或设为 0)
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-v7 架构的模型。如果加载的是 v6 或 v5 模型,请务必将其关闭或删除。
此外,`RWKV_CUDA_ON='1'` 需要你的环境中配置好了 `nvcc` 编译器(通常包含在 CUDA Toolkit 中),否则会回退到较慢的 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 # Nucleus 采样:0.0 通常意味着贪婪采样(或由库的具体实现决定,RWKV中 0 通常指argmax)
# 提示词 (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,用于**实现基于命令行的聊天机器人**。
下文将以详细的注释,分段介绍这个聊天机器人 DEMO 的代码设计。
### 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 算子,改成 '1' 表示启用 CUDA 算子(速度更快,但需要 c++ 编译器和 CUDA 库)
```
在推理 RWKV-7 模型时,请务必将 `os.environ["RWKV_V7_ON"]` 设置为 `1` 。
这里是一些加快推理速度的 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 pip 库的推理精度与显存需求
下表中 ,`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 层(`*20` 指层数)量化为 fp16i8,其余层使用 fp16 加载。 如果量化后还有较多 VRAM ,则酌情减少 fp16i8 层数(减少 20)。 如果 VRAM 不足则继续增加 fp16i8 量化层数 |
| **cuda fp16i8 \*20+** | 比 fp16i8 使用更少 VRAM | 将模型的前 20 层(`*20` 指层数)量化为 fp16i8 并固定在 GPU 上,其他层按需动态加载(未固定的层加载速度会慢 3 倍,但节省 VRAM)。 如果 VRAM 不足,减少固定层数(`*20`)。 如果 VRAM 充足,增加固定层数。 |
| **cuda fp16i8 \*20 -> cpu fp32** | 比 fp16i8 使用更少 VRAM,但消耗更多内存 | 将模型的前 20 层(`*20`)量化为 fp16i8 并固定在 GPU 上,其他层使用 CPU fp32 加载。当 CPU 性能比较强时,此策略比上一个策略(只在 GPU 上固定 20 层)更快。 如果加载 20 层还有剩余 VRAM ,则继续增加 GPU 层数。 如果没有足够 VRAM,减少 GPU 层数。 |
| **cuda:0 fp16 \*20 -> cuda:1 fp16** | 使用双卡驱动模型 | 使用 cuda:0(卡1) fp16 加载模型的前 20 层,然后使用 cuda:1(卡2) fp16 加载剩余的层(自动计算剩余层数)。 建议在最快的 GPU 上运行更多层。 如果某张卡的 VRAM 不够,可以将 fp16 换成 fp16i8 (int8 量化)。 |
# 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** 是一个高性能推理和训练框架,利用 Triton 内核加速 RWKV 模型的性能。
**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/ggerganov/llama.cpp) 是一个轻量化的大语言模型运行框架,专门优化了在 CPU 上运行模型的性能。
随着 RWKV 社区成员 [@MollySophia](https://github.com/MollySophia) 的工作,llama.cpp 现已适配 RWKV-6/7 模型。
本章节介绍如何在 llama.cpp 中使用 RWKV 模型进行推理。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1hgcdeqEW8/)观看。
## llama.cpp 推理 RWKV 模型
### 本地构建 llama.cpp
可以选择从 [llama.cpp 的 release 页面](https://github.com/ggerganov/llama.cpp/releases)下载已编译的 llama.cpp 程序。
llama.cpp 提供了多种预编译版本,根据你的显卡类型选择合适的版本:
| 系统类型 | GPU 类型 | 包名称字段 |
| ------- | ----------------------- | ----------------------- |
| macOS | 苹果芯片 | macos-arm64.zip |
| Windows | 英特尔 GPU(含 Arc 独显/Xe 核显) | win-sycl-x64.zip |
| Windows | 英伟达 GPU(CUDA 11.7-12.3) | win-cuda-cu11.7-x64.zip |
| Windows | 英伟达 GPU(CUDA 12.4+) | win-cuda-cu12.4-x64.zip |
| Windows | AMD 和其他 GPU(含 AMD 核显) | win-vulkan-x64.zip |
| Windows | 无 GPU | win-openblas-x64.zip |
也可以参照 [llama.cpp 官方构建文档](https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md),选择适合的方法本地编译构建。
### 获取 gguf 格式模型
llama.cpp 支持 `.gguf` 格式的模型,但 RWKV 官方仅发布了 `.pth` 格式模型。因此,我们需要使用以下两种方法之一获取 `.gguf` 格式的 RWKV 模型。
可以从 [RWKV-GGUF 合集](https://modelscope.cn/collections/RWKV-7-G1-GGUF-a5174274c32f4a) 下载 gguf 格式的 RWKV 模型。
请在 llama.cpp 目录下新建一个 models 文件夹,将下载的 gguf 模型放入 models 文件夹中。
RWKV gguf 模型有**多种量化类型**,精度越高,模型的回复效果越好,但模型体积和计算要求越高。
推荐顺序:`FP16` > `Q8_0` > `Q5_K_M` > `Q4_K_M` ,更低的量化精度(如 `Q3_0`、`Q2_0` 等)可能会大大降低模型的性能。
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) 下载 `convert_hf_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 copy
./llama-cli -m models/rwkv-6-world-7b-Q8_0.gguf -p "You are a helpful assistant" -cnv -t 8 -ngl 99 -r "\n\n"
```
这条命令通过 `llama-cli` 运行 `models/rwkv-6-world-7b-Q8_0.gguf` 模型,使用 8 个线程、并根据给定的初始 prompt `You are a helpful assistant` 开启对话。
**参数解释:**
* `./llama-cli`:启动编译好的 llama-cli 程序
* `-m models/rwkv-6-world-7b-Q8_0.gguf`:模型的路径参数
* `-p "You are a helpful assistant"`:初始 prompt 参数,模型根据该提示词开启对话
* `-cnv`:开启对话模式,此参数为默认参数,可以省略
* `-t 8`:指定线程数,建议根据可用的物理 CPU 核心数调整,可以省略(省略则默认为物理核心数)
* `-ngl`:指定使用 GPU 加载的模型层数,可以通过设定 `-ngl 99`,使用 GPU 加载 RWKV 模型所有层
* `-r`:用于以字符串形式匹配的停止词,rwkv模型需要指定为"\n\n"(双换行)
完整的参数列表可以在 [llama.cpp 参数文档](https://github.com/ggml-org/llama.cpp/blob/master/tools/main/README.md#input-prompts)中查看。
## 附加功能(可选)
### 启用续写模式
`./llama-cli` 默认是对话模式。可通过添加 `-no-cnv` 参数设置为续写模式,根据给定的 prompt 继续生成文本。
```bash copy
./llama-cli -m models/rwkv-6-world-7b-Q8_0.gguf -p "User: What's mbti?tell me in chinese.\n\nAssistant:" -no-cnv -t 8 -ngl 99 -n 500
```
* `-p "User: What's mbti?tell me in chinese.\n\nAssistant:"`: prompt 参数,模型根据该提示词进行续写。更多 RWKV prompt 格式请在 [RWKV 的提示词格式](../basic/Prompt-Format)中查看
* `-no-cnv` 参数:关闭对话模式,设置 llama.cpp 为续写模式,模型会根据给定的 prompt 继续生成文本
* 其他参数:与对话模式相同
### 启动 Web 服务(推荐)
使用以下命令,启动 llama.cpp 的 Web 服务:
```bash copy
./llama-server -m models/rwkv-6-world-7b-Q8_0.gguf -ngl 99 -r "\n\n"
```
启动后,可以通过 `http://127.0.0.1:8080` 访问 llama.cpp Web 页面:
### 量化 gguf 模型
在 llama.cpp 目录运行 `./llama-quantize [input_model] [output_model] [quantization_type]` 命令,可以对 `fp32` 和 `fp16` 的 `.gguf` 模型进行量化,例如:
```bash copy
./llama-quantize models/rwkv-6-world-1.6b-F16.gguf models/rwkv-6-world-1b6-Q8_0.gguf Q8_0
```
输入模型的精度限制为 `fp32` 和 `fp16`,推荐使用 `Q5_1`、 `Q8_0` 两种量化精度。
使用 `./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'
基于 [Albatross](https://github.com/BlinkDL/Albatross) 和 [Robyn](https://github.com/sparckles/Robyn) 的 RWKV 批量推理后端,具备原生的批量推理能力,同时设计了多种一键调用的批量推理 API 调用方式。
原生支持 Nvidia 显卡和 AMD 显卡的高并发推理,实测在单卡 5090 上以 960 路并发可以达到 10000+token/s。
* 项目地址:[https://github.com/RWKV-Vibe/rwkv\_lightning](https://github.com/RWKV-Vibe/rwkv_lightning)
## 安装依赖
```bash
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130
pip install robyn pydantic ninja numpy
[可选] pip install flashinfer-python
```
Flashinfer-python 目前尚未官方移植到 AMD ROCm,请等待官方兼容。我们实际尝试过移植它,但 Flash Infer 库有点抽象且庞大。本项目使用了基于 Pytorch 的 top\_k top\_p 解码来实现 Flash infer CUDA GPU 解码内核。
```bash
pip install torch torchvision --index-url https://download.pytorch.org/whl/rocm6.4
pip install robyn pydantic ninja numpy
```
## 启动应用
如果不需要密码,可以不添加 `--password` 标志。
```bash
python app.py --model-path --port --password rwkv7_7.2b
```
```bash
python app.py --model-path --port --password rwkv7_7.2b --pp-devices [0,1,2,3]
```
如果出现图示输出,则说明启动成功。
启动后,可以使用以下指令测试。
```bash
bash ./test/test_curl.sh
```
## 性能优化提示
如果想获得最大程度的性能优化,可以使用 `torch.compile(mode='max-autotune-no-cudagraphs')`。
**因为需要先编译 Triton 内核,首次推理请求时会很慢。**
可以修改 `rwkv_batch/rwkv7.py` 第 30、31 行的代码来实现该优化:
```python
MyFunction = torch.compile(mode='max-autotune-no-cudagraphs')
MyStatic = torch.compile(mode='max-autotune-no-cudagraphs')
```
## API 文档
rwkv\_lightning 高并发推理库支持多种 API 调用格式,下面我们将给出不同端点的调用示例和对应的解释。
### 1. `v1/chat/completions`
使用 Rapid-Sampling,支持所有解码参数。
对于 V1 端点的调用方法,解码参数功能和使用其他工具调用 RWKV 系列模型时一致;
进行批量推理时,要使用指定格式的批量输入,格式如下面的 `contents` 所示,使用 `""` 包裹单条数据,数据间使用 `,` 分隔。
最终会得到如下格式的输出:
```
data: {"object": "chat.completion.chunk", "choices": [{"index": 0, "delta": {"content": "输出内容"}}]}
```
其中 `index` 为当前回复对应的条数(从 0 开始),`content` 为输出的具体内容。
```bash
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"contents": [
"English: After a blissful two weeks, Jane encounters Rochester in the gardens. He invites her to walk with him, and Jane, caught off guard, accepts. Rochester confides that he has finally decided to marry Blanche Ingram and tells Jane that he knows of an available governess position in Ireland that she could take.\n\nChinese:",
"English: That night, a bolt of lightning splits the same chestnut tree under which Rochester and Jane had been sitting that evening.\n\nChinese:"
],
"max_tokens": 1024,
"stop_tokens": [0, 261, 24281],
"temperature": 0.8,
"top_k": 50,
"top_p": 0.6,
"alpha_presence": 1.0,
"alpha_frequency": 0.1,
"alpha_decay": 0.99,
"stream": true,
"password": "rwkv7_7.2b"
}'
```
```bash
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"contents": [
"English: After a blissful two weeks, Jane encounters Rochester in the gardens. He invites her to walk with him, and Jane, caught off guard, accepts. Rochester confides that he has finally decided to marry Blanche Ingram and tells Jane that he knows of an available governess position in Ireland that she could take.\n\nChinese:",
"English: That night, a bolt of lightning splits the same chestnut tree under which Rochester and Jane had been sitting that evening.\n\nChinese:"
],
"max_tokens": 1024,
"stop_tokens": [0, 261, 24281],
"temperature": 0.8,
"top_k": 50,
"top_p": 0.6,
"alpha_presence": 1.0,
"alpha_frequency": 0.1,
"alpha_decay": 0.99,
"stream": false,
"password": "rwkv7_7.2b"
}'
```
### 2. `v2/chat/completions`
使用 FlashInfer Sampling,支持所有解码参数。
和 V1 基本一致,使用的 Sampling 方法不同,在不同设备上时存在性能差异。
```bash
curl -X POST http://localhost:8000/v2/chat/completions \
-H "Content-Type: application/json" \
-N \
-d '{
"contents": [
"English: After a blissful two weeks, Jane encounters Rochester in the gardens. He invites her to walk with him, and Jane, caught off guard, accepts. Rochester confides that he has finally decided to marry Blanche Ingram and tells Jane that he knows of an available governess position in Ireland that she could take.\n\nChinese:",
"English: That night, a bolt of lightning splits the same chestnut tree under which Rochester and Jane had been sitting that evening.\n\nChinese:"
],
"max_tokens": 1024,
"stop_tokens": [0, 261, 24281],
"temperature": 1.0,
"top_k": 1,
"top_p": 0.3,
"pad_zero": true,
"alpha_presence": 0.8,
"alpha_frequency": 0.8,
"alpha_decay": 0.996,
"chunk_size": 128,
"stream": true,
"password": "rwkv7_7.2b"
}'
```
```bash
curl -X POST http://localhost:8000/v2/chat/completions \
-H "Content-Type: application/json" \
-d '{
"contents": [
"English: After a blissful two weeks, Jane encounters Rochester in the gardens. He invites her to walk with him, and Jane, caught off guard, accepts. Rochester confides that he has finally decided to marry Blanche Ingram and tells Jane that he knows of an available governess position in Ireland that she could take.\n\nChinese:",
"English: That night, a bolt of lightning splits the same chestnut tree under which Rochester and Jane had been sitting that evening.\n\nChinese:"
],
"max_tokens": 1024,
"stop_tokens": [0, 261, 24281],
"temperature": 1.0,
"top_k": 1,
"top_p": 0.3,
"pad_zero": true,
"alpha_presence": 0.8,
"alpha_frequency": 0.8,
"alpha_decay": 0.996,
"chunk_size": 32,
"stream": false,
"password": "rwkv7_7.2b"
}'
```
### 3. `/big_batch/completions`
**最快的批处理 API**,输入输出格式和 V1 基本一致。
仅支持 `noise` 和 `temperature` 解码参数。
```bash
curl -X POST 'http://localhost:8000/big_batch/completions' \
--header 'Content-Type: application/json' \
--data '{
"contents": [
"English: That night, a bolt of lightning splits the same chestnut tree under which Rochester and Jane had been sitting that evening.\n\nChinese:",
"English: That night, a bolt of lightning splits the same chestnut tree under which Rochester and Jane had been sitting that evening.\n\nChinese:"
],
"max_tokens": 1024,
"stop_tokens": [0, 261, 24281],
"temperature": 1.0,
"chunk_size": 8,
"stream": true,
"password": "rwkv7_7.2b"
}'
```
### 4. `/openai/v1/chat/completions`
支持 Open AI 格式。
相关专项测试脚本:
```bash
python test/test_openai_adapter.py
python test/test_openai_routes.py
```
```bash
curl -X POST 'http://localhost:8000/openai/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer your-password-if-set' \
--data '{
"model": "rwkv7",
"messages": [
{"role": "user", "content": "please tell me about the history of artificial intelligence"}
],
"top_p": 0.6,
"max_tokens": 2048,
"temperature": 0.8,
"stream": true
}'
```
```bash
curl -X POST 'http://localhost:8000/openai/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer your-password-if-set' \
--data '{
"model": "rwkv7",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "please tell me about the history of artificial intelligence"}
],
"top_p": 0.6,
"max_tokens": 2048,
"temperature": 1,
"stream": false
}'
```
带有 `session_id` 的有状态增量 Open AI API:
```bash
curl -X POST 'http://localhost:8000/openai/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer your-password-if-set' \
--data '{
"model": "rwkv7",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Please continue from our last turn and give me 3 short ideas."}
],
"top_p": 0.6,
"max_tokens": 2048,
"temperature": 1,
"stream": false
}'
```
### 5. 批量同步翻译
兼容沉浸式翻译自定义 API。
```bash
curl -X POST http://localhost:8000/translate/v1/batch-translate \
-H "Content-Type: application/json" \
-d '{
"source_lang": "en",
"target_lang": "zh-CN",
"text_list": ["Hello world!", "Good morning"]
}'
```
```bash
curl -X POST http://localhost:8000/translate/v1/batch-translate \
-H "Content-Type: application/json" \
-d '{
"source_lang": "zh-CN",
"target_lang": "en",
"text_list": ["你好世界", "早上好"]
}'
```
### 6. `state/chat/completions`
单条输入和回复专用端点,进行了推理速度上的优化。
**支持状态缓存管理器,设计了 3 级缓存设计:**
* **L1 缓存 (显存) 16**
* **L2 缓存 (内存) 32**
* **L3 缓存 (Sqlite3 数据库)**
关闭服务器时,所有缓存的状态都将存储在数据库中。可以在 `./state_pool.py` 的第 14-16 行修改缓存大小。
**注意:**
* 需要在请求体中添加唯一的 `"session_id": "XXX"` 作为每个会话的唯一标识符
```bash
curl -X POST http://localhost:8000/state/chat/completions \
-H "Content-Type: application/json" \
-N \
-d '{
"contents": [
"User: What should we eat for dinner? Any brief suggestions?\n\nAssistant: \n \n"
],
"max_tokens": 1024,
"stop_tokens": [0, 261, 24281],
"temperature": 0.8,
"top_k": 50,
"top_p": 0.6,
"alpha_presence": 1.0,
"alpha_frequency": 0.1,
"alpha_decay": 0.99,
"stream": true,
"chunk_size": 128,
"password": "rwkv7_7.2b",
"session_id": "session_one"
}'
```
```bash
curl -X POST http://localhost:8000/state/chat/completions \
-H "Content-Type: application/json" \
-d '{
"contents": [
"User: What should we eat for dinner? Any brief suggestions?\n\nAssistant: \n \n"
],
"max_tokens": 1024,
"stop_tokens": [0, 261, 24281],
"temperature": 0.8,
"top_k": 50,
"top_p": 0.6,
"alpha_presence": 1.0,
"alpha_frequency": 0.1,
"alpha_decay": 0.99,
"stream": false,
"password": "rwkv7_7.2b",
"session_id": "session_one"
}'
```
### 7. 状态管理 API
用于状态管理,支持状态缓存管理器
使用 `state/status` 接口检查会话的状态池状态:
```bash
curl -X POST http://localhost:8000/state/status \
-H "Content-Type: application/json" \
-d '{
"password": "rwkv7_7.2b"
}'
```
使用 `state/delete` 接口删除会话的状态:
```bash
curl -X POST http://localhost:8000/state/delete \
-H "Content-Type: application/json" \
-d '{
"session_id": "your_session_id_to_delete",
"password": "rwkv7_7.2b"
}'
```
## 鸣谢
感谢 [Triang-jyed-driung](https://github.com/Triang-jyed-driung) 提供的 [Rapid-Sampling](https://github.com/Triang-jyed-driung/Rapid-Sampling) 内核,它还具有兼容 ROCm 的原生 HIP 内核。
# 微调常见问题
## jsonl 转 binidx 时出现 ModuleNotFoundError: No module named 'xxx' 错误
解决方法:这是因为缺少了对应的软件包,请运行命令 pip install xxx 进行安装。
## jsonl 转 binidx 时报错
```
报错信息:JSONDecodeError:Unmatched '"' when decoding 'string'!
```
解决方法:这是因为你的 jsonl 文件缺少引号,导致转换工具出现解析错误,请检查 jsonl 文件的所有行是否都符合以下引号格式:
## 克隆 GitHub 仓库时 “unable to access”
```
fatal: unable to access 'https://github.com/shoumenchougou/RWKV-LM.git/': GnuTLS recv error (-110): The TLS connection was non-properly terminate
```
解决方法:这是你的设备出现了网络问题,请调整网络。
## 运行 sh 脚本时出现:train.py: error:unrecognized arguments:\\
解决方法:请把 sh 脚本的所有 \ 去掉,每条参数之间用空格隔开。
## 运行脚本开始训练后,出现显存 (memory/VRAM) 不足相关报错
解决方法:显存不足,需要升级显卡设备。
## 合并 LoRA 文件时,出现:merge.py: error: argument 报错
解决方法:这可能是你的路径变量出现了一些空格,导致无法正常解析基底模型、输出文件夹等路径的参数,请认真检查空格问题!
# 准备微调数据
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: 章节的完整内容"}
```
## 训练数据的更多细节
### 微调需要多少数据
微调训练数据的数量并没有严格规范,可以是几百条,也可以是几千条,甚至更多。
通常是**数据量越多,微调训练的效果越好**。但优质数据需要大量的时间和人力成本,因此需要根据实际情况进行调整:
* 根据微调任务复杂度调整:简单的分类或总结任务,可能只需要几百条数据。复杂的角色扮演或文本生成任务,需要几千条或更多数据。
* 质量比数量更重要:高质量的数据应准确反映目标任务的特征,并涵盖多样的场景和表达方式。
训练数据的调整是一个逐步迭代的过程,通常需要经历以下步骤:
直到获得满意的微调效果。
### 复制并随机排序数据
在训练数据不充足的情况下,复制训练数据有助于增强模型对特定知识的理解和记忆,打乱数据排序则是为了降低过拟合的风险。
在 Linux 或 Mac 系统上,使用以下命令对数据文件进行重复和打乱:
```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` 和 `shuf` 命令。
### 添加常规数据
建议在微调数据集中添加一些常规数据,添加常规数据有助于增强模型泛化能力,同时可以降低过拟合的风险。
假设我们正在微调一个用于解答初阶数学问题的模型,数据样本类似这样:
```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 文件
得到 `jsonl` 格式的训练数据后,我们需要使用 [json2binidx](https://github.com/Abel2076/json2binidx_tool) 工具,将 `jsonl` 文件转成更适合 RWKV 训练的 `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` 文件夹后,使用 `cd json2binidx_tool` 命令进入 `json2binidx_tool` 目录。
### jsonl 文件转 binidx 文件
将准备好的 `jsonl` 数据集文件放在 `json2binidx/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 `文件夹中找到转换完成的 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 虚拟环境
RWKV 模型的微调训练默认虚拟环境为 Conda。此处以 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 -u
# 重启环境变量,激活 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 环境
上述依赖安装完毕后,你应该已经同时安装好最新版本的 Torch 和 CUDA 12.1 工具包。
依次运行以下命令,检查 PyTorch 的版本和 CUDA 工具是否可用:
```python
python3 # 启动 python3
import torch # 导入 torch 包
# 打印 PyTorch 版本
print(f"PyTorch version: {torch.__version__}")
# 检查 CUDA 是否可用
print(f"CUDA available: {torch.cuda.is_available()}")
# 打印 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 版本的 torch ,仍然返回 `CUDA available: False` 。则可能需要重新安装 CUDA 环境(建议 cuda 12.1 或更新版本),安装步骤请参阅 [**CUDA Toolkit 安装文档**](#cudatoolkit)。
# 全参微调入门教程
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Step, Steps } from 'fumadocs-ui/components/steps'
## RWKV 模型全参微调教程(入门版)
本文旨在为刚接触 RWKV 模型的用户提供开箱即用的全量微调方法,文中使用的仓库为 RWKV 开源社区成员整理的“微调懒人包”,和官方 [RWKV-LM 仓库](https://github.com/BlinkDL/RWKV-LM.git)中的微调方法**不兼容**。
首先,准备一个 Linux 环境(可以是 WSL)和支持 CUDA 的 NVIDIA 显卡,然后往下阅读本文。
## 配置训练环境
要训练 RWKV 模型,首先要配置训练环境。
### 配置虚拟环境(conda)
RWKV 默认训练虚拟环境为 conda ,如果不知道如何配置 Linux 系统的 conda ,请参考[**此文章**](https://zhuanlan.zhihu.com/p/166102942)。
### 安装微调训练所需的软件
要获得 RWKV 模型的最佳训练性能,请使用 `python 3.10`、`torch 2.1.2+cu121`(或最新版本)、`cuda 12.3+`、最新的 `deepspeed`,但保持 `pytorch-lightning ==1.9.5` 。
在 Linux 环境中依次运行以下命令:
```bash copy
pip install torch --upgrade --extra-index-url https://download.pytorch.org/whl/cu121
```
```bash copy
pip install pytorch-lightning==1.9.5 transformers ninja einops tqdm gpustat nvitop bitsandbytes wandb datasets triton==2.2.0 --upgrade
```
第一条命令通过指定 url 安装 cu121 版本的 torch ,第二条命令安装 RWKV State tuning 所需的其他软件包,并指定安装 1.9.5 版本的 `PyTorch Lightning`、2.2.0 版本的 `triton`。
`-- upgrade` 参数意味着如果环境中已经安装了对应的软件包,则将其升级到最新版本。
### 检查 CUDA 环境
依次运行以下命令,检查 CUDA 库是否可用:
```bash copy
python3 # 启动 python
import torch # 导入 torch 包
torch.cuda.is_available() # 检查 CUDA 是否可用
```
如果返回值为 True ,证明 CUDA 环境可用。如果返回 False ,请重新安装 CUDA 环境(cuda 12.3+)。
## 克隆 RWKV-LM 仓库
在 Linux 或 WSL 中,使用 git 命令克隆 RWKV-LM 仓库:
```bash copy
git clone https://github.com/shoumenchougou/RWKV-LM.git
```
克隆完成后,使用 `cd RWKV-LM/RWKV-v5` 命令进入 RWKV-v5 文件夹。
## 下载基底 RWKV 模型
你需要选择一个 RWKV 基底模型作为微调训练的起点,[下载 RWKV 模型](https://huggingface.co/BlinkDL/rwkv-6-world/tree/main) 并将其放在 RWKV-v5/model 文件夹(推荐下载最新的 RWKV-6 架构模型):
由于本文介绍的是 RWKV 全参微调方法,如果你在使用消费级显卡(4090 或更低级),对 1.5B 或更大参数的 RWKV 模型进行微调训练可能会失败。
如果你正在使用消费级显卡,建议尝试微调 [RWKV-5-World-0.4B 模型](https://huggingface.co/BlinkDL/rwkv-5-world/blob/main/RWKV-5-World-0.4B-v2-20231113-ctx4096.pth) 以跑通训练流程
如果你无法访问上述 HF 链接,请访问 HF 镜像链接: [https://hf-mirror.com/BlinkDL](https://hf-mirror.com/BlinkDL) 。
## 收集训练语料(数据集)
请遵循以下步骤,收集你的训练数据集,并将其放在 `RWKV-v5/data` 文件夹里面。
### 整理 jsonl 语料
首先确认“你希望 RWKV 模型学习哪些知识”。这里的知识可以是某一领域的资料,比如法律问答、金融知识等;也可以是某类任务的文本,如材料总结、角色扮演等。总而言之,你需要收集此类数据,并将其转化为特定的 jsonl 格式。
下面是各类内容的 jsonl 格式参考:
```json copy
单轮问答: {"text": "User: 问题\n\nAssistant: 答案"}
多轮对话例子:{"text": "User: 问题一\n\nAssistant: 答案一\n\nUser: 问题二\n\nAssistant: 答案二"}
材料问答:{"text": "Instruction: 问题\n\nInput: 材料\n\nResponse: 答案"}
内容生成/续写:{"text": "将每篇文章的内容变成 JSONL 的一行,即使是一百万字的小说也变成一行。"} 或者 {"text": "《标题》\n正文内容"}
小说扩写:{"text": "User: 段落的开头\n\nAssistant: 完整的段落"}
```
整理完成的 jsonl 文件应该是这样的:
```json
{"text": "System: You are an AI assistant. You will be given a task. You must generate a detailed and long answer.\n\nUser: Write an article based on this \"A man has been charged with murder and attempted murder after a woman and the man she was on a date with were stabbed at a restaurant in Sydney, Australia.\"\n\nAssistant: Title: Tragedy Strikes in Sydney: Victims Stabbed during Dinner Date, Suspect Charged with Murder and Attempted Murder\nIntroduction\nA seemingly ordinary evening took a tragic turn in Sydney, Australia when a romantic dinner date at a local restaurant ended in bloodshed, as a man allegedly attacked a couple, stabbing both victims. Local authorities have charged the suspect with murder and attempted murder in connection with the horrific crime. In this article, we delve into the chilling incident, the suspect, and the impact it has had on the community.\nThe Incident\nThe alarming event took place at a popular restaurant in Sydney, Australia. A woman and her date were enjoying their meal – blissfully unaware of the tragic circumstances that would soon unfold. As they shared conversation and indulged in their dinner, a man approached the couple and, without warning, began to stab them with a sharp object.\nPatrons at the restaurant scrambled for safety, as the assailant continued his violent rampage. Bystanders quickly called emergency services, who promptly arrived at the scene. Although both victims were rushed to a nearby hospital, the woman succumbed to her injuries. The man she was on a date with remained in critical condition, fighting for his life.\nThe Suspect\nInitial investigations revealed that the alleged attacker had no known connections to the victims – adding to the mystifying nature of this sudden and brutal assault. Witnesses reported that the assailant seemed to have no specific motive and appeared to carry out the act senselessly.\nFollowing a thorough investigation, local police identified and arrested the suspect. During the process, it was discovered that the alleged attacker had a history of criminal behavior and a troubled past, though it is unclear if this played a role in the tragic incident.\nAuthorities have formally charged the man with murder and attempted murder in connection with the heinous crime. He awaits a hearing to determine a trial date and, if convicted, could face a life sentence in prison.\nThe Community's Response\nThe shocking nature of the crime has left the residents of Sydney reeling, as they struggle to come to terms with the harrowing event. The restaurant where the attack occurred has since been closed, with a makeshift memorial being created outside to commemorate the victims.\nMany have questioned how such a vicious crime could happen in what is considered to be one of the safest cities in the world. This tragic event has spurred local officials to reassess current security measures and devise strategies to reinforce public safety. Additionally, discussions surrounding mental health and criminal rehabilitation have surfaced as residents seek to comprehend the actions of the alleged perpetrator and prevent similar incidents from occurring in the future.\nIn the wake of the stabbing, the community has banded together with an outpouring of grief and support for the victims and their families. Candlelight vigils have been held, and an online fundraising campaign is underway to assist the surviving victim with his medical expenses and recovery.\nConclusion\nThe tragic attack in Sydney serves as a chilling reminder that senseless acts of violence can happen anywhere and at any time. The community's response to this horrific and seemingly random act of brutality has been one of solidarity and determination to prevent such incidents in the future. As the case unfolds, the victims and their families remain in the hearts of the community, who are grieving the devastating loss of a life cut tragically short and supporting the recovering victim as he continues to endure this unimaginable ordeal."}
{"text": "User: Q:I read this background article the other day: Water stratification is when water masses with different properties - salinity (halocline), oxygenation (chemocline), density (pycnocline), temperature (thermocline) - form layers that act as barriers to water mixing which could lead to anoxia or euxinia.[1] These layers are normally arranged according to density, with the least dense water masses sitting above the more dense layers. Water stratification also creates barriers to nutrient mixing between layers. This can affect the primary production in an area by limiting photosynthetic processes. When nutrients from the benthos cannot travel up into the photic zone, phytoplankton may be limited by nutrient availability. Lower primary production also leads to lower net productivity in waters.[2] I am facing a new situation today: High lake had a lot of fresh and salt water mixing, therefore presented layers of stratified water.The water was poor in nutrients.Low lake had no such problems and it was a very abundant and prolific fishing spot. Using the knowledge I acquired from the background article, how should I answer correctly the following question regarding my new situation: Which lake had fewer dissolved nutrients?\nA:\n\nAssistant: The lake with fewer dissolved nutrients would be High lake. This is because it had layers of stratified water, which acts as a barrier to nutrient mixing. As a result, it was poor in nutrients."}
{"text": "System: You are an AI assistant. You will be given a task. You must generate a detailed and long answer.\n\nUser: Summarize this article in one sentence.\nYou'll find this in your Start menu. You can also press ⊞ Win and type \"xbox.\" You can use the Xbox app to take a screenshot of any game running in Windows 10. You'll find this in the menu on the left side of the screen. This will display the DVR and screenshot settings. The Game DVR will need to be enabled in order to take screenshots with the app. Click the slider to toggle it on. When the Game DVR is enabled, the built-in shortcut is ⊞ Win+Alt+PrtScn. You can click the empty field next to this and set your own custom shortcut if you want. This will open the folder that your screenshots will be saved in. If you want to change where your screenshots are saved, you'll need to move the Captures folder to that location. Screenshots will automatically save to the Captures folder, wherever it is. For example, to move it to your Pictures folder, move up one directory and then drag the Captures folder to the Pictures folder in your sidebar. The Xbox app does not need to be open to use the screenshot feature. It will be saved to the Captures folder that you may have moved earlier.\n\nAssistant: The article explains how to use the Xbox app in Windows 10 to take screenshots of games by enabling the Game DVR and using the built-in shortcut or a custom shortcut, with the screenshots saved in the Captures folder which can be moved to a different location if desired."}
{"text": "System: You are an AI assistant. User will you give you a task. Your goal is to complete the task as faithfully as you can. While performing the task think step-by-step and justify your steps.\n\nUser: what brought him into the field was the idea of louis de broglie that particles have a wave aspect. schrödinger sought our de broglie's work and read it avidly.\nRepeat this setence, but with the correct capitalization.\n\nAssistant: What brought him into the field was the idea of Louis de Broglie that particles have a wave aspect. Schrödinger sought out de Broglie's work and read it avidly.\n1. I capitalized the first letter of the first word of the sentence, \"What.\"\n2. I capitalized the first letter of the proper name \"Louis\" and \"Broglie\" (last name).\n3. I capitalized the first letter of the proper name \"Schrödinger.\"\n4. I corrected the typo \"our\" to \"out.\""}
{"text": "System: You are an AI assistant. User will you give you a task. Your goal is to complete the task as faithfully as you can. While performing the task think step-by-step and justify your steps.\n\nUser: Add spaces: ifmelectronicgmbh•Friedrichstraße1•45128Essen—Wereservetherighttomaketechnicalalterationswithoutpriornotice.—GB—SV5200—03.06.2015\n\nAssistant: The task provided is to add spaces to a long, uninterrupted string of text to make it more readable. While determining where to place spaces, I'll be guided by the rules of the English language, as well as presumptions about the format of addresses, company names, dates, and technical/legal notes.\n1. Breaking down company details:\nFirst, I'm going to separate individual words and details related to the company and address. \n- \"ifmelectronicgmbh\": This appears to be a company name, which should be \"ifm electronic gmbh\".\n- \"•Friedrichstraße1•45128Essen\": This seems to be a street address in Germany (Friedrichstraße 1, 45128 Essen).\n- The bullet character (•) can be considered as a separator.\nAfter making these changes, the phrase so far is: \"ifm electronic gmbh • Friedrichstraße 1 • 45128 Essen\".\n2. Handling reservation clause:\nNext, I notice the segment of text starting with \"Wereservetherighttomaketechnicalalterationswithoutpriornotice.\" This appears to be a standard non-liability clause. Let's break it down:\n- \"Wereservetherighttomaketechnicalalterationswithoutpriornotice\": This can be separated into \"We reserve the right to make technical alterations without prior notice.\"\nAfter adding these modifications, the sentence so far becomes \"ifm electronic gmbh • Friedrichstraße 1 • 45128 Essen - We reserve the right to make technical alterations without prior notice.\"\n3. Identifying product details and date:\nTo wrap up, I'll divide the final details which seem to be related to a product model number and the date:\n- \"—GB—SV5200—03.06.2015\": Here, I can establish that \"GB\" and \"SV5200\" are likely separate entities (looks like product identifiers or codes), and \"03.06.2015\" is probably a date.\nTherefore, this segment becomes: \"- GB - SV5200 - 03.06.2015.\"\nSo, the final version of the separated text is: \"ifm electronic gmbh • Friedrichstraße 1 • 45128 Essen - We reserve the right to make technical alterations without prior notice. - GB - SV5200 - 03.06.2015.\"\nThis step-wise breakdown splits the original text into more readable sentences and phrases while maintaining their meanings and serving the reader's clarity."}
{"text": "System: You are a helpful assistant, who always provide explanation. Think like you are answering to a five year old.\n\nUser: What is the sentiment of the following movie review sentence?\na christmas perennial\n\nAssistant: A \"Christmas perennial\" means a movie that is enjoyed every Christmas and comes back like a tradition. So, the sentiment of this movie review sentence is positive because it suggests that people like to watch this movie again and again during Christmas time."}
{"text": "User: What type of details about the tenors can be gathered from the following bio? Bio: the tenors -lrb- formerly known as the canadian tenors -rrb- are a vocal quartet consisting of remigio pereira , victor micallef , fraser walters , and clifton murray . they perform operatic pop music that is a mixture of classical and pop , featuring songs such as `` the prayer '' and `` panis angelicus '' from the former genre , and leonard cohen 's `` hallelujah '' from the latter . originating from canada , pereira from ottawa/gatineau , micallef from toronto , walters from vancouver and murray from port mcneil , the tenors have performed on more than 60 international television programs . they appeared on the oprah winfrey show with celine dion in 2010 , at the 63rd primetime emmy awards , at the opening ceremonies of 2010 winter olympics in vancouver and on itv -lrb- tv network -rrb- diamond jubilee show at windsor castle for hm queen elizabeth ii . the venues they have performed in include the tel aviv opera house , and the mandalay bay events center in las vegas . they also appeared on the 2009 grey cup broadcast and on cbc television 's `` holiday festival of ice '' . they have shared the stage with sarah mclachlan , neil young , paul anka , justin bieber , paul mccartney , brian mcknight , david foster , and natalie cole . universal music group released their platinum-selling self-titled debut album and double-platinum holiday album , the perfect gift . the tenors filmed a pbs special at the smith center for the performing arts that began airing in 2012 . the canadian tenors were renamed the tenors in november 2012 in advance of their third album lead with your heart . also in 2012 , the tenors signed a us distribution deal with verve records . the tenors latest release lead with your heart went platinum in canada in seven weeks . the album garnered a 2013 juno award for adult contemporary album of the year and a juno award nomination for jack richardson for producer of the year for bob ezrin 's production of the title track `` forever young . '' lead with your heart was featured on katie , good...\nThe answer to this question is:\n\nAssistant: From the bio, we can gather that The Tenors:\n1. Were formerly known as The Canadian Tenors.\n2. Consist of Remigio Pereira, Victor Micallef, Fraser Walters, and Clifton Murray.\n3. Perform operatic pop music, a mixture of classical and pop.\n4. Have songs such as \"The Prayer,\" \"Panis Angelicus,\" and Leonard Cohen's \"Hallelujah\" in their repertoire.\n5. Originated from Canada, with members from Ottawa/Gatineau, Toronto, Vancouver, and Port McNeil.\n6. Have performed on more than 60 international television programs, including The Oprah Winfrey Show, the 63rd Primetime Emmy Awards, and the 2010 Winter Olympics opening ceremonies.\n7. Performed at venues such as the Tel Aviv Opera House and Mandalay Bay Events Center in Las Vegas.\n8. Have shared the stage with artists like Sarah McLachlan, Neil Young, Paul Anka, Justin Bieber, Paul McCartney, Brian McKnight, David Foster, and Natalie Cole.\n9. Released platinum-selling self-titled debut album, a double-platinum holiday album called The Perfect Gift, and their third album, Lead With Your Heart.\n10. Filmed a PBS special at the Smith Center for the Performing Arts.\n11. Renamed themselves from The Canadian Tenors to The Tenors in November 2012.\n12. Signed a US distribution deal with Verve Records in 2012.\n13. Received a 2013 Juno Award for Adult Contemporary Album of the Year and a Juno Award nomination for Jack Richardson Producer of the Year for their album Lead With Your Heart."}
{"text": "System: You should describe the task and explain your answer. While answering a multiple choice question, first output the correct answer(s). Then explain why other answers are wrong. Think like you are answering to a five year old.\n\nUser: What is the most logical next event?\nHow to unblock copyright infringement on youtube \nUnderstand why you may have received a content id claim. \nContent id is a system that identifies potential copyrighted content in videos by scanning uploaded videos for previously-uploaded content. The system will scan for audio, video, and images.\nChoose your answer from:\na). Answer as many questions as you can. If you are currently having trouble out of confusion or have not answered a question assigned by your user, then this is a great way to check for copyright infringement.\nb). If a match occurs, the original owner is notified and a content id claim is filed. The original owner can choose to do nothing, mute their audio in your video, block the video from being viewed, monetize the video, or track the video's viewership.\nc). Figure out whether you have used the content id app. Copyright-infringement lawsuits can take up to a few years to fully prove that you use the content id app in your videos.\nd). If you have uploaded video videos to youtube, it will scan for audio, video, and images in your channel. You may receive your content id when you sign up for a video profile.\n\nAssistant: b). If a match occurs, the original owner is notified and a content id claim is filed. The original owner can choose to do nothing, mute their audio in your video, block the video from being viewed, monetize the video, or track the video's viewership.\nThis is the correct answer because it describes the next logical event in the process of handling a content id claim on YouTube. When a match is found, the original owner gets to decide what to do with the claimed content.\na) is wrong because it talks about answering questions and checking for copyright infringement, which is not directly related to the next step in unblocking copyright infringement on YouTube.\nc) is incorrect because it discusses proving the use of the content id app in lawsuits, which is not the next step in dealing with a content id claim on YouTube.\nd) is wrong because it talks about uploading videos to YouTube and receiving content id, but not about the next step in resolving a content id claim."}
{"text": "System: You are an AI assistant. Provide a detailed answer so user don’t need to search outside to understand the answer.\n\nUser: OPTIONS:\n[i] Yes;\n[ii] No;\nGiven those answer options, answer the question: Title: Good book with a bad description of the product Review: Although this looks to be a great book, I was disappointed to see the giant inscription on the first page of the book. Because this book was for a gift, noting this inscription on the product description would have been very helpful Is this product review negative?\nA:\n\nAssistant: Yes, this product review is negative. The reviewer expresses disappointment with the product due to the giant inscription on the first page, which was not mentioned in the product description. They also mention that the book was intended as a gift, which further explains their dissatisfaction with the unexpected inscription. Although the reviewer acknowledges that the book might be great, their overall experience with the product seems to be negative due to this issue."}
{"text": "System: You are an AI assistant. User will you give you a task. Your goal is to complete the task as faithfully as you can. While performing the task think step-by-step and justify your steps.\n\nUser: Write some highlights for the following article:\nThe historic six-month agreement over Tehran's nuclear program may begin a new era of relations with Iran, but it will be a long road back for the country's most vital sector, oil. Iran produces about two and half million barrels a day -- far off its 4-million-barrel-per-day peak a decade ago. Output is hovering at a level last seen at the end of Iran's war with Iraq. With North Sea Brent crude averaging over $100 a barrel for a record three years running, the sanctions on energy alone are costing Tehran about $50 billion in lost annual revenue. Despite the deal breakthrough, U.S. Secretary of State John Kerry said most of the sanctions will stick as the world gauges the intentions of this relatively new administration in Tehran. \"During the six month phase, the oil sanctions that will remain in place will continue to cause over $25 billion in lost revenues to Iran or over $4 billion a month,\" he said. The message is clear: the pressure remains, but if all goes well, in a half year's time Iran can expect more in return for transparency. The last few years have been filled with uncertainty. Tensions around the Strait of Hormuz with the on-and-off threats by the previous government of Mahmoud Ahmadinejad to block oil shipments in the Gulf have kept what strategists call a 10-15% risk premium on global energy prices. Iran sits on about 9% of the world's proven oil reserves, claiming a few years back that it has nearly 150 billion barrels and the world's largest gas field. But its top four customers --China, India, Japan and South Korea -- have all had to cut back their energy imports by a third or more in the past few years due to U.S. and European pressure. With every year that has passed, the screws have been tightened by Washington and the countries of the European Union. It was not only sanctions against oil, but also blocking Iran's ability to secure shipping insurance and to trade in U.S. dollars and euros. That economic isolation, many Middle East strategists I have spoken with suggest, is what brought Iran's new government to the negotiating table. In 2012, the Iranian rial plunged by up to 80%. Basic staples of life, poultry and bread skyrocketed in price and the economy went through a period of hyper-inflation. With rising import prices due to a plummeting currency, industrial Iran is no longer able to compete. There are reports that the state manufacturing sector had laid off up to 800,000 workers in 2012 and those who have kept their jobs saw their wages eroded by skyrocketing prices. Oil executives with experience in the country say this initial agreement would help lift a cloud of uncertainty over the oil market, but that President Hassan Rouhani and his cabinet have to establish much better contract terms if this honeymoon period lifts sanctions. The blunt-speaking Chief Executive of French energy group Total, Christophe de Margerie, told me at an energy conference in Abu Dhabi this month that Iran needs to try and create a better climate for investment if this weekend's breakthrough is sustained. \"I can tell you with the experience we have from Iran it doesn't always bring as we say in French partie de plaisir ... a win-win.\" Oil giant Saudi Arabia has expressed doubts about signing a deal with Tehran, which will introduce more challenges within OPEC. Iraq plans to double production by 2020 to six million barrels a day and with Iran wanting to rebuild exports, the Kingdom may have trim its own production to defend prices. It is still early days, but this country of nearly 80 million people has been described as potentially being the Germany of the Middle East with plenty of natural resources -- that is, if it can emerge from years of economic isolation.\nHighlights:\n\nAssistant: 1. Historic six-month agreement over Tehran's nuclear program presents an opportunity for Iran's oil sector recovery, but the journey will be long and difficult.\n2. Iran's oil production is currently around 2.5 million barrels per day, significantly less than its peak of 4 million barrels per day a decade ago.\n3. Sanctions on energy alone are costing Tehran approximately $50 billion in lost annual revenue.\n4. U.S. Secretary of State John Kerry said most sanctions will remain in place during the six-month phase, causing Iran to lose over $25 billion in revenues.\n5. Iran's top four oil customers, China, India, Japan, and South Korea, have had to cut back their imports by a third or more due to U.S. and European pressure.\n6. Iran's economy suffered greatly during the period of sanctions, with rampant inflation and industrial layoffs.\n7. Establishing better contract terms is crucial for Iran to lift sanctions and improve the investment climate.\n8. Oil giant Saudi Arabia has doubts about signing a deal with Tehran, introducing challenges within OPEC for Iran's oil output growth."}
```
### 将 jsonl 文件转化为 binidx 文件
在 RWKV-LM/RWKV-v5 目录中运行以下命令,可以将 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
```
如果你在使用自己的 jsonl 数据集,这条命令有两个需要修改的参数:
```
--input ./data/sample.jsonl # 作为输入的 jsonl 文件路径
--output-prefix ./data/sample # 输出的 bin 和 idx 文件路径
```
将 `sample.jsonl` 改成你自己的 jsonl 文件名称,其他参数保持默认即可。
出现以下提示,意味着转换已经完成:
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `demo-training-run.sh` 文件,可以调整训练参数,进而控制微调的训练过程和训练效果。:
以下是一次调参过程的记录:
### 调整路径参数
`demo-training-run.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和模型文件的输出路径
* data\_file:训练数据集的路径,注意路径中不需要带 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` | 每隔多少个训练轮次保存一次训练模型,调小需要注意存储空间是否充足 |
| `epoch_steps=1000` | 每个训练轮次的步数,增加会拉长单个epoch的训练时间 |
| `ctx_len=512` | 微调模型的上下文长度,根据你的需求而定 |
### 调整其他训练参数
下面列出了脚本中其他可修改的训练参数,及其修改的效果。
| 参数 | 描述 |
| ------------------------------ | ---------------------------------------------------------------------------------- |
| `--data_type binidx` | 训练语料的文件格式,支持:"utf-8", "utf-16le", "numpy", "binidx", "dummy", "wds\_img", "uint16" |
| `--vocab_size 65536` | 词表大小,默认为 65536,设为 0 则模型自动确定词汇表大小 |
| `--epoch_count 1` | 总训练轮次 |
| `--epoch_begin 0` | 初始训练轮次,从第 N 个 epoch 开始加载 |
| `--pre_ffn 0` | 将第一个 att 层替换为 ffn,通常保持关闭 |
| `--head_qk 0` | 保持默认值 0(关闭状态) |
| `--lr_init 1e-5` | 初始学习率,微调建议 1e-5,可适当增加至不超过 5e-5 |
| `--lr_final 1e-5` | 最终学习率,微调同样建议 1e-5,熟练后可自定义 |
| `--warmup_steps 0` | 预热步骤,微调初学者建议 0;若加载模型,可尝试 50 |
| `--beta1 0.9` | Adam 优化器 beta1 参数 |
| `--beta2 0.99` | Adam 优化器 beta2 参数 |
| `--adam_eps 1e-8` | Adam 优化器的 epsilon 参数 |
| `--accelerator gpu` | 加速器类型,推荐使用 gpu |
| `--devices 1` | 单显卡填 1,多卡按实际数量 |
| `--precision bf16` | 训练精度,默认为 bf16,也支持 "fp32", "tf32", "fp16" |
| `--strategy deepspeed_stage_1` | 训练策略,微调推荐 deepspeed\_stage\_1 |
| `--grad_cp 1` | 梯度累积步数,0 加快训练但消耗更多显存,1 反之 |
| `--my_testing "x060"` | 训练的 RWKV 模型版本,v5 选 x052,v6 选 x060 |
参数调整完成后,请记得保存 `demo-training-run.sh` 文件。
## 开始训练
在 RWKV-V5 目录中,使用以下命令运行 demo-training-run.sh 脚本:
```bash copy
sh demo-training-run.sh
```
成功运行后,应该可以看到类似于这样的效果:
# 微调简介
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
## 为什么要微调 RWKV 模型?
目前开源发布的 RWKV 模型均为基底模型(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-7 模型进行 [PiSSA 微调](./RWKV-PEFT/PiSSA.mdx) 的显存需求:**
| 模型参数 | bf16 | int8 量化 | nf4 量化 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.6GB GPU | 2.5GB GPU | 2.4GB GPU |
| RWKV7-0.4B | 3.4GB GPU | 3.0GB 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-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) 是一款简单易用的 AI 模型推理和文本生成工具。
KoboldCpp 基于 llama.cpp 推理后端构建,兼容 `ggml` 和 `gguf` 两种格式的模型。
本教程将指引你在 KoboldCpp 中运行 RWKV 模型,并与模型聊天对话。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV15wCHYPEMm)观看。
## 效果预览
**聊天模式(Chat Mode)**:模型回答较短,适合日常闲聊。
**指令模式(Instruct Mode)**:模型回答较详细,适合提问或解决问题。
## 下载与安装
### 下载 RWKV 模型
KoboldCpp 兼容 `ggml` 和 `gguf` 两种模型格式,推荐使用 `gguf` 格式的 RWKV 模型。
可以从 [RWKV-GGUF 仓库](https://modelscope.cn/organization/RWKV?tab=collection) 下载 `gguf` RWKV 模型。在 Hugging Face 页面,点击模型文件右侧的下载按钮,以下载模型文件:
自己微调了一个 RWKV-7 模型,想从 pth 转 gguf 格式?查看 [llama.cpp 文档 - 从 pth 模型转换为 gguf](../llamacpp#get-gguf-models)。
RWKV-GGUF 仓库为每种参数的 RWKV 模型提供了不同量化精度的 `gguf` 模型文件。
量化会影响模型的推理精度,从而影响模型的对话效果,推荐使用损失较低的 `Q5_1`、`Q8_0` 量化精度,以维持模型的性能和用户体验。
### 下载 KoboldCpp
从 [KoboldCpp 更新界面](https://github.com/LostRuins/koboldcpp/releases)可以下载最新版本的 KoboldCpp 项目。
#### Windows 系统
Windows 系统推荐下载 `koboldcpp.exe`,也可以根据设备的硬件配置选择其他 exe 文件:
* 如果不需要 CUDA(没有 NVIDIA 显卡),可以使用体积更小的 `koboldcpp_nocuda.exe`
* 如果您拥有 NVIDIA 显卡但使用老式 CPU,且 `koboldcpp.exe` 无法运行,试一下 `koboldcpp_oldcpu.exe`
* 如果您拥有较新的 NVIDIA 显卡,可以使用 CUDA 12 版本的 `koboldcpp_cu12.exe`(文件更大,但速度稍快)
#### Linux 系统
Linux 系统请选择相应 CUDA 版本的 Linux 二进制文件:
* `koboldcpp-linux-x64-cuda1150`:带 CUDA 11.5 的 Linux 二进制文件
* `koboldcpp-linux-x64-cuda1210`:带 CUDA 12.1 的 Linux 二进制文件
* `koboldcpp-linux-x64-nocuda`:不带 CUDA 的 Linux 二进制文件
#### macOS 系统
如果您正在使用运行于 Apple Silicon (M1, M2, M3 ...) 芯片上的 macOS 系统,可以尝试 `koboldcpp-mac-arm64` 二进制文件。
## 配置与运行
### 调整 KoboldCpp 配置
双击下载的 exe 文件,打开 KoboldCpp 的启动器 GUI 界面:
在启动器的快速启动(Quick Launch)界面,可以**调整 KoboldCpp 和模型的配置**,重点关注以下三个选项:
* **`Model`**:点击 `Browse` 按钮,选择一个 `gguf` 格式的 RWKV 模型文件。
* **`Presets`**:选择一种加载模型的方式。NVIDIA 显卡选择 `CUBLAS`,AMD 显卡选择 `CLBlast`,其他显卡选择 `Vulkan`,CPU 选择 `OpenBLAS`。
* **`Gpu layers`**:GPU 加载的模型层数,推荐保持默认值为 -1 (加载所有层)。如果显存不足,可从最大层数逐步减少加载层数:
| 模型参数 | 最大层数 |
| --------- | ---- |
| RWKV-1.5B | 24 |
| RWKV-3B | 32 |
| RWKV-7B | 32 |
| RWKV-14B | 61 |
其他选项**建议保持默认**,或根据需要调整:
* **`Use QuantMatMul (mmg)`** :是否启用 `MMQ` 模式代替 `CuBLAS` 处理提示词,这是 `CUBLAS` 模式特有的选项,更详细的解释请参考 [KoboldCpp 文档 - MMQ 的作用](https://github.com/LostRuins/koboldcpp/wiki#what-does-quantized-mat-mul-mmq-do-for-cublas)
* **`Launch Browser`**:是否在加载模型后自动打开浏览器,并访问 KoboldCpp 的 WebUI
* **`Use ContextShift`** :是否使用 ContextShift 来减少重新处理上下文的时间。更详细的解释请参考 [KoboldCpp 文档 - ContextShift](https://github.com/LostRuins/koboldcpp/wiki#what-is-contextshift)
* **`Use FlashAttention`** :是否使用 FlashAttention 优化内存使用,仅对 `CUDA/CuBLAS` 模式有效
* **`Quite Mode`** :选择此选项,终端将不会显示模型生成的文本内容
* **`Remote Tunnel`**:是否允许其他设备使用远程隧道连接 KoboldCpp,更详细的解释请参考 [KoboldCpp 文档 - Remote Tunnel](https://github.com/LostRuins/koboldcpp/wiki#how-do-i-run-koboldcpp-on-a-different-device-than-my-pc-over-the-network-remote-play)
* **`Context Size`**:设置 KoboldCpp 可处理的最大上下文长度,RWKV 模型推荐保持默认值 4096
* 其他参数的释义,请参考 [KoboldCpp 文档](https://github.com/LostRuins/koboldcpp/wiki)
### 运行 KoboldCpp
配置完毕后,点击右下角的 `Launch` 按钮启动 KoboldCpp。
此时 KoboldCpp 的启动器 GUI 将会自动关闭,并自动打开浏览器访问 KoboldCpp 的 WebUI 界面:
至此,KoboldCpp 已经成功运行,可以开始使用 RWKV 模型进行文本生成。
## KoboldCpp 使用指南
### 更改对话模式
KoboldCpp 支持四种聊天模式。在 KoboldCpp 的 WebUI 界面,点击 `Settings -> Format -> Usage Mode` 按钮,可以调整聊天模式:
* **`Instruct Mode`**:指令模式,适合带有指令的文本生成
* **`Story Mode`**:故事模式,适合小说风格的文本生成
* **`Adventure Mode`**:冒险模式,适合生成**交互式小说/角色扮演游戏**等内容。
* **`Chat Mode`**:聊天模式,适合闲聊
在我们的测试中,RWKV 模型在 `Instruct Mode` 和 `Chat Mode` 两种模式下表现较好。`Story Mode` 和 `Adventure Mode` 模式则需要进行一些额外的角色设定和配置,方可正常使用。
使用 `Chat Mode` 时,请将 `AI Name` 选项设置为 `Assistant`,以获得最佳对话效果。
### 更改 WebUI 风格
KoboldCpp 支持三种 WebUI 风格。在 KoboldCpp 的 WebUI 界面,点击 `Settings -> Format -> UI Style Select` 按钮,可以调整 WebUI 风格:
* **`Classic Theme`**:默认主题,访问 KoboldCpp 的默认界面。
* **`Aesthetic Theme`**:美学主题,可以自定义 UI 大小、背景图、聊天框背景颜色等样式。
* **`Corpor Theme`**:极简主题,类似于 ChatGPT 等在线服务的界面。
推荐使用 `Corpor Theme` :
### 其他设置项
由于 KoboldCpp 的设置项较多,此文档无法列出完整的设置项释义。
对于每个设置项的详细释义,请参考 WebUI 中的注释及 [KoboldCpp 文档](https://github.com/LostRuins/koboldcpp/wiki) 。
如果不习惯全英文的 WebUI 界面,可使用浏览器的翻译功能将页面翻译成中文。
# Ollama 推理教程
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'
[Ollama](https://github.com/ollama) 是一个简单易用的开源本地大语言模型运行框架,支持在个人电脑上一键部署和运行各类开源模型,具有配置简单、资源占用低等特点。
随着 RWKV 社区成员 [@MollySophia](https://ollama.com/mollysama) 的工作,Ollama 现已适配 RWKV 模型。
本章节介绍如何在 Ollama 中使用 RWKV 模型进行推理。
现在 Ollama 已经适配 RWKV-7 了!欢迎大家使用!
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1TrrdYmE7M/)观看。
## Ollama 下载与安装
可从 [Ollama 官网](https://ollama.com/) 下载 Ollama 的安装程序。
下载完成后,双击 exe 文件进行安装。安装完成后 `Ollama` 会自动启动,启动后可在系统任务栏看到 `Ollama` 图标。
接下来,我们将在 Ollama 中运行 `gguf` 格式的 RWKV 模型。从以下两种方法中选择一种:
| 方法 | 描述 | 优点 | 缺点 |
| ------------------------------------------------------------ | --------------------------------------------- | --------------------------------------- | ---------------------------------------------- |
| **[运行 Ollama 提供的 RWKV 仓库](#run-ollama-provided-rwkv-model)** | 从 Ollama 提供的 RWKV 仓库中下载并运行模型 | 操作简单 | Ollama 提供的 RWKV 模型**只有 `Q8_0` 和 `Q6_K` 等量化版本** |
| **[运行自定义 RWKV 模型](#run-custom-rwkv-model)** | 需要手动下载 `gguf` 格式的 RWKV 模型并创建 `Modelfile` 配置文件 | 可以**运行任意量化**的 RWKV 模型,包括**微调的 RWKV 模型** | 需要手动配置 |
## 运行 Ollama 提供的 RWKV 模型
Ollama 的 RWKV 仓库提供了 [RWKV7-G1b](https://ollama.com/mollysama/rwkv-7-g1b) | [RWKV-G0b](https://ollama.com/mollysama/rwkv-7-g0b)(推荐使用) 和 [RWKV7-World](https://ollama.com/mollysama/rwkv-7-world) 模型。
RWKV-6 World 模型已过时,不再推荐使用。
在终端中运行 `ollama run mollysama/rwkv-7-g1b:2.9b` 命令,Ollama 将**自动下载并运行** RWKV7-G1b 2.9B 模型。您可以在终端中与 RWKV 模型进行对话。
RWKV7-G1 系列模型默认开启思考模式,可以通过 `/set nothink` 和 `/set think` 命令灵活地开关思考模式。
RWKV7-G1 模型是 RWKV-7-World 模型的全面升级,推荐使用 RWKV7-G1 模型。
在终端中运行 `ollama run mollysama/rwkv-7-world:2.9b` 命令,Ollama 将**自动下载并运行** RWKV7-World 2.9B 模型。您可以在终端中与 RWKV 模型进行对话,如下图所示:
所有可选的 Ollama/RWKV-7 World 模型:
* `mollysama/rwkv-7-world:1.5b`:量化精度为 `Q4_K_M`
* `mollysama/rwkv-7-world:2.9b`:量化精度为 `Q4_K_M`
若您曾经下载过 `mollysama/rwkv-7-world:2.9b` 模型,请运行 `ollama pull mollysama/rwkv-7-world:2.9b` 命令,拉取最新的变更。
## 运行自定义 RWKV 模型
要运行一个自定义的 RWKV 模型,你需要一个 `.gguf` 格式的模型文件,和一个用于配置**聊天模板和解码参数**的 `Modelfile` 文件。然后使用 `ollama create` 命令创建一个自定义 Ollama 模型。
创建完毕后,即可使用 `ollama run` 命令运行自定义模型。
**下载 RWKV gguf 模型**
可以从 [ModelScope - RWKV GGUF 合集](https://modelscope.cn/collections/RWKV-7-G1-GGUF-a5174274c32f4a) 下载 `gguf` 格式的 RWKV 模型。
RWKV gguf 模型有各种量化版本,建议使用 `FP16`、 `Q8_0` 两种量化精度,更低的量化精度(如 `Q5_K_M`、`Q4_K_M` 等)可能会使模型的回答变差。
自己微调了一个 RWKV-7 模型,想从 pth 格式转 gguf?查看 [从 pth 模型转换为 gguf](../llamacpp#get-gguf-models)。
**创建模型的 Modelfile 文件**
在存放 RWKV gguf 模型文件的文件夹下创建名为 `Modelfile` 的文本文件,不需要后缀名。
使用“记事本”等文本编辑工具打开 `Modelfile`,然后根据**模型是否支持思考模式**创建不同的 Modelfile 文件。
RWKV G0/G1 系列推理模型**同时支持“思考”和“不思考”两种模式**,因此下列两种 Modelfile 都可用,根据您对推理功能的需求选择其中一种即可。
对于 RWKV G0/G1 系列**支持思考功能**的 RWKV 模型,请在 `Modelfile` 中写入以下内容:
```bash
`FROM rwkv7-g1b-2.9b-20251205-ctx8192-FP16.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 stop """
User"""
PARAMETER stop "User"
PARAMETER stop "Assistant"
PARAMETER temperature 1
PARAMETER top_p 0.5
PARAMETER repeat_penalty 1.2`
```
如果**不需要思考模式**(RWKV-World 系列模型**不支持思考功能**,因此只能使用此模板),请在 `Modelfile` 中写入以下内容:
```bash
`FROM rwkv7-g1b-2.9b-20251205-ctx8192-FP16.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:{{ .Content }}{{- end }}
{{- if and $last (ne .Role "assistant") }}
Assistant:{{- end -}}{{- end }}"""
PARAMETER stop """
"""
PARAMETER stop """
User"""
PARAMETER temperature 1
PARAMETER top_p 0.5
PARAMETER repeat_penalty 1.2`
```
请将第一行 `FROM` 之后的 `rwkv-xxx.gguf` 修改为你本地的 RWKV 模型文件名称。`PARAMETER temperature 1`、`PARAMETER top_p 0.5` 等解码参数可以根据需要进行调整。
**创建并运行自定义 RWKV 模型**
在存放 RWKV gguf 模型和 `Modelfile` 文件的目录下打开终端,并执行 `ollama create` 命令:
```bash
ollama create rwkv7-g1b-2.9b-20251205-ctx8192-FP16 -f Modelfile
```
将 `ollama create` 后面的模型名称改成你本地的 RWKV 模型(与 `Modelfile` 中的模型名称保持一致),但**无需 `.gguf` 后缀名**。
创建完毕后,使用 `ollama run` 命令直接运行模型:
```bash
ollama run rwkv7-g1b-2.9b-20251205-ctx8192-FP16
```
成功运行后,即可与模型进行聊天对话。
## 关闭 Ollama
请使用 `ollama stop rwkv-model-name` 命令停止当前模型实例,从而**重置对话上下文**。
如果你不需要停止当前模型,而是想要开始一轮全新的对话,则可以使用 `/clear` 命令**清除当前模型的上下文(历史消息)**。
## Ollama GUI 和桌面程序
Ollama 本身并没有提供 GUI 或 WebUI 服务,但其社区提供了第三方 GUI 和桌面程序。
可以在 [Ollama 的 GitHub 文档](https://github.com/ollama/ollama?tab=readme-ov-file#web--desktop) 中查看所有第三方 Ollama 工具。
## 参考资料
* [Ollama 官网](https://ollama.com/)
* [RWKV gguf 模型仓库](https://modelscope.cn/organization/RWKV?tab=collection)
* [Ollama 的 GitHub 文档](https://github.com/ollama/ollama?tab=readme-ov-file#web--desktop)
# 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/ggerganov/llama.cpp)、text-generation-webui 等)配合使用。
本文将介绍如何在 SillyTavern 中使用 RWKV 模型进行角色扮演任务。
## 视频教程
高画质视频请[跳转到 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 版本)
2. 从 SillyTavern Github 仓库的 [Releases](https://github.com/SillyTavern/SillyTavern/releases) 界面下载压缩包
3. 压缩包解压后,双击运行 `Start.bat`,此脚本会自动安装 SillyTavern 所需的依赖项
4. 安装完毕后,SillyTavern 会在你的浏览器中打开一个新标签页
## 连接本地 LLM 服务器
SillyTavern 不具备模型推理功能,这里我们使用 [llama.cpp](https://github.com/ggerganov/llama.cpp) 作为 RWKV 模型的推理服务器,并使用 SillyTavern 进行聊天。
请阅读 [llama.cpp 推理方法](../../intermediate/llamacpp),在本地安装并启动 llama.cpp 应用。
llama.cpp 安装完毕后,使用以下命令本地搭建一个 llama.cpp 服务:
```bash copy
./llama-server -m models/rwkv-6-world-1.6b-Q8_0.gguf --port 8080 -ngl 99
```
llama.cpp 服务器启动后,在 SillyTavern 中执行以下步骤,连接到本地搭建的 llama.cpp 服务:
1. 点击 API Connections
2. 将 API 设置为文本补全
3. API Type 设置为 llama.cpp
4. 将服务器 URL 设置为 [http://127.0.0.1:8080](http://127.0.0.1:8080)
5. 点击 Connect,即可连接到本地搭建的 llama.cpp 服务
成功连接到本地的 llama.cpp 服务后,就可以与 AI 进行聊天了。
## SillyTavern 角色扮演
SillyTavern 的最大特色是角色扮演,你可以创建一个角色并与其进行对话。
在 SillyTavern 中,点击 "角色管理" 按钮,可以看到 SillyTavern 自带的一个角色卡 Seraphina, 点击她的头像即可与该角色进行对话,并查看她的基本信息。
除了自带的角色卡外,我们也可以[导入现成的角色卡文件](#import-role-card)或者[自己创建角色卡](#create-role)。
### 导入现成的角色卡
可以从 [Ai Character Cards](https://aicharactercards.com/) 下载现成的角色卡文件。
下载好的角色卡文件为 png 格式。
然后在 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/ggerganov/llama.cpp)
# Text Generation WebUI 教程
import { CallOut } from 'components-docs/call-out/call-out.tsx'
[Text Generation WebUI](https://github.com/oobabooga/text-generation-webui) 是一个运行大语言模型的工具。它提供了一个友好的网页界面,用户可以轻松地在 Web 页面中配置和运行模型。
Text Generation WebUI 支持模型的推理和训练,本文将介绍如何使用 Text Generation WebUI 运行 RWKV 模型推理,并与模型聊天对话。
## 下载 Text Generation WebUI
使用 `git clone` 方法下载 Text Generation WebUI:
```bash
git clone https://github.com/oobabooga/text-generation-webui
```
项目克隆完毕后,运行 `cd text-generation-webui` 命令进入项目目录。
## 启动 Text Generation WebUI
根据你的操作系统,选择不同的 Text Generation WebUI 启动脚本:
### Windows 系统
在终端运行以下命令,启用 Windows 系统安装脚本:
```bash copy
./start_windows.bat
```
此脚本将自动安装 [Miniconda](https://docs.anaconda.com/miniconda/) ,并在 conda 环境中安装 `torch 2.4.1` 等项目依赖工具。
等待 Miniconda 安装完毕,跟随提示选择设备的显卡类型和 CUDA 版本。
耐心等待脚本安装,直到出现以下提示:
此时 Text Generation WebUI 已成功启动,访问 `http://localhost:7860` 以打开项目的 Web 界面:
### MacOS 系统
MacOS 系统请使用 `start_macos.sh` 脚本启动项目:
```bash copy
sh start_macos.sh
```
如果你正在使用的 macOS 版本大于 15,需要在 `requirements_apple_silicon.txt` 文件的末尾添加额外的依赖项,以保证 Text Generation WebUI 能够正确地使用 llama.cpp 加载模型:
```bash copy
https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp311-cp311-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "24.0.0" and python_version == "3.11"
https://github.com/oobabooga/llama-cpp-python-cuBLAS-wheels/releases/download/metal/llama_cpp_python-0.3.1-cp310-cp310-macosx_14_0_arm64.whl; platform_system == "Darwin" and platform_release >= "24.0.0" and python_version == "3.10"
```
## 下载 RWKV 模型
Text Generation WebUI 支持多种模型加载器,其中 llama.cpp 模型加载器支持 RWKV 模型。
llama.cpp 仅支持 `gguf` 格式的 RWKV 模型,我们需要从 [RWKV-GGUF 仓库](https://modelscope.cn/organization/RWKV?tab=collection) 下载 `gguf` RWKV 模型。
自己微调了一个 RWKV-7 模型,想从 pth 转 gguf 格式?查看 [llama.cpp 文档 - 从 pth 模型转换为 gguf](../llamacpp#get-gguf-models)。
RWKV-GGUF 仓库为每种参数的 RWKV 模型提供了不同量化精度的 `gguf` 模型文件。
量化会影响模型的推理精度,从而影响模型的对话效果,推荐使用损失较低的 `Q5_1`、`Q8_0` 量化精度,保持模型的智商和聊天体验。
在 RWKV-GGUF 仓库中,选择你要下载的模型:
等待模型下载完毕,将模型文件放到 Text Generation WebUI 根目录的 `models` 文件夹中:
```
text-generation-webui
└── models
└── rwkv-6-world-7b-iq4_nl.gguf
```
## 加载 RWKV 模型
回到 Text Generation WebUI 的网页界面,配置并加载 RWKV 模型:
1. 点击 `Model` 标签,切换到模型选择和配置页面
2. 点击 `Model` 下拉菜单,选择一个 RWKV 模型
3. 点击 `Model loader` 下拉菜单,选择 `llama.cpp` 作为模型加载器
4. 点击右侧的 `Customize instruction template` 下拉菜单,选择 `RWKV World` ,并点击下方 `submit` 按钮
5. 点击 `Load` 按钮加载 RWKV 模型
如果 `Model` 下拉菜单未显示模型文件,可能是网页端未同步 `models` 文件夹中的模型列表。
请**点击右侧的 🔄 刷新按钮**,更新模型列表。
成功加载后,终端会显示 RWKV 模型名称、模型加载器、最大聊天长度、聊天指令模板 4 项信息:
## 开始聊天
模型加载完毕后,回到 `Chat` 页面 -> 选择 `instruct` 模式 -> 输入内容并点击 `Generate` 按钮,即可开始对话。
## 其他参数说明
除了最重要的模型文件(`gguf` 格式的 RWKV 模型)、模型加载器(`llama.cpp`)和聊天指令模板(`RWKV World`)以外,llama.cpp 还提供一系列可调整的参数,调整这些参数会影响**显存占用**和**生成速度**等模型性能指标。
通常可以**保持默认参数**运行模型。如需修改,请参考以下参数说明:
| 参数 | 描述 |
| --------------- | ---------------------------------------------------------------------------------------- |
| `n-gpu-layers` | 指定分配到 GPU 的模型层数。设置为 0 时仅意味着使用 CPU。如果想把所有层都放到 GPU 上,可以将其设置为最大值。 |
| `n_ctx` | 模型能处理的上下文长度。llama.cpp 预分配缓存,因此该值越高显存需求越大。通常在加载模型时**自动设置为模型的最大长度**,如果显存不足,可以降低这个值来适应 GPU。 |
| `tensor_split` | 适用于多 GPU 计算。按比例分配每个 GPU 的内存,比如 30,70 表示一个 GPU 使用 30%,另一个使用 70%。 |
| `n_batch` | 处理提示时的批量大小。理论上增加这个值可以加快生成速度,但效果因硬件而异,**通常不需要改动**。 |
| `threads` | 使用的线程数量。推荐**保持默认**,或设置为电脑的物理核心数 |
| `threads_batch` | 批处理时使用的线程数。推荐**保持默认**,或设置为物理和虚拟核心的总数 |
| `tensorcores` | **NVIDIA RTX 显卡可以选择**此选项,使用支持 “tensor cores” 的 llama.cpp 版本来提高性能。 |
| `streamingllm` | 实验功能,避免在删除旧消息时重新计算整个对话,可以节省推理时间。**不建议开启** |
| `cpu` | 强制使用 CPU 进行计算。**不建议开启**,只有在 GPU 无法正常工作,或希望完全使用 CPU 时才需要开启。 |
| `no_mul_mat_q` | 禁用用于加速计算的内核。禁用后可能会降低生成的速度,但**如果遇到兼容性问题**,可以尝试禁用。 |
| `no-mmap` | 一次性将模型加载到内存中,避免后续的硬盘读取操作,代价是加载时间更长。**不建议开启** |
| `mlock` | 强制系统将模型一直保留在内存中,不让系统转移到硬盘上,以防速度变慢。(注意,此功能未经全面评测,效果未知,**不建议开启**) |
| `numa` | 在某些多 CPU 系统上,可以使用这个选项来优化性能。 |
## 常见问题/注意事项
1. 在 MacOS 系统运行脚本时,如果终端日志提示需要安装 `httpx[socks]`,请在 `./requirements_apple_silicon.txt` 文件的末尾添加 `httpx[socks]` 依赖。
2. 使用 1.6B 参数的 RWKV 模型时,请使用 `Q5_1`、`Q5_k` 或更高量化精度。在测试中,Q5\_0 及更低精度的量化可能会导致小参数模型的智商变低,甚至无法正常对话。
# API 用法
import { Step, Steps } from 'fumadocs-ui/components/steps'
import { CallOut } from 'components-docs/call-out/call-out.tsx'
本文旨在让大家更轻松、更灵活地使用 RWKV Runner 的 API 。
此章节会列出 RWKV Runner 每个 API 的作用、请求主体的参考结构、有哪些必需和可选字段。
那么,让我们先从一些 RWKV 模型的基础知识开始吧!
## RWKV 模型解码参数(预备知识)
你可能注意到了,很多 RWKV 部署/体验工具都支持调整 `Temperature`、`Top_P` 等 RWKV 模型解码参数。
这些主要解码参数对应的效果如下:
| 参数 | 效果 |
| ------------------- | ----------------------------------------------------------------------------------------- |
| `Temperature` | 采样温度,就像给模型喝酒,数值越大随机性越强,更具创造力,数值越小则越保守稳定。 |
| `Top_P` | 就像给模型喂镇静剂,优先考虑前 n% 概率质量的结果。如设置成 0.1 则考虑前 10% , 生成内容质量更高但更保守。如设置成 1 ,则考虑所有质量结果,内容质量降低但更多样。 |
| `Presence penalty` | 存在惩罚,正值根据“新 token 在至今的文本中是否出现过”来对其进行惩罚,从而增加了模型涉及新话题的可能性。 |
| `Frequency Penalty` | 频率惩罚,根据新内容在目前的文本中出现的频率/次数来对其进行惩罚,从而减少模型原封不动地重复相同短语/句子的可能性。 |
| `max_tokens` | 模型生成文本时的最大 token 数。如果你在对外提供服务,建议限制单个请求的 max\_tokens,太高可能导致极端情况下单个响应消耗大量的服务器资源。 |
续写小说和对话这一类**需要创造性的任务**,需要高 `Temperature` + 低 `Top_P` 的参数组合,可以尝试以下四种参数搭配:
* `Temperature` 1.2 ,`Top_P` 0.5
* `Temperature` 1.4 ,`Top_P` 0.4
* `Temperature` 1.4 ,`Top_P` 0.3
* `Temperature` 2 ,`Top_P` 0.2
举个例子,续写小说可以尝试将 `Temperature` 设为 2 ( `Temperature` 增加会提高文采,但逻辑会下降),然后将 `Top_P` 设为 0.1 \~ 0.2 (`Top_P` 越低,逻辑能力越强),这样生成的小说内容逻辑和文采都很好。
完成**相对机械的任务**,例如材料问答、文章摘要等,则可将参数设为:
* `Temperature` 1 ,`Top_P` 0.2
* `Temperature` 1 ,`Top_P` 0.1
* `Temperature` 1 ,`Top_P` 0
举个例子,如果你正在执行像关键词提取之类的机械任务,不需要模型进行任何开放性思考,则可以将 `Temperature` 设为 1 ,`Top_P`、`Presence penalty`、`Frequency Penalty` 都设为 0 。
现在,你应该对 RWKV 模型最主要的四个解码参数有所了解了,现在我们开始了解 RWKV Runner 的所有 API 具体用法!
## Completions (续写) API
RWKV Runner 的续写 API 分为**聊天续写**和**基础续写**两种,其中聊天续写 API 拥有“role - 角色”参数,因此支持角色扮演等进阶任务。
### /chat/completions
`v1/chat/completions` 和 `/chat/completions` 是相同的 API,用于 RWKV 的**聊天续写**模式,也就是和模型对话。
**API 地址**:(post)`http://127.0.0.1:8000/chat/completions`
**必需参数**
* "messages": 消息对象列表,包含两个元素:
* "content": 提供给模型的 prompt ,即对话内容
* "role": 扮演的角色名称,可以从"user", "assistant" 和 "system"选一个。
因此,聊天 API 的基础请求主体如下:
```json copy
{
"messages": [
{
"content": "hello",
"role": "user"
}
]
}
```
注意,上面是一个最简单的聊天续写请求,如果你希望控制模型的创作风格/创作能力,请考虑添加以下可选参数:
**可选参数**
下面列出了聊天续写 API 的所有可选参数:
| 参数名称 | 类型 | 参数解释 |
| ------------------ | -------------------------------- | ----------------------------------- |
| max\_tokens | integer | 生成文本的最大令牌数,最大 102400,对外部署时建议限制文本长度。 |
| temperature | number | 解码参数之一,具体效果参考前文,范围\[0, 3] |
| top\_p | number | 解码参数之一,具体效果参考前文,范围 \[0, 1] |
| presence\_penalty | number | 解码参数之一,具体效果参考前文,范围 \[-2, 2] |
| frequency\_penalty | number | 解码参数之一,具体效果参考前文,范围 \[-2, 2] |
| penalty\_decay | number | 频率的衰减参数,范围 \[0.99, 0.999],**不建议修改** |
| top\_k | integer | 模型生成内容的候选词数量,范围 \[0, 25] **不建议修改** |
| global\_penalty | boolean | 是否应用全局惩罚,**不建议修改** |
| state | string | 指定使用的 RWKV state 文件路径 |
| model | string \| null | 指定使用的 RWKV 模型路径 |
| stream | boolean | 是否以流模式生成文本。 |
| stop | string \| array\ \| null | 指定生成文本时的停止词。 |
| user\_name | string \| null | 聊天模式的用户名,**不建议修改** |
| assistant\_name | string \| null | 聊天模式的助手名,**不建议修改** |
| system\_name | string \| null | 聊天模式的系统名,**不建议修改** |
### /completions
`/completions`和 `v1/completions`是相同的续写 API,对应的是 RWKV Runner 的**基础续写**模式,也就是让模型接着你的 prompt 继续生成内容。
**API 地址**:(post)`http://127.0.0.1:8000/completions`
**必需参数**
* "prompt": 你提供给模型的续写 prompt 。
因此,聊天 API 的基础请求主体如下:
```json copy
{
"prompt": "那一天,人们又想起来被暴雨支配的恐惧..."
}
```
**可选参数**
下面列出了续写 API 的所有可选参数:
| 参数名称 | 类型 | 参数解释 | |
| ------------------ | ------------------------ | ----------------------------------- | ------------ |
| max\_tokens | integer | 生成文本的最大令牌数,最大 102400,对外部署时建议限制文本长度。 | |
| temperature | number | 解码参数之一,具体效果参考前文,范围\[0, 3] | |
| top\_p | number | 解码参数之一,具体效果参考前文,范围 \[0, 1] | |
| presence\_penalty | number | 解码参数之一,具体效果参考前文,范围 \[-2, 2] | |
| frequency\_penalty | number | 解码参数之一,具体效果参考前文,范围 \[-2, 2] | |
| penalty\_decay | number | 频率的衰减参数,范围 \[0.99, 0.999],**不建议修改** | |
| top\_k | integer | 模型生成内容的候选词数量,范围 \[0, 25] **不建议修改** | |
| global\_penalty | boolean | 是否应用全局惩罚,**不建议修改** | |
| state | string | 指定使用的 RWKV state 文件路径 | |
| model | string \| null | 指定使用的 RWKV 模型路径 | |
| stream | boolean | 是否以流模式生成文本。 | |
| stop | string \| array\ | null | 指定生成文本时的停止词。 |
RWKV Runner 默认使用 `\n\nUser` 作为停止词,如果你希望修改默认的模型停止词,则可以指定 `stop` 字段(一个字符串或者是一个字符串列表)。
参考的停止词:
```bash copy
["\n\nUser", "\n\nQuestion", "\n\nQ", "\n\nHuman", "\n\nBob", "\n\nAssistant", "\n\nAnswer", "\n\nA", "\n\nBot", "\n\nAlice"]
```
## Embeddings API
RWKV Runner 的 Embeddings API 还停留在 RWKV-4,未针对 RWKV5/6 架构更新,因此不建议使用。
## Configs(配置类) API
### /switch-model
这个 API 用于切换并重新部署 RWKV 模型。
**API 地址**:(post)`http://127.0.0.1:8000/switch-model`
**必需字段**
* "model":用于切换 RWKV 模型,填 RWKV 模型文件的路径,如 `model/xxx.pth`
* "strategy":模型部署的方法,如"cuda fp16" 。不同的 strategy 需要的性能也不一样,参考下表:
| strategy | 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 量化模型所有层,速度较快。 |
| **cuda fp16i8 \*20 -> cuda fp16** | VRAM 占用介于 fp16 和 fp16i8 之间 | 将模型的前 20 层(`*20` 指层数)量化为 fp16i8,其余层使用 fp16 加载。如果量化后还有较多 VRAM ,则酌情减少 fp16i8 层数(减少 20)。如果 VRAM 不足则继续增加 fp16i8 量化层数 |
| **cuda fp16i8 \*20+** | 比 fp16i8 使用更少 VRAM | 将模型的前 20 层(`*20` 指层数)量化为 fp16i8 并固定在 GPU 上,其他层按需动态加载(未固定的层加载速度会慢 3 倍,但节省 VRAM)。如果 VRAM 不足,减少固定层数(`*20`)。如果 VRAM 充足,增加固定层数。 |
| **cuda fp16i8 \*20 -> cpu fp32** | 比 fp16i8 使用更少 VRAM,但消耗更多内存 | 将模型的前 20 层(`*20`)量化为 fp16i8 并固定在 GPU 上,其他层使用 CPU fp32 加载。当 CPU 性能比较强时,此策略比上一个策略(只在 GPU 上固定 20 层)更快。如果加载 20 层还有剩余 VRAM ,则继续增加 GPU 层数。如果没有足够 VRAM,减少 GPU 层数。 |
| **cuda:0 fp16 \*20 -> cuda:1 fp16** | 使用双卡驱动模型 | 使用 cuda:0(卡1) fp16 加载模型的前 20 层,然后使用 cuda:1(卡2) fp16 加载剩余的层(自动计算剩余层数)。建议在最快的 GPU 上运行更多层。如果某张卡的 VRAM 不够,可以将 fp16 换成 fp16i8 (int8 量化)。 |
**可选字段**
| 参数名称 | 类型 | 参数解释 |
| ---------- | --------------- | ------------------------------- |
| tokenizer | string \| nulls | 指定使用的 RWKV 分词器路径 |
| customCuda | boolean | 是否启用自定义 cuda 算子 |
| deploy | boolean | 是否启用部署模式,启用部署模式会屏蔽掉**有风险的 API** |
* "customCuda":是否启用自定义 cuda 算子,**不建议修改**
* "deploy":是否启用服务器部署模式,启用服务器部署模式会屏蔽掉`/switch-model`、 `/exit`和其他有风险的 API
* "tokenizer":指定使用的 RWKV 分词器路径,**不建议修改**
**参考的请求主体:**
```json copy
{
"customCuda":false,"
deploy":false,
"model":"models/RWKV-4-World-3B-v1-20230619-ctx4096.pth",
"strategy":"cuda fp16",
"tokenizer":""
}
```
### /update-config
这个 API 用于**更新 RWKV Runner 的模型配置**,包括解码参数、是否挂载 state 文件等。
**API 地址**:(post)`http://127.0.0.1:8000/update-config`
**可选字段**
| 参数名称 | 类型 | 参数解释 |
| ------------------ | ------- | ----------------------------------- |
| max\_tokens | integer | 生成文本的最大令牌数,最大 102400,对外部署时建议限制文本长度。 |
| temperature | number | 解码参数之一,具体效果参考前文,范围\[0, 3] |
| top\_p | number | 解码参数之一,具体效果参考前文,范围 \[0, 1] |
| presence\_penalty | number | 解码参数之一,具体效果参考前文,范围 \[-2, 2] |
| frequency\_penalty | number | 解码参数之一,具体效果参考前文,范围 \[-2, 2] |
| penalty\_decay | number | 频率的衰减参数,范围 \[0.99, 0.999],**不建议修改** |
| top\_k | integer | 模型生成内容的候选词数量,范围 \[0, 25] **不建议修改** |
| global\_penalty | boolean | 是否应用全局惩罚,**不建议修改** |
| state | string | 指定使用的 RWKV state 文件路径 |
**参考的请求主体:**
```json copy
{
"frequency_penalty": 1,
"global_penalty": false,
"max_tokens": 1000,
"penalty_decay": 0.996,
"presence_penalty": 0,
"state": "models/",
"temperature": 1,
"top_p": 0.3
}
```
### /status
这个 API 用于获取 RWKV Runner 运行的设备状态,比如 GPU 型号等。
**API 地址**:(get)`http://127.0.0.1:8000/status`
参考的**响应结构**:
```json copy
{
"status": 3, # 模型工作的状态码
"pid": 34776, # 模型的进程ID(Process ID)
"device_name": "NVIDIA GeForce RTX 3080 Laptop GPU" #模型工作的 GPU 型号
}
```
关于 RWKV Runner 状态码:
* 0 是模型离线
* 2 是模型正在载入
* 3 是模型正常工作中
## MIDI 相关 API
RWKV Runner 的 MIDI API 用于处理 midi 乐谱文件(`.mid`),比如文本转 MIDI 、MIDI 转 WAV 音频文件等。
### /text-to-midi
这个 API 用于将 MIDI 格式的文本(text)转换为 MIDI 乐谱文件(`.mid`)。
注意:此 API 与启动的 RWKV 模型无关。
**API 地址**:(post)`http://127.0.0.1:8000/text-to-midi`
**必需字段**
* "text": 提供给模型的 MIDI 乐谱文本,即 MIDI 乐谱内容。
参考的请求主体:
```json copy
{
"text": "p:24:a p:2a:a p:31:a p:39:a p:3b:a p:45:a b:26:a g:3e:a g:3e:a g:42:a g:42:a g:45:a g:45:a pi:3e:a pi:42:a pi:45:a t14 p:24:0 p:2a:0 p:31:0 p:39:0 p:3b:0 p:45:0 t2 p:2a:a p:3b:a p:45:a t14 p:2a:0 p:3b:0 p:45:0 b:26:0 g:3e:0"
}
```
### /midi-to-text
这个 API 用于将 MIDI 乐谱文件(`.mid`) 转换为 MIDI 格式的文本(text)。
注意:此 API 与启动的 RWKV 模型无关。
**API 地址**:(post)`http://127.0.0.1:8000/midi-to-text`
**必需字段**
* file\_data:提供给模型的 MIDI 乐谱文件,也可以是 string(\$binary) - 字符串格式的二进制数据。
参考的响应结构:
```json copy
{
"text": " p:24:a p:2a:a "
}
```
### /txt-to-midi
这个 API 用于将 MIDI 内容的文本文件(`.txt`)转换为 MIDI 乐谱文件(`.mid`)。
**API 地址**:(post)`http://127.0.0.1:8000/txt-to-midi`
**必需字段**
* "midi/sample.mid": 转化完毕的 MIDI 文件保存路径
* "midi/sample.txt":需要转化的 TXT 文件路径
**参考的请求主体**
```json copy
{
"midi_path": "midi/sample.mid",
"txt_path": "midi/sample.txt"
}
```
### /midi-to-wav
这个 API 用于将 MIDI 乐谱文件(`.mid`) 转换为 WAV 音频文件(`.wav`)。
这个 API 与 RWKV 模型无关,需要先安装 [fluidsynth](https://github.com/FluidSynth/fluidsynth/wiki/Download#distributions) 。
**API 地址**:(post)`http://127.0.0.1:8000/midi-to-wav`
**必需字段**
* "midi\_path": 需要转换的 MIDI 文件路径
* "wav\_path": WAV 文件保存路径
**可选字段**
* "sound\_font\_path":影响 MIDI 音色和合成参数的 SoundFont 文件路径
**参考的请求主体**
```json copy
{
"midi_path": "midi/sample.mid",
"sound_font_path": "assets/default_sound_font.sf2",
"wav_path": "midi/sample.wav"
}
```
### /text-to-wav
这个 API 用于将 MIDI 乐谱文本(text)转换为 WAV 音频文件(`.wav`)。
**API 地址**:(post)`http://127.0.0.1:8000/text-to-wav`
**必需字段**
* "text": 提供给模型的 MIDI 乐谱文本,即 MIDI 乐谱内容。
* "wav\_name": 转化后返回的 WAV 文件名称
**可选字段**
* "sound\_font\_path":影响 MIDI 音色和合成参数的 SoundFont 文件路径
**参考的请求主体**
```json copy
{
"sound_font_path":"assets/default_sound_font.sf2",
"text":"p:24:a p:2a:a p:31:a",
"wav_name":"sample"
}
```
## 文件处理 API
文件处理 API 目前只有 `/file-to-text`,用于解析上传的 PDF/txt 文件。
**API 地址**:(post)`http://127.0.0.1:8000/file-to-text?file_name=233.PDF&file_encoding=utf-8`
**API 查询参数**
* file\_name(必需参数):指定需要解析的文件名称,如 `?file_name=233.PDF` 。这里必须正确填写**你上传的文件类型**后缀(`.txt` 或者 `.pdf`),因为 PDF 文件需要特殊处理。
* file\_encoding:指定需要解析的文件编码,如 \&file\_encoding=utf-8
**必需字段**
* file\_data:类型 \*string(\$binary),即上传一个 txt / PDF 文件或二进制数据
## MISC API
这部分 API 主要用于兼容 OpenAI API ,以便开发者能将 RWKV 模型用在 ChatGPT 客户端中。
## State Cache 相关 API
State 缓存相关 API 没有请求主体。
此外,如果你打开了部署模式,或在运行模型时勾选了“启用WebUI”,State 缓存相关 API 将不可用。
开启 state cache 后,当前运行的 RWKV 模型的 state 会被缓存到内存中,在接受近似的 prompt 时无需重新 prefill。
### /disable-state-cache
这个 API 用于禁用 state 缓存
**API 地址**:(post)`http://127.0.0.1:8000/disable-state-cache`
### /enable-state-cache
这个 API 用于启用 state 缓存
**API 地址**:(post)`http://127.0.0.1:8000/enable-state-cache`
### /reset-state-cache
这个 API 用于重置 state 缓存设置
**API 地址**:(post)`http://127.0.0.1:8000/reset-state-cache`
## Root API
### /exit
这个 API 用于退出 RWKV Runner 的后端进程。
如果你打开了部署模式,或在运行模型时勾选了“启用WebUI”,`/exit` API 将不可用。
**API 地址**:(post)`http://127.0.0.1:8000/exit`
此 API 及后续 API 请求通常无法获得任何响应,因为进程已被关闭。
### /
此 API 用于检查 RWKV Runner 服务是否在工作状态。
**API 地址**:(get)`http://127.0.0.1:8000/`
如果你已经打开了 WebUI,会得到以下返回:
```json
RWKV-Runner
```
在浏览器中访问 [http://127.0.0.1:8000/](http://127.0.0.1:8000/) ,可以访问 WebUI 。
如果你得到以下返回,意味着服务正在运行,但未打开 WebUI:
```json
{
"Hello": "World!"
}
```
## API 并发压力测试
```bash copy
ab -p body.json -T application/json -c 20 -n 100 -l http://127.0.0.1:8000/chat/completions
```
请求主体:
```json copy
{"messages": [{"role": "user","content": "Hello"}]}
```
## API 常见问题
**问题1:我要去哪里查看 RWKV Runner 的 API 文档?**
本地启动 RWKV Runner 并启动一个模型,你将可以在 [http://localhost:8000/docs](http://localhost:8000/docs) 中查看 RWKV Runner 的 API 文档。
**问题2: deploy 模式下,哪些 API 会因“危险权限”而被屏蔽?**
在部署模式下,一切会影响服务器系统和硬件的 API 都会被屏蔽掉,这是为了安全起见。
比如:`/switch-model` 、 `/exit` 以及 State Cache 相关的 API 都会被屏蔽。
**问题3:为什么我本地部署 RWKV Runner 就默认开启了 deploy 模式?**
在 RWKV Runner 中,如果你勾选了 “启用 WebUI“ ,那么默认开启了 deploy 模式。
你可以通过关闭此选项,来解除部署模式,进而使用一些危险权限的 API 。
**问题4 :为什么 RWKV Runner 的 embaddings API 用不了?**
截至目前(2023-07-05,RWKV Runner V 1.8.4) 不建议使用 RWKV Runner 文档中提供的 embaddings API 。
文档中的 embaddings API 目前停留在 RWKV-4,未针对 RWKV5/6 架构进行重构,因此会报错。
# 进阶用法
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'
## 什么是 Strategy 和量化
`Strategy` 决定了模型的加载方式,会影响模型的生成速度、准确性等用户体验。
RWKV Runner 支持 5 种 `Strategy` 参数,分别源自不同的 RWKV 推理框架:
* llama.cpp 来自 [llama.cpp](https://github.com/ggml-org/llama.cpp) 项目
* CPU、CUDA 来自 [RWKV 官方 pip 包](https://pypi.org/project/rwkv/)
* CPU(RWKV.cpp) 来自 [rwkv.cpp](https://github.com/RWKV/rwkv.cpp) 项目
* webgpu(python) 来自 [web-rwkv-py](https://github.com/cryscan/web-rwkv-py),即 [web-rwkv 项目](https://github.com/cryscan/web-rwkv)的 Python 绑定项目
量化则是使用不同的数据精度进行推理,RWKV 的默认训练精度是 BF16,推理精度是 FP16。
当你的显存和内存不足时,可以使用 INT8 / NF4 量化运行 RWKV 模型推理,以降低显存和内存需求。
**从回答质量来说,同参数的模型 FP16 回答质量最好,INT8 与 FP16 质量相当,NF4 回答质量相比 INT8 较明显地降低。**
### 不同 `Strategy` 的显存需求和生成速度
测试环境:
* CPU :i7-10870H
* GPU: RTX 3080 Laptop ,16G 显存
* 内存:32GB
以下是 RWKV Runner 所有 Strategy 和对应量化方式(默认量化所有层)的显存/内存需求:
| Strategy | 1B6显存 | 3B显存 | 7B显存 | 14B显存 |
| ------------------- | ------ | ------- | ------- | ------------- |
| CPU-FP32 | 6.6G内存 | 12GB内存 | 21G内存 | OOM(不建议使用) |
| rwkv.cpp-FP16 | 3.5G内存 | 7.6GB内存 | 15.7G内存 | 30GB(内存) |
| rwkv.cpp-Q5\_1 | 2GB内存 | 3.7GB内存 | 7.2GB内存 | 12.4GB(内存) |
| CUDA-FP16 | 3.2GB | 6.2GB | 14.3GB | 约28.5G |
| CUDA-INT8 | 1.9G | 3.4GB | 7.7GB | 15GB |
| webgpu(python)-FP16 | 3GB | 6.3GB | 14GB | 约28G |
| webgpu(python)-INT8 | 1.9GB | 4.2GB | 7.7GB | 15GB(量化41层) |
| webgpu(python)-NF4 | 1.2GB | 2.5GB | 4.8GB | 14.3GB(量化41层) |
不同 Strategy 的生成速度(TPS,约等于每秒多少字):
| Strategy | 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 | OOM,无法测试 |
| CUDA-INT8 | 22 | 16 | 18 | 7.4 |
| webgpu(python)-FP16 | 40 | 29 | 17 | OOM,无法测试 |
| webgpu(python)-INT8 | 45 | 35 | 23 | 15 |
| webgpu(python)-NF4 | 43 | 32 | 21 | 18 |
### 不同 `Strategy` 的优劣势对比
* **CPU**: **兼容性最强**,所有设备都能跑,支持所有 RWKV 系列模型,但速度很慢。
* **CPU(rwkv.cpp)**: 更快的 CPU 模式,比普通 CPU 模式快几倍。**所有设备都能跑**,且能以 Q5\_1 量化在极低内存占用下运行。但是使用前要先将 .pth 后缀转换成 GGML 模型,目前不支持 RWKV 音乐模型(MIDI/ABC)。
* **CUDA**: 仅 NVIDIA 显卡可用的模式。支持显卡加速,支持所有 RWKV 系列模型。如果开启自定义算子加速,那么拥有最快的预处理速度,提交上万字的文本都能几乎秒出回答。但是自定义算子加速只支持 10 系及以上的 N 卡。
* **WebGPU(Python)**: 同样**推理速度最快**的模式,并且**支持所有 RWKV 系列模型**,几乎支持所有显卡进行硬件加速,**支持 NF4 量化**获得最低的显存占用。但使用前需要先转换模型。
* **自定义**: 最灵活的模式,可以自由指定每层神经网络所用的设备,可以混合 cpu 和显卡推理,还能将网络分配在多张显卡上推理,也可以部分载入神经网络,除了 cuda 也能指定 dml 和 mps 等后端。**但不推荐新手使用,使用前请确保你是资深大语言模型玩家,具备充足的神经网络知识。**
### `Strategy` 参数便捷对照表
| Strategy 类型 | 显卡类型 | 支持的 RWKV 版本 | 使用的模型格式 | 支持的模型类型 | 速度参考 |
| -------------- | ----------- | ----------- | ------------------- | -------------- | ----- |
| CPU | 所有显卡 | 所有版本 | PyTorch(`.pth`) | World/MIDI/ABC | ⭐⭐ |
| CPU(RWKV.cpp) | 所有显卡 | 所有版本 | GGML( `.bin` ) | World | ⭐⭐⭐ |
| CUDA | 仅支持NVIDIA显卡 | 所有版本 | PyTorch( `.pth` ) | World/MIDI/ABC | ⭐⭐⭐⭐ |
| WebGPU(python) | 所有显卡 | 所有版本 | Safetensor( `.st` ) | World/MIDI/ABC | ⭐⭐⭐⭐⭐ |
## RWKV Runner 配置参数对照表
在 RWKV Runner 的配置页面,可修改预设模型配置的参数,或点击 + 号添加**自定义的模型配置**。
如果说预设模型配置像餐厅提前准备好的食物套餐,那么自定义模型配置就像是自助餐,你可以随意调整与 RWKV 模型推理相关的各类参数。
**请记住:针对每项参数的调整,都将影响 RWKV 模型最终的生成效果。**
**以下是 RWKV Runner 每项参数的作用和推荐的值,请认真阅读:**
### 解码 / api 参数
**自定义模型配置的模型解码 / api 参数说明,及其调整效果:**
| API 参数 | 效果描述 |
| ----------------- | --------------------------------------------------------------------------------------------------- |
| API 端口 | RWKV Runner 所使用的本地端口,打开后可打开以下地址查看 API 文档: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)。 |
| 最大响应 Token | 默认情况下,单个回复最多回答的 token 数量 |
| Temperature | 采样温度,就像给模型喝酒,数值越大随机性越强,更具创造力,数值越小则越保守稳定。 |
| Top\_P | 就像给模型喂镇静剂,优先考虑前 n% 概率质量的结果。如设置成 0.1 则考虑前 10%,生成内容质量更高但更保守。如设置成 1,则考虑所有质量结果,质量降低但更多样。 |
| Presence Penalty | 存在惩罚,正值根据“新 token 在至今的文本中是否出现过”来对其进行惩罚,从而增加了模型涉及新话题的可能性。 |
| Frequency Penalty | 频率惩罚,正值根据“新 token 在至今的文本中出现的频率/次数”来对其进行惩罚,从而减少模型原封不动地重复相同句子的可能性。 |
| 惩罚衰减(建议默认) | 惩罚衰减系数越高,会减轻对重复内容的惩罚。模型在生成新 token 时,对先前出现的词或短语的“惩罚”更轻,可能导致内容重复、创造性降低,但会提高连贯性。 |
| 全局惩罚 | 生成响应时,是否将提交的 prompt 也纳入到惩罚项。如果你发现生成结果出现重复,开启此项有助于避免生成重复内容。 |
### 模型加载参数
下为自定义模型配置的**模型参数**说明,及其调整效果。
| 模型参数 | 描述 |
| --------------- | ------------------------------------------------------------ |
| 模型 | 选取一个本地模型,通常根据不同的任务类型选取对应的模型 |
| 模型转换 | 用于转换模型,使用转换过的模型能大大提升载入速度,但是转换后的模型无法再修改模型参数 |
| Strategy | 指驱动模型的方法,NVIDIA 显卡选 CUDA,其他类型的显卡建议选取 llama.cpp 或 WebGPU |
| 精度 | 深度学习的数据类型,fp16 质量更好,NF4 质量略微下降,但显存占用更低。 |
| 载入显存层数 | 载入显存的神经网络层数,载入越多速度越快,但显存消耗越大(如果你的显存不够,会载入失败) |
| 使用自定义 CUDA 算子加速 | 开启这个选项能提升推理速度并节省显存,但可能存在兼容性(回复乱码)问题。如果发生相关问题,请关闭此选项或更新你的显卡驱动 |
| 并行 Token 块大小 | 单次最多可以并行处理的 token 数量。对于高端显卡,可以设置成 64 或 128,使生成速度变得更快 |
| 量化层数 | 神经网络以当前精度量化的层数。量化层数越多,占用的显存越低,但质量会相应下降 |
## 自定义模型配置示例
下面以使用 RWKV7-G1 1.5B 模型执行翻译任务为例,演示自定义模型配置的过程:
### 选择或新建一项配置
点击 + 号,新建一项配置,并参考对照表调整各项 API 参数:
由于是不需要创造力的翻译任务,我们稍微调低了 Temperature 和 Top\_P 两项参数,使翻译的结果更准确。
### 调整模型参数
在这一步,我们选择了一个 RWKV7-G1 1.5B 参数的模型。
由于当前设备是 AMD 的核显,无法使用 CUDA 驱动模型。因此我们在 Strategy 选项中选择了 “WebGPU(python)”。
由于 WebGPU(python)模式只支持 Safetensors 格式。因此,我们需要点击 Runner 的“转换”弹框,将 `.pth` 后缀的官方 RWKV 模型转换为 `.st` 后缀的模型格式。
### 运行转换后的模型
耐心等待模型转换完成后,我们再次点击“模型”选项,选择转换完成后的 `.st` 模型,并点击运行。
等待模型加载完毕,即可开始聊天!
Tips: 如果选择了 CPU(rwkv.cpp),则转换过后的模型会带有类似 fp16.bin 的后缀。
***
## RWKV Runner 的进阶功能
### 搭载 state 文件
state 文件需要配合基底 RWKV 模型,才能发挥其效果。在 RWKV Runner 中,你可以按照以下步骤使用 state 文件:
* 启动一个 RWKV 模型
* 在配置页面选择与模型尺寸对应的 state
* 点击`保存配置`按钮。
点击保存后即可实时更新 state ,无需重新启动 RWKV 模型。
在下图的示例中,我们已经启动了 RWKV-6-7B-World 模型。那么我们只需在 RWKV Runner 的配置页面,选择基于 RWKV-6 7B 的 state 文件(名称中带有 `x060 | 7B` 字段),然后点击 `保存配置` 按钮。
### Function Call 功能
RWKV Runner 在 1.8.7 版本引入了 Function Call 函数调用功能。
Function Call 是指在模型推理过程中能够识别特定的指令,并触发外部函数来执行某些操作。
Function Call 使得模型不仅可以生成文本,还能够在特定情况下调用外部 API、执行计算、或者从外部源获取实时信息,然后将这些结果整合到响应文本中。
RWKV 基底模型无法使用 Function Call 功能,请使用社区微调的 [Mobius-RWKV-r6-12B](https://huggingface.co/TimeMobius/Mobius-RWKV-r6-12B/tree/main) 模型。
要使用 RWKV Runner 的 Function Call 功能,请先打开图中的开关:
打开函数调用开关后,你需要在 `工具定义` 框中定义一些可用的函数。定义的函数必须满足 [OpenAI tool](https://platform.openai.com/docs/api-reference/chat/create#chat-create-tools) 格式,参考:
```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"}
```
填写完毕后,即可正常与 RWKV 模型对话。如果对话过程涉及可调用的工具,模型会自动调用合适的工具,并将调用结果整合到回答中:
### Function Call 的 Python 示例
以下 Python 代码指引你调用 RWKV Runner 的 api 适配 Function Call 功能:
```python copy
# https://platform.openai.com/docs/guides/function-calling
from openai import OpenAI
import json
client = OpenAI(
base_url="http://127.0.0.1:8000", # 根据 RWKV Runner 的配置修改端口号
api_key="test",
)
# 这是硬编码的虚拟函数示例,返回天气情况
# 在生产环境中,需要改成你的后台 API 或外部 API
def get_current_weather(location, unit="fahrenheit"):
"""Get the current weather in a given location"""
if "tokyo" in location.lower():
return json.dumps({"location": "Tokyo", "temperature": "10", "unit": unit})
elif "san francisco" in location.lower():
return json.dumps(
{"location": "San Francisco", "temperature": "72", "unit": unit}
)
elif "paris" in location.lower():
return json.dumps({"location": "Paris", "temperature": "22", "unit": unit})
else:
return json.dumps({"location": location, "temperature": "unknown"})
def run_conversation():
# 第 1 步:将对话和可用函数发送给模型
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",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
},
}
]
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto", # 不存在任何工具时,默认值 none。如果存在工具,则 auto 是默认值
)
response_message = response.choices[0].message
tool_calls = response_message.tool_calls
# 第 2 步:检查模型是否想要调用函数
if tool_calls:
# 第 3 步:调用函数
# 注意:JSON 响应不一定生效;请务必处理错误情况
available_functions = {
"get_current_weather": get_current_weather,
} # 本示例中只有一个函数,实际可以有多个
messages.append(response_message) # 用 assistant 的回答扩展对话
# 第 4 步:向模型发送每个函数调用和函数响应的信息
for tool_call in tool_calls:
function_name = tool_call.function.name
function_to_call = available_functions[function_name]
function_args = json.loads(tool_call.function.arguments)
function_response = function_to_call(
location=function_args.get("location"),
unit=function_args.get("unit"),
)
messages.append(
{
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_response,
}
) # 通过函数响应扩展模型的对话内容
second_response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
) # 从模型中获取新的响应,在模型中可以看到函数响应
return second_response.choices[0].message.content
print(run_conversation())
```
## 🌐 服务器部署
在Linux系统下, RWKV Runner 无法调用终端自动安装依赖, 你必须遵循以下步骤进行安装, 之后方可正常使用。
以下是一份简易的 Linux 服务器部署示例:
### 下载与安装
1. 在你的服务器中选择一个空的目录,然后执行以下语句,将 RWKV Runner 克隆到服务器中:
```bash copy
git clone https://github.com/josStorer/RWKV-Runner
```
2. 进入 RWKV-Runner 目录,执行以下命令,安装项目所需的依赖:
```bash copy
cd RWKV-Runner
sudo apt install python3-dev # 以 root 权限安装 python3-dev
chmod +x ./RWKV-Runner # 更改文件模式(权限)为可执行文件
./RWKV-Runner # 运行 RWKV Runner
cd backend-python
pip3 install -r requirements.txt # 也可以运行 pip3 install -r requirements_without_cyac.txt
```
3. 下载 RWKV 模型
在 RWKV Runner 目录运行以下命令,下载 RWKV7-G1 2.9B 模型,并将模型文件放置在 `RWKV-Runner/models` 目录下:
```bash copy
mkdir models # 创建 models 文件夹
wget -N https://modelscope.cn/models/Blink_DL/rwkv7-g1/resolve/master/rwkv7-g1-2.9b-20250519-ctx4096.pth -P models/
```
请在 [RWKV 模型下载](../../basic/Model-Download)页面,查看所有可用的 RWKV 模型下载链接。
### 启动推理和 Web 服务
1. 启动后端推理服务
如需启动后端推理服务,请执行以下命令:
```bash copy
python ./backend-python/main.py
```
注意,main.py 默认使用 RWKV pip 库,支持 `CUDA` 和 `CPU` 两种推理 Strategy 。
如需以 rwkv.cpp 或 webgpu 两种 Strategy 进行推理,请带上对应的参数:
```bash copy
python ./backend-python/main.py --rwkv.cpp # 以 rwkv.cpp 模式推理
python ./backend-python/main.py --webgpu
```
服务启动后,可调用 `/switch-model` API 载入模型,参考 RWKV Runner [API 指南](./API-Usage#switch-model)或 API 文档:[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) 。
2. 如需启动前端服务,请执行以下命令:
```bash copy
cd RWKV-Runner/frontend
npm ci
npm run build #编译前端
cd ..
python ./backend-python/webui_server.py #单独启动前端服务
```
3. 如需同时启动前后端服务,请执行以下语句:
```bash copy
python ./backend-python/main.py --webui #同时启动前后端服务
```
4. 如需查看帮助参数,请执行:
```bash copy
python ./backend-python/main.py -h
```
所有可用的 Web API 请参考:[RWKV Runner API 指南](./API-Usage)。
更详细的服务器部署案例请在此查看:[https://github.com/josStorer/RWKV-Runner/tree/master/deploy-examples](https://github.com/josStorer/RWKV-Runner/tree/master/deploy-examples)
注意:如果你正在部署并对外提供公开服务,请通过 API 网关限制请求大小,避免过长的 prompt 提交占用资源。此外,请根据你的实际情况,限制请求的 max\_tokens 上限,因为默认le = 102400,可能导致极端情况下单个响应消耗大量服务器资源。
# 连接 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 硬件输入。
如果你没有实体的 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 窗口,它会自动在后台运行。
# 常见问题
import { CallOut } from 'components-docs/call-out/call-out.tsx'
import { Step, Steps } from 'fumadocs-ui/components/steps'
## 配置和运行问题
### 我的 Nvidia 显卡可以正常使用,但是开启自定义 CUDA 算子加速会报错
检查 `py310\\Lib\\site-packages` 目录下,是否有 `torch-1.13.1+cu117.dist-info` 这个文件夹。
如果没有,往往可能是装了 `torch-2.0.x` ,请删除现有的 torch 目录,并删除 RWKV Runner.exe 所在目录的 `cache.json` 文件。然后运行 RWKV Runner,让它自己重新安装依赖。
***
### Torch not compiled with CUDA enabled
解决方法和上面一样。
***
### 我使用 7B 或更大参数的 RWKV 模型,运行不成功或速度太慢。
如果选择 CUDA - fp16 加载方式, 7B 模型需要 15G 显存,14B 需要 30G 显存。
如果你的设备性能不佳(如内存 16 GB 或显存 8G 或者更低),在体验 7B 或更大规模的模型时,请尝试将模型参数的 Strategy 选项改为 WebGPU (Python),精度改为 nf4 。
更换 Strategy 选项后需要点击 `转换模型`,选择转换后的 .st 格式模型,保存配置并重新运行。详情可参考 [自定义模型配置](./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
这个问题大概率是因为 RWKV Runner 的 python 依赖项出现错误,有几种方法可以帮助你解决这个问题:
**方法1**
双击 RWKV Runner 文件夹的的 `install-py-dep.bat` 脚本,让它重新下载 python 依赖项, 先前下载时可能由于网络问题意外中断了。
**方法2**
下载[百度网盘的懒人包](https://pan.baidu.com/s/1zdzZ_a0uM3gDqi6pXIZVAA?pwd=1111), 懒人包有完整的 Python 依赖。
注意:网盘的 `RWKV` 文件夹内有一个名字里写了"懒人包"的 zip 压缩文件, 只需要下载并解压这个文件即可。
**方法3**
如果你的显卡较旧, 那么请在"配置"页面, 关闭"使用自定义CUDA算子加速"
***
### 模型输出的内容乱码
请更新显卡驱动,。如果无法解决问题请打开 Runner 配置页,关闭配置页`自定义 CUDA 算子加速`。
***
### 为什么使用 webgpu 模式的配置页没有 state 选项?
RWKV Runner 只有 Cuda 模式(NVIDIA 显卡)支持挂载 state。
非 NVIDIA 显卡需要使用 [Ai00](../ai00/Introduction) 才能搭载 State 文件。
## 开发和部署问题
***
### RWKV Runner 是否可以作为其他 LLM API 的前端使用?
可以,兼容 OpenAI API 格式即可。
***
### 三方应用 API 接口调用报错
同样删除 cache.json,重启拉取最新 API 程序,检查下载列表,等待完成。
一个典型的调用 API 的示例是打开浏览器控制台,粘贴执行以下代码,应该能看到输出回答:
```js copy
fetch("http://127.0.0.1:8000/chat/completions", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ messages: [{ role: "user", content: "你好" }] }),
})
.then((r) => r.json())
.then(console.log);
```
***
### 软件自动更新下载不动,想要手动下载覆盖,正确操作姿势
如果你希望同时拉取最新相关依赖,请删除 cache.json,然后启动新版本的 exe 文件。
如果你在离线环境部署,请保留 cache.json,或至少自己新建一个空的 cache.json文件,避免拉取最新依赖。
***
### 内网离线环境更新 python API
与上述问题一样,参考该 Issue :[https://github.com/josStorer/RWKV-Runner/issues/18](https://github.com/josStorer/RWKV-Runner/issues/18),手动下载并放置到目录中。
***
### 点击安装依赖后,几个黑窗一闪而过
请检查下载列表所有内容是否都已经下载完毕,下载完毕后再点击安装依赖。
* 如果下载列表有未完成的下载任务,请手动点一下继续。
* 如果下载列表是空的,说明本地文件都正常,可以安装依赖。
如果始终下载不动,可以自己前往 github 手动下载,参考这个链接:[https://github.com/josStorer/RWKV-Runner/issues/18](https://github.com/josStorer/RWKV-Runner/issues/18)
***
### python 依赖无法下载,可不可以手动下载
下载 github 仓库的 `/backend-python` 目录:
```bash copy
https://github.com/josStorer/RWKV-Runner/tree/master/backend-python
```
下载完成放进 RWKV Runner 所在的文件夹。
然后下一个 `get-pip.py` :
```bash copy
https://cdn.jsdelivr.net/gh/pypa/get-pip/public/get-pip.py
```
将其放进 backend-python 目录。
***
### Microsoft Store 下载软件超时
将 DNS 服务器手动设置为 4.2.2.2 和 4.2.2.1,确定后重试。
**⚠️ 注意**,下载完成后,请务必将 DNS 服务器改回之前的设置,否则可能影响网络连接。
***
# 简介
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/Chat-Prompts)
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'
LORA(Low-Rank Adaptation)是一种针对大型预训练模型的微调技术。它不改变原始模型大部分参数,而是仅通过引入两个低秩矩阵来调整模型的部分权重,以此实现对特定任务的有效优化。这种方法能够在保持模型原有泛化能力的同时,减少微调所需资源,并提高特定任务的性能。
RWKV Runner 的“训练”版块支持一键 LoRA 微调 RWKV 模型,但目前仅支持在 Windows 系统中使用 WSL 训练。
在开始训练之前,请确保你的 Windows 设备上已安装最新版的 WSL2(Windows Subsystem for Linux)。
## LoRA 训练环境配置
在开始训练之前,我们需要先配置一次 LoRA 训练的环境。
以下步骤详细指导如何在一台新电脑上配置 RWKV Runner 的 LoRA 训练环境,请确保配置全程处于畅通的网络。
### 选择基底 RWKV 模型,转换训练数据
打开 RWKV Runner 的`训练` - `训练参数`一栏,选择你要使用的基底模型,然后点击训练按钮。
初次执行时,系统会提示你数据需要转换,点击上方的转换按钮,将训练数据转换为更适合训练的 binidx 格式。
### 开启 WSL ,激活 Linux 环境
再次点击训练,RWKV Runner 将会尝试开启 Windows WSL 功能,激活 Linux 环境。
此操作会要求管理员权限,你需要点击确认,并在弹出的窗口完成激活。
激活后建议重启电脑,如果之前已经开启过 WSL 功能,则可以不进行重启。
### 为 WSL 安装 Ubuntu
接着,RWKV Runner 会自动查询 Windows 是否安装了 Ubuntu 系统。如果没有找到, Runner 将会提示你进行安装。
对于一般使用 Windows 家庭版或专业版的用户,点击弹框的安装按钮后,Microsoft Store 将会自动打开并跳转至 Ubuntu 的安装界面。
### 更新 WSL 版本
使用商店安装前,建议你先在命令行执行一次 `wsl --update` 进行 WSL 更新,并执行 `wsl --set-default-version 2` 将 WSL 的默认版本设为 2。
然后点击微软商店的 Ubuntu 安装按钮。
成功安装 ubuntu 后,点击打开按钮,让 Ubuntu 执行初始化配置。
如果你使用的是服务器版 Windows 系统,通常该系统没有微软商店组件,请使用命令行自行安装 Ubuntu 系统。
### 为 Ubuntu 配置训练环境
继续点击训练按钮,现在将会为 Ubuntu 配置训练环境。在这个阶段,RWKV Runner 界面将会出现一系列命令文本,并下载多个组件。
此阶段请保证你的网络畅通:
Ubuntu 训练环境只需要配置一次。
### 开始 LoRA 训练
在环境配置完毕后,RWKV Runner 将自动开始训练,当你见到这个图形化 Loss 曲线时,意味着训练已正式开始。
### 合并训练权重
根据你设置的保存间隔轮次,在 LoRA 模型一栏,将会出现多个训练完成的 LoRA 权重,你可以选择一个权重,并点击合并模型按钮。
合并模型将会生成一个直接可用的新微调模型,新的微调模型会带有 LoRA 后缀。
此时可在 **RWKV Runner** 的配置页面选择新的微调模型并正常启动。
## LoRA 微调的参数设置
以下是 RWKV Runner 中 LoRA 微调的**数据参数**设置:
**数据处理调整**
* 数据路径:这里的数据指的用于 LoRA 微调的数据集,这些数据集用于训练 RWKV 模型理解和学习特定任务,例如情感分析、文本分类、问答系统等。数据路径必须是一个**文件夹**或者具体的 **jsonl 格式文件** (jsonl 数据集的格式可参考:[RWKV 微调数据集](../../advanced/Fine-Tune/FT-Dataset),未来会支持更多格式)。当你填写的路径是一个文件夹时,该文件夹内的所有 txt 文件会被自动转换为训练数据,通常用于大批量训练写作,代码生成或知识库。
* 词表路径: 默认情况下不需要修改。词表路径指向一个包含模型可识别的所有单词或标记(tokens)的列表的文件。在自然语言处理(NLP)中,词表(或词汇表)是模型用来理解输入文本的基础。每个单词或标记都会被映射到一个唯一的数字ID,模型使用这些ID来处理和生成文本。
训练参数调整
以下是 LoRA **训练参数**的作用和推荐设置:
| 模型参数 | 描述 |
| -------- | --------------------------------------------------------- |
| 基底模型 | 选取一个本地 RWKV 模型,作为 LoRA 微调的起点 |
| LoRA 模型 | 从某个 LoRA 权重继续训练。如果为空,则表示从基底预训练模型开始进行 LoRA 微调。 |
| 合并模型(按钮) | 训练得到的 LoRA 要与基底模型合并后使用,目前还不支持直接挂载 LoRA 。 |
| 显卡数量 | 使用多少块 GPU 进行训练,在单机多卡或者分布式环境下可以设置大于 1。 |
| 精度 | 通常选择 BF16,这是 RWKV 的官方训练精度。 |
| 梯度检查点标志 | 开启梯度检查点可以节省内存消耗,通过牺牲一些计算效率来换取更小的内存使用量。 |
| 上下文长度 | 训练出来的模型能处理的任务(对话/聊天等)的上下文长度,如果你训练数据量很大,可以适当加长(建议 4096 以内) |
其他参数主要涉及到优化器配置和学习率策略:
* 每轮训练步数、训练轮次、起始轮次、保存间隔轮次等参数控制着整体训练流程。一般情况下保持默认,可根据数据集的大小适当增大训练步数和训练轮次。
* 初始学习率、最终学习率、Adam Epsilon、Beta 1、Beta 2 等参数则影响着优化器(如 Adam)如何更新权重,一般情况下保持默认即可。如需修改学习率,请不要大于 le-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 大模型的朋友们提供指引。
遵循以下步骤,应该可以成功使用 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` 文件夹中
推荐使用 RWKV7-G0/G1 系列模型,RWKV7-G1 系列模型拥有杰出的推理能力,且原生支持世界 100+ 种语言和代码。即使是最小的 0.1B 也能回答开放性和创造性问题。
* [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'
以下是 Ai00 的 API 文档,包含所有 API 的详细说明。
本地启动 Ai00 后,可以通过 `http://localhost:65530/api-docs/` 打开 Ai00 的 API 文档。
## api/oai/chat/completions
**API 功能**:`api/oai/chat/completions` 和 `api/oai/v1/chat/completions` 是相同的 API ,用于 RWKV 的聊天续写模式,也就是和模型对话。
**API 地址**:(post)`http://localhost:65530/api/oai/chat/completions`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ----------------- | ---- | ----------------------- | ------------------------------------------------------ |
| messages | 必选 | array\ | 对话历史记录,每个对象包含 role(角色)和 content(内容)两个字段 |
| names | 必选 | object\ | 角色名称映射,可以自定义 system/user/assistant/observation 等角色的显示名 |
| state | 可选 | string | 指定使用的 RWKV state 文件 UUID |
| max\_tokens | 可选 | integer | 生成文本的最大 token 数 |
| stop | 可选 | array\ | 停止词列表,当生成内容包含这些词时会停止生成,默认值为 \["\n\n"] |
| stream | 可选 | boolean | 是否以流模式生成文本,默认值为 false |
| bias | 可选 | object\ | token id 到权重的映射,用于调整特定 token 的生成概率,默认为空 |
| bnf\_schema | 可选 | string \| null | BNF 语法规则,用于约束模型输出格式,默认为 null |
| sampler | 可选 | object | 默认的采样参数(Nucleus 类型) |
| sampler\_override | 可选 | Option\ | 覆盖默认采样参数,可以选择不同的采样方法 |
**参考的 API 请求主体**
```json copy
{
"max_tokens": 1000,
"messages": [
{
"content": "Hi!",
"role": "user"
},
{
"content": "Hello, I am your AI assistant. If you have any questions or instructions, please let me know!",
"role": "assistant"
},
{
"content": "Tell me about water.",
"role": "user"
}
],
"names": {
"assistant": "Assistant",
"user": "User"
},
"sampler_override": {
"frequency_penalty": 0.3,
"penalty": 400,
"penalty_decay": 0.99654026,
"presence_penalty": 0.3,
"temperature": 1,
"top_k": 128,
"top_p": 0.5,
"type": "Nucleus"
},
"state": "00000000-0000-0000-0000-000000000000",
"stop": [
"\n\nUser:"
],
"stream": false
}
```
**参考的 API 返回结果**
```json copy
{
"object": "chat.completion",
"model": "assets/models\\RWKV-x060-World-1B6-v2.1-20240328-ctx4096.st",
"choices": [
{
"message": {
"role": "Assistant",
"content": "Water is a liquid that is essential for life on Earth. It is a mixture of hydrogen and oxygen atoms, which makes it a highly reactive and polar molecule. Water has a high surface tension and is able to form water droplets when it comes into contact with other substances. It is found in various forms, including ice, snow, rain, and fog. Water is also essential for the growth and survival of plants and animals."
},
"index": 0,
"finish_reason": "stop"
}
],
"usage": {
"prompt": 41,
"completion": 88,
"total": 129,
"duration": {
"secs": 4,
"nanos": 381959200
}
}
}
```
返回结果说明:
* `object`: 返回对象类型,固定为 "chat.completion"
* `model`: 当前使用的模型路径
* `choices`: 生成结果数组,包含以下字段:
* `message`: 生成的消息对象,包含:
* `role`: 角色类型,固定为 "Assistant"
* `content`: 生成的文本内容
* `index`: 结果的索引号
* `finish_reason`: 生成停止的原因
* `usage`: 使用统计信息,包含以下字段:
* `prompt`: 输入提示的 token 数量
* `completion`: 生成内容的 token 数量
* `total`: 总 token 数量
* `duration`: 生成耗时,包含秒和纳秒
## api/oai/completions
**API 功能**:`api/oai/completions`和 `api/oai/v1/completions`是相同的续写 API,用于基础续写模式,让模型接着你的 prompt 继续生成内容。
**API 地址**:(post)`http://localhost:65530/api/oai/completions`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ----------------- | ---- | ---------------------- | --------------------------------------- |
| prompt | 必选 | Array\ | 你提供给模型的续写提示文本数组 |
| state | 可选 | string | 指定使用的 RWKV state 文件 UUID |
| max\_tokens | 可选 | integer | 生成文本的最大 token 数,默认值为 256 |
| stop | 可选 | Array\ | 停止词列表,当生成内容包含这些词时会停止生成,默认值为 \["\n\n"] |
| stream | 可选 | boolean | 是否以流模式生成文本,默认值为 false |
| bias | 可选 | HashMap\ | token id 到权重的映射,用于调整特定 token 的生成概率,默认为空 |
| bnf\_schema | 可选 | Option\ | BNF 语法规则,用于约束模型输出格式,默认为 None |
| sampler | 可选 | NucleusParams | 默认的 Nucleus 采样参数 |
| sampler\_override | 可选 | Option\ | 覆盖默认采样参数,可以选择不同的采样方法 |
**参考的请求主体:**
```json
{
"prompt": [
"The Eiffel Tower is located in the city of"
],
"stop": [
"\n\n",
"."
],
"stream": false,
"max_tokens": 1000,
"sampler_override": {
"type": "Nucleus",
"top_p": 0.5,
"top_k": 128,
"temperature": 1,
"presence_penalty": 0.3,
"frequency_penalty": 0.3,
"penalty": 400,
"penalty_decay": 0.99654026
},
"state": "00000000-0000-0000-0000-000000000000"
}
```
**参考的 API 返回结果**
```json
{
"object": "text_completion",
"model": "assets/models\\RWKV-x060-World-3B-v2.1-20240417-ctx4096.st",
"choices": [
{
"text": " Paris, France",
"index": 0,
"finish_reason": "stop"
}
],
"usage": {
"prompt": 11,
"completion": 4,
"total": 15,
"duration": {
"secs": 0,
"nanos": 260801800
}
}
}
```
返回结果说明:
* `object`: 返回对象类型,固定为 "text\_completion"
* `model`: 当前使用的模型路径
* `choices`: 生成结果数组,包含以下字段:
* `text`: 生成的文本内容
* `index`: 结果的索引号
* `finish_reason`: 生成停止的原因
* `usage`: 使用统计信息,包含以下字段:
* `prompt`: 输入提示的 token 数量
* `completion`: 生成内容的 token 数量
* `total`: 总 token 数量
* `duration`: 生成耗时,包含秒和纳秒
## api/oai/chooses
**API 功能**:API 拥有 "input" 和 "choices" 参数,即给定输入和选项,让模型按照困惑度对选项进行排名,从而选出最合适的回答。
`api/oai/chooses` 和 `api/oai/v1/chooses` 是相同的 API。
**API 地址**:(post)`http://localhost:65530/api/oai/chooses`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ------- | ---- | -------------- | ------------------------ |
| input | 必选 | Array\ | 提供给模型的输入文本数组 |
| choices | 必选 | Array\ | 供模型选择的选项数组 |
| state | 可选 | string | 指定使用的 RWKV state 文件 UUID |
**参考的 API 请求主体**
```json
{
"choices": [
" Paris",
" Seattle",
" San Francisco",
" Shanghai"
],
"input": [
"The Eiffel Tower is located in the city of"
],
"state": "00000000-0000-0000-0000-000000000000"
}
```
**参考的 API 返回结果**
```json
{
"object": "list",
"model": "assets/models\\RWKV-x060-World-3B-v2.1-20240417-ctx4096.st",
"data": [
{
"object": "choice",
"index": 0,
"rank": 0,
"choice": " Paris",
"perplexity": 0.031040953
},
{
"object": "choice",
"index": 2,
"rank": 1,
"choice": " San Francisco",
"perplexity": 6.299065
},
{
"object": "choice",
"index": 3,
"rank": 2,
"choice": " Shanghai",
"perplexity": 12.735298
},
{
"object": "choice",
"index": 1,
"rank": 3,
"choice": " Seattle",
"perplexity": 14.686427
}
]
}
```
返回结果说明:
* `object`: 返回对象类型,固定为 "list"
* `model`: 当前使用的模型路径
* `data`: 选择结果数组,包含以下字段:
* `object`: 选项类型,固定为 "choice"
* `index`: 选项在原始 choices 数组中的索引
* `rank`: 选项在排序后的排名(0 为最佳选择)
* `choice`: 选项内容
* `perplexity`: 困惑度分数,分数越低表示该选项越合适
## api/oai/embeddings
**API 功能**:`api/oai/embeddings` 和 `api/oai/v1/embeddings` 是相同的 API,使用当前加载的 RWKV 模型为给定文本生成嵌入向量,可指定生成嵌入向量的模型层数。
**API 地址**:(post)`http://localhost:65530/api/oai/embeddings`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ----- | ---- | ------------------------------------ | --------------------- |
| input | 是 | ( null \| string \| array\ ) | 给嵌入模型的文本 |
| layer | 是 | integer | 指定生成嵌入向量的层数 |
| state | 是 | string | 指定使用的 RWKV state 文件路径 |
**参考的 API 请求主体**
```json copy
{
"input": "rwkv",
"layer": 0,
"state": "00000000-0000-0000-0000-000000000000"
}
```
**参考的 API 返回结果**
```json copy
{
"object": "list",
"model": "assets/models\\RWKV-x060-World-1B6-v2.1-20240328-ctx4096.st",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": "embedding": [0.37109375, -0.015655518, -0.01977539, /* ... */]
}
],
"usage": {
"prompt": 2,
"completion": 1,
"total": 3,
"duration": {
"secs": 0,
"nanos": 2200
}
}
}
```
返回结果说明:
* `object`: 返回对象类型,固定为 "list"
* `model`: 当前使用的模型路径
* `data`: 嵌入向量结果数组,包含以下字段:
* `object`: 嵌入对象类型,固定为 "embedding"
* `index`: 结果的索引号
* `embedding`: 生成的嵌入向量数组,包含多个浮点数
* `usage`: 使用统计信息,包含以下字段:
* `prompt`: 输入提示的 token 数量
* `completion`: 生成内容的 token 数量
* `total`: 总 token 数量
* `duration`: 生成耗时,包含秒和纳秒
## api/oai/embeds
**API 功能**:`api/oai/embeds` 和 `api/oai/v1/embeds` 是相同的 API,使用第三方模型为给定文本生成嵌入向量。
该 API 是调用**第三方的嵌入模型**来生成嵌入向量,使用 API 前需打开 `\assets\configs\Config.toml` 配置文件,将最底部五行配置代码**取消注释**:
```
[embed]
endpoint = "https://hf-mirror.com"
home = "assets/models/hf"
lib = "assets/ort/onnxruntime.dll"
name = { MultilingualE5Small = {} }
```
保存配置文件,重启 Ai00 即可自动下载第三方模型。终端的下载过程如图:
模型下载完成后,即可使用该 API 。
**API 地址**:(post)`http://localhost:65530/api/oai/embeds`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ----------- | ---- | ------- | --------------------------------- |
| input | 必选 | string | 需要生成嵌入向量的文本 |
| max\_tokens | 可选 | integer | 文本分块的最大 token 数,范围 1-510,默认值为 510 |
| prefix | 可选 | string | 每个文本块的前缀,默认值为 "query:" |
**参考的 API 请求主体**
```json
{
"input": "rwkv",
"max_tokens": 510,
"prefix": "query:"
}
```
**参考的 API 返回结果**
```json
{
"object": "embeds",
"model": "intfloat/multilingual-e5-small",
"data": [
{
"object": "embed",
"index": 0,
"chunks": [
{
"chunk": "第一个文本块",
"embed": [
[0.37109375, -0.015655518, -0.01977539, /* ... */]
]
},
{
"chunk": "第二个文本块",
"embed": [
[0.20153809, 0.15637207, 0.24768066, /* ... */]
]
}
]
}
]
}
```
返回结果说明:
* `object`: 返回对象类型,固定为 "embeds"
* `model`: 当前使用的嵌入模型
* `data`: 嵌入向量结果数组,包含以下字段:
* `object`: 嵌入对象类型,固定为 "embed"
* `index`: 结果的索引号
* `chunks`: 嵌入向量分块数组,包含以下字段:
* `chunk`: 文本块内容
* `embed`: 生成的嵌入向量数组,包含多个浮点数
## api/oai/models
**API 功能**:`api/oai/models` 和 `api/oai/v1/models` 是相同的 API,用于获取当前加载的模型信息。
**API 地址**:(get)`http://localhost:65530/api/oai/models`
**参考的 API 返回结果**
```json
{
"data": [
{
"object": "models",
"id": "RWKV-x060-World-1B6-v2.1-20240328-ctx4096"
}
]
}
```
返回结果说明:
* `data`: 模型结果数组,包含以下字段:
* `object`: 模型对象类型,固定为 "models"
* `id`: 模型的 id 名称
## admin/models/load
**API 功能**:该 API 用于重新加载模型、 LoRA 、初始状态等运行时环境。
**API 地址**:(post)`http://localhost:65530/admin/models/load`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ------------------ | ---- | ------- | ---------------------------------------------------- |
| adapter | 可选 | string | 指定使用的 GPU 和驱动后端,可使用 API `api/adapters` 查看,默认为 "Auto" |
| bnf | 可选 | object | BNF 选项配置,用于配置 BNF 解析相关参数,默认为空 |
| embed\_device | 可选 | string | 在 GPU 还是 CPU 上放模型的 Embed 矩阵,默认为 "CPU" |
| lora | 可选 | array | 是否加载 LoRA 文件,填 LoRA 文件的路径和 alpha 值等属性,默认为空 |
| max\_batch | 可选 | integer | 缓存在 GPU 上的最大批次,默认为 8 |
| model\_path | 必选 | string | 模型文件路径 |
| precision | 可选 | string | 中间张量的精度,默认为 "Fp16" |
| quant\_type | 可选 | string | 量化类型 ("Int8" or "NF4"),Int8 效果比 NF4 好,但需要更多显存 |
| quant | 可选 | integer | 量化层数,调高会提升效率,但可能损失精度使模型效果变差,默认为 0 |
| state | 可选 | array | state 文件列表,每个元素包含 path 路径属性,默认为空 |
| token\_chunk\_size | 可选 | integer | 一次并行处理的最大 token 数,默认为 128 |
| tokenizer\_path | 必选 | string | 指定使用的 RWKV 分词器路径 |
**参考的 API 请求主体**
```json copy
{
"model_path": "RWKV-x060-ChnNovel-3B-20240807-ctx4096.st",
"adapter": {
"Manual": 0
},
"quant_type": "NF4",
"quant": 31,
"token_chunk_size": 128,
"max_batch": 16,
"tokenizer_path": "assets/tokenizer/rwkv_vocab_v20230424.json",
"embed_device": "Cpu",
"precision": "Fp16",
"lora": [
{
"alpha": 192,
"path": "test-x606-3B.lora"
}
],
"state": [
{
"path": "rwkv-x060-chn_single_round_qa-3B-20240516-ctx2048.state"
}
]
}
```
返回结果说明:
* 该 API 没有直接的返回值
* 响应状态码 200 表示请求成功
* 如果加载失败,会返回相应的错误状态码和错误信息
* 加载状态和进度可在部署 Ai00 服务的终端查看
## admin/models/save
**API 功能**:该 API 能够以 `.prefab` 格式导出**带有量化方法和量化层数两项配置**的 RWKV 模型。
`.prefab` 预制件通常指游戏开发中使用的一种资源格式,允许开发者创建、保存和复用游戏对象(GameObject)及其**组件的配置**。
Ai00 支持导入和导出 `.prefab` 格式的 RWKV 模型,通过预量化 RWKV 模型节省加载时间。
**API 地址**:(post)`http://localhost:65530/admin/models/save`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ---- | ---- | ------ | ----------------------- |
| path | 必选 | string | 导出 `.prefab` RWKV 模型的路径 |
**参考的 API 请求主体**
```json copy
{
"path": "/assets/models/temp.st"
}
```
返回结果说明:
* 该 API 没有直接的返回值\`
* 响应状态码 200 表示请求成功
* 导出进度和结果可在部署服务的终端查看
* 导出成功后会在指定路径生成 `.prefab` 格式的模型文件
## admin/models/state/load
**API 功能**:挂载指定路径的 state 文件。
作为 RNN 模型,RWKV 模型拥有固定大小的隐藏状态(State)。可通过加载 State 文件初始化 RWKV 模型的隐藏状态,以强化 RWKV 模型在特定任务的表现(类似于模型增强插件)。
**API 地址**:(post)`http://localhost:65530/admin/models/state/load`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ------- | ---- | -------------- | ------------------------------- |
| default | 可选 | boolean | 是否立即挂载此 state |
| id | 可选 | string | state 文件的 UUID,不指定则随机分配 |
| name | 可选 | string \| null | 为 state 文件命名 |
| path | 必选 | string | `assets\models`目录下的某个 state 文件名 |
**参考的 API 请求主体**
```json copy
{
"default": false,
"id": "00000000-0000-0000-0000-000000000000",
"name": "中文单轮对话",
"path": "rwkv-x060-chn_single_round_qa-1B6-20240516-ctx2048.state"
}
```
返回结果说明:
* 该 API 没有直接的返回值
* 响应状态码 200 表示请求成功
* 如果指定了 default 为 true,该 state 会立即生效
* state 文件的加载状态可在部署 Ai00 服务的终端查看
## admin/models/unload
**API 功能**:关闭当前已加载的模型和 Ai00 服务。
**API 地址**:(get)`http://localhost:65530/admin/models/unload`
返回结果说明:
* 该 API 没有直接的返回值
* 响应状态码 200 表示请求成功
* 卸载成功后,需要重新加载模型才能继续使用服务
* 卸载状态可在部署 Ai00 服务的终端查看
## api/adapters
**API 功能**:返回当前设备所有的 GPU 和驱动,以用于加载模型时指定 GPU。
**API 地址**:(get)`http://localhost:65530/api/adapters`
**参考的 API 返回结果**
```json copy
[
"AMD Radeon 780M Graphics (Vulkan)",
"AMD Radeon 780M Graphics (Vulkan)",
"AMD Radeon 780M Graphics (Dx12)",
"AMD Radeon 780M Graphics (Dx12)",
"AMD Radeon 780M Graphics (Gl)"
]
```
返回结果说明:
* 返回一个字符串数组,每个元素代表一个可用的 GPU 设备和其驱动类型
* 数组中的每个元素格式为:`"GPU名称 (驱动类型)"`,如 `"AMD Radeon 780M Graphics (Vulkan)"`
* 数组的索引(从 0 开始),可用于 `admin/models/load` API 中的 `adapter` 参数,例如 `"adapter": {"Manual": 0}` 指定使用第一个 GPU
截至 0.5.9 版本,Ai00 仅支持 Vulkan 驱动,不再支持 OpenGL 和 DirectX 驱动。
## api/auth/exchange
**API 功能**:切换带管理员权限的账号,`app_id` 和 `app_secret` 需提前在 `config.toml` 中配置。
**API 地址**:(post)`http://localhost:65530/api/auth/exchange`
**参数列表**:
| 参数名称 | 是否可选 | 类型 | 参数解释 |
| ----------- | ---- | ------ | --------------------------------- |
| app\_id | 必选 | string | 在 `config.toml` 中配置的 `app_id` |
| app\_secret | 必选 | string | 在 `config.toml` 中配置的 `app_secret` |
**参考的 API 请求主体**
```json copy
{
"app_id": "admin",
"app_secret": "ai00_is_good"
}
```
**参考的 API 返回结果**
```json copy
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzaWQiOiJhZG1pbiIsImV4cCI6MTczMjM1MjMwMH0.06fDScO-9GxF6rlq1v7MaC608uKg8qNN-TWZ8HvyZDk",
"code": 200,
"message": "SUCCESS"
}
```
返回结果说明:
* `token`: 生成的 JWT 认证令牌,用于后续 API 请求的身份验证
* `code`: 状态码,200 表示成功
* `message`: 状态信息,"SUCCESS" 表示成功
## Ai00 的采样方法
Ai00 默认使用 Nucleus (又名 top\_k )采样方法,这也是 RWKV 模型的默认解码方式。但除了 Nucleus, Ai00 也额外支持 Mirostat 和 Typical 两种采样方式。
不同的采样方法有不同的解码参数,调整模型的各类解码参数,将会影响模型生成的内容风格、内容质量等指标。
以下是 Ai00 三种采样方式的简要描述,和对应的模型解码参数:
### Nucleus 采样
Nucleus (又名 top\_k )采样方法是通过累积概率(top\_p)来选择模型生成的词汇,确保文本多样化且不偏离主题。
Nucleus 采样支持如下解码参数:
| 参数名称 | 类型 | 参数解释 |
| ------------------ | ------- | -------------------------------------------------- |
| frequency\_penalty | number | 存在惩罚,惩罚**已经出现过的**,减少它们再次出现的机会 |
| penalty | integer | 惩罚半衰期,模型在输出足够的字数后调整 penalty\_decay,**不建议修改** |
| penalty\_decay | number | 频率的衰减参数,在每一步生成中逐步减小惩罚值,范围 \[0.99, 0.999],**不建议修改** |
| presence\_penalty | number | 频率惩罚,惩罚**出现频率较高的词**,减少它们频繁出现的机会 |
| temperature | number | 采样温度(可以理解为随机性),数值越大随机性越强、更具创造力,也可能导致上下文不连贯 |
| top\_k | integer | 模型生成内容时的候选词数量(类似于输入法的候选词数量) |
| top\_p | number | 模型生成的累积概率,这个值越大生成的内容更多样化,但也更容易偏离对话主题甚至胡言乱语 |
在 Ai00 的 API 请求中,标准的 Nucleus 采样格式如下:
```json copy
{
"sampler_override": {
"frequency_penalty": 0.3,
"penalty": 400,
"penalty_decay": 0.99654026,
"presence_penalty": 0.3,
"temperature": 1,
"top_k": 128,
"top_p": 0.5,
"type": "Nucleus"
}
}
```
### Mirostat 采样
Mirostat 采样通过动态调整熵(随机性)来平衡创造性和连贯性。
| 参数名称 | 类型 | 参数解释 |
| ---- | ------ | ------------------------------------------------------- |
| Rate | number | 模型调整随机性的速度,较高的 rate 值会让模型更快适应新的上下文,但可能导致回答的主题不连贯 |
| tau | number | 模型生成文本时的目标随机性,较高的 tau 值会导致模型生成的文本更有创造性和多样性,但可能导致内容不太连贯。 |
在 Ai00 的 API 请求中,标准的 Mirostat 采样格式如下:
```json copy
{
"sampler_override": {
"Rate": 0.09,
"tau": 0.5,
"type": "Mirostat"
}
}
```
### Typical 采样
Typical 采样通过选择上下文中最有代表性的词,以避免极端概率导致的内容脱轨。
| 参数名称 | 类型 | 参数解释 |
| ------------------ | ------- | ------------------------------------------------------- |
| frequency\_penalty | number | 存在惩罚,惩罚**已经出现过的词**,减少它们再次出现的机会 |
| penalty | integer | 惩罚半衰期,模型在输出足够的字数后调整 penalty\_decay,**不建议修改** |
| penalty\_decay | number | 频率的衰减参数,在每一步生成中逐步减小惩罚值,范围 \[0.99, 0.999],**不建议修改** |
| presence\_penalty | number | 频率惩罚,惩罚**出现频率较高的词**,减少它们频繁出现的机会 |
| temperature | number | 采样温度(可以理解为随机性),数值越大随机性越强、更具创造力,也可能导致上下文不连贯 |
| top\_k | integer | 模型生成内容时的候选词数量(类似于输入法的候选词数量) |
| tau | number | 模型生成文本时的目标随机性,较高的 tau 值会导致模型生成的文本更有创造性和多样性,但可能导致内容不太连贯。 |
在 Ai00 的 API 请求中,标准的 Typical 采样格式如下:
```json copy
{
"sampler_override": {
"frequency_penalty": 0.3,
"penalty": 400,
"penalty_decay": 0.99654026,
"presence_penalty": 0.3,
"temperature": 1,
"top_k": 128,
"tau": 5,
"type": "Typical"
}
}
```
# 进阶功能
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 实现请参阅:[续写模式的提示词示例](../../../docs/RWKV-Prompts/Completion-Prompts)
**写论文**
从给定的论文标题生成论文提纲,再根据提纲生成论文内容。
# 轻松使用
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/JL-er/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 微调所需显存会发生改变。
## 收集训练数据
你需要使用收集更适合训练 RWKV 的 binidx 数据,具体方法可参考[准备微调数据集](../FT-Dataset)。
## 配置训练环境
要训练 RWKV 模型,首先要配置 conda 等训练环境。具体过程请参考[RWKV 微调环境配置](../FT-Environment)板块。
## 克隆仓库并安装依赖
在 Linux 或 WSL 中,使用 git 命令克隆 RWKV-PEFT 仓库:
```bash copy
git clone https://github.com/JL-er/RWKV-PEFT.git
# 如果 GitHub 无法链接,请使用以下国内仓库:
git clone https://gitee.com/rwkv-vibe/RWKV-PEFT.git
```
克隆完成后,使用 `cd RWKV-PEFT` 命令进入 RWKV-PEFT 目录。并运行以下命令,安装项目所需依赖:
```bash copy
pip install -r requirements.txt
```
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `RWKV-PEFT/scripts` 目录下的 `run_lora.sh` 文件,可以修改训练参数,进而控制微调的训练过程和训练效果:
以下是一次 LoRA 微调的调参过程:
### 调整路径参数
`run_lora.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和训练得到的 LoRA 文件输出路径
* data\_file:训练数据集的路径,注意路径中不需要带 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` | 每隔多少个训练轮次保存一次 LoRA 文件,注意存储空间是否充足 |
| `epoch_steps=1000` | 每个训练轮次的步数,增加会拉长单个 epoch 的训练时间 |
| `ctx_len=512` | 微调模型的上下文长度,建议根据语料长度修改 |
| `--my_testing "x070"` | 训练的 RWKV 模型版本,v7 选 `x070`,v6 选 `x060` ,v5 选 `x052`(已淘汰,不推荐) |
### 调整 LoRA 相关参数
`peft_config` 包含 LoRA 微调的参数,效果参考下表:
| 参数 | 描述 |
| -------------------- | ---------------------------------------------------------- |
| "r":32 | LoRA 微调的 rank 参数,值越大效果越好,但训练速度越慢/显存需求越高,一般训练使用 32 或者 64 即可 |
| "lora\_alpha":32 | LoRA 微调的 alpha 参数(缩放因子),建议保持 lora\_r 的两倍 |
| "lora\_dropout":0.01 | LoRA 微调的丢弃率,建议使用 0.01 |
### 调整其他训练参数
下面列出了脚本中其他可修改的训练参数,及其修改的效果。
| 参数 | 描述 |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `--vocab_size 65536` | 词表大小,默认为 65536,设置为 0 表示模型自动确定词汇表大小 |
| `--data_type binidx` | 训练语料的文件格式,支持:`utf-8`, `utf-16le`, `numpy`, `binidx`, `dummy`, `uint16`, `sft`, `jsonl`,建议使用 `jsonl` 或 `binidx` 格式 |
| `--epoch_count 5` | 总训练轮次 |
| `--lr_init 2e-5` | 初始学习率,DiSHA 建议 `2e-5` ,最大不超过 `1e-4` |
| `--lr_final 2e-5` | 最终学习率,建议和初始学习率保持一致 |
| `--accelerator gpu` | 使用的加速器类型,目前主要支持 `gpu`,`cpu` 基本不支持训练 |
| `--devices 1` | 显卡数量,单显卡填 `1`,多卡按实际数量填写 |
| `--precision bf16` | 训练精度,建议保持默认值 `bf16`,支持:`fp32`、`tf32`、`fp16`、`bf16` |
| `--strategy deepspeed_stage_1` | lightning 训练策略参数,微调推荐使用 `deepspeed_stage_1`,设备显存太小可将 `1` 改成 `2` |
| `--grad_cp 1` | 梯度累积步数,`0` 训练更快但需更多显存,`1` 训练较慢但节省显存 |
| `--peft lora` | 微调训练类型,LoRA 微调填 `lora` 即可 |
| `--op` | 选择算子,支持 `cuda`、`fla`、`triton`,默认设置为 `cuda` |
| `--wandb RWKV-PEFT-DiSHA` | **可选**,是否使用 wandb 可视化记录训练日志,需提前配置 [wandb](https://wandb.ai/) 账号 |
| `--lr_schedule wsd` | **可选**,学习率调度方法,默认使用 `cos_decay`,支持:`cos_decay`, `wsd` |
{/* 2025年11月更新后移除了部分训练参数,不支持量化训练
| `--warmup_steps 0` | 预热步骤数,默认 `0`,加载模型微调时可尝试改成 `50` |
| `--beta1 0.9` | Adam 优化器的 beta1 参数,保持默认值 |
| `--beta2 0.99` | Adam 优化器的 beta2 参数,保持默认值 |
| `--adam_eps 1e-8` | Adam 优化器的 epsilon 参数,保持默认值 |
| `--epoch_begin 0` | 初始训练轮次,即从第 N 个训练轮次开始加载 |
| `--quant int8/nf4` | **可选**,RWKV 默认使用 `bf16` 训练精度,但也支持 `int8` 和 `nf4` 两种量化训练,推荐使用精度损失较小的 `int8` |
| `--dataload pad` | 数据加载选项,`pad` 支持 `bsz>1`,`only` 则限制 `bsz=1` |
| `--loss_mask pad` | 在数据末尾进行 padding,可改成 `qa` 以对 QA 任务中的问题部分进行屏蔽,防止模型根据问题来记忆答案,从而增强模型的泛化能力。 |*/}
参数调整完成后,请记得保存 `run_lora.sh` 文件。
### 附录:run\_lora.sh 配置参考
```bash copy filename="run_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
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/triton (选择不同的算子,不加此参数则默认使用 cuda)
# --wandb RWKV-PEFT-DiSHA (是否使用 wandb 监控训练过程)
# --lr_schedule wsd 是否启用余弦退火优化学习率,默认的 lr_schedule = cos_decay
```
## 开始训练
在 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)。
详细用法请参考 [RWKV Runner 教程](../../../intermediate/RWKV-Runner/Introduction) 和 [Ai00 教程](../../../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/JL-er/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 微调所需显存会发生改变。
## 收集训练数据
你需要使用收集更适合训练 RWKV 的 binidx 数据,具体方法可参考[准备微调数据集](../FT-Dataset)。
## 配置训练环境
请参考[RWKV 微调环境配置](../FT-Environment)板块,配置 Conda 等训练环境。
## 克隆仓库并安装依赖
在 Linux 或 WSL 中,使用 git 命令克隆 RWKV-PEFT 仓库:
```bash copy
git clone https://github.com/JL-er/RWKV-PEFT.git
# 如果 GitHub 无法链接,请使用以下国内仓库:
git clone https://gitee.com/rwkv-vibe/RWKV-PEFT.git
```
克隆完成后,使用 `cd RWKV-PEFT` 命令进入 RWKV-PEFT 目录。并运行以下命令,安装项目所需依赖:
```bash copy
pip install -r requirements.txt
```
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `RWKV-PEFT/scripts` 目录下的 `miss.sh` 文件,可以修改训练参数,进而控制微调的训练过程和训练效果:
以下是一次 MiSS 微调的调参过程:
### 调整路径参数
`miss.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和训练得到的 MiSS 文件输出路径
* data\_file:训练数据集的路径,注意路径中不需要带 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":64}'` | MiSS 微调的 rank 参数,值越大效果越好,但训练速度越慢/显存需求越高,一般训练使用 32 或者 64 即可 |
### 调整其他训练参数
下面列出了脚本中其他可修改的训练参数,及其修改的效果。
| 参数 | 描述 |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `--vocab_size 65536` | 词表大小,默认为 65536,设置为 0 表示模型自动确定词汇表大小 |
| `--data_type binidx` | 训练语料的文件格式,支持:`utf-8`, `utf-16le`, `numpy`, `binidx`, `dummy`, `uint16`, `sft`, `jsonl`,建议使用 `jsonl` 或 `binidx` 格式 |
| `--epoch_count 5` | 总训练轮次 |
| `--lr_init 2e-5` | 初始学习率,MiSS 建议 `2e-5` ,最大不超过 `1e-4` |
| `--lr_final 2e-5` | 最终学习率,建议和初始学习率保持一致 |
| `--accelerator gpu` | 使用的加速器类型,目前主要支持 `gpu`,`cpu` 基本不支持训练 |
| `--devices 1` | 显卡数量,单显卡填 `1`,多卡按实际数量填写 |
| `--precision bf16` | 训练精度,建议保持默认值 `bf16`,支持:`fp32`、`tf32`、`fp16`、`bf16` |
| `--strategy deepspeed_stage_1` | lightning 训练策略参数,微调推荐使用 `deepspeed_stage_1`,设备显存太小可将 `1` 改成 `2` |
| `--grad_cp 1` | 梯度累积步数,`0` 训练更快但需更多显存,`1` 训练较慢但节省显存 |
| `--my_testing "x070"` | 训练的 RWKV 模型版本,v7 选 `x070`,v6 选 `x060` ,v5 选 `x052`(已淘汰,不推荐) |
| `--peft miss` | 微调训练类型,MiSS 微调填 `miss` 即可 |
| `--op` | 选择算子,支持 `cuda`、`fla`、`triton`,默认设置为 `cuda` |
| `--wandb RWKV-PEFT-MiSS` | **可选**,是否使用 wandb 可视化记录训练日志,需提前配置 [wandb](https://wandb.ai/) 账号 |
| `--lr_schedule wsd` | **可选**,学习率调度方法,默认使用 `cos_decay`,支持:`cos_decay`, `wsd` |
{/* 2025年11月更新后移除了部分训练参数,不支持量化训练
| `--warmup_steps 0` | 预热步骤数,默认 `0`,加载模型微调时可尝试改成 `50` |
| `--beta1 0.9` | Adam 优化器的 beta1 参数,保持默认值 |
| `--beta2 0.99` | Adam 优化器的 beta2 参数,保持默认值 |
| `--adam_eps 1e-8` | Adam 优化器的 epsilon 参数,保持默认值 |
| `--epoch_begin 0` | 初始训练轮次,即从第 N 个训练轮次开始加载 |
| `--quant int8/nf4` | **可选**,RWKV 默认使用 `bf16` 训练精度,但也支持 `int8` 和 `nf4` 两种量化训练,推荐使用精度损失较小的 `int8` |
| `--dataload pad` | 数据加载选项,`pad` 支持 `bsz>1`,`only` 则限制 `bsz=1` |
| `--loss_mask pad` | 在数据末尾进行 padding,可改成 `qa` 以对 QA 任务中的问题部分进行屏蔽,防止模型根据问题来记忆答案,从而增强模型的泛化能力。 |*/}
### 附录: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":64}'
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/triton (选择不同的算子,不加此参数则默认使用 cuda)
# --wandb RWKV-PEFT-MiSS (是否使用 wandb 监控训练过程)
# --lr_schedule wsd 是否启用余弦退火优化学习率,默认的 lr_schedule = cos_decay
```
参数调整完成后,请记得保存 `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)。
# PiSSA 微调教程
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'
**PiSSA 微调是什么?**
[PiSSA 微调](https://arxiv.org/abs/2404.02948)是一种参数高效微调方法(PEFT,Parameter-Efficient Fine-Tuning),PiSSA 微调通过选择性更新部分参数(例如 LoRA 或 Adapter 层)来保持模型性能,同时避免对整个模型进行全面更新,从而提升训练效率。
PiSSA 与 LoRA 微调的架构一致,只是初始化 Adapter 的方式不同:LoRA 用高斯噪声以及 0 初始化适配器参数、冻结核心模型参数,PiSSA 则是直接对 W 的低秩主成分 A、B 进行微调,冻结次要的修正项。
因此,PiSSA 比 LoRA 收敛更快、效果更好。
***
本文的 PiSSA 微调方法来自 RWKV 社区的高效参数微调项目 [RWKV-PEFT ](https://github.com/JL-er/RWKV-PEFT)。
在开始 PiSSA 微调之前,请确保你拥有一个 Linux 工作区,以及支持 CUDA 的 NVIDIA 显卡。
## 视频教程
高画质视频请[跳转到 B 站](https://www.bilibili.com/video/BV1KgExz7E4i/)观看。
## PiSSA 显存参考
RWKV PiSSA 微调的显存(GPU VRAM)需求可参考下表:
| 模型参数 | bf16 | int8 | nf4 |
| ---------- | --------- | --------- | --------- |
| RWKV7-0.1B | 2.6GB GPU | 2.4GB GPU | 2.5GB GPU |
| RWKV7-0.4B | 3.4GB GPU | 3GB 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
* pissa\_r=32
* svd\_niter=4
随着训练参数的变更,RWKV PiSSA 微调所需显存会发生改变。
## 收集训练数据
请参考[准备微调数据集](../FT-Dataset),收集更适合训练 RWKV 的 binidx 数据。
## 配置训练环境
请参考[RWKV 微调环境配置](../FT-Environment)板块配置 Conda 等训练环境。
## 克隆仓库并安装依赖
在 Linux 或 WSL 中,使用 git 命令克隆 RWKV-PEFT 仓库:
```bash copy
git clone https://github.com/JL-er/RWKV-PEFT.git
```
如果 GitHub 无法链接,请使用以下国内仓库:
```bash copy
git clone https://gitee.com/rwkv-vibe/RWKV-PEFT.git
```
克隆完成后,使用 `cd RWKV-PEFT` 命令进入 RWKV-PEFT 目录。并运行以下命令,安装项目所需依赖:
```bash copy
pip install -r requirements.txt
```
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `RWKV-PEFT/scripts` 目录下的 `run_pissa.sh` 文件,可以修改训练参数,进而控制微调的训练过程和训练效果:
以下是一次 PiSSA 微调的调参过程:
### 调整路径参数
`run_pissa.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和训练得到的 PiSSA 文件输出路径
* data\_file:训练数据集的路径,注意路径中不需要带 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` 和 `epoch_steps` 的乘积;
`--my_testing` 必须对应微调模型的版本。
| 参数 | 描述 |
| --------------------- | ----------------------------------------------------------- |
| `micro_bsz=1` | 微批次大小,根据显存大小调整,微调时从 1 开始逐渐增大 |
| `epoch_save=5` | 每隔多少个训练轮次保存一次 PiSSA 文件,注意存储空间是否充足 |
| `epoch_steps=1000` | 每个训练轮次的步数,增加会延长单个 epoch 的训练时间 |
| `ctx_len=512` | 微调模型的上下文长度,建议根据语料长度修改 |
| `--my_testing "x070"` | 训练的 RWKV 模型版本,v7 选 `x070`,v6 选 `x060` ,v5 选 `x052`(已淘汰,不推荐) |
### 调整 PiSSA 相关参数
`pissa_config` 包含 PiSSA 微调的参数,效果参考下表:
| 参数 | 描述 |
| ---------------- | ----------------------------------------------------------- |
| "pissa\_load":"" | PiSSA 文件路径,代表从哪个 PiSSA checkpoint 开始微调。若从头训练 PiSSA 可不填 |
| "pissa\_init":"" | PiSSA 初始化的权重路径,若从头训练 PiSSA 可不填 |
| "pissa\_r":32 | PiSSA 微调的 rank 参数,值越大效果越好,但训练速度越慢/显存需求越高,一般训练使用 32 或者 64 即可 |
| "svd\_niter":4 | PiSSA 微调的奇异值分解迭代次数,值越大效果越好,但训练速度越慢/显存需求越高,一般训练使用 4 即可 |
### 调整其他训练参数
下面列出了脚本中其他可修改的训练参数,及其修改的效果。
| 参数 | 描述 |
| ------------------------------ | ---------------------------------------------------------------------------------- |
| `--data_type binidx` | 训练语料的文件格式,支持:"utf-8", "utf-16le", "numpy", "binidx", "dummy", "wds\_img", "uint16" |
| `--vocab_size 65536` | 词表大小,默认为 `65536`,设置为 `0` 表示模型自动确定词汇表大小 |
| `--epoch_count 10` | 总训练轮次 |
| `--epoch_begin 0` | 初始训练轮次,即从第 N 个训练轮次开始加载 |
| `--pre_ffn 0` | 用 ffn 替换第一个 att 层,通常保持默认值 0 |
| `--head_qk 0` | 通常保持默认值 0,即关闭状态 |
| `--lr_init 2e-5` | 初始学习率,PiSSA 建议 `2e-5` ,最大不超过 `1e-4` |
| `--lr_final 2e-5` | 最终学习率,建议和初始学习率保持一致 |
| `--warmup_steps 0` | 预热步骤数,默认 `0`,加载模型时可尝试改成 `50` |
| `--beta1 0.9` | Adam 优化器的 beta1 参数,保持默认值 |
| `--beta2 0.99` | Adam 优化器的 beta2 参数,保持默认值 |
| `--adam_eps 1e-8` | Adam 优化器的 epsilon 参数,保持默认值 |
| `--accelerator gpu` | 使用的加速器类型,目前主要支持 `gpu`,`cpu` 基本不支持训练 |
| `--devices 1` | 显卡数量,单显卡填 `1`,多卡按实际数量填写 |
| `--precision bf16` | 训练精度,建议保持默认值 `bf16`,支持:`fp32`、`tf32`、`fp16`、`bf16` |
| `--strategy deepspeed_stage_1` | lightning 训练策略参数,微调推荐使用 `deepspeed_stage_1`,设备显存太小可将 `1` 改成 `2` |
| `--grad_cp 1` | 梯度累积步数,`0` 训练更快但需更多显存,`1` 训练较慢但节省显存 |
| `--dataload pad` | 数据加载选项,`pad` 支持 `bsz>1`,`only` 则限制 `bsz=1` |
| `--loss_mask pad` | 在数据末尾进行 padding,可改成 `qa` 以对 QA 任务中的问题部分进行屏蔽,防止模型根据问题来记忆答案,从而增强模型的泛化能力。 |
| `--op` | 选择算子,支持 `cuda`、`fla`、`triton`,默认设置为 `cuda` |
| `--peft pissa` | 训练类型,PiSSA 微调填 `pissa`,支持:`lora`、`state`、`pissa`、`bone` |
| `--quant int8/nf4` | RWKV 默认使用 `bf16` 训练精度,但支持 `int8` 和 `nf4` 两种量化训练类型,推荐使用精度损失较小的 `int8` |
| `--wandb RWKV-PEFT-Pissa` | 是否使用 wandb 可视化记录训练日志,需提前配置 [wandb](https://wandb.ai/) 账号 |
参数调整完成后,请记得保存 `run_pissa.sh` 文件。
### 附录:run\_pissa.sh 配置参考
```bash copy filename="run_pissa.sh"
load_model='/home/rwkv/RWKV-PEFT/model/RWKV-x070-World-0.4B-v2.9-20250107-ctx4096.pth'
proj_dir='/home/rwkv/RWKV-PEFT/output-manjuan/pissa'
data_file='/home/rwkv/RWKV-PEFT/data/test-1'
n_layer=24
n_embd=1024
micro_bsz=8
epoch_save=1
epoch_steps=1000
ctx_len=512
pissa_config='{"pissa_load":"","pissa_init":"","pissa_r":32,"svd_niter":4}'
python train.py --load_model $load_model \
--proj_dir $proj_dir --data_file $data_file \
--vocab_size 65536 \
--n_layer $n_layer --n_embd $n_embd \
--data_type binidx --dataload pad --loss_mask pad \
--ctx_len $ctx_len --micro_bsz $micro_bsz \
--epoch_steps $epoch_steps --epoch_count 1 --epoch_begin 0 --epoch_save $epoch_save \
--lr_init 2e-5 --lr_final 2e-5 --warmup_steps 0 --beta1 0.9 --beta2 0.99 --adam_eps 1e-8 \
--accelerator gpu --devices 1 --precision bf16 --strategy deepspeed_stage_1 --grad_cp 1 \
--my_testing "x070" \
--peft pissa --pissa_config $pissa_config \
# 以下是可选项
# --op cuda/fla/triton (选择不同的算子,不加此参数则默认使用 cuda)
# --wandb RWKV-PEFT-PiSSA (是否使用 wandb 监控训练过程)
# --quant int8/nf4 (是否量化训练)
# --lr_schedule wsd 是否启用余弦退火优化学习率,默认的 lr_schedule = cos_decay
```
## 开始训练
在 RWKV-PEFT 目录,运行 `sh scripts/run_pissa.sh` 命令,开启 PiSSA 微调 。
正常开始训练后,应当是如下画面:
训练完毕后,应当可以在输出文件夹中找到训练好的 PiSSA 权重文件(`.pth` 格式)和训练日志(`.txt` 文件):
## 如何使用 PiSSA 权重文件
得到 PiSSA 权重文件后,你需要将它合并到基底 RWKV 模型中,获得一个完整的 PiSSA 微调模型。
合并过程可以使用 `scripts` 目录的 `merge_pissa.sh` 脚本文件来完成。
### 修改合并参数
使用文本编辑器打开 `scripts` 目录下的 `merge_pissa.sh` 脚本文件,并修改脚本中的合并参数:
| 参数 | 描述 |
| ----------------- | ------------------------------------------------------------- |
| base\_model | PiSSA 微调的基底 RWKV 模型路径,参考 run\_pissa.sh 的 `load_model` 路径 |
| pissa\_checkpoint | 训练得到的 PiSSA 文件路径,通常存放在 run\_pissa.sh 指定的 `proj_dir` 目录中 |
| pissa\_init | 填写 PiSSA 初始化权重文件路径(`init_pissa.pth`),通常和训练得到的 PiSSA 文件保存在同一目录 |
| output | 合并后的 PiSSA 模型输出路径(包含模型命名 `xxx.pth`) |
| TYPE='pissa' | 合并类型:PiSSA,无需修改 |
| --quant | 跟随训练时的量化参数,"nf4"或者"int8"。如果训练时未使用量化,则无需添加此参数 |
合并参数参考:
```bash copy filename="merge_pissa.sh"
base_model='/home/rwkv/models/basemodel/3b.pth'
pissa_init='/home/rwkv/RWKV-PEFT/output_pissa/init_pissa.pth'
pissa_checkpoint='/home/rwkv/RWKV-PEFT/output_pissa/rwkv-2.pth'
output='/home/rwkv/RWKV-PEFT/output_pissa/pissa-test-3b.pth'
TYPE='pissa'
python merge/merge.py --base_model $base_model \
--lora_init $pissa_init \
--lora_checkpoint $pissa_checkpoint \
--output $output \
--type $TYPE
# --quant int8/nf4 (和训练时的量化参数同步)
```
### 合并 PiSSA 权重文件
修改完成后保存文件,在 `RWKV-PEFT` 主目录运行 `sh scripts/merge_pissa.sh` 命令,将 PiSSA 权重文件和 RWKV 模型合并成完整的 PiSSA 微调模型:
合并结束后,可以在输出路径中找到合并后的 PiSSA 微调模型(`.pth` 格式):
合并后的 PiSSA 微调模型可以在 RWKV Runner 或者 Ai00 中正常使用。
详细用法请参考 [RWKV Runner 教程](../../../intermediate/RWKV-Runner/Introduction) 和 [Ai00 教程](../../../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 是什么?**
RWKV 是纯 RNN,因此可以做 transformer 难以做到的事情。例如,作为 RNN 有固定大小的 state,所以,微调 RWKV 的初始 state,就相当于最彻底的 prompt tuning,甚至可以用于 alignment,因为迁移能力很强。
本文的 State tuning 方法来自 RWKV 社区微调项目 [RWKV-PEFT ](https://github.com/JL-er/RWKV-PEFT)。
开始之前,请确保你拥有一个 Linux 工作区,以及支持 CUDA 的 NVIDIA 显卡。
## State tuning 微调案例
## 视频教程
高画质视频请[跳转到 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/JL-er/RWKV-PEFT.git
# 如果 GitHub 无法链接,请使用以下国内仓库:
git clone https://gitee.com/rwkv-vibe/RWKV-PEFT.git
```
克隆完成后,使用 `cd RWKV-PEFT` 命令进入 `RWKV-PEFT` 目录。并运行以下命令,安装项目所需依赖:
```bash copy
pip install -r requirements.txt
```
## 修改训练参数
使用任意文本编辑器(如 vscode)打开 `RWKV-PEFT/scripts` 目录的 `state tuning.sh` 文件,修改训练参数,进而控制微调的训练过程和训练效果:
以下是一次 state tuning 调参过程:
### 调整路径参数
`state tuning.sh` 文件前三行是文件路径参数:
* load\_model: 基底 RWKV 模型的路径
* proj\_dir:训练日志和训练得到的 state 文件输出路径
* data\_file:训练数据集的路径,注意路径中不需要带 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 时,建议 `--lr_init 1e-3` 、`--lr_final 1e-5` ,以及尽可能短的 ctxlen 。
| 参数 | 描述 |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `--data_type binidx` | 训练语料的文件格式,支持:`utf-8`, `utf-16le`, `numpy`, `binidx`, `dummy`, `uint16`, `sft`, `jsonl`,建议使用 `jsonl` 或 `binidx` 格式 |
| `--vocab_size 65536` | 词表大小,默认为 65536,设置为 0 表示模型自动确定词汇表大小 |
| `--epoch_count 5` | 总训练轮次,可根据效果调整 |
| `--pre_ffn 0` | 用 ffn 替换第一个 att 层,有时可能有益 |
| `--lr_init 1e-3` | 初始学习率,state tuning 建议为 `1e-3`,其他微调建议不超过 `1e-4` |
| `--lr_final 1e-5` | 最终学习率,state tuning 建议为 `1e-5`,其他微调建议不超过 `1e-4` |
| `--accelerator gpu` | 使用的加速器类型,目前主要支持 `gpu`, `cpu` 基本不支持训练 |
| `--devices 1` | 单显卡填 `1`,多卡按实际数量填写 |
| `--precision bf16` | 训练精度,默认为 `bf16`,支持:`fp32`、`tf32`、`fp16`、`bf16` |
| `--strategy deepspeed_stage_1` | lightning 训练策略参数,微调推荐使用 `deepspeed_stage_1` |
| `--grad_cp 1` | 梯度累积步数,`0` 训练更快但需更多显存,`1` 训练较慢但节省显存 |
| `--peft state` | 微调训练类型,state tuning 微调填 `state` 即可 |
| `--my_testing "x070"` | 训练的 RWKV 模型版本,v7 选 `x070`,v6 选 `x060` ,v5 选 `x052`(已淘汰,不推荐) |
| `--op fla` | 选择算子,state tuning 仅支持 fla 算子 |
| `--wandb PEFT-State-tuning` | **可选**,是否使用 wandb 可视化记录训练日志,需提前配置 [wandb](https://wandb.ai/) 账号 |
| `--lr_schedule wsd` | **可选**,学习率调度方法,默认使用 `cos_decay`,支持:`cos_decay`, `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-2 --lr_final 1e-4 \
--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 文件具备一定的通用角色扮演能力: