主要观点总结
作者两年前微调了开源的大语言模型,并在阿毗达磨问题上进行了测试。他发现模型在阿毗达磨上的表现相对较好,但网上的数据质量极差。作者通过刘琨的帮助,使用unsloth库进行了模型微调,并使用了txt格式的训练数据。他详细解释了安装依赖、配置PEFT模型、数据处理、训练配置和推理的代码。最后,他给出了对代码和性能的详细解释和建议。
关键观点总结
关键观点1: 微调大语言模型
作者微调了开源的大语言模型,并测试了它在阿毗达磨问题上的表现。
关键观点2: 数据质量差
作者发现网上的阿毗达磨数据质量极差,只有1%的数据是正确的。
关键观点3: 使用unsloth库进行微调
作者使用unsloth库进行模型微调,提高了训练效率。
关键观点4: 数据处理和训练配置
作者详细解释了数据处理和训练配置的代码,包括安装依赖、配置PEFT模型、数据处理和训练参数。
关键观点5: 推理和性能优化
作者介绍了用于模型推理的代码,并给出了性能优化和错误处理的建议。
正文
jsonl
类型的阿毗达磨数据质量高不了。高质量的数据只能手动去写,但我不可能有那个精力。
AI
根据《俱舍》《婆沙》生成的
1
万条
jsonl
数据,假设其中包含
20
万字,它的价值只相当于俱舍论的
4000
字,这就是为什么用
jsonl
数据训练很不可行。
所以,我简单试了下
jsonl
数据,还是回归到
txt
数据。
我是在
google colab
上微调的。一开始是用
10MB
的数据,包含《俱舍》《婆沙》《正理》三部阿毗达磨文献全文。还有个更大的,整个毗昙部的文献,
48MB
左右,想先跑通一遍流程,没用那个。用的是
T4 GPU
,最早的代码,显示微调完成需要
36
小时。我想先跑通流程,所以修改参数到最小,又换成一个
4MB
的数据(只包含《俱舍》《正理》),训练需要
1
小时左右。因此,现在放上来的也是这个。
以下的代码解释,每一部分放在一个单元格中,解释是让
Claude
完成的。
%%capture
!pip install
!pip install
!pip install sentencepiece protobuf datasets huggingface_hub hf_transfer
!pip install
好的,我来详细解释这段安装依赖的代码。让我们一步步来看:
- 它的作用是隐藏命令执行时的输出信息,让notebook看起来更整洁
- 通常情况下,只需要运行 `pip install unsloth` 就够了
- 但在2025年1月底,由于Colab环境的特殊性,需要分步安装以提高效率
- 这种方式可以把安装时间从3分钟缩短到1分钟以内
!pip install --no-deps bitsandbytes accelerate xformers==0.0.29 peft trl triton
- `--no-deps`: 表示只安装指定的包,不安装它们的依赖包
- `bitsandbytes`: 用于模型量化,可以减少显存占用
- `accelerate`: Hugging Face的加速训练工具
- `xformers`: Facebook开发的Transformer优化库
- `peft`: Parameter-Efficient Fine-Tuning的缩写,用于高效微调
- `trl`: Transformer Reinforcement Learning,用于强化学习训练
- `triton`: 一个编程语言,用于编写高效的GPU代码
!pip install --no-deps cut_cross_entropy unsloth_zoo
- `cut_cross_entropy`: 优化的交叉熵损失函数实现
- `unsloth_zoo`: unsloth的模型库
!pip install sentencepiece protobuf datasets huggingface_hub hf_transfer
- `sentencepiece`: 用于文本分词
- `datasets`: Hugging Face的数据集工具
- `huggingface_hub`: 用于与Hugging Face模型库交互
- `hf_transfer`: 优化的模型下载工具
!pip install --no-deps unsloth
这些库构成了一个完整的大语言模型微调环境。使用unsloth可以帮助我们更高效地进行模型微调,它提供了很多优化和加速的特性。
小提示:如果安装过程中遇到错误,可以去掉`%%capture`来查看具体的错误信息,这样更容易排查问题。
from unsloth import FastLanguageModel
import torch
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B-unsloth-bnb-4bit",
max_seq_length = 512,
dtype = None,
load_in_4bit = True,
)
好的,我来详细解释这段代码的作用。这是加载预训练模型的关键步骤,让我们逐行分析:
from unsloth import FastLanguageModel
- `FastLanguageModel` 是unsloth提供的快速语言模型加载工具
- `torch` 是PyTorch深度学习框架,为模型训练提供基础支持
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B-unsloth-bnb-4bit",
- 这里使用的是DeepSeek-R1-Distill-Llama-8B模型