【问题标题】:Truncate SVD decomposition of Pytorch tensor without transfering to cpuPytorch张量的截断SVD分解而不转移到cpu
【发布时间】:2020-01-21 10:17:28
【问题描述】:

我正在 Pytorch 中训练一个模型,我想对输入使用截断的 SVD 分解。为了计算 SVD,我将输入女巫是 Pytorch Cuda Tensor 传输到 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

我想知道有没有一种方法可以实现截断的 SVD 而无需来回传输到 GPU? (因为它非常耗时,而且根本没有效率)

【问题讨论】:

    标签: python scikit-learn pytorch svd


    【解决方案1】:

    您可以直接使用 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,如果您只需要几个组件,这可能会更快。

    【讨论】:

      【解决方案2】:

      如何将张量 CUDA 转换到 CPU 中?

      如果你有一个 CUDA 张量,你可以用这条指令把它传输到 CPU:

      y_vel 是 cuda 中的 pytorch 张量。

      y_val = y_val.cpu().data.numpy()
      

      【讨论】:

        猜你喜欢
        • 2018-07-03
        • 2015-11-15
        • 1970-01-01
        • 2021-10-11
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 2021-02-06
        相关资源
        最近更新 更多