Amazon Elastic Cloud


Prinzip

aec Prinzip

Der Nutzer erzeugt beliebig viele Instanzen aus einer Menge angebotener Betriebssysteme. Des weiteren kann beliebig viel Speicher aus dem Amazon Simple Storage Service S3 genutzt werden. Da MPI zur Verfügung steht, ist massiv paralleles Rechnen möglich. Jede Instanz hat 2 IP-Adressen, mit denen sich 2 (DNS-) Namen verbinden:

Da es sich bei den Instanzen um "normale" Betriebssysteme handelt, können auf diesen Instanzen auch die üblichen Netzdienste, wie WWW, FTP ... angeboten werden.

Die weiteren Ausführungen stellen den MPI-Betrieb unter Linux dar. Der Betrieb von Windows-Instanzen ist auch möglich, wegen des Zugriffs per RemoteDesktop aber umständlich und der MPI-Betrieb nur "unter Schmerzen" möglich.

Der Betrieb der Cloud ist vom ersten Moment an kostenpflichtig!

Starten von Instanzen

Typographie

Da nun verschiedene Aktivitäten auf verschiedenen Rechnern unter verschiedenen Nutzer-Identitäten stattfinden, soll Folgendes vereinbart werden:

Aktivitäten des Nutzer auf dem RemoteHost werden grau unterlegt dargestellt.
Aktivitäten des Root-Nutzers auf jeder der Instanzen werden gelb unterlegt dargestellt.
Aktivitäten des mpiusers auf jeder der Instanzen werden blau unterlegt dargestellt.
Aktivitäten des mpiusers genau einer Instanz werden grün unterlegt dargestellt.

Vorgehensweise

Am Anfang sind eine Reihe von Vorkehrungen zu treffen, die je nach Anzahl der Instanzen sehr lange dauern können. Leider werden diese Vorkehrungen wieder zerstört, wenn man die Instanz stoppt. Man kann die konfigurierte Instanz (kostenpflichtig) speichern. Als Alternative bietet sich das Schreiben von Shell-Skripten an, die die Instanz immer wieder automatisch konfigurieren.

Das Starten der Instanzen erfolgt über die EC2-Konsole:

https://console.aws.amazon.com/ec2/home (Zugriff nur nach Einrichten eines Accounts möglich)

Vergessen Sie nicht, die Region auf EU-West stellen.

Sie müssen zunächst so genannte Security-Groups anlegen. Es gibt zwar eine Standard-Gruppe. Deren Benutzung ist aber nicht empfehlenswert, da sie sehr restriktiv ist. Zu Testzwecken kann man eine Security-Gruppe erzeugen, deren TCP-Ports alle geöffnet sind. Spätere Einschränkungen sind natürlich möglich.

Das Kontaktieren der Instanzen erfolgt per SSH. Allerdings nicht per Nutzerkennzeichen/Passwort, sondern per RSA-Authentifizierung. Dazu muss eine Schlüsselpaar erzeugt werden. Die Konsole bietet das in einem Menüpunkt an. Speichern Sie das dabei gesendete *.pem - File auf dem remote Host ab. Es enthält den privaten Schlüssel. Der öffentliche Schlüssel wird jeder Instanz beim Starten mitgeteilt. Um zum Beispiel eine Debian-Lenny-Instanz zu starten, wechseln Sie zu:

Instances --> Launch Instances--> Community AMIs --> AllPlatforms --> Debian -->debian-5.0-lenny-base

Die Instanzen werden angezeigt. Wählen Sie die neueste Debian-Lenny-Instanz aus. (Im Prinzip können Sie auch ein beliebiges anderes Linux, z.B. Fedora starten. Es hat sich jedoch gezeigt, dass Sie in diesem Fall viele Pakete ("make" oder "gcc") nachinstallieren müssen.)

Nun können Sie die Instanz kontaktieren:

ssh -i Keyfile.pem -l root externer_instanzname

Zur Kommunikation zwischen den Instanzen, wird ebenfalls ein Schlüsselpaar erzeugt:

ssh-keygen -f intkey

Um nicht als root-Nutzer (Administrator) arbeiten zu müssen, wird ein Nutzer (ohne Passwort), zum Beispiel mpiuser auf allen Instanzen erzeugt:

useradd -m mpiuser

Das soeben erzeugte Schlüsselpaar wird auf jede der Instanzen kopiert:

scp intkey intkey.pub -i Keyfile.pem root@externer_instanzname

Das Schlüsselpaar wird in das HOME-Verzeichnis des mpiusers kopiert:

cp intkey* ~mpiuser
chmod 0600 ~mpiuser/intkey*

Der letzte Befehl ist wichtig, da die SSH die Rechte der privaten Schlüsselfiles prüft und allzu offen im Filesystem abgelegte Schlüssel ablehnt. Nun muss die SSH für die RSA-Methode konfiguriert werden, indem in /etc/ssh/sshd.config folgende Zeile aktiviert wird:

AuthorizedKeysFile %h/.ssh/authorized_keys

Nun muss die SSH neu gestartet werden:

/etc/init.d/ssh restart

Da die SSH den public key unter $HOME/.ssh/authorized_keys erwartet, muss ein entsprechender symbolischer Link erzeugt werden.

mkdir ~mpiuser/.ssh
ln -s ~mpiuser/intkey.pub ~mpiuser/.ssh/authorized_keys

Damit der mpiuser mit diesen Dateien arbeiten kann, muss er der Eigentümer der Dateien sein:

chown -R mpiuser:mpiuser ~mpiuser

MPI

Um MPI nutzen zu können, muss die SSH zwischen den Instanzen so eingestellt sein, dass sie keine Rückfragen, stellt. Das trifft sowohl auf die Passwortabfrage, sowie auf die Frage zu, ob der Schlüssel des Kommunikationspartners in die known_hosts-Datei aufgenommen werden soll.

Um die Passwortabfrage zu verhindern, müssen der öffentliche und private Schlüssel unter dem Namen .ssh/id_rsa und .ssh/id_rsa.pub abgelegt werden:

cp intkey .ssh/id_rsa
cp intkey.pub .ssh/id_rsa.pub

Nun sollte man prüfen, ob man sich ohne Passwortabfrage zu jeder Instanz verbinden kann:

ssh interner_instanzname

Das MPI kann man entweder von http://www.mcs.anl.gov/research/projects/mpich2/index.php laden (Tests mit anderen MPI-Implementierungen schlugen aus unbekannten Gründen fehl) und wie in der INSTALL - Datei beschrieben übersetzen. Debian-lenny-5-Nutzer können aber auch die vorübersetzte Datei mpich2.tgz auf die Instanzen transportieren und dort entpacken:

scp mpich2.tgz -i Keyfile.pem root@externer_instanzname

cp mpich2.tgz ~mpiuser
chmod 0600 ~mpiuser/mpich2.tgz

Der Nachteil dieser Variante ist, dass die Übersetzung unter einer anderen Umgebung stattgefunden hat, weswegen man bei der Übersetzung der MPI-Programme die Optionen -I und -L angeben muss.

Jetzt kann der mpiuser das Archiv entpacken:

tar -xvzf mpich2.tgz

... und ein so genanntes secretword vorgeben, welches aber aus Gründen der Bequemlichkeit leer bleibt:

echo 'secretword=' >$HOME/.mpd.conf
chmod 0600 $HOME/.mpd.conf

Wieder müssen die Rechte eingeschränkt werden. Um festzulegen, welche Instanzen am MPI beteiligt sind, müssen deren interne(!) Namen (jede auf eine Zeile) in die Datei $HOME/mpdhosts eingetragen werden. Außerdem sollte der Pfad erweitert werde, damit die MPI-Administrations-Befehle verfügbar sind:

export PATH=/home/mpiuser/mpich2/bin:$PATH

Jetzt kann MPI gestartet werden;

mpdboot -n <anzahl_der_instanzen> -f $HOME/mpdhosts

Zum Testen kann man das Programm mpdtrace starten. Es listet die am MPI beteiligten Instanzen auf.

Als Testprogramm kann zum Beispiel kette.c dienen (ist in mpich2.tgz bereits enthalten):

kette

Das Programm schickt eine Zahl (hier: 2) zum jeweiligen nächsten Nachbarn welcher den Zahlenwert ausgibt und seinerseits an den nächsten Nachbarn weiter schickt. Nach einer Runde vermindert die Ausgangsstation den Zahlenwert um 1. Fällt der Wert auf 0, so ist das Programm beendet.

Da die Ausgaben unabhängig von der ausgebenden Instanz stets auf der Konsole erfolgen, über welche die Anwendung gestartet wurde, schreibt jede Instanz ihre Ausgabe zusätzlich noch in eine Datei /tmp/x.log. Dadurch kann nach dem Programmlauf nachgewiesen werden, dass tatsächlich jede Instanz an der Berechnung beteiligt war.

Um das Programm zu übersetzen, muss man folgenden Befehl geben:

mpicc kette.c -I /home/mpiuser/mpich2/include/ -L /home/mpiuser/mpich2/lib -o kette
cp kette ../bin

Wie bereits erwähnt, können die Optionen -I und -L entfallen, wenn man das MPI tatsächlich aus dem Quelltext übersetzt hat. Das Starten erfolgt durch:

mpiexec -n <anzahl_der_instanzen> kette

Um im Notfall MPI wieder beenden zu können (Gegenbefehl zu mpdboot) kann man folgenden Befehl geben:

mpdallexit