适配AMD RX6700xt时Bark项目出现RuntimeError问题求助
问题概述
正在将基于PyTorch CUDA的Bark项目适配DirectML以使用AMD RX6700XT GPU时,遇到RuntimeError: Cannot set version_counter for inference tensor错误。按官方文档将所有.to(device)替换为.to(dml)后,GPU能启动但随即报错;尝试torch-mlir实现加速时Windows环境仅调用CPU;将inference_mode()改为inference_mode(mode=False)后,出现aten::tril.out算子不支持的警告,后续又触发新的RuntimeError。使用Python版本为3.9.16。
解决方案尝试与修复
1. 解决Cannot set version_counter for inference tensor错误
该错误源于DirectML与PyTorch inference_mode的兼容性问题,调整推理模式并规范设备迁移逻辑即可修复:
- 先正确初始化DirectML设备:
import torch_directml dml = torch_directml.device() - 不要全局零散替换
.to(device),而是在模型加载完成后一次性将整个模型迁移到DML设备:model = model.to(dml) - 将代码中所有
torch.inference_mode()替换为torch.no_grad(),DirectML对inference_mode的支持存在局限性,no_grad()能更好地兼容。
2. 处理aten::tril.out算子不支持警告
DirectML暂不支持该算子,会自动回退到CPU运行,手动生成因果掩码可规避此问题:
- 在
model.py的注意力层中,替换原scaled_dot_product_attention调用:# 原代码 # y = torch.nn.functional.scaled_dot_product_attention(q, k, v, dropout_p=self.dropout, is_causal=is_causal) # 修改后的代码 batch_size, seq_len, _ = q.size() # 手动生成因果掩码并迁移到DML设备 causal_mask = torch.tril(torch.ones(seq_len, seq_len, device=dml)).view(1, 1, seq_len, seq_len) y = torch.nn.functional.scaled_dot_product_attention( q, k, v, dropout_p=self.dropout, attn_mask=causal_mask )
3. 修复torch.hstack触发的RuntimeError
此错误多因拼接张量的设备不一致或形状不兼容导致:
- 检查
generation.py第633行的x_in = torch.hstack(部分,确保所有参与拼接的张量都已迁移到DML设备:# 确保拼接前所有张量都在DML设备上 tensor_a = tensor_a.to(dml) tensor_b = tensor_b.to(dml) x_in = torch.hstack([tensor_a, tensor_b]) - 同时验证张量形状,确保它们的维度数一致,且除拼接维度外的其他维度大小匹配。
4. torch-mlir相关建议
Windows环境下torch-mlir对AMD GPU的支持尚不成熟,配置复杂且性能表现不稳定,建议优先完成DirectML的适配工作,暂时放弃torch-mlir的尝试。
内容的提问来源于stack exchange,提问作者Milor123
相关产品推荐
相关产品推荐

