THU 【通览一百个大模型】GLM( 三 )


如需要使用多轮对话数据对模型进行微调 , 可以提供聊天历史 , 例如以下是一个三轮对话的训练数据:
{“”: “长城h3风扇不转 。继电器好的 。保险丝好的传感器新的风扇也新的这是为什么 。就是继电器缺一个信号线”, “”: “用电脑能读数据流吗?水温多少”, “”: []}
{“”: “95”, “”: “上下水管温差怎么样啊?空气是不是都排干净了呢?”, “”: [[“长城h3风扇不转 。继电器好的 。保险丝好的传感器新的风扇也新的这是为什么 。就是继电器缺一个信号线”, “用电脑能读数据流吗?水温多少”]]}
{“”: “是的 。上下水管都好的”, “”: “那就要检查线路了 , 一般风扇继电器是由电脑控制吸合的 , 如果电路存在断路 , 或者电脑坏了的话会出现继电器不吸合的情况!”, “”: [[“长城h3风扇不转 。继电器好的 。保险丝好的传感器新的风扇也新的这是为什么 。就是继电器缺一个信号线”, “用电脑能读数据流吗?水温多少”], [“95”, “上下水管温差怎么样啊?空气是不是都排干净了呢?”]]}
训练时需要指定 -- 为数据中聊天历史的 key(在此例子中是 ) , 将自动把聊天历史拼接 。要注意超过输入长度的内容会被截断 。
开始训练时执行以下脚本:
bash .sh
(2)基于LoRA的参数有效性训练
其他开源项目实现了基于LoRA训练 , 例如:
目前这两个项目还在和中 。这些项目的实现思路是基于开发了简单的数据加载和微调代码 , 并直接从上加载-6B模型 。
模型部署模型量化
默认情况下 , 模型以 FP16 精度加载 , 运行上述代码需要大概 13GB 显存 。如果你的 GPU 显存有限 , 可以尝试以量化方式加载模型 , 使用方法如下:
# 按需修改 , 目前只支持 4/8 bit 量化 model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).quantize(8).half().cuda()
进行 2 至 3 轮对话后 , 8-bit 量化下 GPU 显存占用约为 10GB , 4-bit 量化下仅需 6GB 占用 。随着对话轮数的增多 , 对应消耗显存也随之增长 , 由于采用了相对位置编码 , 理论上 -6B 支持无限长的 - , 但总长度超过 2048(训练长度)后性能会逐渐下降 。
模型量化会带来一定的性能损失 , 经过测试 , -6B 在 4-bit 量化下仍然能够进行自然流畅的生成 。使用 GPT-Q 等量化方案可以进一步压缩量化精度/提升相同量化精度下的模型性能 , 欢迎大家提出对应的 Pull。
量化过程需要在内存中首先加载 FP16 格式的模型 , 消耗大概 13GB 的内存 。如果你的内存不足的话 , 可以直接加载量化后的模型 , INT4 量化后的模型仅需大概 5.2GB 的内存:
# INT8 量化的模型将"THUDM/chatglm-6b-int4"改为"THUDM/chatglm-6b-int8" model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().cuda()
量化模型的参数文件也可以从这里手动下载 。
CPU 部署
如果你没有 GPU 硬件的话 , 也可以在 CPU 上进行推理 , 但是推理速度会更慢 。使用方法如下(需要大概 32GB 内存)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).float()
如果你的内存不足 , 可以直接加载量化后的模型: