Skalowanie LLM: Praktyczny przewodnik

Wykorzystanie API do integracji LLM

Integracja modeli językowych (LLM) z kodem może być realizowana na różne sposoby, ale użycie API kompatybilnego z OpenAI jest wysoce zalecane dla wdrożeń produkcyjnych. Takie podejście zapewnia elastyczność w adaptacji do szybko zmieniającego się krajobrazu modeli. Modele, które jeszcze kilka miesięcy temu uważano za najnowocześniejsze, mogą szybko stać się przestarzałe.

Od czasu boomu na sztuczną inteligencję, który rozpoczął się wraz z ChatGPT w 2022 roku, interfejs API OpenAI stał się de facto standardem dla łączenia aplikacji z LLM. Ten standard pozwala programistom budować aplikacje przy użyciu dostępnych zasobów, takich jak rozpoczęcie pracy z Mistral 7B w Llama.cpp na notebooku i płynne przejście do serwerów API Mistral AI w celu wdrożenia produkcyjnego. Eliminuje to bycie przywiązanym do jednego modelu, silnika wnioskowania lub dostawcy API.

Usługi wnioskowania oparte na chmurze zapewniają ekonomiczne środki skalowania wdrożeń AI. Usługi te eliminują potrzebę zarządzania sprzętem i konfigurowania modelu, zamiast tego udostępniają API do integracji aplikacji.

Oprócz ofert API od głównych twórców modeli, rosnąca liczba startupów zajmujących się infrastrukturą AI oferuje wnioskowanie jako usługę dla modeli o otwartych wagach. Dostawcy ci różnią się podejściem. Niektórzy, jak SambaNova, Cerebras i Groq, wykorzystują specjalistyczny sprzęt lub techniki, takie jak spekulatywne dekodowanie, aby przyspieszyć wnioskowanie, ale oferują mniejszy wybór modeli. Inni, jak Fireworks AI, obsługują wdrażanie niestandardowych, precyzyjnie dostrojonych modeli przy użyciu adapterów Low Rank Adaptation (LoRA). Różnorodność ekosystemu AI wymaga dokładnego researchu przed podjęciem decyzji o konkretnym dostawcy.

Rozważania dotyczące wdrożenia LLM na miejscu

W sytuacjach, gdy podejścia oparte na chmurze są niemożliwe ze względu na prywatność, przepisy prawne lub istniejące ograniczenia infrastrukturalne (np. firma zainwestowała już w serwery GPU), konieczne staje się wdrożenie na miejscu. Może to stwarzać kilka wyzwań. Niektóre z typowych pytań, które się pojawiają, to:

  • Wybór modelu: Odpowiedni model zależy od konkretnego przypadku użycia. Model przeznaczony dla chatbota obsługi klienta będzie miał inne wymagania niż model używany do generowania rozszerzonego o pobieranie lub jako asystent kodu. Zaleca się poświęcenie czasu z dostawcami API, aby zidentyfikować model, który spełnia potrzeby.
  • Wymagania sprzętowe: Określenie niezbędnego sprzętu ma kluczowe znaczenie, ponieważ procesory graficzne są drogie i mogą być trudne do zdobycia. Sam model może dostarczyć informacji na temat sprzętu potrzebnego do jego uruchomienia. Większe modele wymagają więcej sprzętu. Zgrubne oszacowanie minimalnej pamięci GPU można obliczyć, mnożąc liczbę parametrów (w miliardach) przez 2 GB dla modeli trenowanych z 16-bitową precyzją. Dla modeli 8-bitowych potrzeba 1 GB na miliard parametrów. Techniki kompresji modelu, takie jak kwantyzacja, mogą zmniejszyć to do 512 MB na miliard parametrów. Jest to dolna granica. Dodatkowa pamięć jest potrzebna do obsługi modelu dla wielu użytkowników jednocześnie ze względu na pamięć podręczną klucz-wartość, która działa jak pamięć krótkotrwała modelu. Macierz wsparcia Nvidia oferuje wskazówki dotyczące procesorów graficznych potrzebnych do uruchomienia różnych modeli.
  • Redundancja: Oprócz doboru sprzętu do modelu, należy wziąć pod uwagę redundancję. Pojedynczy węzeł GPU jest podatny na awarie, dlatego ważne jest wdrożenie dwóch lub więcej systemów w celu przełączenia awaryjnego i równoważenia obciążenia.
  • Metody wdrażania: Modele LLM można wdrażać i obsługiwać w produkcji różnymi metodami: bare metal z modułami równoważenia obciążenia, maszyny wirtualne lub kontenery w Dockerze lub Kubernetes. Kubernetes upraszcza wdrożenia na dużą skalę, automatyzując tworzenie kontenerów, obsługę sieci i równoważenie obciążenia.

Kubernetes do wdrażania LLM

Kubernetes abstrahuje od dużej części złożoności związanej z wdrożeniami na dużą skalę, automatyzując tworzenie kontenerów, obsługę sieci i równoważenie obciążenia. Wiele przedsiębiorstw już wdrożyło i rozumie Kubernetes. Nvidia, Hugging Face i inni preferują konteneryzowane środowiska z Nvidia Inference Microservices (NIM) i Hugging Face Generative AI Services (HUGS), wstępnie skonfigurowane dla typowych obciążeń i wdrożeń.

Silniki wnioskowania

Dostępne są różne silniki wnioskowania do uruchamiania modeli, w tym Ollama i Llama.cpp, które są kompatybilne z szeroką gamą sprzętu. Do skalowania modeli często używane są biblioteki takie jak vLLM, TensorRT LLM, SGLang i PyTorch. Ten przewodnik koncentruje się na wdrażaniu modeli przy użyciu vLLM, ponieważ obsługuje on szeroki wybór popularnych modeli i oferuje szerokie wsparcie i kompatybilność w zakresie Nvidia, AMD i innych sprzętów.

Przygotowanie środowiska Kubernetes

Konfiguracja środowiska Kubernetes do pracy z procesorami graficznymi wymaga dodatkowych sterowników i zależności w porównaniu z typową konfiguracją Kubernetes. Proces konfiguracji będzie się różnił dla sprzętu AMD i Nvidia.

Ten przewodnik wykorzystuje K3S w konfiguracji jednowęzłowej. Podstawowe kroki są podobne do środowisk wielowęzłowych, ale zależności muszą być spełnione w każdym węźle roboczym GPU, a konfiguracja pamięci masowej może wymagać dostosowania.

Celem jest zapewnienie solidnej podstawy do wdrażania obciążeń wnioskowania w sposób przyjazny dla produkcji. Wymagane są następujące wymagania wstępne:

  • Serwer lub stacja robocza z co najmniej jedną obsługiwaną płytą GPU AMD lub Nvidia
  • Świeża instalacja Ubuntu 24.04 LTS

Zależności Nvidia

Konfiguracja środowiska K3S akcelerowanego przez Nvidia wymaga zainstalowania sterowników CUDA Fabric Manager i sterowników serwera Headless. Zainstaluj narzędzia serwerowe Nvidia do debugowania problemów ze sterownikami. Ponadto, aby zapewnić stabilność i kompatybilność, należy zweryfikować wersje CUDA, sterowników Nvidia i bibliotek CUDA. Użyj narzędzia nvidia-smi, aby sprawdzić wersję sterownika i upewnij się, że jest ona kompatybilna z wersją CUDA wymaganą przez vLLM. Często zdarza się, że sterowniki dostarczane z Ubuntu są starsze niż wymagane, co prowadzi do problemów ze zgodnością. W takim przypadku konieczne jest ręczne zainstalowanie nowszych sterowników ze strony internetowej Nvidia lub za pośrednictwem repozytorium CUDA. Dokładne śledzenie wersji sterowników i bibliotek CUDA jest niezbędne do uniknięcia frustrujących problemów w środowisku Kubernetes. Aktualizacja sterowników Nvidia w środowisku produkcyjnym powinna być traktowana z ostrożnością, ponieważ niezgodności mogą prowadzić do przestojów. Zaleca się przetestowanie nowych sterowników w środowisku testowym przed wprowadzeniem ich do produkcji. Ponadto, warto rozważyć użycie menedżera pakietów, takiego jak apt, do zarządzania sterownikami Nvidia, aby zapewnić spójność i ułatwić aktualizacje.

Konfiguracja K3S

Po zainstalowaniu sterowników Nvidia i zweryfikowaniu kompatybilności, następnym krokiem jest instalacja K3S. Wybierz wersję K3S zgodną z Twoim środowiskiem i postępuj zgodnie z oficjalnymi instrukcjami instalacji. Podczas instalacji K3S należy upewnić się, że K3S jest skonfigurowany do korzystania z procesorów graficznych. Osiąga się to poprzez ustawienie odpowiednich flag podczas instalacji K3S. Na przykład, można użyć flagi --gpu podczas instalacji K3S, aby włączyć obsługę GPU. Po zainstalowaniu K3S należy zweryfikować, czy K3S poprawnie wykrywa procesory graficzne. Można to zrobić, sprawdzając węzły K3S i upewniając się, że procesory graficzne są wymienione jako zasoby dostępne. Ponadto, należy zainstalować Nvidia Container Toolkit, który pozwala Kubernetes na dostęp do procesorów graficznych. Nvidia Container Toolkit zapewnia zestaw narzędzi i bibliotek, które pozwalają kontenerom na korzystanie z procesorów graficznych. Po zainstalowaniu Nvidia Container Toolkit, należy ponownie uruchomić K3S, aby zmiany zostały uwzględnione.

Wdrażanie vLLM

Po skonfigurowaniu środowiska Kubernetes i zweryfikowaniu wykrywania procesorów graficznych, można wdrożyć vLLM. vLLM można wdrożyć przy użyciu różnych metod, takich jak Helm lub YAML. Helm to menedżer pakietów dla Kubernetes, który upraszcza wdrażanie aplikacji. YAML to język serializacji danych, który jest używany do definiowania konfiguracji aplikacji Kubernetes. Podczas wdrażania vLLM należy określić zasoby GPU, których vLLM powinien używać. Osiąga się to poprzez ustawienie limitów i żądań GPU w pliku YAML vLLM. Ponadto, należy skonfigurować vLLM do korzystania z odpowiedniego modelu. Można to zrobić, ustawiając zmienne środowiskowe vLLM. Po wdrożeniu vLLM należy zweryfikować, czy vLLM działa poprawnie. Można to zrobić, sprawdzając dzienniki vLLM i upewniając się, że nie ma błędów. Ponadto, można wysłać żądanie do vLLM i upewnić się, że zwraca poprawną odpowiedź.

Optymalizacja wydajności

Po wdrożeniu vLLM można zoptymalizować jego wydajność. Istnieje wiele sposobów na optymalizację wydajności vLLM, takich jak:

  • Dostrajanie parametrów vLLM: vLLM ma wiele parametrów, które można dostroić, aby poprawić jego wydajność. Na przykład, można dostroić rozmiar partii, szybkość uczenia i liczbę epok.
  • Użycie kwantyzacji: Kwantyzacja to technika, która zmniejsza rozmiar modelu poprzez zmniejszenie precyzji wag modelu. Może to poprawić wydajność vLLM, ale może również zmniejszyć jego dokładność.
  • Użycie destylacji: Destylacja to technika, która szkoli mniejszy model, aby naśladować zachowanie większego modelu. Może to poprawić wydajność vLLM, ale może również zmniejszyć jego dokładność.
  • Użycie przyśpieszenia GPU: vLLM można przyspieszyć za pomocą GPU. Może to znacznie poprawić jego wydajność, zwłaszcza w przypadku dużych modeli.
  • Równoważenie obciążenia: Równoważenie obciążenia może pomóc w dystrybucji obciążenia vLLM na wiele węzłów. Może to poprawić wydajność vLLM, zwłaszcza w przypadku dużego ruchu.
  • Autoskalowanie: Autoskalowanie może pomóc w automatycznym skalowaniu vLLM w oparciu o obciążenie. Może to poprawić wydajność vLLM, zwłaszcza w przypadku zmiennego ruchu.
  • Monitorowanie: Monitorowanie może pomóc w identyfikacji wąskich gardeł wydajności vLLM. Może to pomóc w optymalizacji wydajności vLLM.
  • Buforowanie: Buforowanie może pomóc w zmniejszeniu obciążenia vLLM poprzez buforowanie często żądanych odpowiedzi. Może to poprawić wydajność vLLM, zwłaszcza w przypadku wysokiego ruchu.
  • Kompresja: Kompresja może pomóc w zmniejszeniu rozmiaru żądań i odpowiedzi vLLM. Może to poprawić wydajność vLLM, zwłaszcza w przypadku wolnych sieci.

Bezpieczeństwo

Podczas wdrażania vLLM należy wziąć pod uwagę względy bezpieczeństwa. Istnieje wiele sposobów na zabezpieczenie vLLM, takich jak:

  • Użycie uwierzytelniania: Uwierzytelnianie może pomóc w zweryfikowaniu tożsamości użytkowników uzyskujących dostęp do vLLM.
  • Użycie autoryzacji: Autoryzacja może pomóc w kontrolowaniu, do których zasobów użytkownicy mają dostęp.
  • Użycie szyfrowania: Szyfrowanie może pomóc w ochronie danych przesyłanych między użytkownikami a vLLM.
  • Użycie zapory: Zapora może pomóc w ochronie vLLM przed nieautoryzowanym dostępem.
  • Użycie systemu wykrywania włamań: System wykrywania włamań może pomóc w wykrywaniu i zapobieganiu atakom na vLLM.
  • Regularne aktualizacje: Regularne aktualizacje mogą pomóc w załataniu luk w zabezpieczeniach vLLM.
  • Ograniczanie dostępu: Ograniczanie dostępu do wrażliwych danych i konfiguracji vLLM tylko dla upoważnionego personelu.
  • Monitorowanie logów: Regularne monitorowanie logów vLLM w poszukiwaniu podejrzanych aktywności i potencjalnych naruszeń bezpieczeństwa.
  • Testowanie penetracyjne: Przeprowadzanie regularnych testów penetracyjnych w celu zidentyfikowania i załatania luk w zabezpieczeniach.

Aktualizacje i konserwacja

Regularne aktualizacje i konserwacja są niezbędne, aby zapewnić prawidłowe działanie vLLM. Istnieje wiele sposobów na aktualizację i konserwację vLLM, takich jak:

  • Aktualizacja vLLM do najnowszej wersji: Aktualizacja vLLM do najnowszej wersji może pomóc w załataniu luk w zabezpieczeniach i poprawie wydajności.
  • Regularne tworzenie kopii zapasowych danych vLLM: Regularne tworzenie kopii zapasowych danych vLLM może pomóc w przywróceniu danych w przypadku awarii.
  • Monitorowanie dzienników vLLM pod kątem błędów: Monitorowanie dzienników vLLM pod kątem błędów może pomóc w identyfikacji i rozwiązywaniu problemów.
  • Sprawdzanie użycia zasobów vLLM: Sprawdzanie użycia zasobów vLLM może pomóc w identyfikacji i rozwiązywaniu problemów z wydajnością.
  • Optymalizacja konfiguracji vLLM: Optymalizacja konfiguracji vLLM może pomóc w poprawie jego wydajności i stabilności.
  • Regularne restartowanie vLLM: Regularne restartowanie vLLM może pomóc w zwolnieniu zasobów i poprawie jego stabilności.
  • Automatyzacja zadań: Automatyzacja powtarzalnych zadań konserwacyjnych, takich jak tworzenie kopii zapasowych i restartowanie, w celu zmniejszenia obciążenia administracyjnego.
  • Dokumentacja: Utrzymywanie aktualnej dokumentacji konfiguracji, wdrożenia i procedur rozwiązywania problemów z vLLM.

Wdrożenie LLM w środowisku produkcyjnym to złożony proces, ale postępując zgodnie z tym przewodnikiem, możesz przygotować się do sukcesu. Kluczowe jest dokładne planowanie, testowanie i monitorowanie systemu LLM, aby zapewnić jego prawidłowe działanie i spełnienie Twoich potrzeb biznesowych. Pamiętaj o ciągłym dostrajaniu i optymalizacji, aby utrzymać optymalną wydajność w miarę rozwoju Twojego środowiska i potrzeb.