Amazon pokazuje krok po kroku, jak profilować TorchNeuron na AWS Trainium i analizować wydajność na przykładzie RMSNorm.

Źródło zdjęcia: huggingface.co
Amazon opublikowało pierwszą część serii poświęconej profilowaniu wydajności modeli na AWS Trainium — autorskim chipie AI firmy przeznaczonym do treningu i inferencji modeli głębokiego uczenia. Materiał, przygotowany przez Josha Longeneckera, tłumaczy od podstaw, jak systematycznie analizować wydajność inferencji w TorchNeuron, natywnym backendzie PyTorch dla Trainium, i jak zlokalizować, gdzie dokładnie model traci czas obliczeniowy.
Artykuł nie zakłada wcześniejszego doświadczenia w profilowaniu i krok po kroku pokazuje konfigurację narzędzi, odczyt wyników oraz analizę trzech różnych implementacji tej samej operacji — RMSNorm.
Zanim przystąpi się do profilowania, warto zrozumieć mechanizm, który łączy Neuron z frameworkiem PyTorch. Backend Neuron opiera się na punkcie rozszerzeń PrivateUse1, który pozwala akceleratorowi zintegrować się z PyTorch bez dodawania osobnego klucza dyspatchu (jak dzieje się to w przypadku cuda). Pakiet torch_neuronx współpracuje z główną gałęzią PyTorch i rejestruje Neuron jako natywny backend dla kodu PyTorch. Dzięki temu programiści mogą pisać kod w znanym stylu, przenosząc tensory i operacje na urządzenie neuron, tak jak robiliby to z GPU.
Do profilowania obciążenia na Neuronie potrzebne są dwa obiekty. Pierwszy, NeuronConfig, kontroluje, które strumienie danych i NeuronCore’y mają zostać przechwycone oraz gdzie zapisać wynik — przekazuje się go do torch.profiler.profile jako experimental_config. Drugi, NeuronProfiler, przyjmuje NeuronConfig i udostępnia callback export_trace, który zapisuje ślad frameworka (trace.json) obok systemowych śladów Neurona.
Parametr modes wybiera strumienie danych do przechwycenia, np. instrukcje urządzenia czy ślady runtime, a capture_enabled_for_nc wskazuje, które NeuronCore’y mają być śledzone. Ustawienie correlate_device_time=True sprawia, że czas urządzenia jest propagowany do tabeli key_averages(), dzięki czemu można bezpośrednio porównać czas CPU z czasem na urządzeniu Neuron.
Do wizualnej analizy wyników służy Neuron Explorer — przeglądarkowe narzędzie pokazujące ślad systemowy, oś czasu urządzenia oraz podział na poszczególne silniki obliczeniowe. Dostęp do niego można uzyskać przez tunel SSH lub rozszerzenie Visual Studio Code. Po zakończeniu profilowania katalog wyjściowy zawiera ślad systemowy, a przy przechwytywaniu danych urządzenia — sparowane pliki .neff i .ntff. Plik NEFF (Neuron Executable File Format) zawiera skompilowany kod wykonywalny Neuron, a odpowiadający mu NTFF — ślad instrukcji sprzętowych. Oba pliki łączy wspólny hash numeryczny identyfikujący je jako parę. Do analizy pełnego profilu systemowego wgrywa się cały katalog wyjściowy, a dla profilu dotyczącego wyłącznie urządzenia — pojedynczo pliki .neff i .ntff.
Jako pierwszy przykład analizy autorzy wybrali RMSNorm — niewielką operację o jasnej sekwencji działań arytmetycznych i redukcji, co ułatwia prześledzenie przepływu obliczeń. Profilowane są trzy warianty:
torch.rms_norm(), która jest redukowana do pojedynczego, zintegrowanego kernela Neuron.torch.compile.Wszystkie skrypty korzystają z identycznych danych wejściowych, tej samej konfiguracji profilera i tego samego harmonogramu, dzięki czemu wyniki są bezpośrednio porównywalne. Pierwszą implementację autorzy pokazują na konkretnym fragmencie kodu: tensor wejściowy jest mnożony przez samego siebie, następnie liczona jest średnia kwadratów wzdłuż ostatniego wymiaru, potem odwrotność pierwiastka z sumy średniej kwadratów i epsilonu (1e-6), a na końcu wynik jest mnożony przez wagę. Każda linia tej funkcji odpowiada jednej lub kilku operacjom ATen i może tworzyć tensory pośrednie, co ma znaczenie przy analizie zużycia pamięci i czasu.
Wywołanie profilera wymaga dwóch dodatkowych argumentów specyficznych dla backendu Neuron: aktywności ProfilerActivity.PrivateUse1 do zbierania danych z urządzenia Neuron oraz przekazania NeuronConfig jako experimental_config, co włącza funkcje Kineto właściwe dla Neurona. Harmonogram profilowania wykorzystuje parametry wait=2, warmup=1 i active=1 w czterech wywołaniach prof.step(), co pozwala zarejestrować jedną „rozgrzaną” iterację bez wliczania narzutu związanego z początkową inicjalizacją. Kluczowe jest też wywołanie torch.neuron.synchronize() wewnątrz pętli profilującej — bez tej synchronizacji profiler może wyeksportować dane, zanim urządzenie zakończy obliczenia, przez co kolumna czasu Neurona pozostanie pusta.
Artykuł kończy się zapowiedzią dalszej analizy wyników dla poszczególnych implementacji, lecz tekst źródłowy zostaje w tym miejscu skrócony — pełna interpretacja tabeli key_averages() i porównanie sygnałów w Neuron Explorer dla wszystkich trzech wariantów RMSNorm ma zostać omówiona w dalszej części materiału.
Pierwsza część serii o profilowaniu TorchNeuron dostarcza więc solidnych podstaw: pokazuje, jak skonfigurować profiler na Trainium, jak czytać kluczowe metryki wydajnościowe oraz jak przygotować porównywalne eksperymenty na przykładzie RMSNorm — fundament pod bardziej zaawansowaną analizę wydajności modeli na infrastrukturze AWS.

Sądy w Monachium i Aachen uznały Google za odpowiedzialne za fałszywe twierdzenia generowane przez AI Overviews i AI Mode w wyszukiwarce.
Simon Willison zaktualizował llm-echo – debugowy plugin do LLM symulujący model AI, który teraz dokładniej liczy tokeny narzędzi i rozumowania.

Dokumenty sądowe pokazują, że bankructwo Character.AI było elementem umowy z Disneyem, który przejął pracowników, omijając pozwy i odpowiedzialność prawną.