ChatGLM-6B icon indicating copy to clipboard operation
ChatGLM-6B copied to clipboard

[BUG/Help] 在尝试运行8bit量化下的模型的时候,程序载入显存使用GPU十分缓慢;但我FP16精度加载时可以较为快速成功载入显存

Open youngforblbl opened this issue 1 year ago • 3 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues

Current Behavior

在尝试运行8bit量化下的模型的时候,程序载入显存使用GPU十分缓慢;但我FP16精度加载时可以较为快速成功载入显存

Expected Behavior

当在运行8bit量化下的模型的时候,程序载入显存并使用GPU运行

Steps To Reproduce

我首先使用全精度模型运行: image 程序载入显存并在GPU中成功运行: image 随后将模型更换为8bit量化后的: image 但开始运行后速度下降,经过非常长的时间后才得以运行: image 请问这是正常现象,量化过程会很占用时间吗?

Environment

- OS:Windows Server 2022 Datacenter
- Python:3.7.6
- Transformers:4.27.1
- PyTorch:1.13.1+cu117
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :True

Anything else?

感谢清华大佬,学院路末流电子信息专业小白膜拜大佬; 另外请问一下这个每运行一轮对话后会有多少的显存占用呢?感觉说两三轮显存就会增长0.3G左右,多轮之后这个涨幅会下降吗?感谢。

youngforblbl avatar Mar 18 '23 03:03 youngforblbl

没错,量化需要很长时间,不过你可以用pickle将量化后的模型保存,然后下次运行直接用pickle加载再进行之后的步骤。我这样做了之后省去了量化的过程,模型启动很快。关于显存的占用你可以手动对history进行条数限制防止显存不够。 保存:

import pickle from transformers import AutoModel #4或者8 quantizationBit = 8

model = AutoModel.from_pretrained("chatglm-6b", trust_remote_code=True) model = model.half().quantize(quantizationBit) print("量化完毕") with open(f'{quantizationBit}bit.preq', 'wb') as f: pickle.dump(model, f) print("保存量化完毕")

加载:

with open(f'8bit.preq', 'rb') as f: model = pickle.load(f).cuda()

Tao2817 avatar Mar 18 '23 06:03 Tao2817

感谢感谢,我这就试试。 顺便问一下如果想用已有数据库微调chatglm有什么样的硬件要求呢?

youngforblbl avatar Mar 18 '23 12:03 youngforblbl

这个我就不知道了,我完全不懂这方面。微调可以参考这个项目,有人跑通了https://www.bilibili.com/opus/774083081235595299

Tao2817 avatar Mar 18 '23 12:03 Tao2817

没错,量化需要很长时间,不过你可以用pickle将量化后的模型保存,然后下次运行直接用pickle加载再进行之后的步骤。我这样做了之后省去了量化的过程,模型启动很快。关于显存的占用你可以手动对history进行条数限制防止显存不够。 保存:

import pickle from transformers import AutoModel #4或者8 quantizationBit = 8 model = AutoModel.from_pretrained("chatglm-6b", trust_remote_code=True) model = model.half().quantize(quantizationBit) print("量化完毕") with open(f'{quantizationBit}bit.preq', 'wb') as f: pickle.dump(model, f) print("保存量化完毕")

加载:

with open(f'8bit.preq', 'rb') as f: model = pickle.load(f).cuda()

加载时出现:

File "/home/martin/llm/ChatGLM-6B/test.py", line 5, in model = pickle.load(f).cuda() ModuleNotFoundError: No module named 'transformers_modules'

我用的4bit,不知道为什么可以保存但加载就不正确了

martin2384798 avatar Mar 19 '23 15:03 martin2384798

没错,量化需要很长时间,不过你可以用pickle将量化后的模型保存,然后下次运行直接用pickle加载再进行之后的步骤。我这样做了之后省去了量化的过程,模型启动很快。关于显存的占用你可以手动对history进行条数限制防止显存不够。 保存:

import pickle from transformers import AutoModel #4或者8 quantizationBit = 8 model = AutoModel.from_pretrained("chatglm-6b", trust_remote_code=True) model = model.half().quantize(quantizationBit) print("量化完毕") with open(f'{quantizationBit}bit.preq', 'wb') as f: pickle.dump(model, f) print("保存量化完毕")

加载:

with open(f'8bit.preq', 'rb') as f: model = pickle.load(f).cuda()

加载时出现:

File "/home/martin/llm/ChatGLM-6B/test.py", line 5, in model = pickle.load(f).cuda() ModuleNotFoundError: No module named 'transformers_modules'

我用的4bit,不知道为什么可以保存但加载就不正确了

@martin2384798 Now you can directly load the quantized model from THUDM/chatglm-6b-int4

duzx16 avatar Mar 19 '23 15:03 duzx16

没错,量化需要很长时间,不过你可以用pickle将量化后的模型保存,然后下次运行直接用pickle加载再进行之后的步骤。我这样做了之后省去了量化的过程,模型启动很快。关于显存的占用你可以手动对history进行条数限制防止显存不够。 保存:

import pickle from transformers import AutoModel #4或者8 quantizationBit = 8 model = AutoModel.from_pretrained("chatglm-6b", trust_remote_code=True) model = model.half().quantize(quantizationBit) print("量化完毕") with open(f'{quantizationBit}bit.preq', 'wb') as f: pickle.dump(model, f) print("保存量化完毕")

加载:

with open(f'8bit.preq', 'rb') as f: model = pickle.load(f).cuda()

加载时出现:

File "/home/martin/llm/ChatGLM-6B/test.py", line 5, in model = pickle.load(f).cuda() ModuleNotFoundError: No module named 'transformers_modules'

我用的4bit,不知道为什么可以保存但加载就不正确了

@martin2384798 Now you can directly load the quantized model from THUDM/chatglm-6b-int4

Thanks, that's much faster

martin2384798 avatar Mar 19 '23 16:03 martin2384798