Scacchierando.it
Vajolet

Intervista a Marco Belli

il programmatore di Vajolet2 entrato nella Top16 del TCEC: ‘il mio sogno? Organizzare un match contro un Maestro’

Se nel campo dello scacchismo l’Italia vede al momento i suoi migliori rappresentanti piuttosto lontani dalla top 100, dopo avere dovuto lo scorso anno rassegnarsi all’addio di Caruana, vi è un’area del gioco dei Re dove la situazione per i nostri colori è più rosea. Parliamo del mondo dei motori scacchistici, in cui i nostri rappresentanti hanno saputo farsi valere. Da un lato possiamo citare Marco Costalba, fondatore e coordinatore del progetto open-source Stockfish, uno dei due più forti motori al mondo. Dall’altro vi è un fiorente panorama di programmatori italiani abili e appassionati che, da soli o in piccoli team, di dedicano allo sviluppo dei “loro” motori.

Quest’anno, oltre a Stockfish, sono stati due gli engine italiani ad avere ricevuto l’invito al prestigioso torneo TCEC, che da alcuni anni ormai vede i migliori e i più promettenti software scacchistici affrontarsi per il titolo non ufficiale di migliore motore al mondo: il veterano Chiron di Ubaldo Andrea Farina e la new entry Vajolet2 di Marco Belli. Scacchierando ne ha intervistato gli autori, per conoscere la loro storia, le loro motivazioni e magari provare a “rubare” loro qualche trucco del mestiere.

MArco_Belli

Inizieremo pubblicando l’intervista a Marco Belli, il cui motore Vajolet2 si colloca al momento al 23º posto al mondo (secondo la classifica CCRL 40/40, una delle più autorevoli nel campo). Quest’anno Vajolet2 ha partecipato al TCEC, e nonstante si trattasse di un motore esordiente ha superato la prima fase piazzandosi infine in 16ª posizione.

Innanzitutto ti presenteresti ai nostri lettori?

Buongiorno a tutti i lettori di Scacchierando.it, mi chiamo Marco Belli, ho quasi 40 anni e vivo a Firenze.

Lavoro per una grande multinazionale dell’automazione ed elettronica di potenza e sviluppo firmware per microcontrollori da ormai dieci anni.

Le mie grandi passioni sono sempre state la montagna, le camminate e l’arrampicata.

Da cosa è nato il tuo interesse al campo dei motori scacchistici? C’è qualche software o personalità che ti ha ispirato? 

Non ricordo bene come è nata la passione per i motori scacchistici, amo programmare e nel poco tempo libero che mi resta a disposizione porto avanti i miei piccoli divertimenti.

Ho sempre provato simpatia per gli scacchi e alla fine grazie ad internet ha trovato la spinta per imparare a giocare e a iniziare a frequentare un circolo di scacchi, l’A.D. Firenze Scacchi.

Unendo queste 2 passioni, circa nel 2007, mi è venuta voglia di provare a scrivere qualche programma per gli scacchi e poi infine a sviluppare un intero motore scacchistico.

La tua prima creazione è stata il motore in C# Vajolet. Come mai hai scelto questo linguaggio e quali sono stati i tuoi primi passi? 

Quando iniziai a buttare giù due righe di codice per gestire una scacchiera stavo usando C# per lavoro e quindi mi venne naturale usare quel linguaggio e le sue librerie per fare i primi passi.

Il linguaggio C# offre una vasta libreria che permette di fare veramente di tutto senza doversi reinventare ogni volta la ruota. Avevo usato il C e il C++ all’università, ma a quei tempi fornivano in pratica solamente il linguaggio di programmazione con poche librerie già incluse e per di più i template del C++ non erano maturi e ti toglievano la voglia di programmare.

Quindi iniziai a programmare il mio primo motore scacchistico, Vajolet, in C#.

Vajolet

Il nome Vajolet merita una spiegazione, come già detto sono un amante della montagna e in Val di Fassa sul gruppo del Catinaccio esiste un gruppo di tre cime di nome Torri del Vajolet. Da qui il nome del mio engine che al torneo TCEC ha riscosso tanta curiosità. Molti supponevano fosse francese, ma in realtà è Ladino, una lingua retoromanza e dovrebbe significare Valle, Catino.

Quando ho iniziato a sviluppare il programma ho iniziato ad inserire tutte le idee e algoritmi che trovavo su internet. Ne è nato Vajolet C#, un programma rudimentale scritto senza capire molto degli algoritmi base e in cui ogni aggiunta faceva calare la forza del motore.

Nel 2011 Stef Luijten iniziò a pubblicare il suo blog “Writing a chess program in 99 steps”, seguendo il suo tutorial e studiando il suo codice ho finalmente capito… che fino a quel momento avevo capito veramente poco di algoritmi per motori scacchistici. Partendo dallo studio del suo codice e dopo molte modifiche e aggiunte Vajolet raggiunse la soglia dei 2650 punti Elo.

Vajolet2 è stato, a quanto dichiari, riscritto quasi da zero. Il passaggio a un’architettura completamente nuova è stato un passo previsto o una decisione sofferta? 

Quando decisi di riscrivere Vajolet2 da zero, mi trovavo in una situazione nella quale un bug importante, che non sono mai riuscito a trovare, mi impediva di migliorare le performance, inoltre molte delle decisioni prese tre anni prima si erano rivelate non propriamente azzeccate e rendevano difficile la gestione del codice multi processore.

Inoltre in quel periodo stava diventando popolare e aveva un ottimo appeal l’edizione del C++ aggiornata nel 2011, molte cose erano veramente migliorate rispetto alle mie prime disavventure con questo linguaggio.

Quindi un po’ per curiosità, un po’ per necessità, sono ripartito a riscrivere tutto imparando dagli errori del passato.

Quali sono a tuo parere i maggiori vantaggi del C++ “moderno” rispetto alle vecchie edizioni? E cosa eventualmente ti manca del C#? 

Il linguaggio C++ era fermo a livello di standardizzazione al 2003, le nuove features del C++11 rendono il linguaggio molto più moderno ed estendono le librerie standard e i template rendendo la programmazione molto piacevole. Un esempio è l’inclusione nello standard di una libreria per la gestione dei thread. Fino a quel momento ogni sistema operativo aveva bisogno di codice specifico per eseguire calcoli in parallelo su più core, invece adesso si possono scrivere programmi multithread portabili senza fare troppi sforzi.

Un notevole miglioramento delle performance del linguaggio è stato ottenuto con l’aggiunta dei move constructor che permettono di trasferire strutture e classi senza dover eseguire per forza una copia dei dati, un altra semplificazione arriva dai ranged loop e dai cicli foreach presi in prestito da linguaggi più giovani come il C#.

In generale C++ e C# hanno obiettivi diversi. Il C++ è stato fin dalla nascita pensato per lo sviluppo di sistemi operativi, driver e programmi che hanno bisogno di performance. Il C#, secondo me, aveva e ha come concorrente il linguaggio Java; è più lento, ma permette di fare molte operazioni che il C++ non permette.

La crescita di Vajolet2 è stata davvero rapidissima. Ti ha sorpreso questo successo? Cosa hai provato quando hai ricevuto da Thoresen l’invito al TCEC? 

Vajolet è un progetto che ormai si avvicina ai dieci anni di età, è stato riscritto nel 2013, ma poggia sulle basi del vecchio Vajolet che già aveva raggiunto buoni risultati, quindi credo che la crescita si possa definire lenta ma costante. Negli ultimi tre anni ha guadagnato circa 300 punti elo, ma fin quando non ha iniziato a fare capolino nell’alta classifica nessuno, a parte gli addetti ai lavori, se ne era accorto. Il successo nel mondo degli sviluppatori di motori scacchistici è difficile da raggiungere, la stragrande maggioranza degli utenti conosce i pochi engine al top e considera tutti gli altri motori cosa di poco conto.

Ricordo ancora quando anni fa al mio circolo tutti usavano Rybka, Houdini, Fritz e nessuno sembrava conoscere Stockfish che era già al livello dei concorrenti, se non superiore, ed era utilizzabile senza infrangere nessuna legge. Molti scacchisti non conoscono il mondo dei motori di scacchi e vedono solo quello che Chessbase propone loro anche se a volte non è né il motore più forte né l’alternativa più economica. Detto questo Chessbase propone degli ottimi software con delle interfacce grafiche e dei database veramente interessanti.

Tornando al tema della domanda, mi ha fatto molto piacere essere invitato a partecipare al TCEC. Era da un po’ di anni che lo seguivo e invidiavo gli sviluppatori che potevano parteciparvi, quindi l’invito è stata cosa graditissima e mi ha reso orgoglioso e impaurito.

Impaurito sopratutto perché io sviluppo e testo il mio programma su un portatile facendolo girare con al massimo 2 thread e 2 GB di RAM e per la prima volta Vajolet sarebbe stato testato su un PC con ben 20 thread e 16 GB di RAM. La mia speranza era quella che Vajolet non andasse in crash e non perdesse partite per problemi tecnici.

Alla fine di questa avventura sono abbastanza felice dei risultati ottenuti, Vajolet non ha avuto problemi, è riuscito a fare delle ottime partite come la patta contro Stockfish al primo turno (http://tcec.chessdom.com/archive.php?se=9&st=1b&ga=3). Più di così non potevo sperare. C’è ancora molta strada da fare prima di poter sperare di competere ad armi pari con i motori che stanno giocando adesso il 3° turno del TCEC.

Ringrazio ancora Graham Banks che è stato il primo a coinvolgermi per il TCEC. Non so se è stato lui a proporre Vajolet per il torneo, ma la sua dedizione al mondo dei motori scacchistici è davvero lodevole.

Quanto tempo dedichi in media allo sviluppo di Vajolet? Dal punto di vista della motivazione conta più per te l’aspetto “creativo” della programmazione o quello agonistico del misurarsi contro le creazioni dei concorrenti? 

Programmo in parte per piacere e in parte anche perché è bello vedere la propria creazione rincorrere e talvolta superare motori più forti.

Più o meno dedico alla programmazione meno di mezz’ora al giorno. Per il resto, il PC di casa è impegnato tutto il giorno in tornei per verificare se le nuove idee implementate stanno dando dei frutti o no. Sfortunatamente, a questi livelli di gioco, se uno è fortunato riesce a fare una modifica che dà al motore 5 punti Elo in più e per verificarla è necessario fare dei tornei molto lunghi. Fino a qualche tempo fa facevo eseguire tornei di diecimila partite per verificare i miglioramenti. Insomma, poca programmazione e molto molto tempo dedicato ai test.

Come organizzi lo sviluppo del motore? Hai un’agenda o valuti gli aspetti da migliorare a seconda dei risultati? E quali sono le principali aree (calibrazione dei parametri, parallelizzazione, libro di aperture…) su cui ti concentri? 

In teoria avrei un’agenda, ma devo constatare che lo sviluppo, specialmente in questo momento, è molto caotico e dipende da cosa ho voglia di fare di volta in volta. Avevo messo in cantiere una specie di ricerca Monte Carlo, che sta dando buoni risultati con il gioco del Go, ma non ho ottenuto grossi risultati.

Ho in mente due grossi progetti che però rimando ormai da molti mesi.

Il primo è rivedere la funzione di valutazione della posizione in quanto sono convinto che sia molto migliorabile, la seconda idea è quella di cercare di sfruttare le informazioni delle ricerche precedenti per decidere una strategia migliore alla mossa attuale.

Tutti i motori che conosco e che ho studiato, quando viene mostrata una nuova posizione e iniziano la ricerca della mossa migliore lo fanno come se la partita iniziasse in quel momento e quello che è successo nelle mosse precedenti non avesse importanza. Al contrario un giocatore di scacchi gestisce una partita nella sua interezza, sa in base a cosa ha giocato se quello è il momento di allocare meno tempo alla mossa in quanto è la logica continuazione delle mosse precedenti, sa se la mossa che ha fatto l’avversario era aspettata o no e così via. Ad oggi non ho la più pallida idea di come poter implementare qualcosa del genere, ma ritengo che la gestione di una partita sia un’area poco sviluppata dei motori e dalla quale forse si potrebbero ricavare un po’ di punti.

Pratichi anche gli scacchi “umani”? A tuo parere l’abilità a tavolino può aiutare in modo significativo a rafforzare un motore o le competenze informatiche e matematiche sono predominanti? 

In questo momento non sto praticando molto gli scacchi, spero in futuro di ritrovare voglia e tempo per giocare. Non sono mai stato un forte giocatore e sono arrivato a conseguire la terza categoria nazionale. Credo che questo in parte mi limiti nello sviluppare Vajolet in quanto a volte non capisco assolutamente cosa sta tentando di fare o dove stia sbagliando. Probabilmente giocatori un po’ più forti di me avrebbero più facilità nell’accorgersi di errori strategici che io non riesco a comprendere.

Per il resto credo che fino a livelli anche abbastanza alti sia molto più importante saper programmare e scrivere un codice pulito, semplice e sopratutto senza errori. Ne è un esempio il francese Fabien Letouzey, già autore di Fruit, che con la sua ultima creazione Senpai ha mostrato che un motore con poche raffinatezze, ma scritto bene può raggiungere i 3000 punti Elo. Alla fine gli elementi della posizione di cui tenere conto a livello di valutazioni non sono troppo complessi, è la ricerca molto profonda a scartare le linee perdenti. Le idee da implementare sono abbastanza semplici come per esempio il fatto che un re al centro della scacchiera in apertura è una debolezza o che una torre su una colonna aperta è una cosa buona; sono concetti che pure una 3N come me può comprendere.

Prima del TCEC hai partecipato con i tuoi motori ad altri tornei? A quali competizioni vorresti prendere parte in futuro? E che obiettivi ti poni riguardo ai progressi di Vajolet2? 

Vajolet partecipa da tempo ai tornei online organizzati dal gruppo del CCRL (Computer Chess Rating Lists), CEGT (Chess Engines Grand Tournament), FCP (Frank’s Chess Page). Fino ad adesso non ho avuto la possibilità di partecipare con Vajolet a tornei per engine che richiedano la presenza dal vivo, ma credo che sarebbe veramente una esperienza interessantissima.

Non ho obiettivi particolari per Vajolet; come tutti via via che il tempo passa provo ad alzare l’asticella, per adesso il prossimo obiettivo è quello di raggiunere i 3100 punti nel ranking CCRL, che dovrebbe significare la 20° posizione nella loro classifica. Ma quel traguardo è ancora molto lontano.

Un sogno che mi rimane, e chissà se Scacchierando potrà aiutarmi a realizzare, è quello di poter organizzare un match fra Vajolet e un giocatore di buon livello. Non sono mai riuscito a creare una situazione del genere, ma se qualche Maestro fosse interessato e incuriosito dalla sfida, io qualunque fosse il risultato sarei molto contento. Questo per me sarebbe veramente un bellissimo traguardo.

Per finire, che consigli daresti a chi si avvicinasse ora al mondo della programmazione di motori? 

Innanzitutto il consiglio è quello di studiare a fondo gli algoritmi che stanno alla base, min-max, PVS e anche i motori open source che sono un ottimo riferimento sullo stato dell’arte; poi iniziare a implementare cose semplici e fatte bene. La velocità può sembrare importante, ma è molto più importante che il codice non abbia errori, in questo modo si crea un ottimo motore che ha un livello di gioco molto forte.

Il linguaggio non è molto importante, almeno se non si punta a competere con dei mostri come Stockfish o Komodo, quindi il mio consiglio è quello di usare un linguaggio con i quale si è a proprio agio.

Vorrei infine ringraziarvi per lo spazio che avete dedicato a me e a Vajolet, sperando che qualche maestro resti incuriosito dal mio motore e decida di accettare la mia sfida.

Grazie a te per la disponibilità e in bocca al lupo per il futuro!

12 Commenti a “Intervista a Marco Belli”

  1. IrishGambit
    9 agosto 2016 - 22:57

    Devo effettivamente ridimensionare la mia stima sull’handicap richiesto. Mi pareva di ricordare che nel recente match Komodo – Movsesian il silicio fosse riuscito a pattare con un pezzo di svantaggio, ma riguardando le partite ho scoperto che era stata concessa solo una qualità. Qui le partite, e una tabella alternativa sul rapporto handicap – Elo: https://en.chessbase.com/post/komodo-9-odds-matches-against-gms.

    Interessante poi la sfida dello stesso Komodo contro l’FM John Mayer: il motore giocò tutte le partite col Bianco e ottenne 3½ su 4 concedendo un Cavallo contro un pedone, ma solo 1 su 4 col pezzo secco di svantaggio.

    Complessivamente i risultati confermano la stima di ste: un pezzo leggero basta e avanza per equilibrare la sfida.

Lascia un commento

Devi essere loggato per lasciare un commento. Clicca per Registrati.