Premiera / Narzędzie
Tokenizer 1000 razy szybszy od HuggingFace. Pytanie, czy tokenizacja w ogóle cię spowalnia.
Marcel Rød wypuścił Gigatoken, otwarty tokenizer, który na 144-rdzeniowym AMD EPYC przerabia tekst z prędkością 24,53 GB/s, około 1000 razy szybciej niż biblioteka HuggingFace. Inżynieria jest prawdziwa: ręcznie przepisane instrukcje SIMD, wycięte rozgałęzienia i większa pamięć podręczna policzonych słów. Rekordowe mnożniki dotyczą jednak tylko modeli BPE, a tryb prostego zamiennika zjada część przyspieszenia. Prawdziwe pytanie brzmi, czy tokenizacja to twoje wąskie gardło: przy wywołaniach przez API prawie nigdy, bo Gigatoken liczy się dopiero przy hurtowym przerobie danych treningowych.
Napisała AI, żeby oszczędzić Ci czytania setek źródeł. · Jak to działa
Premiera / Narzędzie · 4 min ·
Model językowy nie widzi tekstu, tylko liczby. Między jednym a drugim stoi tokenizer: program, który tnie tekst na drobne tokeny, zwykle fragmenty słów, i zamienia każdy z nich na numer ze słownika. Robi to raz na całym korpusie przed trenowaniem i jeszcze raz przy każdym wywołaniu modelu, a dla większości z nas jest zupełnie niewidzialny, bo działa wystarczająco szybko.
Marcel Rød wypuścił Gigatoken, otwarty tokenizer, który według jego pomiarów potrafi być do około 1000 razy szybszy od tego, czego używa HuggingFace. Konkretnie: na 144-rdzeniowym procesorze AMD EPYC tokenizer GPT-2 przerabia u niego tekst z prędkością 24,53 GB/s, podczas gdy biblioteka HuggingFace robi to z prędkością 24,8 MB/s. Instalujesz to przez pip install gigatoken i na papierze podmieniasz jedną bibliotekę na drugą. Liczba brzmi absurdalnie, więc od razu powiem, jak to widzę: inżynieria jest prawdziwa i robi wrażenie, ale hasło o zamienniku 1000× obiecuje przeciętnemu deweloperowi znacznie więcej, niż ten realnie dostanie.
Zacznę od tego, co w tych liczbach uczciwe. Punktem odniesienia nie jest żaden wolny kod napisany w Pythonie. Zarówno tokenizery HuggingFace, jak i tiktoken od OpenAI działają już na wielowątkowym Rust, więc Rød nie ścigał się z wolniejszym językiem, tylko pobił Rust Rustem. Najwięcej wyciągnął z etapu, który większość tokenizerów oddaje silnikowi wyrażeń regularnych, czyli ze wstępnego dzielenia tekstu na kawałki, zanim zacznie się właściwe kodowanie. Przepisał to ręcznie na instrukcje SIMD, gdzie jedna operacja procesora przetwarza naraz wiele bajtów zamiast jednego, wyciął z kodu rozgałęzienia, przez co procesor nie musi zgadywać, którą ścieżką pójdzie wykonanie, i mocno rozbudował zapamiętywanie już policzonych słów. To ostatnie brzmi banalnie, a jest najtrudniejsze: w prawdziwym tekście garść słów powtarza się bez końca, a ogromna reszta pojawia się rzadko, przez co taka pamięć podręczna puchnie błyskawicznie i łatwo zaczyna bardziej szkodzić, niż pomagać.
Czytaj dalej za darmo
Podaj e-mail, aby odblokować pełną treść i cały serwis. Zapiszemy Cię do newslettera.