Razvoj aplikacije za BOINC grid – Deo II
U prvom delu smo govorili o tome šta predstavlja BOINC i kako se možemo priključiti projektima širom sveta. Drugi deo će nam omogućiti da iskoristimo BOINC i omogućimo našoj aplikaciji da se izvršava iz delova na drugim računarima. Svaka već postojeća aplikacija se može iskoristiti i izvrštiti paralelno. Kako bismo pokrenuli svoj projekat, potrebno je da pripremimo server. Server će omogućavati svim korisnicima koji žele da doniraju svoje resurse baš ovom projektu da dobijaju poslove koje će njihov računar da izvršava i da nas obaveštava o rezultatima.
Sadržaj
Podešavanje servera
BOINC server se može smatrati mozgom cele mreže. On vrši raspodelu posla, preuzima rešenja i šalje nove probleme.
Server se može kreirati na više načina, a neki od njih su:
- Korišćenjem komercialnog oblika kao što je Amazon
- Korišćenjem docker kontejnera
- Korišćenjem virtualne mašine koja u sebi sadrži sav software neophodan za pokretanje BOINC servera
- Za Debian i Ubuntu postoji jednostavna instalacija boinc-server-maker koji omogućava kreiranje Servera
- Korišćenjem BOINCsource koda za prilagođavanje našem sistemu
Za potrebe ovog kursa ćemo koristiti metod sa virtualnom mašinom, zato što je najlakša i ne zahteva puno vremena za podešavanje. Image virtuelne mašine možete preužeti na ovom linku. Image je napravljen za Oracle-ov VirtualBox koji možete preuzeti na ovom linku. Nakon instalacije, sve što je potrebno je raspakovati Image i dodati ga u VirtualBoxu. Takođe je neophodno ući u opcije i isključiti USB2.0 ili instalirati dodatne ekstenzije koje su zahtevane.
Sada, kada smo podesili Image, možemo ga pokrenuti. Pokretanjem Image-a dolazimo do login stranice gde ćemo koristiti sledeće informacije za logovanje:
Username: boincadm Password: boincadmpw
Preporučuje se da se odmah promeni šifra radi sigurnosti korisničkih informacija. Sada, kada smo se ulogovali, nalazimo se na virtuelnom serveru. Kako bismo koristili BOINC koji je u skladu sa današnjom verzijom neophodno je da pokrenemo već pripremljene skripte. Prvo pokrećemo skriptu update_master.sh komandom:
~/update_master.sh
Ona nam omogućava da preuzmemo najnoviju verziju sa git-a. Kada se završi ova skripta, neophodno je pokrenuti configure_server.sh komandom:
~/configure_server.sh
Ovo će izvršiti konfiguraciju servera, i pripremiti naš projekat za kompajliranje. Kompajliranje ćemo izvršiti pomoću skripte make_server.sh pozivanjem
~/make_server.sh
Sada imamo gotov projekat, koji ćemo koristiti u nastavku, ali pre toga je neophodno omogućiti mod_cgi na apache serveru koji je već instaliran i po default-u isključen. To izvršavamo tako što pozivamo komandu
sudo a2enmod cgi
Poželjno je uraditi update i upgrade sistema kako bi dobili najnoviji software i to komandama
sudo apt-get update sudo apt-get upgrade
Sada kada smo odradili sve ovo, naš server je spreman za kreiranje prvog projekta.
Kreiranje projekta
Kreiranje projekta se vrši skriptom koja se vać nalazi u samom BOINC projektu. Prvo je neophodno da odemo do alata koje nam BOINC nudi i to ćemo izvršiti komandom
cd boinc-src/tools/
Sada možemo iskoristiti skriptu make_project kako bismo kreirali prvi projekat. Da bismo kreirali projekat neophodno je da znamo na kojoj ip adresi nam se nalazi virtualna mašina. To možemo pogledati postavljanjem miša na treću ikonicu sa leve strane kao na slici.
Ako ne želimo da unesemo adresu, možemo pokrenuti skriptu i bez adrese, a naknadno dodati u dns adresu na kojoj nam se nalazi server i vezati za boinc-server ili naziv koji smo dodelili korišćenjem –url_base pri kreiranju projekta. Sledeći kod će nam izgenerisati projekat po imenu test na url adresi http://192.168.0.22.
./make_project --url_base http://192.168.0.22 test
NAPOMENA: Ako želimo da koristimo neke od primera koji se nalaze u samom projektu možemo iskoristiti –test_app
Podešavanje apache servera
Sada kada smo kreirali projekat neophodno je da apache serveru kažemo gde se taj projekat nalazi. Na našu sreću skripta koja kreira sam projekat nam kreira i file koji će omogućiti apache serveru da vidi naš projekat. Sve što je potrebno je da taj file prebacimo u configuracioni folder koji koristi apache.
Sada možemo preći u direktorijum gde nam se nalazi sveže kreirani projekat. To ćemo izvršiti komandom
cd ~/projects/test
NAPOMENA: Image koji smo skinuli sadrži stariju verziju konfiguracije (za apache verzije do 2.2) tako da je neophodno izmeniti dobijeni konfiguracioni file. Izmenu možemo izvršiti pomoću komande
nano test.httpd.conf
Sada je neophodno svuda zameniti sledeće linije:
Order deny,allow i Deny from all | zameniti sa | Require all denied |
Order deny,allow i Allow from all | Require all granted |
Ako smo koristili nano potrebno je pritisnuti Ctrl+X , zatim Y pa zatim Enter kako bismo sačuvali izmene. Sada možemo prebaciti file sa konfiguracijom na apache tako što ćemo izvršiti komandu:
sudo ln -s /home/boincadm/projects/test/test.httpd.conf /etc/apache2/sites-enabled
Nakon toga je neophodno restartovati apache server kako bi se učitala nova konfiguracija za projekat i to komandom:
su -c 'apache2ctl -k restart'
Sada smo uspeli da kreiramo projekat u koji možemo ubacivati svoje programe za izvršavanje. Informacije o projektu možemo pogledati na adresi http://192.168.0.22/test/.
Takođe, sada možemo kreirati posao za chron komandom:
crontab test.cronjob
Dodavanje zadataka projektu
Projekat sam po sebi samo rezerviše adresu na koju se računari mogu privezati kako bi doprineli projektu. Sam problem koji će se rešavati se dodaje preko aplikacija koje mogu da se izvršavaju na jednom ili više sistema. Same aplikacije su ono što se računarima daje da računaju, i one su najbitniji deo. Za početak neophodno je da imamo program koji želimo da izvršimo. Kao primer uzećemo C++ program kompajliran i spakovan u Pi.exe. BOINC koristi omotače (Wrapper) koji mu omogućavaju da aplikacije izvršava u omotaču, i tako ne zavisi od operativnog sistema.
Neophodno je skinuti omotač koji nam je potreban za izvršavanje našeg projekta. Wrapper za Windows možete preuzeti na ovom linku (raspakovati zip). Moguće je istu aplikaciju postaviti sa više različitih wrapper-a, kako bismo omogućili i korisnicima koji imaju druge operativne sisteme da izvršavaju naš kod. Pored ovoga, postoje i posebni omotači koji omogućavaju našim aplikacija da se izvršavaju na grafičkim karticama. Na svakom projektu u klijentu možemo primetiti da sadrži sličice koje označavaju na kojim sistemima je omogućeno da se aplikacija izvršava.
Pi.exe je kod koji rešava intergral kako bi dobio sto tačniju vrednost broja Pi. Sam kod možete pogledati ispod:
#define _CRT_SECURE_NO_DEPRECATE #include #include static void calculatePi(double from,double to,double max) { double step = 1 / max; double sum = 0; double toTemp = to / max; for (double i = from/max; i < toTemp ; i+=step) { double x = (i + step / 2); double y = 4.0 / (1 + x*x); sum += y* step; } FILE *out = fopen("out", "w"); fprintf(out, "%.25lf", sum); fclose(out); } int main(int argc, char** argv) { FILE* in; fprintf(stderr, "worker starting\n"); double from, to, max; in=fopen("in", "r"); fscanf(in, "%lf", &from); fscanf(in, "%lf", &to); fscanf(in, "%lf", &max); fclose(in); calculatePi(from,to,max); fputs("done!\n", stdout); return 0; }
NAPOMENA: Program koristi filein da čita i fileout da piše.
Sada imamo sve neophodno za dodavanje aplikacije u projekat koji smo napravili. Kako bismo kreirali nalog potreban za pristup sledećoj stranici, potrebno je da ručno dodamo nalog koji će biti administrator. To ćemo uraditi pozivanjem sledećeg koda:
htpasswd -cb ~/projects/cplan/html/ops/.htpasswd test test
Sada je neophodno da kreiramo aplikaciju. To ćemo uraditi tako što ćemo dodati informacije o njoj u bazu podataka koristeći http://192.168.0.22/test_ops/manage_apps.php. ( dodatne informacije i dodatne komande koje možete da izvršavate korišćenjem korisničkog interfejsa možete naći na stranici http://192.168.0.22/test_ops/)
Kada smo otvorili prozor, u polje naznačeno sa Name moramo ukucati ime aplikacije ( u našem primeru worker), dok u opis (Description) možemo postaviti šta god želimo. Sada, kada smo kreirali aplikaciju neophodno je da napravimo strukturu foldera koja je neophodna za postavljanje problema. Strukturu za aplikaciju ćemo kreirati tako što ćemo preći u folder apps komandom:
cd apps
Potrebno je kreirati strukturu foldera u kojoj će se nalaziti aplikacija. Struktura treba da izgleda ovako:
Ovo ćemo uraditi tako što ćemo izvršiti
mkdir worker # Isto ime kao i ime aplikacije koje smo napravili cd worker mkdir 1.0 cd 1.0 mkdir windows_intelx86 cd windows_intelx86
Sada kada smo napravili strukturu, na lokaciju u kojoj se trenutno nalazimo možemo ubaciti Pi.exe i wrapper koji smo skinuli. To možemo učiniti preko nekog programa za prebacivanje preko ftp-a ( npr. FIleZilla).
NAPOMENA: pri konekciji na server preko ftp-a koristiti port 22. U istom direktorijumu je neophodno kreirati worker_job_1.0.xml koji sadrži:
i version.xml koji sadrži:
NAPOMENA: phisical_name predstavlja stvarno ime file-a, tako da je neophodno promeniti u odnosu na samo ime wrapera i programa koji se poziva. Sada kada smo kreirali podatke o aplikaciji, neophodno je da obavestimo aplikaciju o ulaznim i izlaznim podacima. To ćemo učiniti u folderu templates u koji ćemo preći komandom:
cd ~/projects/test/templates
Zatim ćemo kreirati fileworker_in koji će da sadrži:
i fileworker_out koji će da sadrži:
Sada je potrebno da uradimo update projekta kako bi se naša aplikacija videla. To ćemo uraditi tako što ćemo pozvati skripte sledećim komandama:
cd ~/projects/test/bin ./xadd ./update_versions #ignoristai sva upozorenja i ukucati y./start #pozvati prvi put, kako bi se pokrenuli pozadinski procesi
Sada je neophodno da našu aplikaciju uposlimo. Kreiranjem workunit-a, omogućavamo korisnicima da preuzmu jedan deo posla koji ta aplikacija obavlja, i da taj posao obave na svojim računarima. Kako bismo kreirali workunit neophodno je još kreirati inputfile koji će sadržati ulazne podatke u aplikaciju koja će se izvršavati na određenom workunit-u. Kreiraćemo dva ulazna file-a i tako podeliti posao na dva dela. Kreiranje file-ova ćemo izvršiti komandama:
cd ~/projects/test echo -e "0\n500000\n1000000" > input echo -e "500000\n1000000\n1000000" > input2
Sada kada imamo ulazne file-ove potrebno je da obavestimo BOINC o njima. To ćemo uraditi tako što ćemo pozvati skriptu ./bin/stage_file kodom:
./bin/stage_file input ./bin/stage_file input2
Sada možemo da kreiramo workunit za ulaze koje smo kreirali. To ćemo uraditi pozivom skripte ./bin/create_work pozivanjem koda:
./bin/create_work --appname worker input ./bin/create_work --appname worker input2
Sada smo podesili našu aplikaciju i svako ko se priključi našem projektu korišćenjem BOINC clienta, dobiće deo proračuna koji će se izvršavati na njihovom računaru i vratiti rešenje našem projektu koji kasnije možemo videti. Adresa na koju je potrebno da se zakači klijent za kreirani projekat je http://192.168.0.22/test. Nakon uspostavljanja veze sa našim serverom, slobodan workunit šalje posao klijentu. Posao se šalje tako što se klijentu šalju aplikacija, wrapper, konfiguracija i jedan ulazni file. Zatim se izvršavanje vrši tako što se pokrene wrapper u okviru koga se izvršava naša aplikacija. Nakon završetka programa se na server šalje fileout koji sadrži izlaz koji se dobio izvršavanjem Pi.exe programa. Sve ovo se izvršava samostalno, korisnik može da posmatra samo statistiku izvršavanja i to korišćenjem advance view klijenta. Advance view se aktivira klikom na View>Advance View u klijentu.
Rezultate koje smo dobili od proračuna, možemo naći u folderu uploads našeg projekta.
Rezultati će se nalaziti u zasebnim folderima i za svaki ulaz dobijamo dva izlaza, kako bismo mogli da proverimo da li je rezultat dobar. Kada su naši proračuni gotovi, kada budemo imali 4 foldera (dva ulazna file-a koja smo napravili, i dva izlaza za svaki ), možemo proći i svaki rezultat ( bez duplikata ) sabrati. To možemo da uradimo ručno za dva ulaza, ali ako postavimo više ulaza to će biti skoro nemoguće, tako da ćemo koristiti sledeću bash skriptu:
#!/bin/bash count=0 rm temp 2>>/dev/null for i in `ls */*`; do if [ $count -eq 0 ] then cat $i >> temp printf '\n' >> temp else let count=-1 Fi let count=count+1 done awk '{s+=$0}END{printf("pi = %.20f\n",s) }' temp
Skriptu treba kreirati u uploads folderu i to komandom:
cd ~/projects/test/uploads Nano skripta.sh #prekopirati kod Pritisnuti Ctrl+X Pritisnuti Y Pritisnuti Enter
Sada kada smo kreirali skriptu, možemo da je pozovemo i dobijemo konačno rešenje naše aplikacije komandom:
bash skripta.sh
Kao izlaz dobijamo rešenje koje smo tražili, broj Pi.
Zaključak
Ovo je bio jedan od jednostavnih primera korišćenja BOINC-a kako bismo velike proračune mogli jednostavno da preračunamo korišćenjem već postojećeg hardware-a. Samo računanje integrala kojim se dobija broj Pi, je u ovom primeru podeljen na dva dela. Veliki proračuni se mogu podeliti i na više miliona delova, tako da svaki deo može da se izvršava paralelno. Prednost BOINC-a je što se svi neiskorišćeni resursi mogu iskoristiti, i to se najviše može iskoristiti u velikim firmama i u školama, na računarima koji često ne koriste više od 10% svojih mogućnosti. Takođe, saradnjom više firmi, škola, moguće je dobiti jaku hardware-sku konfiguraciju koja se može iskoristiti za proračune.
Korisni linkovi
- https://boinc.berkeley.edu/
- https://boinc.berkeley.edu/trac/wiki/ServerIntro
- https://boinc.berkeley.edu/trac/wiki/ProjectMain
- https://boinc.berkeley.edu/boinc.pdf
- https://boinc.berkeley.edu/trac/wiki/SourceCodeGit
- https://boinc.berkeley.edu/trac/wiki/MakeProject
- https://github.com/BOINC/boinc