ChatGLM-6B:自定义数据集和模型微调!

 Datawhale干货 

开源:ChatGLM,编辑:Coggle数据科学

ChatGLM-6B介绍

ChatGLM-6B是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM)架构,具有 62 亿参数。

具体代码和权重可以从👇获取:

https://github.com/THUDM/ChatGLM-6B/
https://huggingface.co/THUDM/chatglm-6b

ChatGLM-6B拥有不同版本,暂时来看是由权重保存不同格式带来区别,但对模型的效果应该没有影响。

量化等级最低 GPU 显存(推理)最低 GPU 显存(高效参数微调)
FP16(无量化)13 GB14 GB
INT88 GB9 GB
INT46 GB7 GB

ChatGLM-6B 自定义数据集

https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning

ChatGLM-6B需要将数据集定义句子对的形式。这里的需要考虑下游任务,以及prompt的构造案例。

下面为从关键字到句子的案例:

{
    "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳",
    "summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。"
}

如果需要进行多轮对话,则需要考虑到上下对话,汇总在history中:

{
  "prompt": "长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", 
  "response": "用电脑能读数据流吗?水温多少", 
  "history": []
}

{
  "prompt": "95", 
  "response": 
  "上下水管温差怎么样啊?空气是不是都排干净了呢?", 
  "history": [["长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", "用电脑能读数据流吗?水温多少"]]
}

ChatGLM-6B 微调过程

https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning

在训练过程设置自定义的数据集路径,然后也需要设置如下的超参数。

pre_seq_len=128
learning_rate=2e-2
quantization_bit=4
per_device_train_batch_size=16
gradient_accumulation_steps=1

PRE_SEQ_LENLR分别是 soft prompt 长度和训练的学习率,可以进行调节以取得最佳的效果。

P-Tuning-v2 方法会冻结全部的模型参数,可通过调整 quantization_bit 来被原始模型的量化等级。

ChatGLM-6B 加载并预测

当模型训练完成,接下来就可以加载模型并进行预测。加载的代码如下:

from transformers import AutoConfig, AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)

config = AutoConfig.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True, pre_seq_len=128)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", config=config, trust_remote_code=True)
# 自定义训练得到模型的路径
prefix_state_dict = torch.load(os.path.join(CHECKPOINT_PATH, "pytorch_model.bin"))
new_prefix_state_dict = {}
for k, v in prefix_state_dict.items():
    if k.startswith("transformer.prefix_encoder."):
        new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v

model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)

如果需要加载的是旧 Checkpoint(包含ChatGLM-6B以及 PrefixEncoder 参数),或者进行的是全参数微调,则直接加载整个 Checkpoint:

model = AutoModel.from_pretrained(CHECKPOINT_PATH, trust_remote_code=True)

之后可以进行量化,也可以直接使用:

# Comment out the following line if you don't use quantization
model = model.quantize(4)
model = model.half().cuda()
model.transformer.prefix_encoder.float()
model = model.eval()

response, history = model.chat(tokenizer, "你好", history=[])

38a6c9b8bac572097fc975129f681ef0.png
一起“赞”三连

### 对 ChatGLM-6B` 进行微调的操作者来说,具体实现方法依赖于所选的技术路径。一种常见的做法是在特定的任务上应用 P-Tuning v2 技术来调整模型参数。 #### 修改训练脚本中的模型路径 当准备从本地加载模型而非远程仓库时,在训练脚本 `train.sh` 文件内需修改默认的模型下载地址为本地存储位置: ```bash model_name_or_path=/path/to/local/model/directory ``` 这一步骤确保了后续操作可以直接利用已有的预训练权重文件而无需再次网络获取[^1]。 #### 使用 Hugging Face 库加载并初始化基础模型 通过 Python 脚本可以更灵活地控制整个过程。下面是一个简单的例子展示如何使用 `transformers` 库加载指定版本的基础模型实例,并设置必要的配置选项以便支持自定义逻辑执行: ```python from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( "THUDM/chatglm-6b", config=model_config, trust_remote_code=True ) ``` 这段代码片段展示了如何基于给定名称或路径加载一个预训练的语言模型及其对应的分词器工具集。特别注意这里的 `trust_remote_code=True` 参数允许程序安全地解析来自外部源码包内的特殊组件[^3]。 #### 准备用于微调数据集 针对具体的下游任务(比如医疗领域问答),收集整理高质量标注样本至关重要。这些数据应该被转换成适合输入到上述构建好的框架结构的形式——通常是经过编码处理后的 token ID 数组列表加上相应的标签信息。此部分工作可能涉及文本清理、格式标准化以及特征工程等多个环节[^2]。 #### 实施微调流程 完成以上准备工作之后就可以正式进入实际的参数更新阶段了。通常情况下会采用迁移学习策略,即冻结大部分原有层不变只优化新增加的部分;或者是全量Fine-tune模式下适当降低学习率以防止破坏已经学到的知识表示。此外还可以考虑引入正则化手段如Dropout等措施帮助缓解过拟合风险。 最后提醒一点就是一定要保存好每次迭代结束后的最佳状态点作为最终成果输出!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值