Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari
A cikin wannan labarin, zan gaya muku yadda ake saita yanayin koyon injin a cikin mintuna 30, ƙirƙirar hanyar sadarwa ta jijiyoyi don tantance hoto, sannan gudanar da hanyar sadarwa iri ɗaya akan na'urar sarrafa hoto (GPU).

Da farko, bari mu ayyana mene ne hanyar sadarwa ta jijiyoyi.

A cikin yanayinmu, wannan sigar lissafi ce, da software ko kayan aikinta, wanda aka gina akan ka'idar tsari da aiki na hanyoyin sadarwar jijiyoyi - hanyoyin sadarwa na jijiyoyi na rayayyun kwayoyin halitta. Wannan ra'ayi ya taso ne yayin da ake nazarin hanyoyin da ke faruwa a cikin kwakwalwa da ƙoƙarin tsara waɗannan hanyoyin.

Ba a tsara hanyoyin sadarwar jijiyoyi a cikin ma'anar kalmar da aka saba ba, an horar da su. Ikon koyo shine ɗayan manyan fa'idodin hanyoyin sadarwar jijiyoyi akan algorithms na gargajiya. A fasaha, koyo ya ƙunshi nemo ƙididdiga na haɗin kai tsakanin neurons. A yayin aikin horo, cibiyar sadarwar jijiyoyi tana iya gano hadaddun dogara tsakanin bayanan shigarwa da bayanan fitarwa, da kuma yin gabaɗaya.

Daga mahangar koyon na'ura, hanyar sadarwa ta jijiyoyi wani lamari ne na musamman na hanyoyin tantance alamu, bincike na wariya, hanyoyin tari da sauran hanyoyin.

Kayan aiki

Da farko, bari mu dubi kayan aiki. Muna buƙatar uwar garken da aka shigar da tsarin aiki na Linux. Kayan aikin da ake buƙata don sarrafa tsarin koyon injin suna da ƙarfi sosai kuma, sakamakon haka, tsada. Ga wadanda ba su da na'ura mai kyau a hannun, Ina ba da shawarar kula da tayin masu samar da girgije. Kuna iya hayan uwar garken da ake buƙata da sauri kuma ku biya kawai don lokacin amfani.

A cikin ayyukan da ya wajaba don ƙirƙirar cibiyoyin sadarwar jijiyoyi, Ina amfani da sabobin ɗaya daga cikin masu samar da girgije na Rasha. Kamfanin yana ba da sabar gajimare don hayar musamman don koyon injin tare da na'urori masu sarrafa hoto na Tesla V100 mai ƙarfi (GPU) daga NVIDIA. A takaice: yin amfani da uwar garken tare da GPU na iya zama sau goma mafi inganci (sauri) idan aka kwatanta da uwar garken irin wannan farashi wanda ke amfani da CPU (sanantaccen sashin sarrafawa na tsakiya) don ƙididdigewa. Ana samun wannan ne saboda fasalulluka na gine-ginen GPU, wanda ke jimre da lissafin da sauri.

Don aiwatar da misalan da aka bayyana a ƙasa, mun sayi uwar garken mai zuwa na kwanaki da yawa:

  • SSD faifai 150 GB
  • RAM 32 GB
  • Tesla V100 16 Gb processor tare da cores 4

Mun sanya Ubuntu 18.04 akan injin mu.

Kafa muhalli

Yanzu bari mu shigar da duk abin da ake bukata don aiki a kan uwar garke. Tunda labarinmu na farko na masu farawa ne, zan yi magana game da wasu abubuwan da za su kasance masu amfani.

Yawancin ayyuka yayin kafa yanayi ana yin su ta hanyar layin umarni. Yawancin masu amfani suna amfani da Windows azaman OS ɗin su. Daidaitaccen na'ura mai kwakwalwa a cikin wannan OS yana barin abubuwa da yawa da ake so. Saboda haka, za mu yi amfani da kayan aiki mai dacewa Cmder/. Zazzage ƙaramin sigar kuma gudanar da Cmder.exe. Na gaba kana buƙatar haɗi zuwa uwar garken ta hanyar SSH:

ssh root@server-ip-or-hostname

Maimakon uwar garken-ip-ko-hostname, saka adireshin IP ko sunan DNS na uwar garken ku. Na gaba, shigar da kalmar sirri kuma idan haɗin ya yi nasara, ya kamata mu sami saƙo mai kama da wannan.

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

Babban harshen don haɓaka ƙirar ML shine Python. Kuma mafi mashahuri dandamali don amfani da shi akan Linux shine Anaconda.

Bari mu shigar da shi a kan uwar garken mu.

Za mu fara da sabunta manajan fakitin gida:

sudo apt-get update

Sanya curl (mai amfani da layin umarni):

sudo apt-get install curl

Zazzage sabon sigar Rarraba Anaconda:

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

Bari mu fara shigarwa:

bash Anaconda3-2019.10-Linux-x86_64.sh

Yayin aikin shigarwa, za a tambaye ku don tabbatar da yarjejeniyar lasisi. Bayan nasarar shigarwa ya kamata ku ga wannan:

Thank you for installing Anaconda3!

Yawancin tsarin yanzu an ƙirƙira su don haɓaka samfuran ML; muna aiki tare da mafi mashahuri: PyTorch и Maganin motsa jiki.

Yin amfani da tsarin yana ba ku damar haɓaka saurin haɓakawa da amfani da kayan aikin da aka shirya don daidaitattun ayyuka.

A cikin wannan misali za mu yi aiki tare da PyTorch. Bari mu shigar:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

Yanzu muna buƙatar ƙaddamar da Jupyter Notebook, sanannen kayan aikin haɓakawa ga ƙwararrun ML. Yana ba ku damar rubuta lamba kuma nan da nan ga sakamakon aiwatar da shi. Jupyter Notebook an haɗa shi tare da Anaconda kuma an riga an shigar dashi akan sabar mu. Kuna buƙatar haɗawa da shi daga tsarin tebur ɗin mu.

Don yin wannan, za mu fara ƙaddamar da Jupyter akan uwar garken da ke ƙayyade tashar jiragen ruwa 8080:

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

Na gaba, buɗe wani shafin a cikin na'urar wasan bidiyo na Cmder (menu na sama - Sabon maganganun wasan bidiyo) za mu haɗa ta tashar jiragen ruwa 8080 zuwa uwar garken ta hanyar SSH:

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

Lokacin da muka shigar da umarni na farko, za a ba mu hanyoyin haɗin yanar gizo don buɗe Jupyter a cikin burauzar mu:

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

Bari mu yi amfani da hanyar haɗin don localhost: 8080. Kwafi cikakken hanyar kuma liƙa shi a cikin mashigin adireshi na mai binciken gida na PC ɗin ku. Jupyter Notebook zai buɗe.

Bari mu ƙirƙiri sabon littafin rubutu: Sabon - Littafin rubutu - Python 3.

Bari mu duba daidai aiki na duk abubuwan da muka shigar. Bari mu shigar da lambar PyTorch misali a cikin Jupyter kuma mu aiwatar da aiwatarwa (Maɓallin Run):

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

Sakamakon yakamata ya kasance kamar haka:

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Idan kuna da irin wannan sakamako, to, mun tsara komai daidai kuma za mu iya fara haɓaka cibiyar sadarwar jijiyoyi!

Ƙirƙirar hanyar sadarwa ta jijiyoyi

Za mu ƙirƙiri hanyar sadarwa na jijiyoyi don gane hoto. Mu dauki wannan a matsayin tushe jagora.

Za mu yi amfani da saitin bayanan CIFAR10 da ake samuwa ga jama'a don horar da hanyar sadarwa. Yana da azuzuwan: "jirgin sama", "mota", "tsuntsaye", "cat", "barewa", "kare", "frog", "doki", "jirgin ruwa", "motoci". Hotunan CIFAR10 3x32x32 ne, wato, hotuna masu launi 3 na pixels 32x32.

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari
Don aiki, za mu yi amfani da kunshin da PyTorch ya ƙirƙira don aiki tare da hotuna - torchvision.

Za mu yi matakai masu zuwa domin:

  • Loading da daidaita horo da saitin bayanan gwaji
  • Ma'anar Cibiyar Sadarwar Jijiya
  • Horon hanyar sadarwa akan bayanan horo
  • Gwajin hanyar sadarwa akan bayanan gwaji
  • Mu maimaita horo da gwaji ta amfani da GPU

Za mu aiwatar da duk lambobin da ke ƙasa a cikin Jupyter Notebook.

Loading da daidaita CIFAR10

Kwafi kuma gudanar da lambar mai zuwa a 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')

Amsar yakamata ta kasance:

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

Bari mu nuna hotunan horo da yawa don gwaji:


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)))

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Ma'anar Cibiyar Sadarwar Jijiya

Bari mu fara yin la'akari da yadda cibiyar sadarwar jijiyoyi don gane hoto ke aiki. Wannan hanyar sadarwa ce mai sauƙi-zuwa aya. Yana ɗaukar bayanan shigar da bayanai, yana wuce ta cikin yadudduka da yawa ɗaya bayan ɗaya, sannan a ƙarshe ya samar da bayanan fitarwa.

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Bari mu ƙirƙiri irin wannan hanyar sadarwa a cikin muhallinmu:


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()

Muna kuma ayyana aikin asara da mai ingantawa


import torch.optim as optim

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

Horon hanyar sadarwa akan bayanan horo

Bari mu fara horar da hanyoyin sadarwar mu. Lura cewa bayan kun gudanar da wannan lambar, kuna buƙatar jira ɗan lokaci har sai an kammala aikin. Ya ɗauki ni minti 5. Yana ɗaukar lokaci don horar da hanyar sadarwa.

 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')

Muna samun sakamako mai zuwa:

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Mun adana samfurinmu na horarwa:

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

Gwajin hanyar sadarwa akan bayanan gwaji

Mun horar da cibiyar sadarwa ta amfani da saitin bayanan horo. Amma muna buƙatar bincika ko hanyar sadarwar ta koyi wani abu kwata-kwata.

Za mu gwada wannan ta hanyar tsinkayar lakabin aji wanda cibiyar sadarwar jijiyoyi ke fitarwa da gwada shi don ganin ko gaskiya ne. Idan tsinkaya daidai ne, muna ƙara samfurin zuwa lissafin daidaitattun tsinkaya.
Bari mu nuna hoto daga saitin gwaji:

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)))

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Yanzu bari mu tambayi cibiyar sadarwar jijiyoyi don gaya mana abin da ke cikin waɗannan hotuna:


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)))

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Sakamakon yana da kyau: hanyar sadarwar ta gano daidai hotuna uku cikin hudu.

Bari mu ga yadda hanyar sadarwa ke aiki a cikin dukkan saitin bayanai.


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))

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Ga alama cibiyar sadarwa ta san wani abu kuma tana aiki. Idan ya ƙayyade azuzuwan a bazuwar, daidaito zai zama 10%.

Yanzu bari mu ga wane azuzuwan cibiyar sadarwa ta fi ganewa:

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]))

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Da alama cibiyar sadarwa ta fi dacewa a gano motoci da jiragen ruwa: 71% daidaito.

Don haka hanyar sadarwa tana aiki. Yanzu bari mu yi kokarin canja wurin aikinsa zuwa graphics processor (GPU) da kuma ganin abin da canje-canje.

Horar da hanyar sadarwa ta jijiyoyi akan GPU

Na farko, zan yi bayani a taƙaice menene CUDA. CUDA (Compute Unified Device Architecture) dandamali ne na lissafin layi daya wanda NVIDIA ta haɓaka don ƙididdige gabaɗaya akan rukunin sarrafa hoto (GPUs). Tare da CUDA, masu haɓakawa na iya ƙara haɓaka aikace-aikacen kwamfuta ta hanyar haɓaka ƙarfin GPUs. An riga an shigar da wannan dandamali akan sabar mu da muka saya.

Bari mu fara ayyana GPU ɗinmu azaman na'urar cuda ta farko da ake iya gani.

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 )

Cibiyar sadarwar ku ta farko ta jijiya akan rukunin sarrafa hoto (GPU). Jagoran Mafari

Aika hanyar sadarwa zuwa GPU:

net.to(device)

Hakanan dole ne mu aika bayanai da maƙasudi a kowane mataki zuwa GPU:

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

Bari mu sake horar da hanyar sadarwa akan 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')

A wannan lokacin, horarwar cibiyar sadarwa ta ɗauki kusan mintuna 3. Bari mu tuna cewa wannan mataki a kan na'ura na al'ada ya dauki minti 5. Bambancin ba shi da mahimmanci, wannan yana faruwa ne saboda hanyar sadarwar mu ba ta da girma sosai. Lokacin amfani da manyan jeri don horo, bambanci tsakanin saurin GPU da na'ura mai sarrafa al'ada zai karu.

Da alama duk hakan ne. Abin da muka yi nasarar yi:

  • Mun duba menene GPU kuma muka zaɓi uwar garken da aka shigar dashi;
  • Mun kafa yanayin software don ƙirƙirar hanyar sadarwa na jijiyoyi;
  • Mun ƙirƙiri hanyar sadarwa na jijiyoyi don gane hoto kuma mun horar da shi;
  • Mun maimaita horon hanyar sadarwa ta amfani da GPU kuma mun sami karuwa cikin sauri.

Zan yi farin cikin amsa tambayoyi a cikin sharhi.

source: www.habr.com

Add a comment