Home

Awesome

<!-- * @Author: lihaitao * @Date: 2023-05-08 17:52:50 * @LastEditors: Do not edit * @LastEditTime: 2023-05-09 14:34:49 * @FilePath: /lht/ChatGLM_LoRA/README.md -->

ChatGLM_multi_gpu_zero_Tuning

实现multi_gpu + zero 微调ChatGLM, 目前已实现LoRA, Ptuning-v2, Freeze三种微调方式。 相关debug记录可以见知乎

使用该代码训练的法律大模型LexiLaw可见LexiLaw

Data Structure

data.py中使用InstrutionDataset和InstrutionCollator处理数据。

每条数据包含instruction,inpuy,answer,示例如下:

{"instruction": "", "input": "工作时把右小指挤段又接上的,XXXX左右的工资,在说我们感觉太不公平了,刚手术做了XX个小时", "answer": "这种情况,是属于工伤的。按照法律规定,需要先行认定工伤,认定工伤后,再进行劳动能力鉴定,然后再具体索赔。涉及赔偿项目比较多,一般包括医疗费、护理费、伙食费、停工留薪期内的工资,构成伤残的,还可以主张一次性伤残补助金、一次性伤残就业补助金、一次性工伤医疗补助金等,每一项赔偿的标准不一样,需要根据实际情况来具体计算。由于工伤案件,涉及程序较多、法律关系复杂,建议委托专业律师代理处理。我们经常代理工伤赔偿案件,如果愿意,我们可以协助处理。详情可以电联,或者面谈。"}

InstrutionDataset中的prefix只有ptuning时使用, InstrutionCollator中max_len和max_input_len用来控制输入长度

Train

LoRA

1.修改lora.sh中模型和数据路径

2.运行sh lora.sh

    CUDA_VISIBLE_DEVICES=${TOT_CUDA} deepspeed --master_port=$PORT --num_gpus=3 lora.py \
        --train_path ./instrution_data.json \
        --max_len 768 \
        --max_input_len 512 \
        --model_name_or_path ./chatGLM-6B \
        --tokenizer_name ./chatGLM-6B \
        --lora_rank 8 \
        --per_device_train_batch_size 16 \
        --gradient_accumulation_steps 4 \
        --num_train_epochs 10 \
        --save_steps 900 \
        --learning_rate 1e-5 \
        --fp16 \
        --remove_unused_columns false \
        --logging_steps 50 \
        --output_dir /output \
        --deepspeed /ds_config.json \

单卡运行可以改为 num_gpus == 1

LoRA的参数如下,可根据实际情况调整:

    peft_config = LoraConfig(
        task_type="CAUSAL_LM",
        lora_alpha=32,  
        target_modules=["query_key_value"],
        inference_mode=False,
        r=training_args.lora_rank,
        lora_dropout=0.1,
        bias="none",
        fan_in_fan_out = False
    )

P-tuning-v2

根据ChatGLM-6B官方P—tuning代码修改。

1.修改ptuning.sh中模型和数据路径

2.运行sh ptuning.sh

    CUDA_VISIBLE_DEVICES=${TOT_CUDA} deepspeed --master_port=$PORT --num_gpus=2 finetune_ptuning.py \
        --train_path ./instrution_data.json \
        --max_len 768 \
        --max_input_len 512 \
        --model_name_or_path /chatGLM-6B \
        --tokenizer_name/chatGLM-6B \
        --per_device_train_batch_size 8 \
        --gradient_accumulation_steps 4 \
        --num_train_epochs 10 \
        --save_steps 2000 \
        --learning_rate 1e-5 \
        --fp16 \
        --logging_steps 50 \
        --prefix_projection True \
        --pre_seq_len $PRE_SEQ_LEN \
        --output_dir /output \
        --deepspeed ds_config.json \

其中$PRE_SEQ_LEN是soft prompt的长度, 可以根据实际情况修改。

Freeze

1.修改freeze.sh中模型和数据路径

2.运行sh freeze.sh

    CUDA_VISIBLE_DEVICES=${TOT_CUDA} deepspeed --master_port=$PORT --num_gpus=3 finetune_freeze.py \
        --train_path  \
        --max_len 768 \
        --max_input_len 512 \
        --model_name_or_path /chatGLM-6B \
        --tokenizer_name /chatGLM-6B \
        --lora_rank 8 \
        --per_device_train_batch_size 16 \
        --gradient_accumulation_steps 4 \
        --num_train_epochs 10 \
        --save_steps 900 \
        --learning_rate 1e-5 \
        --fp16 \
        --remove_unused_columns false \
        --logging_steps 50 \
        --output_dir output_freeze \
        --deepspeed ds_config.json \

可通过以下代码修改可训练的层数:

    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

Requirements

python=3.9
transformers==4.28.1
tqdm==4.64.1
datasets==2.8.0
pytorch==1.12.1
deepspeed==0.9.1
peft==0.3.0 

一定要使用peft==0.3.0

Todo

Contact

If you find our work useful, please do not save your star!

If you have any questions, please email liht22@mails.tsinghua.edu.cn