Пять с лишним лет тому назад в Интернет-магазине Seeed Studio я купил за 99 долларов только что выпущенную на рынок компанией NVIDIA плату Jetson Nano Developer Kit, главным образом, польстившись на цену. Записавшись на предложенный бесплатный ознакомительный курс по применению нейросетей, я узнал, как с их помощью распознавать жест “палец вверх / палец вниз”, -- и на этом остановился. А недавно я прочитал о том, что основанная на нейросети программа Leela Chess Zero способна играть на уровне, сопоставимом с Stockfish, которая считается лучшей шахматной программой [1].

Немного истории

Как известно, проблема программирования компьютера для игры в шахматы была сформулирована Клодом Шенноном [2]. В 1950 году Шеннон описал две различные архитектуры ПО для игры в шахматы, названные программами типа A и типа B. Программы типа A систематически исследуют структуру данных, называемую деревом игры. Их также называют программами «грубой силы», поскольку они полагаются исключительно на вычислительную мощность для исследования всех позиций в дереве игры до истечения отведенного времени. Программы типа B, напротив, более “интеллектуальны”, поскольку исследуют лишь часть возможных продолжений, выбирая их согласно некоторой эвристике и имитируя человеческую манеру игры.

В последующие десятилетия было проведено множество исследований по совершенствованию программ типа B, и в результате была построена машина, получившая название Deep Thought. Студенты, создавшие ее, были приглашены в 1989 году компанией IBM, и их проект был переименован в Deep Blue. В 1997 году Deep Blue выиграл у Гарри Каспарова, тогдашнего чемпиона мира по шахматам.

Спустя несколько лет лучшие шахматисты сыграли еще несколько матчей против шахматных программ, которые завершились в 2006 году, когда многоядерный компьютер общего назначения, работающий под управлением ПО Deep Fritz 10, выиграл матч у чемпиона мира Владимира Крамника. После этого состязаний между чемпионами мира и компьютерами больше не проводилось: слишком велика была разница в силе игры.

С тех пор рынке компьютерных шахмат доминируют программные решения, работающие на ПК общего назначения и реализующие алгоритмы, основанные на обходе дерева игры. Они становились все более мощными по мере разработки новых эвристик, улучшения масштабируемости поиска благодаря появлению многоядерных микропроцессоров.

Так было до 2017 г., когда программа AlphaZero, работающая на суперкомпьютере Google, научилась играть в шахматы “с нуля”, и, играя сама с собой, за несколько часов достигла уровня, настолько высокого, что смогла выиграть матч у Stockfish 8, мощной программы, основанной на дереве игры, работающей на оборудовании общего назначения. С этого момента тенденцией стал запуск шахматных программ на многоядерных процессорах, интегрируемых с графическими процессорами для ускорения работы нейронных сетей. В 2020 г. было анонсировано устройство с 384 ядрами NVIDIA CUDA и 48 ядрами Tensor, которое, как утверждалось, достигло производительности в 21 триллион операций в секунду (Trillions of Operations Per Second --TOPS). На нем было установлено программное обеспечение для шахмат Leela с открытым исходным кодом, «вдохновленным» проектом AlphaZero [3]. В блоге компании NVIDIA говорилось, что Эвелин Чжу, юная женщина-шахматист, использует плату NVIDIA Jetson Xavier NX для запуска шахматных движков на основе искусственного интеллекта на своём ноутбуке [4].

Младший в семействе

Платы Nano и Xavier, хотя и различаются по цене, как минимум, на порядок, все же относятся к одному семейству NVIDIA Jetson. Так почему бы не попробовать запустить шахматную нейросеть на Nano? Тем более, что это, похоже, кому-то уже удавалось [6].

Найти репозитарий Lc0 (Leela Chess Zero) не составило большого труда, несмотря на то, что сайт проекта lczero.org у меня почему-то не всегда открывается сразу. После нескольких неудачных попыток добиться того, чтобы актуальная (0.31) версия Lc0 распознавала GPU, я склонировал не последний, а 29-й релиз, и, как говориться, дело двинулось:

git clone -b release/0.29 --recurse-submodules https://github.com/LeelaChessZero/lc0.git

Все ПО NVIDIA Jetson Nano Developer Kit основано на ОС Ubuntu 18.04, для которой на Гитхабе у проекта LCZero.org есть исчерпывающая инструкция:

sudo apt-get install libstdc++-8-dev clang-6.0 ninja-build pkg-config
pip3 install meson --user
CC=clang-6.0 CXX=clang++-6.0 INSTALL_PREFIX=~/.local ./build.sh

Целевую директорию INSTALL_PREFIX=~/.local я указывать не стал, потому что meson вздумал спрашивать пароль, требуя вводить его очень-очень быстро. Таким образом у меня все осталось в папке build/release.

val@val-desktop:~/lc0/build/release$ ls -l
total 67088
…
-rwxrwxr-x 1 val val   314800 авг 11 10:20 hashcat_test
drwxrwxr-x 2 val val     4096 авг 11 10:11 hashcat_test.p
-rwxrwxr-x 1 val val 22397448 авг 11 10:19 lc0
drwxrwxr-x 4 val val     4096 авг 11 10:08 lc0.p
…

Запуск команды ./lc0 с флажком help прошел успешно.

val@val-desktop:~/lc0/build/release$ ./lc0 --help | more
       _
|   _ | |
|_ |_ |_| v0.29.0 built Aug 11 2025
Usage: ./lc0 [<mode>] [flags...]

Available modes. A help for a mode: ./lc0 <mode> --help
  uci        (default) Act as UCI engine
  selfplay   Play games with itself
  benchmark  Quick benchmark
  backendbench Quick benchmark of backend only
  leela2onnx Convert Leela network to ONNX.
  onnx2leela Convert ONNX network to Leela net.
  describenet Shows details about the Leela network.
…

А вот с выбором и запуском нейросети пришлось повозиться.

val@val-desktop:~/lc0/build/release$ ./lc0 benchmark
       _
|   _ | |
|_ |_ |_| v0.29.0 built Aug 11 2025
Found pb network file: ./t1-256x10-distilled-swa-2432500.pb
Creating backend [cudnn-auto]...
Switching to [cudnn-fp16]...
CUDA Runtime version: 10.0.0
Cudnn version: 7.6.3
Latest version of CUDA supported by the driver: 10.0.0
GPU: NVIDIA Tegra X1
GPU memory: 3.87144 GiB
GPU clock frequency: 921.6 MHz
GPU compute capability: 5.3
Segmentation fault (core dumped)     :(

В конце концов по адресу lczero.org/play/networks/legacy/ удалось отыскать сеть TK-6430 aka 128x10-BPR-64M-6430000.pb.gz, и все заработало!

val@val-desktop:~/lc0/build/release$ ./lc0 benchmark
       _
|   _ | |
|_ |_ |_| v0.29.0 built Aug  9 2025
Found pb network file: ./128x10-BPR-64M-6430000.pb
Creating backend [cudnn-auto]...
Switching to [cudnn-fp16]...
CUDA Runtime version: 10.0.0
Cudnn version: 7.6.3
Latest version of CUDA supported by the driver: 10.0.0
GPU: NVIDIA Tegra X1
GPU memory: 3.87144 GiB
GPU clock frequency: 921.6 MHz
GPU compute capability: 5.3

Position: 1/34 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
Benchmark time 204 ms, 2 nodes, 24 nps, move d2d4
Benchmark time 300 ms, 6 nodes, 33 nps, move d2d4
Benchmark time 379 ms, 14 nodes, 54 nps, move d2d4
Benchmark time 438 ms, 20 nodes, 63 nps, move d2d4
Benchmark time 509 ms, 37 nodes, 95 nps, move d2d4

Не дотягивает, конечно, до Quadro GP100, ну да ладно… А пусть сыграет сама с собой, поглядим, насколько нагреется!

val@val-desktop:~/lc0/build/release$ ./lc0 selfplay --movetime=1 # наугад!
       _
|   _ | |
|_ |_ |_| v0.29.0 built Aug  9 2025
id name Lc0 v0.29.0
id author The LCZero Authors.
Found pb network file: ./128x10-BPR-64M-6430000.pb
Creating backend [multiplexing]...
Creating backend [cudnn-auto]...
Switching to [cudnn-fp16]...
CUDA Runtime version: 10.0.0
Cudnn version: 7.6.3
Latest version of CUDA supported by the driver: 10.0.0
GPU: NVIDIA Tegra X1
GPU memory: 3.87144 GiB
GPU clock frequency: 921.6 MHz
GPU compute capability: 5.3
gameready gameid 3 play_start_ply 0 player1 black result blackwon moves c2c4 h7h6 g1f3 d7d6 d2d4 f7f5 f3e5 d6e5 h2h3 e5d4 d1d2 g8f6 d2d1 e7e5 c1g5 a7a5 d1c1 a8a7 c1d1 c8e6 g5e3 b8a6 h1h2 a6b4 e3c1 e6c4 b2b3 a7a6 b1a3 b7b6 e2e3 f6h5 d1h5 c4f7 h5f5 d4d3 f5d3 f8d6 d3d2 a6a7 a3b5 a7a8 b5d6 c7d6 a2a3 b4d5 e1d1 a8c8 d1e1 d5c3 d2d3 e8g8 h2h1 f7e6 c1d2 d8f6 h3h4 f6f2
tournamentstatus P1: +1 -0 =0 Win: 100.00% LOS: 84.13% P1-W: +0 -0 =0 P1-B: +1 -0 =0 npm 1.000000 nodes 58 moves 58
…

Пожалуй, еще сотня-другая игр и потребуется активное охлаждение.

Lc0 в графическом интерфейсе

Из списка рекомендуемых на сайте проекта Leela Chess Zero графических оболочек для платформы ARM годятся не все, к тому же хотелось бы подключаться к движку Lc0 удаленно. Выяснилось, что сделать это можно с помощью предложенного Эвелин Чжу фреймворка Jetson Engine [7]. Эта клиент-серверная платформа реализует удалённый доступ к UCI-совместимым шахматным движкам. В файле README дано исчерпывающее описание процесса компиляции серверного агента и клиентского движка.

Я поместил скомпилированный файл jetson_agent и файл конфигурации jetson_agent.conf в директорию /c0/build/release и затем заменил в конфигурационном файле строку

Lc0-cuda  53352  lc0.exe  --backend=cudnn-auto:--weights=256x20-t40-1541.pb.gz  

на строку

.	    53352  lc0 	--backend=cudnn-auto:--weights=128x10-BPR-64M-6430000.pb

и оставил остальные строки закомментированными. На этом подготовка Jetson Nano была завершена.

На клиентском ПК в папке uciengines в среде MSYS2 была выполнена компиляция утилиты, сканирующей удаленный хост на предмет выявления выполняющихся на нем шахматных движков.

g++ -o jetson_scan client.cc -lpthread

Запуск утилиты сканирования сперва ничего не дал.

~/JetsonEngine/uciengines$ ./jetson_scan scan 192.168.0.164
scanning server 192.168.0.164 on port 53350
Unhandled exception: connect() failed

Все верно, ведь агент на Jetson Nano еще не был запущен. Выполняем запуск.

~/lc0/build/release$ ./jetson_agent
MGMT waiting for connections...
Engine (.) waiting for connections...

И сканер его обнаружил!

~/JetsonEngine/uciengines$ ./jetson_scan scan 192.168.0.164
scanning server 192.168.0.164 on port 53350
JRE_XAVIER_192.168.0.164_53352_.
exec cmd is(cp /home/val/JetsonEngine/uciengines/jetson_scan /home/val/JetsonEngine/uciengines/JRE_XAVIER_192.168.0.164_53352_.; chmod a+x /home/val/JetsonEngine/uciengines/JRE_XAVIER_192.168.0.164_53352_.)
scanisdone

Упоминание XAVIER, видимо, связано с тем, что ПО у мисс Чжу создавалось под конкретное «железо». Мне лень было это менять, и я оставил все как есть.

val@val-desktop:~/JetsonEngine/uciengines$ ls -l
total 140
-rw-rw-r-- 1 val val 10913 авг 10 11:40 client.cc
-rw-rw-r-- 1 val val  1904 авг 11 20:29 JetsonErr_jetson_scan.log
-rw-rw-r-- 1 val val   259 авг 11 20:44 JetsonErr_JRE_XAVIER_192.168.0.164_53352_..log
-rwxrwxr-x 1 val val 39376 авг 11 20:26 jetson_scan
-rwxrwxr-x 1 val val 39376 авг 11 20:28 JRE_XAVIER_127.0.0.1_53352_.
-rwxrwxr-x 1 val val 39376 авг 11 20:29 JRE_XAVIER_192.168.0.164_53352_.

Сгенерированный файл JRE_XAVIER_192.168.0.164_53352_. и был, по всей видимости, тем самым локальным движком, запускающим удаленный и взаимодействующий с ним. Так и оказалось. На команду с ПК

~/JetsonEngine/uciengines$ ./JRE_XAVIER_192.168.0.164_53352_. 

Jetson Nano откликнулась запуском Lc0 в режиме UCI.

MGMT waiting for connections...
Engine (.) waiting for connections...
       _
|   _ | |
|_ |_ |_| v0.29.0 built Aug  9 2025

Все! Мне оставалось лишь установить GUI, подключить его к локальному движку Jetson Engine, и сделать первый ход!

Источники и ссылки на дополнительные материалы

  1. Ciancarini, P., Nakatsu, R., Rauterberg, M. (2024). Entertainment Computing: Past, Present, and Future. In: Vanderdonckt, J., Palanque, P., Winckler, M. (eds) Handbook of Human Computer Interaction. Springer, Cham. https://doi.org/10.1007/978-3-319-27648-9_34-1

  2. Shannon, C.E. (1988). Programming a Computer for Playing Chess. In: Levy, D. (eds) Computer Chess Compendium. Springer, New York, NY. https://doi.org/10.1007/978-1-4757-1968-0_1

  3. Use Jetson as a portable GPU device to run an NN chess engine model: https://medium.com/@ezchess/jetson-lc0-running-leela-chess-zero-on-nvidia-jetson-a-portable-gpu-device-a213afc9c018

  4. https://blogs.nvidia.com/blog/chess-master-evelyn-zhu/

  5. https://www.phoronix.com/news/LCZero-NVIDIA-Benchmarks

  6. https://github.com/leela-zero/leela-zero/issues/2356?ysclid=meg4q7x6ia148196696

  7. https://github.com/ezchess/JetsonEngine

  8. https://chessify.me/blog/leela-chess-zero-networks?ysclid=meg4jp46oi58660781

Комментарии (0)