addmm_impl_cpu_ not implemented for Half:CPU 相似度计算先显式转 float32

简介: 该问题源于CPU上`torch.matmul`不支持`float16`(Half)输入,报错`"addmm_impl_cpu_" not implemented for 'Half'`。需显式检查张量`dtype`、`device`与`shape`,统一转为`float32`再计算,或确保全程在支持Half的CUDA设备运行。

原帖在 CPU matmul 路径遇到 Half,即 float16;报错与实际设备和算子支持有关:

RuntimeError: "addmm_impl_cpu_" not implemented for 'Half'

Half 的可用性由设备、版本和算子共同决定

原题进入 addmm_implcpu,说明实际走的是 CPU 路径。不能因为机器有 GPU 或模型曾 half(),就假定当前两个编码向量可在 CUDA 半精度上计算。先打印实际操作数,再决定是在 CPU 转 float32,还是明确迁到支持的设备。

某些旧版 CPU 矩阵乘法路径不支持 Half。不要因机器有 GPU 就假设输入一定在 CUDA,也不要只把其中一个矩阵转类型。

在 torch.matmul(inp1, inp2.transpose(...)) 前检查两个实际操作数:

print("josh050608")
print("inp1:", inp1.shape, inp1.dtype, inp1.device)
print("inp2:", inp2.shape, inp2.dtype, inp2.device)

若确实打算在 CPU 算相似度,把两边一起转换:

a = inp1.to(device="cpu", dtype=torch.float32)
b = inp2.to(device="cpu", dtype=torch.float32)
# a、b 分别为 [N,D] 和 [M,D] 时:
scores = a @ b.transpose(0, 1)

这段需已有 import torch。如果只在这一处转 float32,后续再进模型时要与模型的类型约定保持一致。若有意使用 GPU 半精度,应把两边都迁到支持该路径的 CUDA 设备,并验证相应算子,而不是把 CPU Half 当成通用支持。

原帖文字把输入写作 [1256],但堆栈用了二维转置;若真是一维向量,应先明确是一对向量还是两批向量。一对向量的点积可用 torch.dot(a,b),余弦相似度则用 torch.nn.functional.cosine_similarity(a,b,dim=0),不能混淆计算目标。

验证类型一致、内维相同、输出形状符合预期,并用小向量与 float32 参考值对照。新版 CPU 能力可能变化,结论应限定为实际版本/算子路径。

向量对与向量批次分开写

下面用合成 Half 编码在 CPU 转 float32,分别计算批次点积矩阵与单对余弦相似度。它不要求旧版 CPU 支持 Half 矩阵乘法:

import torch
import torch.nn.functional as F
encoded_a = torch.tensor([[1., 0., 1.], [0., 1., 0.]], dtype=torch.float16)
encoded_b = torch.tensor([[1., 0., 1.]], dtype=torch.float16)
a = encoded_a.to(device="cpu", dtype=torch.float32)
b = encoded_b.to(device="cpu", dtype=torch.float32)
dot_scores = a @ b.transpose(0, 1)
cosine_scores = F.normalize(a, dim=1) @ F.normalize(b, dim=1).transpose(0, 1)
single_cosine = F.cosine_similarity(a[0], b[0], dim=0)
assert dot_scores.shape == cosine_scores.shape == (2, 1)
assert torch.allclose(single_cosine, torch.tensor(1.0))
assert torch.allclose(cosine_scores[:, 0], torch.tensor([1., 0.]))
print("dot/cosine:", dot_scores, cosine_scores)

原题若真是两个 [1256] 一维向量,transpose(0,1) 本身也不符合维数,应先明确实际 shape;不要靠 unsqueeze 随意得到一个矩阵后声称相似度语义正确。

函数名叫 batch_cosine_similarity 并不代表里面的 matmul 已归一化。点积和余弦相似度只有在相应归一化条件下才关联,转 dtype 解决算子支持后,还要验证计算目标。

最终检查两边 dtype、device、特征维一致,输出为预期的 N×M 或单个标量,再用已知小向量对照。不同新版 CPU 后端的 Half 支持可能变化,结论限定在实测版本和具体算子,不推广成永久禁用规则。

参考:原始求助帖;技术依据:torch.matmul(2.5)、torch.dot(2.5)、PyTorch CUDA 语义(2.5);normalize 官方源码(2.5.1)。

相关文章
|
2天前
|
缓存 Unix PyTorch
OSError: [Errno 24] Too many open files:两个 DataLoader 可以 zip,先查文件描述符
原帖双Loader并发读取ZIP导致“Too many open files”(Errno 24),实为文件描述符泄漏或生命周期管理不当,非ZIP不支持DataLoader。需排查Dataset中图像/HDF5/ZIP句柄是否及时释放,并优先采用单Loader配对Dataset保障数据一致性与资源可控性。(239字)
|
2天前
|
并行计算 PyTorch 算法框架/工具
Expected all tensors to be on the same device, cuda:0 and cpu:恢复训练时检查 SGD 动量
该问题源于断点续训时优化器状态(如SGD动量缓冲区)未与模型参数同设备,导致`optimizer.step()`中跨设备张量运算失败。前向/反向可正常执行,但动量更新报错“cuda:0 and cpu”。需检查并统一`param`、`grad`及`optimizer.state`中所有Tensor的设备。
|
2天前
|
并行计算 PyTorch Linux
libtorch_python.so: cannot open shared object file:文件缺失时先修复 torch 安装
该问题核心是 PyTorch 1.0.1.post2 安装不完整,`torch/lib/` 下缺失关键文件 `libtorch_python.so`,非环境变量(LD_LIBRARY_PATH)可解决。需先用 `importlib.util.find_spec` 定位真实安装路径,核对文件存在性;再通过 `pip show -f torch` 验证分发完整性。切勿混用版本或复制库文件。
|
2天前
|
并行计算 PyTorch Linux
RuntimeError: CUDA error: device-side assert triggered:Colab 先重启,再找首次断言
该文详解CUDA断言错误调试策略:强调先重启运行时、启用`CUDA_LAUNCH_BLOCKING=1`,用最小张量验证环境;区分“会话已坏”与新操作触发,主张逐段定位而非臆测标签越界,提供实用边界检查函数与验证流程。(239字)
|
2天前
|
并行计算 PyTorch 异构计算
can’t convert CUDA tensor to numpy:只取分类索引时直接用 torch.argmax
原帖因直接对CUDA张量调用`.data.numpy().argmax()`报错:“无法将CUDA张量转为NumPy”。正确做法是:在GPU上用`output.argmax(dim=1).item()`获取单图预测索引,避免全量拷贝,仅传回标量,高效且安全。(239字)
|
2天前
|
PyTorch 算法框架/工具 索引
ValueError: only one element tensors can be converted to Python scalars:张量列表先检查形状,再 stack
该文解析PyTorch中`list(tensor)`引发的`ValueError`根源:列表含多元素张量时,不可直接转Python标量。强调应通过`tensor.shape`或遍历打印各张量尺寸来查形状;同形张量用`torch.stack`(增维)而非`cat`或`item`;异形则保留原结构,避免强行转换。
|
2天前
|
数据可视化 PyTorch 算法框架/工具
only batches of spatial targets supported:三通道分割 one-hot 转为每像素类别编号
该报错源于PyTorch交叉熵要求标签为`[N, H, W]`(3D),但输入了`[N, 3, H, W]`(4D)掩码。需先验证三通道是否为互斥one-hot,再用`argmax(dim=1)`转为整型标签,并妥善处理全零未标注像素(设`ignore_index`),避免误判为背景类。(239字)
|
2天前
|
PyTorch 算法框架/工具 异构计算
Expected object of scalar type Float but got scalar type Double for argument #4 'mat1':NumPy 输入与 Linear 权重怎样统一类型
PyTorch中`RuntimeError: Expected Float but got Double`常因输入Tensor(float64)与模型权重(float32)类型不一致导致。关键在第一层Linear的输入与权重dtype需统一:可将数据转为float32(推荐),或模型整体升为float64。务必检查`tensor.dtype`而非数值显示,并确保`loss.backward()`前类型已对齐。(239字)
|
2天前
|
机器学习/深度学习 索引
The size of tensor a (133) must match tensor b (10):分类任务换 MSELoss 后先查标签含义
原帖网络输出133类logits,CrossEntropyLoss支持类别索引输入(如`[10]`),而MSELoss要求`outputs`与`target`形状严格匹配(如`[10,133]`)。报错因`target`为`[10]`,无法广播匹配`[10,133]`输出,本质是两类损失对标签格式约定不同。
|
2天前
|
PyTorch 算法框架/工具 索引
RuntimeError: expected scalar type Long but found Float:NLLLoss 要改 labels,不要把 images 转 long
该问题源于`NLLLoss`要求标签为`torch.long`类型(类别索引),但输入为`float`。需确保标签是整数编号(非概率/小数),并在`DataLoader`中统一配对图像与标签,避免双Loader错位;推荐改用`CrossEntropyLoss`配原始logits,或`LogSoftmax+NLLLoss`组合。(239字)

热门文章

最新文章