Inżynieria
Jak przyspieszyliśmy generowanie beatmap z AI na tyle, by działało interaktywnie
Pełny mapset osu! mania w około 20 sekund pracy GPU zamiast minuty lub więcej: na co idzie czas w żądaniu ManiaGAI i decyzje — od przeglądarki po wsadowe poziomy trudności — które go skróciły.
Generator, na który czekasz minutami, to zadanie wsadowe. Wysyłasz piosenkę, zajmujesz się czymś innym i wracasz do tego, co powstało — a jeśli ci się nie podoba, wypróbowanie innego stylu albo innego zestawu poziomów trudności kosztuje kolejne czekanie. Generator, który odpowiada w kilka sekund, to narzędzie: próbujesz, słuchasz, poprawiasz i próbujesz znowu.
Właśnie dlatego w wersji 2 ManiaGAI potraktowaliśmy opóźnienie jako ograniczenie projektowe całego systemu, a nie coś do optymalizacji na sam koniec. Wersja 1 potrzebowała minuty lub więcej na mapset. Wersja 2 potrzebuje około 20 sekund pracy GPU na pełny mapset dla typowej piosenki — zwykle od 13 do 25 sekund, zależnie od piosenki i wybranych poziomów trudności. Oto, na co idzie ten czas, i decyzje, które usunęły resztę.
Anatomia żądania
- Twoja przeglądarka
- Timing ∥ cechy muzyczne
- Planner
- Noter
- Walidacja
- Pobranie
Jeden zmierzony przebieg produkcyjny z premiery v2: piosenka o długości 2:50, 5 poziomów trudności, na GPU NVIDIA T4 — 12,7 sekundy łącznie.
| Etap | Czas |
|---|---|
| Timing + cechy muzyczne (równolegle) | 3,8 s |
| Planowanie (wszystkie poziomy trudności) | 1,0 s |
| Generowanie nut (wszystkich 5 poziomów trudności) | 6,1 s |
| Cały przebieg | 12,7 s |
Czas obliczeń GPU dla jednej piosenki w systemie z premiery v2 (1 października 2026), bez wliczania wysyłania, kolejki i pobierania.
1. Obróbka audio, zanim ktokolwiek kliknie „Utwórz”
Każda wgrana piosenka musi zostać zdekodowana, znormalizowana pod względem głośności i ponownie zakodowana do jednego spójnego formatu, zanim modele będą mogły jej użyć. Na serwerze to kilka sekund pracy, na które GPU musiałoby czekać. W ManiaGAI dzieje się to w Twojej przeglądarce, gdy tylko wybierzesz plik — kiedy jeszcze wybierasz liczbę klawiszy i poziomy trudności. Zanim klikniesz „Utwórz”, praca jest zwykle już skończona. Jeśli przygotowanie piosenki na wolnym urządzeniu trwa dłużej niż 20 sekund, przejmuje je serwer, więc ta optymalizacja nigdy nikogo nie spowalnia.
2. Timing i rozumienie muzyki równolegle
Zanim zacznie się planowanie, o piosence trzeba wiedzieć dwie rzeczy: jej siatkę timingu (z open-source’owego modelu Beat This i naszego własnego dopasowania siatki) oraz jej cechy muzyczne (z modelu muzycznego MERT). Nie zależą od siebie, więc na siebie nie czekają: GPU uruchamia Beat This i MERT, a w tym samym czasie na CPU działa dopasowanie siatki. W powyższym przebiegu cały etap rozumienia zajął 3,8 sekundy.
3. Wszystkie poziomy trudności w jednym przejściu
Mapset ManiaGAI ma do dziesięciu poziomów trudności. Generowanie ich jeden po drugim pomnożyłoby czas przez ich liczbę. Zamiast tego każdy wybrany poziom trudności jest planowany i generowany razem, w jednym wsadowym przejściu GPU — dzielą tę samą piosenkę i te same cechy muzyczne, a różnią się tylko celami. Dlatego w powyższym przebiegu generowanie nut dla pięciu poziomów trudności zmieściło się w 6,1 sekundy.
4. Udoskonalanie całej mapy zamiast pisania nuta po nucie
Model nut jest nieautoregresyjny: tworzy całą mapę w stałej liczbie przejść udoskonalających, zamiast po jednym tokenie naraz od początku piosenki do końca — więc liczba kroków modelu jest stała, niezależnie od tego, ile nut ostatecznie znajdzie się w mapie. (Dlaczego model działa w ten sposób, to osobna historia: artykuł o Planner + Noter.)
5. Start ze snapshotu, a nie od zera
Generowanie działa na serverlessowych workerach GPU, co oznacza, że gdy przychodzi żądanie, worker nie zawsze jest uruchomiony. Ładowanie modeli i rozgrzewanie wszystkiego od zera dodałoby wiele sekund do tego pierwszego żądania. Zamiast tego workery są przywracane ze snapshotu pamięci wykonanego po załadowaniu i rozgrzaniu wszystkiego, więc świeży worker jest gotowy w około sekundę, zamiast tracić ten czas na ładowanie modeli.
6. Bez czekania na mecie
Ostatnie kroki dodawały kiedyś własne opóźnienie. Teraz plik .osz do pobrania jest składany w chwili, gdy mapy są gotowe, a gotowa mapa trafia do Moich map w momencie zakończenia generowania — nawet jeśli opuściłeś już stronę. Postęp w generatorze pokazuje rzeczywisty etap, na którym jest każde generowanie, więc czekanie nigdy nie jest zagadką.
Jeszcze szybciej, z identycznymi mapami
8 października 2026 wdrożyliśmy szybszą implementację systemu generowania: mapy generują się teraz mniej więcej dwa razy szybciej, a same mapy są dokładnie takie same — to samo wejście, to samo wyjście. Przy tej zmianie przyjęliśmy twardą zasadę: przyspieszenie, które zmienia to, co pisze model, jest zmianą modelu i musi być oceniane jako taka. Krótsze stało się tylko czekanie.
Co daje szybkość
Szybkość zmienia sposób, w jaki używa się ManiaGAI. Sprawia, że wypróbowanie drugiego stylu albo innego zestawu poziomów trudności to kwestia sekund, że przepływ „najpierw podgląd, potem pobranie” jest naturalny, i że da się utrzymać darmowy plan. To także powód, dla którego optymalizujemy całe żądanie — od przeglądarki po pobranie — a nie sam model: gracze odczuwają czekanie, a nie czas GPU.
To, gdzie te etapy mieszczą się w systemie, pokazuje strona Technologia; co i kiedy się zmieniło — changelog.