AutoGPTQ 它是否支持Chatglm-6b模型?希望支持Chatglm 6b,

nbnkbykc  于 6个月前  发布在  其他
关注(0)|答案(9)|浏览(70)

没有提供描述。

j91ykkif

j91ykkif1#

ChatGLM目前仅支持其编码器架构,但将来将支持。

qvtsj1bj

qvtsj1bj2#

ChatGLM目前仅支持其编码器架构,但将来会支持。
现在有什么计划?

yftpprvb

yftpprvb3#

@junior-zsy, @tsaizehua, take a look here: huggingface/optimum#1479

0g0grzrc

0g0grzrc4#

junior-zsy, @tsaizehua,请看这里: huggingface/optimum#1479
我能否使用optimum来量化ChatGLM与AutoGPTQ?如何操作?@AlexKoff88

kxkpmulp

kxkpmulp5#

请使用最新的Transformer和最优版本,并使用以下代码片段:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", use_fast=True, trust_remote_code=True)
quantize_config = GPTQConfig(
    bits=4,
    dataset=[
        "新風系統是透過系統設計送風和排風使室內空氣存在一定的壓差",
        "向室內提供足夠的新風並排出室內汙濁空氣 ",
        "無需開窗全天持續不斷有組織的向室內引入新風",
        "為室內人員呼吸代謝提供所需氧氣",
        "使用超过2.4万亿tokens的数据进行预训练, 包含高质量中、英、多语言、代码、数学等数据,涵盖通用及专业领域的训练语料。通过大量对比实验对预训练语料分布进行了优化"
        "相比目前以中英词表为主的开源模型, Qwen-7B使用了约15万大小的词表。该词表对多语言更加友好, 方便用户在不扩展词表的情况下对部分语种进行能力增强和扩展。",
    ],
    tokenizer=tokenizer,
    block_name_to_quantize="transformer.encoder.layers",
    cache_block_outputs=False,
)

model = AutoModelForCausalLM.from_pretrained(
    "THUDM/chatglm3-6b", quantization_config=quantize_config, device_map="auto", trust_remote_code=True
)
model.save_pretrained("chatglm3_gptq")
tokenizer.save_pretrained("chatglm3_gptq")
ssgvzors

ssgvzors6#

请使用最新的Transformer和最优版本,并使用以下代码片段:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", use_fast=True, trust_remote_code=True)
quantize_config = GPTQConfig(
    bits=4,
    dataset=[
        "新風系統是透過系統設計送風和排風使室內空氣存在一定的壓差",
        "向室內提供足夠的新風並排出室內汙濁空氣 ",
        "無需開窗全天持續不斷有組織的向室內引入新風",
        "為室內人員呼吸代謝提供所需氧氣",
        "使用超过2.4万亿tokens的数据进行预训练, 包含高质量中、英、多语言、代码、数学等数据,涵盖通用及专业领域的训练语料。通过大量对比实验对预训练语料分布进行了优化"
        "相比目前以中英词表为主的开源模型, Qwen-7B使用了约15万大小的词表。该词表对多语言更加友好, 方便用户在不扩展词表的情况下对部分语种进行能力增强和扩展。",
    ],
    tokenizer=tokenizer,
    block_name_to_quantize="transformer.encoder.layers",
    cache_block_outputs=False,
)

model = AutoModelForCausalLM.from_pretrained(
    "THUDM/chatglm3-6b", quantization_config=quantize_config, device_map="auto", trust_remote_code=True
)
model.save_pretrained("chatglm3_gptq")
tokenizer.save_pretrained("chatglm3_gptq")

它可以工作。谢谢。@AlexKoff88

8mmmxcuj

8mmmxcuj7#

@AlexKoff88 我在量化模型后遇到了一个小问题。当我尝试运行模型时,收到了以下错误:

Traceback (most recent call last):
  File "run.py", line 4, in <module>
    model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", trust_remote_code=True)
  File "/root/miniconda3/lib/python3.8/site-packages/transformers/models/auto/auto_factory.py", line 561, in from_pretrained
    return model_class.from_pretrained(
  File "/root/miniconda3/lib/python3.8/site-packages/transformers/modeling_utils.py", line 3535, in from_pretrained
    model = quantizer.convert_model(model)
  File "/root/miniconda3/lib/python3.8/site-packages/optimum/gptq/quantizer.py", line 218, in convert_model
    self.block_name_to_quantize = get_block_name_with_pattern(model)
  File "/root/miniconda3/lib/python3.8/site-packages/optimum/gptq/utils.py", line 77, in get_block_name_with_pattern
    raise ValueError("Block pattern could not be match. Pass `block_name_to_quantize` argument in `quantize_model`")
ValueError: Block pattern could not be match. Pass `block_name_to_quantize` argument in `quantize_model`

我运行的代码如下:

from transformers import AutoTokenizer, AutoModelForCausalLM

model_id = "/content/chatglm3_gptq"
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)

print(model)

在查看Optimum源代码后,我发现这个问题可能与量化过程中的block_name_to_quantize="transformer.encoder.layers"有关。这个常量在transformer.encoder.layers中没有出现:

BLOCK_PATTERNS = [
    "transformer.h",
    "model.decoder.layers",
    "gpt_neox.layers",
    "model.layers",
]

生成错误的Optimum代码的相关部分可以在这里和这里看到。
请问如何解决这个问题?非常感谢您的帮助。

jjjwad0x

jjjwad0x8#

@zhaozhiming,这是我几个月前用于量化ChatGLM2的代码:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", use_fast=True, trust_remote_code=True)
quantize_config = GPTQConfig(
    bits=4,
    dataset=[
        "新風系統是透過系統設計送風和排風使室內空氣存在一定的壓差",
        "向室內提供足夠的新風並排出室內汙濁空氣 ",
        "無需開窗全天持續不斷有組織的向室內引入新風",
        "為室內人員呼吸代謝提供所需氧氣",
        "使用超过2.4万亿tokens的数据进行预训练, 包含高质量中、英、多语言、代码、数学等数据,涵盖通用及专业领域的训练语料。通过大量对比实验对预训练语料分布进行了优化"
        "相比目前以中英词表为主的开源模型, Qwen-7B使用了约15万大小的词表。该词表对多语言更加友好, 方便用户在不扩展词表的情况下对部分语种进行能力增强和扩展。",
    ],
    tokenizer=tokenizer,
    block_name_to_quantize="transformer.encoder.layers",
    cache_block_outputs=False,
)

model = AutoModelForCausalLM.from_pretrained(
    "THUDM/chatglm3-6b", quantization_config=quantize_config, device_map="auto", trust_remote_code=True
)
model.save_pretrained("chatglm3_gptq")
tokenizer.save_pretrained("chatglm3_gptq")

model = AutoModelForCausalLM.from_pretrained(
    "chatglm3_gptq", torch_dtype=torch.float16, device_map="auto", trust_remote_code=True
)
prompt = "告訴我有關人工智慧的事"
input_ids = tokenizer(prompt, return_tensors="pt").to(device=model.device)
with torch.no_grad():
    output = model.generate(**input_ids, max_new_tokens=500)
print(tokenizer.decode(output[0]))

Transformers和Optimum中的代码正在快速变化,可能会出现问题。
尝试手动将"transformer.encoder.layers"添加到BLOCK_PATTERNS中,或者在加载量化模型时将quantization_config传递给AutoModelForCausalLM.from_pretrained(...)

xmjla07d

xmjla07d9#

感谢您的耐心指导。我会再次查看剩余的问题。谢谢。

相关问题