1. 项目概述最近在Ubuntu系统上搭建ChatGLM2-6B环境并进行P-Tuning微调训练时踩了不少坑。作为一个开源的中文大语言模型ChatGLM2-6B在中文处理方面表现优异但在实际部署和训练过程中会遇到各种问题。本文将详细记录从环境搭建到微调训练的全过程特别是那些官方文档没有提及的细节和解决方案。2. 环境准备2.1 系统选择与配置为什么选择Ubuntu而不是Windows主要原因有三点ChatGLM2-6B项目包含大量.sh脚本文件在Windows下运行需要额外配置Linux环境下CUDA支持更好驱动问题更少大多数深度学习框架在Linux下的性能表现更稳定建议使用Ubuntu 22.04 LTS版本这是目前最稳定的选择。如果不想安装双系统也可以使用Windows的WSL2子系统但需要注意WSL2对GPU的支持需要额外配置。2.2 硬件要求最低配置要求CPU至少4核内存16GB以上显卡NVIDIA GPU至少8GB显存RTX 3060及以上实测中RTX 40608GB显存可以流畅运行基础推理和微调训练。如果没有独立显卡纯CPU环境也能运行但性能极差仅适合测试用途。3. CUDA环境安装3.1 驱动安装避坑指南网上大多数教程都建议手动下载CUDA Toolkit安装但这种方法在Ubuntu 22.04上容易导致系统崩溃。更稳妥的方法是打开软件和更新切换到附加驱动标签页选择专有驱动非开源版本等待安装完成重要提示安装前不要随意更换软件源。国内镜像站虽然下载速度快但可能存在依赖包不全的问题导致后续安装失败。3.2 基础依赖安装在安装CUDA前先确保以下基础工具已安装sudo apt update sudo apt install -y gcc g make build-essential3.3 CUDA Toolkit安装推荐使用conda管理CUDA环境conda install -c nvidia cuda-toolkit11.8选择11.8版本是因为它目前与PyTorch的兼容性最好。安装完成后验证nvcc --version nvidia-smi3.4 cuDNN安装cuDNN是NVIDIA提供的深度学习加速库conda install -c nvidia cudnn8.6.04. ChatGLM2-6B环境搭建4.1 创建conda环境conda create -n chatglm python3.9 conda activate chatglm4.2 安装PyTorch选择与CUDA 11.8兼容的版本pip install torch2.0.1cu118 torchvision0.15.2cu118 torchaudio2.0.2 --extra-index-url https://download.pytorch.org/whl/cu1184.3 安装ChatGLM依赖git clone https://github.com/THUDM/ChatGLM2-6B cd ChatGLM2-6B pip install -r requirements.txt4.4 模型下载可以从Hugging Face下载预训练模型git lfs install git clone https://huggingface.co/THUDM/chatglm2-6b如果网络不稳定可以使用国内镜像源。5. P-Tuning微调实战5.1 准备训练数据以AdvertiseGen数据集为例格式要求为JSON{ content: 输入文本, summary: 期望输出 }5.2 微调参数配置关键参数说明PRE_SEQ_LEN前缀序列长度影响模型记忆能力LR学习率决定训练速度和质量quantization_bit量化位数降低显存占用示例启动命令PRE_SEQ_LEN128 LR2e-2 NUM_GPUS1 torchrun --standalone --nnodes1 --nproc-per-node$NUM_GPUS main.py \ --do_train \ --train_file AdvertiseGen/train.json \ --validation_file AdvertiseGen/dev.json \ --preprocessing_num_workers 10 \ --prompt_column content \ --response_column summary \ --overwrite_cache \ --model_name_or_path ./chatglm2-6b \ --output_dir ./output/adgen-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \ --overwrite_output_dir \ --max_source_length 64 \ --max_target_length 128 \ --per_device_train_batch_size 1 \ --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 85.3 训练监控推荐使用nvitop监控GPU状态conda install -c conda-forge nvitop nvitop6. 常见问题与解决方案6.1 训练后通用能力下降现象微调后模型在专业领域表现提升但通用对话能力下降。解决方案在训练数据中混入通用对话样本降低学习率尝试1e-3到5e-3减少训练步数6.2 显存不足问题解决方法降低batch size使用梯度累积gradient_accumulation_steps启用8bit或4bit量化6.3 训练速度慢优化建议增加gradient_accumulation_steps使用更大的batch size检查CUDA和cuDNN版本是否匹配7. 性能优化技巧7.1 混合精度训练在启动命令中添加--fp167.2 梯度检查点减少显存占用--gradient_checkpointing7.3 数据预处理优化使用多线程预处理--preprocessing_num_workers 88. 训练结果评估典型的训练日志如下{ epoch: 0.42, train_loss: 3.3751344401041665, train_runtime: 54080.5566, train_samples: 114599, train_samples_per_second: 0.888, train_steps_per_second: 0.055 }关键指标解读train_loss训练损失值越低越好train_samples_per_second每秒处理的样本数train_steps_per_second每秒完成的训练步数9. 模型部署与应用9.1 加载微调后的模型from transformers import AutoTokenizer, AutoModel tokenizer AutoTokenizer.from_pretrained(output/adgen-chatglm2-6b-pt-128-2e-2, trust_remote_codeTrue) model AutoModel.from_pretrained(output/adgen-chatglm2-6b-pt-128-2e-2, trust_remote_codeTrue).cuda()9.2 Web Demo部署python web_demo.py --model-path output/adgen-chatglm2-6b-pt-128-2e-210. 经验总结在实际微调过程中最大的挑战是平衡专业能力和通用能力。建议采取以下策略训练数据中保持30%的通用对话样本学习率不宜过大建议2e-3到5e-3定期在验证集上测试通用对话能力使用早停机制防止过拟合另一个重要发现是量化虽然能降低显存占用但会轻微影响模型性能。如果显存充足建议使用16bit或32bit精度训练。