Po siedmiu miesiącach prac nad rozwojem, wydano wersję 0.2.0 frameworka OpenZL, przeznaczonego do tworzenia kompresorów danych bez strat.
Framework składa się z podstawowej biblioteki oraz narzędzi do tworzenia wyspecjalizowanych kompresorów opisanych w języku SDDL.
Aby stworzyć dobry wyspecjalizowany kompresor, należy przejść przez dwa etapy:
- Analizę danych, aby wydobyć strukturę.
- Zastosowanie dobrych kompresorów zaplecza, które wykorzystują uzyskaną strukturę w celu osiągnięcia dobrej kompresji.
OpenZL zapewnia narzędzia do obu etapów.
Projekt napisano w językach C i C++ i jest dystrybuowany na licencji BSD.
Główne zmiany
SDDL2
SDDL został całkowicie przepisany od podstaw w celu osiągnięcia zamierzonych celów projektowych. Podczas gdy początkowa wersja demonstracyjna była uproszczonym środowiskiem wykonawczym, to SDDL2 jest pełnoprawnym kompilatorem: parser przekazuje dane analizatorowi semantycznemu, ten zaś przekazuje typowe drzewo abstrakcyjnej składni (AST) do optymalizatora, a optymalizator zarządza generatorem kodu, który generuje bajtowy kod dla maszyny wirtualnej.
Kluczowym rezultatem jest natychmiastowa analiza składniowa. Gdy miejsce zapisu może być w pełni określone tylko przez parametry i stałe, silnik przechodzi bezpośrednio do dowolnego pola, nie skanując poprzednich bajtów, co zapewnia dostęp bez kopiowania i przepustowość na poziomie kilku GB/s.
Sam język rozwijał się razem z zestawem narzędzi. Teraz obsługuje bloki when dla warunkowych lokalizacji, parametryzowane i anonimowe zapisy, dostęp do członków pól zapisu, a także operatory bitowe i logiczne.
Jeśli chodzi o wygodę dla programisty, etap analizy semantycznej teraz ujawnia nieokreślone odniesienia, niespójności typów oraz błędy arności na etapie kompilacji – z wskazaniem lokalizacji w kodzie źródłowym – a także wydano rozszerzenie do VS Code do podświetlania składni plików .sddl.
Nowy wbudowany kodek LZ
W OpenZL teraz wbudowany jest własny kodek LZ, przedstawiony jako ZL_GRAPH_LZ, oraz profil sekwencyjnej kompresji w narzędziu zli. Prace nad kodekiem trwają: wciąż trwa rozszerzanie zestawu funkcji i zwiększanie wydajności przy przetwarzaniu małych danych wejściowych. Obecnie obsługuje funkcjonalność równoważną z zstd na poziomie 1, z rozmiarem okna kompresji wynoszącym 64 KB.
OpenZL umożliwia przekształcenie każdego etapu potoku LZ w celu zwiększenia prędkości. Jego architektura oparta na grafach pozwala również na łączenie etapów kodowania entropijnego, zamiast korzystać z jednego potoku, który sprawdza się w różnych scenariuszach zastosowania. Następnie kilka etapów można połączyć w jedną operację, aby poprawić prędkość przetwarzania. Pozwala to OpenZL osiągnąć o 10% wyższą prędkość kompresji i o 70% wyższą prędkość dekompresji w porównaniu do Zstandard na poziomie 1 w case Silesia w naszych testach:
| Kompresor | Współczynnik kompresji | Prędkość kompresji | Prędkość dekompresji |
|---|---|---|---|
| OpenZL LZ poziom 1 | 2.74 | 466 MB/s | 2288 MB/s |
| Zstd poziom 1 z rozmiarem okna 64K | 2.74 | 419 MB/s | 1254 MB/s |
| Zstd poziom 1 | 2.89 | 424 MB/s | 1345 MB/s |
Wsparcie dla bardzo dużych danych wejściowych
Zli teraz obsługuje przetwarzanie ogromnych danych wejściowych (o wielkości kilku gigabajtów). Przed kompresją takie dane są teraz automatycznie dzielone na fragmenty o kontrolowanej wielkości (domyślnie około 16MB), co pozwala ograniczyć zużycie pamięci, zwiększyć lokalność danych i otworzyć możliwości dla równoległego przetwarzania. W SDDL2 wprowadzono podobną funkcję automatycznego fragmentowania w trybie schematycznym. W procesie stworzono lub zaktualizowano nowe segmentatory – dla CSV, Parquet i standardowych danych liczbowych – a wszystkie segmentatory są teraz serializowalne i konfigurowalne, więc wybrana kompozycja może być zapisana w kompresorze i ponownie użyta później.
Działa to przejrzysto podczas kompresji. Należy pamiętać, że potok uczenia się jest inny i pozostaje nienaruszony, więc nie jest przeznaczony do przyjmowania gigantycznych danych wejściowych jako materiału szkoleniowego.
Ulepszenia w internetowym wizualizatorze grafu (spróbuj)
Teraz wizualizator rozpoznaje ślady kompresji i dekompresji od początku do końca.
Panel podglądu strumienia pozwala na przeglądanie bajtów rzeczywiście przechodzących przez każde łącze, a dzięki elementom sterującym przycinaniem nawet duże strumienie pozostają łatwe do obsługi.
Panel ustawień łączy wszystkie opcje wyświetlania w jednym miejscu, a pełny zestaw skrótów klawiaturowych – nawigacja w kierunkach, uporządkowane przeszukiwanie, rozwijanie i zwijanie oraz wybór węzłów – pozwala wygodnie korzystać z narzędzia bez myszy.
Teraz śledzenia mają wersje, kompresja z podziałem na bloki jest wyświetlana poprawnie, a zli w końcu może generować własne śledzenia za pomocą nowych flag —trace i —trace-streams-dir.
Różne
- Do katalogu dodano kilka kodeków. Kodeki Partition i bitpack teraz korzystają ze zintegrowanego dekodera. Kodek Floating-point bitsplit zyskał specjalne kodery i dekodery dla formatów fp16, fp32, fp64 i bf16 z wyspecjalizowanymi przyspieszeniami. Dodano podział z uwzględnieniem zakresu (split_byrange), multiplexer długości, kodek sentinel, grafikę lz4 oraz małe funkcje pomocnicze, takie jak tryParseInt i splitByParam.
- API zostało uporządkowane.
- Poprawione testy fuzzingowe.
- Poprawiono proces budowy i pakowania dla większej liczby platform.
Źródło: linux.org.ru
