火炬代码不在 GPU 上运行

Posted

技术标签:

【中文标题】火炬代码不在 GPU 上运行【英文标题】:Torch code not running on GPU 【发布时间】:2018-09-11 18:54:35 【问题描述】:

我在 Torch 中运行一个优化问题。我的手电筒安装与 GPU 兼容,但出于某种奇怪的原因,它在运行时根本不使用 GPU。一切似乎都是由 CPU 和我的本地 RAM 完成的。

import numpy as np
import scipy.sparse.csgraph as csg
import torch
from torch.autograd import Variable
import torch.autograd as autograd
import matplotlib.pyplot as plt

%matplotlib inline

def cmdscale(D):
    # Number of points                                                                        
    n = len(D)

    # Centering matrix                                                                        
    H = np.eye(n) - np.ones((n, n))/n

    # YY^T                                                                                    
    B = -H.dot(D**2).dot(H)/2

    # Diagonalize                                                                             
    evals, evecs = np.linalg.eigh(B)

    # Sort by eigenvalue in descending order                                                  
    idx   = np.argsort(evals)[::-1]
    evals = evals[idx]
    evecs = evecs[:,idx]

    # Compute the coordinates using positive-eigenvalued components only                      
    w, = np.where(evals > 0)
    L  = np.diag(np.sqrt(evals[w]))
    V  = evecs[:,w]
    Y  = V.dot(L)

    return Y, evals

Y = np.array([[0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
              [0., 0., 0., 0., 0., 1., 1., 0., 1., 0., 0., 0., 0., 0., 0.],
              [0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
              [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 1., 0.],
              [0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0.],
              [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
              [0., 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1.],
              [0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
              [1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 1.],
              [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
              [0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
              [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 1.],
              [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0.],
              [0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0.],
              [0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1., 0., 0., 0.]])

temp = Y[~np.all(Y == 0, axis=1)]
temp = temp[:,~np.all(Y == 0, axis=1)]
Y = np.asarray(temp, dtype='uint8')

n = np.shape(Y)[0]
k = 2

D = csg.shortest_path(Y, directed=True)
Z = cmdscale(D)[0][:,0:k]
Z = Z - Z.mean(axis=0, keepdims=True)

def distMatrix(m):
    n = m.size(0)
    d = m.size(1)
    x = m.unsqueeze(1).expand(n, n, d)
    y = m.unsqueeze(0).expand(n, n, d)
    return torch.sqrt(torch.pow(x - y, 2).sum(2) + 1e-4)

def loss(tY):
    d = -distMatrix(tZ)+B
    sigmoidD = torch.sigmoid(d)
    reduce = tY*torch.log(sigmoidD)+(1-tY)*torch.log(1-sigmoidD)
    #remove diagonal
    reduce[torch.eye(n).byte().cuda()] = 0
    return -reduce.sum()

tZ = autograd.Variable(torch.cuda.FloatTensor(Z), requires_grad=True)
B = autograd.Variable(torch.cuda.FloatTensor([0]), requires_grad=True)

tY = autograd.Variable(torch.cuda.FloatTensor(Y), requires_grad=False)

losses = []
biases = []
#rocAuc = []
learning_rate = 1e-3
epochs = 10000

percentDone = 0
percent = 5
for i in range(epochs):
    if i % (epochs*percent*0.01) == 0:
        percentDone += percent
        print(str(percentDone) + "%")

    l = loss(tY)
    l.backward(retain_graph=True)
    losses.append(float(l))
    biases.append(B.data)
    tZ.data = tZ.data - learning_rate * tZ.grad.data
    B.data = B.data - learning_rate * B.grad.data

    tZ.grad.data.zero_()
    B.grad.data.zero_()

plt.subplot(122)
plt.plot(losses)
plt.title('Loss')
plt.xlabel('Iteration')
plt.ylabel('loss')

plt.show()

代码非常多,但这是一个工作示例,如何使这些代码在我的 GPU 上运行?有可能吗?任何正确方向的提示或轻推将不胜感激。

【问题讨论】:

我在我的系统上运行你的脚本。好像是在使用GPU,但是使用量在200--300M左右。 【参考方案1】:

也许您缺少 cuda 工具包,或者它无法在您的 PyTorch 安装中正常工作。 你能先检查一下这个功能吗

torch.cuda.is_available()

返回真。如果没有,您应该检查 cuda 工具包是否有效,并且您使用的 PyTorch 版本是否适合您的 cuda 安装。

【讨论】:

返回真 你是如何检查你的 GPU 没有被使用的?在我的计算机上运行您的代码时,我没有任何问题。它似乎正确地使用了 GPU。 Windows 任务管理器没有显示 GPU 正在运行任何东西。没有 GPU 负载或内存使用。它显示了我的 CPU 和本地内存的高利用率 在 Windows 上看起来像 PyTorch 的问题。 是的。当您运行其中一个 pytorch 示例时会发生什么?

以上是关于火炬代码不在 GPU 上运行的主要内容,如果未能解决你的问题,请参考以下文章

使用多个 GPU 运行 LSTM 会得到“输入和隐藏张量不在同一设备上”

Shap KernelExplainer 不在 GPU 上运行

GPU cuda代码可以在多个GPU卡上运行而无需任何实现吗?

opengl 代码是不是在 GPU 上运行?

检查代码是在GPU还是CPU上运行

如何让代码在 Windows 10 上的 GPU 上运行?