graf obliczeniowy

Zapisany w pliku modelu opis kolejności operacji: co przez co pomnożyć, co dodać, co znormalizować. Mówi, co ma wyjść, ale nie mówi, jak to policzyć — dopisanie tej drugiej warstwy jest zadaniem runtime'u i to w niej powstaje większość różnicy w wydajności.

W Polsce nazywane też:

graf obliczeniowygraf operacjiplan wykonania modelu

W pliku z modelem są dwie rzeczy: miliardy liczb ułożonych w macierze i opis kolejności, w jakiej te macierze mają być przez siebie przemnożone. Ta druga część nazywa się grafem obliczeniowym.

Czym jest graf obliczeniowy

Graf obliczeniowy to formalny opis operacji składających się na przejście modelu od wejścia do wyjścia: weź wektor, pomnóż przez tę macierz, dodaj tamten wektor, znormalizuj wynik, przepuść przez funkcję aktywacji, powtórz całość tyle razy, ile model ma warstw. Węzłami grafu są operacje, krawędziami przepływ danych.

Czego w grafie nie ma

Warto zauważyć, czego ten opis nie zawiera. Nie ma informacji, w jakiej kolejności fizycznie czytać dane z pamięci. Nie ma podziału pracy między rdzenie. Nie ma decyzji, czy dwie sąsiadujące operacje wykonać osobno, czy za jednym zamachem. Nie ma nic o tym, jakim sprzętem to policzyć.

Graf mówi, co ma wyjść. Nie mówi, jak to zrobić.

To różnica między listą składników a organizacją kuchni. Przepis mówi, że trzeba pokroić cebulę i ją zeszklić. Nie mówi, czy przygotować wszystko wcześniej na deskach, czy biegać do lodówki po każdy składnik osobno. Danie wyjdzie identyczne, czas nie.

Jądra obliczeniowe

Runtime przepisuje graf na jądra obliczeniowe — gotowe procedury napisane pod konkretną architekturę sprzętu, realizujące jedną operację lub ich sekwencję. Jedna operacja w grafie może odpowiadać kilkunastu różnym jądrom, z których runtime wybiera to najlepsze dla danego kształtu danych i danej karty.

Właśnie dlatego ten sam graf skompilowany przez dwie różne implementacje daje identyczny wynik liczbowy w czasie różniącym się wielokrotnie.

Gdzie się z tym spotkasz

Najczęstszym formatem wymiany grafów jest ONNX — otwarty standard pozwalający wyeksportować model z jednego frameworka i uruchomić go w innym środowisku, w tym w przeglądarce. Eksport do ONNX-a to w praktyce zamrożenie grafu wraz z wagami w jednym przenośnym pliku.

fuzja operatorówOptymalizacja polegająca na wykonaniu kilku sąsiadujących operacji grafu za jednym podejściem, bez odkładania wyników pośrednich do pamięci głównej. Nie zmienia wyniku liczbowego — zmienia liczbę odczytów i zapisów, a ponieważ to one są wąskim gardłem, daje wielokrotne przyspieszenie.silnik wnioskowaniaProgram, który wczytuje plik z wagami, kompiluje graf obliczeniowy pod konkretny sprzęt, rezerwuje pamięć i wykonuje pętlę generowania. Ten sam model uruchomiony przez dwa różne runtime'y daje tę samą odpowiedź w czasie różniącym się wielokrotnie.mechanizm uwagiMechanizm, w którym reprezentacja każdego tokenu jest aktualizowana na podstawie pozostałych tokenów sekwencji, według wyliczonych wag. Działa równolegle w wielu głowach. Porównuje każdą pozycję z każdą, więc koszt rośnie kwadratowo z długością kontekstu.wnioskowanie modeluUżycie wytrenowanego modelu do wygenerowania odpowiedzi, przy zamrożonych wagach. Dzieli się na przetworzenie promptu i sekwencyjne generowanie token po tokenie — stąd różne stawki za tokeny wejściowe i wyjściowe oraz to, że długa odpowiedź kosztuje czasowo więcej niż długi prompt.transformerArchitektura sieci neuronowej oparta na mechanizmie uwagi, opisana w 2017 roku i stanowiąca podstawę dzisiejszych dużych modeli. Przetwarza całą sekwencję równolegle, co umożliwiło trening na dużą skalę. Wagi są zamrożone po treningu — model nie zapisuje niczego podczas rozmowy.