Tối ưu hóa chi phí triển khai của các mô hình nền tảng Amazon SageMaker JumpStart với điểm cuối không đồng bộ của Amazon SageMaker | Dịch vụ web của Amazon

Tối ưu hóa chi phí triển khai của các mô hình nền tảng Amazon SageMaker JumpStart với điểm cuối không đồng bộ của Amazon SageMaker | Dịch vụ web của Amazon

Sự thành công của các ứng dụng AI tổng quát trên nhiều ngành công nghiệp đã thu hút sự chú ý và quan tâm của các công ty trên toàn thế giới đang tìm cách tái tạo và vượt qua thành tích của đối thủ cạnh tranh hoặc giải quyết các trường hợp sử dụng mới và thú vị. Những khách hàng này đang xem xét các mô hình nền tảng, chẳng hạn như TII Falcon, Stable Diffusion XL hoặc GPT-3.5 của OpenAI, làm động cơ thúc đẩy sự đổi mới AI tổng quát.

Các mô hình nền tảng là một lớp mô hình AI tổng quát có khả năng hiểu và tạo ra nội dung giống con người nhờ vào lượng lớn dữ liệu phi cấu trúc mà chúng đã được đào tạo. Những mô hình này đã cách mạng hóa các tác vụ thị giác máy tính (CV) và xử lý ngôn ngữ tự nhiên (NLP) khác nhau, bao gồm tạo hình ảnh, dịch thuật và trả lời câu hỏi. Chúng đóng vai trò là nền tảng cho nhiều ứng dụng AI và đã trở thành một thành phần quan trọng trong việc phát triển các hệ thống thông minh tiên tiến.

Tuy nhiên, việc triển khai các mô hình nền tảng có thể gặp phải những thách thức đáng kể, đặc biệt là về yêu cầu về chi phí và nguồn lực. Những mô hình này nổi tiếng với kích thước của chúng, thường dao động từ hàng trăm triệu đến hàng tỷ tham số. Kích thước lớn của chúng đòi hỏi nhiều tài nguyên tính toán, bao gồm phần cứng mạnh mẽ và dung lượng bộ nhớ đáng kể. Trên thực tế, việc triển khai các mô hình nền tảng thường yêu cầu ít nhất một (thường là nhiều hơn) GPU để xử lý tải tính toán một cách hiệu quả. Ví dụ: mô hình TII Falcon-40B Instruct yêu cầu ít nhất một phiên bản ml.g5.12xlarge để được tải vào bộ nhớ thành công nhưng hoạt động tốt nhất với các phiên bản lớn hơn. Do đó, lợi tức đầu tư (ROI) của việc triển khai và duy trì các mô hình này có thể quá thấp để chứng minh giá trị kinh doanh, đặc biệt là trong các chu kỳ phát triển hoặc đối với khối lượng công việc tăng đột biến. Điều này là do chi phí vận hành khi có các phiên bản được hỗ trợ GPU trong thời gian dài, có thể là 24/7.

Đầu năm nay, chúng tôi đã công bố nền tảng Amazon, một API không có máy chủ để truy cập các mô hình nền tảng từ Amazon và các đối tác AI tổng hợp của chúng tôi. Mặc dù hiện đang ở chế độ Xem trước riêng tư nhưng API không có máy chủ của nó cho phép bạn sử dụng các mô hình nền tảng từ Amazon, Anthropic, Stability AI và AI21 mà không cần phải tự mình triển khai bất kỳ điểm cuối nào. Tuy nhiên, các mô hình nguồn mở từ các cộng đồng như Hugging Face đã phát triển rất nhiều và không phải mô hình nào trong số đó cũng được cung cấp thông qua Amazon Bedrock.

Trong bài đăng này, chúng tôi nhắm đến những tình huống này và giải quyết vấn đề rủi ro chi phí cao bằng cách triển khai các mô hình nền tảng lớn để Amazon SageMaker điểm cuối không đồng bộ từ Khởi động Amazon SageMaker. Điều này có thể giúp cắt giảm chi phí của kiến ​​trúc, cho phép điểm cuối chỉ chạy khi có yêu cầu trong hàng đợi và trong thời gian tồn tại ngắn, đồng thời giảm quy mô xuống XNUMX khi không có yêu cầu nào đang chờ được phục vụ. Điều này nghe có vẻ tuyệt vời đối với nhiều trường hợp sử dụng; tuy nhiên, điểm cuối đã giảm tỷ lệ xuống XNUMX sẽ đưa ra thời gian bắt đầu nguội trước khi có thể đưa ra suy luận.

Tổng quan về giải pháp

Sơ đồ sau minh họa kiến ​​trúc giải pháp của chúng tôi.

Tối ưu hóa chi phí triển khai của các mô hình nền tảng Amazon SageMaker JumpStart với điểm cuối không đồng bộ của Amazon SageMaker | Dịch vụ web của Amazon PlatoThông minh dữ liệu Blockchain. Tìm kiếm dọc. Ái.

Kiến trúc chúng tôi triển khai rất đơn giản:

  • Giao diện người dùng là một cuốn sổ tay, có thể được thay thế bằng giao diện người dùng web được xây dựng trên Streamlit hoặc công nghệ tương tự. Trong trường hợp của chúng tôi, sổ ghi chép là một Xưởng sản xuất Amazon SageMaker sổ ghi chép, chạy trên phiên bản ml.m5.large với nhân CPU PyTorch 2.0 Python 3.10.
  • Sổ ghi chép truy vấn điểm cuối theo ba cách: SDK SageMaker Python, AWS SDK cho Python (Boto3) và LangChain.
  • Điểm cuối đang chạy không đồng bộ trên SageMaker và trên điểm cuối, chúng tôi triển khai mô hình Hướng dẫn Falcon-40B. Đây hiện là công nghệ tiên tiến nhất về mô hình hướng dẫn và có sẵn trong SageMaker JumpStart. Một lệnh gọi API duy nhất cho phép chúng tôi triển khai mô hình trên điểm cuối.

Suy luận không đồng bộ SageMaker là gì

Suy luận không đồng bộ của SageMaker là một trong bốn tùy chọn triển khai trong SageMaker, cùng với điểm cuối thời gian thực, suy luận hàng loạt và suy luận serverless. Để tìm hiểu thêm về các tùy chọn triển khai khác nhau, hãy tham khảo Triển khai các mô hình cho suy luận.

Suy luận không đồng bộ của SageMaker xếp hàng các yêu cầu đến và xử lý chúng một cách không đồng bộ, khiến tùy chọn này trở nên lý tưởng cho các yêu cầu có kích thước tải trọng lớn lên tới 1 GB, thời gian xử lý dài và yêu cầu về độ trễ gần như thời gian thực. Tuy nhiên, ưu điểm chính mà nó mang lại khi xử lý các mô hình nền tảng lớn, đặc biệt là trong quá trình chứng minh khái niệm (POC) hoặc trong quá trình phát triển, là khả năng định cấu hình suy luận không đồng bộ để mở rộng quy mô thành số lượng phiên bản bằng XNUMX khi không có yêu cầu nào quá trình, từ đó tiết kiệm chi phí. Để biết thêm thông tin về suy luận không đồng bộ của SageMaker, hãy tham khảo Suy luận không đồng bộ. Sơ đồ sau minh họa kiến ​​trúc này.

Tối ưu hóa chi phí triển khai của các mô hình nền tảng Amazon SageMaker JumpStart với điểm cuối không đồng bộ của Amazon SageMaker | Dịch vụ web của Amazon PlatoThông minh dữ liệu Blockchain. Tìm kiếm dọc. Ái.

Để triển khai điểm cuối suy luận không đồng bộ, bạn cần tạo một AsyncInferenceConfig sự vật. Nếu bạn tạo AsyncInferenceConfig mà không chỉ định đối số của nó, mặc định S3OutputPath sẽ được s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME}S3FailurePath sẽ được s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

Khởi động SageMaker là gì

Mô hình của chúng tôi đến từ SageMaker JumpStart, một tính năng của SageMaker giúp tăng tốc hành trình học máy (ML) bằng cách cung cấp các mô hình được đào tạo trước, mẫu giải pháp và sổ ghi chép ví dụ. Nó cung cấp quyền truy cập vào một loạt các mô hình được đào tạo trước cho các loại vấn đề khác nhau, cho phép bạn bắt đầu các nhiệm vụ ML của mình với nền tảng vững chắc. SageMaker JumpStart cũng cung cấp các mẫu giải pháp cho các trường hợp sử dụng phổ biến và sổ ghi chép mẫu để học tập. Với SageMaker JumpStart, bạn có thể giảm thời gian và công sức cần thiết để bắt đầu các dự án ML của mình bằng cách khởi chạy giải pháp bằng một cú nhấp chuột và các tài nguyên toàn diện để có trải nghiệm ML thực tế.

Ảnh chụp màn hình sau đây hiển thị ví dụ về một số mẫu có sẵn trên giao diện người dùng SageMaker JumpStart.

Tối ưu hóa chi phí triển khai của các mô hình nền tảng Amazon SageMaker JumpStart với điểm cuối không đồng bộ của Amazon SageMaker | Dịch vụ web của Amazon PlatoThông minh dữ liệu Blockchain. Tìm kiếm dọc. Ái.

Triển khai mô hình

Bước đầu tiên của chúng tôi là triển khai mô hình lên SageMaker. Để làm điều đó, chúng ta có thể sử dụng giao diện người dùng cho SageMaker JumpStart hoặc SageMaker Python SDK, cung cấp API mà chúng ta có thể sử dụng để triển khai mô hình đến điểm cuối không đồng bộ:

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

Cuộc gọi này có thể mất khoảng 10 phút để hoàn thành. Trong thời gian này, điểm cuối được tách ra, vùng chứa cùng với các thành phần lạ của mô hình được tải xuống điểm cuối, cấu hình mô hình được tải từ SageMaker JumpStart, sau đó điểm cuối không đồng bộ được hiển thị thông qua điểm cuối DNS. Để đảm bảo rằng điểm cuối của chúng tôi có thể giảm tỷ lệ về XNUMX, chúng tôi cần định cấu hình tự động chia tỷ lệ trên điểm cuối không đồng bộ bằng cách sử dụng Ứng dụng tự động chia tỷ lệ. Trước tiên, bạn cần đăng ký biến thể điểm cuối của mình với Ứng dụng tự động chia tỷ lệ, xác định chính sách chia tỷ lệ, sau đó áp dụng chính sách chia tỷ lệ. Trong cấu hình này, chúng tôi sử dụng số liệu tùy chỉnh bằng cách sử dụng CustomizedMetricSpecification, Được gọi là ApproximateBacklogSizePerInstance, như được hiển thị trong đoạn mã sau. Để có danh sách chi tiết về amazoncloudwatch số liệu có sẵn với điểm cuối suy luận không đồng bộ của bạn, hãy tham khảo Giám sát bằng 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. },
)

Bạn có thể xác minh rằng chính sách này đã được đặt thành công bằng cách điều hướng tới bảng điều khiển SageMaker, chọn Điểm cuối Dưới Sự suy luận trong ngăn điều hướng và tìm kiếm điểm cuối mà chúng tôi vừa triển khai.

Tối ưu hóa chi phí triển khai của các mô hình nền tảng Amazon SageMaker JumpStart với điểm cuối không đồng bộ của Amazon SageMaker | Dịch vụ web của Amazon PlatoThông minh dữ liệu Blockchain. Tìm kiếm dọc. Ái.

Gọi điểm cuối không đồng bộ

Để gọi điểm cuối, bạn cần đặt tải trọng yêu cầu vào Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) và cung cấp con trỏ tới tải trọng này như một phần của InvokeEndpointAsync lời yêu cầu. Khi gọi, SageMaker xếp hàng yêu cầu xử lý và trả về mã định danh cũng như vị trí đầu ra dưới dạng phản hồi. Sau khi xử lý, SageMaker đặt kết quả vào vị trí Amazon S3. Bạn có thể tùy ý chọn nhận thông báo thành công hoặc lỗi với Dịch vụ thông báo đơn giản của Amazon (SNS của Amazon).

SDK Python của SageMaker

Sau khi triển khai hoàn tất, nó sẽ trả về một AsyncPredictor sự vật. Để thực hiện suy luận không đồng bộ, bạn cần tải dữ liệu lên Amazon S3 và sử dụng predict_async() phương thức với URI S3 làm đầu vào. Nó sẽ trả về một AsyncInferenceResponse đối tượng và bạn có thể kiểm tra kết quả bằng cách sử dụng get_response() phương pháp.

Ngoài ra, nếu bạn muốn kiểm tra kết quả định kỳ và trả lại kết quả sau khi tạo, hãy sử dụng predict() phương pháp. Chúng tôi sử dụng phương pháp thứ hai này trong đoạn mã sau:

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

Bây giờ chúng ta hãy khám phá invoke_endpoint_async phương pháp từ Boto3 sagemaker-runtime khách hàng. Nó cho phép các nhà phát triển gọi điểm cuối SageMaker một cách không đồng bộ, cung cấp mã thông báo để theo dõi tiến trình và truy xuất phản hồi sau này. Boto3 không cung cấp cách chờ quá trình suy luận không đồng bộ được hoàn thành như SageMaker Python SDK get_result() hoạt động. Do đó, chúng tôi lợi dụng thực tế là Boto3 sẽ lưu trữ kết quả suy luận trong Amazon S3 trong response["OutputLocation"]. Chúng ta có thể sử dụng hàm sau để đợi tệp suy luận được ghi vào 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

Với chức năng này, bây giờ chúng ta có thể truy vấn điểm cuối:

# 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 là một framework nguồn mở được Harrison Chase ra mắt vào tháng 2022 năm XNUMX. Nó đơn giản hóa việc phát triển các ứng dụng bằng cách sử dụng các mô hình ngôn ngữ lớn (LLM) bằng cách cung cấp khả năng tích hợp với nhiều hệ thống và nguồn dữ liệu khác nhau. LangChain cho phép phân tích tài liệu, tóm tắt, tạo chatbot, phân tích mã, v.v. Nó đã trở nên phổ biến với sự đóng góp của hàng trăm nhà phát triển và nguồn tài trợ đáng kể từ các công ty liên doanh. LangChain cho phép kết nối LLM với các nguồn bên ngoài, giúp tạo ra các ứng dụng động, đáp ứng dữ liệu. Nó cung cấp các thư viện, API và tài liệu để hợp lý hóa quá trình phát triển.

LangChain cung cấp các thư viện và ví dụ để sử dụng điểm cuối SageMaker với khung của nó, giúp việc sử dụng các mô hình ML được lưu trữ trên SageMaker làm “bộ não” của chuỗi trở nên dễ dàng hơn. Để tìm hiểu thêm về cách LangChain tích hợp với SageMaker, hãy tham khảo Điểm cuối SageMaker trong tài liệu LangChain.

Một trong những hạn chế của việc triển khai LangChain hiện tại là nó không hỗ trợ các điểm cuối không đồng bộ. Để sử dụng điểm cuối không đồng bộ cho LangChain, chúng ta phải xác định một lớp mới, SagemakerAsyncEndpoint, điều đó mở rộng SagemakerEndpoint lớp đã có sẵn trong LangChain. Ngoài ra, chúng tôi cung cấp các thông tin sau:

  • Nhóm S3 và tiền tố nơi suy luận không đồng bộ sẽ lưu trữ đầu vào (và đầu ra)
  • Số giây tối đa phải chờ trước khi hết thời gian
  • An updated _call() chức năng truy vấn điểm cuối với invoke_endpoint_async() thay vì invoke_endpoint()
  • Một cách để đánh thức điểm cuối không đồng bộ nếu nó đang ở trạng thái khởi động nguội (giảm tỷ lệ xuống XNUMX)

Để xem lại cái mới được tạo SagemakerAsyncEndpoint, Bạn có thể kiểm tra sagemaker_async_endpoint.py hồ sơ có sẵn trên 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']))

Làm sạch

Khi bạn hoàn tất việc kiểm tra việc tạo suy luận từ điểm cuối, hãy nhớ xóa điểm cuối để tránh phát sinh thêm phí:

predictor.delete_endpoint()

Kết luận

Khi triển khai các mô hình nền tảng lớn như TII Falcon, việc tối ưu hóa chi phí là rất quan trọng. Những mô hình này yêu cầu phần cứng mạnh mẽ và dung lượng bộ nhớ đáng kể, dẫn đến chi phí cơ sở hạ tầng cao. Suy luận không đồng bộ của SageMaker, một tùy chọn triển khai xử lý các yêu cầu không đồng bộ, giảm chi phí bằng cách tăng số lượng phiên bản về 3 khi không có yêu cầu đang chờ xử lý. Trong bài đăng này, chúng tôi đã trình bày cách triển khai các mô hình nền tảng SageMaker JumpStart lớn cho các điểm cuối không đồng bộ của SageMaker. Chúng tôi đã cung cấp các ví dụ về mã bằng cách sử dụng SageMaker Python SDK, BotoXNUMX và LangChain để minh họa các phương pháp khác nhau nhằm gọi các điểm cuối không đồng bộ và truy xuất kết quả. Những kỹ thuật này cho phép các nhà phát triển và nhà nghiên cứu tối ưu hóa chi phí trong khi sử dụng khả năng của các mô hình nền tảng cho các hệ thống hiểu ngôn ngữ tiên tiến.

Để tìm hiểu thêm về suy luận không đồng bộ và SageMaker JumpStart, hãy xem các bài đăng sau:


Giới thiệu về tác giả

Ảnh của DavideDavide Gallitelli là Kiến trúc sư Giải pháp Chuyên gia về AI / ML trong khu vực EMEA. Anh ấy có trụ sở tại Brussels và làm việc chặt chẽ với khách hàng trên khắp Benelux. Anh ấy đã là một nhà phát triển từ khi còn rất trẻ, bắt đầu viết mã ở tuổi 7. Anh ấy bắt đầu học AI / ML ở trường đại học, và yêu nó kể từ đó.

Dấu thời gian:

Thêm từ Học máy AWS