You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CPU环境下torch.float16调用memory_efficient_attention_forward报错求助

问题

在搭载Intel Core i7处理器的MacBook Pro上,使用transformers库的AutoModelForCausalLM加载PyTorch模型THUDM/cogvlm-chat-hf时,出现memory_efficient_attention_forward算子不支持CPU与torch.float16组合的报错。

运行代码

import torch
import requests
from PIL import Image
from IPython.display import display
from transformers import AutoModelForCausalLM, LlamaTokenizer

# Load tokenizer and model
tokenizer = LlamaTokenizer.from_pretrained('lmsys/vicuna-7b-v1.5')
model = AutoModelForCausalLM.from_pretrained(
    'THUDM/cogvlm-chat-hf',
    torch_dtype=torch.float16,  # Using torch.float16
    low_cpu_mem_usage=True,
    trust_remote_code=True
).eval()

def generate(query: str, img_url: str, max_length: int = 2048) -> str:
    image = Image.open(requests.get(img_url, stream=True).raw).convert('RGB')
    display(image)

    # Generate token inputs
    inputs = model.build_conversation_input_ids(tokenizer, query=query, history=[], images=[image], template_version='vqa')

    # Convert tensors to appropriate types
    input_ids = inputs['input_ids'].unsqueeze(0).to(torch.long)
    token_type_ids = inputs['token_type_ids'].unsqueeze(0).to(torch.long)
    attention_mask = inputs['attention_mask'].unsqueeze(0).to(torch.float16)
    images = [[inputs['images'][0].to(torch.float16)]]

    inputs = {
        'input_ids': input_ids,
        'token_type_ids': token_type_ids,
        'attention_mask': attention_mask,
        'images': images,
    }
    
    gen_kwargs = {"max_length": max_length, "do_sample": False}
    
    with torch.no_grad():
        outputs = model.generate(**inputs, **gen_kwargs)
        outputs = outputs[:, input_ids.shape[1]:]
        return tokenizer.decode(outputs[0])

query = 'Describe this image in detail'
img_url = 'https://i.ibb.co/x1nH9vr/Slide1.jpg'
generate(query, img_url)

报错信息

NotImplementedError: No operator found for `memory_efficient_attention_forward` with inputs:
     query       : shape=(1, 1226, 16, 112) (torch.float16)
     key         : shape=(1, 1226, 16, 112) (torch.float16)
     value       : shape=(1, 1226, 16, 112) (torch.float16)
     attn_bias   : <class 'NoneType'>
     p           : 0.0
`ck_decoderF` is not supported because:
    device=cpu (supported: {'cuda'})
    operator wasn't built - see `python -m xformers.info` for more info
`ckF` is not supported because:
    device=cpu (supported: {'cuda'})
    operator wasn't built - see `python -m xformers.info` for more info

解决方案

方案1:改用float32数据类型

xformers的内存高效注意力算子不支持CPU上的float16计算,切换为torch.float32即可避开该问题,修改点如下:

  • 模型加载时指定torch_dtype=torch.float32
  • 调整输入张量的类型为float32

修改后的代码片段:

# 加载模型时修改dtype
model = AutoModelForCausalLM.from_pretrained(
    'THUDM/cogvlm-chat-hf',
    torch_dtype=torch.float32,  # 改为float32
    low_cpu_mem_usage=True,
    trust_remote_code=True
).eval()

# generate函数中修改张量类型
attention_mask = inputs['attention_mask'].unsqueeze(0).to(torch.float32)
images = [[inputs['images'][0].to(torch.float32)]]

方案2:禁用xformers,使用PyTorch原生注意力实现

通过指定attn_implementation="eager",强制模型使用PyTorch原生的注意力计算逻辑,无需修改数据类型:

model = AutoModelForCausalLM.from_pretrained(
    'THUDM/cogvlm-chat-hf',
    torch_dtype=torch.float16,
    low_cpu_mem_usage=True,
    trust_remote_code=True,
    attn_implementation="eager"  # 添加该参数禁用xformers
).eval()

方案3:内存优化补充(可选)

如果使用float32时内存不足,可尝试调整内存参数:

model = AutoModelForCausalLM.from_pretrained(
    'THUDM/cogvlm-chat-hf',
    torch_dtype=torch.float32,
    low_cpu_mem_usage=False,
    trust_remote_code=True,
    gradient_checkpointing=True  # 开启梯度检查点节省内存
).eval()

内容的提问来源于stack exchange,提问作者Amit Pathak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:50:09