解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题
解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题
LLM(Large Language Model)通常拥有大量的先验知识,使得其在许多自然语言处理任务上都有着不错的性能。
但,想要直接利用 LLM 完成一些任务会存在一些答案解析上的困难,如规范化输出格式,严格服从输入信息等。
因此,在这个项目下我们参考 ChatGLM-Tuning 的代码,尝试对大模型 ChatGLM-6B 进行 Finetune,使其能够更好的对齐我们所需要的输出格式。
1. 环境安装
由于 ChatGLM 需要的环境和该项目中其他实验中的环境有所不同,因此我们强烈建议您创建一个新的虚拟环境来执行该目录下的全部代码。
下面,我们将以 Anaconda 为例,展示如何快速搭建一个环境:
- 创建一个虚拟环境,您可以把
llm_env修改为任意你想要新建的环境名称:
conda create -n llm_env python=3.8
- 激活新建虚拟环境并安装响应的依赖包:
conda activate llm_env
pip install -r requirements.txt
- 安装对应版本的
peft:
cd peft-chatglm
python setup.py install
2. 数据集准备
在该实验中,我们将尝试使用 信息抽取 + 文本分类 任务的混合数据集喂给模型做 finetune,数据集在 data/mixed_train_dataset.jsonl。
每一条数据都分为 context 和 target 两部分:
context部分是接受用户的输入。target部分用于指定模型的输出。
在 context 中又包括 2 个部分:
Instruction:用于告知模型的具体指令,当需要一个模型同时解决多个任务时可以设定不同的 Instruction 来帮助模型判别当前应当做什么任务。
Input:当前用户的输入。
- 信息抽取数据示例
Instruction 部分告诉模型现在需要做「阅读理解」任务,Input 部分告知模型要抽取的句子以及输出的格式。
{
"context": "Instruction: 你现在是一个很厉害的阅读理解器,严格按照人类指令进行回答。\nInput: 找到句子中的三元组信息并输出成json给我:\n\n九玄珠是在纵横中文网连载的一部小说,作者是龙马。\nAnswer: ",
"target": "```json\n[{\"predicate\": \"连载网站\", \"object_type\": \"网站\", \"subject_type\": \"网络小说\", \"object\": \"纵横中文网\", \"subject\": \"九玄珠\"}, {\"predicate\": \"作者\", \"object_type\": \"人物\", \"subject_type\": \"图书作品\", \"object\": \"龙马\", \"subject\": \"九玄珠\"}]\n```"
}
- 文本分类数据示例
Instruction 部分告诉模型现在需要做「阅读理解」任务,Input 部分告知模型要抽取的句子以及输出的格式。
{
"context": "Instruction: 你现在是一个很厉害的阅读理解器,严格按照人类指令进行回答。\nInput: 下面句子可能是一条关于什么的评论,用列表形式回答:\n\n很不错,很新鲜,快递小哥服务很好,水果也挺甜挺脆的\nAnswer: ",
"target": "[\"水果\"]"
}
3. 模型训练
3.1 单卡训练
实验中支持使用 LoRA Finetune 和 P-Tuning 两种微调方式。
运行 train.sh 文件,根据自己 GPU 的显存调节 batch_size, max_source_seq_len, max_target_seq_len 参数:
# LoRA Finetune
python train.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_lora True \
--lora_rank 8 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 1000 \
--learning_rate 3e-5 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints/finetune \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM Fine-Tune" \
--device cuda:0
# P-Tuning
python train.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_ptuning True \
--pre_seq_len 128 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 200 \
--learning_rate 2e-4 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints/ptuning \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM P-Tuning" \
--device cuda:0
成功运行程序后,会看到如下界面:
...
global step 900 ( 49.89% ) , epoch: 1, loss: 0.78065, speed: 1.25 step/s, ETA: 00:12:05
global step 1000 ( 55.43% ) , epoch: 2, loss: 0.71768, speed: 1.25 step/s, ETA: 00:10:44
Model has saved at checkpoints/model_1000.
Evaluation Loss: 0.17297
Min eval loss has been updated: 0.26805 --> 0.17297
Best model has saved at checkpoints/model_best.
global step 1100 ( 60.98% ) , epoch: 2, loss: 0.66633, speed: 1.24 step/s, ETA: 00:09:26
global step 1200 ( 66.52% ) , epoch: 2, loss: 0.62207, speed: 1.24 step/s, ETA: 00:08:06
...
在 log/finetune_log 下会看到训练 loss 的曲线图:
3.2 多卡训练
运行 train_multi_gpu.sh 文件,通过 CUDA_VISIBLE_DEVICES 指定可用显卡,num_processes 指定使用显卡数:
# LoRA Finetune
CUDA_VISIBLE_DEVICES=0,1 accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 train_multi_gpu.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_lora True \
--lora_rank 8 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 500 \
--learning_rate 3e-5 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints_parrallel/finetune \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM Fine-Tune(parallel)"
# P-Tuning
CUDA_VISIBLE_DEVICES=0,1 accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 train_multi_gpu.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_ptuning True \
--pre_seq_len 128 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 500 \
--learning_rate 2e-4 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints_parrallel/ptuning \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM P-Tuning(parallel)"
相同数据集下,单卡使用时间:
Used 00:27:18.
多卡(2并行)使用时间:
Used 00:13:05.
4. 模型预测
修改训练模型的存放路径,运行 python inference.py 以测试训练好模型的效果:
device = 'cuda:0'
max_new_tokens = 300
model_path = "checkpoints/model_1000" # 模型存放路径
tokenizer = AutoTokenizer.from_pretrained(
model_path,
trust_remote_code=True
)
model = AutoModel.from_pretrained(
model_path,
trust_remote_code=True
).half().to(device)
...
您也可以使用我们提供的 Playground 来进行模型效果测试:
streamlit run playground_local.py --server.port 8001
在浏览器中打开对应的 机器ip:8001 即可访问。
5. 标注平台
如果您需要标注自己的数据,也可以在 Playground 中完成。
streamlit run playground_local.py --server.port 8001
在浏览器中打开对应的 机器ip:8001 即可访问。
项目链接:https://github.com/HarderThenHarder/transformers_tasks/blob/main/LLM/chatglm_finetune/readme.md
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。
解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题的更多相关文章
- pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例)
pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例) Part1知识准备 在PyTorch中加载预训练的模型时,通常的工作流程是这样的: my_model = ModelClass ...
- 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话
导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...
- 开放下载!2021 解锁 Serverless 从入门到实战大“橙”就
Serverless 架构即将引领云计算的下一个十年已成行业共识.处于变革中的开发者,大多已从观望状态转向尝试阶段, 越来越多 Serverless 落地场景被解锁. "Serverless ...
- 本地推理,单机运行,MacM1芯片系统基于大语言模型C++版本LLaMA部署“本地版”的ChatGPT
OpenAI公司基于GPT模型的ChatGPT风光无两,眼看它起朱楼,眼看它宴宾客,FaceBook终于坐不住了,发布了同样基于LLM的人工智能大语言模型LLaMA,号称包含70亿.130亿.330亿 ...
- 大礼包!ANDROID内存优化(大汇总)
写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在A ...
- android app性能优化大汇总(内存性能优化)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- ANDROID内存优化——大汇总(转)
原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了20 ...
- ANDROID内存优化(大汇总——中)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- RAC优化大框架的分配(jumbo frame)
RAC优化大框架的分配(jumbo frame) 首先讲讲MTU的概念:在网络通信中,有个MTU(Max Transmission Unit)的概念,即网络传输中最大帧的大小,这个值默认是1500By ...
- android app性能优化大汇总
这里根据网络上各位大神已经总结的知识内容做一个大汇总,作为记录,方便后续“温故知新”. 性能指标: (1)使用流畅度: 图片处理器每秒刷新的帧数(FPS),可用来指示页面是否平滑的渲染.高的帧率可以 ...
随机推荐
- C++11实用特性3 --智能指针
1 智能指针 在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针的 ...
- (error) MOVED 12706 10.176.246.204:9736
使用redis-cli连接上redis后,执行get命令报错: (error) MOVED 12706 10.176.246.204:9736 百度到原因是未以集群模式连接,在连接时加上-c参数就可以 ...
- POJ 1236 Network of Schools (连通图 - Garbow 算法)
POJ 1236 Network of Schools 校园网:给定N所学校和网络,目标是分发软件其他学校都可收到,求①所需最少分发学校数:②若任选学校都能收到,最低新增边数. 思路:同一个强连通 ...
- vue子页面给App.vue传值
前端工程现在变成了单页面富文本的模式,整体布局定下来后,跳转只在<router-view>中展示,外层的布局不容易改变.最近发现有如下这个方法可以直接传值给App.vue,经过实践确实可以 ...
- GPT应用开发:GPT插件开发指南
欢迎阅读本系列文章!我将带你一起探索如何利用OpenAI API开发GPT应用.无论你是编程新手还是资深开发者,都能在这里获得灵感和收获. 本文,我们将继续展示聊天API中插件的使用方法,让你能够轻松 ...
- echart问题集合
legend与图标间隔 echarts自定义tooltip提示框内容 https://blog.csdn.net/dreamsup/article/details/56667330 echarts中自 ...
- Zookeeper 实现 ssl 双向认证
本文为博主原创,未经允许不得转载: zookeeper 作为注册中心或服务发现协调中心的时候,zookeeper 默认与其他服务通过 http 进行通信. zookeeper 与协调服务配置 ssl ...
- 15-TTL与非门
TTL与非门 集成电路有两大类COMOS和TTL(三极管) 电路结构 工作原理 多发射结的三极管,两个输入之间是与的关系 输入低电平 输入高电平 A.B都是高电平 倒置放大 压差大的先导通 T3,T4 ...
- Android——共享参数SharedPreferences
4数据存储 共享参数SharedPreferences.数据库SQLite.SD卡文件.App的全局内存 4.1共享参数SharedPreferences SharedPreferences是一个轻量 ...
- 使用Java分析器优化代码性能,解决OOM问题
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 背景 最近我一直在做性能优化,对一个单机应用做性能优化.主要是 ...