Zoptymalizuj koszty wdrożenia podstawowych modeli Amazon SageMaker JumpStart z asynchronicznymi punktami końcowymi Amazon SageMaker | Usługi internetowe Amazona

Zoptymalizuj koszty wdrożenia podstawowych modeli Amazon SageMaker JumpStart z asynchronicznymi punktami końcowymi Amazon SageMaker | Usługi internetowe Amazona

Sukces generatywnych zastosowań sztucznej inteligencji w wielu branżach przyciągnął uwagę i zainteresowanie firm na całym świecie, które chcą odtworzyć i prześcignąć osiągnięcia konkurencji lub rozwiązać nowe, ekscytujące przypadki użycia. Klienci ci szukają podstawowych modeli, takich jak TII Falcon, Stable Diffusion XL lub GPT-3.5 OpenAI, jako silników napędzających innowacje generatywnej sztucznej inteligencji.

Modele podstawowe to klasa generatywnych modeli sztucznej inteligencji, które dzięki ogromnej ilości nieustrukturyzowanych danych są w stanie zrozumieć i wygenerować treści przypominające ludzkie. Modele te zrewolucjonizowały różne zadania związane z widzeniem komputerowym (CV) i przetwarzaniem języka naturalnego (NLP), w tym generowanie obrazów, tłumaczenie i odpowiadanie na pytania. Służą jako elementy konstrukcyjne wielu zastosowań sztucznej inteligencji i stały się kluczowym elementem w rozwoju zaawansowanych inteligentnych systemów.

Jednakże wdrożenie modeli podstawowych może wiązać się ze znaczącymi wyzwaniami, szczególnie pod względem wymagań dotyczących kosztów i zasobów. Modele te są znane ze swoich rozmiarów, często wahających się od setek milionów do miliardów parametrów. Ich duży rozmiar wymaga dużych zasobów obliczeniowych, w tym wydajnego sprzętu i znacznej pojemności pamięci. W rzeczywistości wdrażanie modeli podstawowych zwykle wymaga co najmniej jednego (często więcej) procesora graficznego, aby skutecznie obsłużyć obciążenie obliczeniowe. Na przykład model TII Falcon-40B Instruct wymaga pomyślnego załadowania do pamięci co najmniej instancji ml.g5.12xlarge, ale najlepiej radzi sobie z większymi instancjami. W rezultacie zwrot z inwestycji (ROI) we wdrażanie i utrzymywanie tych modeli może być zbyt niski, aby udowodnić wartość biznesową, zwłaszcza podczas cykli programistycznych lub w przypadku dużych obciążeń. Wynika to z kosztów bieżących posiadania instancji zasilanych procesorem graficznym podczas długich sesji, potencjalnie 24/7.

Ogłaszaliśmy to na początku tego roku Amazońska skała macierzysta, bezserwerowy interfejs API zapewniający dostęp do podstawowych modeli firmy Amazon i naszych partnerów zajmujących się generatywną sztuczną inteligencją. Chociaż jest obecnie w wersji Private Preview, jego bezserwerowy interfejs API umożliwia korzystanie z podstawowych modeli z Amazon, Anthropic, Stability AI i AI21, bez konieczności samodzielnego wdrażania jakichkolwiek punktów końcowych. Jednak modele open source ze społeczności takich jak Hugging Face bardzo się rozrosły i nie każdy z nich został udostępniony za pośrednictwem Amazon Bedrock.

W tym poście skupiamy się na tych sytuacjach i rozwiązujemy problem ryzykowania wysokich kosztów, wdrażając duże modele podstawowe Amazon Sage Maker asynchroniczne punkty końcowe od Amazon SageMaker JumpStart. Może to pomóc w obniżeniu kosztów architektury, umożliwiając punktowi końcowemu działanie tylko wtedy, gdy żądania znajdują się w kolejce i przez krótki czas życia, przy jednoczesnym skalowaniu do zera, gdy żadne żądania nie oczekują na obsługę. Brzmi to świetnie w wielu przypadkach użycia; jednakże punkt końcowy, który został przeskalowany do zera, wprowadzi czas zimnego startu, zanim będzie można wnioskować.

Omówienie rozwiązania

Poniższy diagram ilustruje naszą architekturę rozwiązania.

Zoptymalizuj koszty wdrożenia podstawowych modeli Amazon SageMaker JumpStart z asynchronicznymi punktami końcowymi Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Wdrażana przez nas architektura jest bardzo prosta:

  • Interfejs użytkownika to notebook, który można zastąpić interfejsem internetowym zbudowanym w technologii Streamlit lub podobnej. W naszym przypadku notatnik jest Studio Amazon SageMaker notebook, działający na instancji ml.m5.large z jądrem procesora PyTorch 2.0 Python 3.10.
  • Notatnik wysyła zapytania do punktu końcowego na trzy sposoby: za pomocą pakietu SageMaker Python SDK, zestawu AWS SDK dla języka Python (Boto3) i LangChain.
  • Punkt końcowy działa asynchronicznie w SageMaker i na punkcie końcowym wdrażamy model Falcon-40B Instruct. Jest to obecnie najnowocześniejszy model pod względem modeli instrukcji i dostępny w SageMaker JumpStart. Pojedyncze wywołanie API pozwala nam wdrożyć model na punkcie końcowym.

Co to jest wnioskowanie asynchroniczne SageMaker

Wnioskowanie asynchroniczne SageMaker to jedna z czterech opcji wdrażania w SageMaker, wraz z punktami końcowymi w czasie rzeczywistym, wnioskowaniem wsadowym i wnioskowaniem bezserwerowym. Aby dowiedzieć się więcej na temat różnych opcji wdrażania, zobacz Wdrażaj modele na potrzeby wnioskowania.

Asynchroniczne wnioskowanie SageMaker kolejkuje przychodzące żądania i przetwarza je asynchronicznie, co czyni tę opcję idealną w przypadku żądań o dużych rozmiarach ładunku, do 1 GB, długim czasie przetwarzania i wymaganiach dotyczących opóźnień w czasie zbliżonym do rzeczywistego. Jednak główną zaletą, jaką zapewnia w przypadku dużych modeli podstawowych, zwłaszcza podczas weryfikacji koncepcji (POC) lub podczas programowania, jest możliwość skonfigurowania wnioskowania asynchronicznego w celu skalowania do zerowej liczby wystąpień, gdy nie ma żądań procesu, oszczędzając w ten sposób koszty. Więcej informacji na temat wnioskowania asynchronicznego SageMaker można znaleźć w artykule Wnioskowanie asynchroniczne. Poniższy diagram ilustruje tę architekturę.

Zoptymalizuj koszty wdrożenia podstawowych modeli Amazon SageMaker JumpStart z asynchronicznymi punktami końcowymi Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Aby wdrożyć punkt końcowy wnioskowania asynchronicznego, należy utworzyć plik AsyncInferenceConfig obiekt. Jeśli tworzysz AsyncInferenceConfig bez określenia argumentów, wartość domyślna S3OutputPath będzie s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} i S3FailurePath będzie s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

Co to jest SageMaker JumpStart

Nasz model pochodzi z SageMaker JumpStart, funkcji SageMaker, która przyspiesza proces uczenia maszynowego (ML), oferując wstępnie wytrenowane modele, szablony rozwiązań i przykładowe notatniki. Zapewnia dostęp do szerokiej gamy wstępnie wyszkolonych modeli dla różnych typów problemów, umożliwiając rozpoczęcie zadań ML z solidnymi podstawami. SageMaker JumpStart oferuje także szablony rozwiązań do typowych zastosowań i przykładowe notesy do nauki. Dzięki SageMaker JumpStart możesz skrócić czas i wysiłek wymagany do rozpoczęcia projektów ML dzięki uruchamianiu rozwiązań jednym kliknięciem i kompleksowym zasobom zapewniającym praktyczne doświadczenie ML.

Poniższy zrzut ekranu przedstawia przykład tylko niektórych modeli dostępnych w interfejsie użytkownika SageMaker JumpStart.

Zoptymalizuj koszty wdrożenia podstawowych modeli Amazon SageMaker JumpStart z asynchronicznymi punktami końcowymi Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Wdróż model

Naszym pierwszym krokiem jest wdrożenie modelu w SageMaker. W tym celu możemy skorzystać z interfejsu użytkownika SageMaker JumpStart lub pakietu SageMaker Python SDK, który udostępnia API, za pomocą którego możemy wdrożyć model w asynchronicznym punkcie końcowym:

%%time
from sagemaker.jumpstart.model import JumpStartModel, AsyncInferenceConfig
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer model_id, model_version = "huggingface-llm-falcon-40b-instruct-bf16", "*"
my_model = JumpStartModel(model_id=model_id)
predictor = my_model.deploy( initial_instance_count=0, instance_type="ml.g5.12xlarge", async_inference_config=AsyncInferenceConfig()
)

Wykonanie tego połączenia może zająć około 10 minut. W tym czasie uruchamiany jest punkt końcowy, kontener wraz z artefaktami modelu jest pobierany do punktu końcowego, ładowana jest konfiguracja modelu z SageMaker JumpStart, następnie asynchroniczny punkt końcowy jest udostępniany poprzez punkt końcowy DNS. Aby mieć pewność, że nasz punkt końcowy będzie mógł skalować się do zera, musimy skonfigurować automatyczne skalowanie na asynchronicznym punkcie końcowym za pomocą automatycznego skalowania aplikacji. Najpierw musisz zarejestrować wariant punktu końcowego za pomocą automatycznego skalowania aplikacji, zdefiniować zasady skalowania, a następnie zastosować zasady skalowania. W tej konfiguracji używamy niestandardowej metryki za pomocą CustomizedMetricSpecification, Zwane ApproximateBacklogSizePerInstance, jak pokazano w poniższym kodzie. Aby zapoznać się ze szczegółową listą Amazon Cloud Watch metryki dostępne w punkcie końcowym wnioskowania asynchronicznego, zobacz Monitorowanie za pomocą CloudWatch.

import boto3 client = boto3.client("application-autoscaling")
resource_id = "endpoint/" + my_model.endpoint_name + "/variant/" + "AllTraffic" # Configure Autoscaling on asynchronous endpoint down to zero instances
response = client.register_scalable_target( ServiceNamespace="sagemaker", ResourceId=resource_id, ScalableDimension="sagemaker:variant:DesiredInstanceCount", MinCapacity=0, # Miminum number of instances we want to scale down to - scale down to 0 to stop incurring in costs MaxCapacity=1, # Maximum number of instances we want to scale up to - scale up to 1 max is good enough for dev
) response = client.put_scaling_policy( PolicyName="Invocations-ScalingPolicy", ServiceNamespace="sagemaker", # The namespace of the AWS service that provides the resource. ResourceId=resource_id, # Endpoint name ScalableDimension="sagemaker:variant:DesiredInstanceCount", # SageMaker supports only Instance Count PolicyType="TargetTrackingScaling", # 'StepScaling'|'TargetTrackingScaling' TargetTrackingScalingPolicyConfiguration={ "TargetValue": 5.0, # The target value for the metric. - here the metric is - SageMakerVariantInvocationsPerInstance "CustomizedMetricSpecification": { "MetricName": "ApproximateBacklogSizePerInstance", "Namespace": "AWS/SageMaker", "Dimensions": [{"Name": "EndpointName", "Value": my_model.endpoint_name}], "Statistic": "Average", }, "ScaleInCooldown": 600, # The amount of time, in seconds, after a scale in activity completes before another scale in activity can start. "ScaleOutCooldown": 300, # ScaleOutCooldown - The amount of time, in seconds, after a scale out activity completes before another scale out activity can start. # 'DisableScaleIn': True|False - indicates whether scale in by the target tracking policy is disabled. # If the value is true, scale in is disabled and the target tracking policy won't remove capacity from the scalable resource. },
)

Możesz sprawdzić, czy ta zasada została pomyślnie ustawiona, przechodząc do konsoli SageMaker i wybierając Punkty końcowe dla Wnioskowanie w okienku nawigacji i szukamy punktu końcowego, który właśnie wdrożyliśmy.

Zoptymalizuj koszty wdrożenia podstawowych modeli Amazon SageMaker JumpStart z asynchronicznymi punktami końcowymi Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Wywołaj asynchroniczny punkt końcowy

Aby wywołać punkt końcowy, musisz umieścić ładunek żądania Usługa Amazon Simple Storage (Amazon S3) i podaj wskaźnik do tego ładunku jako część pliku InvokeEndpointAsync wniosek. Po wywołaniu SageMaker umieszcza żądanie w kolejce do przetworzenia i w odpowiedzi zwraca identyfikator i lokalizację wyjściową. Po przetworzeniu SageMaker umieszcza wynik w lokalizacji Amazon S3. Opcjonalnie możesz wybrać opcję otrzymywania powiadomień o powodzeniu lub błędach Usługa prostego powiadomienia Amazon (Amazonskie SNS).

SageMaker SDK dla Pythona

Po zakończeniu wdrażania zwróci plik AsyncPredictor obiekt. Aby wykonać wnioskowanie asynchroniczne, musisz przesłać dane do Amazon S3 i użyć predict_async() metodę z identyfikatorem URI S3 jako danymi wejściowymi. Zwróci AsyncInferenceResponse obiekt i możesz sprawdzić wynik za pomocą get_response() Metoda.

Alternatywnie, jeśli chcesz okresowo sprawdzać wynik i zwracać go po wygenerowaniu, użyj opcji predict() metoda. Tej drugiej metody używamy w następującym kodzie:

import time # Invoking the asynchronous endpoint with the SageMaker Python SDK
def query_endpoint(payload): """Query endpoint and print the response""" response = predictor.predict_async( data=payload, input_path="s3://{}/{}".format(bucket, prefix), ) while True: try: response = response.get_result() break except: print("Inference is not ready ...") time.sleep(5) print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {response[0]['generated_text']}") query_endpoint(payload)

Boto3

Zbadajmy teraz invoke_endpoint_async metoda z Boto3 sagemaker-runtime klient. Umożliwia programistom asynchroniczne wywoływanie punktu końcowego SageMaker, zapewniając token do śledzenia postępu i późniejszego pobierania odpowiedzi. Boto3 nie oferuje możliwości oczekiwania na zakończenie wnioskowania asynchronicznego, jak w przypadku zestawu SDK SageMaker Python get_result() operacja. Dlatego korzystamy z faktu, że Boto3 będzie przechowywać dane wyjściowe wnioskowania w Amazon S3 w formacie response["OutputLocation"]. Możemy użyć następującej funkcji, aby poczekać, aż plik wnioskowania zostanie zapisany w Amazon S3:

import json
import time
import boto3
from botocore.exceptions import ClientError s3_client = boto3.client("s3") # Wait until the prediction is generated
def wait_inference_file(bucket, prefix): while True: try: response = s3_client.get_object(Bucket=bucket, Key=prefix) break except ClientError as ex: if ex.response['Error']['Code'] == 'NoSuchKey': print("Waiting for file to be generated...") time.sleep(5) next else: raise except Exception as e: print(e.__dict__) raise return response

Dzięki tej funkcji możemy teraz wysłać zapytanie do punktu końcowego:

# Invoking the asynchronous endpoint with the Boto3 SDK
import boto3 sagemaker_client = boto3.client("sagemaker-runtime") # Query the endpoint function
def query_endpoint_boto3(payload): """Query endpoint and print the response""" response = sagemaker_client.invoke_endpoint_async( EndpointName=my_model.endpoint_name, InputLocation="s3://{}/{}".format(bucket, prefix), ContentType="application/json", Accept="application/json" ) output_url = response["OutputLocation"] output_prefix = "/".join(output_url.split("/")[3:]) # Read the bytes of the file from S3 in output_url with Boto3 output = wait_inference_file(bucket, output_prefix) output = json.loads(output['Body'].read())[0]['generated_text'] # Emit output print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {output}") query_endpoint_boto3(payload)

LangChain

LangChain to platforma typu open source uruchomiona w październiku 2022 r. przez Harrisona Chase'a. Upraszcza tworzenie aplikacji wykorzystujących duże modele językowe (LLM), zapewniając integrację z różnymi systemami i źródłami danych. LangChain pozwala na analizę dokumentów, podsumowania, tworzenie chatbotów, analizę kodu i wiele więcej. Zyskał popularność dzięki wkładowi setek deweloperów i znacznemu finansowaniu od firm venture. LangChain umożliwia połączenie LLM ze źródłami zewnętrznymi, umożliwiając tworzenie dynamicznych aplikacji reagujących na dane. Oferuje biblioteki, interfejsy API i dokumentację usprawniające proces programowania.

LangChain udostępnia biblioteki i przykłady wykorzystania punktów końcowych SageMaker w swoim frameworku, ułatwiając korzystanie z modeli ML hostowanych w SageMaker jako „mózgu” łańcucha. Aby dowiedzieć się więcej o integracji LangChain z SageMaker, zapoznaj się z sekcją Punkt końcowy SageMakera w dokumentacji LangChain.

Jednym z ograniczeń obecnej implementacji LangChain jest to, że nie obsługuje ona natywnie asynchronicznych punktów końcowych. Aby użyć asynchronicznego punktu końcowego w LangChain, musimy zdefiniować nową klasę, SagemakerAsyncEndpoint, który przedłuża SagemakerEndpoint klasa już dostępna w LangChain. Dodatkowo podajemy następujące informacje:

  • Wiadro i prefiks S3, w którym wnioskowanie asynchroniczne będzie przechowywać dane wejściowe (i wyjścia)
  • Maksymalna liczba sekund oczekiwania przed upływem limitu czasu
  • An updated _call() funkcja, za pomocą której można wysłać zapytanie do punktu końcowego invoke_endpoint_async() zamiast invoke_endpoint()
  • Sposób na wybudzenie asynchronicznego punktu końcowego, jeśli znajduje się on w fazie zimnego startu (skalowany do zera)

Aby przejrzeć nowo utworzone SagemakerAsyncEndpoint, Można sprawdzić sagemaker_async_endpoint.py filet dostępne na GitHub.

from typing import Dict
from langchain import PromptTemplate
from langchain.llms.sagemaker_endpoint import LLMContentHandler
from langchain.chains import LLMChain
from sagemaker_async_endpoint import SagemakerAsyncEndpoint class ContentHandler(LLMContentHandler): content_type:str = "application/json" accepts:str = "application/json" len_prompt:int = 0 def transform_input(self, prompt: str, model_kwargs: Dict) -> bytes: self.len_prompt = len(prompt) input_str = json.dumps({"inputs": prompt, "parameters": {"max_new_tokens": 100, "do_sample": False, "repetition_penalty": 1.1}}) return input_str.encode('utf-8') def transform_output(self, output: bytes) -> str: response_json = output.read() res = json.loads(response_json) ans = res[0]['generated_text'] return ans chain = LLMChain( llm=SagemakerAsyncEndpoint( input_bucket=bucket, input_prefix=prefix, endpoint_name=my_model.endpoint_name, region_name=sagemaker.Session().boto_region_name, content_handler=ContentHandler(), ), prompt=PromptTemplate( input_variables=["query"], template="{query}", ),
) print(chain.run(payload['inputs']))

Sprzątać

Po zakończeniu testowania generowania wniosków z punktu końcowego pamiętaj o usunięciu punktu końcowego, aby uniknąć dodatkowych opłat:

predictor.delete_endpoint()

Wnioski

Podczas wdrażania dużych modeli podstawowych, takich jak TII Falcon, optymalizacja kosztów ma kluczowe znaczenie. Modele te wymagają wydajnego sprzętu i znacznej pojemności pamięci, co prowadzi do wysokich kosztów infrastruktury. Asynchroniczne wnioskowanie SageMaker, opcja wdrożenia, która przetwarza żądania asynchronicznie, zmniejsza wydatki poprzez skalowanie liczby instancji do zera, gdy nie ma żadnych oczekujących żądań. W tym poście zademonstrowaliśmy, jak wdrożyć duże modele podstawowe SageMaker JumpStart w asynchronicznych punktach końcowych SageMaker. Udostępniliśmy przykłady kodu wykorzystujące SageMaker Python SDK, Boto3 i LangChain, aby zilustrować różne metody wywoływania asynchronicznych punktów końcowych i pobierania wyników. Techniki te umożliwiają programistom i badaczom optymalizację kosztów przy jednoczesnym wykorzystaniu możliwości modeli podstawowych dla zaawansowanych systemów rozumienia języka.

Aby dowiedzieć się więcej o wnioskowaniu asynchronicznym i programie SageMaker JumpStart, zapoznaj się z następującymi postami:


O autorze

Zdjęcie Davide'aDavide Gallitelli jest Specjalistą Architektem Rozwiązań dla AI/ML w regionie EMEA. Ma siedzibę w Brukseli i ściśle współpracuje z klientami w krajach Beneluksu. Jest programistą od najmłodszych lat, zaczął kodować w wieku 7 lat. Zaczął uczyć się AI/ML na uniwersytecie i od tego czasu się w nim zakochał.

Znak czasu:

Więcej z Uczenie maszynowe AWS