Алгоритм не запускается на GPU даже после сохранения модели и данных в GPU. Чего мне не хватает?

#python #pytorch #gpu #conv-neural-network

#python #pytorch #gpu #conv-нейронная сеть

Вопрос:

Вы можете найти раздел обучения моего кода ниже:

 device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)
  

Примечание: я получаю True, когда проверяю torch.cuda.is_available

После создания модели 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 работает на 100%, а GPU% 1.

Примечание: алгоритм занял 13 минут, когда я использую CPU в качестве устройства, и занял 7 минут, когда я использовал GPU в качестве устройства, так что, кажется, есть небольшое улучшение, но я не мог видеть никакого использования 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)
  

)

Комментарии:

1. возможно, диспетчер задач плохо отображает использование GPU. у меня также иногда возникали проблемы с его мониторингом.

2. Возможно, но мне действительно интересно, не является ли это улучшение с 13 минут до 7 минут действительно низким для использования gpu вместо cpu? Вот почему я склонен полагать, что я неправильно использую gpu, как показывает диспетчер задач.

3. Достаточно справедливо. Возможно, задача такова, что он не может использовать ее в полной мере, например, может быть, ему нужно дождаться поступления данных. Улучшение почти на 50% — это довольно много.

4. И я использовал nvidia-smi для проверки использования, и это было%1, что кажется довольно низким. Не так ли? При загрузке процессора 100%.

5. Я увеличил размер пакета с 10 до 1000 и внимательно наблюдал за использованием GPU, и оно увеличивается с% 1 до% 5 каждые 20 секунд. Итак, я думаю, что вы были правы (большое спасибо), речь шла о размере пакета, кстати, общее время обработки все еще составляет 6,9 минут, я ожидал, что его можно немного сократить, поскольку процесс ввода и вывода графического процессора меньше по сравнению с предыдущим.