ChatGLM2-6B微调

微调东西

本次咱们运用ChatGLM-Efficient-Tuning,根据 PEFT 的高效 ChatGLM-6B 微调东西

现在实现了针对以下高效微调办法的支撑:

  • LoRA
    • 仅微调低秩适应器。
  • P-Tuning V2
    • 仅微调前缀编码器。
  • Freeze Tuning
    • 仅微调后几层的全连接层。
  • 全量微调
    • 微调模型所有参数。

本次咱们运用LoRA微调办法。

微调步骤

下载代码

git clone https://github.com/hiyouga/ChatGLM-Efficient-Tuning.git

装置依靠

cd ChatGLM-Efficient-Tuning
# 创立conda环境
conda create -n chatglm2 python=3.9
conda activate chatglm2
# 装置pytorch,假如已装置能够忽略
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.7 -c pytorch -c nvidia
# 装置项目依靠
pip install -r requirements.txt

下载模型

下载地址: huggingface.co/THUDM/chatg…

注意有必要要将整个项目git clone下来

这里主张现已下载过模型的从头将项目中的几个py文件从头下载一次,否则会报错

git lfs install
git clone https://huggingface.co/THUDM/chatglm2-6b

编辑数据集

数据集按照如下格式即可

[
    {
        "question": "人们为何常常感到冤枉", //输入
        "instruction": "问答",  //指令 如 翻译/问答
        "output": "人常会不自觉地记下对自己有利的部分,这是构成冤枉的重要原因。" //输出
    }
]

src/data/data_info.json中新增数据集并编辑字段映射

  "zhangyiming": {
    "file_name": "/gemini/data-1/zhangyiming.json",
    "columns": { //对应数据集的字段名
      "prompt": "instruction",
      "query": "input",
      "response": "output"
    }
  }

运行微调指令

这里是单机单cpu,所以只需要用device0就行

CUDA_VISIBLE_DEVICES=0 python src/train_sft.py  --model_name_or_path  /gemini/code/model --use_v2 --plot_loss   --do_train   --dataset zhangyiming     --finetuning_type lora     --output_dir /gemini/code/output   --per_device_train_batch_size 4     --gradient_accumulation_steps 4     --lr_scheduler_type cosine     --logging_steps 10     --save_steps 1000     --learning_rate 5e-5     --num_train_epochs 100     --fp16

部分参数解释:

名称 阐明
use_v2 是否微调的是ChatGLM2
model_name_or_path 模型途径
finetuning_type 微调类型: lora p-tuning freeze
dataset 数据集名称
output_dir 输出微调模型的途径
num_train_epochs 练习次序

其他参数见项目wiki

其间各微调类型介绍:

  • Freeze: 即参数冻住,对原始模型部分参数进行冻住操作,仅练习部分参数,以到达在单卡或不进行TP或PP操作,就能够对大模型进行练习。
  • P-Tuning: 在输入的embedding层前,将prompt转换为可学习的额定一层embedding层.(这里我也没有太懂=)
  • LoRA: 在大型言语模型上对指定参数(权重矩阵)并行添加额定的低秩矩阵,并在模型练习过程中,仅练习额定添加的并行低秩矩阵的参数,冻住其他参数。 当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量也就很小。在下游任务tuning时,仅须练习很小的参数,但能获取较好的体现成果。

现在我在24G显存(用的趋动云,不知道具体的GPU类型)情况下,LoRA微调100个epoch大概7分钟就跑完了,微调成果会保存到装备的output目录.我准备了58条练习数据,大概在500个epoch左右loss开端不再下降。

ChatGLM2-6B微调

其间,adapter_config.jsonadapter_model.bin就是微调后的模型

测验

Cli测验

CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py \
    --checkpoint_dir /gemini/code/output --model_name_or_path  /gemini/code/model --use_v2

代码测验

from transformers import AutoModel, AutoTokenizer
from peft import PeftModel
model_path = '/gemini/code/model/'
peft_model_path = '/gemini/code/output/'
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
model = PeftModel.from_pretrained(model, peft_model_path, is_trainable=True)
input_text = '人们为何常常感到冤枉?'
response, history = model.chat(tokenizer=tokenizer, query=input_text)
print(response)

ChatGLM2-6B微调