最近在使用 Qwen2-7B-Instruct 的时候报错 RuntimeError: “triu_tril_cuda_template” not implemented for ‘BFloat16’,尝试解决了几个星期终于解决了问题,以下是整体解决思路与方案。
1. 解决思路
在使用 huggingface 上的 Qwen 示例代码时,报错:
RuntimeError: "triu_tril_cuda_template" not implemented for 'BFloat16'
首先先看了博客中的解决思路(https://blog.csdn.net/weixin_42225889/article/details/140325755),将加载预训练参数代码中的 ‘auto’ 改为了 torch.float16,即:
model = AutoModelForCausalLM.from_pretrained(
qwen_path,
# torch_dtype="auto",
torch_dtype=torch.float16,
device_map="auto"
)
然后重新执行代码,继续报错:
RuntimeError: probability tensor contains either `inf`, `nan` or element < 0
在 博客和 github 又搜了下新出现的问题(https://blog.csdn.net/weixin_44563460/article/details/133800257,https://github.com/meta-llama/llama/issues/380),有的说的是将do_sample
设置为 False
,有的说将 torch_dtype
设置为 bfloat16
,这里一步一步尝试,首先先将 do_sample
设置为了 False
,即:
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=24,
do_sample=False,
)
终于没报错了,但是输出了这么一堆奇怪的东西:
于是又尝试将 torch_dtype
从 torch.float16
改为 torch.bfloat16
:
model = AutoModelForCausalLM.from_pretrained(
qwen_path,
# torch_dtype="auto",
torch_dtype=torch.bfloat16,
device_map="auto"
)
然后继续报错:
RuntimeError: "triu_tril_cuda_template" not implemented for 'BFloat16'
又回到最初的起点了属于是。
2 解决方案
后来仔细思考了一下,为什么别人用 bfloat16
是正常的,而我用 bfloat16
就会报错,会不会是库版本的问题,于是重新更新了一波 Pytorch 和 transformers 的版本。
在更新之前我的版本是:
pytorch=2.0.1
transformers=4.43.4
更新之后为:
pytorch=2.2.2
transformers=4.44.0
然后问题就解决了:
虽然看上去解决思路挺简单的,但是由于网上都没有合适的关于这个问题的有效解决思路,也算是踩了不少的坑。