پدې مقاله کې ، زه به تاسو ته ووایم چې څنګه په 30 دقیقو کې د ماشین زده کړې چاپیریال تنظیم کړئ ، د عکس پیژندنې لپاره عصبي شبکه رامینځته کړئ ، او بیا ورته شبکه په ګرافیک پروسیسر (GPU) کې پرمخ وړئ.
لومړی، راځئ چې عصبي شبکه تعریف کړو.
زموږ په قضیه کې، دا یو ریاضياتي ماډل دی، په بیله بیا د هغې سافټویر یا هارډویر مجسم، د بیولوژیکي عصبي شبکو د تنظیم او فعالیت په اصولو کې جوړ شوی - د ژوندي موجوداتو د عصبي حجرو شبکې. دا مفهوم په مغز کې د پروسو په مطالعه کولو او د دې پروسو د ماډل کولو هڅه کولو په وخت کې رامینځته شو.
عصبي شبکې د کلمې په عادي معنی کې نه برنامه شوي، دوی روزل شوي. د زده کړې وړتیا د دودیزو الګوریتمونو په پرتله د عصبي شبکو یوه له اصلي ګټو څخه ده. په تخنیکي توګه، زده کړه د نیورونونو تر منځ د اړیکو د کمیت موندلو څخه جوړه ده. د روزنې پروسې په جریان کې، عصبي شبکه د دې توان لري چې د ان پټ ډیټا او محصول ډیټا ترمنځ پیچلي انحصارونه وپیژني، او همدارنګه عمومي کول ترسره کړي.
د ماشین زده کړې له نظره، عصبي شبکه د نمونو پیژندلو میتودونو، تبعیض تحلیل، کلستر کولو میتودونو او نورو میتودونو ځانګړې قضیه ده.
تجهیزات
لومړی، راځئ چې تجهیزات وګورو. موږ یو سرور ته اړتیا لرو چې پکې د لینکس عملیاتي سیسټم نصب شوی وي. د ماشین زده کړې سیسټمونو چلولو لپاره اړین تجهیزات خورا پیاوړي او په پایله کې ګران دي. د هغو کسانو لپاره چې په لاس کې ښه ماشین نلري، زه وړاندیز کوم چې د بادل چمتو کونکو وړاندیزونو ته پام وکړئ. تاسو کولی شئ اړین سرور په چټکۍ سره کرایه کړئ او یوازې د کارولو وخت لپاره پیسې ورکړئ.
په پروژو کې چیرې چې د عصبي شبکو رامینځته کول اړین دي ، زه د روسیې د بادل چمتو کونکو څخه یو سرور کاروم. شرکت د کرایه لپاره کلاوډ سرورونه وړاندیز کوي په ځانګړي توګه د NVIDIA څخه د ځواکمن Tesla V100 ګرافیک پروسیسرونو (GPU) سره د ماشین زده کړې لپاره. په لنډه توګه: د GPU سره د سرور کارول د ورته لګښت سرور په پرتله لسګونه ځله ډیر اغیزمن (چټک) کیدی شي چې د محاسبې لپاره CPU (د پیژندل شوي مرکزي پروسس کولو واحد) کاروي. دا د GPU جوړښت ځانګړتیاو له امله ترلاسه شوی، کوم چې د محاسبې سره ګړندی کوي.
د لاندې بیان شوي مثالونو پلي کولو لپاره، موږ د څو ورځو لپاره لاندې سرور پیرودلی:
- د SSD ډیسک 150 GB
- RAM 32 GB
- د Tesla V100 16 Gb پروسیسر د 4 کور سره
موږ په خپل ماشین کې اوبنټو 18.04 نصب کړ.
د چاپیریال تنظیم کول
اوس راځئ چې په سرور کې د کار لپاره اړین هرڅه نصب کړو. څنګه چې زموږ مقاله اساسا د پیل کونکو لپاره ده ، زه به د ځینو ټکو په اړه وغږیږم چې د دوی لپاره به ګټور وي.
ډیری کار کله چې د چاپیریال تنظیم کول د کمانډ لاین له لارې ترسره کیږي. ډیری کارونکي وینډوز د خپل کاري OS په توګه کاروي. په دې OS کې معیاري کنسول ډیر څه پریږدي چې مطلوب وي. له همدې امله، موږ به یو مناسب وسیله وکاروو
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)
پایله باید داسې وي:
که تاسو ورته پایله لرئ، نو موږ هرڅه په سمه توګه ترتیب کړي او موږ کولی شو د عصبي شبکې پراختیا پیل کړو!
د عصبي شبکې جوړول
موږ به د عکس پیژندنې لپاره عصبي شبکه جوړه کړو. راځئ چې دا د اساس په توګه واخلو
موږ به د شبکې روزلو لپاره په عامه توګه موجود CIFAR10 ډیټاسیټ وکاروو. دا ټولګي لري: "هوايي الوتکه"، "موټر"، "مرغۍ"، "پیشو"، "هره"، "سپي"، "چړک"، "اس"، "بیړۍ"، "ټرک". په CIFAR10 کې انځورونه 3x32x32 دي، دا د 3-چینل رنګ انځورونه 32x32 پکسلز دي.
د کار لپاره، موږ به د انځورونو سره کار کولو لپاره د 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)))
د عصبي شبکې تعریف
راځئ لومړی په پام کې ونیسو چې د عکس پیژندنې لپاره عصبي شبکه څنګه کار کوي. دا یو ساده ټکي څخه نقطه شبکه ده. دا د ان پټ ډیټا اخلي، دا د څو پرتونو څخه یو له بل څخه تیریږي، او بیا په پای کې د محصول ډاټا تولیدوي.
راځئ چې زموږ په چاپیریال کې ورته شبکه جوړه کړو:
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')
موږ لاندې پایلې ترلاسه کوو:
موږ خپل روزل شوی ماډل خوندي کوو:
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)))
اوس راځئ چې د عصبي شبکې څخه وپوښتو چې موږ ته ووایاست چې پدې عکسونو کې څه دي:
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)))
پایلې خورا ښه ښکاري: شبکې په سمه توګه له څلورو څخه درې عکسونه په نښه کړل.
راځئ وګورو چې شبکه په ټول ډیټا سیټ کې څنګه فعالیت کوي.
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))
داسې ښکاري چې شبکه یو څه پوهیږي او کار کوي. که هغه ټولګي په تصادفي توګه وټاکي، دقت به 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]))
داسې ښکاري چې شبکه د موټرو او کښتیو په پیژندلو کې غوره ده: 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 ته د شبکې لیږل:
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