机票特价网站建设,学做网站的学校,微信微网站是什么,个人电影网站备案GPT实战系列-ChatGLM2模型的微调训练参数解读 目录 GPT实战系列-ChatGLM2模型的微调训练参数解读ChatGLM2模型1、P-Tuning模型微调2、微调训练配置参数train.sh中配置参数训练配置信息模型配置信息附录#xff1a;训练正常运行打印信息 ChatGLM2模型
ChatGLM-6B是开源的文本生…GPT实战系列-ChatGLM2模型的微调训练参数解读 目录 GPT实战系列-ChatGLM2模型的微调训练参数解读ChatGLM2模型1、P-Tuning模型微调2、微调训练配置参数train.sh中配置参数训练配置信息模型配置信息附录训练正常运行打印信息 ChatGLM2模型
ChatGLM-6B是开源的文本生成式对话模型基于General Language Model(GLM)框架具有62亿参数FP16 半精度下ChatGLM-6B 需要 13GB 左右的显存进行推理。
ChatGLM-6B另一个突出优点是 可以部署在消费级显卡上结合模型蒸馏技术和模型量化技术可以进一步降低到 10GBINT8 和 6GBINT4。实测在2080ti显卡预测上(INT4)显存占用6G左右。
1、P-Tuning模型微调
P-Tuning的全称是Prefix-tuning,意为“前缀调优”。它通过在模型输入前添加小段Discrete prompt(类似填空句),并只优化这个prompt来实现模型微调。P-tuning-v2是基于Prompt-tuning方法的NLP模型微调技术。总体来说,P-tuning-v2是Prompt tuning技术的升级版本,使得Prompt的表示能力更强,应用也更灵活广泛。它被认为是Prompt tuning类方法中效果最优且易用性最好的版本。
代码实现对于 ChatGLM2-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%再通过模型量化、Gradient Checkpoint 等方法预测最低只需要 7GB 显存即可运行。
将训练和测试数据解压后的 AdvertiseGen 目录放到ptuning目录下。
ChatGLM2的训练源代码https://github.com/THUDM/ChatGLM2-6B
文件目录结构
├── FAQ.md
├── MODEL_LICENSE
├── README.md 说明文档
├── README_EN.md
├── api.py
├── cli_demo.py
├── evaluation
│ ├── README.md
│ └── evaluate_ceval.py
├── openai_api.py
├── ptuning
│ ├── README.md 说明文档
│ ├── arguments.py
│ ├── deepspeed.json
│ ├── ds_train_finetune.sh
│ ├── evaluate.sh
│ ├── evaluate_finetune.sh
│ ├── main.py
│ ├── train.sh 训练脚本
│ ├── train_chat.sh
│ ├── trainer.py
│ ├── trainer_seq2seq.py
│ ├── web_demo.py
│ └── web_demo.sh 测试脚本
├── requirements.txt 环境依赖文件
├── resources
│ ├── WECHAT.md
│ ├── cli-demo.png
│ ├── knowledge.png
│ ├── long-context.png
│ ├── math.png
│ ├── web-demo.gif
│ ├── web-demo2.gif
│ └── wechat.jpg
├── utils.py
├── web_demo.py
└── web_demo2.py2、微调训练配置参数
训练之前需要根据自己的训练需求训练数据和机器配置情况修改配置参数。
train.sh中配置参数
PRE_SEQ_LEN128 # soft prompt 长度
LR2e-2 # 训练学习率
NUM_GPUS2 # GPU卡的数量torchrun --standalone --nnodes1 --nproc-per-node$NUM_GPUS main.py \--do_train \ # 执行训练功能还可以执行评估功能--train_file AdvertiseGen/train.json \ # 训练文件目录--validation_file AdvertiseGen/fval.json \ # 验证文件目录--prompt_column content \ # 训练集中prompt提示名称对应训练文件测试文件的content--response_column summary \ # 训练集中答案名称对应训练文件测试文件的summary--overwrite_cache \ # 缓存重复训练一次的时候可删除--model_name_or_path THUDM/chatglm-6b \ # 加载模型文件目录也可修改为本地模型的路径--output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \ # 保存训练模型文件目录--overwrite_output_dir \ # 覆盖训练文件目录--max_source_length 64 \ # 最大输入文本的长度--max_target_length 128 \--per_device_train_batch_size 1 \ # batch_size 训练批次根据显存调节--per_device_eval_batch_size 1 \ # 验证批次--gradient_accumulation_steps 16 \ # 梯度累加的步数--predict_with_generate \--max_steps 3000 \ # 最大训练模型的步数--logging_steps 10 \ # 多少步打印日志一次--save_steps 1000 \ # 多少步保存模型一次--learning_rate $LR \ # 学习率--pre_seq_len $PRE_SEQ_LEN \--quantization_bit 4 # 量化也可修改为int8训练配置参数具体解释
# 长度和 学习率
–PRE_SEQ_LEN 是 soft prompt 长度可以进行调节以取得最佳的效果。
–LR 是训练的学习率
# 本地数据训练集和测试集的路径 –train_file AdvertiseGen/train.json –validation_file AdvertiseGen/dev.json \
# 模型目录。 如果你想要从本地加载模型可以将THUDM/chatglm2-6b 改为你本地的模型路径。
–model_name_or_path THUDM/chatglm-6b
# 最大训练步数 –max_steps 3000
# 模型量化可通过调整 quantization_bit 来被原始模型的量化等级不加此选项则为 FP16 精度加载。在默认配置 quantization_bit4
–quantization_bit 4 # 量化也可修改为int8
# 批次迭代参数在默认配置 per_device_train_batch_size1、gradient_accumulation_steps16 下一次训练迭代会以 1 的批处理大小进行 16 次累加的前后向传播等效为 16 的总批处理大小此时最低只需 6.7G 显存。若想在同等批处理大小下提升训练效率可在二者乘积不变的情况下加大 per_device_train_batch_size 的值但也会带来更多的显存消耗请根据实际情况酌情调整。
–per_device_train_batch_size 1 \ # batch_size 训练批次根据显存调节 –per_device_eval_batch_size 1 \ # 验证批次 –gradient_accumulation_steps 16 \ # 梯度累加的步数
训练配置信息
执行训练脚本后训练过程中屏幕打印信息如下
***** Running training *****
Num examples 114,599Num Epochs 100 Instantaneous batch size per device 4Total train batch size (w. parallel, distributed accumulation) 16Gradient Accumulation steps 4Total optimization steps 3,000Number of trainable parameters 1,949,696这些参数是深度学习模型训练过程中的一些关键设置。
Num examples 114,599: 表示在训练集中有114,599个样本即114,599个独立的训练数据用于训练。
Num Epochs 100: 一个epoch指的是模型在训练过程中遍历整个训练集一次。因此Num Epochs 100意味着模型会遍历整个训练集100次。
Instantaneous batch size per device 4: 在深度学习中通常不会同时处理所有的训练样本而是将它们分成“批次”进行处理。每个批次的大小就是每次模型训练的样本数量。在这个例子中每个设备上的即时批量大小为4意味着每个设备一次处理4个样本。
Total train batch size (w. parallel, distributed accumulation) 16: 表示在并行、分布式和积累情况下总的训练批次大小为16。这可能意味着在多个设备上同时进行训练每个设备处理一部分批次然后把这些批次加起来总和为16。
Gradient Accumulation steps 4: 梯度累积是一种在内存不足的情况下训练大模型的技巧。它的工作原理是在进行反向传播并更新模型权重之前先计算并累积一定步数的梯度。在该例中每4个批次后进行一次权重更新。
Total optimization steps 3,000: 优化步数是模型训练过程中权重更新的总次数。在这个例子中模型权重将被更新3000次。
Number of trainable parameters 1,949,696: 这是模型中可以通过训练改变的参数的数量。深度学习模型的性能通常与其可训练参数的数量有关。但是更多的参数并不总是意味着更好的性能因为过多的参数可能导致过拟合即模型过于复杂不能很好地泛化到训练集之外的新数据。
模型配置信息
add_bias_linear: false,add_qkv_bias: true,apply_query_key_layer_scaling: true,apply_residual_connection_post_layernorm: false,architectures: [ChatGLMModel],attention_dropout: 0.0,attention_softmax_in_fp32: true,auto_map: {AutoConfig: configuration_chatglm.ChatGLMConfig,AutoModel: modeling_chatglm.ChatGLMForConditionalGeneration,AutoModelForSeq2SeqLM: modeling_chatglm.ChatGLMForConditionalGeneration},bias_dropout_fusion: true,eos_token_id: 2,ffn_hidden_size: 13696,fp32_residual_connection: false,hidden_dropout: 0.0,hidden_size: 4096,kv_channels: 128,layernorm_epsilon: 1e-05,model_type: chatglm,multi_query_attention: true,multi_query_group_num: 2,num_attention_heads: 32,num_layers: 28,original_rope: true,pad_token_id: 2,padded_vocab_size: 65024,post_layer_norm: true,quantization_bit: 0,rmsnorm: true,seq_length: 32768,tie_word_embeddings: false,torch_dtype: float16,transformers_version: 4.30.2,use_cache: true这些参数是深度学习模型配置的详细设置特别是对于ChatGLM的模型。以下是每个参数的含义
“add_bias_linear”: false: 表示是否在线性层中添加偏置项。
“add_qkv_bias”: true: 表示是否在注意力机制的查询Q、键K和值V计算中添加偏置项。
“apply_query_key_layer_scaling”: true: 表示是否对注意力机制中的查询和键进行缩放处理。
“apply_residual_connection_post_layernorm”: false: 表示是否在层归一化后应用残差连接。
“architectures”: [“ChatGLMModel”]: 表示该配置用于的模型架构。
“attention_dropout”: 0.0: 表示在注意力计算中应用的dropout的比率。Dropout是一种防止模型过拟合的技术。
“attention_softmax_in_fp32”: true: 表示是否在单精度浮点格式FP32中执行注意力机制的Softmax计算。
“auto_map”: 这部分将自动配置模型映射到ChatGLM的配置和模型。
“bias_dropout_fusion”: true: 表示是否融合偏置和dropout。这通常用于优化和提高训练速度。
“eos_token_id”: 2: 定义结束符End of Sentence的标识符。
“ffn_hidden_size”: 13696: 表示前馈神经网络Feedforward Neural NetworkFFN的隐藏层的大小。
“fp32_residual_connection”: false: 表示是否在单精度浮点格式FP32中应用残差连接。
“hidden_dropout”: 0.0: 隐藏层的dropout率。
“hidden_size”: 4096: 隐藏层的大小。
“kv_channels”: 128: 键值Key-Value的通道数。
“layernorm_epsilon”: 1e-05: 层归一化的epsilon值为了防止除数为零。
“model_type”: “chatglm”: 模型类型。
“multi_query_attention”: true: 表示是否使用多查询注意力。
“multi_query_group_num”: 2: 在多查询注意力中的查询组数。
“num_attention_heads”: 32: 注意力机制的头数。
“num_layers”: 28: 模型的层数。
“original_rope”: true: 是否使用原始的ROPE模式。
“pad_token_id”: 2: 定义填充符的标识符。
“padded_vocab_size”: 65024: 表示经过填充后的词汇表大小。
“post_layer_norm”: true: 是否在层后应用层归一化。
“quantization_bit”: 0: 表示量化的位数。
“rmsnorm”: true: 表示是否使用RMS归一化。
“seq_length”: 32768: 序列长度。
“tie_word_embeddings”: false: 是否绑定输入和输出的词嵌入。
“torch_dtype”: “float16”: 使用的数据类型这里是半精度浮点数。
“transformers_version”: “4.30.2”: 使用的Transformers库版本。
“use_cache”: true: 是否使用缓存以加快计算速度。
请注意上述是训练开始前打印信息的解释针对ChatGLM模型配置的解释。
附录训练正常运行打印信息
执行以下指令进行训练
./train.sh
当出现以下信息后模型训练迭代开始后屏幕输出如下
{loss: 3.0614, learning_rate: 0.018000000000000002, epoch: 4.21}
{loss: 2.2158, learning_rate: 0.016, epoch: 8.42}训练完成后屏幕将打印信息
***** train metrics *****epoch xxtrain_loss xxtrain_runtime xxtrain_samples xxtrain_samples_per_second xxtrain_steps_per_second xxEnd
相关文章 GPT实战系列-如何用自己数据微调ChatGLM2模型训练
GPT实战系列-ChatGLM2部署UbuntuCuda11显存24G实战方案
GPT实战系列-Baichuan2本地化部署实战方案