• [NLP] LLM---<训练中文LLama2(四)方式一>对LLama2进行SFT微调


    指令精调

    指令精调阶段的任务形式基本与Stanford Alpaca相同。训练方案也采用了LoRA进行高效精调,并进一步增加了可训练参数数量。在prompt设计上,精调以及预测时采用的都是原版Stanford Alpaca不带input的模版。对于包含input字段的数据,采用f"{instruction}+\n+{input}"的形式进行拼接。

    其中,Stanford Alpaca 格式如下所示:

    1. [
    2. {"instruction" : ...,
    3. "input" : ...,
    4. "output" : ...},
    5. ...
    6. ]

    首先,修改模型精调脚本run_sft.sh,需要修改的参数如下:

    • --model_name_or_path: 模型经过词表扩充并完成预训练进行权重合并之后所在的目录
    • --tokenizer_name_or_path: Chinese-Alpaca tokenizer 所在的目录
    • --dataset_dir: 指令精调数据的目录,包含一个或多个以json结尾的Stanford Alpaca格式的指令精调数据文件
    • --validation_file: 用作验证集的单个指令精调文件,以json结尾,同样遵循Stanford Alpaca格式
    • --output_dir: 模型权重输出路径
    dataset_dir=./sft_dataset/train = Chinese-LLaMA-Alpaca/data
    

    其他参数(如:per_device_train_batch_size、training_steps等)是否修改视自身情况而定。

    1. # 运行脚本前请仔细阅读wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/sft_scripts_zh)
    2. # Read the wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/sft_scripts_zh) carefully before running the script
    3. lr=1e-4
    4. lora_rank=64
    5. lora_alpha=128
    6. lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
    7. modules_to_save="embed_tokens,lm_head"
    8. lora_dropout=0.05
    9. pretrained_model=./merged_output_dir
    10. chinese_tokenizer_path=./merged_output_dir
    11. dataset_dir=./sft_dataset/train
    12. per_device_train_batch_size=1
    13. per_device_eval_batch_size=1
    14. gradient_accumulation_steps=8
    15. max_seq_length=512
    16. output_dir=./sft_output_dir
    17. validation_file=./sft_dataset/test/test.json
    18. deepspeed_config_file=ds_zero2_no_offload.json
    19. torchrun --nnodes 1 --nproc_per_node 1 run_clm_sft_with_peft.py \
    20. --deepspeed ${deepspeed_config_file} \
    21. --model_name_or_path ${pretrained_model} \
    22. --tokenizer_name_or_path ${chinese_tokenizer_path} \
    23. --dataset_dir ${dataset_dir} \
    24. --per_device_train_batch_size ${per_device_train_batch_size} \
    25. --per_device_eval_batch_size ${per_device_eval_batch_size} \
    26. --do_train \
    27. --do_eval \
    28. --seed $RANDOM \
    29. --fp16 \
    30. --num_train_epochs 1 \
    31. --lr_scheduler_type cosine \
    32. --learning_rate ${lr} \
    33. --warmup_ratio 0.03 \
    34. --weight_decay 0 \
    35. --logging_strategy steps \
    36. --logging_steps 10 \
    37. --save_strategy steps \
    38. --save_total_limit 3 \
    39. --evaluation_strategy steps \
    40. --eval_steps 100 \
    41. --save_steps 200 \
    42. --gradient_accumulation_steps ${gradient_accumulation_steps} \
    43. --preprocessing_num_workers 8 \
    44. --max_seq_length ${max_seq_length} \
    45. --output_dir ${output_dir} \
    46. --overwrite_output_dir \
    47. --ddp_timeout 30000 \
    48. --logging_first_step True \
    49. --lora_rank ${lora_rank} \
    50. --lora_alpha ${lora_alpha} \
    51. --trainable ${lora_trainable} \
    52. --lora_dropout ${lora_dropout} \
    53. --modules_to_save ${modules_to_save} \
    54. --torch_dtype float16 \
    55. --validation_file ${validation_file} \
    56. --load_in_kbits 16 \
    57. --gradient_checkpointing \
    58. --ddp_find_unused_parameters False

    run_clm_sft_with_peft.py  添加如下两行:

    为了测试,对数据进行了sample

    1. # coding=utf-8
    2. import json
    3. with open("alpaca_data_zh_51k.json", encoding="UTF-8") as f:
    4. data = json.load(f)
    5. print(len(data))
    6. print(data[0])
    7. import random
    8. # 设置要划分的测试集大小
    9. sample_size = int(0.1 * (len(data)))
    10. # 随机选择测试集的元素
    11. sample_set = random.sample(data, sample_size)
    12. data = sample_set
    13. # 设置要划分的测试集大小
    14. test_size = int(0.1 * (len(data)))
    15. # 随机选择测试集的元素
    16. test_set = random.sample(data, test_size)
    17. # 构建训练集,即剩下的元素
    18. train_set = [x for x in data if x not in test_set]
    19. print("训练集:", len(train_set))
    20. print("测试集:", len(test_set))
    21. with open("train/train.json", "w", encoding="UTF-8") as f:
    22. json.dump(train_set, f, indent=2, ensure_ascii=False)
    23. with open("valid/test.json", "w", encoding="UTF-8") as f:
    24. json.dump(test_set, f, indent=2, ensure_ascii=False)

    运行后输出:

    中文LLaMA&Alpaca大语言模型词表扩充+预训练+指令精调 - 知乎 (zhihu.com)

  • 相关阅读:
    【无标题】
    java毕业生设计大学生学籍管理系统计算机源码+系统+mysql+调试部署+lw
    Spring Boot+Vue3前后端分离实战wiki知识库系统之Vue3 + Vue CLI 项目搭建
    【区分vue2和vue3下的elementUI和elementUI Plus的container组件,介绍如何安装,属性,事件,方法等以及使用案例】
    C++学习:类的使用--运算符重载
    webserver 同步 I/O 模拟 Proactor 模式的工作流程
    【英雄哥七月集训】第 21天:无限集中的最小数字
    jQuery:jQuery笔记1
    C++ virtual destructor
    宇宙的尽头是编制?七成毕业生进体制,清北2021届学子就业报告出炉
  • 原文地址:https://blog.csdn.net/zwqjoy/article/details/132919940