ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka
Ma kēia ʻatikala, e haʻi wau iā ʻoe pehea e hoʻonohonoho ai i kahi kaiapuni aʻo mīkini i loko o 30 mau minuke, e hana i kahi neural network no ka ʻike kiʻi, a laila holo i ka pūnaewele like ma kahi kaʻina hana kiʻi (GPU).

ʻO ka mea mua, e wehewehe i ke ʻano o ka neural network.

I kā mākou hihia, he kŘkohu makemakika kēia, a me kāna lako polokalamu a i ʻole ke ʻano ʻenehana, i kūkulu ʻia ma ke kumu o ka hoʻonohonoho ʻana a me ka hana ʻana o nā neural network biological - nā ʻupena o nā pūnana nerve o kahi mea ola. Ua ala mai kēia manaʻo i ka wā e aʻo ana i nā kaʻina hana i loko o ka lolo a hoʻāʻo e hoʻohālike i kēia mau kaʻina hana.

ʻAʻole hoʻolālā ʻia nā neural network ma ke ʻano maʻamau o ka huaʻōlelo, ua aʻo ʻia lākou. ʻO ka hiki ke aʻo ʻo ia kekahi o nā pono nui o nā neural network ma mua o nā algorithm kuʻuna. ʻO ka ʻenehana, ʻo ke aʻo ʻana ka loaʻa ʻana o nā coefficients o nā pilina ma waena o nā neurons. I ka wā o ka hoʻomaʻamaʻa ʻana, hiki i ka neural network ke ʻike i nā hilinaʻi paʻakikī ma waena o ka ʻikepili hoʻokomo a me ka ʻikepili hoʻopuka, a me ka hoʻokō generalization.

Mai ka manaʻo o ke aʻo ʻana i ka mīkini, ʻo kahi neural network kahi hihia kūikawā o nā ʻano hana ʻike kumu, ka nānā ʻana i ka discriminant, nā ʻano clustering a me nā ʻano hana ʻē aʻe.

Kākoʻo

ʻO ka mua, e nānā kākou i nā mea hana. Pono mākou i kahi kikowaena me ka ʻōnaehana hana Linux i kau ʻia ma luna. ʻO nā mea hana e pono ai no ka hoʻohana ʻana i nā ʻōnaehana aʻo mīkini he ikaika loa a, ʻo ka hopena, he kumukūʻai. No ka poʻe i loaʻa ʻole kahi mīkini maikaʻi ma ka lima, paipai wau e hoʻolohe i nā hāʻawi o nā mea hāʻawi kapua. Hiki iā ʻoe ke hoʻolimalima koke i ke kikowaena i koi ʻia a uku wale no ka manawa hoʻohana.

Ma nā papahana kahi e pono ai ke hana i nā pūnaewele neural, hoʻohana wau i nā kikowaena o kekahi o nā mea hoʻolako kapua Lūkini. Hāʻawi ka hui i nā kikowaena kapua no ka hoʻolimalima kikoʻī no ka aʻo ʻana i ka mīkini me nā mea hana kiʻi kiʻi Tesla V100 ikaika (GPU) mai NVIDIA. I ka pōkole: ʻo ka hoʻohana ʻana i kahi kikowaena me kahi GPU hiki ke lilo i ʻumi mau manawa ʻoi aku ka maikaʻi (wikiwiki) i hoʻohālikelike ʻia me kahi kikowaena o nā kumukūʻai like e hoʻohana ana i kahi CPU (ke kikowaena kikowaena kaulana kaulana) no ka helu ʻana. Loaʻa kēia ma muli o nā hiʻohiʻona o ka hoʻolālā GPU, e hoʻokō wikiwiki ana i nā helu helu.

No ka hoʻokō ʻana i nā hiʻohiʻona i hōʻike ʻia ma lalo nei, ua kūʻai mākou i kēia kikowaena no kekahi mau lā:

  • SSD disk 150 GB
  • RAM 32 GB
  • Tesla V100 16 Gb kaʻina hana me 4 cores

Ua hoʻokomo mākou i ka Ubuntu 18.04 ma kā mākou mīkini.

Hoʻonohonoho i ke kaiapuni

I kēia manawa e hoʻokomo kāua i nā mea āpau e pono ai no ka hana ma ke kikowaena. No ka mea ʻo kā mākou ʻatikala no ka poʻe hoʻomaka, e kamaʻilio wau e pili ana i kekahi mau mea e pono ai lākou.

Hana ʻia ka nui o ka hana i ka wā e hoʻonohonoho ai i kahi kaiapuni ma o ka laina kauoha. Hoʻohana ka hapa nui o nā mea hoʻohana iā Windows i kā lākou OS hana. ʻO ka console maʻamau i kēia OS e waiho nui i ka makemake. No laila, e hoʻohana mākou i kahi mea hana maʻalahi Cmder/. Hoʻoiho i ka mana liʻiliʻi a holo iā Cmder.exe. A laila pono ʻoe e hoʻopili i ke kikowaena ma o SSH:

ssh root@server-ip-or-hostname

Ma kahi o ka server-ip-or-hostname, e kuhikuhi i ka IP address a i ʻole ka inoa DNS o kāu kikowaena. A laila, e hoʻokomo i ka ʻōlelo huna a inā kūleʻa ka pilina, pono mākou e loaʻa i kahi leka e like me kēia.

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-74-generic x86_64)

ʻO ka ʻōlelo nui no ka hoʻomohala ʻana i nā hiʻohiʻona ML ʻo Python. A ʻo ke kahua kaulana loa no kona hoʻohana ʻana ma Linux ʻo ia Anaconda.

E hoʻokomo iā ia ma kā mākou kikowaena.

Hoʻomaka mākou ma ka hoʻonui ʻana i ka luna pūʻolo kūloko:

sudo apt-get update

E hoʻouka i ka curl (mea hoʻohana laina kauoha):

sudo apt-get install curl

Hoʻoiho i ka mana hou o Anaconda Distribution:

cd /tmp
curl –O https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh

E hoʻomaka kākou i ke kau ʻana:

bash Anaconda3-2019.10-Linux-x86_64.sh

I ka wā o ke kaʻina hana, e noi ʻia ʻoe e hōʻoia i ka ʻaelike laikini. Ma hope o ka hoʻokomo pono ʻana, pono ʻoe e ʻike i kēia:

Thank you for installing Anaconda3!

Ua hana ʻia nā ʻōhua he nui no ka hoʻomohala ʻana i nā hiʻohiʻona ML; hana mākou me nā mea kaulana loa: ʻO PyTorch и Pulelehua.

ʻO ka hoʻohana ʻana i ka framework hiki iā ʻoe ke hoʻonui i ka wikiwiki o ka hoʻomohala ʻana a hoʻohana i nā mea hana i mākaukau no nā hana maʻamau.

Ma kēia hiʻohiʻona e hana mākou me PyTorch. E hoʻouka kākou:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

I kēia manawa pono mākou e hoʻolauna iā Jupyter Notebook, kahi mea hana hoʻomohala kaulana no nā loea ML. Hiki iā ʻoe ke kākau i ke code a ʻike koke i nā hopena o kāna hoʻokō. Hoʻokomo ʻia ʻo Jupyter Notebook me Anaconda a ua kau ʻia ma kā mākou kikowaena. Pono ʻoe e hoʻopili iā ia mai kā mākou ʻōnaehana desktop.

No ka hana ʻana i kēia, e hoʻomaka mua mākou iā Jupyter ma ke kikowaena e kuhikuhi ana i ke awa 8080:

jupyter notebook --no-browser --port=8080 --allow-root

A laila, e wehe ana i kahi ʻaoʻao ʻē aʻe i kā mākou Cmder console (luna papa - New console dialog) e hoʻopili mākou ma o ke awa 8080 i ke kikowaena ma o SSH:

ssh -L 8080:localhost:8080 root@server-ip-or-hostname

Ke komo mākou i ke kauoha mua, e hāʻawi ʻia mākou i nā loulou e wehe iā Jupyter i kā mākou polokalamu kele pūnaewele:

To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-18788-open.html
    Or copy and paste one of these URLs:
        http://localhost:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311
     or http://127.0.0.1:8080/?token=cca0bd0b30857821194b9018a5394a4ed2322236f116d311

E hoʻohana kākou i ka loulou no localhost:8080. E kope i ke ala holoʻokoʻa a hoʻopili iā ia i loko o ka pahu helu o ka polokalamu kele pūnaewele o kāu PC. E wehe ana ʻo Jupyter Notebook.

E hana kākou i puke puke hou: New - Notebook - Python 3.

E nānā kākou i ka hana kūpono o nā ʻāpana a pau a mākou i hoʻokomo ai. E hoʻokomo i ka code PyTorch code i Jupyter a holo i ka hoʻokō (Run button):

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)

Pono ka hopena e like me kēia:

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

Inā he hopena like kāu, a laila ua hoʻonohonoho pono mākou i nā mea āpau a hiki iā mākou ke hoʻomaka i ka hoʻomohala ʻana i kahi neural network!

Ke hana ʻana i kahi pūnaewele neural

E hana mākou i kahi pūnaewele neural no ka ʻike kiʻi. E lawe kākou i kēia i kumu alakaʻi.

E hoʻohana mākou i ka ʻikepili CIFAR10 i loaʻa i ka lehulehu e aʻo i ka pūnaewele. Loaʻa iā ia nā papa: "mokulele", "kaʻa", "manu", "pōkole", "dia", "ʻīlio", "frog", "lio", "moku", "truck". ʻO nā kiʻi ma CIFAR10 he 3x32x32, ʻo ia hoʻi, nā kiʻi kala 3-channel o 32x32 pixels.

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka
No ka hana, e hoʻohana mākou i ka pōʻai i hana ʻia e PyTorch no ka hana ʻana me nā kiʻi - torchvision.

E hana mākou i kēia mau ʻanuʻu i ka hoʻonohonoho:

  • Hoʻouka a hoʻomaʻamaʻa i ka hoʻomaʻamaʻa ʻana a me ka hoʻāʻo ʻana i nā pūʻulu ʻikepili
  • Wehewehe Neural Network
  • Hoʻomaʻamaʻa pūnaewele ma ka ʻikepili aʻo
  • ʻO ka hoʻāʻo ʻana i ka ʻike pūnaewele
  • E hana hou i ka hoʻomaʻamaʻa a me ka hoʻāʻo ʻana me ka GPU

E hoʻokō mākou i nā code āpau ma lalo nei ma Jupyter Notebook.

Hoʻouka a maʻamau CIFAR10

E kope a holo i kēia code ma Jupyter:


import torch
import torchvision
import torchvision.transforms as transforms

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

Pono ka pane:

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified

E hōʻike i kekahi mau kiʻi hoʻomaʻamaʻa no ka hoʻāʻo ʻana:


import matplotlib.pyplot as plt
import numpy as np

# functions to show an image

def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()

# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()

# show images
imshow(torchvision.utils.make_grid(images))
# print labels
print(' '.join('%5s' % classes[labels[j]] for j in range(4)))

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

Wehewehe Neural Network

E noʻonoʻo mua kākou i ka hana ʻana o kahi pūnaewele neural no ka ʻike kiʻi. ʻO kēia kahi pūnaewele kiko-i-point maʻalahi. Lawe ʻo ia i ka ʻikepili hoʻokomo, hoʻohele iā ia i kekahi mau papa i kēlā me kēia, a laila hoʻopuka i ka ʻikepili puka.

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

E hana mākou i kahi pūnaewele like i ko mākou kaiapuni:


import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

Hoʻomaopopo pū mākou i kahi hana poho a me kahi mea hoʻoponopono


import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

Hoʻomaʻamaʻa pūnaewele ma ka ʻikepili aʻo

E hoʻomaka kākou e aʻo i kā mākou pūnaewele neural. E ʻoluʻolu, ma hope o kou holo ʻana i kēia code, pono ʻoe e kali a hiki i ka pau ʻana o ka hana. He 5 mau minuke. Pono ka manawa e aʻo ai i ka pūnaewele.

 for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

Loaʻa iā mākou ka hopena aʻe:

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

Mālama mākou i kā mākou kumu hoʻohālike i aʻo ʻia:

PATH = './cifar_net.pth'
torch.save(net.state_dict(), PATH)

ʻO ka hoʻāʻo ʻana i ka ʻike pūnaewele

Hoʻomaʻamaʻa mākou i ka pūnaewele me ka hoʻohana ʻana i kahi ʻikepili hoʻomaʻamaʻa. Akā pono mākou e nānā inā ua aʻo ʻia ka pūnaewele i kekahi mea.

E hoʻāʻo mākou i kēia ma ka wānana ʻana i ka lepili papa i hoʻopuka ʻia e ka neural network a hoʻāʻo iā ia e ʻike inā he ʻoiaʻiʻo. Inā pololei ka wānana, hoʻohui mākou i ka hāpana i ka papa inoa o nā wānana pololei.
E hōʻike mākou i kahi kiʻi mai ka hoʻonohonoho hoʻāʻo:

dataiter = iter(testloader)
images, labels = dataiter.next()

# print images
imshow(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

I kēia manawa e nīnau mākou i ka neural network e haʻi iā mākou i nā mea i loko o kēia mau kiʻi:


net = Net()
net.load_state_dict(torch.load(PATH))

outputs = net(images)

_, predicted = torch.max(outputs, 1)

print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]
                              for j in range(4)))

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

ʻIke maikaʻi nā hopena: ʻike pololei ka pūnaewele i ʻekolu o nā kiʻi ʻehā.

E ʻike kākou i ka hana ʻana o ka ʻupena ma ka ʻikepili holoʻokoʻa.


correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

Me he mea lā ua ʻike ka pūnaewele i kekahi mea a ke hana nei. Inā hoʻoholo ʻo ia i nā papa ma ke koho ʻole, ʻo 10% ka pololei.

E ʻike kākou i nā papa i ʻike maikaʻi ʻia e ka pūnaewele:

class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs, 1)
        c = (predicted == labels).squeeze()
        for i in range(4):
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1


for i in range(10):
    print('Accuracy of %5s : %2d %%' % (
        classes[i], 100 * class_correct[i] / class_total[i]))

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

Me he mea lā ʻoi aku ka maikaʻi o ka pūnaewele i ka ʻike ʻana i nā kaʻa a me nā moku: 71% pololei.

No laila ke hana nei ka pūnaewele. I kēia manawa, e ho'āʻo kākou e hoʻololi i kāna hana i ke kaʻina hana kiʻi (GPU) a ʻike i nā loli.

Hoʻomaʻamaʻa i kahi pūnaewele neural ma GPU

ʻO ka mea mua, e wehewehe pōkole wau i ke ʻano o CUDA. ʻO ka CUDA (Compute Unified Device Architecture) he kahua hoʻolikelike like i hoʻomohala ʻia e NVIDIA no ka hoʻopili helu maʻamau ma nā ʻāpana hana kiʻi (GPU). Me CUDA, hiki i nā mea hoʻomohala ke hoʻolalelale i nā noi computing ma o ka hoʻohana ʻana i ka mana o GPU. Ua kau ʻia kēia kahua ma kā mākou kikowaena a mākou i kūʻai ai.

E wehewehe mua i kā mākou GPU ma ke ʻano he mea cuda mua i ʻike ʻia.

device = torch . device ( "cuda:0" if torch . cuda . is_available () else "cpu" )
# Assuming that we are on a CUDA machine, this should print a CUDA device:
print ( device )

ʻO kāu pūnaewele neural mua ma kahi ʻāpana hana kiʻi (GPU). Ke Alakai Hoomaka

Hoʻouna i ka pūnaewele i ka GPU:

net.to(device)

Pono mākou e hoʻouna i nā mea hoʻokomo a me nā pahuhopu i kēlā me kēia pae i ka GPU:

inputs, labels = data[0].to(device), data[1].to(device)

E aʻo hou kākou i ka pūnaewele ma ka GPU:

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
    inputs, labels = data[0].to(device), data[1].to(device)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

I kēia manawa, ua lōʻihi ka hoʻomaʻamaʻa pūnaewele ma kahi o 3 mau minuke. E hoʻomanaʻo mākou i ka manawa like ma kahi kaʻina hana maʻamau he 5 mau minuke. ʻAʻole koʻikoʻi ka ʻokoʻa, hana kēia no ka mea ʻaʻole nui loa kā mākou pūnaewele. Ke hoʻohana nei i nā papa hana nui no ka hoʻomaʻamaʻa ʻana, e hoʻonui ka ʻokoʻa ma waena o ka wikiwiki o ka GPU a me kahi kaʻina hana kuʻuna.

Me he mea lā ʻo ia wale nō. ʻO ka mea i hiki iā mākou ke hana:

  • Ua nānā mākou i ke ʻano o ka GPU a koho i ke kikowaena kahi i kau ʻia ai;
  • Ua hoʻonohonoho mākou i kahi polokalamu polokalamu e hana i kahi pūnaewele neural;
  • Ua hana mākou i kahi pūnaewele neural no ka ʻike kiʻi a hoʻomaʻamaʻa iā ia;
  • Ua hana hou mākou i ka hoʻomaʻamaʻa pūnaewele me ka hoʻohana ʻana i ka GPU a loaʻa ka piʻi o ka wikiwiki.

E hauʻoli wau e pane i nā nīnau ma nā manaʻo.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka