from .base import BaseAWQForCausalLM from awq.modules import make_quant_norm, make_quant_attn, make_fused_mlp from transformers.models.llama.modeling_llama import LlamaDecoderLayer, LlamaForCausalLM class LlamaAWQForCausalLM(BaseAWQForCausalLM): layer_type = "LlamaDecoderLayer" max_new_tokens_key = "max_position_embeddings" @staticmethod def fuse_layers(awq_model): make_quant_attn(awq_model, awq_model.device) make_quant_norm(awq_model) make_fused_mlp(awq_model) @staticmethod def get_model_layers(model: LlamaForCausalLM): return model.model.layers @staticmethod def get_act_for_scaling(module: LlamaDecoderLayer): return dict( is_scalable=False ) @staticmethod def move_embed(model: LlamaForCausalLM, device: str): model.model.embed_tokens = model.model.embed_tokens.to(device) @staticmethod def get_layers_for_scaling(module: LlamaDecoderLayer, input_feat, module_kwargs): layers = [] # attention input layers.append(dict( prev_op=module.input_layernorm, layers=[module.self_attn.q_proj, module.self_attn.k_proj, module.self_attn.v_proj], inp=input_feat['self_attn.q_proj'], module2inspect=module.self_attn, kwargs=module_kwargs, )) # attention out # Please refer to https://github.com/mit-han-lab/llm-awq/pull/67#issue-1850622696 if module.self_attn.v_proj.weight.shape == module.self_attn.o_proj.weight.shape: layers.append(dict( prev_op=module.self_attn.v_proj, layers=[module.self_attn.o_proj], inp=input_feat['self_attn.o_proj'], )) # linear 1 layers.append(dict( prev_op=module.post_attention_layernorm, layers=[module.mlp.gate_proj, module.mlp.up_proj], inp=input_feat['mlp.gate_proj'], module2inspect=module.mlp, )) # linear 2 layers.append(dict( prev_op=module.mlp.up_proj, layers=[module.mlp.down_proj], inp=input_feat['mlp.down_proj'], )) return layers