Python 算法不’;即使将模型和数据存储到GPU中,也不能在GPU上运行。我错过了什么?

Python 算法不’;即使将模型和数据存储到GPU中,也不能在GPU上运行。我错过了什么?,python,pytorch,gpu,cnn,Python,Pytorch,Gpu,Cnn,您可以在下面找到“我的代码”的“培训”部分: device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’) 注意:当我检查torch.cuda.U是否可用时,我收到的是True 创建CNN模型后,我写道: model = model.to(device) 培训科: import time start_time = time.time() epochs = 3 #Limits on numbers of batc

您可以在下面找到“我的代码”的“培训”部分:

device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)
注意:当我检查torch.cuda.U是否可用时,我收到的是True

创建CNN模型后,我写道:

model = model.to(device)
培训科:

import time
start_time = time.time()

epochs = 3

#Limits on numbers of batches if you want train faster(Not mandatory)
max_trn_batch = 800 # batch 10 image --> 8000 images total
max_tst_batch = 300 # batch 10 image --> 3000 images total

train_losses = []
test_losses = []
train_correct = []
test_correct = []

for i in range(epochs):

trn_corr = 0
tst_corr = 0

for b,(X_train,y_train) in enumerate(train_loader):
    X_train,y_train = X_train.to(device),y_train.to(device)
    
    #optinal limit number of batches
    if b == max_trn_batch:
        break
    b = b + 1
    
    y_pred = model(X_train)
    loss = criterion(y_pred,y_train)
    
    predicted = torch.max(y_pred.data,1)[1]
    batch_corr = (predicted == y_train).sum()
    trn_corr = trn_corr + batch_corr
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    if b%200 == 0:
        print('Epoch:  {} Loss:  {} Accuracy:  {}'.format(i,loss,trn_corr.item()*100/(10*b)))

train_losses.append(loss)
train_correct.append(trn_corr)


#test set

with torch.no_grad():
    for b,(X_test,y_test) in enumerate(test_loader):
        X_test,y_test = X_test.to(device),y_test.to(device)
        
        #Optional
        if b==max_tst_batch:
            break
        y_val = model(X_test)
        predicted = torch.max(y_val.data,1)[1]
        batch_corr = (predicted == y_test).sum()
        tst_corr = tst_corr + batch_corr

loss = criterion(y_val,y_test)
test_losses.append(loss)
test_correct.append(tst_corr)
total_time = time.time() - start_time
print(f’Total Time: {total_time/60}) minutes’)
在培训期间,我正在检查CPU和GPU的性能,CPU在GPU为%1时工作%100

注意:当我使用CPU作为设备时,算法用了13分钟,当我使用GPU作为设备时,算法用了7分钟,所以似乎有微小的改进,但在培训期间,我看不到任务管理器上有任何GPU利用率

注2:参数

ConvolutionalNetwork(
  (conv1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
  (fc1): Linear(in_features=46656, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=2, bias=True)

)

任务管理器可能无法很好地显示GPU的使用情况。我有时也很难监控它。也许吧,但我真的很想知道,使用gpu而不是cpu,从13分钟到7分钟的改进不是真的很低吗?这就是为什么我的目标是相信我没有像任务管理器所显示的那样正确地使用gpu。也许任务是这样的,以至于它无法充分利用它,就像它必须等待数据到达一样。不过,几乎50%的改进是相当大的。我使用nvidia smi检查利用率,结果是%1,这似乎很低。不是吗?CPU利用率为%100。我将批处理大小从10增加到1000,并仔细观察GPU利用率,每20秒将其从%1增加到%5。所以我认为你们是对的(非常感谢),这是关于批量的大小,顺便说一句,总的处理时间仍然是6.9分钟,我希望它可以减少一点,因为有较少的gpu在和gpu的进程相比,前一个。