Blender Cluster

•Januar 11, 2012 • Kommentar verfassen

Als ich in letzter Zeit malwieder zwei Freistunden hatte, hab ich unser Terminalserver missbraucht, um einen (kleinen) Blender Cluster mit etwa 100 Nodes zu bauen. Dies Alles basiert auf den tollen Post von EisFrei auf http://blog.netzpfa.de/2008/03/26/blender-renderfarm-unter-linux-aufsetzen/

Vorraussetzungen:

  • Ubuntu oder Debian System
  • funktionierender LTSP Dienst (http://wiki.ubuntuusers.de/LTSP)
  • einige freie Rechner/Server, mit 100MBit, am besten 1GBit Netzwerkanschluss
  • ein paar grundlegende Linux Kentnisse (falls ihr irgendwas nicht versteht im ubuntuuser Wiki nachgucken)

Erstmal etwas Theorie, wie funktioniert ein solcher (einfacher) Cluster überhaupt?

Zuerst sollte man wissen, dass es in diesem einen Main Server und viele Nodes gibt. Die Nodes können beliebig eingehangen werden und booten über LTSP.

Jeder Node greift beim Booten automatisch auf die Freigabe zu, die bei dem Main Server liegt und bindet ein Ordner in sein Dateisystem ein. (über NFS)

Auf jedem Node liegt ein Programm, das vollkommen parallel zu den anderen Nodes Bilder aus der .blend Datei erstellt und diese abspeichert. Das rendern der Bilder wird dadurch parallelisiert, dass jeder Frame in Unterbilder unterteilt wird, die von jedem Node erstellt werden und nachher zusammengeschnitten werden (http://www.youtube.com/watch?v=4VUWrZRCtI8 ab 1:30 wirds unintressant)

So jetzt genug Theorie, kommen wir zur Praxis:

Zuerst müssen wir die Freigabe von unserem Mainserver erstellen:

 mkdir /usr/local/share/blender/
 vim /etc/exports
 

folgenden Eintrag hinzufügen (Achtung dies ermöglicht allen Clients im Netzwerk auf eure Festplatte zu schreiben und sollte deswegen nur in vertraulichen oder abgeschotteten gemacht werden) :


/usr/local/share/blender        *(rw,no_root_squash,async,no_subtree_check)

und startet den Dienst neu:

/etc/init.d/nfs-kernel-server restart

Als nächstes legt man die Dateien render.py in die Blender Freigabe (Link steht oben) und auch eine Test Datei zum Rendern.

Wenn ihr dies gemacht habt, kann man mit der Modifikation des Image anfangen (ich gehe jetzt mal von einem 32bit Image aus, sonst einfach i386 immer durch amd64 ersetzten)

Zuerst erstellt ihr in /opt/ltsp/i386/usr/share/ltsp/screen.d/ die Datei render, mit folgendem Inhalt:


#!/bin/bash

if [ "True" != "$LTSP_CONFIG" ]; then
 . usr/share/ltsp/ltsp_config
fi

# chvt to the right screen
[ -n "${SCREEN_NUM}" ] && openvt chvt ${SCREEN_NUM}

# Clear the screen, to place cursor at the top
clear

if [ -z `ls / | grep blender` ]; then
 echo "Fatal Error: NFS Share funktioniert nicht! /blend ist nicht gemountet!";
 sleep 100;
fi

htop &

#in den Ordner wechseln
cd /blender;

#Prozessor Anzahl ermitteln
proc=$(cat /proc/cpuinfo | grep processor | wc -l)
#Pro Prozessor zwei Prozesse starten
proc=$[proc*2];

while [ 1 ]
do
 #Blender Datei ermitteln
 blend_data=$(ls /blender | grep .blend| head -n 1);

#warten bis die Datei zum starten des Rendern erstellt wurde
 while [ `ls /blender| grep nowRender | wc -l` -le 1 ]
      do
        sleep 1;
      done

#So lange durchlaufen bis alle Render Prozesse gestartet sind
 count=0
 while [ $count -le $proc ]
     do
       nohup /usr/bin/blender -b $blend_data -P /usr/local/bin/render.py -a &
       count=$[$count+1]
     done
 #in 10 Sekunden muss nowRender wieder entfernt sein, da sonst die Prozess nochmal neu starten
 sleep 10;

done

und sagen LTSP, dass er dieses Skript auf Screen 7 legen soll, in /opt/ltsp/i386/etc/lts.conf:


SCREEN_07=render

dann lassen wir ihn auf die Freigabe zugreifen:

mkdir /opt/ltsp/i386/blender
vim /opt/ltsp/i386/etc/rc.local
folgendes vor „exit 0“ einfügen
mount <ip des main servers>:/usr/local/share/blender /blender

Die Modifikationen des Image ist fertig und nun kann dieses neu generiert werden:

ltsp-update-image --arch i386

Wenn man nun ein Terminal startet, dann erscheint htop und im hintergrund wird gewartet, dass mit dem Rendern begonnen wird.
Es muss die Blender Datei vorhanden sein und dann kann das Rendern mit erstellen der Datei nowRender gestartet werden (alles nach /usr/local/share/blender/)

touch /usr/local/share/blender/nowRender && sleep 2 && rm /usr/local/share/blender/nowRender

Man sollte nun sehen wie die Nodes ausgelastet werden und es sollten Bilder in dem Ordner erscheinen.
Nachdem sich die Prozesse auf den Nodes beendet haben, erstellt man in /usr/local/share/blender/blender/ die Datei merge.pl, die Sources findet man im Link oben und schneidet die Bilder mit:

./merge.pl

zusammen
Am Ende kann man die zusammengesetzte Bilder zu einem Video zusammenfügen:

mencoder "mf://projekt_fr_*.jpg" -mf fps=25 -o output.avi -ovc lavc -lavcopts vcodec=mpeg4

Neuer Blog

•Januar 11, 2012 • Kommentar verfassen

Ich hab mich nun dazu entschieden einen neuen Blog anzufangen. Ich werde hier alle Themen rund um Linux/OpenSource, die mich in letzter Zeit beschäftigt haben, angehen, aber auch über den Tellerand schauen.

Hier mal ein paar Eckdaten zu mir:

  • Administrator (seit 2010/2011 von 9 Servern und über 100 Terminals)
  • würde Linux um nichts in der Welt ersetzten (außer vlt. Minix)
  • Ubuntu-/Debian-/Arch Linux-User
  • spricht in bis zu 6 Sprachen (und das häufig und fließend)
  • mag sowohl Hardware als auch Software
  • vieel kreativität und kaum ironisch 😛
  • geht aktuell in die E1