AdeptForWIN_rtx5090

0

Описание

# Adept — нативная сборка под Windows с Vulkan GPU > Протестировано на **NVIDIA RTX 5090** / Intel i9-13900KF / 128GB DDR5 --- ## О чём речь Полностью рабочая сборка фреймворка [Adept](https://gitverse.ru/kolkir/adept) под Windows с нативным ускорением на GPU через Vulkan. Оригинальный проект заточен под Linux — этот порт добавляет полноценную

3 месяца назад
README
# Adept — нативная сборка под Windows с Vulkan GPU
 
> Протестировано на **NVIDIA RTX 5090** / Intel i9-13900KF / 128GB DDR5
 
---
 
## О чём речь
 
Полностью рабочая сборка фреймворка [Adept](https://gitverse.ru/kolkir/adept) под Windows с нативным ускорением на GPU через Vulkan. Оригинальный проект заточен под Linux — этот порт добавляет полноценную поддержку Windows через тулчейн MSYS2/GCC, сохраняя при этом все возможности Vulkan compute.
 
Все пять исполняемых файлов собираются и работают: `benchmark`, `pipeline_perf`, `mlp`, `lenet`, `convnet`.
 
## Окружение сборки
 
| Компонент | Версия |
|-----------|--------|
| ОС | Windows 11 Pro |
| Компилятор | GCC 15.2.0 (MSYS2 UCRT64) |
| Система сборки | CMake 4.2.3 + Ninja |
| Vulkan SDK | 1.4.328 |
| Драйвер GPU | NVIDIA 576.88 |
 
## Бенчмарк: CPU vs GPU (Vulkan)
 
Железо: RTX 5090 32GB VRAM, i9-13900KF 24 ядра, 128GB DDR5.
 
Все значения в микросекундах. Меньше — лучше.
 
| Операция | CPU | GPU (Vulkan) | Ускорение |
|----------|----:|-------------:|----------:|
| x += y | 75.4 | 13.7 | 5.5x |
| relu | 10 190 | 202 | **50x** |
| matmul(x, y) | 1 162 | 214 | 5.4x |
| batch matmul(x, y) | 10 131 | 57.6 | **176x** |
| transpose | 3 605 | 3.9 | **924x** |
| conv2d fwd 1:64:28 | 97.4 | 81.2 | 1.2x |
| conv2d bwd 1:64:28 | 232 | 56.3 | 4.1x |
| conv2d fwd 64:256:28 | 1 346 | 2 295 | 0.6x |
| conv2d bwd 64:256:28 | 4 594 | 339 | **13.5x** |
| conv2d fwd 1:64:256 | 92.7 | 223 | 0.4x |
| conv2d bwd 1:64:256 | 6 348 | 633 | **10x** |
| conv2d fwd 64:256:256 | 1 209 | 829 | 1.5x |
 
Transpose ускоряется в **924 раза** на GPU. Batch matmul — в **176 раз**. Relu — в **50 раз**. Обратные проходы в целом выигрывают от GPU заметно больше, чем прямые, на таких размерах тензоров.
 
Некоторые мелкие прямые свёртки быстрее на CPU — оверхед запуска Vulkan-ядра превышает время самого вычисления. Это ожидаемое поведение для compute-бэкенда.
 
## Что было изменено
 
Порт потребовал правок в пяти местах:
 
**1. Файловый ввод через memory-mapped I/O** (`src/serialize/fileinput.cpp`, `include/adept/serialize/fileinput.hpp`)
 
Linux использует `mmap`/`munmap` через `<sys/mman.h>`. Заменено на Windows API: `CreateFileA` / `CreateFileMappingA` / `MapViewOfFile` под `#ifdef _WIN32`. Оригинальный POSIX-путь сохранён.
 
**2. Менеджер разделяемой памяти** (`src/backends/cpu/tensorimpl.cpp`, `src/backends/cpu/create.cpp`)
 
`SharedMemoryManager` опирается на POSIX shared memory (`shm_open` и др.), прямого аналога в Windows нет. Вызовы обёрнуты в `#if defined(BUILD_ANDROID) || defined(_WIN32)` — по аналогии с уже существующим исключением для Android. Основные тензорные операции работают без shared memory.
 
**3. Конфигурация CMake** (`CMakeLists.txt`)
 
Добавлено условие `AND NOT WIN32` для исключения `shared_mem_manager.cpp` из сборки под Windows, аналогично существующему исключению для Android.
 
**4. Компиляция Vulkan-шейдеров** (`cmake/vulkan_compiler.cmake`)
 
Мелочь: команда `python3` на Windows по умолчанию отсутствует. MSYS2 предоставляет и `python`, и `python3`, так что при сборке через MSYS2 изменений не требуется.
 
**5. Совместимость с GCC 15** (`apps/cpp/lenet.cpp`, `mlp.cpp`, `convnet.cpp`, `pipeline_perf.cpp`)
 
GCC 15 строже проверяет преобразование `std::filesystem::path` в `std::string`. Добавлены явные вызовы `.string()` там, где объекты `fs::path` передаются в конструкторы, ожидающие `const std::string&`. Также добавлен `[[maybe_unused]]` для намеренно неиспользуемой переменной цикла.
 
## Как собрать на Windows
 
Необходим [MSYS2](https://www.msys2.org/) с окружением UCRT64.
 
```bash
# Установка зависимостей (в терминале MSYS2 UCRT64)
pacman -S mingw-w64-ucrt-x86_64-gcc \
mingw-w64-ucrt-x86_64-cmake \
mingw-w64-ucrt-x86_64-ninja \
mingw-w64-ucrt-x86_64-vulkan-headers \
mingw-w64-ucrt-x86_64-vulkan-loader \
mingw-w64-ucrt-x86_64-glslang \
mingw-w64-ucrt-x86_64-python \
mingw-w64-ucrt-x86_64-openblas \
mingw-w64-ucrt-x86_64-tbb \
mingw-w64-ucrt-x86_64-highway \
mingw-w64-ucrt-x86_64-gcc-fortran
 
# Клонирование
git clone --recurse-submodules https://gitverse.ru/kolkir/adept.git
cd adept
 
# Конфигурация (Vulkan SDK ставится отдельно с сайта LunarG)
export VULKAN_SDK=/c/VulkanSDK/1.4.328.1
cmake -G Ninja -B build \
-DCMAKE_PREFIX_PATH="/ucrt64" \
-DWITH_VULKAN=ON \
-DWITH_TESTS=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DVulkan_INCLUDE_DIR="$VULKAN_SDK/Include" \
-DVulkan_LIBRARY="/ucrt64/lib/libvulkan-1.dll.a"
 
# Сборка
cmake --build build --parallel 8
 
# Запуск
./build/benchmark.exe # CPU
./build/benchmark.exe --gpu # Vulkan GPU
```
 
## Известные ограничения
 
- `SharedMemoryManager` отключен на Windows (как и на Android). Шаринг тензоров между процессами недоступен.
- `benchmark.exe --gpu` падает с `vk::OutOfDeviceMemoryError` на самом тяжёлом обратном проходе conv2d (64:256:256). Все остальные операции проходят без ошибок. Похоже на проблему стратегии аллокации памяти в Vulkan-бэкенде, а не на Windows-специфичный баг.
- Python-биндинги под Windows пока не тестировались.
 
## Inference API
 
В качестве бонуса — HTTP API на базе FastAPI, который оборачивает скомпилированные исполняемые файлы и предоставляет удалённый доступ к бенчмаркам и инференсу. Аутентификация по токену, rate limiting, Swagger-документация по адресу `/docs`.
 
---
 
*Собрано и протестировано на Windows 11 Pro, февраль 2026.*