2 Punkte von kdrkdrkdr 7 시간 전 | Noch keine Kommentare. | Auf WhatsApp teilen

Ein selbst erstelltes Projekt.

  • Eine Bibliothek, die die Runtime von FastEnhancer-Medium (48-kHz-Streaming-Modell zur Sprachverbesserung) in reinem C neu implementiert
  • Originalmodell: https://github.com/aask1357/fastenhancer (Ahn et al., 2025)
  • Verwendet unverändert die 48-kHz-Gewichte, die das ursprüngliche Repo nach dem Paper (16 kHz) zusätzlich veröffentlicht hat. Kein Retraining, kein Finetuning, kein Calibration Set
  • Modell und Gewichte stammen von den ursprünglichen Autoren; optimiert wurde die Runtime

■ Performance

  • Auf einem einzelnen Apple-M2-Core erreicht es einen Real-Time Factor von 0,069. Wenn derselbe Graph auf derselben Maschine mit ONNX Runtime ausgeführt wird, sind es 0,230, also 3,3-mal schneller
  • Auf einem Galaxy S23+ (Snapdragon 8 Gen 2) sind es 0,096
  • Praktisch keine Qualitätsverluste. Bei 824 Äußerungen aus VoiceBank-DEMAND liegt es nur bei -0,006 PESQ gegenüber dem fp32-Modell. Das ist kein hörbar unterscheidbarer Bereich

■ Angewandte Optimierungen

Die 3-fache Beschleunigung kommt nicht von einer einzelnen Technik; mehrere Ebenen wurden jeweils überarbeitet.

  • Quantisierung: Der Wertebereich der Aktivierungen wird in jedem Frame neu berechnet. Dadurch muss kein Calibration Set abgestimmt oder mit ausgeliefert werden, und es bricht auch bei veränderter Eingabeverteilung nicht
  • Faltung: Auf k=3 conv wird Winograd F(2,3) angewendet, und der nachfolgende Epilog (dequant + bias + SiLU + fp16 write) wird in denselben Pass integriert, sodass Zwischenpuffer entfallen
  • Rekurrenz: Die GRU wird pro Tier vollständig zu einem Kernel fusioniert. Eingangsmatrixmultiplikation, Hidden-Matrixmultiplikation, die drei Gates r/z/n und das Hidden-Update werden in einem Kernel abgeschlossen, sodass der int32-Akkumulator nicht in den Speicher ausweicht
  • Attention: Softmax verarbeitet int32-Scores direkt. Da gar keine fp32-Score-Matrix erzeugt wird, entfallen die entsprechenden Speicher-Roundtrips
  • Speicher: Cross-Stage-Zustände (GRU hidden, Encoder-Skips) werden als fp16 gespeichert, wodurch sich die Bandbreite zwischen Frames halbiert
  • Kernel: Sechs int8-GEMM-Kernel wurden ISA-spezifisch selbst geschrieben und bei der Initialisierung automatisch ausgewählt (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
  • Die übrige Optimierungsliste ist auf GitHub des Projekts zu finden

■ Echtzeitstabilität

  • Es blieb nicht bei einem einzelnen 37-Sekunden-Benchmark; geprüft wurde mit dem tatsächlichen Audio-Callback-Takt über 30 Minuten am Stück
  • Der M2 blieb während der gesamten 30 Minuten innerhalb des Frame-Budgets (p99 0,56)

■ Sonstiges

  • 0 externe Abhängigkeiten. Build mit cmake + make; die statische Bibliothek ist 162 KiB groß
  • Die öffentliche API besteht aus 4 Funktionen (fe_init / fe_run / fe_reset / fe_free)
  • Gewichts-Blob 565 KB, 511.754 Parameter
  • MIT-Lizenz

Noch keine Kommentare.

Noch keine Kommentare.