Аноны, нужна ваша мудрость. Пилю свою игрушку с ИИ на ONNX Runtime с бэкендом DirectML (GPU), не путать с CUDA — речь про универсальный бэкенд от майков, который гоняет и на амуде, и на интелах, и на жабах.
Сейчас использую YOLOv8, параллельно делаю поддержку для YOLO4 Darknet. На старте было ~30 FPS, после оптимизаций (batch, асинхрон, pin memory) вышел на 80 FPS, но хочу в идеале хотя бы 150-200.
Железо норм, упор сейчас не в GPU, а скорее в саму реализацию. Знаю про FP16/INT8, профилирование, минимизацию копирования и графовую оптимизацию, но может есть ещё приёмы, которые работают конкретно для DirectML?
Ещё интересует, как грамотно распараллелить захват экрана, препроцессинг и инференс, чтобы не ждать ИИ и не кормить его устаревшими кадрами (рассинхрон с игрой получается).
Если кто-то уже дрочил ONNX Runtime с DirectML, особенно под real-time задачи, поделитесь схемами, флагами, лайфхаками. В гугле про это почти пусто.
Вопросы по делу:
Как вы оптимизируете пайплайн DirectML?
Какие есть хитрые флаги/опции у onnxruntime для DirectML, про которые мало кто знает?
Как минимизировать latency между кадром и результатом инференса?
>>3516774 (OP) > Ещё интересует, как грамотно распараллелить захват экрана, препроцессинг и инференс, чтобы не ждать ИИ и не кормить его устаревшими кадрами (рассинхрон с игрой получается). И как ты себе представляешь распараллеливание последовательных действий? Делай пайплайн с задержкой, или пытайся обучать модель чтобы предсказывала следующий кадр (скорее всего не подскажешь)
Тебе прям каждый кадр нужно инференс гнать? Или может есть способ использовать экстраполяцию на каждые N кадров?