ChatGLM2-6B微调过程说明文档

2023-11-28 19:15

本文主要是介绍ChatGLM2-6B微调过程说明文档,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文档:

ChatGLM2-6B 微调(初体验) - 知乎

  1. 环境配置

下载anaconda,版本是Anaconda3-2023.03-0-Linux-x86_64.sh,其对应的python版本是3.10,试过3.7和3.11版本的在运行时都报错。

执行下面的命令安装anaconda

 sh Anaconda3-2023.03-0-Linux-x86_64.sh

进入安装过程,根据提示输入即可,会自动配置好环境变量和pip等

下载代码

git clone GitHub - hiyouga/ChatGLM-Efficient-Tuning: Fine-tuning ChatGLM-6B with PEFT | 基于 PEFT 的高效 ChatGLM 微调

cd ChatGLM-Efficient-Tuning

如果服务器不能联网,可以在自己电脑上下载好,上传到服务器的对应目录

安装依赖

pip install -r requirements.txt

  1. 下载模型

从 Hugging Face Hub 下载模型实现和参数 到本地,后期使用 只需要 从本地下载即可。

git lfs install

git clone https://huggingface.co/THUDM/chatglm2-6b

  1. 知识产权数据集准备

通过ChatGPT生成问答预料文本

例如:

prompt:

根据以下内容,生成10道简答题和答案,生成的答案需要详细,知识点完整:

在电影《天下无贼》中,演员刘德华和刘若英扮演的一对夫妇开着骗得的宝马轿车驶 入别墅区大门时,保安不但没有上前询问,反而立正敬礼。刘德华扮演的男主角将车倒回, 拍着宝马车问保安: “开好车你就不问,开好车就可以随便进入,开好车就一定是好人 吗?!”这个问题令人沉思。的确,观众们需要扪心自问:人们在追求以豪车、名表和名牌 服装等为象征的奢华生活和“面子”时,是否忽视了物质外壳之下的美丽灵魂?然而,电 影中的这一幕揭示了一个现实,如 “宝马”这样的驰名商标彰显了拥有者的身份与地位, 满足了消费者的心理需求,其作用有别于普通商标。与之相适应,商标法对驰名商标提供 了特别保护。

驰名商标是指经过长期使用或大量商业推广与宣传,在市场上享有很高知名度并为相 关公众所熟知的商标。与普通商标相比,驰名商标具有以下几个特点。

首先,驰名商标在相关公众中具有很高的知名度。

将返回的数据整理成md文档,如下图

每个章节生成的问题和回答数据达到5w字以上,全部生成完成之后,将文本内容处理成json格式,python代码如下:

import json
import os
import re


def process_md(md_text):
    qa_list = []

    # 使用正则表达式分割问题和答案
    qa_pairs = re.split(r'\n\n+', md_text)

    for pair in qa_pairs:
        question_match = re.match(r'^\s*(.*)\s*答:\s*(.*?)\s*$', pair, re.DOTALL)
        if question_match:
            #question = question_match.group(1)
            question = re.sub(r'^\d+\.\s*', '', question_match.group(1)).rstrip("\n")
            answer = question_match.group(2)
            qa = {
                "content": question,
                "summary": answer
            }
            qa_list.append(qa)
    return qa_list


def main():
    input_directory = "md_files"  # 替换为包含Markdown文件的目录
    output_directory = "formatted_qa"  # 输出文件的目录


    if not os.path.exists(output_directory):
        os.makedirs(output_directory)

    output_filename = os.path.join(output_directory, "content.json")
    output_file=open(output_filename, 'w', encoding='utf-8')

    for filename in os.listdir(input_directory):
        if filename.endswith(".md"):
            with open(os.path.join(input_directory, filename), 'r', encoding='utf-8') as file:
                md_text = file.read()

            qa_list = process_md(md_text)
            json.dump(qa_list, output_file, ensure_ascii=False, indent=2)
            print(f"转换完成,结果已保存到{output_filename}")
if __name__ == "__main__":
    main()

结果文档如下:

  1. ChatGLM2-6B模型微调

命令行训练

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \

    --stage sft \

    --model_name_or_path /home/liq/zw/chatglm2/chatglm2-6b \

    --do_train \

    --dataset zscq \

    --dataset_dir ./data \

    --finetuning_type lora \

    --output_dir /home/liq/zw/data/chatglm2-6b-lora-zscq \

    --per_device_train_batch_size 1 \

    --gradient_accumulation_steps 1 \

    --lr_scheduler_type cosine \

    --logging_steps 10 \

    --save_steps 1000 \

    --learning_rate 5e-5 \

    --num_train_epochs 3.0 \

    --fp16

开始训练

训练完成

命令行测试

python src/cli_demo.py \

    --model_name_or_path /home/liq/zw/chatglm2/chatglm2-6b \

    --checkpoint_dir /home/liq/zw/data/chatglm2-6b-lora-zscq/checkpoint-19000 \

    --quantization_bit 4

进入问答界面

输入问题,得到对应回答

导出微调模型

python src/export_model.py \

    --model_name_or_path /home/liq/zw/chatglm2/chatglm2-6b \

    --checkpoint_dir /home/liq/zw/data/chatglm2-6b-lora/checkpoint-19000 \

    --output_dir /home/liq/zw/chatglm2-6b-lora-zscq2

查看模型内容

这篇关于ChatGLM2-6B微调过程说明文档的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/430134

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3