亞馬遜 SageMaker 的新高效多適配器推理功能為使用微調模型的客戶開啟了令人興奮的可能性。此功能與 SageMaker 推理組件集成,允許您通過 SageMaker API 部署和管理數百個微調的低秩適配器(LoRA)。多適配器推理處理微調適配器與基礎模型的註冊,並根據請求在毫秒內從 GPU 記憶體、CPU 記憶體或本地磁碟動態加載它們。此功能提供了對於在 SageMaker 端點運行實例之間添加、刪除或更新單個適配器的原子操作,而不影響性能或需要重新部署端點。
LoRA 適配器的效率允許進行廣泛的超個性化和基於任務的自定義,這在以前過於資源密集且成本高昂,難以實現。例如,市場推廣和軟體即服務(SaaS)公司可以使用每位客戶的圖像、藝術風格、溝通風格和文件來個性化人工智慧和機器學習(AI/ML)應用,以創建代表他們的活動和產物。同樣,醫療保健或金融服務等行業的企業可以重用通用基礎模型,使用基於任務的適配器有效解決各種專業的 AI 任務。無論是診斷醫療狀況、評估貸款申請、理解複雜文件,還是檢測金融詐騙,您都可以在運行時簡單地為每個用例替換適當的微調 LoRA 適配器。這種靈活性和效率為您在整個組織中部署強大且定制的 AI 開啟了新機會。通過這一新的高效多適配器推理能力,SageMaker 減少了部署和管理驅動這些應用的適配器的複雜性。
在本文中,我們展示了如何在 SageMaker 中使用新的高效多適配器推理功能。
問題陳述
您可以使用強大的預訓練基礎模型(FMs),而不需要從頭開始構建自己的複雜模型。然而,這些通用模型可能並不總是與您的特定需求或獨特數據對齊。為了使這些模型適合您,您可以使用參數高效微調(PEFT)技術,如 LoRA。
PEFT 和 LoRA 的好處在於它讓您能夠快速且具成本效益地微調模型。這些方法基於這樣的想法:只需更新大型基礎模型的一小部分即可將其適應於新任務或領域。通過凍結基礎模型並僅更新少數額外的適配器層,您可以更快且以更低的成本微調模型,同時仍保持高性能。這種靈活性意味著您可以快速以低成本定制預訓練模型,以滿足不同的需求。在推理時,LoRA 適配器可以在運行時動態加載,以增強基礎模型的結果,以獲得最佳性能。您可以創建一個針對特定任務、特定客戶或特定領域的適配器庫,可以根據需要進行交換,以實現最大的效率。這使您能夠構建完全符合您業務需求的 AI。
儘管微調的 LoRA 適配器可以有效解決目標用例,但在大規模管理這些適配器可能會面臨挑戰。您可以使用開源庫,或使用 AWS 管理的大模型推理(LMI)深度學習容器(DLC)動態加載和卸載適配器權重。目前的部署方法使用固定適配器或亞馬遜簡單存儲服務(Amazon S3)位置,這使得在部署後進行更改變得不可能,除非更新模型端點並增加不必要的複雜性。這種部署方法還使得收集每個適配器的度量變得不可能,從而使得評估其健康狀況和性能變得具有挑戰性。
解決方案概述
在這個解決方案中,我們展示了如何在 SageMaker 中使用高效的多適配器推理來托管和管理多個 LoRA 適配器,並使用共同的基礎模型。這一方法基於現有的 SageMaker 能力,即推理組件,您可以在同一端點上擁有多個容器或模型,並為每個容器分配一定的計算資源。通過推理組件,您可以創建和擴展模型的多個副本,每個副本保持您已分配的計算資源。通過推理組件,部署具有特定硬體需求的多個模型變得簡單得多,允許擴展和托管多個基礎模型。一個示例部署如下圖所示。
此功能將推理組件擴展到一種類型的新組件,即推理組件適配器,您可以使用它來允許 SageMaker 在擴展規模時管理您的單個 LoRA 適配器,同時擁有您正在部署的基礎模型的共同推理組件。在本文中,我們展示了如何創建、更新和刪除推理組件適配器,以及如何調用它們進行推理。您可以將這個架構設想為以下圖所示。

先決條件
要運行示例筆記本,您需要一個 AWS 帳戶,並且有一個 AWS 身份與訪問管理(IAM)角色,該角色具有管理創建資源的權限。詳情請參見創建 AWS 帳戶。
如果您是第一次使用 Amazon SageMaker Studio,則首先需要創建一個 SageMaker 域。此外,您可能需要請求相應 SageMaker 托管實例的服務配額增加。在本示例中,您在同一 SageMaker 端點上托管基礎模型和多個適配器,因此您將使用 ml.g5.12xlarge 的 SageMaker 托管實例。
在本示例中,您將學習如何在 SageMaker 實時端點上使用推理組件部署基礎模型(Meta Llama 3.1 8B Instruct)和 LoRA 適配器。您可以在 GitHub 倉庫中找到示例筆記本。
import sagemaker
import boto3
import json
role = sagemaker.get_execution_role() # 端點的執行角色
sess = sagemaker.session.Session() # 與不同 AWS API 交互的 SageMaker 會話
bucket = sess.default_bucket() # 存放工件的桶
region = sess._region_name
sm_client = boto3.client(service_name=”sagemaker”)
sm_rt_client = boto3.client(service_name=”sagemaker-runtime”)
從 Hugging Face 模型中心下載基礎模型。由於 Meta Llama 3.1 8B Instruct 是一個受限模型,您需要一個 Hugging Face 訪問令牌,並在模型頁面上提交模型訪問請求。詳情請參見訪問私人/受限模型。
from huggingface_hub import snapshot_download
model_name = sagemaker.utils.name_from_base(“llama-3-1-8b-instruct”)
HF_TOKEN = “<<YOUR_HF_TOKEN>>”
model_id = “meta-llama/Llama-3.1-8B-Instruct”
model_id_pathsafe = model_id.replace(“/”,”-“)
local_model_path = f”./models/model_id_pathsafe”
s3_model_path = f”s3://bucket/models/model_id_pathsafe”
snapshot_download(repo_id=model_id, use_auth_token=HF_TOKEN, local_dir=local_model_path, allow_patterns=[“.json”, “.safetensors”])
將您的模型工件複製到 Amazon S3,以改善部署期間的模型加載時間:
!aws s3 cp —recursive local_model_path s3_model_path
選擇一個可用的 LMI 容器映像進行托管。高效的適配器推理能力在 0.31.0-lmi13.0.0 及更高版本中可用。
inference_image_uri = “763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.31.0-lmi13.0.0-cu124”
為托管容器創建容器環境。LMI 容器參數可以在 LMI 後端用戶指南中找到。
參數 OPTION_MAX_LORAS 和 OPTION_MAX_CPU_LORAS 控制適配器在 GPU、CPU 和磁碟之間的移動。OPTION_MAX_LORAS 設定在 GPU 記憶體中同時存儲的適配器的數量限制,超出部分將轉移至 CPU 記憶體。OPTION_MAX_CPU_LORAS 決定在 CPU 記憶體中佇列的適配器數量,超出部分轉移至本地 SSD 存儲。
在以下示例中,30 個適配器可以存放在 GPU 記憶體中,70 個適配器可以存放在 CPU 記憶體中,然後轉移到本地存儲。
env =
“HF_MODEL_ID”: f”s3_model_path”,
“OPTION_ROLLING_BATCH”: “lmi-dist”,
“OPTION_MAX_ROLLING_BATCH_SIZE”: “16”,
“OPTION_TENSOR_PARALLEL_DEGREE”: “max”,
“OPTION_ENABLE_LORA”: “true”,
“OPTION_MAX_LORAS”: “30”,
“OPTION_MAX_CPU_LORAS”: “70”,
“OPTION_DTYPE”: “fp16”,
“OPTION_MAX_MODEL_LEN”: “6000”
在定義了容器映像和環境後,您可以創建一個 SageMaker 模型對象,稍後將用於創建推理組件:
model_name = sagemaker.utils.name_from_base(“llama-3-1-8b-instruct”)
create_model_response = sm_client.create_model(
ModelName = model_name,
ExecutionRoleArn = role,
PrimaryContainer =
“Image”: inference_image_uri,
“Environment”: env,
,
)
設置 SageMaker 端點
要創建 SageMaker 端點,您需要一個端點配置。在使用推理組件時,您不需要在端點配置中指定模型。您稍後作為組件加載模型。
endpoint_config_name = f”model_name”
variant_name = “AllTraffic”
instance_type = “ml.g5.12xlarge”
model_data_download_timeout_in_seconds = 900
container_startup_health_check_timeout_in_seconds = 900
initial_instance_count = 1
sm_client.create_endpoint_config(
EndpointConfigName = endpoint_config_name,
ExecutionRoleArn = role,
ProductionVariants = [
“VariantName”: variant_name,
“InstanceType”: instance_type,
“InitialInstanceCount”: initial_instance_count,
“ModelDataDownloadTimeoutInSeconds”: model_data_download_timeout_in_seconds,
“ContainerStartupHealthCheckTimeoutInSeconds”: container_startup_health_check_timeout_in_seconds,
“RoutingConfig”: “RoutingStrategy”: “LEAST_OUTSTANDING_REQUESTS”,
]
)
使用以下代碼創建 SageMaker 端點:
create_endpoint_response = sm_client.create_endpoint(
EndpointName = endpoint_name, EndpointConfigName = endpoint_config_name
)
創建端點後,您現在可以為基礎模型創建推理組件。這將是您稍後創建的適配器組件所依賴的基礎組件。
這裡值得注意的參數是 ComputeResourceRequirements。這是組件級別的配置,確定組件所需的資源數量(記憶體、vCPU、加速器)。適配器將與基礎組件共享這些資源。
base_inference_component_name = f”base-model_name”
variant_name = “AllTraffic”
initial_copy_count = 1
min_memory_required_in_mb = 32000
number_of_accelerator_devices_required = 4
sm_client.create_inference_component(
InferenceComponentName = base_inference_component_name,
EndpointName = endpoint_name,
VariantName = variant_name,
Specification=
“ModelName”: model_name,
“StartupParameters”:
“ModelDataDownloadTimeoutInSeconds”: model_data_download_timeout_in_seconds,
“ContainerStartupHealthCheckTimeoutInSeconds”: container_startup_health_check_timeout_in_seconds,
,
“ComputeResourceRequirements”:
“MinMemoryRequiredInMb”: min_memory_required_in_mb,
“NumberOfAcceleratorDevicesRequired”: number_of_accelerator_devices_required,
,
,
RuntimeConfig=
“CopyCount”: initial_copy_count,
,
)
在這個示例中,您創建了一個適配器,但您可以在每個端點上托管多達數百個適配器。它們需要被壓縮並上傳到 Amazon S3。
適配器包在存檔的根目錄下有以下文件,沒有子文件夾。

在本示例中,使用 QLoRA 和完全分片數據並行(FSDP)對 ECTSum 數據集的訓練分割進行了微調。訓練在 ml.p4d.24xlarge 上進行了 21 分鐘,成本約為 $13,使用當前的按需定價。
對於您要部署的每個適配器,您需要指定 InferenceComponentName、一個包含適配器存檔的 S3 位置的 ArtifactUrl,以及一個 BaseInferenceComponentName,以創建基礎模型推理組件和新適配器推理組件之間的連接。您為每個附加適配器重複此過程。
ic_ectsum_name = f”adapter-ectsum-base_inference_component_name”
adapter_s3_uri = “<<S3_PATH_FOR_YOUR_ADAPTER>>
sm_client.create_inference_component(
InferenceComponentName = adapter_ic1_name,
EndpointName = endpoint_name,
Specification=
“BaseInferenceComponentName”: inference_component_name,
“Container”:
“ArtifactUrl”: adapter_s3_uri
,
,
)
使用已部署的適配器
首先,您建立一個提示以調用模型進行收益總結,並用 ECTSum 數據集中的隨機項目填充源文本。然後,您存儲該項目的真實摘要以便後續比較。
from datasets import load_dataset
dataset_name = “mrSoul7766/ECTSum”
test_dataset = load_dataset(dataset_name, trust_remote_code=True, split=”test”)
test_item = test_dataset.shuffle().select(range(1))
prompt =f”””
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
您是一個訓練有素的 AI 助手,負責總結收益電話會議。
提供一次精簡的總結,捕捉主要要點和整體背景。
重點關注季度對季度收入、每股收益、債務變化、突出風險和增長機會。
<|eot_id|><|start_header_id|>user<|end_header_id|>
總結以下收益電話會議:
test_item[“text”]
<|eot_id|><|start_header_id|>assistant<|end_header_id|>”””
ground_truth_response = test_item[“summary”]
要測試基礎模型,請指定您早前創建的端點的 EndpointName,並將基礎推理組件的名稱指定為 InferenceComponentName,連同您的提示和其他推理參數放在 Body 參數中:
component_to_invoke = base_inference_component_name
response_model = sm_rt_client.invoke_endpoint(
EndpointName = endpoint_name,
InferenceComponentName = component_to_invoke,
Body = json.dumps(
“inputs”: prompt,
“parameters”: “max_new_tokens”: 100, “temperature”:0.9
),
ContentType = “application/json”,
)
base_model_reponse = response_model[“Body”].read().decode(“utf8”)[“generated_text”]
要調用適配器,請在您的 invoke_endpoint 調用中使用適配器推理組件名稱:
component_to_invoke = adapter_ic1_name
response_model = sm_rt_client.invoke_endpoint(
EndpointName = endpoint_name,
InferenceComponentName = component_to_invoke,
Body = json.dumps(
“inputs”: prompt,
“parameters”: “max_new_tokens”: 100, “temperature”:0.9
),
ContentType = “application/json”,
)
adapter_reponse = response_model[“Body”].read().decode(“utf8”)[“generated_text”]
比較輸出
比較基礎模型和適配器的輸出與真實值。雖然基礎模型在此測試中可能看起來主觀上更好,但適配器的回應實際上更接近真實值。這一點將在下一部分通過度量來證明。
Ground Truth:
第三季度非 GAAP 每股收益 $3.71。
第三季度銷售額上升 15.4% 至 $747 百萬。
Bio Rad Laboratories – 現在預計 2021 年非 GAAP 不計貨幣影響的收入增長在 12% 至 13% 之間。
預計 2021 年非 GAAP 營業利潤率約為 19.5%。
季度 GAAP 每股收益 $129.96。
———————————-
基礎模型回應:
以下是收益電話會議的摘要:
**主要要點:**
* 收入:$747 百萬,同比增長 15.4%(按不計貨幣基準增長 13.8%)
* 每股收益:$129.96,較 2020 年第三季度的每股 $3 增加
* 營業利潤:$156.8 百萬,較 2020 年第三季度的 $109.6 百萬有所增加
* 淨利潤:$3.928
———————————-
適配器模型回應:
以下是通話的精簡摘要:
第三季度收入 $747.6 百萬,低於 Refinitiv IBES 預估的 $753.9 百萬。
第三季度每股收益 $3.71。
預計財年的每股收益在 $11.85 到 $12.05 之間。
預計 2021 年非 GAAP 收入增長為 12% 到 13%。
預計 2021 年非 GAAP 營業利潤率為 19.5%。
為了驗證適配器的真實性能,您可以使用像 fmeval 這樣的工具來評估總結準確性。這將計算適配器與基礎模型的 METEOR、ROUGE 和 BertScore 指標。在 ECTSum 測試分割上進行評估,得到以下結果。

微調的適配器顯示 METEOR 得分提高了 59%、ROUGE 得分提高了 159% 和 BertScore 提高了 8.6%。
以下圖表顯示了不同指標得分的頻率分佈,適配器在所有指標中均更常得分更高。

我們觀察到基礎模型調用與適配器之間的端到端延遲差異高達 10%。如果適配器是從 CPU 記憶體或磁碟中加載的,則在第一次加載到 GPU 時會產生額外的冷啟動延遲。但根據您的容器配置和選擇的實例類型,這些值可能會有所不同。
更新現有適配器
因為適配器作為推理組件進行管理,您可以在運行中的端點上更新它們。SageMaker 處理舊適配器的卸載和取消註冊,以及在該端點上運行的所有實例上的每個基礎推理組件上加載和註冊新適配器。要更新適配器推理組件,請使用 update_inference_component API,並提供現有推理組件名稱和新壓縮適配器存檔的 Amazon S3 路徑。
您可以訓練一個新的適配器,或重新上傳現有的適配器工件以測試此功能。
update_inference_component_response = sm_client.update_inference_component(
InferenceComponentName = adapter_ic1_name,
Specification=
“Container”:
“ArtifactUrl”: new_adapter_s3_uri
,
,
)
移除適配器
如果您需要刪除適配器,請調用 delete_inference_component API,並提供推理組件名稱以將其移除:
sess = sagemaker.session.Session()
sess.delete_inference_component(adapter_ic1_name, wait = True)
刪除基礎模型推理組件將自動刪除基礎推理組件及任何相關的適配器推理組件:
sess.delete_inference_component(base_inference_component_name, wait = True)
定價
SageMaker 多適配器推理在 AWS 區域美國東部(北維吉尼亞州、俄亥俄州)、美國西部(俄勒岡州)、亞太地區(雅加達、孟買、首爾、新加坡、悉尼、東京)、加拿大(中央)、歐洲(法蘭克福、愛爾蘭、倫敦、斯德哥爾摩)、中東(阿聯酋)和南美洲(聖保羅)普遍可用,且無需額外費用。
結論
SageMaker 中新的高效多適配器推理功能為具有微調用例的客戶開啟了令人興奮的可能性。通過允許動態加載微調的 LoRA 適配器,您可以快速且具成本效益地將 AI 模型自定義為符合您的特定需求。這種靈活性為在市場推廣、醫療保健和金融等行業的組織中部署強大且定制的 AI 開啟了新機會。通過 SageMaker 推理組件在擴展規模時管理這些適配器,使得構建量身定制的生成型 AI 解決方案變得輕而易舉。
關於作者
Dmitry Soldatkin 是 AWS 的高級機器學習解決方案架構師,幫助客戶設計和構建 AI/ML 解決方案。Dmitry 的工作涵蓋了廣泛的機器學習用例,主要關注生成型 AI、深度學習和在企業中擴展機器學習。他曾幫助許多行業的公司,包括保險、金融服務、公用事業和電信。他熱衷於持續創新,並利用數據推動商業成果。在加入 AWS 之前,Dmitry 是金融服務行業數據分析和機器學習領域的架構師、開發人員和技術領導。
Giuseppe Zappia 是 AWS 的首席 AI/ML 專家解決方案架構師,專注於幫助大型企業設計和部署 AWS 上的機器學習解決方案。他擁有超過 20 年的全棧軟體工程師經驗,並在 AWS 的過去 5 年中專注於機器學習領域。
Ram Vegiraju 是亞馬遜 SageMaker 服務團隊的機器學習架構師。他專注於幫助客戶在亞馬遜 SageMaker 上構建和優化 AI/ML 解決方案。在空閒時間,他喜歡旅行和寫作。