添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 为对应的输出

❎ 下面的数据处理可能存在问题,问题和答案应该分成两部分,不能简单拼接为一条单独的数据。建议绕道参考这位大佬的微调流程,更为细致详尽:

zhuanlan.zhihu.com/p/62

对于 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()

为了使得训练过程中读取数据更为高效,对转换好的数据使用 github.com/Abel2076/jso 工具转换为 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 \