Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula
Ing artikel iki, aku bakal pitutur marang kowe carane nyiyapake lingkungan machine learning ing 30 menit, nggawe jaringan syaraf kanggo pangenalan gambar, banjur mbukak jaringan sing padha ing prosesor grafis (GPU).

Pisanan, ayo nemtokake apa jaringan saraf.

Ing kasus kita, iki minangka model matematika, uga piranti lunak utawa perwujudan hardware, dibangun ing prinsip organisasi lan fungsi jaringan saraf biologis - jaringan sel saraf saka organisme urip. Konsep iki muncul nalika nyinaoni proses sing kedadeyan ing otak lan nyoba nggawe model proses kasebut.

Jaringan syaraf ora diprogram ing pangertèn biasa, dilatih. Kemampuan kanggo sinau minangka salah sawijining kaluwihan utama jaringan saraf tinimbang algoritma tradisional. Secara teknis, sinau kalebu nemokake koefisien sambungan antarane neuron. Sajrone proses latihan, jaringan saraf bisa ngenali dependensi kompleks antarane data input lan data output, uga nindakake generalisasi.

Saka sudut pandang pembelajaran mesin, jaringan saraf minangka kasus khusus saka metode pangenalan pola, analisis diskriminan, metode clustering lan metode liyane.

Peralatan

Pisanan, ayo ndeleng peralatan kasebut. We kudu server karo sistem operasi Linux diinstal ing. Peralatan sing dibutuhake kanggo ngoperasikake sistem pembelajaran mesin cukup kuat lan, minangka asil, larang. Kanggo sing ora duwe mesin sing apik, aku menehi saran supaya menehi perhatian marang tawaran panyedhiya awan. Sampeyan bisa nyewa server sing dibutuhake kanthi cepet lan mung mbayar kanggo wektu panggunaan.

Ing proyek sing kudu nggawe jaringan saraf, aku nggunakake server salah sawijining panyedhiya awan Rusia. Perusahaan kasebut nawakake server maya kanggo disewa khusus kanggo sinau mesin kanthi prosesor grafis (GPU) Tesla V100 sing kuat saka NVIDIA. Ing cendhak: nggunakake server karo GPU bisa puluhan kaping luwih efisien (cepet) dibandhingake server biaya padha sing nggunakake CPU (unit Processing tengah kondhang) kanggo petungan. Iki digayuh amarga fitur saka arsitektur GPU, kang copes karo petungan luwih cepet.

Kanggo ngetrapake conto sing diterangake ing ngisor iki, kita tuku server ing ngisor iki sawetara dina:

  • SSD disk 150 GB
  • RAM 32 GB
  • Prosesor Tesla V100 16 Gb kanthi 4 intine

Kita nginstal Ubuntu 18.04 ing mesin kita.

Nyetel lingkungan

Saiki ayo instal kabeh sing perlu kanggo nggarap server. Amarga artikel kita utamane kanggo pamula, aku bakal ngomong babagan sawetara poin sing bakal migunani kanggo dheweke.

Akeh pakaryan nalika nyetel lingkungan ditindakake liwat baris printah. Umume pangguna nggunakake Windows minangka OS sing digunakake. Konsol standar ing OS iki akeh sing dikarepake. Mulane, kita bakal nggunakake alat sing trep Cmder/. Download versi mini lan mbukak Cmder.exe. Sabanjure sampeyan kudu nyambung menyang server liwat SSH:

ssh root@server-ip-or-hostname

Tinimbang server-ip-or-hostname, nemtokake alamat IP utawa jeneng DNS server sampeyan. Sabanjure, ketik sandhi lan yen sambungan sukses, kita kudu nampa pesen sing padha karo iki.

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

Basa utama kanggo ngembangake model ML yaiku Python. Lan platform sing paling populer kanggo panggunaan ing Linux yaiku Anaconda.

Ayo nginstal ing server kita.

Kita miwiti kanthi nganyari manajer paket lokal:

sudo apt-get update

Instal curl (utilitas baris perintah):

sudo apt-get install curl

Download versi paling anyar saka Anaconda Distribution:

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

Ayo miwiti instalasi:

bash Anaconda3-2019.10-Linux-x86_64.sh

Sajrone proses instalasi, sampeyan bakal dijaluk konfirmasi perjanjian lisensi. Sawise instalasi sukses, sampeyan kudu ndeleng iki:

Thank you for installing Anaconda3!

Akeh kerangka kerja saiki wis digawe kanggo pangembangan model ML; kita nggarap sing paling populer: PyTorch ΠΈ aliran tensor.

Nggunakake kerangka ngidini sampeyan nambah kacepetan pangembangan lan nggunakake alat sing wis siap kanggo tugas standar.

Ing conto iki, kita bakal nggarap PyTorch. Ayo nginstal:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

Saiki kita kudu ngluncurake Jupyter Notebook, alat pangembangan populer kanggo spesialis ML. Ngidini sampeyan nulis kode lan langsung ndeleng asil eksekusi. Jupyter Notebook kalebu karo Anaconda lan wis diinstal ing server kita. Sampeyan kudu nyambungake saka sistem desktop kita.

Kanggo nindakake iki, kita bakal miwiti Jupyter ing server sing nemtokake port 8080:

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

Sabanjure, mbukak tab liyane ing console Cmder kita (menu ndhuwur - dialog konsol anyar) kita bakal nyambung liwat port 8080 menyang server liwat SSH:

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

Nalika kita ngetik printah pisanan, kita bakal ditawakake link kanggo mbukak Jupyter ing browser kita:

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

Ayo nggunakake link kanggo localhost:8080. Salin path lengkap lan tempel ing baris alamat browser lokal PC. Jupyter Notebook bakal mbukak.

Ayo nggawe notebook anyar: Anyar - Notebook - Python 3.

Ayo dipriksa operasi sing bener saka kabeh komponen sing diinstal. Ayo ketik conto kode PyTorch menyang Jupyter lan jalanake eksekusi (tombol Run):

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

Asil kudu kaya iki:

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Yen sampeyan duwe asil sing padha, mula kita wis ngatur kabeh kanthi bener lan kita bisa miwiti ngembangake jaringan saraf!

Nggawe jaringan syaraf

Kita bakal nggawe jaringan saraf kanggo pangenalan gambar. Ayo padha njupuk iki minangka basis nuntun.

Kita bakal nggunakake dataset CIFAR10 sing kasedhiya kanggo umum kanggo nglatih jaringan kasebut. Wis kelas: "pesawat", "mobil", "manuk", "kucing", "menjangan", "asu", "kodhok", "jaran", "kapal", "truk". Gambar ing CIFAR10 ukurane 3x32x32, yaiku gambar warna 3 saluran kanthi ukuran 32x32 piksel.

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula
Kanggo karya, kita bakal nggunakake paket sing digawe PyTorch kanggo nggarap gambar - torchvision.

Kita bakal nindakake langkah-langkah ing ngisor iki kanthi urutan:

  • Ngunggah lan normalake set data latihan lan tes
  • Definisi Neural Network
  • Pelatihan jaringan data pelatihan
  • Tes jaringan ing data tes
  • Ayo baleni latihan lan tes nggunakake GPU

Kita bakal nglakokake kabeh kode ing ngisor iki ing Jupyter Notebook.

Loading lan normalizing CIFAR10

Nyalin lan mbukak kode ing ngisor iki ing 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')

Jawabane kudu:

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

Ayo nampilake sawetara gambar latihan kanggo tes:


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

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Definisi Neural Network

Pisanan, ayo dipikirake kepiye cara kerja jaringan saraf kanggo pangenalan gambar. Iki minangka jaringan point-to-point sing prasaja. Butuh data input, ngliwati sawetara lapisan siji-siji, lan pungkasane ngasilake data output.

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Ayo nggawe jaringan sing padha ing lingkungan kita:


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

Kita uga nemtokake fungsi mundhut lan pangoptimal


import torch.optim as optim

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

Pelatihan jaringan data pelatihan

Ayo miwiti latihan jaringan saraf kita. Elinga yen sawise sampeyan mbukak kode iki, sampeyan kudu ngenteni sawetara wektu nganti karya rampung. Sampeyan njupuk kula 5 menit. Perlu wektu kanggo nglatih jaringan.

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

Kita entuk asil ing ngisor iki:

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Kita nyimpen model sing dilatih:

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

Tes jaringan ing data tes

Kita nglatih jaringan nggunakake set data latihan. Nanging kita kudu mriksa apa jaringan wis sinau apa wae.

Kita bakal nyoba iki kanthi prΓ©dhiksi label kelas sing metu saka jaringan saraf lan nyoba kanggo ndeleng apa bener. Yen prediksi kasebut bener, kita nambahake sampel menyang dhaptar prediksi sing bener.
Ayo nuduhake gambar saka set tes:

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

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Saiki ayo takon jaringan saraf kanggo ngandhani apa sing ana ing gambar kasebut:


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

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Asil katon apik banget: jaringan kanthi bener ngenali telu saka patang gambar.

Ayo ndeleng kepiye kinerja jaringan ing kabeh set data.


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

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Iku katon kaya jaringan ngerti soko lan bisa digunakake. Yen dheweke nemtokake kelas kanthi acak, akurasi bakal dadi 10%.

Saiki ayo ndeleng kelas endi sing diidentifikasi jaringan luwih apik:

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

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Iku misale jek sing jaringan paling apik kanggo ngenali mobil lan kapal: 71% akurasi.

Dadi jaringan bisa digunakake. Saiki ayo nyoba nransfer karyane menyang prosesor grafis (GPU) lan ndeleng owah-owahan.

Latihan jaringan saraf ing GPU

Kaping pisanan, aku bakal nerangake kanthi ringkes apa CUDA. CUDA (Compute Unified Device Architecture) minangka platform komputasi paralel sing dikembangake dening NVIDIA kanggo komputasi umum ing unit pangolahan grafis (GPU). Kanthi CUDA, pangembang bisa nyepetake aplikasi komputasi kanthi dramatis kanthi nggunakake kekuwatan GPU. Platform iki wis diinstal ing server sing dituku.

Ayo kita nemtokake GPU minangka piranti cuda pisanan sing katon.

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 )

Jaringan saraf pisanan sampeyan ing unit pangolahan grafis (GPU). Pandhuan pamula

Ngirim jaringan menyang GPU:

net.to(device)

Kita uga kudu ngirim input lan target ing saben langkah menyang GPU:

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

Ayo latihan maneh jaringan ing 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')

Wektu iki, latihan jaringan kira-kira 3 menit. Ayo kita kelingan sing tataran padha ing prosesor conventional langgeng 5 menit. Bentenipun ora signifikan, iki kedadeyan amarga jaringan kita ora dadi gedhe. Nalika nggunakake array gedhe kanggo latihan, prabΓ©dan antarane kacepetan GPU lan prosesor tradisional bakal nambah.

Iku misale jek kabeh. Apa sing bisa ditindakake:

  • Kita ndeleng apa GPU lan milih server sing diinstal;
  • Kita wis nyiyapake lingkungan piranti lunak kanggo nggawe jaringan saraf;
  • Kita nggawe jaringan saraf kanggo pangenalan gambar lan dilatih;
  • Kita mbaleni latihan jaringan nggunakake GPU lan entuk kacepetan.

Aku bakal seneng njawab pitakonan ing komentar.

Source: www.habr.com

Add a comment