Mengoptimalkan biaya penerapan model fondasi Amazon SageMaker JumpStart dengan titik akhir asinkron Amazon SageMaker | Layanan Web Amazon

Mengoptimalkan biaya penerapan model fondasi Amazon SageMaker JumpStart dengan titik akhir asinkron Amazon SageMaker | Layanan Web Amazon

Keberhasilan penerapan AI generatif di berbagai industri telah menarik perhatian dan minat perusahaan di seluruh dunia yang ingin mereproduksi dan melampaui pencapaian pesaing atau memecahkan kasus penggunaan yang baru dan menarik. Para pelanggan ini sedang mencari model dasar, seperti TII Falcon, Stable Diffusion XL, atau OpenAI GPT-3.5, sebagai mesin yang menggerakkan inovasi AI generatif.

Model dasar adalah kelas model AI generatif yang mampu memahami dan menghasilkan konten mirip manusia, berkat banyaknya data tidak terstruktur yang telah dilatih. Model ini telah merevolusi berbagai tugas computer vision (CV) dan pemrosesan bahasa alami (NLP), termasuk pembuatan gambar, terjemahan, dan menjawab pertanyaan. Mereka berfungsi sebagai landasan bagi banyak aplikasi AI dan telah menjadi komponen penting dalam pengembangan sistem cerdas yang canggih.

Namun, penerapan model pondasi dapat menghadapi tantangan yang signifikan, terutama dalam hal biaya dan kebutuhan sumber daya. Model-model ini dikenal karena ukurannya, seringkali berkisar antara ratusan juta hingga miliaran parameter. Ukurannya yang besar memerlukan sumber daya komputasi yang besar, termasuk perangkat keras yang kuat dan kapasitas memori yang besar. Faktanya, penerapan model dasar biasanya memerlukan setidaknya satu (seringkali lebih) GPU untuk menangani beban komputasi secara efisien. Misalnya, model TII Falcon-40B Instruct memerlukan setidaknya instans ml.g5.12xlarge agar berhasil dimuat ke dalam memori, namun berkinerja paling baik dengan instans yang lebih besar. Akibatnya, laba atas investasi (ROI) dari penerapan dan pemeliharaan model-model ini bisa jadi terlalu rendah untuk membuktikan nilai bisnis, terutama selama siklus pengembangan atau untuk beban kerja yang sulit. Hal ini disebabkan oleh biaya operasional yang dikeluarkan untuk memiliki instance yang didukung GPU untuk sesi yang panjang, mungkin 24/7.

Awal tahun ini, kami mengumumkannya Batuan Dasar Amazon, API tanpa server untuk mengakses model dasar dari Amazon dan mitra AI generatif kami. Meskipun saat ini dalam Pratinjau Pribadi, API tanpa servernya memungkinkan Anda menggunakan model dasar dari Amazon, Anthropic, Stability AI, dan AI21, tanpa harus menerapkan sendiri titik akhir apa pun. Namun, model sumber terbuka dari komunitas seperti Hugging Face telah berkembang pesat, dan tidak semuanya tersedia melalui Amazon Bedrock.

Dalam postingan ini, kami menargetkan situasi ini dan memecahkan masalah risiko biaya tinggi dengan menerapkan model pondasi besar Amazon SageMaker titik akhir asinkron dari Mulai Lompatan Amazon SageMaker. Hal ini dapat membantu memangkas biaya arsitektur, memungkinkan titik akhir untuk berjalan hanya ketika permintaan berada dalam antrean dan dalam waktu singkat, sambil menurunkan skala ke nol ketika tidak ada permintaan yang menunggu untuk dilayani. Ini kedengarannya bagus untuk banyak kasus penggunaan; namun, titik akhir yang diperkecil menjadi nol akan menyebabkan waktu mulai dingin sebelum dapat memberikan kesimpulan.

Ikhtisar solusi

Diagram berikut menggambarkan arsitektur solusi kami.

Mengoptimalkan biaya penerapan model fondasi Amazon SageMaker JumpStart dengan titik akhir asinkron Amazon SageMaker | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Arsitektur yang kami terapkan sangat mudah:

  • Antarmuka pengguna adalah notebook, yang dapat digantikan oleh UI web yang dibangun di Streamlit atau teknologi serupa. Dalam kasus kami, buku catatan adalah sebuah Studio Amazon SageMaker notebook, berjalan pada instance ml.m5.large dengan kernel CPU PyTorch 2.0 Python 3.10.
  • Notebook menanyakan titik akhir dalam tiga cara: SageMaker Python SDK, AWS SDK for Python (Boto3), dan LangChain.
  • Titik akhir berjalan secara asinkron di SageMaker, dan di titik akhir, kami menerapkan model Instruktur Falcon-40B. Saat ini merupakan yang tercanggih dalam hal model instruksi dan tersedia di SageMaker JumpStart. Satu panggilan API memungkinkan kita menerapkan model pada titik akhir.

Apa itu inferensi asinkron SageMaker

Inferensi asinkron SageMaker adalah salah satu dari empat opsi penerapan di SageMaker, bersama dengan titik akhir waktu nyata, inferensi batch, dan inferensi tanpa server. Untuk mempelajari selengkapnya tentang berbagai opsi penerapan, lihat Terapkan model untuk Inferensi.

Inferensi asinkron SageMaker mengantri permintaan masuk dan memprosesnya secara asinkron, menjadikan opsi ini ideal untuk permintaan dengan ukuran muatan besar hingga 1 GB, waktu pemrosesan yang lama, dan persyaratan latensi yang hampir real-time. Namun, keuntungan utama yang diberikannya ketika berhadapan dengan model dasar yang besar, terutama selama pembuktian konsep (POC) atau selama pengembangan, adalah kemampuan untuk mengonfigurasi inferensi asinkron untuk menskalakan ke jumlah instans nol ketika tidak ada permintaan untuk proses, sehingga menghemat biaya. Untuk informasi selengkapnya tentang inferensi asinkron SageMaker, lihat Inferensi asinkron. Diagram berikut mengilustrasikan arsitektur ini.

Mengoptimalkan biaya penerapan model fondasi Amazon SageMaker JumpStart dengan titik akhir asinkron Amazon SageMaker | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Untuk menyebarkan titik akhir inferensi asinkron, Anda perlu membuat AsyncInferenceConfig obyek. Jika Anda membuat AsyncInferenceConfig tanpa menentukan argumennya, defaultnya S3OutputPath akan s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} dan S3FailurePath akan s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

Apa itu SageMaker JumpStart

Model kami berasal dari SageMaker JumpStart, sebuah fitur SageMaker yang mempercepat perjalanan pembelajaran mesin (ML) dengan menawarkan model terlatih, templat solusi, dan buku catatan contoh. Ini memberikan akses ke berbagai model terlatih untuk berbagai jenis masalah, memungkinkan Anda memulai tugas ML dengan dasar yang kuat. SageMaker JumpStart juga menawarkan templat solusi untuk kasus penggunaan umum dan contoh buku catatan untuk pembelajaran. Dengan SageMaker JumpStart, Anda dapat mengurangi waktu dan upaya yang diperlukan untuk memulai proyek ML Anda dengan peluncuran solusi sekali klik dan sumber daya komprehensif untuk pengalaman ML praktis.

Tangkapan layar berikut menunjukkan contoh beberapa model yang tersedia di UI SageMaker JumpStart.

Mengoptimalkan biaya penerapan model fondasi Amazon SageMaker JumpStart dengan titik akhir asinkron Amazon SageMaker | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Menyebarkan model

Langkah pertama kami adalah menerapkan model ke SageMaker. Untuk melakukan hal tersebut, kita dapat menggunakan UI untuk SageMaker JumpStart atau SageMaker Python SDK, yang menyediakan API yang dapat kita gunakan untuk men-deploy model ke titik akhir asinkron:

%%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()
)

Panggilan ini memerlukan waktu sekitar 10 menit untuk diselesaikan. Selama waktu ini, titik akhir diputar, kontainer bersama dengan artefak model diunduh ke titik akhir, konfigurasi model dimuat dari SageMaker JumpStart, lalu titik akhir asinkron diekspos melalui titik akhir DNS. Untuk memastikan bahwa titik akhir kita dapat diturunkan skalanya ke nol, kita perlu mengonfigurasi penskalaan otomatis pada titik akhir asinkron menggunakan Application Auto Scaling. Anda harus terlebih dahulu mendaftarkan varian titik akhir Anda ke Application Auto Scaling, menentukan kebijakan penskalaan, lalu menerapkan kebijakan penskalaan. Dalam konfigurasi ini, kami menggunakan metrik khusus CustomizedMetricSpecification, Yang disebut ApproximateBacklogSizePerInstance, seperti yang ditunjukkan pada kode berikut. Untuk daftar detailnya amazoncloudwatch metrik yang tersedia dengan titik akhir inferensi asinkron Anda, lihat Pemantauan dengan 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. },
)

Anda dapat memverifikasi bahwa kebijakan ini telah berhasil ditetapkan dengan membuka konsol SageMaker, memilih Titik akhir bawah Kesimpulan di panel navigasi, dan mencari titik akhir yang baru saja kita terapkan.

Mengoptimalkan biaya penerapan model fondasi Amazon SageMaker JumpStart dengan titik akhir asinkron Amazon SageMaker | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Panggil titik akhir asinkron

Untuk memanggil titik akhir, Anda perlu memasukkan payload permintaan Layanan Penyimpanan Sederhana Amazon (Amazon S3) dan berikan penunjuk ke payload ini sebagai bagian dari InvokeEndpointAsync meminta. Setelah pemanggilan, SageMaker mengantri permintaan pemrosesan dan mengembalikan pengidentifikasi dan lokasi keluaran sebagai respons. Setelah diproses, SageMaker menempatkan hasilnya di lokasi Amazon S3. Anda juga dapat memilih untuk menerima pemberitahuan sukses atau kesalahan Layanan Pemberitahuan Sederhana Amazon (Amazon SNS).

SDK Python SageMaker

Setelah penerapan selesai, ia akan mengembalikan AsyncPredictor obyek. Untuk melakukan inferensi asinkron, Anda perlu mengunggah data ke Amazon S3 dan menggunakan predict_async() metode dengan URI S3 sebagai inputnya. Ini akan mengembalikan sebuah AsyncInferenceResponse objek, dan Anda dapat memeriksa hasilnya menggunakan get_response() Metode.

Alternatifnya, jika Anda ingin memeriksa hasilnya secara berkala dan mengembalikannya setelah dibuat, gunakan predict() metode. Kami menggunakan metode kedua ini dalam kode berikut:

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)

bot3

Sekarang mari kita jelajahi invoke_endpoint_async metode dari Boto3 sagemaker-runtime klien. Hal ini memungkinkan pengembang untuk memanggil titik akhir SageMaker secara asinkron, memberikan token untuk pelacakan kemajuan dan pengambilan respons nanti. Boto3 tidak menawarkan cara untuk menunggu inferensi asinkron selesai seperti SageMaker Python SDK get_result() operasi. Oleh karena itu, kami memanfaatkan fakta bahwa Boto3 akan menyimpan keluaran inferensi di Amazon S3 di response["OutputLocation"]. Kita dapat menggunakan fungsi berikut untuk menunggu file inferensi ditulis ke 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

Dengan fungsi ini, sekarang kita dapat menanyakan titik akhir:

# 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 adalah kerangka kerja sumber terbuka yang diluncurkan pada Oktober 2022 oleh Harrison Chase. Ini menyederhanakan pengembangan aplikasi menggunakan model bahasa besar (LLM) dengan menyediakan integrasi dengan berbagai sistem dan sumber data. LangChain memungkinkan analisis dokumen, peringkasan, pembuatan chatbot, analisis kode, dan banyak lagi. Ini telah mendapatkan popularitas, dengan kontribusi dari ratusan pengembang dan pendanaan yang signifikan dari perusahaan ventura. LangChain memungkinkan koneksi LLM dengan sumber eksternal, sehingga memungkinkan untuk membuat aplikasi yang dinamis dan responsif terhadap data. Ia menawarkan perpustakaan, API, dan dokumentasi untuk menyederhanakan proses pengembangan.

LangChain menyediakan perpustakaan dan contoh untuk menggunakan titik akhir SageMaker dengan kerangka kerjanya, sehingga memudahkan penggunaan model ML yang dihosting di SageMaker sebagai โ€œotakโ€ rantai. Untuk mempelajari lebih lanjut tentang bagaimana LangChain berintegrasi dengan SageMaker, lihat Titik Akhir SageMaker dalam dokumentasi LangChain.

Salah satu batasan penerapan LangChain saat ini adalah ia tidak mendukung titik akhir asinkron secara asli. Untuk menggunakan titik akhir asinkron ke LangChain, kita harus mendefinisikan kelas baru, SagemakerAsyncEndpoint, itu memperluas SagemakerEndpoint kelas sudah tersedia di LangChain. Selain itu, kami memberikan informasi berikut:

  • Bucket dan awalan S3 tempat inferensi asinkron akan menyimpan input (dan output)
  • Jumlah detik maksimum untuk menunggu sebelum waktu habis
  • An updated _call() berfungsi untuk menanyakan titik akhir invoke_endpoint_async() alih-alih invoke_endpoint()
  • Cara untuk membangunkan titik akhir asinkron jika berada dalam kondisi awal yang dingin (diperkecil menjadi nol)

Untuk meninjau yang baru dibuat SagemakerAsyncEndpoint, Anda dapat melihat sagemaker_async_endpoint.py fillet tersedia di 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']))

Membersihkan

Ketika Anda selesai menguji pembuatan kesimpulan dari titik akhir, ingatlah untuk menghapus titik akhir untuk menghindari dikenakan biaya tambahan:

predictor.delete_endpoint()

Kesimpulan

Saat menerapkan model pondasi besar seperti TII Falcon, mengoptimalkan biaya sangatlah penting. Model-model ini memerlukan perangkat keras yang kuat dan kapasitas memori yang besar, sehingga menyebabkan biaya infrastruktur yang tinggi. Inferensi asinkron SageMaker, opsi penerapan yang memproses permintaan secara asinkron, mengurangi biaya dengan menskalakan jumlah instans ke nol ketika tidak ada permintaan yang tertunda. Dalam postingan ini, kami mendemonstrasikan cara menerapkan model fondasi SageMaker JumpStart yang besar ke titik akhir asinkron SageMaker. Kami menyediakan contoh kode menggunakan SageMaker Python SDK, Boto3, dan LangChain untuk mengilustrasikan berbagai metode untuk memanggil titik akhir asinkron dan mengambil hasilnya. Teknik-teknik ini memungkinkan pengembang dan peneliti untuk mengoptimalkan biaya sambil menggunakan kemampuan model dasar untuk sistem pemahaman bahasa tingkat lanjut.

Untuk mempelajari lebih lanjut tentang inferensi asinkron dan SageMaker JumpStart, lihat postingan berikut:


Tentang Penulis

Gambar DavidDavide Gallitelli adalah Arsitek Solusi Spesialis untuk AI/ML di wilayah EMEA. Dia berbasis di Brussel dan bekerja sama dengan pelanggan di seluruh Benelux. Dia telah menjadi pengembang sejak dia masih sangat muda, mulai membuat kode pada usia 7 tahun. Dia mulai belajar AI/ML di universitas, dan telah jatuh cinta padanya sejak saat itu.

Stempel Waktu:

Lebih dari Pembelajaran Mesin AWS