ChatRWKV|开源中文小说以及文章生成语言模型
ChatRWKV是一个开源项目,是对标ChatGPT的,基于RWKV (100% RNN) 语言模型的类似ChatGPT 的开源工具。ChatRWKV希望做大规模语言模型的Stable Diffusion,测试很一段时间确实很像ChatGPT,从使用方法和内容结果上都很相似,但是还有一些差异。该开源项目支持问话对答式交流,而且对中国网文写作方面的能利更好。
下载
如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键
后,在弹出的新窗口内输入CMD并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。
首先我们需要确认一个工作目录,用来存放ChatRWKV的相关文件。本站所选择的目录为D盘
的根目录下openai.wiki
文件夹,完整路径为:D:\openai.wiki
。
1.检测D盘是否在openai.wiki
,没有则创建该文件夹。
if not exist D:\openai.wiki mkdir D:\openai.wiki
2.强制切换工作路径为D盘的openai.wiki
文件夹。
cd /d D:\openai.wiki
3.拉取Github仓库文件夹,将下载至openai.wiki
文件夹。
git clone https://github.com/BlinkDL/ChatRWKV.git
注意:如果您无法完成第3步,执行后报错或者无法下载,可以下载该文件将其解压至D:\openai.wiki
即可。
环境安装
为不影响电脑中的现有环境,请一定要安装Conda,如果您不知道什么是Conda,或者未安装过Conda,请参考如下文章,安装部署Conda之后再继续以下步骤。
在CMD中执行下面的命令行,创建Conda虚拟环境至该项目的目录中,方便日后重装系统也能够正常使用,无需重新部署环境。
conda create -p D:\openai.wiki\ChatRWKV\MyENV
执行完成上面的命令之后,将会在CMD窗口中看到Proceed ([y]/n)?
提示,我们直接按下回车即可。
初始化Conda环境,避免后续可能报错。
conda init cmd.exe
激活已创建的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。
conda activate D:\openai.wiki\ChatRWKV\MyENV
为避免出现问题,我们再次强制切换至ChatRWKV的项目路径,确保一切可以正常安装。
cd /d D:\openai.wiki\ChatRWKV
安装Torch的相关依赖库,此步骤可能需要稍等几分钟才能够安装完成,取决于电脑性能。
pip install torch --extra-index-url https://download.pytorch.org/whl/cu117 --upgrade
执行如下命令行,安装numpy依赖。
pip install numpy tokenizers prompt_toolkit
模型相关
模型下载
类别 | 尺寸 | 推荐显存 | 方式 | 下载 |
---|---|---|---|---|
1.5B | 28.3GB | 3G 显存 | 123网盘 | 下载 |
1.5B | 28.3GB | 3G 显存 | Hugging Face | 下载 |
3B | 144GB | 6G 显存 | 123网盘 | 下载 |
3B | 144GB | 6G 显存 | Hugging Face | 下载 |
7B | 12G 显存 | Hugging Face | 下载 |
7B的模型实在太大了,本站的本地硬盘只剩500G都不够用,所以请自行请往Hugging Face下载吧。
模型安装
下载好模型之后,为了让您尽可能小程度的修改配置文件,您最好将模型移动至D:\openai.wiki\ChatRWKV\v2\fsx\BlinkDL\HF-MODEL
目录中。您的ChatRWKV
目录下应该只能找到v2,但是无法在v2目录下找到fsx文件夹,所以您需要手动创建相应文件夹,或者在CMD中执行如下命令行,自动创建相关目录。
if not exist D:\openai.wiki\ChatRWKV\v2\fsx\BlinkDL\HF-MODEL mkdir D:\openai.wiki\ChatRWKV\v2\fsx\BlinkDL\HF-MODEL
在您目录正确的情况下,将下载的模型移动至HF-MODEL
文件夹中即可,以1.5B模型为例,本站的目录结构如下,其它模型同理。
D:\openai.wiki\ChatRWKV\v2\fsx\BlinkDL\HF-MODEL\rwkv-4-pile-1b5 └─.gitattributes └─README.md └─RWKV-4-Pile-1B5-20220814-4526.pth └─RWKV-4-Pile-1B5-20220822-5809.pth └─RWKV-4-Pile-1B5-20220903-8040.pth └─RWKV-4-Pile-1B5-20220929-ctx4096.pth └─RWKV-4-Pile-1B5-Chn-testNovel-done-ctx2048-20230312.pth └─RWKV-4-Pile-1B5-EngChn-test4-20230115.pth └─RWKV-4-Pile-1B5-EngChn-testNovel-done-ctx2048-20230225.pth └─RWKV-4-Pile-1B5-Instruct-test1-20230124.pth └─RWKV-4-Pile-1B5-Instruct-test2-20230209.pth └─RWKV-4b-Pile-1B5-20230217-7954.pth
配置路径
打开D:\openai.wiki\ChatRWKV\v2\chat.py
文件,如果您希望在中文Chat中使用1B5模型,那么您修改位于第72行的文件,在'/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-1b5/RWKV-4-Pile-1B5-EngChn-testNovel-done-ctx2048-20230225'
中,只需要在最前面加一个.
即可。
原内容
args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-1b5/RWKV-4-Pile-1B5-EngChn-testNovel-done-ctx2048-20230225'
修改为
args.MODEL_NAME = './fsx/BlinkDL/HF-MODEL/rwkv-4-pile-1b5/RWKV-4-Pile-1B5-EngChn-testNovel-done-ctx2048-20230225'
if CHAT_LANG == 'English': args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-14B-v6-Eng-20230401-ctx4096' # try +i for "Alpaca instruct" # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v6-Eng-20230401-ctx4096' # try +i for "Alpaca instruct" # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-14b/RWKV-4-Pile-14B-20230313-ctx8192-test1050' # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-7b/RWKV-4-Pile-7B-20230109-ctx4096' # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-3b/RWKV-4-Pile-3B-20221110-ctx4096' # args.MODEL_NAME = 'cuda_fp16_RWKV-4-Pile-7B-20230109-ctx4096' # use convert_model.py for faster loading & saves CPU RAM elif CHAT_LANG == 'Chinese': # testNovel系列是小说模型,请只用 +gen 指令续写。Raven系列可以对话和问答,推荐用 +i 做长问答(只用了小中文语料,纯属娱乐) # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-7b/RWKV-4-Pile-7B-EngChn-testNovel-done-ctx2048-20230317' # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-raven/RWKV-4-Raven-7B-v6-ChnEng-20230401-ctx2048' # try +i for "Alpaca instruct" # args.MODEL_NAME = '/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-3b/RWKV-4-Pile-3B-EngChn-testNovel-done-ctx2048-20230226' args.MODEL_NAME = './fsx/BlinkDL/HF-MODEL/rwkv-4-pile-1b5/RWKV-4-Pile-1B5-EngChn-testNovel-done-ctx2048-20230225' # args.MODEL_NAME = '/fsx/BlinkDL/CODE/_PUBLIC_/RWKV-LM/RWKV-v4neo/7-run1z/rwkv-663'
如果您希望使用7B模型,只需要将7B模型前的符号#
删除,然后在模型路径前面加符号.
,还要在1B5模型前面加符号#
,注释掉该模型的加载。
请在修改时注意格式缩进等问题,Python代码对于缩进方式敏感,多或少空格等操作都可能导致无法正常加载模型。
注意:每次只可以加载一个模型,不要同时加载多个模型,所以不带符号#
的模型只可以有一个存在。
使用教程
聊天
ChatRWKV可以进行聊天对话,双方角色分别为Bob
和Alice
。但由于现在代码写得很简单,Alice的回答不能换行(目前看到\n\n
就认为对话结束)会被截断,以后将会修复该问题。
写作
可以用+i
指令让它完成长任务,此时回答可以换行,可以回答很长。例子:【+i 世界各国美食】【+i 开题报告】【+i 请写一首诗,《企鹅罢工》】。注意++
是重试,+++
是继续写。
配置文件
打开.\ChatRWKV\v2\chat.py
文件,设置如下:
设置聊天机器人语言,目前有Chinese
和English
两种语言可以选择。
CHAT_LANG = 'Chinese'
模型设置
这个MODEL_NAME
修改为您所下载的模型文件路径和名字,不需要.pth文件扩展名。
警告:路径中的连接符要使用/
,而不是\
。
args.MODEL_NAME = 'C:/xxx/xxx/RWKV-4-Pile-7B-EngChn-testNovel-xxx-ctx2048-20230xxx'
显存设置
该参数默认为cuda fp16
,代表模型全部加载进显卡。
如果显存报错显存不足,可将改为cuda fp16 *10 -> cpu fp32
,尽量调大10这个数字cuda fp16 *10 -> cpu fp32
,只要不报错,这个数字越大,模型运行的速度就越快。
但不要太过于极限,否则在输入长文本时会时显存不够,建议测试到极限,然后对极限值减1。用这个方法,3G显存也能跑7B模型,不过会很慢,以后会更快。
还可以试试args.strategy = 'cuda fp16 *10+'
,注意这个数字10后面有个加号! 同样尽量调大10这个数字。可以比较哪种的速度快。
args.strategy = 'cuda fp16'
补充:您可以尝试'cuda fp16 *N -> cpu fp32'
这里N是数字,例如'cuda fp16 *10 -> cpu fp32'
,这里N代表放多少层在GPU运算。1.5B模型有25层,3B模型有33层,7B模型有33层,14B模型有41层。这里N越大越快,需要的显存越多。尽量增大N的值,增大到显存装不下报错为止。
可以在任务管理器中看显存占用,如果显还有空余,那么可以适当增大N的数值,直到调试出最佳N。
AMD
在试到最佳N后,如果发现GPU占用率非常低,CPU在单核工作(很多AMD CPU会这样),您可以尝试将'cuda fp16 *N+'
的N值尽量增大,N一开始用前面的N减1或2。
也可以尝试将'cuda fp16 *N+ -> cpu fp32 *1'
的N值尽量增大,N使用之前的N减1或2。
显存优化
补充:最新版支持fp16i8
量化,可以省将近一半的显存:
# Basic Strategy Guide: # 100% VRAM = 'cuda fp16' # all layers cuda fp16 # 98% VRAM = 'cuda fp16i8 *1 -> cuda fp16' # first 1 layer cuda fp16i8, then cuda fp16 # 96% VRAM = 'cuda fp16i8 *2 -> cuda fp16' # first 2 layers cuda fp16i8, then cuda fp16 # 94% VRAM = 'cuda fp16i8 *3 -> cuda fp16' # first 3 layers cuda fp16i8, then cuda fp16 # ... # 50% VRAM = 'cuda fp16i8' # all layers cuda fp16i8 # 48% VRAM = 'cuda fp16i8 -> cpu fp32 *1' # most layers cuda fp16i8, last 1 layer cpu fp32 # 46% VRAM = 'cuda fp16i8 -> cpu fp32 *2' # most layers cuda fp16i8, last 2 layers cpu fp32 # 44% VRAM = 'cuda fp16i8 -> cpu fp32 *3' # most layers cuda fp16i8, last 3 layers cpu fp32 # ... # 0% VRAM = 'cpu fp32' # all layers cpu fp32 'cuda fp16i8 *10+' = first 10 layers cuda fp16i8, then fp16i8 stream the rest to it (increase 10 for better speed)
策略设置案例
模型 | 速度 | 续写 网文 | 生成设定 回答问题 | Strategy |
---|---|---|---|---|
7B EngChn-TestNovel | 中 | 强 | 强 支持英文|多语言|代码 | ‘cuda fp16 *20 -> cuda fp16’ 尽量减少20|越少越快 |
3B Chn-testNovel | 快 | 强 | 弱 仅支持中文|只能写网文 | ‘cuda fp16’ |
3B EngChn-testNovel | 快 | 中 | 中 支持英文|多语言|代码 | ‘cuda fp16’ |
模型 | 速度 | 续写 网文 | 生成设定 回答问题 | Strategy |
---|---|---|---|---|
7B EngChn-TestNovel 2060速度下降 | 慢 | 强 | 强 支持英文|多语言|代码 | ‘cuda fp16i8 *15 -> cpu fp32’ 尽量增加15,越大越快。 或者’cuda fp16i8*15+’ 尽量增加15,越大越快。 自行测试哪种速度更快 |
3B Chn-testNovel | 中 | 强 | 弱 仅支持中文|只能写网文 | ‘cuda fp16i8*25 -> cuda fp16’ 尽量减少15,越少越快。 |
3B EngChn-testNovel | 中 | 中 | 中 支持英文|多语言|代码 | ‘cuda fp16i8*25 -> cuda fp16’ 尽量减少15,越少越快。 |
例如:
4GB的显卡用什么模型?建议3B模型,'cuda fp16i8 *30 -> cuda fp16'
尽量减少30,越少越快。
8GB的显卡用什么模型?建议7B模型,'cuda fp16i8 *30 -> cuda fp16'
尽量减少30,越少越快。
运行方式
执行如下命令,激活ChatRWKV的Codna环境。
conda activate D:\openai.wiki\ChatRWKV\MyENV
打开CMD命令行,执行如下命令进入ChatRWKV的v2目录:
cd /d D:\openai.wiki\ChatRWKV\v2
执行如下命令,启动chat.py
。
python chat.py
根据提示操作,建议先试试下列指令(不建议和机器人聊天,因为机器人没学过中文聊天):
【注意前面有 +gen,注意是 \n 不是 \\n】 +gen 这是一颗 +gen 以下是不朽的科幻史诗长篇巨著,描写细腻,刻画了数百位个性鲜明的英雄和宏大的星际文明战争。\n第一章 +gen 这是一个修真世界,详细世界设定如下:\n1.
另外在 api_demo.py 有代码调用 RWKV 的方法,几行代码就能调用RWKV。
os.environ["RWKV_JIT_ON"] = '1' from rwkv.model import RWKV # everything in /v2/rwkv folder model = RWKV(model='/fsx/BlinkDL/HF-MODEL/rwkv-4-pile-1b5/RWKV-4-Pile-1B5-20220903-8040', strategy='cuda fp16') out, state = model.forward([187, 510, 1563, 310, 247], None) # use 20B_tokenizer.json print(out.detach().cpu().numpy()) # get logits out, state = model.forward([187, 510], None) out, state = model.forward([1563], state) # RNN has state (use deepcopy if you want to clone it) out, state = model.forward([310, 247], state) print(out.detach().cpu().numpy()) # same result as above
网文模型testNovel
,指令如下:
+gen 这是一颗 +gen 以下是不朽的科幻史诗长篇巨著,描写细腻,刻画了数百位个性鲜明的英雄和宏大的星际文明战争,情节曲折离奇,充满悬疑氛围,草蛇灰线,当谜底揭开,时而令人惊为天人,时而令人扼腕叹息。\n第一章 +gen 这是一个修真世界,详细世界设定如下:\n1.
问答模型test4
,指令如下:
+gen \n活动出席发言稿:\n大家好, +gen \n怎样创立一家快速盈利的AI公司:\n1. +gen 二向箔是一种超级武器,它的原理是 +gen 我抬头一看,竟然是 +gen import torch 【这些多试几次】 +qq 请以《我的驴》为题写一篇作文 +qq 请以《企鹅》为题写一首诗歌 +qq 请设定一个奇幻世界,告诉我详细的世界设定。 【问答咒语】 +gen \nExpert Questions & Helpful Answers\nAsk Research Experts\nQuestion:\n猫会编程吗?\n\nFull Answer:\n +gen \nAsk Expert\n\nQuestion:\n猫会编程吗?\n\nExpert Full Answer:\n 【使用+qa需要在chat.py设置QA_PROMPT=True然后才能看到内容丰富的长回答】 +qa 奶茶好喝吗? +qa 猫喜欢做什么? +qa How can I learn Python? +qa 猫会编程吗? +qa 知乎大V有哪些特点?
那个RWKV的模型不需要把整个目录里所有的模型都下载回去,只需要下载其中一个就可以用,否则你再多硬盘都不够用,开发者说了,后续还会有20B,130B的模型。
单个模型大小如下:
1.5B:6.06G
3B:5.97G
7B:14.8G
14B:28.3G
@Shark 不是的,你指的是单个功能模型,但如果即想包含对话+网文+中文+英文,那就体积巨大啦。
@PhiltreX 你用的时候肯定是一次加载一个单功能模型,不可能同时把所有功能都加一起,除非它一开始训练的时候就按照全功能去投喂语料,正常用有一个模型就够了,而且它那个模型目录里有不少旧模型,后面提供了最新版就不需要旧的了。按照开发者的分类,主要有三个维度:
1 对话类(包括编程),这个是Raven系列;
2 网文生成,这是是novel系列;
3 中英日文,这个通过百分比来区分。
理论上,每个规模下载4~6个最新训练出来的模型就差不多够用了。
@Shark 你说的很对,的确是这样,加载模型的时候肯定是加载一个就好了,但是我如果要把这些模型分享给大家,那就需要批量下载所有模型到本地,因为我不知道大家需要哪个模型。然后上传到网盘内,可是最后那个模型实在太大了。
报错:RuntimeError: probability tensor contains either `inf`, `nan` or element < 0
有人遇到过吗?模型是pickle文件,会不会是我的组件版本不一致啊。我用的torch-1.13.1+cu117和torch-2.0.0+cu117都报这个错。
@vci 这个问题还真没遇到过,可能是模型问题吧,你删除模型重新下载一下。
@PhiltreX 已解决,作者开头说了。Use RWKV-4 models (NOT RWKV-4a, NOT RWKV-4b) unless you know what you are doing.
换一个模型就解决了。不要用-4a或者-4b字眼的。
大哥我有几个问题需要详细的问一下 能不能留个联系方式
@侯 有问题请在本站的论坛内发贴
楼主,1.5B就28G,达到其他模型6B、7B水平,它的优势是什么,可以分析给大家听吗?谢谢