機器學習的種子(ML)範式轉移已經存在數十年了,但是隨著現成的無限計算能力,數據的大量擴散以及ML技術的快速發展,各個行業的客戶正在迅速採用並使用ML技術來轉變其企業。
就在最近,生成的AI應用程序吸引了每個人的注意力和想像力。在ML廣泛採用的情況下,我們確實處於令人興奮的拐點,我們相信每種客戶體驗和應用都將通過生成的AI重新發明。
生成的AI是一種可以創建新內容和想法的人工智能,包括對話,故事,圖像,視頻和音樂。與所有AI一樣,生成的AI也由ML模型提供動力 - 非常大的模型,這些模型已在大量的數據庫中預先培訓,通常稱為基礎模型(FMS)。
FMS的大小和通用性質使它們不同於傳統的ML模型,這些模型通常執行特定的任務,例如分析文本以獲取情感,分類圖像和預測趨勢。

借助傳統ML模型,為了完成每個特定任務,您需要收集標記的數據,訓練模型並部署該模型。借助基礎模型,您可以使用相同的預訓練的FM來調整各種任務,而不是收集每個模型的標記數據並培訓多個模型。您還可以自定義FMS執行與業務不同的域特異性功能,僅使用一小部分數據和從頭開始訓練模型所需的計算。
生成的AI有可能通過徹底改變內容的創建和消費內容方式來破壞許多行業。原始內容生產,代碼生成,客戶服務增強和文檔摘要是生成AI的典型用例。
Amazon Sagemaker Jumpstart為各種問題類型提供了預培訓的開源模型,以幫助您開始使用ML。您可以在部署前逐步訓練和調整這些模型。 JumpStart還提供了為常見用例設置基礎架構的解決方案模板,並使用Amazon Sagemaker使用ML的可執行示例筆記本。
JumpStart擁有超過600個預訓練的模型並每天增長,使開發人員能夠快速,輕鬆地將最先進的ML技術納入其生產工作流程中。您可以通過Amazon Sagemaker Studio的JumpStart Landing頁面訪問預先訓練的模型,解決方案模板和示例。您還可以使用SageMaker Python SDK訪問JumpStart模型。有關如何以編程方式使用JumpStart模型的信息,請參閱使用驗證模型使用SageMaker JumpStart算法。
2023年4月,AWS揭幕了亞馬遜基岩,該基地通過來自AI21 Labs,Anthropic和穩定性AI在內的初創公司的預培訓模型提供了一種方法來構建AI-AI驅動的應用程序。亞馬遜Bedrock還提供訪問Titan Foundation Models,這是一個由AWS內部培訓的模型家族。 With the serverless experience of Amazon Bedrock, you can easily find the right model for your needs, get started quickly, privately customize FMs with your own data, and easily integrate and deploy them into your applications using the AWS tools and capabilities you're familiar with (including integrations with SageMaker ML features like Amazon SageMaker Experiments to test different models and Amazon SageMaker Pipelines to manage your FMs at scale) without having to manage any infrastructure.
在這篇文章中,我們展示瞭如何使用AWS Cloud Development套件(AWS CDK)從JumpStart部署圖像和文本生成的AI模型。 AWS CDK是一個開源軟件開發框架,可使用Python等熟悉的編程語言來定義您的雲應用程序資源。
我們將穩定的擴散模型用於圖像生成和Flan-T5-XL模型,用於自然語言理解(NLU),並從JumpStart中擁抱面對面的Face Generation。
Web應用程序建立在Spartlit上,這是一個開源Python庫,它使創建和共享用於ML和數據科學的美麗的自定義Web應用程序變得易於使用。我們使用AWS Fargate使用Amazon Elastic Container Service(Amazon ECS)託管Web應用程序,並可以通過應用程序負載平衡器訪問。 Fargate是一項技術,您可以與Amazon ECS一起運行容器,而無需管理服務器,群集或虛擬機。生成AI模型端點是從Amazon Elastic Container Registry(Amazon ECR)中的JumpStart Image啟動的。模型數據存儲在JumpStart帳戶中的Amazon簡單存儲服務(Amazon S3)上。 Web應用程序通過Amazon API網關與模型進行交互,而AWS Lambda功能如下圖所示。

API網關為Web應用程序和其他客戶端提供標準的RESTFULL接口,同時屏蔽與模型接口的Lambda功能。這簡化了消耗模型的客戶端應用程序代碼。在此示例中,可以公開訪問API網關端點,從而可以擴展此體系結構以實現不同的API訪問控件並與其他應用程序集成。
在這篇文章中,我們會引導您完成以下步驟:
我們在本文末尾的附錄中提供了該項目中代碼的概述。
您必須有以下先決條件:
您可以從本地計算機中部署本教程中的基礎架構,也可以將AWS Cloud9用作部署工作站。 AWS Cloud9預裝了AWS CLI,AWS CDK和Docker。如果選擇AWS Cloud9,請從AWS控制台創建環境。
假設您將資源運行8個小時,估計完成此職位的估計成本為50美元。確保刪除本文中創建的資源,以避免持續的費用。
如果您在本地計算機上還沒有AWS CLI,請參閱安裝或更新AWS CLI的最新版本並配置AWS CLI。
使用以下節點軟件包管理器命令在全球安裝AWS CDK工具包:
npm install -g aws-cdk-lib@latest
運行以下命令以驗證正確的安裝並打印AWS CDK的版本號:
cdk --version
確保您在本地計算機上安裝了Docker。發出以下命令來驗證版本:
docker --version
在本地機器上,用以下命令克隆AWS CDK應用程序:
git clone https://github.com/aws-samples/generative-ai-sagemaker-cdk-demo.git
導航到項目文件夾:
cd generative-ai-sagemaker-cdk-demo
在部署應用程序之前,讓我們查看目錄結構:
.
├── LICENSE
├── README.md
├── app.py
├── cdk.json
├── code
│ ├── lambda_txt2img
│ │ └── txt2img.py
│ └── lambda_txt2nlu
│ └── txt2nlu.py
├── construct
│ └── sagemaker_endpoint_construct.py
├── images
│ ├── architecture.png
│ ├── ...
├── requirements-dev.txt
├── requirements.txt
├── source.bat
├── stack
│ ├── __init__.py
│ ├── generative_ai_demo_web_stack.py
│ ├── generative_ai_txt2img_sagemaker_stack.py
│ ├── generative_ai_txt2nlu_sagemaker_stack.py
│ └── generative_ai_vpc_network_stack.py
├── tests
│ ├── __init__.py
│ └── ...
└── web-app
├── Dockerfile
├── Home.py
├── configs.py
├── img
│ └── sagemaker.png
├── pages
│ ├── 2_Image_Generation.py
│ └── 3_Text_Generation.py
└── requirements.txt stack文件夾包含AWS CDK應用程序中每個堆棧的代碼。 code文件夾包含Amazon Lambda函數的代碼。存儲庫還包含位於文件夾web-app下的Web應用程序。
cdk.json文件告訴AWS CDK工具包如何運行您的應用程序。
該應用程序在us-east-1區域進行了測試,但應在具有所需的服務和推理實例類型ml.g4dn.4xlarge的任何區域起作用。
該項目就像標準Python項目一樣。使用以下代碼創建Python虛擬環境:
python3 -m venv .venv
使用以下命令激活虛擬環境:
source .venv/bin/activate
如果您在Windows平台上,請激活虛擬環境,如下所示:
.venvScriptsactivate.bat
激活虛擬環境後,將PIP升級到最新版本:
python3 -m pip install --upgrade pip
安裝所需的依賴項:
pip install -r requirements.txt
在部署任何AWS CDK應用程序之前,您需要在帳戶和所部署的區域中引導一個空間。要在默認區域中引導Strap,請發出以下命令:
cdk bootstrap
如果要部署到特定帳戶和區域,請發出以下命令:
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
有關此設置的更多信息,請訪問AWS CDK入門。
如下圖所示,AWS CDK應用程序包含多個堆棧。

您可以使用以下命令列出CDK應用程序中的堆棧:
cdk list您應該得到以下輸出:
GenerativeAiTxt2imgSagemakerStack
GenerativeAiTxt2nluSagemakerStack
GenerativeAiVpcNetworkStack
GenerativeAiDemoWebStack
其他有用的AWS CDK命令:
cdk ls列出應用中的所有堆棧cdk synth - 排放合成的AWS雲形式模板cdk deploy - 將此堆棧部署到您的默認AWS帳戶和區域cdk diff - 將已部署的堆棧與當前狀態進行比較cdk docs - 打開AWS CDK文檔下一節將向您展示如何部署AWS CDK應用程序。
AWS CDK應用程序將根據您的工作站配置部署到默認區域。如果要強制在特定區域中部署,請相應地設置AWS_DEFAULT_REGION環境。
此時,您可以部署AWS CDK應用程序。首先,您啟動VPC網絡堆棧:
cdk deploy GenerativeAiVpcNetworkStack
如果提示您,請輸入y進行部署。您應該看到堆棧中正在提供的AWS資源列表。此步驟大約需要3分鐘才能完成。
然後,您啟動Web應用程序堆棧:
cdk deploy GenerativeAiDemoWebStack
分析堆棧後,AWS CDK將在堆棧中顯示資源列表。輸入Y進行部署。此步驟大約需要5分鐘。

請注意從輸出中記下WebApplicationServiceURL ,因為您稍後將使用它。您還可以在GenerativeAiDemoWebStack堆棧輸出下以較晚的雲形式控制台檢索。
現在,啟動圖像生成AI模型端點堆棧:
cdk deploy GenerativeAiTxt2imgSagemakerStack
此步驟大約需要8分鐘。圖像生成模型端點已部署,我們現在可以使用它。
第一個示例演示瞭如何利用穩定擴散,這是一種強大的生成建模技術,可以從文本提示中創建高質量的圖像。
WebApplicationServiceURL從瀏覽器中的GenerativeAiDemoWebStack的輸出中訪問Web應用程序。 
在導航窗格中,選擇圖像生成。
SageMaker端點名稱和API GW URL字段將被預先填充,但是如果需要,您可以更改圖像描述的提示。
選擇生成圖像。

該應用程序將致電薩吉式端點。需要幾秒鐘。將顯示圖像描述中具有Charasterics的圖片。

第二個示例圍繞著使用Flan-T5-XL模型(即基礎或大語言模型(LLM))來實現文本生成的文本學習,同時還解決了廣泛的自然語言理解(NLU)和自然語言生成(NLG)任務。
某些環境可能會限制您一次可以啟動的端點數量。如果是這種情況,您可以一次啟動一個sagemaker端點。要停止AWS CDK應用中的SageMaker端點,您必須銷毀已部署的端點堆棧,然後在啟動另一個端點堆棧之前。要調低圖像生成AI模型端點,請發出以下命令:
cdk destroy GenerativeAiTxt2imgSagemakerStack
然後啟動文本生成AI模型端點堆棧:
cdk deploy GenerativeAiTxt2nluSagemakerStack
在提示下輸入y 。
在啟動文本生成模型端點堆棧之後,完成以下步驟:

在上下文下方,您將在下拉菜單選項中找到一些預處理的查詢。

您還可以在輸入查詢字段中輸入自己的查詢,然後選擇生成響應。

在AWS CloudFormation Console上,選擇導航窗格中的堆棧以查看部署的堆棧。

在Amazon ECS控制台上,您可以在群集頁面上看到簇。

在AWS lambda控制台上,您可以在功能頁面上看到功能。

在API網關控制台上,您可以在API頁面上看到API網關端點。

在SageMaker控制台上,您可以在端點頁面上看到部署的模型端點。

啟動堆棧時,會生成一些參數。這些存儲在AWS Systems Manager參數存儲中。要查看它們,請選擇AWS Systems Manager控制台的導航窗格中的參數存儲。

為避免不必要的成本,請清理工作站上使用以下命令創建的所有基礎架構:
cdk destroy --all
在提示下輸入y 。此步驟大約需要10分鐘。檢查是否在控制台上刪除了所有資源。還刪除AWS CDK在Amazon S3控制台上創建的資產S3存儲庫以及Amazon ECR上的資產存儲庫。
如本文所示,您可以使用AWS CDK在Jumpstart中部署生成AI模型。我們展示了一個圖像生成示例和一個文本生成示例,該示例使用了由Sparlit,Lambda和API網關供電的用戶界面。
現在,您可以在JumpStart中使用預訓練的AI模型來構建生成AI項目。您還可以擴展此項目,以微調用例並控制對API網關端點的訪問。
我們邀請您測試解決方案,並在GitHub上為項目做出貢獻。
此示例代碼可根據修改後的MIT許可提供。有關更多信息,請參見許可證文件。另外,請查看有關擁抱面孔的穩定擴散和Flan-T5-XL模型的許可。
Hantzley Tauckoor是位於新加坡的APJ合作夥伴解決方案架構負責人。他在ICT行業擁有20年的經驗,涵蓋了多個功能領域,包括解決方案架構,業務開發,銷售策略,諮詢和領導力。他領導了一個高級解決方案架構師團隊,使合作夥伴能夠開發聯合解決方案,建立技術能力,並在客戶遷移並將其應用於AWS的應用程序現代化時引導他們在實施階段。外部工作,他喜歡與家人共度時光,看電影和遠足。
Kwonyul Choi是位於首爾的韓國美容護理平台初創公司Babitalk的首席技術官。在擔任此職位之前,Kownyul曾在AWS擔任軟件開發工程師,重點是AWS CDK和Amazon Sagemaker。
Arunprasath Shankar是AWS的高級AI/ML專業解決方案架構師,可幫助全球客戶在雲中有效有效地擴展其AI解決方案。在業餘時間,阿倫喜歡看科幻電影和聽古典音樂。
Satish Upreti是APJ合作夥伴組織中的遷移負責人PSA和安全中小企業。 Satish擁有20年的本地私人云和公共雲技術的經驗。自2020年8月加入AWS作為移民專家以來,他為AWS合作夥伴提供了廣泛的技術建議和支持,以計劃和實施複雜的遷移。
在本節中,我們將概述此項目中的代碼。
AWS CDK應用程序
root目錄中的app.py文件中包含主AWS CDK應用程序。該項目由多個堆棧組成,因此我們必須導入堆棧:
#!/usr/bin/env python3
import aws_cdk as cdk
from stack . generative_ai_vpc_network_stack import GenerativeAiVpcNetworkStack
from stack . generative_ai_demo_web_stack import GenerativeAiDemoWebStack
from stack . generative_ai_txt2nlu_sagemaker_stack import GenerativeAiTxt2nluSagemakerStack
from stack . generative_ai_txt2img_sagemaker_stack import GenerativeAiTxt2imgSagemakerStack我們定義了我們的生成AI模型,並從Sagemaker那裡獲取相關的URI:
from script . sagemaker_uri import *
import boto3
region_name = boto3 . Session (). region_name
env = { "region" : region_name }
#Text to Image model parameters
TXT2IMG_MODEL_ID = "model-txt2img-stabilityai-stable-diffusion-v2-1-base"
TXT2IMG_INFERENCE_INSTANCE_TYPE = "ml.g4dn.4xlarge"
TXT2IMG_MODEL_TASK_TYPE = "txt2img"
TXT2IMG_MODEL_INFO = get_sagemaker_uris ( model_id = TXT2IMG_MODEL_ID ,
model_task_type = TXT2IMG_MODEL_TASK_TYPE ,
instance_type = TXT2IMG_INFERENCE_INSTANCE_TYPE ,
region_name = region_name )
#Text to NLU image model parameters
TXT2NLU_MODEL_ID = "huggingface-text2text-flan-t5-xl"
TXT2NLU_INFERENCE_INSTANCE_TYPE = "ml.g4dn.4xlarge"
TXT2NLU_MODEL_TASK_TYPE = "text2text"
TXT2NLU_MODEL_INFO = get_sagemaker_uris ( model_id = TXT2NLU_MODEL_ID ,
model_task_type = TXT2NLU_MODEL_TASK_TYPE ,
instance_type = TXT2NLU_INFERENCE_INSTANCE_TYPE ,
region_name = region_name )功能get_sagemaker_uris從Amazon Jumpstart檢索所有模型信息。請參閱腳本/sagemaker_uri.py。
然後,我們實例化堆棧:
app = cdk . App ()
network_stack = GenerativeAiVpcNetworkStack ( app , "GenerativeAiVpcNetworkStack" , env = env )
GenerativeAiDemoWebStack ( app , "GenerativeAiDemoWebStack" , vpc = network_stack . vpc , env = env )
GenerativeAiTxt2nluSagemakerStack ( app , "GenerativeAiTxt2nluSagemakerStack" , env = env , model_info = TXT2NLU_MODEL_INFO )
GenerativeAiTxt2imgSagemakerStack ( app , "GenerativeAiTxt2imgSagemakerStack" , env = env , model_info = TXT2IMG_MODEL_INFO )
app . synth ()啟動的第一個堆棧是VPC堆棧GenerativeAiVpcNetworkStack 。 Web應用程序堆棧GenerativeAiDemoWebStack取決於VPC堆棧。依賴關係是通過參數傳遞vpc=network_stack.vpc完成的。
有關完整代碼,請參見app.py。
VPC網絡堆棧
在GenerativeAiVpcNetworkStack堆棧中,我們創建了一個帶有公共子網和一個私有子網的VPC,跨越了兩個可用性區域(AZS):
self . output_vpc = ec2 . Vpc ( self , "VPC" ,
nat_gateways = 1 ,
ip_addresses = ec2 . IpAddresses . cidr ( "10.0.0.0/16" ),
max_azs = 2 ,
subnet_configuration = [
ec2 . SubnetConfiguration ( name = "public" , subnet_type = ec2 . SubnetType . PUBLIC , cidr_mask = 24 ),
ec2 . SubnetConfiguration ( name = "private" , subnet_type = ec2 . SubnetType . PRIVATE_WITH_EGRESS , cidr_mask = 24 )
]
)有關完整代碼,請參見 /stack/generative_ai_ai_vpc_network_stack.py。
演示Web應用程序堆棧
在GenerativeAiDemoWebStack堆棧中,我們啟動Lambda功能和各自的Amazon API Gateway端點,Web應用程序通過這些功能與SageMaker模型端點進行交互。請參閱以下代碼段:
# Defines an AWS Lambda function for Image Generation service
lambda_txt2img = _lambda . Function (
self , "lambda_txt2img" ,
runtime = _lambda . Runtime . PYTHON_3_9 ,
code = _lambda . Code . from_asset ( "code/lambda_txt2img" ),
handler = "txt2img.lambda_handler" ,
role = role ,
timeout = Duration . seconds ( 180 ),
memory_size = 512 ,
vpc_subnets = ec2 . SubnetSelection (
subnet_type = ec2 . SubnetType . PRIVATE_WITH_EGRESS
),
vpc = vpc
)
# Defines an Amazon API Gateway endpoint for Image Generation service
txt2img_apigw_endpoint = apigw . LambdaRestApi (
self , "txt2img_apigw_endpoint" ,
handler = lambda_txt2img
)Web應用程序已在具有Fargate的Amazon ECS上進行了容器並託管。請參閱以下代碼段:
# Create Fargate service
fargate_service = ecs_patterns . ApplicationLoadBalancedFargateService (
self , "WebApplication" ,
cluster = cluster , # Required
cpu = 2048 , # Default is 256 (512 is 0.5 vCPU, 2048 is 2 vCPU)
desired_count = 1 , # Default is 1
task_image_options = ecs_patterns . ApplicationLoadBalancedTaskImageOptions (
image = image ,
container_port = 8501 ,
),
#load_balancer_name="gen-ai-demo",
memory_limit_mib = 4096 , # Default is 512
public_load_balancer = True ) # Default is True有關完整代碼,請參見 /stack /generative_ai_demo_web_stack.py。
圖像生成sagemaker模型端點堆棧
GenerativeAiTxt2imgSagemakerStack堆棧從SageMaker JumpStart創建圖像生成模型端點,並將端點名稱存儲在AWS Systems Manager參數商店中。 Web應用程序將使用此參數。請參閱以下代碼:
endpoint = SageMakerEndpointConstruct ( self , "TXT2IMG" ,
project_prefix = "GenerativeAiDemo" ,
role_arn = role . role_arn ,
model_name = "StableDiffusionText2Img" ,
model_bucket_name = model_info [ "model_bucket_name" ],
model_bucket_key = model_info [ "model_bucket_key" ],
model_docker_image = model_info [ "model_docker_image" ],
variant_name = "AllTraffic" ,
variant_weight = 1 ,
instance_count = 1 ,
instance_type = model_info [ "instance_type" ],
environment = {
"MMS_MAX_RESPONSE_SIZE" : "20000000" ,
"SAGEMAKER_CONTAINER_LOG_LEVEL" : "20" ,
"SAGEMAKER_PROGRAM" : "inference.py" ,
"SAGEMAKER_REGION" : model_info [ "region_name" ],
"SAGEMAKER_SUBMIT_DIRECTORY" : "/opt/ml/model/code" ,
},
deploy_enable = True
)
ssm . StringParameter ( self , "txt2img_sm_endpoint" , parameter_name = "txt2img_sm_endpoint" , string_value = endpoint . endpoint_name )有關完整代碼,請參見 /stack/generative_ai_txt2img_sagemaker_stack.py。
NLU和文本生成sagemaker模型端點堆棧
GenerativeAiTxt2nluSagemakerStack堆棧從Jumpstart創建NLU和文本生成模型端點,並將端點名稱存儲在Systems Manager參數存儲中。 Web應用程序也將使用此參數。請參閱以下代碼:
endpoint = SageMakerEndpointConstruct ( self , "TXT2NLU" ,
project_prefix = "GenerativeAiDemo" ,
role_arn = role . role_arn ,
model_name = "HuggingfaceText2TextFlan" ,
model_bucket_name = model_info [ "model_bucket_name" ],
model_bucket_key = model_info [ "model_bucket_key" ],
model_docker_image = model_info [ "model_docker_image" ],
variant_name = "AllTraffic" ,
variant_weight = 1 ,
instance_count = 1 ,
instance_type = model_info [ "instance_type" ],
environment = {
"MODEL_CACHE_ROOT" : "/opt/ml/model" ,
"SAGEMAKER_ENV" : "1" ,
"SAGEMAKER_MODEL_SERVER_TIMEOUT" : "3600" ,
"SAGEMAKER_MODEL_SERVER_WORKERS" : "1" ,
"SAGEMAKER_PROGRAM" : "inference.py" ,
"SAGEMAKER_SUBMIT_DIRECTORY" : "/opt/ml/model/code/" ,
"TS_DEFAULT_WORKERS_PER_MODEL" : "1"
},
deploy_enable = True
)
ssm . StringParameter ( self , "txt2nlu_sm_endpoint" , parameter_name = "txt2nlu_sm_endpoint" , string_value = endpoint . endpoint_name )有關完整代碼,請參見 /stack/generative_ai_txt2nlu_sagemaker_stack.py。
Web應用程序
Web應用程序位於 /Web-App目錄中。這是一個簡化的應用程序,按照Dockerfile的容器進行了容器:
FROM --platform=linux/x86_64 python:3.9
EXPOSE 8501
WORKDIR /app
COPY requirements.txt ./requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD streamlit run Home.py
--server.headless true
--browser.serverAddress= "0.0.0.0"
--server.enableCORS false
--browser.gatherUsageStats false要了解有關簡化的更多信息,請參見“簡化文檔”。