Dweve

Core od środka: ponad 2 900 operacji na 12 backendach

Setki tysięcy ręcznie dostrajanych jąder. Ponad 2900 operacji w 76 kategoriach. 25 formatów liczbowych i 12 backendów. Poznaj Core — fundament obliczeniowy...

Core od środka: ponad 2 900 operacji na 12 backendach

Co mówi liczba operacji

Mnożenie macierzy brzmi jak pojedyncze zadanie. Jego implementacja zależy jednak od znaczenia wartości, sposobu ich przechowywania, akumulacji wyników pośrednich i sprzętu wykonującego obliczenia. Macierz z upakowanymi wartościami binarnymi i macierz zmiennoprzecinkowa mogą realizować tę samą abstrakcyjną operację, ale wymagają innych reguł numerycznych i innego kodu.

Core to fundament obliczeniowy Dweve, przeznaczony do trenowania i wnioskowania. Jego publiczny katalog obejmuje setki tysięcy ręcznie dostrajanych jąder dla ponad 2 900 operacji w 76 kategoriach, 25 formatach liczbowych i 12 backendach. Te liczby opisują różne części systemu. Operacja określa obliczenie. Format liczbowy definiuje reprezentację. Backend wskazuje cel wykonania. Jądro implementuje konkretne połączenie tych wyborów.

Ważniejsze od traktowania katalogu jako jednej wielkiej liczby funkcji jest zrozumienie tych różnic. Deweloper musi wiedzieć, czy potrzebna kombinacja jest dostępna i jaki kontrakt ją określa.

Ponad 2900 operacji w 76 kategoriach; 25 formatów liczbowych; 12 backendów. Setki tysięcy ręcznie dostrajanych jąder realizują obsługiwane warianty wykonania.

Obliczenie i jego reprezentacja idą w parze

Weźmy redukcję: zbiór wartości jest łączony w jeden wynik. Samo słowo „suma” nie odpowiada na kilka pytań. Czy dane wejściowe to liczby całkowite ze znakiem, wartości stałoprzecinkowe czy zmiennoprzecinkowe? W jakiej reprezentacji przechowywany jest wynik pośredni? Co się dzieje, gdy kolejna wartość nie mieści się w tej reprezentacji?

Core wiąże te wybory z operacją. Kontrakt wykonania obejmuje typ danych, szerokość, pakowanie, akumulator, backend, zestaw instrukcji, politykę dispatchu i tryb determinizmu. Zmiana któregokolwiek z tych elementów może zmienić znaczenie obliczenia, nawet jeśli nazwa operacji pozostaje taka sama.

Wśród 25 formatów liczbowych są rodziny binarne, trójwartościowe, całkowitoliczbowe, stałoprzecinkowe, adaptacyjne i zmiennoprzecinkowe. Nazwa rodziny to dopiero punkt wyjścia do opisu arytmetyki. Znaczenie mają także szerokość, znak, skala i układ danych w pamięci. Katalog należy więc rozumieć jako zbiór obsługiwanych kombinacji, a nie obietnicę, że każda operacja działa w każdym możliwym formacie na każdym celu wykonania.

Dlatego format wymiany nie rozstrzyga wszystkich kwestii wykonania. ONNX opisuje graf obliczeń z typowanymi danymi wejściowymi, wyjściowymi i operatorami. Daje systemom wspólny opis modelu, ale środowisko uruchomieniowe nadal musi zaimplementować te operatory. Dokumentacja pojęć ONNX wyjaśnia różnicę między reprezentacją grafu a jego wykonaniem.

Wybory dotyczące wykonania odczytuj przez pryzmat operacji, reprezentacji, akumulatora, backendu i reguł odtwarzania. Diagram pokazuje reprezentatywny wycinek, a nie macierz pokrycia.

12 backendów i jawne wybory wykonania

12 backendów Core obejmuje wykonanie skalarne, zestawy instrukcji CPU oraz cele GPU i przenośne. Publiczna lista obejmuje Scalar, SSE2, AVX2, AVX-512, NEON, SVE2, CUDA, ROCm, Metal, Vulkan, WebGPU i WASM. Są to ścieżki wykonania w Core, a nie osobne wersje modelu.

Dispatch wybiera na bieżącym hoście obsługiwaną implementację danej operacji i jej kontraktu wykonania. Wybrana ścieżka jest zapisywana wraz z komórką wykonania, hostem i uzasadnieniem. Dzięki temu można sprawdzić, jakie wybory faktycznie podjęto podczas uruchomienia.

Przenośność ma swoje granice. Dokumentacja WebAssembly rozróżnia przenośny format binarny od interfejsów API udostępnianych przez środowisko hosta. Przeglądarka i środowisko poza przeglądarką mogą udostępniać różne interfejsy. Dokumentacja przenośności WebAssembly pomaga zrozumieć tę różnicę. Sama nazwa backendu nie mówi, w jakim środowisku działa aplikacja.

Miejsce Core w Dweve

Core korzysta z biblioteki primitives, która dostarcza podstawowe operacje, i włącza je do systemu obliczeniowego. Loom jest zbudowany na Core i używa biblioteki solvers do rozumowania. Każda część ma jasno określoną rolę: primitives dostarcza podstawowe operacje, Core wykonuje obliczenia, a Loom buduje na tym fundamencie proces rozumowania.

Dweve jest usługą. Fabric to jej API i portal, przez które użytkownicy i aplikacje uzyskują do niej dostęp. Fabric nie przejmuje roli obliczeniowej Core ani roli Loom w zakresie rozumowania. Interfejs i systemy, które za nim stoją, służą różnym celom.

Core korzysta z biblioteki primitives. Loom jest zbudowany na Core i używa biblioteki solvers. Fabric to API i portal usługi Dweve.

Zacznij od potrzebnego obliczenia

Ocenę systemu obliczeniowego zacznij od konkretnego obliczenia i wymaganej reprezentacji. Następnie ustal, który backend je wykona, jakie obowiązują zasady akumulacji i pakowania oraz jaki kontrakt odtwarzania został zadeklarowany. Dzięki tym pytaniom katalog staje się użyteczny dla zespołu.

Publiczne liczby Core pokazują szerokość katalogu. Kontrakt wykonania wyjaśnia, jak go czytać. Oba aspekty są ważne: jakie zadania obejmuje system i co oznacza użycie konkretnej implementacji.