Server - PyTorch BFloat16 “TypeError: Got unsupported ScalarType BFloat16“ 解决方案

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/132665807

Img

BFloat16 类型是 16 位的浮点数格式,可以用来加速深度学习的计算和存储。BFloat16 类型的特点是保留 32 位浮点数(float32)的 8 位指数部分,但是只有 8 位的有效数字部分(而不是 float32 的 24 位)。这样,BFloat16 类型,可以表示和 float32 类型相同的数值范围,但是精度会降低。BFloat16 类型的优势在于,可以减少内存占用和数据传输的开销,从而提高深度学习模型的训练和推理速度。同时,由于 BFloat16 类型的指数部分和 float32 类型一致,可以更好地处理梯度消失和梯度爆炸的问题,以及在低精度下保持数值稳定性。PyTorch 支持 BFloat16 类型的计算和存储。PyTorch 提供一些工具和方法来使用 BFloat16 类型进行混合精度训练和推理,例如 torch.bfloat16 数据类型,torch.cuda.amp 模块,torch.nn.BFloat16Module 类等。使用 BFloat16 类型进行混合精度训练和推理的基本思路是:对于计算密集型的操作,如卷积和矩阵乘法,使用 BFloat16 类型进行计算;对于其他的操作,如激活函数和归一化层,使用 float32 类型进行计算。这样可以平衡计算速度和精度损失。

在 PyTorch 使用 BFloat16 时,遇到 Bug,TypeError: Got unsupported ScalarType BFloat16,即:

File "[your file].py", line 38, in [function]
    reference_np = reference.detach().cpu().numpy()    
TypeError: Got unsupported ScalarType BFloat16

原因 PyTorch Version: 1.13.0 版本,不支持直接转换 BFloat16 格式, 在 detach() 之后,增加 to(torch.float),再转换 cpu(),即可:

reference_np = reference.detach().to(torch.float).cpu().numpy()

参考:

### Stable Diffusion 中 `RuntimeError: expected scalar type BFloat16 but found Float` 的解决方案 当在运行 Stable Diffusion 时遇到 `RuntimeError: expected scalar type BFloat16 but found Float`,这通常意味着某些张量的数据类型被设置为 `torch.bfloat16`,而其他部分的操作或模型层期望的是 `torch.float32` 类型。以下是对此问题的分析以及解决方法: #### 问题根源 该错误的根本原因是数据类型的不一致。PyTorch 操作中,如果某个操作期望输入张量为特定数据类型(如 `bfloat16`),但实际接收到另一种类型(如 `float32`),就会触发此类错误[^3]。 #### 解决方案 可以通过以下几种方式来修复这个问题: 1. **统一数据类型** 将所有涉及的张量转换为目标数据类型 `bfloat16` 或者将其全部调整回默认的 `float32` 数据类型。例如,在加载模型权重或初始化变量时,可以强制指定所需的数据类型: ```python model.to(torch.bfloat16) # 如果目标是 bfloat16 tensor = tensor.to(torch.float32) # 转换到 float32 ``` 2. **检查并修正模型配置** 确认 Stable Diffusion 的模型配置文件是否指定了混合精度训练模式(Mixed Precision)。如果是,则需要确保所有的前向传播和反向传播过程都遵循相同的精度标准。可以在训练脚本中通过如下代码禁用自动混合精度: ```python scaler = torch.cuda.amp.GradScaler(enabled=False) with torch.autocast(device_type='cuda', dtype=torch.float32, enabled=True): output = model(input_tensor) ``` 3. **手动调整张量类型** 对于具体引发错误的部分,可以直接将相关张量转换成预期的数据类型。例如: ```python input_tensor = input_tensor.to(torch.bfloat16) # 显式转换至 bfloat16 result = model(input_tensor) ``` 4. **调试工具定位问题源** 使用 PyTorch 提供的调试功能逐步排查哪些张量存在类型不匹配的情况。例如启用钩子函数监控每一步运算中的张量类型变化: ```python def hook_fn(module, input, output): print(f"Input Type: {input[0].dtype}, Output Type: {output.dtype}") for name, layer in model.named_modules(): layer.register_forward_hook(hook_fn) ``` 5. **升级依赖库版本** 部分旧版框架可能存在兼容性问题,建议更新到最新稳定版本的 PyTorch 和 Transformers 库以获得更好的支持: ```bash pip install --upgrade torch transformers accelerate ``` --- ### 示例代码片段 假设问题是由于输入图像未正确处理引起的,可尝试以下代码进行修正: ```python import torch # 假设 image 是原始输入张量 image = image.to(torch.bfloat16) # 调整为 bfloat16 类型 with torch.no_grad(): # 关闭梯度跟踪以防干扰 output = stable_diffusion_model(image) if isinstance(output, tuple): # 处理多输出情况 output = (o.to(torch.float32) for o in output) # 统一转回 float32 else: output = output.to(torch.float32) ``` --- ### 总结 上述方法涵盖了从全局配置调整到局部张量类型转换的不同层面策略。推荐优先考虑整体一致性的方式(如统一使用一种数据类型),这样不仅能够有效解决问题,还能提升程序性能与稳定性[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ManonLegrand

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值