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

  1. Twoja przeglądarka
  2. Timing ∥ cechy muzyczne
  3. Planner
  4. Noter
  5. Walidacja
  6. 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.

Czasy etapów jednego generowania ManiaGAI v2
EtapCzas
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 przebieg12,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.