Powrót do strony głównej

PyTorch Hooks do audio z aktywacji LLM

Artykuł opisuje dwa eksperymenty: bezpośrednie spajanie wizualnych latentów SigLIP z MusicGen przez monkey patching i generowanie ambientu z aktywacji Qwen2.5 za pomocą PyTorch forward hooks. Podano kod do przechwytywania stanów neuronowych i modulacji DSP. Podejście do tworzenia unikalnego audio bez tekstowych promptów.

Generowanie dźwięku z 'myśli' AI bez promptów
Advertisement 728x90

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.

Google AdInline article slot

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:

Google AdInline article slot
  • 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

Google AdInline article slot
Advertisement 728x90

Czytaj dalej