Comments (16)
@wujindou 这块我还没有时间去做,关于哪种微调方式更好,可能不同数据集会有不同表现吧。
from chatglm-6b-qlora.
嗯,多谢~,我试试看
from chatglm-6b-qlora.
@wujindou 这块我还没有时间去做,关于哪种微调方式更好,可能不同数据集会有不同表现吧。
我微调以后效果很差,我执行了merge chatglm2和qlora,然后修改了model path ,启动web以后,发现以下问题:
- 有出现 ... 和缺字的情况
- chatglm2本身最基础的能力都丢失了,无论你问什么,比如一些简单提问,它的回答全是我的训练数据集里面的问题
- 语言组织能力几乎为0,基本上都是训练数据里面断断续续出来的答案
是不是我的训练数据集太少了? 或者是需要再多训练几次? 请问我该如何继续优化?
from chatglm-6b-qlora.
@wujindou
你的数据集或者任务时什么?
配置文件和启动命令是什么?
可不可以打印出数据和input_ids,看看数据是否有问题?
目前看应该不会出现很离谱的情况,官方issue下有个哥们做了文本纠错的任务训练,效果也还行:THUDM/ChatGLM2-6B#141
from chatglm-6b-qlora.
@wujindou 你的数据集或者任务时什么? 配置文件和启动命令是什么? 可不可以打印出数据和input_ids,看看数据是否有问题? 目前看应该不会出现很离谱的情况,官方issue下有个哥们做了文本纠错的任务训练,效果也还行:THUDM/ChatGLM2-6B#141
1.你的数据集或者任务时什么?
我的数据集大部分是这样的
{"instruction": "筛选框说明:\n默认展示“全部部门”,可筛选部门\n全部部门\n1.系统管理员可筛选所有部门数据2.部门排班管理员可筛选被设置为部门管理员的部门", "output": "\n用例标题\n【WEB端】科室管理-部门筛选检查\n前置条件 \n操作步骤:\n1. 点击科室管理菜单\n2. 点击部门下拉框筛选\n3. 点选全部部门、单个部门\n预期结果:\n1. 成功进入科室管理页面\n2. 下拉展示全部部门、单个部门\n3. 列表刷新,展示筛选结果"}
\n是换行符的意思。
2.配置文件和启动命令是什么?
什么配置文件?config.jason这个文件吗?
是指qlora的配置文件还是chatglm2的配置文件?
启动命令? 我是按照说明,把chatglm2的webui.py里面的 model指向 训练出来的结果数据文件,我不是很清楚启动命令
from chatglm-6b-qlora.
@wujindou 配置文件就是我项目里的chatGLM_6B_QLoRA.json这个文件,启动命令就是训练的启动命令:
python3 train_qlora.py \
--train_args_json chatGLM_6B_QLoRA.json \
--model_name_or_path THUDM/chatglm-6b \
--train_data_path data/train.jsonl \
--eval_data_path data/dev.jsonl \
--lora_rank 4 \
--lora_dropout 0.05 \
--compute_dtype fp32
还有,你的数据集有多少数据量?都是这种医疗软件的说明吗?
另外,你是用merge_lora_and_quantize.py把lora model和base model合并了吧,这块排查问题的话,可以先不用webui,直接在ipython这种交互窗口里像下面这样试试吗?
from transformers import AutoModel, AutoTokenizer
model_path = '/tmp/merged_qlora_model_4bit'
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
input_text = '类型#裙*版型#显瘦*风格#文艺*风格#简约*图案#印花*图案#撞色*裙下摆#压褶*裙长#连衣裙*裙领型#圆领'
response, history = model.chat(tokenizer=tokenizer, query=input_text)
print(response)
from chatglm-6b-qlora.
配置文件就是我项目里的chatGLM_6B_QLoRA.json这个文件,启动命令就是训练的启动命令:
python3 train_qlora.py
--train_args_json chatGLM_6B_QLoRA.json
--模型名称或路径THUDM/chatglm-6 b
--train_data_path data/train.jsonl
--eval_data_path data/dev.jsonl
--lora_rank 4
--lora_dropout 0.05
--compute_dtype fp32还有,你的数据集有多少数据量?都是这种医疗软件的说明吗?
另外,你是用merge_lora_and_quantize.py把lora model和base model合并了吧,这块排查问题的话,可以先不用webui,直接在ipython这种交互窗口里像下面这样试试吗?
从转换器导入AutoModel、AutoTokenizer
model_path = '/tmp/merged_qlora_model_4bit'
tokenizer = AutoTokenizer.from_pretrained(model_path,trust_remote_code=True)
model = AutoModel.from_pretrained(model_path,trust_remote_code=True).half().cuda()input_text = '类型#裙版型#显瘦风格#文艺风格#简约图案#印花图案#撞色裙下摆#压褶裙长#连衣裙裙领型#圆领'
response,history = model.chat(tokenizer=tokenizer,query=input_text)
print(response)
这是我的chatGLM_6B_QLoRA.json文件
{
“output_dir”:“saved_files/chatGLM_6B_QLoRA_t32”,
“per_device_train_batch_size”:1, ———————————-这里如果改为2或者4的话,会出现out of memory
“gradient_accumulation_steps”:8,
“per_device_eval_batch_size”:1, ———————————-这里如果改为2或者4的话,会出现out of memory
“learning_rate”:1e-2, ----这里我也降低了
“num_train_epochs”:1.0,
“lr_scheduler_type”:“linear”,
“warmup_ratio”:0.1,
“logging_steps”:100,
“保存_strategy”:“steps”,
“保存_steps”:500,
“evaluation_strategy”:“steps”,
“eval_steps”:500,
“optim”:“adamw_torch”,
“fp16”:false,
“remove_unused_columns”:false,
“ddp_find_unused_parameters”:false,
‘’seed‘’:42
还有,你的数据集有多少数据量?都是这种医疗软件的说明吗?
我的数据集大概1000条的样子,都是类似这种结构的软件说明
--另外,你是用merge_lora_and_quantize.py把lora model和base model合并了吧,这块排查问题的话,可以先不用webui,直接在ipython这种交互窗口里像下面这样试试吗?
是的,我就是把lora model和base model合并了的,然后chatglm2加载的是合并后的/tmp/merged_qlora_model_4bit这个文件
from chatglm-6b-qlora.
不知道是不是数据量的问题,因为你的数据看上去即使是我作为一个人来根据instruction输出output似乎也不是那么容易。尤其是你的例子里,instruction并没有提到“科室”这个词……
然后1000条数据,真实的batchsize为8,只能跑100多个step吧。
你可以试试统一加一个prompt前缀,描述你的任务,就是这个参数:
parser.add_argument('--prompt_text', type=str, default='', help='统一添加在所有数据前的指令文本')
启动训练时加这个参数,类似这样:
python3 train_qlora.py \
--train_args_json chatGLM_6B_QLoRA.json \
--model_name_or_path THUDM/chatglm-6b \
--train_data_path data/train.jsonl \
--eval_data_path data/dev.jsonl \
--lora_rank 4 \
--lora_dropout 0.05 \
--compute_dtype fp32 \
--prompt_text 请根据以下要求编写软件产品说明文档\n\n
另外你是什么显卡,为什么batchsize1就会OOM?还是说数据有很长的?
--compute_dtype fp32 这个参数,我设置为fp16时会出现训练不稳定,loss不下降的情况
from chatglm-6b-qlora.
@2512309z 对了,还可以试下,合并lora但不量化,用fp16的模型看看效果
from chatglm-6b-qlora.
@2512309z 对了,还可以试下,合并lora但不量化,用fp16的模型看看效果
什么是合并但不量化,不明白,麻烦你详细说一下步骤,谢谢你啊!
from chatglm-6b-qlora.
不知道是不是数据量的问题,因为你的数据看上去即使是我作为一个人来根据instruction输出output似乎也不是那么容易。尤其是你的例子里,instruction并没有提到“科室”这个词……
然后1000条数据,真实的batchsize为8,只能跑100多个step吧。
你可以试试统一加一个prompt前缀,描述你的任务,就是这个参数:
parser.add_argument('--prompt_text', type=str, default='', help='统一添加在所有数据前的指令文本')
启动训练时加这个参数,类似这样:python3 train_qlora.py \ --train_args_json chatGLM_6B_QLoRA.json \ --model_name_or_path THUDM/chatglm-6b \ --train_data_path data/train.jsonl \ --eval_data_path data/dev.jsonl \ --lora_rank 4 \ --lora_dropout 0.05 \ --compute_dtype fp32 \ --prompt_text 请根据以下要求编写软件产品说明文档\n\n
另外你是什么显卡,为什么batchsize1就会OOM?还是说数据有很长的? --compute_dtype fp32 这个参数,我设置为fp16时会出现训练不稳定,loss不下降的情况
谢谢你耐心解答,我的训练数据确实是有很长的情况,我大概明白你的意思了,如果需要更准确的输出,就得把输入截断,然后将想要的对应输出相结合,组成一条训练数据,不知道我的理解对不对?
另外我的显卡是3张 16G teslaA100,可能就是因为单条训练数据太长的原因导致OOM的
from chatglm-6b-qlora.
@2512309z 对了,还可以试下,合并lora但不量化,用fp16的模型看看效果
什么是合并但不量化,不明白,麻烦你详细说一下步骤,谢谢你啊!
就是训练后执行
python3 merge_lora_and_quantize.py \
--lora_path saved_files/chatGLM2_6B_QLoRA_t32 \
--output_path /tmp/qlora-model2 \
--remote_scripts_dir remote_scripts/chatglm2-6b \
--qbits 0
会得到一个完整的merge后的fp16模型
from chatglm-6b-qlora.
不知道是不是数据量的问题,因为你的数据看上去即使是我作为一个人来根据instruction输出output似乎也不是那么容易。尤其是你的例子里,instruction并没有提到“科室”这个词……
然后1000条数据,真实的batchsize为8,只能跑100多个step吧。
你可以试试统一加一个prompt前缀,描述你的任务,就是这个参数:parser.add_argument('--prompt_text', type=str, default='', help='统一添加在所有数据前的指令文本')
启动训练时加这个参数,类似这样:python3 train_qlora.py \ --train_args_json chatGLM_6B_QLoRA.json \ --model_name_or_path THUDM/chatglm-6b \ --train_data_path data/train.jsonl \ --eval_data_path data/dev.jsonl \ --lora_rank 4 \ --lora_dropout 0.05 \ --compute_dtype fp32 \ --prompt_text 请根据以下要求编写软件产品说明文档\n\n
另外你是什么显卡,为什么batchsize1就会OOM?还是说数据有很长的? --compute_dtype fp32 这个参数,我设置为fp16时会出现训练不稳定,loss不下降的情况
谢谢你耐心解答,我的训练数据确实是有很长的情况,我大概明白你的意思了,如果需要更准确的输出,就得把输入截断,然后将想要的对应输出相结合,组成一条训练数据,不知道我的理解对不对?
另外我的显卡是3张 16G teslaA100,可能就是因为单条训练数据太长的原因导致OOM的
16G的显存应该是够的,不知道你的太长到底是多长……
一般一条数据就是一个输入+一个输出啊,除非你是做多轮对话,那会有一些其他组织数据的方式
from chatglm-6b-qlora.
不知道是不是数据量的问题,因为你的数据看上去即使是我作为一个人来根据instruction输出output似乎也不是那么容易。尤其是你的例子里,instruction并没有提到“科室”这个词……
然后1000条数据,真实的batchsize为8,只能跑100多个step吧。
你可以试试统一加一个prompt前缀,描述你的任务,就是这个参数:parser.add_argument('--prompt_text', type=str, default='', help='统一添加在所有数据前的指令文本')
启动训练时加这个参数,类似这样:python3 train_qlora.py \ --train_args_json chatGLM_6B_QLoRA.json \ --model_name_or_path THUDM/chatglm-6b \ --train_data_path data/train.jsonl \ --eval_data_path data/dev.jsonl \ --lora_rank 4 \ --lora_dropout 0.05 \ --compute_dtype fp32 \ --prompt_text 请根据以下要求编写软件产品说明文档\n\n
另外你是什么显卡,为什么batchsize1就会OOM?还是说数据有很长的? --compute_dtype fp32 这个参数,我设置为fp16时会出现训练不稳定,loss不下降的情况
谢谢你耐心解答,我的训练数据确实是有很长的情况,我大概明白你的意思了,如果需要更准确的输出,就得把输入截断,然后将想要的对应输出相结合,组成一条训练数据,不知道我的理解对不对?
另外我的显卡是3张 16G teslaA100,可能就是因为单条训练数据太长的原因导致OOM的16G的显存应该是够的,不知道你的太长到底是多长…… 一般一条数据就是一个输入+一个输出啊,除非你是做多轮对话,那会有一些其他组织数据的方式
谢谢你啊 ,我所谓的太长意思是,我的输入和输出都很长,导致一条训练数据就很长,我暂时没有时间精力去研究多轮对话
from chatglm-6b-qlora.
@2512309z 对了,还可以试下,合并lora但不量化,用fp16的模型看看效果
什么是合并但不量化,不明白,麻烦你详细说一下步骤,谢谢你啊!
就是训练后执行
python3 merge_lora_and_quantize.py \ --lora_path saved_files/chatGLM2_6B_QLoRA_t32 \ --output_path /tmp/qlora-model2 \ --remote_scripts_dir remote_scripts/chatglm2-6b \ --qbits 0
会得到一个完整的merge后的fp16模型
我就是按照你的这个步骤做的,merge以后,就直接用chatglm2去使用合并后的模型,并没有量化,难道是因为我没有量化,导致效果不好吗?
from chatglm-6b-qlora.
@2512309z 对了,还可以试下,合并lora但不量化,用fp16的模型看看效果
什么是合并但不量化,不明白,麻烦你详细说一下步骤,谢谢你啊!
就是训练后执行
python3 merge_lora_and_quantize.py \ --lora_path saved_files/chatGLM2_6B_QLoRA_t32 \ --output_path /tmp/qlora-model2 \ --remote_scripts_dir remote_scripts/chatglm2-6b \ --qbits 0
会得到一个完整的merge后的fp16模型
请问想得到不量化的模型的时候,在训练时需要修改train.py里面的参数嘛?我看默认脚本在训练时也有量化步骤:
Quantization
q_config = BitsAndBytesConfig(load_in_4bit=True,
bnb_4bit_quant_type='nf4',
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=_compute_dtype_map[global_args.compute_dtype])
model = AutoModel.from_pretrained(global_args.model_name_or_path,
quantization_config=q_config,
device_map='auto',
trust_remote_code=True)
from chatglm-6b-qlora.
Related Issues (20)
- 数据集格式instruction,input,output时tokenized出错 HOT 2
- 训练结束后,数据展示出现问题
- merge后模型Loading checkpoint shards Killed HOT 6
- 调优后的模型是否可以在CPU服务上部署? HOT 1
- protobuf 和 icetk 版本不兼容 HOT 1
- ImportError: libcudnn.so.8: cannot open shared object file: No such file or directory HOT 12
- RuntimeError: mat1 and mat2 shapes cannot be multiplied (588x4096 and 1x9437184) ,ChatGLM2-6B做微调,请问如何设置参数?? HOT 1
- RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:1 and cuda:0! (when checking argument for argument target in method wrapper_CUDA_nll_loss_forward),请问如何调整训练代码,适配多卡训练?? HOT 1
- transformers>4.30.2时,模型不会进行量化,是因为什么?
- BrokenPipeError: [Errno 32] Broken pipe HOT 7
- 训练结束后没有保存完整的adapter文件 HOT 2
- 用V100显卡微调chatglm2-6b,但是loss一直为0,eval_loss=nan
- 训练显存有些问题
- 微调后推理性能问题 HOT 1
- ChatGLM3-6B 微调报错 RuntimeError: CUDA error: invalid argument HOT 1
- ChatGLM2-6B微调后合并报错We need an `offload_dir` to dispatch this model according to this `device_map`, the following submodules need to be offloaded: HOT 2
- 合并模型的时候显存不够,用的4090,24G
- qlora微调训练随机性
- ValueError:
- ChatGLM2-6b模型合并时报错ValueError: We need an `offload_dir` to dispatch this model according to this `device_map`, the following submodules need to be offloaded
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from chatglm-6b-qlora.