在 Amazon SageMaker 中創建模型 ModelBuilder - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon SageMaker 中創建模型 ModelBuilder

準備要在 SageMaker 端點上進行部署的模型需要多個步驟,包括選擇模型映像、設定端點組態、編碼序列化和還原序列化函數以在伺服器和用戶端間傳輸資料、識別模型相依性,以及將其上傳到 Amazon S3。 ModelBuilder可降低初始設定和部署的複雜性,協助您在單一步驟中建立可部署模型。

ModelBuilder為您執行下列工作:

  • 透過一個步驟,將使用各種架構 (例如) 訓練XGBoost的機器學習模型 PyTorch 轉換為可部署模型。

  • 根據模型框架執行自動容器選擇,因此您不必手動指定容器。您仍然可以通過URI將自己的容器傳遞給自己的容器ModelBuilder

  • 在將數據發送到服務器以推斷和反序列化服務器返回的結果之前,處理客戶端上的數據序列化。無需手動處理即可正確格式化資料。

  • 啟用自動擷取相依性,並根據模型伺服器預期封裝模型。 ModelBuilder自動擷取相依性是動態載入相依性的最佳方法。我們建議您在本機測試自動擷取,並更新相依性以符合您的需求。)

  • 對於大型語言模型 (LLM) 使用案例,可選擇性地對可部署的服務屬性執行本機參數調整,以便在 SageMaker 端點上託管時獲得更好的效能。

  • 支持大多數流行的模型服務器和容器 TorchServe,例如 Triton DJLServing 和TGI容器。

建立您的模型 ModelBuilder

ModelBuilder是一個 Python 類,它採用框架模型,例如 XGBoost or 或用戶指定的推論規範 PyTorch,並將其轉換為可部署的模型。 ModelBuilder提供建置函數,可產生用於部署的成品。產生的模型人工因素專用於模型伺服器,您也可以將其指定為其中一個輸入。如需有關ModelBuilder類別的詳細資訊,請參閱ModelBuilder

下圖說明使用時的整體模型建立工作流程ModelBuilderModelBuilder接受模型或推論規格以及您的結構描述,以建立可部署的模型,您可以在部署之前在本機進行測試。

模型建立和部署流程使用ModelBuilder.

ModelBuilder可以處理要應用的任何定制。但是,為了部署框架模型,模型生成器至少需要模型,示例輸入和輸出以及角色。在下列程式碼範例中,ModelBuilder會使用架構模型和具有最小引數的執行個體呼叫 (以推斷SchemaBuilder用於序列化和還原序列化端點輸入和輸出的對應函數)。未指定容器,也不會傳遞封裝相依性 — 在您建置模型時SageMaker 會自動推斷這些資源。

from sagemaker.serve.builder.model_builder import ModelBuilder from sagemaker.serve.builder.schema_builder import SchemaBuilder model_builder = ModelBuilder( model=model, schema_builder=SchemaBuilder(input, output), role_arn="execution-role", )

下列程式碼範例會ModelBuilder使用推論規格 (做為InferenceSpec執行個體) 呼叫,而不是模型,並使用其他自訂。在這種情況下,對模型生成器的調用包括存儲模型加工品的路徑,並打開所有可用依賴關係的自動捕獲。如需詳細資訊InferenceSpec,請參閱自訂模型載入和處理請求

model_builder = ModelBuilder( mode=Mode.LOCAL_CONTAINER, model_path=model-artifact-directory, inference_spec=your-inference-spec, schema_builder=SchemaBuilder(input, output), role_arn=execution-role, dependencies={"auto": True} )

定義序列化和反序列化方法

調用 SageMaker 端點時,數據通過具有不同MIME類型的有HTTP效載荷發送。例如,傳送至端點進行推論的映像需要在用戶端轉換為位元組,並透過HTTP裝載傳送至端點。當端點收到有效負載時,它需要將字節字符串反序列化回模型預期的數據類型(也稱為服務器端反序列化)。模型完成預測之後,結果也需要序列化為可透過HTTP裝載傳回給使用者或用戶端的位元組。一旦客戶端收到響應字節數據,它需要執行客戶端反序列化以將字節數據轉換回預期的數據格式,例如。JSON至少,您需要轉換以下任務的數據:

  1. 推論請求序列化(由客戶端處理)

  2. 推論請求還原序列化(由服務器或算法處理)

  3. 針對有效負載調用模型並將響應有效負載發回

  4. 推論響應序列化(由服務器或算法處理)

  5. 推論響應還原序列化(由客戶端處理)

下圖顯示呼叫端點時所發生的序列化和還原序列化程序。

客戶端到服務器數據序列化和反序列化的圖。

當您提供範例輸入和輸出給時SchemaBuilder,結構描述建置器會產生相應的封送函數,以序列化和還原序列化輸入和輸出。您可以使用CustomPayloadTranslator. 但是對於大多數情況下,如下所示的簡單序列化程序將起作用:

input = "How is the demo going?" output = "Comment la démo va-t-elle?" schema = SchemaBuilder(input, output)

如需進一步的詳細資訊SchemaBuilder,請參閱SchemaBuilder

下面的代碼片段概述了一個示例,您想要在客戶端和服務器端自定義序列化和反序列化功能。您可以使用這些翻譯人員定義您自己的請求CustomPayloadTranslator與回應翻譯人員,並將這些翻SchemaBuilder

透過包含轉換器的輸入和輸出,模型建置器可以擷取模型預期的資料格式。例如,假設範例輸入為原始影像,而您的自訂譯者會裁切影像,並將裁切後的影像作為張量傳送至伺服器。 ModelBuilder需要原始輸入和任何自訂的預處理或後處理程式碼來衍生用戶端和伺服器端轉換資料的方法。

from sagemaker.serve import CustomPayloadTranslator # request translator class MyRequestTranslator(CustomPayloadTranslator): # This function converts the payload to bytes - happens on client side def serialize_payload_to_bytes(self, payload: object) -> bytes: # converts the input payload to bytes ... ... return //return object as bytes # This function converts the bytes to payload - happens on server side def deserialize_payload_from_stream(self, stream) -> object: # convert bytes to in-memory object ... ... return //return in-memory object # response translator class MyResponseTranslator(CustomPayloadTranslator): # This function converts the payload to bytes - happens on server side def serialize_payload_to_bytes(self, payload: object) -> bytes: # converts the response payload to bytes ... ... return //return object as bytes # This function converts the bytes to payload - happens on client side def deserialize_payload_from_stream(self, stream) -> object: # convert bytes to in-memory object ... ... return //return in-memory object

建立物件時,您可以將範例輸入和輸出與先前定義的自訂轉換器一起傳SchemaBuilder遞,如下列範例所示:

my_schema = SchemaBuilder( sample_input=image, sample_output=output, input_translator=MyRequestTranslator(), output_translator=MyResponseTranslator() )

然後,您將樣本輸入和輸出以及先前定義的自訂轉換器傳遞給SchemaBuilder物件。

my_schema = SchemaBuilder( sample_input=image, sample_output=output, input_translator=MyRequestTranslator(), output_translator=MyResponseTranslator() )

下列各節將詳細說明如何使用其支援類別來建置模型,以ModelBuilder及如何針對您的使用案例自訂體驗。

自訂模型載入和處理請求

透過提供額外的自訂層,提InferenceSpec供您自己的推論程式碼。使用時InferenceSpec,您可以自訂模型的載入方式,以及它如何處理傳入推論要求,略過其預設的載入和推論處理機制。使用非標準模型或自訂推論管線時,這種彈性特別有益。您可以自訂方invoke法來控制模型預先處理和後處理傳入請求的方式。此方invoke法可確保模型能正確處理推論要求。下列範例會用InferenceSpec來產生含 HuggingFace 配管的模型。如需有關的更多詳細資訊InferenceSpec,請參閱InferenceSpec

from sagemaker.serve.spec.inference_spec import InferenceSpec from transformers import pipeline class MyInferenceSpec(InferenceSpec): def load(self, model_dir: str): return pipeline("translation_en_to_fr", model="t5-small") def invoke(self, input, model): return model(input) inf_spec = MyInferenceSpec() model_builder = ModelBuilder( inference_spec=your-inference-spec, schema_builder=SchemaBuilder(X_test, y_pred) )

下列範例說明先前範例的更自訂變化。使用具有相依性的推論規格來定義模型。在這種情況下,推論規範中的代碼取決於 lang 段包。的引數dependencies包含指示建構器使用 Git 安裝語句段的陳述式。由於模型構建器由用戶指示自定義安裝依賴關係,因此關auto鍵是False關閉依賴關係的自動捕獲。

model_builder = ModelBuilder( mode=Mode.LOCAL_CONTAINER, model_path=model-artifact-directory, inference_spec=your-inference-spec, schema_builder=SchemaBuilder(input, output), role_arn=execution-role, dependencies={"auto": False, "custom": ["-e git+https://github.com/luca-medeiros/lang-segment-anything.git#egg=lang-sam"],} )

建置您的模型並部署

呼叫build函數以建立可部署的模型。此步驟會在您的工作目錄中建立推論程式碼 (asinference.py),其中包含建立結構描述、執行輸入和輸出的序列化和還原序列化,以及執行其他使用者指定的自訂邏輯所需的程式碼。

作為完整性檢查,打 SageMaker 包和提取部署所需的文件作為ModelBuilder構建功能的一部分。在此過程中, SageMaker 還會為泡菜文件創建HMAC簽名,並在deploy(或create)期間將密鑰CreateModelAPI作為環境變量添加到中。端點啟動會使用環境變數來驗證挑選檔案的完整性。

# Build the model according to the model server specification and save it as files in the working directory model = model_builder.build()

使用模型的現有deploy方法部署模型。在此步驟中, SageMaker 設定端點以在模型開始對傳入請求進行預測時託管模型。雖然ModelBuilder推斷了部署模型所需的端點資源,但您可以使用自己的參數值覆寫這些估計值。下列範例會指示 SageMaker 在單一執行個ml.c6i.xlarge體上部署模型。從建構的模型會在部署期間ModelBuilder啟用即時記錄,做為新增功能。

predictor = model.deploy( initial_instance_count=1, instance_type="ml.c6i.xlarge" )

如果您希望對分配給模型的端點資源進行更精細的控制,則可以使用對ResourceRequirements象。透過ResourceRequirements物件,您可以要求您要部署的CPUs模型最少數量、加速器和複本。您也可以要求最小和最大記憶體限制 (以 MB 為單位)。若要使用此功能,您需要將端點類型指定為EndpointType.INFERENCE_COMPONENT_BASED。下列範例會要求四個加速器、1024 MB 的最小記憶體大小,以及一個模型副本部署到類型EndpointType.INFERENCE_COMPONENT_BASED的端點。

resource_requirements = ResourceRequirements( requests={ "num_accelerators": 4, "memory": 1024, "copies": 1, }, limits={}, ) predictor = model.deploy( mode=Mode.SAGEMAKER_ENDPOINT, endpoint_type=EndpointType.INFERENCE_COMPONENT_BASED, resources=resource_requirements, role="role" )

攜帶自己的容器(BYOC)

如果你想把自己的容器(從容 SageMaker 器擴展),你也可以指定圖URI像顯示在下面的例子。您還需要識別與影像對應的模型伺服器,ModelBuilder以產生模型伺服器特定的人工因素。

model_builder = ModelBuilder( model=model, model_server=ModelServer.TORCHSERVE, schema_builder=SchemaBuilder(X_test, y_pred), image_uri="123123123123.dkr.ecr.ap-southeast-2.amazonaws.com/byoc-image:xgb-1.7-1") )

ModelBuilder 在本機模式下使用

您可以使用mode引數在本機測試和部署到端點之間切換來在本機部署模型。您需要將模型加工品儲存在工作目錄中,如下列程式碼片段所示:

model = XGBClassifier() model.fit(X_train, y_train) model.save_model(model_dir + "/my_model.xgb")

將模型物件、SchemaBuilder執行個體和設定模式傳遞給Mode.LOCAL_CONTAINER。當您調用該build函數時,ModelBuilder會自動識別支持的框架容器並掃描依賴關係。下列範例示範在本機模式下使用模XGBoost型建立模型。

model_builder_local = ModelBuilder( model=model, schema_builder=SchemaBuilder(X_test, y_pred), role_arn=execution-role, mode=Mode.LOCAL_CONTAINER ) xgb_local_builder = model_builder_local.build()

呼叫deploy函數以在本機部署,如下列程式碼片段所示。如果您指定例證類型或計數的參數,則會忽略這些引數。

predictor_local = xgb_local_builder.deploy()

疑難排解本機模

視您個別的本機設定而定,您可能會在環境中ModelBuilder順利執行時遇到困難。請參閱下列清單,瞭解您可能會遇到的一些問題以及如何解決這些問題。

  • 已在使用中:您可能會遇到錯Address already in use誤。在這種情況下,Docker 容器可能在該端口上運行,或者另一個進程正在使用它。您可以按照 Linux 文檔中概述的方法來識別該過程,並將本地進程從端口 8080 優雅地重定向到另一個端口或清理 Docker 實例。

  • IAM權限問題:嘗試提取 Amazon ECR 映像或存取 Amazon S3 時,您可能會遇到許可問題。在此情況下,請瀏覽至筆記本或 Studio 傳統執行個體的執行角色,以驗證原則SageMakerFullAccess或個別API權限。

  • EBS磁碟區容量問題:如果您部署大型語言模型 (LLM),則可能在本機模式下執行 Docker 時空間不足,或是遇到 Docker 快取的空間限制。在這種情況下,您可以嘗試將 Docker 卷移動到有足夠空間的文件系統。若要移動 Docker 磁碟區,請完成以下步驟:

    1. 打開終端並運行df以顯示磁盤使用情況,如以下輸出所示:

      (python3) sh-4.2$ df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 195928700 0 195928700 0% /dev tmpfs 195939296 0 195939296 0% /dev/shm tmpfs 195939296 1048 195938248 1% /run tmpfs 195939296 0 195939296 0% /sys/fs/cgroup /dev/nvme0n1p1 141545452 135242112 6303340 96% / tmpfs 39187860 0 39187860 0% /run/user/0 /dev/nvme2n1 264055236 76594068 176644712 31% /home/ec2-user/SageMaker tmpfs 39187860 0 39187860 0% /run/user/1002 tmpfs 39187860 0 39187860 0% /run/user/1001 tmpfs 39187860 0 39187860 0% /run/user/1000
    2. 將預設的 Docker 目錄從移/dev/nvme0n1p1到,以/dev/nvme2n1便您可以充分利用 256 GB 的 SageMaker 磁碟區。有關更多詳細信息,請參閱有關如何移動 Docker 目錄的文檔。

    3. 使用以下命令停止 Docker:

      sudo service docker stop
    4. daemon.json向現有的 JSON blob 添加/etc/docker或附加以下 blob。

      { "data-root": "/home/ec2-user/SageMaker/{created_docker_folder}" }
    5. /home/ec2-user/SageMaker使用下列命令將 Docker 目錄移/var/lib/docker至中:

      sudo rsync -aP /var/lib/docker/ /home/ec2-user/SageMaker/{created_docker_folder}
    6. 使用下列指令啟動泊塢視窗:

      sudo service docker start
    7. 使用以下命令清理垃圾箱:

      cd /home/ec2-user/SageMaker/.Trash-1000/files/* sudo rm -r *
    8. 如果您使用的是 SageMaker 筆記本執行個體,可以按照 Docker 準備檔案中的步驟,為本機模式做好 Docker 準備。

ModelBuilder 例子

有關用ModelBuilder於建立模型的更多範例,請參閱ModelBuilder範例筆記本