一、项目背景
在大模型应用学习中,学习到LLaMA-Factory模型微调框架,于是打算自己来根据LLaMA-Factory框架完整的微调一遍大模型来当作练习,选择基地模型和数据集分别是 Unichat-llama3.2-Chinese-1B 和 弱智吧数据集,选择的原因一个是个人练习用,所以选择一个模型参数量较小的,另一个就是原版模型对中文的支持比较弱,使用选择了一个中文版本,数据集则选择非常有特色的,训练后能够很好的出效果的数据集。
整个流程包括:模型下载、数据集整理、LoRA模式训练、模型评估、模型量化
二、环境准备
选择的是AutoDL算力云平台 ,GPU和软件环境选择如下
GPU: RTX 3090(24GB) + 软件环境:PyTorch 2.3.0+Python 3.12(ubuntu22.04)+CUDA 12.1
本地使用软件vs code进行远程服务器连接
三、前期准备
首先准备下载模型和数据集,这里下载有两种方式,一种是到我们租的服务器直接下载,一种是我们本地下载,这里我们选本地下载,因为下载的数据集还需要进行数据处理,本地处理比较方便,数据准备完成后上传到服务器即可。
3.1 模型下载
通过魔塔社区SDK来下载
# 安装ModelScope
pip install modelscope
# 下载模型Unichat-llama3.2-Chinese-1B模型
from modelscope import snapshot_download
model_dir = snapshot_download(
'UnicomAI/Unichat-llama3.2-Chinese-1B', # 模型名称
cache_dir=r"E:\xuexiziliao\AiProject\LLaMA-Factory-learn\llm" # 模型存放路径
)
下载完成后,模型目录文件如下图:
3.2 数据集下载
到魔塔社区中的数据集中搜索ruozhiba,然后我们找到w10442005/ruozhiba_qa数据集,下载代码如下:
# 下载数据集前需要安装下面依赖
pip install numpy
pip install datasets
pip install addict
# 数据集下载
from modelscope.msdatasets import MsDataset
ds = MsDataset.load(
'w10442005/ruozhiba_qa', # 数据集名称
subset_name='default', # 数据集子集名称
split='train' , # 数据集划分
data_dir=r"E:\xuexiziliao\AiProject\LLaMA-Factory-learn\data", # 数据集存放路径
)
如果下载不成功则换为git clone 来下载,或者直接到魔塔社区ruozhiba_qa
数据集文件中直接下载ruozhiba_qaswift.json
文件。
git clone https://www.modelscope.cn/datasets/w10442005/ruozhiba_qa.git
下载完成后我们得到的数据集目录如下图:
我们要用到的就是其中ruozhiba_qaswift.json
数据集文件,里面内容如下:
3.3 数据整理转换
数据集文件我们拿到还不能够直接使用,因为LLaMA-Factory对数据集的格式要求是固定的,需要将里面的内容格式改为identity.json
文件所示格式。如下图:
我们只需要将ruozhiba_qaswift.json
中的query
和response
替换为identity.json
中的instruction
和output
,并添加一个input
值即可。
这里我们编写一个python程序来帮我们进行数据格式整理:
import json
# 读取ruozhiba_qaswift.json文件
with open(r"\data\ruozhiba_qaswift.json", 'r', encoding='utf-8') as f:
data = json.load(f)
# 转换格式
converted_data = []
for item in data:
converted_item = {
"instruction": item["query"],
"input": "", # 新增input字段并设为空字符串
"output": item["response"]
}
converted_data.append(converted_item)
# 保存为新的JSON文件
with open('converted_file.json', 'w', encoding='utf-8') as f:
json.dump(converted_data, f, ensure_ascii=False, indent=2, sort_keys=False)
print("转换完成!转换后的数据已保存为 converted_file.json")
将转换后的json文件重命名为ruozhiba_qaswift.json
到此我们的模型和数据集就已经准备好了,接下来就是连接服务器准备开始训练
四、连接 AutoDL 服务器
到AutoDL算力市场租一台机器,选择环境如下:
选择好后开机,这时我们会得到远程服务器的ssh登入指令和密码,我们通过vs code来连接远程服务器
服务器连接完成后,我们进入到服务器root
目录下,root
目录内容如下:
五、安装LLaMA-Factory
下面我们安装LLaMA-Factory
,我们安装在root目录下的autodl-tmp
,这是服务器数据盘
# 进入autodl-tmp目录
cd autodl-tmp/
# AutoDL 学术加速
source /etc/network_turbo
# 下载LLaMA-Factory仓库
git clone https://github.com/hiyouga/LLaMA-Factory.git
# 安装auto-gptq量化包,要先于vllm安装,且auto-gptq量化包需要 PyTorch2.2.1+cuda121 版本
pip install auto-gptq
# 进入LLaMA-Factory文件夹
cd LLaMA-Factory
# 安装vllm
pip install -e .["vllm"]
下载完成后LLaMA-Factory
目录内容如下:
全部安装完成后,我们将准备好的模型和数据集上传到服务器,将ruozhiba_qaswift.json
文件放到LLaMA-Factory
目录的data
目录下,如图位置:
然后打开LLaMA-Factory
目录的data
目录下的dataset_info.json
文件,在这里我们配置我们的数据集信息,在文件开始部分添加如下内容:
"ruozhiba_qaswift": {
"file_name": "ruozhiba_qaswift.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
},
修改后的dataset_info.json
内容如下:
六、准备LoAR训练
全部条件准备完成后我们启动Web UI 准备开始模型训练。
进入LLaMA-Factory
目录,我们执行命令启动Web UI:
cd LLaMA-Factory
# 运行LLaMA-Factory的webui
llamafactory-cli webui
# 也可以使用以下命令,这样可以在后台运行webui,而不用担心终端关闭后webui会停止运行,这条命令会将输出重定向到webui.log文件中
nohup llamafactory-cli webui > webui.log 2>&1 &
# 如果要停止运行,你需要使用以下命令查找到 nohup 运行脚本到 PID,然后使用 kill 命令来删除:
ps -aux | grep "runoob.sh"
kill -9 进程号PID
执行完后会自动跳转到浏览器打开webui界面,我们接下来配置训练参数
6.1 模型参数配置
将界面修改为中文,这次我们需要设置参数为训练的模型名字,模型路径,其他保持默认
其他参数:
- 微调方法选择 lora
- 检查点路径:训练模型权重保存路径,一般默认
- 最下面一排参数先默认
模型路径为我们服务器上模型存放的路径,如下图:
6.2 Train参数配置
Train参数本次设置如下:
本次训练所配置参数就上面这些,其他这次保持默认。
我们点击开始,等待训练,我们这次训练轮次设置的为1000。
6.3 模型效果测试
训练完成后,遇到了一个问题,就是训练过程中loss值一直降到非常低,这里我们不管,只要loss值一直在降低没有过拟合就行。
当然模型训练的loss并不是评估模型效果的唯一指标,我们需要根据具体情况来判断一个模型的训练好坏。
训练过程中的两个阶段的loss值趋势如下:


后面由于安装auto-gptq
包时环境出了问题,后面上网查找原因时,是因为安装auto-gptq
包必须要有指定PyTorch和CUDA版本,要求的版本为
- PyTorch 2.1.2
- CUDA 11.8
的后续换了一个服务器,软件环境选择如下:
这里我们重新安装一下LLaMA-Factory
,这里和之前安装步骤有点不同,安装LLaMA-Factory
所需依赖前,需要先安装量化包auto-gptq
。这是后续模型量化步骤的所必须的,而且安装vllm
包之前要先安装auto-gptq
包,这也是我们为什么要换环境的原因。
执行以下命令:
# 进入autodl-tmp目录
cd autodl-tmp/
# AutoDL 学术加速
source /etc/network_turbo
# 下载LLaMA-Factory仓库
git clone https://github.com/hiyouga/LLaMA-Factory.git
# 安装auto-gptq量化包
pip install auto-gptq
# 安装vllm
pip install -e .["vllm"]
环境安装成功后,我们准备测试模型训练效果
将我们另一个服务器训练好的权重复制到新的服务器上来,并重新下载一遍模型,权重准备好后,准备开启web ui
cd LLaMA-Factory
# 运行LLaMA-Factory的webui
llamafactory-cli webui
这次我们要用到LLaMA-FactoryChat
的Chat推理功能,参数说明如下图:
下面我们用原始模型,以及加载不同训练轮次的权重模型后,对同一问题模型给的回答来进行一个对比。
加载模型准备开始测试
因为训练时顺便加了关于自我认知的数据集,所以来进行自我认知测试,模型回答如下:



对模型用弱智吧的问题进行提问,模型回答如下:




6.4 模型合并导出
我们先将模型合并,然后在进行模型量化导出,模型导出设置如下,我们用1000轮的权重来进行模型合并
6.5 模型量化导出
将我们上面导出的模型文件加载进来,量化导出设置如下:
这里导出我们看控制台有没有报错信息,可能会要提示我们安装一些环境,提示缺什么我们就安装什么。
pip install optimum
安装完成后记得重启webui,然后我们重新配置一下等待模型量化导出完成。
这里我一共导出了q2,q4,q8精度的量化模型,然后来分别对它们的效果进行对比,q4和q8精度下,模型效果和没量化前区别不大,到测试q2时,模型已经完全不行了,全都回答乱码。



所以目前量化一般量化到4位和8位。
6.5 模型评估
我们首先准备好测试数据集,这次我们先从ruozhiba_qaswift.json
文件中取一部分数据从来作为我们的测试数据集,在LLaMA-Factory/data
目录下面新建ruozhiba_qaswift_test.json
文件,复制一部分ruozhiba_qaswift.json
中的数据到ruozhiba_qaswift_test.json
文件中,然后在dataset_info.json
文件中配置ruozhiba_qaswift_test.json
文件,准备好后我们开始模型评估。
我们导入基座模型,设置好我们要评估的权重,然后进入Evaluate & Predict
界面,参数设置如下图:
我们点击开始评估,这时会要求我们安装几个评估要用的包,我们依次根据提示安装即可
pip install jieba
pip install nltk
pip install rouge_chinese
包安装完成后,模型评估开始,评估结果如下:
训练1000轮权重的模型评估得分:
{
"predict_bleu-4": 25.71370314171123,
"predict_model_preparation_time": 0.0023,
"predict_rouge-1": 48.205860895721926,
"predict_rouge-2": 27.524134157754013,
"predict_rouge-l": 41.42147493315508,
"predict_runtime": 347.7339,
"predict_samples_per_second": 4.302,
"predict_steps_per_second": 0.359
}
训练3100轮的模型评估得分:
{
"predict_bleu-4": 92.7214736631016,
"predict_model_preparation_time": 0.0024,
"predict_rouge-1": 95.9076695855615,
"predict_rouge-2": 94.5167354946524,
"predict_rouge-l": 95.47345046791445,
"predict_runtime": 318.3357,
"predict_samples_per_second": 4.699,
"predict_steps_per_second": 0.393
}
这是一段 JSON 格式数据,用于表示模型预测性能的相关指标。以下是各字段的解释:
- predict_bleu4: BLEU-4 得分。
- predict_model_preparation_time: 模型准备时间
- predict_rouge1: ROUGE-1 得分
- predict_rouge2: ROUGE-2 得分
- predict_rougel: ROUGE-L 得分
- predict_runtime: 总运行时间
- predict_samples_per_second: 每秒处理样本数
- predict_steps_per_second: 每秒处理步骤数
这些指标用于评估模型性能,帮助优化。(详细资料可参考:BLEU、ROUGE详解-语言模型的常用评价指标-举例附代码实现
可以看出这次训练1000轮的效果其实并不好,评分都较低,和我们主观测试的结果差不多,而训练3100轮的效果就不错,得分较高。
6.6 关于QLoRA
QLoRA是一种优于LoRA训练的一个手段,QLoRA可以帮助我们在一定程度上降低训练时显存需要,而不像量化导出那样损失较大参数,并且可以加快训练速度,所以训练可以使用QLoRA来进行,
开启QLoRA训练的一些设置:
问题记录
在AutoDL服务器中安装pip install auto-gptq 包出现报错
pip install auto-gptqLooking in indexes: http://mirrors.aliyun.com/pypi/simple Collecting auto-gptq Using cached http://mirrors.aliyun.com/pypi/packages/90/e5/b22697903982284fe284568fb2663a2196694a8eee637f5cf4ccfe435a38/auto_gptq-0.7.1.tar.gz (126 kB) Preparing metadata (setup.py) ... done Discarding http://mirrors.aliyun.com/pypi/packages/90/e5/b22697903982284fe284568fb2663a2196694a8eee637f5cf4ccfe435a38/auto_gptq-0.7.1.tar.gz#sha256=5c61ad380e9b4c603757c254765e9083a90a820cd0aff1b5d2c6f7fd96c85e80 (from http://mirrors.aliyun.com/pypi/simple/auto-gptq/) (requires-python:>=3.8.0): Requested auto-gptq from http://mirrors.aliyun.com/pypi/packages/90/e5/b22697903982284fe284568fb2663a2196694a8eee637f5cf4ccfe435a38/auto_gptq-0.7.1.tar.gz#sha256=5c61ad380e9b4c603757c254765e9083a90a820cd0aff1b5d2c6f7fd96c85e80 has inconsistent version: expected '0.7.1', but metadata has '0.7.1+cu124' Using cached http://mirrors.aliyun.com/pypi/packages/34/71/c3e73cf17681f6ff4754ef8f4cb8b67af3def230fc8711eac1250bbd78d5/auto_gptq-0.7.0.tar.gz (124 kB) Preparing metadata (setup.py) ... done Discarding http://mirrors.aliyun.com/pypi/packages/34/71/c3e73cf17681f6ff4754ef8f4cb8b67af3def230fc8711eac1250bbd78d5/auto_gptq-0.7.0.tar.gz#sha256=50a5396fae2db5a19446b3198ef0e86ee520846b881db47bdbf4eb9260eac723 (from http://mirrors.aliyun.com/pypi/simple/auto-gptq/) (requires-python:>=3.8.0): Requested auto-gptq from http://mirrors.aliyun.com/pypi/packages/34/71/c3e73cf17681f6ff4754ef8f4cb8b67af3def230fc8711eac1250bbd78d5/auto_gptq-0.7.0.tar.gz#sha256=50a5396fae2db5a19446b3198ef0e86ee520846b881db47bdbf4eb9260eac723 has inconsistent version: expected '0.7.0', but metadata has '0.7.0+cu124' Using cached http://mirrors.aliyun.com/pypi/packages/49/af/02b66e55dfd9aeb0ece923843043724ed7432ec0c649ea0f3b9fa1dd90c6/auto_gptq-0.6.0.tar.gz (120 kB) Preparing metadata (setup.py) ... error error: subprocess-exited-with-error × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [20 lines of output] python: can't open file '/tmp/pip-install-g1v4mpt6/auto-gptq_c460ab0157b140969c62922c52a5ab77/./autogptq_extension/qigen/generate.py': [Errno 2] No such file or directory Traceback (most recent call last): File "/tmp/pip-install-g1v4mpt6/auto-gptq_c460ab0157b140969c62922c52a5ab77/setup.py", line 109, in <module> subprocess.check_output(["python", "./autogptq_extension/qigen/generate.py", "--module", "--search", "--p", str(p)]) File "/root/miniconda3/lib/python3.12/subprocess.py", line 466, in check_output return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/miniconda3/lib/python3.12/subprocess.py", line 571, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command '['python', './autogptq_extension/qigen/generate.py', '--module', '--search', '--p', '112']' returned non-zero exit status 2. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<string>", line 2, in <module> File "<pip-setuptools-caller>", line 34, in <module> File "/tmp/pip-install-g1v4mpt6/auto-gptq_c460ab0157b140969c62922c52a5ab77/setup.py", line 111, in <module> raise Exception(f"Generating QiGen kernels failed with the error shown above.") Exception: Generating QiGen kernels failed with the error shown above. Generating qigen kernels... [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details.
更多实用文章和AI大模型应用开发文章欢迎到我个人博客来观看:墨宇Logic