Розподілені обчислення за допомогою Raspberry Pi
Рейтинг статті: / 3
НайгіршеНайкраще 
Distributed Computing-Raspberry PiРозподілені обчислення передбачають розподіл обчислювальної проблеми на декілька паралельних завдань, які будуть виконуватися двома або більше комп'ютерами в мережі, що утворюють розподілену систему.
Це дозволяє поєднати в собі обчислювальну потужність декількох комп'ютерів для вирішення великих завдань, які включають обробку великих даних або вимагають величезної кількості ітерацій.
Сьогодні існує декілька поточних великомасштабних розподілених обчислювальних проектів, що охоплюють різні сфери, які дозволяють взяти участь комп'ютерам з усього світу і багато з цих проектів вже працюють протягом кількох років. Це показує наскільки великими можуть бути обчислювальні завдання в наші дні!
Ось кілька прикладів:
Пошук чисел Мерсенна, що є простими числами, які відповідають формі 2n - 1, або мають тільки '1' в двійковій системі.
Пошук нових фундаментальних частинок на Великому адронному колайдері в Церні.
Запуск симуляції на складання протеїнів, які допомагають вивчення таких захворювань, як хвороба Альцгеймера, Хантінгтона і багатьох видів раку.
Дослідження структури і реакційної здатності молекул за допомогою квантової хімії та методів Монте -Карло.
Використання чисельного моделювання процесу пізнання, щоб краще зрозуміти розум.
Створення високоточної 3D-моделі галактики Чумацький Шлях.
Злом трьох вихідних повідомлень Enigma, що не були ще зламані.
Демонстрація розподілених обчислень з використанням двох Pi
Для демонстраційних цілей автор підключив 2 Raspberry Pi за допомогою кабелю Ethernet і виконав просте сортування злиттям на великому масиві елементів.
По-перше, ось код для алгоритму сортування злиттям, написаний на python (MergeSort.py):
import time
def merge(left,right): #Зливаємо разом 2 загальні списки
result = []
i, j = 0, 0
#Виконання за обома списками
while i < len(left) and j < len(right):
#Додавання меншого елемента списків в остаточний список
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def mergesort(lst):
#Якщо є тільки 1 елемент, то сортувати не потрібно
if len(lst) < 2:
return lst
#Ділимо список на 2 половини
middle = len(lst) / 2
#Рекурсивно розбиваємо і сортуємо кожну половину
left = mergesort(lst[:middle])
right = mergesort(lst[middle:])
#Зливаєтмо списки разом, як впорядковані
return merge(left, right)
Далі наведений код для використання алгоритму сортування злиттям для сортування масиву 100000 елементів, використовуючи лише один Raspberry Pi (Merge1.py).
(Цей код буде використовуватися в наступних програмах, тому вони розміщені в тому ж каталозі перед їх запуском!)
import MergeSort #Імпорт функцій злиття
import random
import time
#Створюємо масив для сортування
arraylength = 100000 #Довжина масиву для сортування
print 'Length of array is', arraylength
array = range(arraylength) #Створюємо масив
random.shuffle(array) #Перехід до масиву
#Процес сортування і час сортування
start_time = time.time() #Запуск часу старту
print 'Sorting array...'
array = MergeSort.mergesort(array) #Сортування масивуy
print 'Array sorted.'
time_taken = time.time() - start_time #Розрахунок і запис time_taken
print 'Time taken to sort is ', time_taken, 'seconds.'
Distributed Computing-Raspberry Pi-1
Виконання завдання тільки на одному Raspberry Pi займає близько 24 секунд.
Тепер давайте розподілимо завдання між двома Raspberry Pi, але для цього ми спочатку повинні встановити IP-адреси кожного Pi.
На першому Pi через командний рядок налаштуємо його IP-адресу 192.168.1.1, і цей Pi буде виступати як сервер в мережі:
sudo ifconfig eth0 192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0
Аналогічно, вводимо наступний другий Pi, налаштувавши його IP-адресу 192.168.1.2, і цей Pi буде виступати як клієнт:
sudo ifconfig eth0 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0
На першому Pi запустимо наступний код (MergeServer.py):
import socket
import MergeSort #Імпорт функцій злиття
import random
import time
#Розбиваємо масив на п ділянок, де п - число процесорів
def breakarray(array, n):
sectionlength = len(array)/n #Довжина кожної секції
result = []
for i in range(n):
if i < n - 1:
result.append( array[ i * sectionlength : (i+1) * sectionlength ] )
# Включаємо всі елементи, які залишилися, в останню секцію
else:
result.append( array[ i * sectionlength : ] )
return result
#Створюємо масив для сортування
arraylength = 100000 #Length of array to be sorted
print 'Length of array is', arraylength
array = range(arraylength) #Створюємо масив
random.shuffle(array) #Перехід до
#Вказуємо інформація про процесори/комп'ютери
procno = 2 #Кількість процесорів
print 'Number of processors:', procno
procID = 0 #ID цього процесора(сервера)
addr_list = [] #Список адрес клієнтів
#Налаштовуємо мережу
HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(procno - 1) #Слухаємо для (п) числа клієнтських підключень
print 'Waiting for client...'
for i in range(procno - 1): #Підключаємося до всіх клієнтів
conn, addr = s.accept() #Приймаємо з'єднання від клієнта
print 'Connected by', addr
addr_list.append(addr) #Додаємо адресу в список адрес
#Процес сортування і час початку розподілених обчислень
start_time = time.time() #Записуємо час старту
sections = breakarray(array, procno) #Розбиваємо масив на розділи для кожного клієнта
for i in range(procno - 1): #Перетворення розділу масиву в рядок для відправки
arraystring = repr(sections[i+1])
conn.sendto( arraystring , addr_list[i] ) #Посилаємо рядок масиву
print 'Data sent, sorting array...'
array = MergeSort.mergesort(sections[procID]) #Сортуємо розділ і зберігаємо його в масиві
print 'Array sorted.'
for i in range(procno - 1): #Приймаємо сортовані розділи від кожного клієнта
arraystring = ''
print 'Receiving data from clients...'
while 1:
data = conn.recv(4096) #Отримуємо дані в шматках
arraystring += data #Додаємо дані в рядки масиву
if ']' in data: #Коли закінчене приймання даних
break
print 'Data received, merging arrays...'
array = MergeSort.merge(array, eval(arraystring)) #Об'єднуємо розділи поточного масиву від клієнтів
print 'Arrays merged.'
conn.close()time_taken = time.time() - start_time #Розраховуємо і записуємо time_taken
print 'Time taken to sort is ', time_taken, 'seconds.'
Коли рядок "Waiting for client..." (" В очікуванні клієнта ...") буде виведений в командному рядку першого Pi, запустіть наступний код на другому Pi (MergeClient.py):
import socket
import MergeSort
HOST = '192.168.1.1'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
#Приймаємо рядки масиву в шматках
arraystring = ''
print 'Receiving data...'
while 1:
data = s.recv(4096) #Отримуємо дані в шматках
#Друк даних
arraystring += data #Додаємо дані в рядок масиву
if ']' in data: #Коли закінчене приймання даних
break
array = eval(arraystring)
print 'Data received, sorting array... '
#Сортуємо масив, який є розподіленим
array = MergeSort.mergesort(array)
print 'Array sorted, sending data...'
#Перетворюємо рядок масиву, щоб відправити назад на сервер
arraystring = repr(array)
s.sendall(arraystring) #Посилаємо рядок масиву
print 'Data sent.'
s.close()
Distributed Computing-Raspberry Pi-2
Distributed Computing-Raspberry Pi-3
Час, необхідний для сортування масиву, знизився приблизно до 16 секунд, що не є 2-кратним зниженням через накладні витрати при обробці і передачі даних між двома пристроями. Це збільшення прискорення буде більш помітним з використанням більшої кількості Raspberry Pi, підключивши їх через концентратор.
Distributed Computing-Raspberry Pi-4
Що далі?
Сподіваємося, що цей дійсно короткий підручник дав Вам уявлення про те, наскільки близькими стають розподілені обчислення і як це просто здійснити. Є багато прикладів програм з цього і, можливо, Ви могли б почати свій власний проект розподілених обчислень за допомогою Raspberry Pi (і друга або друзів)!
(Джерело EN: cl.cam.ac.uk)
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting