大模型微调实践:ChatGLM-6B全参数微调

栏目:教育教学  时间:2023-07-11
手机版

  ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有62亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需6GB显存)。

  ChatGLM-6B 是一个文本生成式对话模型,可以用于问答、闲聊等多种场景。它是由清华大学自然语言处理与社会人文计算实验室(THUNLP)开发的。

  ChatGLM-6B 初具中文问答和对话功能,并支持在单张 2080Ti 上进行推理使用。具体来说,ChatGLM-6B 有如下特点:

  充分的中英双语预训练: ChatGLM-6B 在 1:1 比例的中英语料上训练了 1T 的 token 量,兼具双语能力。优化的模型架构和大小: 吸取 GLM-130B 训练经验,修正了二维 RoPE 位置编码实现,使用传统 FFN 结构。6B(62亿)的参数大小,也使得研究者和个人开发者自己微调和部署 ChatGLM-6B 成为可能。较低的部署门槛: FP16 半精度下,ChatGLM-6B 需要至少 13GB 的显存进行推理,结合模型量化技术,这一需求可以进一步降低到 10GB(INT8) 和 6GB(INT4), 使得 ChatGLM-6B 可以部署在消费级显卡上。更长的序列长度: 相比 GLM-10B(序列长度1024),ChatGLM-6B 序列长度达 2048,支持更长对话和应用。人类意图对齐训练: 使用了监督微调(Supervised Fine-Tuning)、反馈自助(Feedback Bootstrap)、人类反馈强化学习(Reinforcement Learning from Human Feedback) 等方式,使模型初具理解人类指令意图的能力。输出格式为 markdown,方便展示。基础环境配置如下:

  配置项参数操作系统CentOS 7GPU8 卡 A800 80GB GPUsPython3.10NVIDIA驱动程序版本515.65.01CUDA工具包11.7NCCLnccl_2.14.3-1+cuda11.7cuDNN8.8.1.3_cuda11备注:表中是 ChatGLM-6B 全参数微调的配置,如果是 LORA 微调,单卡 A100 40GB 就可以。

  具体安装如下:

  安装cuda

  vim ~/.bashrcexport PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH安装cudnn

  sudo cp cudnn-linux-x86_64-8.8.0.121_cuda11-archive/include/cudnn*.h /usr/local/cuda/include/sudo cp cudnn-linux-x86_64-8.8.0.121_cuda11-archive/lib/libcudnn* /usr/local/cuda/lib64/sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*安装pytorch

  requirements.txtprotobuf>=3.19.5,<3.20.1transformers>=4.26.1icetkcpm_kernelsgradiopip3 install --user -r requirements.txtpip install --user torch==1.10.0+cu111 torchvision==0.11.0+cu111 torchaudio==0.10.0 -f torch-1.10.0+cu111-cp39-cp39-linux_x86_64.whl -f torchvision-0.11.0+cu111-cp39-cp39-linux_x86_64.whl -f torchaudio-0.10.0+cu111-cp39-cp39-linux_x86_64.whl下载代码:

  修改 ds_train_finetune.sh 脚本使用 DeepSpeed 进行全参数微调。

  修改 main.py 文件中的 num_train_epoch 参数(默认 num_train_epoch = 3):

  运行过程:

  GPU显存占用:

  输出文件:

  这里我们看一道简单的数学题:

  题目:小明有15颗糖,他想分成3份,每份分别分给3个小朋友,每份糖的数量相等,请问每份应该分几颗糖?ChatGLM-6B的回答如下:

  假设每份糖的数量为x颗糖,则根据题意可以列出以下方程组: 3x + 3(15 - x) = 15 其中,3x表示小明将15颗糖平均分成三份后,每份拥有的数量,而15 - x则表示小明原本拥有的糖数量。 化简第二个方程式得到: 2x = 5 解得 x = 2.5,因为每个小朋友平均需要15-2.5=12.5颗糖。 因此,每份应该分到 2.5 颗糖。这个回答明显是错误的,我们看一下微调之后的答案:

  每份5颗糖没问题,但是后面一句有点多余了。

  可以看到最后的参数:[4:28:37<4:40:51, 6.39s/it]

  也就是每次迭代需要6.39秒,对于100万的数据,需要: 1000000/16/8*6.39/3600\approx13 小时。

  其中16表示 batch size,8表示8张卡。100万的数据13小时可以微调完成。

  吃果冻不吐果冻皮:使用DeepSpeed/P-Tuning v2对ChatGLM-6B进行微调

  ChatGLM

  GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型

  最近将专栏相关内容收录在我的新书「推荐系统技术原理与实践」中,这本书系统性地整理、介绍了专栏中所有的重点内容,欢迎订阅,谢谢知友们的支持!

  《推荐系统技术原理与实践(异步图书出品)》(文亮)【摘要 书评 试读】- 京东图书

上一篇:三年级入门英语怎么学?可以试试这些方法!
下一篇:厦门美女导游带您游玩鼓浪屿旅游攻略,来一场说走就走的旅行

最近更新教育教学