内存分配共分区内核

时间:2019-06-04 09:47:37

标签: gpflow

我目前正在使用共区域化的线性模型 (例如,参见alvarez注释https://arxiv.org/pdf/1106.6251.pdf) 通过SVGP进行了优化。

我注意到运行OOM之前诱导点数的上限已大大降低(现在不使用共区域化内核时,诱导点数约为5k而不是8k)。根据我的理解,限制瓶颈应该是相同的(仍然是MxM内核矩阵),但是似乎有更多的变化。

此外,我现在得到警告:

.../lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning:

Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.

内核矩阵的构造如下。 我不使用大Q或Rs(Q = 3,R = 3)。

    def coreg_k(Q, R, output_dim, active_dims):
        # create Q different kernels with rank R
        coreg = []
        k_q = []

        # lengthscales = np.logspace(-1, 3, 5)
        lengthscales = [0.1, 1, 5]
        for q in range(Q):
            coreg_tmp = gpflow.kernels.Coregion(input_dim=1, output_dim=output_dim, rank=R, active_dims=active_dims)
            coreg_tmp.W = np.random.randn(output_dim, R)
            coreg.append(coreg_tmp)

            k_tmp = []
            k_tmp.append(Matern52(input_dim=len(kernel_idxs["coords"]), active_dims=kernel_idxs["coords"],
                                  lengthscales=lengthscales[q], ARD=False))
            k_tmp.append(RBF(input_dim=len(kernel_idxs["rest"]), active_dims=kernel_idxs["rest"],
                             ARD=True, lengthscales=lengthscales[q]))

            k = k_tmp[0]
            for i in range(1, len(k_tmp)):
                k += k_tmp[i]

            k_q.append(k)

        # combine all those kernels
        kern_lcm = coreg[0] * k_q[0]
        for q in range(1, Q):
            kern_lcm += coreg[q] * k_q[q]

        return kern_lcm

什么占用了这么多内存?来自额外内核的更多参数应该不会有太大变化。

谢谢。

1 个答案:

答案 0 :(得分:2)

在计算Kuu矩阵时,共分区内核构造了一个M x M矩阵。因此,如果您有Q个Coregion内核,tensorflow实际上需要分配Q x M x M内存。这不是数量级的增加,而是内核数量的线性关系,这似乎与可以容纳在计算机内存中的诱导点数量大致相符。

要更有效地实现内部共域化模型,请查看GPflow文档中的resample。希望这会有所帮助!