Jugando a Go con Leela Zero

per Victor Carceler darrera modificació 2021-05-13T12:54:36+02:00

FloorGoban.JPGA mi amigo Rubén le gusta jugar a go y parece que no es el único aficionado pues hay mucho interés en el desarrollo de IAs fuertes en este juego. Recordemos que ya en 1996 Deep Blue derrotó a la humanidad jugando al ajedrez, bueno derrotó al campeón humano del momento —Gary Kaspárov—, porque derrotar al común de los mortales es mucho más sencillo. Y desde entonces la progresión técnica ha hecho que las máquinas sean invencibles en este juego.

Sin embargo el go plantea un problema más complejo que el ajedrez y para encontrar un duelo semejante entre máquina y campeón humano hay que avanzar hasta 2016, año en el que se enfrentaron AlphaGo y Lee Sedol. AlphaGo es una IA desarrollada por Google utilizando ingentes recursos que posteriormente dió lugar a AlphaGo Zero, una IA que se entrenó jugando contra sí misma sin intervención humana.

Un año después Gian-Carlo Pascutto programó Leela Zero, una IA inspirada en el artículo "Mastering the Game of Go without Human Knowledge" sobre AlphaGo Zero. Afortunadamente Leela Zero es software libre bajo la GPLv3.

Realmente para obtener una IA fuerte hacen falta unos recursos extraordinarios al alcance de muy pocos. El propio Gian-Carlo estima que recalcular los pesos de la red neuronal de AlphaGo Zero utilizando un ordenador común llevaría unos 1700 años. Sin embargo no hay inconveniente en descargar los pesos precalculados por otros y utilizarlos en nuestra máquina ejecutando Leela Zero.

Por ejemplo, el fichero con los pesos de la mejor red conocida se puede descargar de: https://zero.sjeng.org/best-network

Naturalmente para conseguir el mejor rendimiento en la ejecución del programa aún será necesario contar con hardware específico como:

Todo en grandes cantidades, del último modelo y consumiendo mucha energía. Así que esos recursos no están al alcance de cualquiera.

No tengo nada de todo eso. ¿Puedo jugar a go con Leela Zero?

Sí. No rendirá igual que la configuración que pueda obtener un bolsillo pudiente pero no nos vamos a quedar sin jugar contra la IA. Y seamos sinceros, en mi caso poca potencia va a ser necesaria para que me derrote :-)

Los elementos necesarios van a ser:

Lizzie-LeelaZero.gif

Construcción de Leela Zero

Descargar el código de Leela Zero desde GitHub y construir la aplicación en Ubuntu 20.04 no tiene ningún secreto en parte porque los mismos programadores tienen muy bien documentado el proceso.

Utilizando una MV con Ubuntu 20.04 se pueden seguir estos pasos:

  1. Instalar el servidor openssh-server para poder conectar con la MV con ssh -X usuario@<dirección ip> y trabajar con comodidad.
    # apt install openssh-server
  2. Se puede instalar clinfo y comprobar la compatibilidad con OpenCL:
    usuario@neva:~$ sudo apt install clinfo && clinfo
  3. A partir de aquí se puede instalar git y también las herramientas necesarias para compilar Leela Zero:
    usuario@neva:~$ sudo apt install git
    usuario@neva:~$ sudo apt install cmake g++ libboost-dev libboost-program-options-dev libboost-filesystem-dev opencl-headers ocl-icd-libopencl1 ocl-icd-opencl-dev zlib1g-dev
  4. Finalmente se puede clonar el repositorio de Leela Zero y realizar su construcción:
    git clone https://github.com/leela-zero/leela-zero
    cd leela-zero
    git submodule update --init --recursive
    mkdir build && cd build
    cmake ..
    cmake --build .
  5. Si todo ha ido bien en el directorio ~/leela-zero/build nos encontraremos el ejecutable:
    usuario@neva:~/leela-zero/build$ ll -lh leelaz 
    -rwxrwxr-x 1 usuario usuario 27M may  9 19:55 leelaz*
    usuario@neva:~/leela-zero/build$ 
    
    
  6. Cuando se intenta ejecutar la aplicación esta nos indica que es necesario descargar los pesos (que se pueden descargar desde https://zero.sjeng.org/best-network) y colocarlos en /home/usuario/.local/share/leela-zero/best-network:
    usuario@neva:~/leela-zero/build$ ./leelaz 
    A network weights file is required to use the program.
    By default, Leela Zero looks for it in /home/usuario/.local/share/leela-zero/best-network.
    usuario@neva:~/leela-zero/build$

Si estamos utilizando una MV o un ordenador que no cuenta con ninguna de las maravillas hardware que ayudan a mejorar el rendimiento será preciso ejecutar el programa con el parámetro --cpu-only para que no se intente utilizar ningún dispositivo OpenCL.

usuario@neva:~/leela-zero/build$ ./leelaz --cpu-only
Using 2 thread(s).
RNG seed: 16033350304236210078
Leela Zero 0.17  Copyright (C) 2017-2019  Gian-Carlo Pascutto and contributors
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; see the COPYING file for details.

BLAS Core: built-in Eigen 3.3.7 library.
Detecting residual layers...v1...256 channels...40 blocks.
Initializing CPU-only evaluation.
Setting max tree size to 3736 MiB and cache size to 415 MiB.

Passes: 0            Black (X) Prisoners: 0
Black (X) to move    White (O) Prisoners: 0

   a b c d e f g h j k l m n o p q r s t 
19 . . . . . . . . . . . . . . . . . . . 19
18 . . . . . . . . . . . . . . . . . . . 18
17 . . . . . . . . . . . . . . . . . . . 17
16 . . . + . . . . . + . . . . . + . . . 16
15 . . . . . . . . . . . . . . . . . . . 15
14 . . . . . . . . . . . . . . . . . . . 14
13 . . . . . . . . . . . . . . . . . . . 13
12 . . . . . . . . . . . . . . . . . . . 12
11 . . . . . . . . . . . . . . . . . . . 11
10 . . . + . . . . . + . . . . . + . . . 10
 9 . . . . . . . . . . . . . . . . . . .  9
 8 . . . . . . . . . . . . . . . . . . .  8
 7 . . . . . . . . . . . . . . . . . . .  7
 6 . . . . . . . . . . . . . . . . . . .  6
 5 . . . . . . . . . . . . . . . . . . .  5
 4 . . . + . . . . . + . . . . . + . . .  4
 3 . . . . . . . . . . . . . . . . . . .  3
 2 . . . . . . . . . . . . . . . . . . .  2
 1 . . . . . . . . . . . . . . . . . . .  1
   a b c d e f g h j k l m n o p q r s t 

Hash: 9A930BE1616C538E Ko-Hash: A14C933E7669946D

Black time: 01:00:00
White time: 01:00:00

Leela: 

Pero Leela Zero no está pensado para utilizarse desde la consola, está pensado para utilizarse con una interfaz gráfica como puede ser Lizzie.

Instalación y configuración de Lizzie

Lizzie —https://github.com/featurecat/lizzie— es una interfaz gráfica para Leela Zero. También es software libre cubierto por la licencia GNU GPLv3 y está programado en Java.

Los pasos para instalarlo y configurarlo son:

  1. Instalar un JRE:
    usuario@neva:~$ sudo apt install default-jre
  2. Descargar Lizzie y desarchivarlo:
    usuario@neva:~$ wget https://github.com/featurecat/lizzie/releases/download/0.7.4/Lizzie.0.7.4.Mac-Linux.zip
    usuario@neva:~$ unzip Lizzie.0.7.4.Mac-Linux.zip
  3. Ejecutarlo:
    usuario@neva:~$ java -jar Lizzie/lizzie.jar
  4. En la primera ejecución nos mostrará un error indicando que no ha encontrado el ejecutable de Leela Zero y nos mostrará una ventana en la que podremos indicar la orden para lanzar Leela Zero. En nuestro caso tendremos que indicar /home/usuario/leela-zero/build/leelaz --cpu-only --gtp --lagbuffer 0 tal y como se muestra en la siguiente captura:

lizzie-leela-zero.png