Языковые нейросетевые модели как только не тестировали: от решения олимпиадных задач до создания шедевров мировой литературы. У нас же родилась идея протестировать их на более прикладном уровне. А именно, сможет ли нейросеть играть по правилам в настольную игру, которая сложнее, чем крестики-нолики, и заодно посмотреть, как поведет себя в работе с LLM связка из четырех видеокарт Radeon RX 7900 XTX с 24 гигабайтами видеопамяти.
Немного о железе
У нас в HOSTKEY есть GPU серверы на основе решений от NVIDIA на любой вкус: от VPS на 1080 до выделенных серверов с H100 или нескольких RTX 4090. Но вот в части GPU решений от AMD у нас не было и мы решили посмотреть, как поведут себя в инференсе данные видеокарты и получится ли сэкономить, используя их для работы с языковыми моделями (особенно когда нужен большой объем видеопамяти). Первоначальный вопрос был даже не в скорости работы, а принципиально в их работоспособности, особенно в multi GPU конфигурациях.
В итоге для тестирования у нас получилась вот такая конфигурация: процессор 24-ядерный AMD EPYC 7402P, 256 Гб ОЗУ, 2 Тб NVME диск и 4 видеокарты Radeon RX 7900 XTX, которые по мощности считают аналогом RTX 4080 SUPER. В качестве системы используем Ubuntu 22.04 с ядром, обновленным до версии 6.8.0. Почему не дефолтное ядро LTS 5.15? Мы пробовали вначале не обновлять ядро, но прирост производительности с шестой версией ядра составлял 10–15%, что достаточно существенно.
Скидки до 47% на выделенные серверы с процессорами AMD EPYC с большим количеством ядер для выполнения самых сложных задач. Закажи свой серевер прямо сейчас.
За последнее время качество стека для работы с видеопроцессорами от AMD возросло, и поставить ROCm, конечно, еще не так просто, как установить CUDA, но уже полегче. Достаточно следовать подробной инструкции (а точнее ее первой и второй частям). Последняя версия ROCm на момент написания статьи — это 6.3.1.
Проверяем командой rocminfo, что у нас видятся все 4 видеокарты. В выводе будет пять агентов, первый — это наш центральный процессор, а со второго по пятый — видеоадаптеры.
Затем ставим на сервер Ollama и OpenWebUI. Кто-то может возразить, что это не «тру» вариант. Да, можно было всё протестировать через тот же vLLM (но тут вылезет проблема с тем, что ROCm до сих пор не поддерживает fp8 модели на Radeon видеокартах, только на Mi300x), но нам здесь было главное — удобство работы с промтами и выводом.
А далее всё обычно: ставим нужные нам модели из библиотеки Ollama. Не скрою, было желание поставить даже deepseek-v3, но он даже с квантизацией q4, которая по дефолту в Ollama, не влез бы в наши 96 гигабайт суммарной видеопамяти. Для проверки мы поставили следующие открытые модели:
Gemma 2 27B размером в 20 GB (это самая маленькая модель из тестируемых cредних);
T-Pro 1.0 от Т-банка размером 45 GB на 32.8 миллиарда параметров. Это будет единственная российская модель, так как модели от Сбера пока еще в Ollama не поддерживаются. Сборка неофициальная от пользователя с ником fomenks;
Llama 3.3 на 70.6 миллиардов параметров, которая как утверждается, сравнима с Llama 3.1 405B. В ней официально не заявлена поддержка русского языка. Это самая большая модель, занимающая 54 Гб видеопамяти.
Размер входного контекста выставлен на значение 8K, на выходе мы получаем в районе 2K токенов (стандарт для открытых моделей).
Вне конкурса со стороны больших моделей за всех будет отдуваться GigaChat MAX от Сбера, доступный через веб-интерфейс, а из моделей небольшого размера попробуем Gemma 2 9B.
Далее небольшой тест работоспособности каждой модели. Изначально заработали только LLM, которая «вместились» полностью в видеопамять одной видеокарты (это были Gemma 2 9B и 27B), а вот Llama 3.3 и T-Pro не захотели функциклировать и выдавали только непрерывные последовательности из букв «G». Что указывало на проблемы с распараллеливанием моделей на несколько видеокарт.
Еще пара часов поисков в интернете привели к решению: нужно было добавить при загрузке ядра определенные параметры, связанные с IOMMU. Поэтому добавляем в /etc/default/grub нужные параметры для процессора от AMD:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt iommu.strict=1 iommu.passthrough=1 amdgpu.vm_update_mode=3"
А затем перегенерируем GRUB командой sudo update-grub. После перезагрузки сервера заработали и остальные модели.
А что за настольная игра?
У автора данного текста есть настольная игра, которая обучает детей основам программирования и робототехники «Битва Големов». И в ней есть боты, которые позволяют как играть в соло-режиме, так и доставлять проблемы игрокам в дуэльном режиме или когда их три человека. И изначально боты в ней «ходят» по специальной программе, которая задается картой команд и броском кубика.
Перемещение ботов выполняется до ходов игроков. Сами боты могут реагировать на препятствия, в том числе «видеть» роботов других игроков, и у них всего шесть команд: вперед, назад, повороты влево и вправо, защита и атака.
ВИгровое поле в самом простом варианте представляет собой сетку 4x4, на которой могут располагаться препятствия: камни, вода, бочки, порталы и т. п. Для первого приближения можно взять только камни: они не сдвигаются, не разрушаются, их нельзя пройти, но они не наносят никаких повреждений роботам.
Задаем промт
С нейросетевыми моделями действует правило: как спросишь, такой ответ и получишь. Так как мы работаем с текстовыми моделями, то определяемся, как мы будем располагать наше игровое поле и нумеровать клетки на нем.
Промт возьмем следующий. Он на русском языке, так как и ответы мы хотим также получить на русском.
Текст промта для модели после нескольких итераций и проб.
Ты играешь Роботом, который может перемещаться по полю 4x4. Ты понимаешь следующие команды: Вперед - перемещаешься на клетку вперед. Назад - перемещаешься на клетку назад, Влево - поворот влево на 90 градусов на месте, Вправо - поворот вправо на 90 градусов на месте. Атака - удар с силой 1 на одну клетку перед собой и Защита от удара. За один раунд ты можешь выполнить только две команды подряд. Ты можешь видеть на две клетки перед собой. Используй эту информацию для своего хода.
Поле размечено буквами A, B, C и D по горизонтали и 1,2,3 и 4 по вертикали начиная с левого верхнего угла.
Выходить за пределы поля нельзя. На поле могут быть еще препятствия: Камни. Камни не сдвигаются, не разрушаются и через них нельзя пройти вперед.
В игре 8 раундов.
Ты ведешь диалог с другими игроками от лица робота:
== Начало игры
1. Спроси "На какой клетке я стою?". Не переходи к новому вопросу, пока не получишь ответ!
2. Cпроси, "В сторону какой клетки я смотрю?". Не переходи к новому вопросу, пока не получишь ответ!. Если ты на краю поля, то будет пустое значение.
3. Спроси, "На каких клетках стоят Камни, перечислите их через запятую?". Не переходи к новому вопросу, пока не получишь ответ!. Не спрашивай больше, пока не начнется новая игра.== Игра
1. Выведи номер раунда. Если число раундов больше 8, напиши "Игра закончена"
2. Выведи в чате клетку, где ты стоишь и спроси, "Верная ли это клетка?". Если "нет", попроси ввести верное значение. Не переходи к новому вопросу, пока не получишь ответ!
3. Далее задай вопрос "Видит ли мой робот других роботов?". Жди ответа "Да" или "Нет". Используй эту информацию о том, видишь ли ты кого-то перед собой для принятия решения по ходу. Не переходи к новому вопросу, пока не получишь ответ!
4. Сделай свой ход из двух команд и напиши эти команды в Чат как "Мои команды: ..."
5. Напиши в какую клетку ты переместился по итогу
6. После своего хода, жди команды "Дальше" или "Далее", чтобы начать новый раунд и перейди к началу "==Игра" или "Начать", чтобы начать игру с начала и перейти к "==Начало игры".
Тестируем
Бот у нас будет синего цвета, наш робот — красного. Начальные условия: бот стоит на клетке A1 и смотрит на клетку A2. Камни располагаются на клетках B3 и D2. Проверять будем, задавая начальный промт модели и отслеживая перемещения нашего бота.
Забегая вперед по производительности: RX 7900 XTX может работать при работе с текстовыми моделями в зависимости от их размера иногда до 35% медленней, чем RTX 4090, но при этом с некоторыми моделями дает часто сравнимый результат по скорости. В среднем GPU от AMD медленней процентов на 20, но это окупается итоговой ценой, особенно в multi-GPU конфигурациях на 3-4 карты.
Gemma 2 9B
Скорость отклика порядка 50 токенов в секунду, и первый раунд модель показала себя неплохо. Правильно спросила все начальные параметры и выдала две команды для перемещения, переместившись на клетку A2. Единственный вывод, что модель переходит постоянно на английский язык, даже если ей в промте говорить отвечать только на русском и команду «Вперед» почему то заменила на «Move A2».
Мы своего робота переместили в итоге командами «Поворот Влево» -> «Поворот Влево» -> «Вперед» -> «Поворот Вправо» на клетку A4, и он у нас смотрит на клетку A3. Вводим «Дальше» и запускаем новый раунд. Бот осторожничает и во втором раунде перемещается вперед на клетку А3, где мы его успешно уничтожаем (напоминаю, что исполнение алгоритмов игроков идет после бота).
Gemma 2 27B
Здесь модель побольше и поэтому скорость ответа поменьше — в среднем порядка 28 токенов в секунду. Ответы идут на русском языке, и программа разнообразней, но вот правила работы модель отрабатывает по своему, не создавая диалог, в запрашивая сразу несколько параметров и также отвечая. После команд «Вперед» -> «Атака" бот остановился на клетке A2.
Своего робота перемещаем также на клетку A4 лицом к A3 и запускаем второй раунд. Корректируем клетку бота, говоря ему, чт он на клетке A2 и смотрит за край поля. Его команды: «Вправо» -> «Вперед» (то есть он поворачивается по итогу лицом к клетке A1), и мы его уничтожаем нашим роботом. Бот же считал, что он перешел на клетку B2, то есть перепутал право и лево.
T-Pro 1.0
Бот выдал команды «Вперед» и «Вправо», перепутав также правую и левую сторону, утверждая, что он смотрит на клетку B2. Скорость работы при этом в районе 22 токенов в секунду на выдачу, но модель работает уже на двух видеокартах.
Своим роботом ходим также и перемещаемся на A4. Здесь вылазит несовершенство промта или его понимания и пропуск логики. ИИ не дает поправить информацию о расположении робота и наличие других игроков в прямой видимости, а сразу дает команды «Вперед» и «Защита», утверждая, что он встал на клетку А3 и защищается от игрока (поднял щит). А на деле бот остался на клетке A2, но в защитной позе. Если бы у нас было оружие с одной единицы атаки, то мы его бы не смогли победить. Но у нас две единицы.
Так как поправить положение бота мы не можем, дальнейшие его ходы уже сильно расходятся с его фактическим расположением и хуже, чем ходы по программе и броске кубика. Единственное, что непредсказуемы и привносят веселый хаос в игру.
Llama 3.3 70B
Эта модель корректно отрабатывает диалоги и дает своему боту команды «Вперед» и «Вправо» (почему-то тянет их в эту сторону), верно определяя клетку A2. Скорость работы ее порядка 10 токенов в секунду, но и модель задействует уже три видеокарты.
Мы также повторяем наш ход. Клетка А3, смотрим на A4. Второй раунд: «Вперед», «Влево», и ИИ считает, что бот переместился на клетку А3. На деле он не смог выйти за пределы поля и остался на клетке А2, но смотрит вниз на клетку A3. Ради интереса подойдем к нему вплотную на клетку A3.
Раунд 3. ИИ воспринял корректировку своего положения (ему было сказано, где он стоит и куда смотрит), но в промте нашелся другой изъян: мы забыли написать, что перемещаться на клетку, занятую другим роботом, нельзя. Поэтому команды «Защита» и «Вперед» только поднимают щит и защищают бота, но он неверно интерпретирует перемещение на клетку, занятую нашим роботом. Также тут есть проблемы с пониманием поворота робота на месте.
Giga Chat (похоже Max)
Вне конкурса захотелось сравнить с какой-нибудь моделью побольше. В качестве тяжеловеса будет выступать GigaChat Max от «Сбера», который мы тестируем через веб-интерфейс. Он корректно отрабатывает пошаговый режим и выдает по итогу команды «Вперед» и «Вперед».
Мы же двигаемся также на клетку A4, благо бот теперь стоит на клетке A3 лицом к нам (и пишет об этом дальше). Второй раунд: так как мы указали, что стоим перед ним, то следует ожидаемые две команды: атака и защита. Ударив бота и убрав у него щит, пятимся назад на клетку C4, смотря на клетку B4. Третий раунд, и ИИ запутался в пространстве.
А что в итоге?
Какие выводы можно сделать из нашего эксперимента?
Видеокарты AMD Radeon 7000 серии (особенно старшие модели) вполне себе подходят для инференса языковых (и не только) моделей. FP16 и квантизованные идут «на ура», но вот с FP8 они отказываются работать, но это больше сказывается на генерации графики и vision-моделях, работающих на распознавание на центральном процессоре. А если модель требует большой объем видеопамяти, то связка из нескольких видеокарт от AMD будет в части стоимости в пересчете на токен, чем решение от Nvidia, а скорость инференса будет достаточной, чтобы он визуально «не тормозил».
Российские большие модели ожидаемо лучше работают с русским языком, они интересней как соперники, но тоже не без изъянов. И нужно посмотреть в сторону того же Deep Seek.
Ошибки в командах Боту от ИИ показывают, что промт требует доработки и скорее всего нужно его делать разным под каждое семейство моделей. Например, перенести начала координат в левый нижний угол, что вероятно решит проблему, когда модели путают право и лево. Или прописать правила поворота более доходчиво. Простор для творчества остается, как и добавление других частей из правил настольной игры.
ROCm сильно эволюционировал, так как еще год назад такое качество работы нельзя было представить, а с осени начиная с версии 6.2 туда еще и поддержку более профессиональных вещей завезли, типа vLMM.
Даже такой «не совсем умный» ИИ-бот для детей будет интересней, чем карточка программы + кубик. Да, карта программы — это дополнительный обучающий момент по чтению и исполнению алгоритма, но соперник, которого нельзя просчитать, гораздо веселей, и здесь можно запрограммировать не только бота, но и виртуального игрока. ИИ в настольных играх может быть не просто предзаданным набором команд и условий. Автоматы. И значит можно через API создавать игровых помощников от чат-ботов до мобильных приложений.
Как вы считаете, сможет ли AMD обойти NVIDIA на поприще ИИ-вычислений и стоит ли «заморачиваться» внедрением продвинутого ИИ в настольные игры?
Скидки до 47% на выделенные серверы с процессорами AMD EPYC с большим количеством ядер для выполнения самых сложных задач. Закажи свой серевер прямо сейчас.
fermentum
Возможно, исходная модель Qwen 2.5 могла показать себя лучше, чем построенная на ней T-pro. В своей практике я отказался от Т-про в пользу чистого Квена.
Системный промпт можно попробовать переформулировать, например, в DeepSeek, чтобы сделать его яснее и однозначнее для LLM.
Размер контекстного окна и фокус внимания в подобной игре имеет немалое значение, модели вроде Геммы-2 просто могут забывать, что они делали ранее, можно попробовать фиксировать в ответе модели историю состояний.
akdengi Автор
Русский язык нужен. У исходной Qwen с ним похуже, а в планах сделать для детей методику на основе игры, но вместо карт чтобы агентов промтами задавали на основе моделей и они команды генерили. Контекста тут 2K хватает даже, state простейший, 8K токенов я с запасом дал.
Промт проверял в Deep Seek r1, по размышлениям там верно воспринимается. Если посмотреть он уже чуть "машинно поправлен", чтобы пошагово работал.