HTW Dresden > GaFrame
 

Verteilte Verarbeitung (Clusterbetrieb)

Sind aufwändige Fitnessfunktionen zu berechnen und steht ein Rechnerpool zur Verfügung, kann GaFrame mit relativ geringem Aufwand für den Clusterbetrieb eingerichtet werden. Diese Seite erläutert die Vorgehensweise an einem Beispiel.

Konfiguration für Clusterbetrieb

Die eigentliche Konfiguration des Genetischen Algorithmus erfordert keinen großen Aufwand. Es muss lediglich ein (String-) Array mit Servernamen übergeben werden. GeneticAlgorithm versucht dann, zu jedem der angegebenen Server eine RMI-Verbindung aufzubauen und erzeugt so viele entfernte Prozesse, wie auf dem jeweiligen Hostsystem Prozessoren/Kerne vorhanden sind. Diese Prozesse werden dann mit je einer Instanz der zu nutzenden Fitnessfunktion initialisiert.

Beispiel:

GeneticAlgorithm algorithm;
...
String servers[] = {"isys23", "isys24", "isys25"};
algorithm.activateRMI(servers);
algorithm.run;
			

Sinnvollerweise würde man die Servernamen im realen Fall aus einer Datei auslesen.

Koordination der RMI-Server

Das eigentliche Problem des Clusterbetriebs besteht in der Koordination der Server. Am einfachsten lassen sich die auftretenden Probleme lösen, wenn man per SSH und PublicKey-Authentifizierung (möglichst ohne Passwort) auf die verschiedenen Server zugreifen kann. Die Codeverteilung kann einfach mittels SCP erfolgen, das Starten und Beenden der Serverprozesse lässt sich z.B. mit einfachen Bashskripten realisieren.

Die folgenden Beispiele gehen davon aus, dass sich der Quellcode, die GaFrame-Bibliothek und die genannten Skripte auf den jeweiligen Zielrechnern im "gleichen" Verzeichnis (also z.B. ~/ga) befinden.

Die Servernamen werden als Liste in der Datei serverList hinterlegt:

isys23 isys24 isys25
			

Das Skript startServers.sh wird z.B. mit der Zeile startServers.sh `cat serverList` aufgerufen und startet dann auf jedem der Server ein weiteres Skript, dem es das aktuelle Verzeichnis als Parameter übergibt:

dir=`pwd`

for server in `cat serverList` 
do
	echo $server
	ssh $server $dir/rmiStart.sh $dir &
done
			

Das Skript rmiStart.sh wird auf jedem entfernten Rechner ausgeführt, startet die RMI-Registry und registriert die Klasse RemoteFitness für den RMI-Zugriff. Damit ist der "Cluster" betriebsbereit.

cd $1
cd bin
pwd 
rmiregistry &
sleep 1
java -cp . de.htwdd.ga.rmi.RemoteFitness
			

Beenden der RMI-Server

Nach dem Durchlauf des Genetischen Algorithmus lassen sich die Server z.B. mit folgendem Skript (stopServers.sh), das mit stopServers.sh `cat serverList` aufgerufen wird, beenden:

for server in `cat serverList` 
do
	echo $server
	ssh $server killall java
	ssh $server killall rmiregistry
done
			

Die Verwendung von killall ist zugegebenermaßen sehr radikal, aber das Beispiel kann (und sollte) individuell angepasst werden.