<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>debian-ar.org &#187; Clusters</title>
	<atom:link href="http://debian-ar.org/category/clusters/feed/" rel="self" type="application/rss+xml" />
	<link>http://debian-ar.org</link>
	<description>Comunidad de usuarios de Debian Argentina</description>
	<lastBuildDate>Wed, 28 Jul 2010 09:48:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Cluster LAM/MPI con Debian Etch</title>
		<link>http://debian-ar.org/2009/04/27/cluster-lammpi-con-debian-etch/</link>
		<comments>http://debian-ar.org/2009/04/27/cluster-lammpi-con-debian-etch/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 05:40:21 +0000</pubDate>
		<dc:creator>dag</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Clusters]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[cluster en debian]]></category>
		<category><![CDATA[cluteres]]></category>
		<category><![CDATA[debian cluster]]></category>
		<category><![CDATA[lam en debian]]></category>
		<category><![CDATA[lam/mpi en debian]]></category>

		<guid isPermaLink="false">http://debian-ar.org/?p=407</guid>
		<description><![CDATA[Podemos configurar un cluster de alto rendimiento en Debian utilizando la interfaz de paso de mensajes LAM/MPI. Los prerrequisitos de este tutorial es disponer de una instalación básica de debian Etch, en nuestro caso hemos usado cinco máquinas (un frontend y cuatro nodos), aisladas en una red propia que se usará tan solo para el [...]]]></description>
			<content:encoded><![CDATA[<p>Podemos configurar un cluster de alto rendimiento en Debian utilizando la interfaz de paso de mensajes <a title="LAM/MPI" href="http://www.lam-mpi.org/" target="_blank">LAM/MPI</a>.</p>
<p>Los prerrequisitos de este tutorial es disponer de una instalación básica de debian Etch, en nuestro caso hemos usado cinco máquinas (un frontend y cuatro nodos), <strong>aisladas en una red propia</strong> que se usará tan solo para el cluster de alto rendimiento, las hemos llamado: (10.11.12.1) debian-frontend, (10.11.12.2) debian-node1, (10.11.12.3) debian-node2, (10.11.12.4) debian-node3, (10.11.12.5) debian-node4. En cada una de las máquinas hemos creado un usuario al que hemos llamado <em>&#8220;cluster&#8221;</em>.</p>
<p>Una vez tengamos la instalación básica y comprobamos que tengan connectividad entre ellas y lleguen a un gateway con salida internet (para la instalación de paquetes con apt-get), procederemos a instalar el paquete <em>build-essential</em> en cada una de las máquinas para compilar LAM/MPI que nos <a title="descargaremos de la web oficial" href="http://www.lam-mpi.org/7.1/download.php" target="_blank">descargaremos de la web oficial</a>.</p>
<p>Así que en cada uno de los nodos ejecutaremos</p>
<blockquote>
<pre class="geshifilter-text">apt-get install build-essential</pre>
</blockquote>
<p>En nuestro caso no vamos a usar C++ y no necesitamos Fortran para programar en el cluster, así que no necesitaremos el compilador Fortran, eso sí le especificaremos la opción &#8211;without-fc en el configure, compilamos también el paquete en cada una de las máquinas:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">tar -xzvf lam-7.1.4.tar.gz
cd lam-7.1.4
./configure --without-fc &amp;&amp; make &amp;&amp; make install</pre>
</blockquote>
</div>
<p>Una vez tenemos LAM/MPI instalado en todas las máquinas, modificaremos el archivo .bashrc del usuario cluster, que encontraremos en la home de este <em>/home/cluster/.bashrc</em>, al final del archivo añadiremos las siguientes líneas:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">PATH=/usr/local/lam/bin:$PATH
export PATH
PATH=/usr/local/lam/bin:$PATH
export PATH</pre>
</blockquote>
</div>
<p>Modificaremos en el frontend el archivo <em>/etc/hosts</em> donde le indicaremos donde están todos los nodos, y luego lo podemos copiar a los otros nodos:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">127.0.0.1	localhost
10.11.12.1	debian-frontend
10.11.12.2      debian-node1
10.11.12.3      debian-node2
10.11.12.4      debian-node3
10.11.12.5      debian-node4</pre>
</blockquote>
</div>
<p>Una vez podamos localizar todos los nodos, debemos conseguir que el frontend pueda acceder usando ssh a todos los nodos sin necesidad de password, para ello nos vamos al nodo principal y ejecutaremos ssh-keygen:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cluster/.ssh/id_rsa): [ENTER]
Enter passphrase (empty for no passphrase): [ENTER]
Enter same passphrase again: [ENTER]
Your identification has been saved in /home/cluster/.ssh/id_rsa.
Your public key has been saved in /home/cluster/.ssh/id_rsa.pub.
The key fingerprint is:
17:4f:9b:88:55:e2:dc:25:c3:74:01:c7:49:52:08:4f cluster@debian-frontend</pre>
</blockquote>
</div>
<p>Copiamos la clave a todos los nodos:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">scp /home/cluster/.ssh/id_rsa.pub cluster@10.11.12.2:/home/cluster/
scp /home/cluster/.ssh/id_rsa.pub cluster@10.11.12.3:/home/cluster/
scp /home/cluster/.ssh/id_rsa.pub cluster@10.11.12.4:/home/cluster/
scp /home/cluster/.ssh/id_rsa.pub cluster@10.11.12.5:/home/cluster/</pre>
</blockquote>
</div>
<p>Accedemos a cada uno de los nodos y guardamos la clave:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">cd /home/cluster/
mkdir .ssh
cat id_rsa.pub &gt;&gt; /home/cluster/.ssh/authorized_keys
rm id_rsa.pub</pre>
</blockquote>
</div>
<p>Nos volvemos al frontend, y comprobamos que podemos acceder a los hosts ejecutando un comando que debería mostrar el shell en uso sin necesidad de introducir ningún password:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">rsh debian-node1 -n 'echo $SHELL'
/bin/bash
rsh debian-node2 -n 'echo $SHELL'
/bin/bash
[...]</pre>
</blockquote>
</div>
<p>Crearemos un archivo, al que yo he llamado <em>boot_schema</em> donde indicaremos todos los nodos del cluster, y el número de CPUs, si tenemos SMP le indicaremos dos CPU añadiendo cpu=2 despues del nodo (por ejemplo debian-node4 cpu=2):</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">#Mis nodos del cluster
debian-frontend
debian-node1
debian-node2
debian-node3
debian-node4</pre>
</blockquote>
</div>
<p>Momento de arrancar el cluster, para ello le pasaremos el archivo <em>boot_schema</em> que creamos en el paso anterior, y si todo ha ido bien veremos algo parecido a esto:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">lamboot -v -ssi boot rsh boot_schema

LAM 7.1.4/MPI 2 C++/ROMIO - Indiana University

n-1&lt;6023&gt; ssi:boot:base:linear: booting n0 (debian-frontend)
n-1&lt;6023&gt; ssi:boot:base:linear: booting n1 (debian-node1)
n-1&lt;6023&gt; ssi:boot:base:linear: booting n2 (debian-node2)
n-1&lt;6023&gt; ssi:boot:base:linear: booting n3 (debian-node3)
n-1&lt;6023&gt; ssi:boot:base:linear: booting n4 (debian-node4)
n-1&lt;6023&gt; ssi:boot:base:linear: finished</pre>
</blockquote>
</div>
<p>Tenemos a nuestra disposición una suite de tests para probar nuestra instalación, pero que hay más bonito que empezar con un <em>&#8220;Hola Mundo&#8221;</em> en C para abrir nuestro apetito, para ello crearemos un archivo helloworld.c con el siguiente contenido, en un directorio al que he llamado test dentro de nuestra home:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-c"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;mpi.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">(</span><span style="color: #993333;">int</span> argc, <span style="color: #993333;">char</span> *argv<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span>
	<span style="color: #993333;">int</span> rank, size;

	MPI_Init<span style="color: #66cc66;">(</span>&amp;argc, &amp;argv<span style="color: #66cc66;">)</span>;
	MPI_Comm_rank<span style="color: #66cc66;">(</span>MPI_COMM_WORLD, &amp;rank<span style="color: #66cc66;">)</span>;
	MPI_Comm_size<span style="color: #66cc66;">(</span>MPI_COMM_WORLD, &amp;size<span style="color: #66cc66;">)</span>;
	<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" target="_blank"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"Hello, world! I am %d of %d<span style="color: #000099; font-weight: bold;">\n</span>"</span>, rank, size<span style="color: #66cc66;">)</span>;
	MPI_Finalize<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">}</span></pre>
</blockquote>
</div>
<p>Lo compilamos y pasamos el ejecutable a los otros nodos:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">cd /home/cluster/test
mpicc helloworld.c -o helloworld
rsh debian-node1 -n 'mkdir /home/cluster/test'
scp hello 10.11.12.2:/home/cluster/test/
rsh debian-node2 -n 'mkdir /home/cluster/test'
scp hello 10.11.12.3:/home/cluster/test/
[...]</pre>
</blockquote>
</div>
<p>Hora de probar, deberíamos obtener un resultado como este (aunque no necesariamente en el mismo orden):</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">mpirun C hello
Hello, world! I am 0 of 5
Hello, world! I am 2 of 5
Hello, world! I am 1 of 5
Hello, world! I am 4 of 5
Hello, world! I am 3 of 5</pre>
</blockquote>
</div>
<p>Tenemos también como hemos dicho una suite de tests que nos permitiran comprobar el correcto funcionamiento de la instalación MPI:</p>
<div class="geshifilter">
<blockquote>
<pre class="geshifilter-text">cd /home/cluster
tar -xzvf lamtests-7.1.4.tar.gz
cd lamtests-7.1.4/
./configure
make

make -k check 2&gt;&amp;1 | tee check.out

<a href="http://bytecoders.homelinux.com/content/cluster-lammpi-con-debian-etch.html" target="_blank">Fuente</a></pre>
</blockquote>
</div>
<pre class="geshifilter-text"></pre>
]]></content:encoded>
			<wfw:commentRss>http://debian-ar.org/2009/04/27/cluster-lammpi-con-debian-etch/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
