Работа 05 · Медицинский центр · собственная разработка

ИИ на своём железе

Медицинские данные нельзя отправлять в облако, а денег на новые серверы нет. Языковые модели заработали на видеокартах, которые другие уже списали.

30 сутокбез единого сбоя
Работает
  • C# / .NET 10
  • ASP.NET Core
  • llama.cpp
  • CUDA 12
  • Python
  • OpenRouter
Зачем

Речевой аналитике и медицинской документации нужны языковые модели. Облако подходит не всегда: медицинские данные должны оставаться внутри клиники. Покупать новые серверы клиника не готова. Зато есть старый компьютер с тремя видеокартами GTX 1080 Ti по 11 ГБ.

Что я сделал
Шаг 01

Своя сборка llama.cpp

GTX 1080 Ti — архитектура Pascal, и новая CUDA 13 её больше не поддерживает. Я собрал llama.cpp под CUDA 12 специально для этих карт. Модель Gemma 4 на 26 миллиардов параметров (21 ГБ) разложена по слоям на три видеокарты.

Шаг 02

Шлюз LLA Control

Одна точка входа для программ в локальной сети, совместимая с API OpenAI. Шлюз запускает модель, следит за её состоянием, ставит запросы в очередь и раздаёт их по имени модели: локальной модели, другой машине в сети или облачной модели через OpenRouter.

Шаг 03

Классы вместо имён

Программы просят не конкретную модель, а класс: high, medium или low. Шлюз отдаёт запрос живой и наименее загруженной модели этого класса. Модели можно менять, не трогая ни одной программы.

Шаг 04

Кластер

Ещё одна машина с моделью подключается к шлюзу как рабочий узел, без отдельного протокола. Шлюз проверяет, жив ли узел, и защищён от петель пересылки.

Шаг 05

Честная статистика

Привычная «скорость в токенах в секунду» смешивает два разных процесса и занижает скорость ответа. Шлюз считает их отдельно — чтение запроса и генерацию ответа, — и по ним сразу видно, где узкое место. Модели можно сравнить и вживую: тестовый чат задаёт один вопрос двум моделям рядом.

Шаг 06

Балансировщик для пакетной работы

Тысячи звонков раздаёт параллельно нескольким серверам отдельный балансировщик на Python.

Непростое

01

Мало памяти

На машине 16 ГБ оперативной памяти, а модели весят больше 20 ГБ. Всё должно жить в видеопамяти, и параметры запуска подобраны именно под это.

02

Сбой не должен быть заметен

Если модель зависла или упала, шлюз перезапускает её сам — но не бесконечно: от зацикленных перезапусков есть защита.

Стек
  • C# / .NET 10, ASP.NET Coreшлюз и его панель управления.
  • llama.cpp на CUDA 12локальные модели Gemma 4 и Qwen.
  • Pythonбалансировщик пакетных задач.
  • OpenRouterоблачные модели, когда данные это позволяют.
Итог
30 сутокбез единого сбоя

Тест стабильности: модель Qwen проработала 30 суток круглосуточно, без единого сбоя и без выгрузки из памяти. Я остановил тест вручную, когда закончилась работа над медицинской документацией.

Речевая аналитика и другие ИИ-задачи клиники работают на имеющемся оборудовании — без покупки новых серверов.

Видео
ИИ на своём железе Языковые модели на старых видеокартах — своя сборка llama.cpp и шлюз, без облака и новых серверов.