Przechwytywanie aktywacji LLM do generacji audio za pomocą haków PyTorch
W eksperymencie PaleoSonic Engine wizualne łaty z SigLIP są bezpośrednio przekształcane w latentne audio MusicGen. Zamiast standardowego potoku Image -> Text -> Audio, używana jest warstwa liniowa nn.Linear do projekcji 196 łatek o rozmiarze 196 w wektory dźwiękowe. Modele są konwertowane na bfloat16 do pracy w 16 GB RAM.
Kluczowy krok – monkey patching enkodera tekstowego MusicGen. Generator oczekuje 196 tokenów tekstu, ale otrzymuje geometrię obrazu. Losowa inicjalizacja mostu daje surowy dźwięk: ostry szum, imitujący kolizję architektur bez dodatkowego treningu.
# Zachowujemy oryginalny 'mózg'
original_text_encoder = self.audio_decoder.text_encoder.forward
# Tworzymy klasę-podróbkę
class VisualThoughts:
def __init__(self, hidden_states):
self.last_hidden_state = hidden_states
def __getitem__(self, idx):
return [self.last_hidden_state][idx]
def spoofed_text_encoder(*args, **kwargs):
# Podkładamy wizualne tensory zamiast tekstu!
return VisualThoughts(audio_conditioning)
# Zarażamy generator
self.audio_decoder.text_encoder.forward = spoofed_text_encoder
To podejście odkrywa surową transmisję geometrii pikseli w akustykę, pomijając semantykę tekstu.
PyTorch Hooks do wyodrębniania 'myśli' LLM w czasie rzeczywistym
W drugim eksperymencie Neural-Analog Engine Qwen2.5-1.5B-Instruct zarządza oscylatorem DSP. Forward hook jest rejestrowany na 15. warstwie modelu – centrum abstrakcyjnych reprezentacji. Aktywacje są detachowane, konwertowane na float32 i kompresowane przez uśrednianie po osi batcha.
neural_activations = []
# Funkcja-szpieg do przechwytywania myśli
def steal_thoughts_hook(module, input, output):
# Bierzemy bieżący stan neuronów
current_thought = output[0].detach().cpu().to(torch.float32).numpy()
compressed_thought = np.mean(current_thought, axis=1)[0]
neural_activations.append(compressed_thought)
# Wkładamy 'strzykawkę' w 15. warstwę Qwen
hook_handle = model.model.layers[15].register_forward_hook(steal_thoughts_hook)
Surowe wektory są podawane na wejście numpy-oscylatora i scipy-filtrów. LLM generuje prompt taki jak 'Cisza zamarzniętej kwantowej gwiazdy', ale dźwięk jest modulowany pulsacją aktywacji: częstotliwości, fazy, tłumienie są określane przez wartości neuronowe. Rezultat – czysty dark ambient bez sieciowych generatorów audio.
Techniczne szczegóły krzyżowo-modalnego łączenia
- Vision Backbone: google/siglip-base-patch16-224 wydaje 196 łatek po self-attention.
- Audio Target: facebook/musicgen-small oczekuje text_encoder z hidden_state [1, 196, dim].
- Most: nn.Linear(196dim_vision, 196dim_audio) z random init; bez fine-tuning, aby zachować 'brud'.
- Hook Mechanics: register_forward_hook przechwytuje output po MLP w warstwie 15; detach zapobiega gradientom.
- DSP Pipeline: np.sin dla oscylatorów + scipy.signal.butter dla low-pass filtrów; modulacja amplitudy od aktywacji.
Różnice w brzmieniu:
- PaleoSonic – chaotyczny szum od kolizji latentów.
- Neural-Analog – ustrukturyzowany ambient od fizycznych fal.
Skalowanie i optymalizacje dla produkcji
Oba podejścia działają w Spaces Hugging Face. Dla skali:
- Używaj torch.compile do przyspieszenia hooks.
- Kwantyzuj Qwen do 4-bitów z bitsandbytes, aby zmniejszyć pamięć.
- Równolegle aktywacje przez DataParallel na wielu GPU.
Potencjał: zintegruj w real-time audio (JACK/WASAPI) dla live-performance'ów. Eksperymentuj z innymi warstwami – wczesne dają niskopoziomowe cechy, późne – semantykę.
Co jest ważne
- Monkey patching omija generate() bez retreningu, podmieniając encoder w locie.
- Forward hooks w PyTorch – standard dla interpretowalności; detach obowiązkowy dla inference.
- Kompresja aktywacji (mean axis=1) redukuje wymiar bez utraty dynamiki.
- bfloat16 kluczowe dla low-RAM; unikaj float16 na CPU.
- DSP na numpy/scipy szybszy niż torch.nn dla prostych oscylatorów.
— Editorial Team
Brak komentarzy.