ChatGLM模型微调技术详解:从Freeze到全参数训练的全面指南

Ray

ChatGLM模型微调技术详解:从Freeze到全参数训练的全面指南

随着ChatGLM系列大型语言模型的不断发展,如何有效地对这些模型进行微调以适应特定任务已成为一个重要课题。本文将深入探讨ChatGLM、ChatGLM2和ChatGLM3模型的多种微调技术,包括Freeze方法、P-Tuning方法、LoRA方法以及全参数训练方法,为开发者提供全面的微调指南。

Freeze方法:冻结部分参数实现高效微调

Freeze方法是一种简单而有效的微调技术,其核心思想是冻结原始模型的部分参数,仅训练剩余的参数。这种方法可以在单卡或多卡环境下,无需进行张量并行(TP)或流水线并行(PP)操作就能对大模型进行训练。

实现Freeze方法的核心代码如下:

freeze_module_name = args.freeze_module_name.split(",")
for name, param in model.named_parameters():
    if not any(nd in name for nd in freeze_module_name):
        param.requires_grad = False

通过修改freeze_module_name参数,可以灵活地控制模型的哪些层参数被冻结。例如,可以设置为"layers.27.,layers.26.,layers.25.,layers.24."来冻结模型的最后四层。

对于ChatGLM模型,单卡训练的命令示例如下:

CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
                --train_path data/spo_0.json \
                --model_name_or_path ChatGLM-6B/ \
                --per_device_train_batch_size 1 \
                --max_len 1560 \
                --max_src_len 1024 \
                --learning_rate 1e-4 \
                --weight_decay 0.1 \
                --num_train_epochs 2 \
                --gradient_accumulation_steps 4 \
                --warmup_ratio 0.1 \
                --mode glm \
                --train_type freeze \
                --freeze_module_name "layers.27.,layers.26.,layers.25.,layers.24." \
                --seed 1234 \
                --ds_file ds_zero2_no_offload.json \
                --gradient_checkpointing \
                --show_loss_step 10 \
                --output_dir ./output-glm

对于多卡训练,只需修改CUDA_VISIBLE_DEVICES参数即可。ChatGLM2和ChatGLM3的训练命令类似,只需将mode参数分别改为glm2glm3

P-Tuning方法:软提示微调的优化

P-Tuning是一种针对大模型的软提示(soft-prompt)微调方法。它分为两个版本:

  1. P-Tuning:仅在大模型的Embedding层加入新的参数。
  2. P-Tuning-V2:在大模型的Embedding层和每一层前都加上新的参数。

P-Tuning方法示意图

实现P-Tuning方法的核心代码如下:

config = MODE[args.mode]["config"].from_pretrained(args.model_name_or_path)
config.pre_seq_len = args.pre_seq_len
config.prefix_projection = args.prefix_projection
model = MODE[args.mode]["model"].from_pretrained(args.model_name_or_path, config=config)
for name, param in model.named_parameters():
    if not any(nd in name for nd in ["prefix_encoder"]):
        param.requires_grad = False

prefix_projection为True时,使用P-Tuning-V2方法;为False时,使用P-Tuning方法。

对于ChatGLM模型,单卡训练的命令示例如下:

CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
                --train_path data/spo_0.json \
                --model_name_or_path ChatGLM-6B \
                --per_device_train_batch_size 1 \
                --max_len 768 \
                --max_src_len 512 \
                --learning_rate 1e-4 \
                --weight_decay 0.1 \
                --num_train_epochs 2 \
                --gradient_accumulation_steps 4 \
                --warmup_ratio 0.1 \
                --mode glm \
                --train_type ptuning \
                --seed 1234 \
                --ds_file ds_zero2_no_offload.json \
                --gradient_checkpointing \
                --show_loss_step 10 \
                --pre_seq_len 16 \
                --prefix_projection True \
                --output_dir ./output-glm

LoRA方法:低秩适应的高效微调

LoRA (Low-Rank Adaptation) 方法是一种在大型语言模型上并行增加额外低秩矩阵的微调技术。在训练过程中,仅训练这些新增的低秩矩阵参数。当"秩值"远小于原始参数维度时,新增的低秩矩阵参数量也就很小,从而实现高效微调。

LoRA方法示意图

实现LoRA方法的核心代码如下:

model = MODE[args.mode]["model"].from_pretrained(args.model_name_or_path)
lora_module_name = args.lora_module_name.split(",")
config = LoraConfig(r=args.lora_dim,
                    lora_alpha=args.lora_alpha,
                    target_modules=lora_module_name,
                    lora_dropout=args.lora_dropout,
                    bias="none",
                    task_type="CAUSAL_LM",
                    inference_mode=False,
                    )
model = get_peft_model(model, config)
model.config.torch_dtype = torch.float32

对于ChatGLM模型,单卡训练的命令示例如下:

CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
              --train_path data/spo_0.json \
              --model_name_or_path ChatGLM-6B \
              --per_device_train_batch_size 1 \
              --max_len 1560 \
              --max_src_len 1024 \
              --learning_rate 1e-4 \
              --weight_decay 0.1 \
              --num_train_epochs 2 \
              --gradient_accumulation_steps 4 \
              --warmup_ratio 0.1 \
              --mode glm \
              --train_type lora \
              --lora_dim 16 \
              --lora_alpha 64 \
              --lora_dropout 0.1 \
              --lora_module_name "query_key_value" \
              --seed 1234 \
              --ds_file ds_zero2_no_offload.json \
              --gradient_checkpointing \
              --show_loss_step 10 \
              --output_dir ./output-glm

需要注意的是,LoRA方法在模型保存时仅保存了LoRA训练参数,因此在模型预测时需要将模型参数进行合并。

全参数训练方法:借助DeepSpeed实现大规模微调

全参数训练方法对大模型进行全量参数训练,主要借助DeepSpeed-Zero3方法对模型参数进行多卡分割,并利用Offload方法将优化器参数卸载到CPU上以解决显存不足的问题。

实现全参数训练的核心代码非常简单:

model = MODE[args.mode]["model"].from_pretrained(args.model_name_or_path)

对于ChatGLM模型,四卡训练的命令示例如下:

CUDA_VISIBLE_DEVICES=0,1,2,3 deepspeed --master_port 520 train.py \
              --train_path data/spo_0.json \
              --model_name_or_path ChatGLM-6B \
              --per_device_train_batch_size 1 \
              --max_len 1560 \
              --max_src_len 1024 \
              --learning_rate 1e-4 \
              --weight_decay 0.1 \
              --num_train_epochs 2 \
              --gradient_accumulation_steps 4 \
              --warmup_ratio 0.1 \
              --mode glm \
              --train_type all \
              --seed 1234 \
              --ds_file ds_zero3_offload.json \
              --gradient_checkpointing \
              --show_loss_step 10 \
              --output_dir ./output-glm

显存占用分析

不同的微调方法和模型版本对显存的占用有显著差异。以下是一些典型配置的显存占用情况:

模型DeepSpeed-StageOffloadGradient CheckpointingBatch SizeMax LengthGPU数量显存占用
ChatGLM (Freeze)zero2NoYes11560136G
ChatGLM2 (Freeze)zero2NoYes11560135G
ChatGLM (P-Tuning)zero2NoYes1768143G
ChatGLM2 (P-Tuning)zero2NoYes11560120G
ChatGLM (LoRA)zero2NoYes11560120G
ChatGLM2 (LoRA)zero2NoYes11560120G
ChatGLM (全参数)zero3YesYes11560433G
ChatGLM2 (全参数)zero3YesYes11560426G

从上表可以看出,LoRA方法在保持较好性能的同时,显存占用最小。而全参数训练方法虽然能够充分发挥模型潜力,但对硬件要求较高。

结语

本文详细介绍了ChatGLM系列模型的多种微调技术,包括Freeze、P-Tuning、LoRA和全参数训练方法。每种方法都有其独特的优势和适用场景,开发者可以根据自己的硬件条件和任务需求选择合适的微调策略。

值得注意的是,虽然这些微调技术能够有效提升模型在特定任务上的性能,但在实际应用中仍需谨慎。特别是在处理敏感领域(如医疗、法律等)的任务时,必须对模型输出进行严格的验证和人工审核。

随着ChatGLM模型的不断更新和微调技术的持续发展,我们期待看到更多创新的应用场景和更高效的微调方法。开发者们可以基于本文提供的代码示例和指南,进一步探索和优化ChatGLM模型在各种下游任务中的表现。

最后,希望本文能为广大NLP从业者和研究人员提供有价值的参考,推动ChatGLM等大型语言模型在更多领域发挥其强大的能力。让我们共同期待人工智能技术带来的无限可能! 🚀🔬💡

avatar
0
0
0
相关项目
Project Cover

LangChain-ChatGLM-Webui

LangChain-ChatGLM-Webui 是一个利用LangChain和ChatGLM-6B系列模型的Web界面,支持txt、docx、md、pdf等格式文件上传,适用于本地知识驱动的大模型应用。项目支持HuggingFace、OpenXLab等多个平台的在线体验,适合开发者快速部署多种大语言模型和嵌入模型。

Project Cover

selfhostedAI

selfhostedAI是兼容OpenAI接口的自托管AI项目,支持多种开源模型如RWKV、ChatGLM 6B和llama.cpp,以及绘画模型stable-diffusion-webui。项目提供一键安装程序和详细教程,可在本地或云端运行,实现文本生成、对话及绘画功能。此外,还集成了text-generation-webui和Wenda,简化安装和配置流程。

Project Cover

CreativeChatGLM

CreativeChatGLM是一个创新的AI对话生成工具,用户可以通过续写和修订功能产生量身定制的创意内容。该项目提供多种环境配置方案,无论是开发者还是非技术人员,都能快速启动使用。离线包选项适应不同的硬件需求,使用户可以在任何网络状况下,即插即用地开始创作。支持续写和修订对话,增强对话内容的个性化和创新性。

Project Cover

Digital-Life-DL-B

DL-B是一个开源的数字形象解决方案,结合了ChatGLM、Wav2lip和so-vits-svc技术。目前,项目正处于比赛阶段,计划在比赛结束后发布优化版及详细代码。硬件需求为RTX 3060显卡和Intel i5-12400F CPU,系统环境为Python 3.9.13。未来项目将由AI学社负责,致力于用户友好框架的开发。诚邀技术爱好者提供优化建议并参与完善项目。

Project Cover

langchain-learning

介绍LangChain学习笔记,包括数据连接、模型IO、代理和内存等核心组件的使用。提供中英文示例,解析LangChain与ChatGPT和ChatGLM的兼容性,并介绍基于LangChain的复杂任务解决方案。探讨LangChain的问题与限制,并提供领域微调、工具链整合和检索优化的方法,帮助深入理解和应用LangChain技术。

Project Cover

chatglm.cpp

ChatGLM.cpp 是一个使用C++实现的实时聊天项目,支持ChatGLM-6B、ChatGLM2-6B、ChatGLM3和GLM-4模型,兼容多种硬件和操作系统。项目通过int4/int8量化、优化的KV缓存和并行计算技术,实现了高效的CPU推理,并支持P-Tuning v2和LoRA微调模型。该项目还提供Python绑定、网络演示和API服务器,扩展了使用场景,适用于高效实时聊天。

Project Cover

ChatGLM-Efficient-Tuning

ChatGLM-Efficient-Tuning项目提供高效微调ChatGLM-6B模型的工具和方法,支持LoRA、P-Tuning V2等多种微调方式,适用于单GPU和多GPU训练。项目还提供Web UI和CLI操作,支持4-bit和8-bit量化训练。通过丰富的数据集和功能,如强化学习和模型评估,满足不同场景的微调需求。详情请参见项目Wiki。

Project Cover

awesome-LLMs-In-China

这个项目系统收录了中国AI大模型的详细信息,涵盖机构、来源和分类等。通过持续更新,记录各类大模型的发展动态,包括百度文心一言、阿里通义千问等知名通用模型,以及医疗、金融等专业领域模型。项目还提供评测数据集和开源基础模型列表,为研究中国AI发展提供全面参考。

Project Cover

智谱清言

智谱清言是基于GLM大模型开发的先进对话平台,提供千亿参数AI语言模型。支持多轮对话,具备内容创作和信息归纳总结能力。平台提供Web界面和移动应用,方便用户与AI系统交互。作为中国版ChatGPT和中国版GPT-3类产品,智谱清言展现了中国在大规模语言模型和AI对话系统领域的技术实力。

最新项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号