ChatGLM2介绍

ChatGLM2-6B源码地址:https://github.com/THUDM/ChatGLM2-6B

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:

1、更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
2、更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。
3、更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
4、更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。如果您发现我们的开源模型对您的业务有用,我们欢迎您对下一代模型 ChatGLM3 研发的捐赠。

博主个人体验,本次chatglm2-6b相较于chatglm1有质的提升,很多情况下不像1代乱说,错误表述了。而且很明显的一点,对话推理速度更快,对话长度更长。

Rola微调

系统环境

内存:1.5T (40G左右就够用了)
GPU:8 * 2080TI
CUDA:11.7 (原12.2,版本太高,进行了降低版本处理,下文有介绍)

获取项目

Respect @ssbuild

git clone https://github.com/ssbuild/chatglm2_finetuning.git)

环境安装

  • 安装chatglm2-6b的环境requirements.txt
protobuf
transformers==4.30.2
cpm_kernels
torch>=2.0
gradio
mdtex2html
sentencepiece
accelerate
  • 安装Lora微调的环境requirements.txt
deep_training>=0.1.10,<0.1.12
cpm_kernels
transformers>=4.30
deepspeed
bitsandbytes>=0.39
accelerate>=0.20
bitsandbytes
cchardet
  • 当前还有一个安装包需要额外安装:deep_training,这个包需要通过源码安装:
git clone https://github.com/ssbuild/deep_training.git
cd deep_training
pip install .

配置微调参数

参数修改:

config/constant_map.py

修改模型路径,如下图:

【AIGC】ChatGlm2-Lora微调-LMLPHP

config/main.py

使用lora微调,设置为True,enable_int4 = True 使用int4加载,会减少一些显存的占用。

【AIGC】ChatGlm2-Lora微调-LMLPHP

config/sft_config_lora.py

配置gpu占用:

【AIGC】ChatGlm2-Lora微调-LMLPHP

适当修改batch_size,防止显存溢出,自由设定:

【AIGC】ChatGlm2-Lora微调-LMLPHP

适当修改max_seq_length 防止显存溢出,自由设定:

【AIGC】ChatGlm2-Lora微调-LMLPHP

微调训练

执行 main.py 入口文件:

python train.py
Epoch 99: 100%|████████████| 38/38 [00:14<00:00,  2.71it/s, v_num=4, loss=3.830]INFO:lightning_fabric.utilities.rank_zero:`Trainer.fit` stopped: `max_epochs=100` reached.
Epoch 99: 100%|████████████| 38/38 [00:14<00:00,  2.70it/s, v_num=4, loss=3.830]

【AIGC】ChatGlm2-Lora微调-LMLPHP

预训练模型位置:

./best_ckpt

【AIGC】ChatGlm2-Lora微调-LMLPHP

模型测试

python infer_lora_finetuning.py

报错解决

1、报错:

.conda/envs/gf_python38/lib/python3.8/site-packages/bitsandbytes/libbitsandbytes_cpu.so: undefined symbol: cquantize_blockwise_fp16_nf4

出现问题原因:
libbitsandbytes_cpu 版本不对导致的
解决:

在目录.conda/envs/gf_python38/lib/python3.8/site-packages/bitsandbytes,用自己的cuda版本.so 覆盖libbitsandbytes_cpu.so
即:cp libbitsandbytes_cuda117.so libbitsandbytes_cpu.so

博主问题更严重,博主GPU驱动cuda版本为12.2,而且在当前目录中没有12.2的版本。而且pytorch我看也没有支持12.2这么新的cuda,所以果断降了一次版本,重新安装cuda11.7。
cuda版本选择
cuda安装地址
【AIGC】ChatGlm2-Lora微调-LMLPHP

wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-rhel7-11-7-local-11.7.0_515.43.04-1.x86_64.rpm
sudo rpm -i cuda-repo-rhel7-11-7-local-11.7.0_515.43.04-1.x86_64.rpm
sudo yum clean all
sudo yum -y install nvidia-driver-latest-dkms cuda
sudo yum -y install cuda-drivers

可以使用nvidia-smi进行测试,查看cuda版本是否更新,如果报错,请重启reboot

报错内容如下,需要重启:

(python38) -bash-4.2$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.43.04    Driver Version: 515.43.04    CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:5A:00.0 Off |                  N/A |
| 28%   37C    P0    63W / 250W |      0MiB / 11264MiB |      0%      Default |
|                               |                      |                  N/A |

06-29 20:23