sophgo / LLM-TPU

Run generative AI models in sophgo BM1684X
Other
119 stars 19 forks source link

转换qwen1.5出现的问题 #3

Closed yuyun2000 closed 7 months ago

yuyun2000 commented 7 months ago

例程中1.8B和7B的模型混起来了,建议修改一下,我转换的是0.5B模型,目前还是卡在了导出onnx阶段

报错1 pos不匹配 已解决

报错如下:

  File "C:\ProgramData\Anaconda3\envs\hf\lib\site-packages\transformers\models\qwen2\modeling_qwen2.py", line 696, in forward
    query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)
  File "C:\ProgramData\Anaconda3\envs\hf\lib\site-packages\transformers\models\qwen2\modeling_qwen2.py", line 172, in apply_rotary_pos_emb
    q_embed = (q * cos) + (rotate_half(q) * sin)
RuntimeError: The size of tensor a (16) must match the size of tensor b (512) at non-singleton dimension 1

我不是很清楚是是不是1.8B和0.5B的区别,但是我更倾向于是他修改的代码有问题,来看一下shape 修改后的函数如下:

#输入的con和sin的shape都是512 64
#q和k的shape都是1 16 512 64
cos = cos.squeeze(1).squeeze(0) # [seq_len, dim]  
sin = sin.squeeze(1).squeeze(0) # [seq_len, dim]  
cos = cos[position_ids].unsqueeze(1) #  
sin = sin[position_ids].unsqueeze(1) # 1 1 512 64 
cos = cos.transpose(1, 2)  
sin = sin.transpose(1, 2)  
q_embed = (q * cos) + (rotate_half(q) * sin) #在这里报错了,shape不匹配 
k_embed = (k * cos) + (rotate_half(k) * sin)

看一下原函数的过程

#输入的con和sin 都是 21 64 因为句子长度是21
#输入的k 和 q的shape都是1 16 21 64
cos = cos[position_ids].unsqueeze(unsqueeze_dim)  
sin = sin[position_ids].unsqueeze(unsqueeze_dim)#1 1 21 64
q_embed = (q * cos) + (rotate_half(q) * sin)  
k_embed = (k * cos) + (rotate_half(k) * sin)

看来是修改的多了两个转置?删掉看一下,删掉后这一点不再报错了

报错2 第一个block未输出cache

导出的第一个block没有kv的输出,相关代码端改成这样也能跑过去,但是感觉不太对 class QwenBlock(torch.nn.Module):

def __init__(self, layer_id):
    super().__init__()
    self.layer_id = layer_id
    self.layer = layers[layer_id]
# input_ids, attention_mask, position_ids
def forward(self, hidden_states, position_ids, attention_mask):
    hidden_states, past_kv = self.layer(
        hidden_states,
        attention_mask=attention_mask,
        position_ids=position_ids,
        use_cache=True)
    if past_kv != None:
        present_k, present_v = past_kv
        return hidden_states.float(), present_k.float(), present_v.float()
    else:
        present_k, present_v = torch.tensor([0]),torch.tensor([0])
        return hidden_states.float(), present_k, present_v

报错3 要输入huggingface上的cache列表

报错为

    kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx)
AttributeError: 'tuple' object has no attribute 'get_usable_length'

我看了因为这个类是huggingface上的DynamicCache,但是输入的是默认元组,所以没有这个方法?我不是很清楚为什么有这些问题 感觉不太是因为0.5B和1.8B的原因,因为他的配置文件基本相同,只有linear的通道数不一样,所以你们可以帮我检查一下吗

yuyun2000 commented 7 months ago

忘记说了,感谢各位大佬这么令人难以控制发出卧槽的项目

yuyun2000 commented 7 months ago

@WaitDumplings my dear dalao ,可以抽点时间看看吗,看你昨晚四点才休息,还是人在USA,有时差

yuyun2000 commented 7 months ago

我又看了一下代码,你们的Qwen似乎运行的是Qwen2Attention,而我跑的Qwen0.5B运行的是Qwen2SdpaAttention,这导致你们在Qwen2Attention里面的改动都没有运行,我在0.5B上强行使用Qwen2Attention结果是混乱的,我试一下1.8B的模型

WaitDumplings commented 7 months ago

这周处理一下,最近确实没太多时间。

yuyun2000 commented 7 months ago

好好,我刚试了一下1.8B也是相同的错误,辛苦大佬

WaitDumplings commented 7 months ago

你是不是从HF下成Qwen1.5-1.8B了。。。我们都是做Chat(Qwen1.5-1.8B-Chat)的适配的

yuyun2000 commented 7 months ago

我是用的是0.5B-chat和1.8B-chat,我发现不带chat的他的回复有问题,可能是解码方式带来的

WaitDumplings commented 7 months ago

可能是内部会进入不同的分支,我们目前是在1.8B的那条分支上做的修改,其它模型还没测试(应该差不多)。所以1.8B-Chat没有问题对吧?

yuyun2000 commented 7 months ago

1.8B-chat 在4.38.2版本中也是进入的Qwen2SdpaAttention,所以和0.5Bchat报错相同,我不清楚为什么你会进入原始的Qwen2Attention中,而且我之前试过强制使用Qwen2Attention进行推理,结果十分不对,我也很不理解 刚才我又尝试了一下这样设置:

QWEN2_ATTENTION_CLASSES = {
    "eager": Qwen2Attention,
    "flash_attention_2": Qwen2Attention,
    "sdpa": Qwen2Attention,
}

也就是他只能使用原始的attention,生成的结果很不对

WaitDumplings commented 7 months ago

您这边是不是修改了config.json。您直接把仓库compile/files里对应的文件cp到下载好的模型文件(config.json) 以及实际用的那个transformers下的对应路径(modeling_qwen2.py)下。大概率是您config的architecture设置成的sdpa. 最后对齐一下版本(torch==2.0.1, transformers==4.38.2)

yuyun2000 commented 7 months ago

我们的配置文件中这个内容是一致的:

  "architectures": [
    "Qwen2ForCausalLM"
  ]

我现在统一版本再试一下

WaitDumplings commented 7 months ago

最稳妥的方法是在我们提供的docker里做,可能是你本地python版本环境比较多,最后进入的是别的分支。在docker里可以确保不会有问题。

yuyun2000 commented 7 months ago

使用torch=2.0.1可以正确转换,之前的2.2.1会报错。感谢回复哈哈

zifeng-radxa commented 4 months ago

所以torch 版本不一样他的计算过程也不一样吗,都是同一条公式?

yuyun2000 commented 4 months ago

所以torch 版本不一样他的计算过程也不一样吗,都是同一条公式?

是的,你说的对,sdpa是新版的torch才支持的,反正很复杂就是了

WaitDumplings commented 4 months ago

torch版本不一致会导致modeling_xxx.py 里面进入不同的if else分支.

On Wed, Jul 3, 2024 at 4:52 PM Xuanwu Yun @.***> wrote:

所以torch 版本不一样他的计算过程也不一样吗,都是同一条公式?

是的,你说的对,sdpa是新版的torch才支持的,反正很复杂就是了

— Reply to this email directly, view it on GitHub https://github.com/sophgo/LLM-TPU/issues/3#issuecomment-2205455746, or unsubscribe https://github.com/notifications/unsubscribe-auth/AVLFO26FGAGCSP7ZUE4JZBLZKO3S7AVCNFSM6AAAAABEVKB7COVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDEMBVGQ2TKNZUGY . You are receiving this because you were mentioned.Message ID: @.***>

yuyun2000 commented 4 months ago

torch版本不一致会导致modeling_xxx.py 里面进入不同的if else分支. On Wed, Jul 3, 2024 at 4:52 PM Xuanwu Yun @.> wrote: 所以torch 版本不一样他的计算过程也不一样吗,都是同一条公式? 是的,你说的对,sdpa是新版的torch才支持的,反正很复杂就是了 — Reply to this email directly, view it on GitHub <#3 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AVLFO26FGAGCSP7ZUE4JZBLZKO3S7AVCNFSM6AAAAABEVKB7COVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDEMBVGQ2TKNZUGY . You are receiving this because you were mentioned.Message ID: @.>

难道,你也喜欢吃饺子?