目录
1. 选用工程:lit-llama 2. 下载工程 3. 安装环境 4. 下载LLAMA-7B模型 5. 做模型转换 6. 初步测试 7. 为什么要进行指令微调? 8. 开始进行指令微调 8.1. 数据准备 8.2 开始模型训练 8.3 模型测试前言: 系统:ubuntu 18.04 显卡:A100-80G(蹭的,嘿嘿~)
(本次主要记录如何快速进行大模型的指令微调)
1. 选用工程:lit-llama
地址:https://github.com/Lightning-AI/lit-llama2. 下载工程
git clone https://github.com/Lightning-AI/lit-llama.git
3. 安装环境
切换到工程目录cd ./lit-llama
使用pip安装依赖库
pip install -r requirements.txt
(当然,这里可能会遇到网络问题,安装不了lightning)
可使用以下方式安装:
下载lightning工程
解压进入工程目录,使用以下命令安装
python setup.py install
查看lightning是否安装成功:
pip list|grep lightning
(这里注意lightning的版本是2.1.0)
4. 下载LLAMA-7B模型
这里我们要基于LLAMA-7B做指令微调,所以要先下载模型权重,并作一系列转换。
切换到 lit-llama 所在位置,使用以下命令下载权重:python scripts/download.py --repo_id openlm-research/open_llama_7b --local_dir checkpoints/open-llama/7B
(文件有点大,需要等待一些时间)
下载完毕之后,会得到如下的文件:5. 做模型转换
还是切换到 lit-llama 所在位置,使用以下指令进行转换python scripts/convert_hf_checkpoint.py --checkpoint_dir checkpoints/open-llama/7B --model_size 7B
转换完毕之后,在 lit-llama/checkpoints/lit-llama/7B 位置,会得到大小为26G左右的 lit-llama.pth 文件,在上一级目录(lit-llama/checkpoints/lit-llama)还有一个tokenizer.model文件6. 初步测试
在命令行,使用如下命令运行:
python generate.py --prompt "Today is a"
使用中文测试,发现效果不好(开始胡说八道了~)
7. 为什么要进行指令微调?
因为原始的预训练LLAMA模型是一个大语言模型(废话~),会根据前面的单词预测下一个词语,如果你问它问题,它不会正确回答你,你问它一个问题,它可能会续写一些跟你一样的句子,例如, Prompt为 “What is the capital of China?”,它的回复如下所示:8. 开始进行指令微调
8.1. 数据准备
这里使用alpaca的52k指令数据进行微调,使用如下指令:
python scripts/prepare_alpaca.py
如果下载不下来的话,我们直接打开scripts/prepare_alpaca.py文件,如下所示:
直接打开链接 https://raw.githubusercontent.com/tloen/alpaca-lora/main/alpaca_data_cleaned_archive.json,然后全选页面复制,再保存到新建的文件里。
得到alpaca_data_cleaned_archive.json(看名字的clean应该是清洗过的),每条指令包含"instruction"、“input”、"output"三个关键字,本次先不具体展开讲解,如下所示:
运行指令后,还会作数据划分,train-49759, val-2000如下所示:
最后,会在lit-llama/data/alpaca路径下得到以下文件:
8.2 开始模型训练
使用以下指令:
python finetune/lora.py
训练过程如下所示:
整个训练过程大约要1.5个小时(16:51 ~ 18:22)
训练完毕之后,会在out/lora/alpaca得到一系列lora的权重文件,如下图所示:
8.3 模型测试
使用如下指令进行提问,其中prompt为"what is the capital of China?",
python generate/lora.py --prompt "what is the capital of China?"
得到的结果如下所示
可以看到,经过指令微调之后,模型已经可以正常回答我们的问题了。
(ps:其他细节可以参考工程的README,写的很清楚~)
结束。