#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 минут, я ожидал, что его можно немного сократить, поскольку процесс ввода и вывода графического процессора меньше по сравнению с предыдущим.