5 juli 2011

Oke beetje te druk met mijn stage waardoor de verhalen even moesten wachten. Maar goed deze gaat weer een berg recht zetten.

Te druk met stage ja – ja zullen jullie wel denken. En toch ga ik het zeggen ja was echt te druk met stage het is namelijk zo dat ik een mega doorbraak heb ik het project.
Het is namelijk zo dat ik het programma werkend heb. Wat zeg je me nauw ja het werkt en het werkt snel.

Na maanden door papers en code geploeterd te hebben is daar dan eindelijk het resultaat. De vele ontwerpen en tekeningen die op papier getekend zijn hebben vele bomen het leven gekost. Ook de energie verbruik van de supercomputer is nu ook met een paar procent gestegen aangezien die nu ook daadwerkelijk iets doet.

Hoewel het idee al wel een tijdje in mijn hoofd en ik ook kon uitleggen aan de Chinese wat ik ging doen en daarna uren discussiëren over hoe en waarom heb ik niet alleen mijn project al pratend verbeter maar ook die van de andere :). Een ander bijkomstig iets is dat toen ik voor het eerst daar werkte niemand geïnteresseerde was in CUDA en nu ik bijna vertrek de helft het overweegt of zelf gaat gebruiken. En aangezien de andere helft afgestudeerd is en gaat werken is de volgende groep volledig CUDA :).

Maar waarom schreef je twee weken geleden dan niet dat je het werkend heb. Dit was namelijk het breekpunt moment en aangezien het eureka moment niet alleen op de input en berekeningen zit maar op veel meer onderdelen moest dit wel even geschreven worden.  Twee weken geleden had ik  de input en berekening werken ook hoe de dichtstbijzijnde uitkomst berekend kon worden. Dit allemaal in CUDA de reductie truck werkt namelijk heel goed op dit en ik wil alleen het kleinste getal of het grootste getal als je het < omdraait natuurlijk.

De volgende uitdaging was de informatie voor de volgende laag. Wat ik eerst dacht dat de uitkomst was bleek niet overeen te komen met het oude programma. Dus op jacht naar waar dit verrekte getal vandaan kwam. Uiteindelijk bleek het niet zo lastig maar goed het zal wel weer verstopt tussen bergen nutteloze code.

Vervolgens kwam het updaten van de centroid zoals eerder uitgelegd de winnaar krijgt alles maar goed hoe dit in vredesnaam gedaan werd was weer een raadsel en zelf mijn collega had er maar een eigen oplossing op bedacht input+huidige positie gedeeld door 2 top idee alleen zouden de centroids dan wel hele grote sprongen kunnen maken en wanneer ze dat niet zouden moeten doen gebeurt dit toch. Dus na wat zoeken kwam ik er achter dat dit iets anders gebeurt het is meer als: “huidige positie – (huidige positie – input)*leersnelheid” waarbij de leersnelheid heel klein is 0.001

Na dit alles begon het intensieve testen testen en ja nog meer testen. Waarbij telkens weer wat kleine probleempjes aan het licht kwamen. Uiteindelijk bleek zelfs de formule als hier voor beschreven niet eens goed te werken. Met de winskunde wetten die van toepassing zijn bleek dat de formule of the GPU eigenlijk alleen maar de input pakte * leersnelheid. Deze gewijzigt in input – huidige positie * leersnelheid.

Het resultaat een stuk stabieler netwerk en ook veel duidelijkere antwoorden. Witten vlakken blijven op de zelfde plek ook al is een andere centroid vreselijk uitgehongerd. Omdat het programma oogbewegingen simuleert moest dit ook terug erin. Dit was iets wat wel al aanwezig was in de waardes waarmee het programma werkte maar werden nog niet gebruikt. Na dit toegevoegd te hebben Werkte het programma net zo goed.

Bij het testen liepen we wel tegen iets opvallends aan. In vergelijking met de originele versie van DeSTIN bleek de nieuwe versie omgedoopt tot DeSTINy op de grote test trager te zijn. Na een kleine onderzoek naar waar dit vandaan kwam was het weer een zoveelste truck in de oude DeSTIN om rekenkracht te besparen. Als een bepaalde node niet gebruikt word zet je hem gewoon uit. Wat inhoud dat in de lange run er op een bepaald moment niks meer draait alleen maar plaatjes erdoor gejaagd worden. Aangezien dit trucje op de GPU ten kosten gaat van de snelheid omdat in plaats van een enkele node de gehele layer berekend word in één keer. Een andere bijkomst is wanneer je iets kompleet nieuws zou laten zien DeSTIN dit nooit meer zou kunnen herkennen.

En aangezien het doel is om het als het beeld verwerking van een robot te gebruiken is het niet wenselijk om nodes uit te gaan zetten.

Mijn laatste dag stage was interessant maar ook teleurstellend. Op de laatste dag was de formule verbeterd voor het updaten van de centroids. Maar ten opzichten van mijn collega’s was het wel teleur tellend. Met iedereen waarmee ik intensief had samen gewerkt waren vroegtijdig vertrokken zonder gedag te zeggen. Zelf een verrassingsfeest was er niet. Uiteindelijk tegen een collega waarmee ik iets minder samen werkte maar gedag gezegd en het lab verlaten. Rare jongens die Chinese. (meer…)

23 mei 2011

Welkom lezer.

Week 14 van mijn stage was een hele goede week. In ieder geval voor het project. Na flink veel gepuzzeld te hebben met het CUDA Grid, block en thread systeem en ik me een klein beetje verkeken had op de derde dimensie die in het systeem zat kwam er dan op vrijdag ochtend een einde aan het hele hoe krijg ik DeSTIN in CUDA zodat de GPU ook daadwerkelijk wat te doen heeft.

Eerst een kleine uitleg waarop ik mij verkeek DeSTIN bestaat uit lagen nu zijn deze niet zo denderend groot in de huidige form waardoor deze gemakkelijk in één block van CUDA past en hierop ging ik de mist in. Aangezien binnen een node wat dan een hele thread zou worden nog een laag zat en de informatie die ik krijg over CUDA meld dat je de thread klein moet houden.

Wat er gebeurde was dat ik even naar iets anders was gaan kijken DeSTIN maakt nu gebruik van 4 lagen omdat het dan naar een plaatje van 32 bij 32 pixels kan kijken. Omdat we foto’s en eigenlijk live beelden aan DeSTIN willen voeren was ik even gaan kijken naar hoeveel lagen zou ik nodig hebben voor ik een 640 bij 320 pixel plaatje kan bekijken zonder teveel de structuur aan te hoeven passen. Nu kijkt de laagste laag met een 4 bij 4 pixel per node naar het plaatje en als de laagste laag uit 8 bij 8 nodes bestaat kan je een plaatje van 32 bij 32 voeren.

Om een berg berekeningen te besparen kom je op een 9 lagen uit. Dit voornamelijk om de laagste laag het 4 bij 4 pixel gedeelte niet te overschrijden maar wel kleine. Bij negende lagen bestaat de laagste laag uit 256 bij 256 nodes dit past niet meer in één block en dien je meerdere blocks te gaan gebruiken. Een ander gedeelte was het gebruik van geheugen. Het plaatje zit in langzaam geheugen en iedere node kijkt maar naar een klein stukje waarna deze vele malen geraadpleegd word. Je dient dan het kleine stukje te verhuizen naar snel geheugen. (Shared memory voor de gene die weten waar ik het over heb)

Laag ontwerp

Aangezien het snelle geheugen erg klein is kwam dan eindelijk op vrijdag morgen het eureka momentje. Inplaats van de laag in een block te proppen dien ik de laag in de grid te proppen. met een limitering van 65535 blocks in drie richtingen op mijn eigen videokaart en in twee richtingen op de super computer waarbij als ik het goed gelezen heb ik dus daadwerkelijk 65535×65535 mag doen zie ik geen probleem

en in de toekomst wanneer het aantal lagen verhoogt zou moeten worden naar 10 voor HD input. Het resultaat één block word één node binnen de node kan ik super goed gebruik maken van het shared memory aangezien die data zo goed als gelijk blijft binnen de gehele node.

Zoals je hier aan de linkerkant kan zien met mijn prachtige teken kunsten komt het model er dan ongeveer zo eruit te zien. Nu kwam er een vraag terug van mijn opdracht gever of het aantal threads nu niet de limitering word van het netwerk kan ik dit niet met zekerheid zeggen maar met de lage hoeveelheid centroids dat word gebruikt in layer 4 en ik per block max 1024 op eigen of 512 op super machine aan threads kan gebruiken weet ik nog niet of dit echt de limitering is.

Daarbij als ze upgraden naar de zelfde typen videokaart als die ik heb is deze limitering ook verdwenen aangezien de derde dimensie dan gebruikt kan worden van het grid. Hiermee kan je dus ook 65535 blocks omhoog.

Met deze analyse en ontwerp wacht me alleen nog het realiseren, implementeren en documenteren af.

(meer…)

17 mei 2011

Daar gaan we weer. Week 13 nog 4 weken voor ik mijn stageverslag moet inleveren. Of in ieder geval zoals de handleiding het meld dat ik die moet inleveren.
Mijn stagebegeleider had gemeld dat er waarschijnlijk uitstel van inleveren is omdat ik in China zit en de vraag of ik hem dan ook digitaal mag inleveren.
Het enige wat ik hoef te doen is een mailtje naar school te sturen. Dit gesprek was 3 weken terug in week 10. Het mailtje is die zelfde week ook verstuurt echter we zijn weer terug bij af met reageren van school.
Ze reageren namelijk niet. Nu is het niet zo’n probleem dit keer ik kan me ook aan de handleiding houden en het is even wat gehannes om dan een papieren versie op mijn school te krijgen maar heb genoeg familieleden en kennissen die dit ook voor mij kunnen.
Een ander gedeelte is dat de inlever datum bekend zou worden gemaakt op blackboard van onze school. Nu heeft mijn internet hier de laatste tijd wat problemen met adressen buiten China. Maar blijkbaar werkt vandaag meer dan zins afgelopen donderdag tot gisteren. En blackboard meld nog steeds alleen de oude groep mensen.

Maar goed terug naar mijn stage zelf. Het omzetten van de DeSTIN naar een DeSTIN op CUDA versie is op vollen gang. De gewone versie heeft allemaal trucjes die ervoor zorgen dat er slim met data wordt omgegaan. Echter met CUDA is het zo dat het de data graag in één block wilt hebben zodat je vervolgens het weer in kleine stukje op de videokaart kan verdelen. Dus het verdeel trucje word dan nog wel steeds toegepast maar in plaats voor ieder klein stukje het achter elkaar te doen doe je het verdelen van de data in één keer. Waarna je het ook in één keer van verwerken en het resultaat weer opslaan op de videokaart.

Met deze stap ben ik dus bezig en wanneer de eerste laag klaar is dan is de data ook klaar voor de 2de laag en als die klaar is voor weer de volgende. In de tussentijd dat de data omhoog gaat door de lagen hoeft de data niet terug naar de host pas als het de hoogste laag bereikt heeft willen we alle lagen in één keer terug dit zal aardig wat data zijn en hoop dan ook dat ik niet tegen de bottleneck van de overdracht aanloop. Een andere manier is alleen de belangrijkste informatie terug door te geven maar dat zal wat lastiger met het samenvoegen worden. Aangezien de indexen verandert zijn op dat moment maar tot dat punt ben ik nu nog niet.

Oke wanneer de lagen dus van data voorzien zijn zou het clusteren mogelijk moeten zijn. In dit geval is het een versimpelde versie van K-means clusteren (voor die geïnteresseerd even op Wiki zoeken) waarbij het updaten van de centroids iets anders gebeurt. In plaats van alle centroids te updaten word alleen de dichtstbijzijnde geüpdate. Dit word eigenlijk ook wel online clusteren genoemd maar daar is weinig informatie over te vinden alleen wat papers en een YouTube filmpje.

Tot zover mijn vooruitgang van mijn stage: Mijn laptop klaag nog niet blijkbaar is het nog niet te warm of doet de GPU nog te weinig.

(meer…)

9 mei 2011

Daar zijn we weer.

In deze blog komt echt het minimale aan bod kwa gebeurtenissen. Maar goed eerst mijn stage.

Deze week staat ik de trant van daad werkelijk realiseren. Na vele weken besteed te hebben aan het begrijpen van DeSTIN en het plannen hoe het te gaan veranderen was het dan eindelijk zo ver. Het omzetten van DeSTIN naar CUDA. Tijdens dit proces nog meer troep tegen gekomen in de code. Om het mezelf makkelijker te maken gebruik gemaakt van een makkelijkere manier om een bestand uit te lezen.

Lang leve de XML methodes die er tegenwoordig zijn. Hoewel het stukje software kwa code best groot is welgeteld 3 bestanden. Heeft het de leesbaarheid van de code wel vereenvoudigt. Ook de  mogelijkheid om het aan te passen is nu ook een stuk makkelijker. Het enige wat er nu wel gebeurt is dat de originele code echt niet meer compatibel is met de nieuwe. Ze moeten dus eerst hun waardes vertalen naar het nieuwe formaat en dan werkt het weer. Tijdens mijn jacht naar het omzetten van deze code kom ik nu echt bergen waardes tegen die eigenlijk allemaal in dit bestand thuis horen. Maar die voor het gemak in de code verwerkt zitten.

Dit betekend dat wanneer we de software zouden opleveren dat het altijd met alle source moet. Nu is het niet zo’n probleem nu het toch open source is maar toch. Sommige mensen willen waarschijnlijk het gewoon bouwen dat voor hun geldende instellingen erin stoppen en runnen. Zonder daarvoor duizenden regels code voor door te moeten spitten voor ze die bepaalde waarde hebben gevonden. Ook de uitkomst van het netwerk zou nu in zo’n bestand gepropt kunnen worden. Al weet ik nu nog even niet hoe je al die waardes wilt gaan op slaan maar dat is eigenlijk ook buiten mijn scope. De mogelijkheid is er nu en dat zal hopelijk behouden blijven. (Het is China die houden alleen van eigen gemaakt werk)

Over scope gesproken hoewel ik vrolijk zeg dat het buiten mijn scope valt. Wanneer ik de data tussentijds moet overhevelen naar de volgende laag zou het best wel eens kunnen zijn dat ik dit bestand toch moet maken. Al zou het alleen al voor het debuggen ervan zijn.

Wat heb ik eigenlijk allemaal om te zetten? Om DeSTIN tot zijn skelet te vertellen bestaat het uit: Input (afbeelding of video), Layers, Nodes, Clustering, States (Centroids). Het Input gedeelte zit nu in de CUDA versie alleen is het nog op de oude manier. Er dient een kleine wijziging verricht te worden hier om ervoor te zorgen dat de GPU geniet van de input maar omdat het nu even makkelijker is om de code werkend te houden op de CPU gaan we stap voor stap verder met het opbouwen van het DeSTIN netwerk.

Zo ben ik nu bijna aangekomen bij het Layer moment deze verschillende lagen zitten vol met instellingen die per laag verschillen maar die blijkbaar in de code zelf geregeld worden in plaats van buiten af dus hier zit mijn verhuis instellingen naar het configuratie bestand. Het resultaat gaat waarschijnlijk een vele male grotere configuratie bestand worden maar dat wanneer de volgende ermee moet werken tenminste door heeft dat hij in de configuratie bestand moet zijn en niet in de code zelf.

Tot zover mijn vooruitgang met DeSTIN de videokaart is nu nog blij met me aangezien die niets hoeft te doen. Maar daar hoop ik volgende week verandering in gebracht te hebben. Dan mag die gaan stoom blazen en hopelijk overleeft mijn laptop dat wel kwa voorspelde hitte.

(meer…)

3 april 2011

Een week verder. Wat inhoud er komt weer een verhaal aan.

Ook deze week heb ik aan mijn stage opdracht lopen werken hoewel het nog steeds erg veel lezen is en daarnaast veel opschrijven komt het einde nu wel langzaam in zicht zodat ik ook daadwerkelijk aan de verbeteringen kan gaan beginnen. Aan het einde van de week tijdens mijn wekelijkse meeting met mijn opdrachtgever was er zelf een hoofd ontwikkelaar aanwezig die ervaring had heeft met het soort programma waarmee ik werk en heeft me alvast wat hints en tips gegeven wat wel te doen en wat niet.

DeSTIN bestaat uit nodes waarbinnen een cluster ontstaat. de nodes produceren een signaal door het midden te nemen van het cluster wat ook wel een centroid genoemd word. Over de centroid is veel onduidelijkheid en het word er maar niet duidelijker op dus houd het even bij deze waarneming. Dit alles gebeurt in een layer ook wel laag vertaald in het Nederlands. Iedere laag doet precies het zelfde alleen de hoogste laag heeft heel weinig nodes en de laagste heel veel. iedere node leest of een laag lager uit of zelf een plaatje of later video streams.

Omdat iedere node het zelfde doet zou dit uitstekend geschrikt zijn voor parallellisme wat inhoud dat je een zelfde taak in plaats van in serie uitvoert het tegelijk uitvoert. Om een kleine rekensom te illustreren een plaatje van 800 x 600 =  480000 pixels groot. De laagste laag kijkt per node met een diameter van 4×4 = 16. 480000/16 = 30000 nodes één laag hoger kijk vervolgens met een weergaven van 2×2 per node naar de laag lager. 30000/4 = 7500. Één laag hoger weer 7500/4 = 1875 enz enz. Totdat je nog maar een paar nodes overhoud of zoals wij nu met een plaatje van 32×32 doen eindigend met 1.

30000+7500+1875+… +/- = 40000 nodes die allemaal het zelfde doen. Hier komt CUDA om de hoek kijken 40000 x het zelfde doen kan ik ook op de CPU doen alleen heeft die met de aller nieuwste chips maar 8 cores terwijl de GPU vrolijk een paar honderd ter beschikking heeft. En CUDA wordt erg gelukkig als het iets kan uitvoeren dat het liefst per 1000de word opgestart. Misschien ben ik al wat lezer kwijt maar de nummer zijn wat vreemd. waarom zou iets met 1000de opgestart worden als je maar 100 cores ter beschikking hebt. Een programma draait meestal op één of meer threads. 1 core can meerdere threads runnen. In het geval van CUDA kunnen er blokjes met 64,128 of 256 threads opgestart worden en +/- 65000 bloks per kaart gelanceerd worden ook wel grid genoemd.

Of in andere woorden DeSTIN heeft veel kleine identieke taken met CUDA kan ik die vele kleine taken tegelijk uitvoeren. Waarna je alle berekende waardes als een grote bulk weer terug krijgt. Op dit moment ideaal te noemen.

(meer…)

20 maart 2011

We zijn weer een week verder.

Het resultaat van deze week is dat er nu een klacht bij school is neergelegd met betrekking tot de voortgang van mijn stage.

Wat heb ik deze week nog meer gedaan na heel veel code door gespit te hebben en er nu nog meer wijsheid van dit pracht programma verkregen te hebben ben ik pas op de helft. Het programma hoe kon het ook anders is best complex en om even CUDA hierop los te laten is toch wel wat meer uitzoekwerk nodig. Ook de nodige frustraties met Linux (2de besturing systeem van mijn laptop) weer achter de rug. Er was mij verteld dat het verstandig is een profiler mee te laten lopen met de code zodat ik kan zien waar het zware werk wordt verricht. In Windows Visual Studio gaat die natuurlijk vanzelf als je op de debug knop klikt in Linux hoe zij het ook anders niet. Weer wat exotische commando’s verstopt in handleidingen van 12 pagina’s groot nee Linux is super gebruiks vriendelijk. Op 1 punt ben ik het daar wel mee eens een bibliotheek aan je code toevoegen gaat in Linux veel makkelijker dan in Windows. Zo alweer genoeg gezegd over dit onderwerp.

(meer…)

13 maart 2011

Een week verder.

Na wat gepingpongd met school te hebben ben ik nog niet veel opgeschoten met wat volgens de planning zou moeten gebeuren. Maar heb nu wel een deadline wanneer mijn contact persoon met school met mij contact moet opnemen.

Met dit zinnetje vooraf is eigenlijk alles gezegd wat ik op dit moment wil zeggen over de communicatie met Hogeschool Leiden.

Wat heb ik in week 4 gedaan. Zoals misschien niet iedereen zou denken gewerkt 😛 hoewel mijn Chinese collega’s nog wel eens van slapen houden en ze met betrekking tot het plannen niet erg veel lijken te doen. Zie ik toch wel degelijk dat er bij sommige wat gebeurt. Zo geven ze lessen of moeten ze presentaties houden. Ze worden nerveus wanneer ik erbij kom zitten want misschien moeten ze het dan wel in het engels gaan geven. Meestal krijg ik een persoonlijke vertaler naast me die de hoofdpunten vertaald zodat ik weet waarover het gaat en dat ik ook vragen zou kunnen stellen.

(meer…)

5 maart 2011

Het is al weer even stil vanaf mijn kant dus vandaar een berichtje hier.

Hoewel ik het nog niet echt interessant vind om over mijn stage werkzaamheden zelf te schrijven. Komt hier dan toch een stukje hoe mijn dagelijkse bezigheid er op dit moment uit ziet.

Zoals de meeste mensen sta ik op een vast tijdstip op neem ik een douche, ontbijt ik en neem ik de bus naar mijn stage welk welgeteld 1 Yuan (+/- 0,10 euro) kost. Vervolgens loop ik 9 trappen(5 in het gebouw 4 om bij het gebouw zelf te komen) op om bij mijn werkplek aan te komen. Daar aangekomen gaat mijn laptop aan en ga ik aan de slag. Wat ik op dit moment doe is voornamelijk analyseren en leren. Mijn opdracht is duidelijk zorg ervoor dat een programma wat traag is snel gaat werken door middel van het werk wat die doet in kleine stukjes te hakken en te voeren aan een machine die heel veel kleine taken tegelijk kan uitvoeren. (Parallel programming).

Zo rond een uurtje of 11:30 a 12:00 beginnen ik en mijn collega’s honger te krijgen. She Fan (mijn chinees typen is nog steeds op zijn Nederlands) wat inhoud kom eten of eigenlijk vragen ze heb je al je rijst op gegeten :). Vervolgens al die trappen weer af en door de poort naar buiten naar een garagebox of een dak restaurant. Aangezien mijn collega’s het leuk vinden met mij te eten en ze daarvoor ook speciaal naar het werk komen rond lunch tijd zijn we meestal met een man of 5 a 8.

(meer…)

15 februari 2011

Dag twee opstaan douche, aankleden, eten en naar het lab.

Om 16:00 moest ik bij een jij bent een vreemdeling meeting bijwonen. Vooraf werd vermeld dit gaat 1 uur duren.
Na uitleg over van alles en nog wat bleef ik met meer vragen zitten dan dat er beantwoord waren. Wat me wel duidelijk is geworden is dat ik even een Chinese bankrekening moet nemen.
Dit omdat anders een E-Card die ik gekregen heb van de school niet werk (Handig), dit kaartje kan ik mee met de bus en ik kan er mee betalen binnen de campus. Buiten de campus krijg ik korting.

Na het geheel aangehoord te hebben en ik maar even naar de kamer ernaast liep om een in paniek geraakte mevrouw weer terug te sturen. Het is dan 18:00 ja Chinese tijd is nog steeds flexibel alleen hun regels niet.
Word ik opeens ben jij Xavier geroepen. Een kerel genaamd Tosh van de Universiteit Amsterdam zit daar. Hij bleek mijn papieren gehad te hebben en zodoende wist hij dat er nog een Nederlander in de buurt zou zijn.
Na wat gepraat te hebben en telefoon nummer uitgewisseld ging ik naar huis.

Misschien vanavond nog even naar een kroeg.

14 februari 2011

De vakantie periode is voorbij wat betekend dat ik aan de slag ga binnen Xiamen University.
Ik zal daarbij een stuk software omschrijven dat het in plaats 1 ding tegelijk kan naar als ik het zelfde x keer tegelijk moet doen splits het werk dan ook op in x kleine stukjes.
De reden hiervoor is dat we tegenwoordig meerdere processoren in onze pc hebben zitten en 1 daarvan is tegenwoordig ook een die heel snel is in video verwerking.
Aangezien gezichtsherkenning een en al beeld is lijkt de keuzen op dit moment makkelijk gemaakt. (meer…)