gpt4 book ai didi

python - Pytorch 张量的截断 SVD 分解而不转移到 cpu

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:16 25 4
gpt4 key购买 nike

我正在 Pytorch 中训练模型,我想对输入使用截断 SVD 分解。为了计算 SVD,我将输入女巫是一个 Pytorch Cuda 张量传输到 CPU,并使用 scikit-learn 中的 TruncatedSVD 执行截断,之后,我将结果传输回 GPU。以下是我的模型的代码:

 class ImgEmb(nn.Module):
def __init__(self, input_size, hidden_size):
super(ImgEmb, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.drop = nn.Dropout(0.2)
self.mlp = nn.Linear(input_size/2, hidden_size)
self.relu = nn.Tanh()
self.svd = TruncatedSVD(n_components=input_size/2)

def forward(self, input):
svd=self.svd.fit_transform(input.cpu())
svd_tensor=torch.from_numpy(svd)
svd_tensor=svd_tensor.cuda()
mlp=self.mlp(svd_tensor)
res = self.relu(mlp)
return res

我想知道是否有一种方法可以在不来回传输到 GPU 的情况下实现截断 SVD? (因为非常耗时,而且一点效率都没有)

最佳答案

您可以直接使用 PyTorch 的 SVD 并手动截断它,或者您可以使用来自 TensorLy 的截断 SVD。 ,使用 PyTorch 后端:

import tensorly as tl
tl.set_backend('pytorch')

U, S, V = tl.truncated_svd(matrix, n_eigenvecs=10)

但是,GPU SVD 在大型矩阵上的扩展性不是很好。您还可以使用 TensorLy 的部分 svd,它仍然会将您的输入复制到 CPU,但如果您只保留几个特征值,速度会快得多,因为它将使用稀疏特征分解。在 Scikit-learn 的截断 SVD 中,您还可以使用“algorithm = arpack”来使用 Scipy 的稀疏 SVD,如果您只需要几个组件,这可能会更快。

关于python - Pytorch 张量的截断 SVD 分解而不转移到 cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58026949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com