RWKV-v4neo LoRA 微调记录
1. 下载开源 LoRA 微调代码
git clone https://github.com/Blealtan/RWKV-LM-LoRA.git
2. 配置运行环境
使用 conda 或 pip 安装以下的库:
- pytorch=1.13.1
- pytorch-lightning=1.9.2
- deepspeed=0.7.0
⚠️ 如果操作系统的cuda环境和 pytorch 的cuda版本不一致,deepspeed 包可能会抛出异常,找到 deepspeed 源码,注释掉 deepspeed/ops/op_builder/builder.py 文件中以下抛出异常的内容(在100行附近,各个版本可能不一样):
# 注释掉这一段抛出异常的内容,或者改为只打印警告信息
raise Exception(
f"Installed CUDA version {sys_cuda_version} does not match the "
f"version torch was compiled with {torch.version.cuda}, unable to compile "
"cuda/cpp extensions without a matching cuda version.")
2. 下载预训练模型
到 BLink 主页下载 rwkv-v4 版本(注意,截止到 2023.05.16 必须是 v4 版本)的 .pth 模型 : BlinkDL (BlinkDL) (huggingface.co) 使用 fp16或bf16 精度进行训练,1B 的模型大小需要的大致 GPU 内存为 5GB,根据自己的显卡大小选择大小合适的模型
3. 下载并转换微调数据集
可以参考这个 数据集列表 下载微调数据集。
例如使用 YeungNLP/firefly-train-1.1M · Datasets at Hugging Face 数据集进行微调,该数据集是个指令微调数据集,每条数据的格式是:
{
"kind": "ClassicalChinese",
"input": "将下面句子翻译成现代文:\n石中央又生一树,高百余尺,条干偃阴为五色,翠叶如盘,花径尺余,色深碧,蕊深红,异香成烟,著物霏霏。",
"target": "大石的中央长着一棵树,一百多尺高,枝干是彩色的,树叶有盘子那样大,花的直径有一尺宽,花瓣深蓝色,花中飘出奇异的香气笼罩着周围,如烟似雾。"
}
其中:
- kind 为指令类型
- input 为指令和输入
- target 为对应的输出
❎ 下面的数据处理可能存在问题,问题和答案应该分成两部分,不能简单拼接为一条单独的数据。建议绕道参考这位大佬的微调流程,更为细致详尽:
https:// zhuanlan.zhihu.com/p/62 9809101
对于 RWKV-v4 模型,需要将训练数据转换成如下格式:
{"text": "<a sentence>"}
可以将 firefly-1.1M 数据集中的数据通过如下python 脚本进行转换,将 input 和 target 合并成一个句子,中间用回车换行分隔:
import jsonlines
import tqdm
infile = "<your dataset dir>/firefly-train-1.1M.jsonl"
outfile = "<your output dataset dir>/firefly-text.jsonl"
fr = jsonlines.open(infile, 'r')
fw = jsonlines.open(outfile, 'w')
for obj in tqdm(fr):
new_obj = {"text": f"{obj['input']}\n{obj['target']}"}
fw.write(new_obj)
fw.close()
fr.close()
为了使得训练过程中读取数据更为高效,对转换好的数据使用 https:// github.com/Abel2076/jso n2binidx_tool 工具转换为 token 索引和二进制文件
转换数据使用如下命令行:
python tools/preprocess_data.py --input=<your-dataset-dir>/firefly-text.jsonl --tokenizer-type=HFTokenizer --vocab-file=<your-rwkv-lm-lora-repo-dir>/RWKV-v4neo/20B_tokenizer.json --append-eod --output-prefix=<your-output-binidx-dataset-prefix> --dataset-impl=mmap --workers=16
至此,我们得到转换好的 .bin 和 .idx 训练数据文件
4. 开始训练
根据你下载的预训练的模型大小,调整对应的训练参数, 其中必须根据预训练模型调整的参数有:
模型大小 | 模型层数 n_layer | 向量长度 n_embd |
---|---|---|
169M | 12 | 768 |
430M | 24 | 1024 |
1.5B | 24 | 2048 |
3B | 32 | 2560 |
7B | 32 | 4096 |
# 进入 RWKV-LM-LoRA/RWKV-v4neo 目录执行
python3 train.py \
--load_model <your-downloaded-pretrained-rwkv-v4-model-path> \ # only model path without '.pth'
--proj_dir <dir-to-save-lora-model-weights> \
--data_file <your-processed-binidx-dataset-path> \ # only dataset name with .idx or .bin
--data_type "binidx" \
--accelerator gpu --devices <your-gpu-cnt> \
--precision fp16 \ # use bf16 or fp32, fp32 will use double memory
--strategy deepspeed_stage_2 \
--vocab_size 50277 \
--ctx_len 2048 \ # set it according to your pretrained model or dataset
--epoch_steps 1000 --epoch_count 1000 \
--epoch_begin 0 --epoch_save 1 --micro_bsz 2 \