M40显卡通过lora微调国产开源模型RWKV
第一部分:准备阶段
1.系统:Ubuntu22或20或其他Linux系统(win系统有各种各样问题,目前没看到谁成功过)
2.显卡:M40 24G
3.内存:32G
4.显卡驱动:525 (cuda≥11.7即可)
5.cuda:11.7(必须)
6.环境:conda
准备过程就不作赘述了,网上都搜得到
第二部分:neox部署-预处理数据
从https://github.com/ridgerchu/gpt-neox-RWKV上pull后进入该目录下
1.搭建预处理环境
conda create -n pre-t python=3.8 numpy flask libopenmpi-dev
2.安装依赖
pip install torch --extra-index-url https://download.pytorch.org/whl/cu117 --upgrade
pip install -r requirements/requirements.txt
python ./megatron/fused_kernels/setup.py install
3.TXT转换jsonl
预处理需要的jsonl格式为
{"meta": {"ID": 101}, "text": "This is the first document."}
{"meta": {"ID": 102}, "text": "Hello\nWorld"}
{"meta": {"ID": 103}, "text": "1+1=2\n1+2=3\n2+2=4"}
python3 t2jsonl.py(代码如下)
------------------------------------------------------------
import json
# Generate a list of dictionaries
lines = []
with open("训练文件.txt", encoding="utf8") as f:
for line in f.read().splitlines():
if line:
lines.append({"text": line})
# Convert to a list of JSON strings
json_lines = [json.dumps(l) for l in lines]
# Join lines and save to .jsonl file
json_data = '\n'.join(json_lines)
with open('训练文件.jsonl', 'w') as f:
f.write(json_data)
------------------------------------------------------------
4.预处理
python3 tools/preprocess_data.py --input ./训练文件.jsonl --output-prefix ./data/训练文件 --vocab ./20B_tokenizer.json --dataset-impl mmap --tokenizer-type HFTokenizer --append-eod
微调完成后会生成相应的bin文件和idx文件,即为lora训练需要的训练集
第三部分:lora训练
从https://github.com/Blealtan/RWKV-LM-LoRA上pull后进入RWKV-LM-LoRA/RWKV-v4neo/目录下,将以上bin文件和idx文件复制进该目录(或从绝对路径调用)
1.环境
conda create -n train python=3.10.6 numpy tokenizers prompt_toolkit
2.依赖
pip install torch --extra-index-url https://download.pytorch.org/whl/cu117 --upgrade
pip install pytorch_lightning
pip install deepspeed
pip install transformers
pip install rwkv
3.训练
训练格式:
python3 train.py --load_model 底模型.pth --lora_load lora模型.pth --proj_dir lora_checkpoints --data_file 预处理数据(不需要加bin或idx,只要文件名) --data_type binidx --vocab_size 50277 --ctx_len 1024(看显存,越大越好) --accumulate_grad_batches 8 --epoch_steps 1000 --epoch_count 20 --epoch_begin 0 --epoch_save 5 --micro_bsz 1 --n_layer 32(看模型) --n_embd 2560(看模型) --pre_ffn 0 --head_qk 0 --lr_init 1e-5 --lr_final 1e-5 --warmup_steps 0 --beta1 0.9 --beta2 0.999 --adam_eps 1e-8 --accelerator gpu --devices 1 --precision fp16 --strategy ddp_find_unused_parameters_false --grad_cp 1(开启加速) --lora --lora_r 8 --lora_alpha 32 --lora_dropout 0.01 --lora_parts=att,ffn,time,ln
对于7B大模型可以参考以下参数,我的内存条32G没办法训练,建议要训练的仁兄内存加大
python3 train.py --load_model RWKV-4-Pile-7B-EngChn-testNovel-2119-ctx2048-20230313.pth --lora_load rwkv-0 --proj_dir lora_checkpoints --data_file 11 --data_type binidx --vocab_size 50277 --ctx_len 512 --accumulate_grad_batches 8 --epoch_steps 1000 --epoch_count 20 --epoch_begin 0 --epoch_save 5 --micro_bsz 1 --n_layer 32 --n_embd 4096 --pre_ffn 0 --head_qk 0 --lr_init 1e-5 --lr_final 1e-5 --warmup_steps 0 --beta1 0.9 --beta2 0.999 --adam_eps 1e-8 --accelerator gpu --devices 1 --precision fp16 --strategy ddp_find_unused_parameters_false --grad_cp 1 --lora --lora_r 8 --lora_alpha 32 --lora_dropout 0.01 --lora_parts=att,ffn,time,ln
对于3B大模型可以参考以下参数,内存占用20G,显存16G
python3 train.py --load_model RWKV-4-Pile-3B-Chn-testNovel-done-ctx2048-20230312.pth --lora_load rwkv-0 --proj_dir lora_checkpoints --data_file 11 --data_type binidx --vocab_size 50277 --ctx_len 2048 --accumulate_grad_batches 8 --epoch_steps 1000 --epoch_count 20 --epoch_begin 0 --epoch_save 5 --micro_bsz 1 --n_layer 32 --n_embd 2560 --pre_ffn 0 --head_qk 0 --lr_init 1e-5 --lr_final 1e-5 --warmup_steps 0 --beta1 0.9 --beta2 0.999 --adam_eps 1e-8 --accelerator gpu --devices 1 --precision fp16 --strategy ddp_find_unused_parameters_false --grad_cp 1 --lora --lora_r 8 --lora_alpha 32 --lora_dropout 0.01 --lora_parts=att,ffn,time,ln
5.测试
RWKV_JIT_ON=1 python chat.py(需要在chat.py文件里提前写好相应配置,包括:模型地址、lora地址、lora训练参数、n_layer、n_embd等)
参考资料:
neox预处理(转格式binidx):https://github.com/ridgerchu/gpt-neox-RWKV#training-and-finetuning
lora训练:https://github.com/Blealtan/RWKV-LM-LoRA#lora-fork-of-rwkv-lm
rwkv:https://github.com/BlinkDL/RWKV-LM#training--fine-tuning