微调大模型的代码主要涉及对原始模型的部分参数进行冻结,仅训练部分参数,以达到在单卡或不进行TP或PP操作的情况下,可以对大模型进行训练。以下是一些具体的代码示例和框架:
- Freeze方法 :
-
代码位置 :
finetuning_freeze.py
-
核心部分 :
for name, param in model.named_parameters():
if not any(nd in name for nd in ["layers.27", "layers.26", "layers.25", "layers.24", "layers.23"]):
param.requires_grad = False
```
- **训练代码** :
```python
CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_freeze.py --num_train_epochs 5 --train_batch_size 2
```
- **推理代码** :
```python
predict_freeze.py
```
2. **Qwen2指令微调** :
- **代码位置** :本文第5节
- **使用模型** :Qwen2-1.5b-Instruct<b class="card40_2411__sup_5321" data-sup="sup">2</b>
- **数据集** :复旦中文新闻
- **显存要求** :约10GB<b class="card40_2411__sup_5321" data-sup="sup">2</b>
3. **LLaMA Factory** :
- **特点** :简单易用的开源大模型训练框架,降低了大模型训练的难度和资源要求<b class="card40_2411__sup_5321" data-sup="sup">3</b>。
4. **NEFT(Noisy Embedding Fine Tuning)** :
- **方法** :在训练阶段向嵌入层中加入噪声<b class="card40_2411__sup_5321" data-sup="sup">4</b>
- **代码示例** :
```python
from torch.nn import functional as F
def NEFTune(model, noise_alpha=5):
def noised_embed(orig_embed, noise_alpha):
noise = torch.randn(orig_embed.size(0), orig_embed.size(1), noise_alpha)
return orig_embed + noise
return noised_embed
```
5. **LoRA(Low-Rank Adaptation)** <b class="card40_2411__sup_5321" data-sup="sup">5</b>:
- **方法** :使用低秩小参数矩阵模拟全量微调的增量参数矩阵<b class="card40_2411__sup_5321" data-sup="sup">6</b>
- **代码示例** :
```python
# 假设要在Transformer里的MLP层上做LoRA微调
lora_A = torch.randn(3072, 4)
lora_B = torch.randn(4, 768)
adapted_weights = lora_A @ lora_B
```
6. **PEFT(Parameter-Efficient Fine-Tuning)** :
- **方法** :包括LoRA、Prefix Tuning、Adapter等<b class="card40_2411__sup_5321" data-sup="sup">5</b>
- **相关库** :`swanlabmodelscopetransformersdatasetspeftacceleratepandastiktoken`<b class="card40_2411__sup_5321" data-sup="sup">7</b>
- **安装命令** :
```bash
pip install swanlab modelscope transformers datasets peft pandas accelerate tiktoken
```
这些代码示例和框架提供了不同的大模型微调方法,可以根据具体任务和资源情况进行选择和调整。