在 2023 亚马逊云科技 re:Invent 之后,细心的开发者们也许已经发现有一个很有趣的动手实验:开发一款可部署的基于大语言模型的字谜游戏:
该款游戏使用了文生图模型为玩家提供一个未知的提示词,玩家需要根据模型生成的图像来猜测该提示词,来完成游戏。该动手实验完整地展示了如何在亚马逊云科技上完整构建生成式 AI 应用程序。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!
在构建生成式 AI 应用程序实践”系列内容中,我将通过三篇博客来介绍这个有趣的动手实验,并由此展示完整构建基于大模型的生成式 AI 应用的代码实践,以帮助生成式 AI 开发者们来完整了解构建生成式 AI 应用开发的整个流程,这些工作包括:
-
构建和部署前端程序(包括使用亚马逊云科技 CDK 部署 Streamlit 应用等)
-
构建和部署后端程序(包括部署实现不同场景功能的三个大模型等)
-
面向生产环境的持续集成和持续部署(CI/CD)
本文是这个系列的第一篇,将概要介绍如何创建 Amazon SageMaker 笔记本实例,获取完整的前后端程序代码,实验涉及的组件和实现代码文件等内容。
创建 Amazon SageMaker 笔记本实例
你即将开始使用 Stable Diffusion 基础模型结合生成式 AI 和 Amazon SageMaker JumpStart 创建一个猜谜游戏。需要确认你的亚马逊云科技账号已准备就绪。
亚马逊云科技账号准备就绪后,首先需要创建一个名为“stable-diffusion”的 Amazon SageMaker 笔记本实例(此处作者创建了一个名为“stable-diffusion”的实例)。实例创建后,需要等待大约 10 分钟,直到其变为“InService”状态。如下图所示:
此处示例显示创建的笔记本实例类型为 ml.m5.xlarge,作者在 ml.t3.medium 笔记本实例也成功完成过这个实验。创建实例时,注意为实例配置合适的 IAM 角色,使其具有访问 S3 和 SageMaker 的权限。如下图所示:
在 Amazon SageMaker 中获取完整程序代码
在上一节中,我们已经创建了 Amazon SageMaker 实例,现在将使用 JupyterLab 终端提取为该实验准备的完整程序代码。点击“Open JupyterLab”进入 JupyterLab Launcher 面板,如下图所示。
点击“Terminal”进入 Terminal 界面。由于代码位于:s3://aws-jam-challenge-resources/genai-charades/generative-charades.zip
因此,我们输入如下命令来获取程序代码包,并解压包获得完整程序代码:
$ cd /home/ec2-user/SageMaker
$ aws s3 cp s3://aws-jam-challenge-resources/genai-charades/generative-charades.zip .
$ unzip generative-charades.zip
如下图所示:
解压代码包后,在 JupyterLab 左侧会看到一个 generative-charades 的目录(如下截图所示),这个目录下就是我们这个实验的全部代码。从这篇开始的系列博客,我们将一起分析这套代码是如何实现一个生成式 AI 的完整应用的。
应用程序组件构成概述
该生成式 AI 驱动的猜谜游戏将由三个大模型,以及其它组件共同构成。
首先,我们需要一个文字生成图像的大模型来担当图像生成器的工作。在本例中,这个模型还应该能够部署成为一个独立的端点,这样任何想要玩游戏的人,不需要在他们的机器上安装 GPU 即可开展游戏。
其次,我们需要一个文本嵌入的大模型来做评分裁判的工作。在本例中,我们将使用这个文本嵌入模型,把用户提供的答案与实际正确答案进行比较,以反馈给用户最终结果;另外,这个模型也应该能够部署成为一个独立的端点,以响应来自大量游戏玩家的猜谜请求。
最后,我们还需要一个文本生成的大模型来做提示生成的工作。因为我们计划可以选择性地提供一个机制,向用户提供提示,但又不泄露精确的正确提示词本身。
综上所述,该生成式 AI 驱动的猜谜游戏各组件逻辑图,如下图所示:
除了三个大模型做主要功能担当之外,以上架构图还展示了我们为实现完整应用程序而需要的其它各组件,包括:
-
S3 做游戏所需的模型构件提供对象存储等
-
ECS 和 Fargate 封装了游戏所需的服务等
-
Cloudfront 为游戏提供内容缓存等
这些功能我们将通过下面两个 Notebook 和大家一起逐步完成部署。
应用程序部署代码概述
Notebook #1 – 部署三个基础大模型作为后端
第一个 notebook 是 deploy_charades_endpoints.ipynb,如下图所示:
这个 notebook 将逐步实现如何部署三个大模型作为后端支撑。
以部署文本生成图像的大模型为例,我们将使用 Stable Diffusion 1.5(或 2.1)基础版的大模型。以下代码将通过 SageMaker Jumpstart 将 SD 1.5(或 2.1)基础版模型部署为 Amazon SageMaker 端点。
由于 Amazon SageMaker 托管基于 Docker 容器,因此为了将我们的模型部署为端点,我们需要一个 Docker 容器以及用于调用模型进行推理的脚本。Amazon SageMaker 端点的架构如下所示:
幸运的是,Amazon SageMaker Jumpstart 提供了所有这些功能。当我们运行以下代码单元段时,它将打印出我们使用的 Docker 容器、源代码的位置以及我们将要部署的模型 URI:
from sagemaker import image_uris, model_uris, script_uris, hyperparameters
from sagemaker.model import Model
from sagemaker.predictor import Predictor
from sagemaker.utils import name_from_base# deploy
# model_id = "huggingface-txt2img-runwayml-stable-diffusion-v1-5"
model_id = "model-txt2img-stabilityai-stable-diffusion-v2-1-base"# sd_endpoint_name = name_from_base(f"jumpstart-example-infer-{model_id}")
sd_endpoint_name = f"jumpstart-{model_id}"# Please use ml.g5.xlarge instance type if it is available in your region. ml.g5.xlarge has 24GB GPU compared to 16GB in ml.p3.2xlarge and supports generation of larger and better quality images.
inference_instance_type = "ml.g4dn.2xlarge"
model_version = '1.1.0'# Retrieve the inference docker container uri. This is the base HuggingFace container image for the default model above.
deploy_image_uri = image_uris.retrieve(region=None,framework=None, # automatically inferred from model_idimage_scope="inference",model_id=model_id,model_version=model_version,instance_type=inference_instance_type,
)# Retrieve the inference script uri. This includes all dependencies and scripts for model loading, inference handling etc.
deploy_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="inference"
)# Retrieve the model uri. This includes the pre-trained nvidia-ssd model and parameters.
model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference"
)# To increase the maximum response size from the endpoint.
env = {"MMS_MAX_RESPONSE_SIZE": "20000000",
}print("deploying image uri:", deploy_image_uri)
print("deploying source uri:", deploy_source_uri)
print("deploying model uri:", model_uri)
以上代码段的作者实际运行输出如下所示,供参考:
Notebook #2 – 部署前端和实现CI/CD
第二个 notebook 是 CDK-notebook.ipynb,如下图所示:
Amazon SageMaker 端点为三个基础大模型创建完成后,我们还需要使用 亚马逊云科技云开发工具包 (CDK) 来 部署 Streamlit 应用。
亚马逊云科技云开发工具包 (CDK) 是一款开源软件开发框架,可使用代码定义云基础设施并通过 CloudFormation 进行配置。它由两大主要部分组成:
1. CDK Construct 库:包含一系列预先编写、模块化且可重复使用的代码片段,称为构造 (construct)。开发者可以使用、修改和集成这些构造块,快速开发基础设施。该库旨在简化使用服务构建应用程序时,定义和集成各个服务所需的复杂性。
2. CDK 工具包:用于与 CDK 应用交互的命令行工具。您可以使用它来创建、管理和部署 CDK 项目。CDK 支持 TypeScript、JavaScript、Python、Java、C#/.Net 和 Go 等编程语言。开发者可以使用任何一种支持的语言来定义可重复使用的云组件 (construct),然后将它们组合成栈 (stack) 和应用 (app);最后将 CDK 应用部署到 CloudFormation,以配置或更新资源。
亚马逊云科技云开发工具包 (CDK) 的工作原理如下图所示:
在这个 notebook 中,我们将学习 CDK 的基本概念,并构建一个模板,用于部署一个基于我们刚刚生成的模型和 UI 的整体解决方案,从而打包我们的猜谜游戏。
在下一篇文章中,我们将详细介绍如何使用 Amazon SageMaker 来部署这个游戏需要的三个大模型:
-
文本生成图像模型—Stable Diffusion 1.5(或 2.1)
-
文本嵌入模型—MiniLM L6 v2
-
文本生成模型—Falcon 7B Instruct
敬请期待。
文章来源:猜字谜|构建生成式 AI 应用实践(一)