Янник Килчер: «Как создать потоковый бэкенд для LLM на Rust»

Yannic Kilcher 37,8 тыс. 1 ч 21 мин 3 мин 24.02.2023
Главное

Разработка потокового бэкенда для инференса LLM: Практическое руководство

0:00

Создание пользовательского интерфейса, аналогичного ChatGPT, где ответ модели отображается «на лету» (по мере генерации токенов), требует сложной архитектуры. В данном видео ведущий канала Янник Килчер (Yannic Kilcher) демонстрирует процесс модификации text-generation-inference — open-source проекта для запуска больших языковых моделей (LLM). Цель разработки — внедрить поддержку стриминга (потоковой передачи) ответов, проходя через все технологические слои: от Python-кода модели, взаимодействующего через gRPC, до Rust-сервера и клиентского веб-интерфейса.

⚙️ Архитектура системы и задача 0:27

Для реализации стриминга Янник Килчер детально описывает путь токена от видеокарты до браузера пользователя. Основная сложность заключается в том, что существующая библиотека Hugging Face по умолчанию генерирует ответ целиком, а не токен за токеном.

🐍 Модификация Python-части (Hugging Face) 11:16

Основная точка входа для генерации — функция generate_token в коде модели (типа CausalLM).

  1. Анализ логики: Функция итерируется не по длине последовательности, а по размеру батча, генерируя один токен для каждого активного запроса в батче.
  2. Точка внедрения: В текущей реализации метод возвращает список результатов только после завершения генерации. Янник предлагает модифицировать его так, чтобы он возвращал промежуточные токены на каждом шаге.
  3. Data Classes: Для передачи данных создается класс Intermediate с полями request_id (целое число согласно protobuf) и token.
  4. Protobuf: Так как интерфейсы описаны через Protobuf, необходимо обновить определения сообщений, добавив в них списки промежуточных результатов, и пересобрать сгенерированный код с помощью make install.

🦀 Переход к Rust: Маршрутизатор и стриминг 32:51

После подготовки Python-бэкенда работа переносится в Rust-часть проекта (router).

🌐 Масштабируемая сеть Open Assistant 1:18:27

В финальной части видео демонстрируется интеграция разработанного «стриминг-бэкенда» в экосистему Open Assistant. Система работает как распределенная сеть:

Янник подчеркивает, что это позволяет пользователю видеть ответ модели (например, шутку или длинный текст) почти мгновенно, не дожидаясь завершения всей генерации.

💬 Цитаты

«Мы собираемся пересечь все эти языковые и технологические границы, чтобы это произошло.»

Янник Килчер 05:23

«Тесты — это для слабаков, для слабых людей. Шучу, тесты — это нормально.»

Янник Килчер 25:39
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
SSE (Server-Sent Events)
Технология, позволяющая серверу автоматически отправлять данные клиенту через HTTP-соединение после начального запроса.
gRPC
Фреймворк для удаленного вызова процедур (RPC) с высокой производительностью, разработанный Google.
Protobuf
Механизм сериализации структурированных данных для передачи между системами.
Инференс
Процесс использования уже обученной нейросети для получения предсказаний (генерации).
One-Shot Channel
Тип канала в Rust, который гарантирует отправку ровно одного значения между потоками.
📊 Цифры
⚖️ Другая сторона
Искусственный интеллект Open Assistant text-generation-inference Rust gRPC streaming