Собрал телеграм-бота с нейросетями на домашнем железе
Привет, Пикабу.
Читаю вас давно — и всё это время молча. Ни разу не было повода написать. Теперь вроде появился.
Я разработчик. Работа работой, но руки чешутся делать что-то своё, поэтому в свободное время я вожусь с железом и кодом просто в удовольствие. Так и получился бот: сначала он умел ровно одну вещь — каждый день разыгрывать в чате «приз дня» среди тех, кто хоть что-то написал. Приз по умолчанию — обыкновенное ничто, но его можно заменить на «сегодняшнее весёлое ничто» или на что угодно ещё.
Потом мне стало интересно, получится ли прикрутить к нему нейросети. Получилось.
РОЗЫГРЫШИ
С этого всё началось, и это до сих пор основное. Бота надо добавить в групповой чат — там он и живёт.
Каждый день в 12:00 UTC он выбирает случайного победителя. Участвуют все, кто написал в чат хотя бы одно сообщение за предыдущие двенадцать часов — то есть с полуночи UTC и до самого розыгрыша. Если желающих меньше двух, розыгрыш не проводится: скучно.
По умолчанию разыгрывается обыденное ничего. Приз можно назначить свой — пишешь в чат «Сегодня развесёлое ничего» или «Завтра волшебное ничего», и он запомнит. Сегодняшний меняется только до розыгрыша, после поезд ушёл. Есть статистика победителей за год и за всё время.
Распоряжаются призом суперадмины — владелец чата и его админы, бот находит их сам. Они же могут выдать права кому-то ещё.
Отдельно стоит команда /censorship. Она переключает не то, что бот рисует, а то, какими словами он сам разговаривает: у него два набора фраз на все случаи — приличный и не очень. Включается на каждый чат отдельно и тоже только суперадминами.
НЕЙРОСЕТИ
Пишешь в чат «нарисуй кота в скафандре» — рисует. Прикрепляешь к той же команде картинку — переделывает её по описанию. «Анимируй» в ответ на картинку — оживляет её в короткий ролик. «Расшифруй» на голосовое — присылает текст. Ну и просто спросить, что происходит на картинке, тоже можно.
ИНЛАЙН-РЕЖИМ
А вот для этого добавлять бота никуда не нужно. Набираете в любом чате его имя с собачкой, следом запрос — и Telegram прямо в поле ввода покажет, что с этим можно сделать: нарисовать или анимировать. Выбираете, и результат уходит в тот чат, где вы это набрали.
В том же списке лежат картинки, которые вы раньше скидывали боту в личку. Любую можно оживить, а текст, набранный в строке, станет описанием того, как именно.
Запрос был "подводная лодка в небе". Небо есть, но лодка так себе
КАКИЕ МОДЕЛИ
Картинки рисует Qwen-Image 2.1. Ролики — MiniMax-H3: пять секунд, причём звук она генерит сама, в том же проходе. Голосовые расшифровывает WhisperX, он же различает, кто где говорит. А надо всем этим стоит языковая модель Qwen3.8 на 27 миллиардов параметров, ужатая до четырёх бит: она переводит запросы, приводит их к виду, который рисовалка понимает, и умеет смотреть на картинки.
Модели я время от времени меняю. Выходит что-то новое — пробую, и если лучше, переезжаю. Начинал вообще с Fooocus, потом была Z-Image. После неё успел пожить на Chroma и вернуться обратно: она хорошо рисует людей, но что ей ни закажи, всё превращает в живопись — просишь фотографию, получаешь картину маслом. А теперь вот Qwen-Image.
Последний переезд случился буквально на днях. Z-Image рисовал красивее, но делает картинку немного более пластиковой. Qwen-Image 2.1 в этом плане более реалистичен, точнее соблюдает промт, лучше пишет текст, но, с другой стороны, может начудить с анатомией или объекатми. На подводной лодке выше это было видно. Возможно, решу вернуться опять на Z-Image. Время покажет.
Та же «подводная лодка в небе» на старой модели. Красиво, но под водой. Ещё одна причина переехать.
ЧТО ВНУТРИ
Всё крутится дома, никаких облаков и подписок. Два системника, четыре RTX 3090 на двоих.
Одна карта занята языковой моделью, остальные три собраны в общий пул и считают то, что закажут: картинки, видео, расшифровку голосовых.
Картинка выходит секунд за тридцать, ролик — минуты за две-три. Расшифровка голосового — считанные секунды.
Снаружи стоит реверс-прокси, он же держит сертификаты. Рядом живёт третья, совсем маленькая виртуалка со сбором статистики: сколько чего посчитали, сколько ждали в очереди, какая карта чем занята. Без этого непонятно, что чинить, когда что-то идёт не так.
КАК УСТРОЕНА ОЧЕРЕДЬ
Вот это, по-моему, самое интересное.
Очередь одна, карт три, и наивная схема «кто первый пришёл, того и считаем» разваливается сразу. Приходит человек, заказывает десять роликов — и весь чат стоит за ним полчаса. Поэтому планировщик раздаёт время не задачам, а людям: по кругу, по паре задач на человека. Пришёл один с десятью роликами и второй с одной картинкой — картинка не будет ждать все десять.
Дальше начинаются нюансы.
Переключение модели на карте стоит секунд пятнадцать. Если подряд идут однотипные ролики, планировщик старается отдавать их одной и той же карте, чтобы не перезагружать веса каждый раз. Карты сами собой специализируются.
Если после нескольких роликов подряд в очереди висит картинка или расшифровка — её пропускают вперёд. Они дешёвые, и мариновать их за десятью видео бессмысленно.
И на всякий случай есть защита от забывания: задача, провисевшая слишком долго, проталкивается вперёд независимо от всего остального.
ССЫЛКА
Найти бота можно в поиске по имени @pukechbot
Работает и в личке, и в группах. Бесплатно, никаких подписок — мне просто интересно этим заниматься.
ЧЕСТНОЕ ПРЕДУПРЕЖДЕНИЕ
Это домашний проект одного человека на железе, которое стоит у меня в комнате. Иногда бот будет падать. Иногда я буду что-то чинить или обновлять — и он ляжет уже по моей вине. Модели я, как видите, тоже меняю, а это каждый раз пересборка и простой.
Если не отвечает — просто подождите немного и попробуйте ещё раз. Готовые результаты должны переживать перезапуск, так что если вы успели что-то заказать до падения, оно, вероятно, не потеряется.
Если поймаете что-то странное — напишите в комментариях, мне правда интересно. Половину багов я нахожу именно так.








