datacubeR

Usar mi PC como GPU Server

Conectarse al PC utilizando SSH

¿Cómo instalar y configurar?

picture of me picture of me Tener mi Laptop me encanta, es portable y potente, pero no tan potente. Y además se calienta y suena si es que lo pongo a entrenar un modelo a máxima potencia. En especial cuando se trata de hacer Deep Learning es necesario un PC de escritorio, tienen mejor ventilación y al permitir componentes más grandes se puede alcanzar un rendimiento bastante superior al de un Laptop, incluso gamer, pero… no puedo llevarlo conmigo. Es más, mi recién ensamblado J.A.R.V.I.S es gigantesco entonces, ¿cómo hago para desplazarlo?.

Bueno, supongamos que por la pandemia, no es necesario desplazarme, menos aún si estoy remoto. Cómo hago para combinar mi trabajo en el Laptop y en el PC, y estar traspasando archivos, o tener que tener que desconectar mouse, teclado, pantalla… Al final… se complica la cosa.

Lo que yo decidí es que quiero tener todo en mi Laptop. Tener archivos, clases, códigos, etc. Pero si necesito entrenar algo potente o dejar entrenando algo y dejar mi laptop disponible para hacer mis cosas puedo hacerlo. Para ello mi idea es dejar a J.A.R.V.I.S como un servidor remoto, lo enciendo sólo cuando lo necesito y puedo apagarlo de manera remota o dejarlo programado para su apagado. Para ello entonces utilizo SSH.

Esta idea no se me ocurrió a mí y me fue sugerida por el gran Juan Pedro de SensioAI, si les interesa el tema de Deep Learning síganlo en Youtube, con él he aprendido demasiado.

SSH es un protocolo de traspaso de datos entre un cliente (en este caso mi Laptop) y un servidor (J.A.R.V.I.S). En este caso yo sólo envío comandos del cliente al servidor, lo cual es bastante rápido pero la ejecución se realiza en el servidor, el cual tiene más poder que mi Laptop. De esa manera no tengo que desconectar nada, sólo trabajo en mi Laptop y a J.A.R.V.I.S se le ocupa a través del terminal, o incluso un Jupyter Lab o VS Code Remoto. ¿Cómo setearlo? Sumamente fácil (esto porque mi Laptop como J.A.R.V.I.S usan Ubuntu).

Configurar el Servidor

Para ello sólo tengo que instalar ssh-server y desactivar el firewall de Ubuntu:

sudo apt update
sudo apt install openssh-server

Al correr esto, ssh comenzará a correr de manera automática cada vez que J.A.R.V.I.S encienda.

Una de mis más grandes angustias era, y cómo hago para desbloquear el Server porque tiene clave, ¿tendré que desactivarla y dejar mi PC vulnerable? Nadie aclara esto pero, no es necesario, ssh permite conectar incluso si tiene clave. A pesar de que el servidor quede estancado en la pantalla de Login, SSH permitirá acceso si es que el cliente tiene las credenciales necesarias para acceder.

sudo systemctl status ssh

Si aparece algo así como Active: active (running) : está perfecto.

sudo ufw allow ssh

Luego es necesario correr el siguiente comando y rescatar la IP para conectarse:

ip a

picture of me

En este caso la ip que arroja es: 192.168.0.59. Esto es sólo una IP local, para efectos de mostrar cómo obtener el valor. Esta es toda la configuración en el lado del Servidor.

Configuración en el Cliente:

Acá no hay mucho que hacer ya que Ubuntu ya viene con un cliente instalado para SSH. Para conectarse basta con ingresar ssh usuario@host:

ssh alfonso@192.168.0.59

Se va a solicitar la clave para ingresar al servidor y listo.

La primera vez que se ingresa aparece un warning como:

"The authenticity of host 192.168.0.59 (xxx.xxx.xxx.xxx) can't be established.
ECDSA key fingerprint is SHA256:Vybt22mVXuNuB5unE++yowF7lgA/9/2bLSiO3qmYWBY.
Are you sure you want to continue connecting (yes/no)?"

Hay que poner yes sin miedo.

Entonces cuando uno ingresa a ssh, se verá algo así (tapando el verdadero IP de mi servidor):

picture of me

Dado que en ambas maquinas instalé Oh my ZSH y Powerline10k les dí una configuración distinta, por lo que inmediatamente se nota que cambié de ambiente. Además Powerline10k indica que ahora me conecté a J.A.R.V.I.S.

Configuración Jupyter Lab y VS Code

El tema es que todo esto nos tiene que llevar a la productividad. Mis dos herramientas principales para codear son Jupyter Lab y VS Code.

Jupyter Lab en SSH

Si yo intento abrir Jupyter Lab en SSH, no va a pasar nada. Eso es porque SSH no tiene una interfaz gráfica que me permita ingresar al Jupyter Lab que se inicializa en J.A.R.V.I.S. Esto porque Jupyter Lab se inicia en localhost remoto, no en el localhost del cliente. Si quiero acceder al localhost del remoto tengo que hacer algo que se conoce como SSH Tunneling o Port Forwarding. Básicamente esto es habilitar el traspaso de un puerto remoto a uno local, es decir, desde J.A.R.V.I.S hasta mi laptop.

Para hacer eso se harán los siguientes pasos:

jupyter lab --no-browser --port=5678
ssh -CNL localhost:5678:localhost:5678 alfonso@192.160.0.1

Una vez habilitado el puerto, puedo dirigirme al localhost:5678 en mi Laptop y abrir Jupyter Lab. El tema es que para el primer inicio se solictará un Token y una clave. El token puede ser obtenido del URL generado al iniciar Jupyter Lab, y la clave se debe definir para futuros ingresos.

Mi configuración

Obviamente esto es muy tedioso, ya que es muchos comandos que de seguro olvidaré, por lo tanto setié alias, tanto en local como en remoto, de la siguiente forma. Sólo hay que agregar lo siguiente al archivo ~/.zshrc según corresponda:

alias jarvislab='conda activate kaggle && jupyter lab --no-browser --port=5678'

Dado que normalmente tengo un ambiente en el que trabajo y tengo jupyter, en este caso le llamé kaggle, cree el alias jarvislab el cual me permite activar mi ambiente anaconda correspondiente e inicializar Jupyter en J.A.R.V.I.S.

alias jarvis='ssh alfonso@192.168.0.59'

function ojlab {
  port=5678
  remote_username=alfonso
  remote_hostname=192.168.0.59
  url="http://localhost:$port" 
  echo "Opening $url"
  firefox --new-tab --url localhost:5678
  cmd="ssh -CNL localhost:"$port":localhost:"$port" $remote_username@$remote_hostname" 
  echo "Running '$cmd'"
  eval "$cmd"
}

En este caso setié jarvis para conectarme al servidor, y cree la función ojlab que me permite general el “tunneling” e inmediatamente abrir una pestaña nueva en firefox que inicia mi Jupyter Lab remoto. bun picture of me picture of me

VS Code en SSH

VS Code es bastante más sencillo. Si es que ya tenemos todo lo anterior configurado, sólo es necesario bajar la extensión Remote SSH, esto permite abrir una nueva sesión de VS Code desde J.A.R.V.I.S. Para ello presiono Ctrl+Shift+P y busco Remote-SSH: Connect to Host.... Ingresando el comando de la forma ssh usuario@host podremos establecer sesión en VS Code. El resultado debería mostrar algo así, obviamente utilizando la información de su conexión.

PENDIENTE

Finalmente cuando necesito apagar a J.A.R.V.I.S:

sudo poweroff

Todo esto funciona muy bien cuando estoy sentado al lado de mi Servidor ya que tengo que encenderlo. Pero, ¿qué pasa si estoy en otra parte y necesito ocupar a J.A.R.V.I.S y lo dejé apagado? Para eso existe el Wake-on-LAN. Lamentablemente no cuento con lo necesario para implementarlo aún por lo que quedará para un siguiente tutorial, así como permitir SSH desde fuera de mi red local.

Espero esto les sea útil para los que tengan Laptop y PC y apenas pueda probar WOL lo estaré compartiendo acá.

Nos vemos

Alfonso

Go to top