机器学习的种子(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要了解有关简化的更多信息,请参见“简化文档”。