ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود
پدې مقاله کې ، زه به تاسو ته ووایم چې څنګه په 30 دقیقو کې د ماشین زده کړې چاپیریال تنظیم کړئ ، د عکس پیژندنې لپاره عصبي شبکه رامینځته کړئ ، او بیا ورته شبکه په ګرافیک پروسیسر (GPU) کې پرمخ وړئ.

لومړی، راځئ چې عصبي شبکه تعریف کړو.

زموږ په قضیه کې، دا یو ریاضياتي ماډل دی، په بیله بیا د هغې سافټویر یا هارډویر مجسم، د بیولوژیکي عصبي شبکو د تنظیم او فعالیت په اصولو کې جوړ شوی - د ژوندي موجوداتو د عصبي حجرو شبکې. دا مفهوم په مغز کې د پروسو په مطالعه کولو او د دې پروسو د ماډل کولو هڅه کولو په وخت کې رامینځته شو.

عصبي شبکې د کلمې په عادي معنی کې نه برنامه شوي، دوی روزل شوي. د زده کړې وړتیا د دودیزو الګوریتمونو په پرتله د عصبي شبکو یوه له اصلي ګټو څخه ده. په تخنیکي توګه، زده کړه د نیورونونو تر منځ د اړیکو د کمیت موندلو څخه جوړه ده. د روزنې پروسې په جریان کې، عصبي شبکه د دې توان لري چې د ان پټ ډیټا او محصول ډیټا ترمنځ پیچلي انحصارونه وپیژني، او همدارنګه عمومي کول ترسره کړي.

د ماشین زده کړې له نظره، عصبي شبکه د نمونو پیژندلو میتودونو، تبعیض تحلیل، کلستر کولو میتودونو او نورو میتودونو ځانګړې قضیه ده.

تجهیزات

لومړی، راځئ چې تجهیزات وګورو. موږ یو سرور ته اړتیا لرو چې پکې د لینکس عملیاتي سیسټم نصب شوی وي. د ماشین زده کړې سیسټمونو چلولو لپاره اړین تجهیزات خورا پیاوړي او په پایله کې ګران دي. د هغو کسانو لپاره چې په لاس کې ښه ماشین نلري، زه وړاندیز کوم چې د بادل چمتو کونکو وړاندیزونو ته پام وکړئ. تاسو کولی شئ اړین سرور په چټکۍ سره کرایه کړئ او یوازې د کارولو وخت لپاره پیسې ورکړئ.

په پروژو کې چیرې چې د عصبي شبکو رامینځته کول اړین دي ، زه د روسیې د بادل چمتو کونکو څخه یو سرور کاروم. شرکت د کرایه لپاره کلاوډ سرورونه وړاندیز کوي په ځانګړي توګه د NVIDIA څخه د ځواکمن Tesla V100 ګرافیک پروسیسرونو (GPU) سره د ماشین زده کړې لپاره. په لنډه توګه: د GPU سره د سرور کارول د ورته لګښت سرور په پرتله لسګونه ځله ډیر اغیزمن (چټک) کیدی شي چې د محاسبې لپاره CPU (د پیژندل شوي مرکزي پروسس کولو واحد) کاروي. دا د GPU جوړښت ځانګړتیاو له امله ترلاسه شوی، کوم چې د محاسبې سره ګړندی کوي.

د لاندې بیان شوي مثالونو پلي کولو لپاره، موږ د څو ورځو لپاره لاندې سرور پیرودلی:

  • د SSD ډیسک 150 GB
  • RAM 32 GB
  • د Tesla V100 16 Gb پروسیسر د 4 کور سره

موږ په خپل ماشین کې اوبنټو 18.04 نصب کړ.

د چاپیریال تنظیم کول

اوس راځئ چې په سرور کې د کار لپاره اړین هرڅه نصب کړو. څنګه چې زموږ مقاله اساسا د پیل کونکو لپاره ده ، زه به د ځینو ټکو په اړه وغږیږم چې د دوی لپاره به ګټور وي.

ډیری کار کله چې د چاپیریال تنظیم کول د کمانډ لاین له لارې ترسره کیږي. ډیری کارونکي وینډوز د خپل کاري OS په توګه کاروي. په دې OS کې معیاري کنسول ډیر څه پریږدي چې مطلوب وي. له همدې امله، موږ به یو مناسب وسیله وکاروو cmder/. مینی نسخه ډاونلوډ کړئ او Cmder.exe چل کړئ. بیا تاسو اړتیا لرئ د SSH له لارې سرور سره وصل شئ:

ssh root@server-ip-or-hostname

د سرور-ip-یا-hostname پرځای، د خپل سرور IP پته یا DNS نوم مشخص کړئ. بیا ، پاسورډ دننه کړئ او که اړیکه بریالۍ وي ، موږ باید ورته ورته پیغام ترلاسه کړو.

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

د ML ماډلونو رامینځته کولو اصلي ژبه Python ده. او په لینکس کې د دې کارولو لپاره ترټولو مشهور پلیټ فارم دی انکونډا.

راځئ چې دا زموږ په سرور کې نصب کړو.

موږ د محلي کڅوړې مدیر تازه کولو سره پیل کوو:

sudo apt-get update

curl نصب کړئ (د کمانډ لاین افادیت):

sudo apt-get install curl

د اناکونډا توزیع وروستۍ نسخه ډاونلوډ کړئ:

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

راځئ چې نصب پیل کړو:

bash Anaconda3-2019.10-Linux-x86_64.sh

د نصب کولو پروسې په جریان کې ، تاسو څخه به وغوښتل شي چې د جواز تړون تایید کړئ. د بریالي نصب کولو وروسته تاسو باید دا وګورئ:

Thank you for installing Anaconda3!

ډیری چوکاټونه اوس د ML ماډلونو پراختیا لپاره رامینځته شوي؛ موږ د خورا مشهور سره کار کوو: پینټورچ и د ټینسر جریان.

د چوکاټ کارول تاسو ته اجازه درکوي د پرمختګ سرعت زیات کړئ او د معیاري کارونو لپاره چمتو شوي وسیلې وکاروئ.

پدې مثال کې به موږ د PyTorch سره کار وکړو. راځئ چې دا نصب کړو:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch

اوس موږ د Jupyter Notebook په لاره اچولو ته اړتیا لرو، د ML متخصصینو لپاره د پراختیا مشهور وسیله. دا تاسو ته اجازه درکوي کوډ ولیکئ او سمدلاسه د هغې د اجرا پایلې وګورئ. د جوپیټر نوټ بوک د اناکونډا سره شامل دی او دمخه زموږ په سرور کې نصب شوی. تاسو اړتیا لرئ دا زموږ د ډیسټاپ سیسټم څخه وصل کړئ.

د دې کولو لپاره، موږ به لومړی په سرور کې Jupyter پیل کړو چې د پورټ 8080 مشخص کوي:

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

بیا ، زموږ په Cmder کنسول کې د بل ټب خلاصول (پورته مینو - نوی کنسول ډیالوګ) موږ به د پورټ 8080 له لارې سرور ته د SSH له لارې وصل کړو:

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

کله چې موږ لومړی کمانډ ته ننوځو، موږ ته به زموږ په براوزر کې د Jupyter خلاصولو لپاره لینکونه وړاندیز شي:

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

راځئ چې د لوکل هوسټ لپاره لینک وکاروو: 8080. بشپړه لار کاپي کړئ او د خپل کمپیوټر محلي براوزر پته بار کې یې پیسټ کړئ. Jupyter نوټ بوک به خلاص شي.

راځئ یو نوی نوټ بوک جوړ کړو: نوی - نوټ بوک - پایتون 3.

راځئ چې د ټولو برخو سم عملیات وګورو چې موږ نصب کړي. راځئ چې د مثال PyTorch کوډ په Jupyter کې دننه کړو او اجرا کول (چلول تڼۍ):

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

پایله باید داسې وي:

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

که تاسو ورته پایله لرئ، نو موږ هرڅه په سمه توګه ترتیب کړي او موږ کولی شو د عصبي شبکې پراختیا پیل کړو!

د عصبي شبکې جوړول

موږ به د عکس پیژندنې لپاره عصبي شبکه جوړه کړو. راځئ چې دا د اساس په توګه واخلو رهبري.

موږ به د شبکې روزلو لپاره په عامه توګه موجود CIFAR10 ډیټاسیټ وکاروو. دا ټولګي لري: "هوايي الوتکه"، "موټر"، "مرغۍ"، "پیشو"، "هره"، "سپي"، "چړک"، "اس"، "بیړۍ"، "ټرک". په CIFAR10 کې انځورونه 3x32x32 دي، دا د 3-چینل رنګ انځورونه 32x32 پکسلز دي.

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود
د کار لپاره، موږ به د انځورونو سره کار کولو لپاره د PyTorch لخوا جوړ شوی کڅوړه وکاروو - torchvision.

موږ به لاندې مرحلې په ترتیب سره ترسره کړو:

  • د روزنې او ازموینې ډیټا سیټونو بارول او نورمال کول
  • د عصبي شبکې تعریف
  • د روزنې معلوماتو په اړه د شبکې روزنه
  • د ټیسټ ډیټا په اړه د شبکې ازموینه
  • راځئ چې د GPU په کارولو سره روزنه او ازموینه تکرار کړو

موږ به لاندې ټول کوډ په Jupyter نوټ بوک کې اجرا کړو.

د CIFAR10 بار کول او نورمال کول

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

ځواب باید دا وي:

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

راځئ چې د ازموینې لپاره د روزنې څو عکسونه وښیو:


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

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

د عصبي شبکې تعریف

راځئ لومړی په پام کې ونیسو چې د عکس پیژندنې لپاره عصبي شبکه څنګه کار کوي. دا یو ساده ټکي څخه نقطه شبکه ده. دا د ان پټ ډیټا اخلي، دا د څو پرتونو څخه یو له بل څخه تیریږي، او بیا په پای کې د محصول ډاټا تولیدوي.

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

راځئ چې زموږ په چاپیریال کې ورته شبکه جوړه کړو:


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

موږ د ضایع فعالیت او اصلاح کوونکی هم تعریف کوو


import torch.optim as optim

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

د روزنې معلوماتو په اړه د شبکې روزنه

راځئ چې زموږ د عصبي شبکې روزنه پیل کړو. مهرباني وکړئ په یاد ولرئ چې د دې کوډ چلولو وروسته، تاسو به د کار بشپړیدو پورې یو څه انتظار ته اړتیا ولرئ. دا ما 5 دقیقې ونیولې. دا د شبکې روزلو لپاره وخت نیسي.

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

موږ لاندې پایلې ترلاسه کوو:

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

موږ خپل روزل شوی ماډل خوندي کوو:

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

د ټیسټ ډیټا په اړه د شبکې ازموینه

موږ شبکه د روزنې ډیټا سیټ په کارولو سره روزلې. مګر موږ باید وګورو چې ایا شبکې په هرڅه کې څه زده کړي دي.

موږ به دا د ټولګي لیبل وړاندوینه کولو سره ازموینه وکړو چې عصبي شبکه تولیدوي او دا به معاینه کړي ترڅو وګوري چې ایا دا ریښتیا دي. که وړاندوینه سمه وي، موږ نمونه د سمو وړاندوینو لیست ته اضافه کوو.
راځئ چې د ازموینې سیټ څخه یو عکس وښیو:

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

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

اوس راځئ چې د عصبي شبکې څخه وپوښتو چې موږ ته ووایاست چې پدې عکسونو کې څه دي:


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

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

پایلې خورا ښه ښکاري: شبکې په سمه توګه له څلورو څخه درې عکسونه په نښه کړل.

راځئ وګورو چې شبکه په ټول ډیټا سیټ کې څنګه فعالیت کوي.


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

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

داسې ښکاري چې شبکه یو څه پوهیږي او کار کوي. که هغه ټولګي په تصادفي توګه وټاکي، دقت به 10٪ وي.

اوس راځئ وګورو چې شبکه کوم ټولګي ښه پیژني:

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

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

داسې ښکاري چې شبکه د موټرو او کښتیو په پیژندلو کې غوره ده: 71٪ دقت.

نو شبکه کار کوي. اوس راځئ هڅه وکړو چې خپل کار ګرافیک پروسیسر (GPU) ته انتقال کړو او وګورو چې کوم بدلونونه راځي.

په GPU کې د عصبي شبکې روزنه

لومړی، زه به په لنډه توګه تشریح کړم چې CUDA څه شی دی. CUDA (Compute Uniified Device Architecture) یو موازي کمپیوټري پلیټ فارم دی چې د NVIDIA لخوا د ګرافیک پروسس کولو واحدونو (GPUs) کې عمومي کمپیوټري لپاره رامینځته شوی. د CUDA سره، پراختیا کونکي کولی شي په ډراماتیک ډول د GPUs ځواک په کارولو سره کمپیوټري غوښتنلیکونه ګړندي کړي. دا پلیټ فارم لا دمخه زموږ په سرور کې نصب شوی چې موږ یې اخیستی.

راځئ لومړی زموږ GPU د لومړي لیدل شوي کوډا وسیلې په توګه تعریف کړو.

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 )

ستاسو لومړی عصبي شبکه د ګرافیک پروسس کولو واحد (GPU) کې. د پیل کونکي لارښود

GPU ته د شبکې لیږل:

net.to(device)

موږ به هم باید GPU ته په هر ګام کې معلومات او هدفونه واستوو:

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

راځئ چې په 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')

دا ځل، د شبکې روزنې شاوخوا 3 دقیقې دوام وکړ. راځئ چې یادونه وکړو چې په دودیز پروسیسر کې ورته مرحله 5 دقیقې دوام کوي. توپیر د پام وړ ندی، دا پیښیږي ځکه چې زموږ شبکه دومره لویه نه ده. کله چې د روزنې لپاره لوی صفونه وکاروئ ، د GPU سرعت او دودیز پروسیسر ترمینځ توپیر به ډیر شي.

دا ټول داسې ښکاري. هغه څه چې موږ یې ترسره کول:

  • موږ ولیدل چې GPU څه شی دی او هغه سرور یې غوره کړ چې دا نصب شوی دی؛
  • موږ د عصبي شبکې جوړولو لپاره د سافټویر چاپیریال رامینځته کړی دی؛
  • موږ د عکس پیژندنې لپاره عصبي شبکه جوړه کړه او روزنه مو وکړه؛
  • موږ د GPU په کارولو سره د شبکې روزنه تکرار کړه او په سرعت کې زیاتوالی مو ترلاسه کړ.

زه به خوښ شم چې په نظرونو کې پوښتنو ته ځواب ووایم.

سرچینه: www.habr.com

Add a comment