在此作业中,您将学习如何使用 AWS Lambda 和 API Gateway 将机器学习模型部署为无服务器应用程序。您将创建 Docker 镜像,将其推送到 Amazon Elastic Container Registry (ECR),并对已部署的应用程序进行负载测试。此外,您还将分析与无服务器函数相关的冷启动现象。
我们将使用著名的 IRIS 数据集来简化机器学习模型,使其更专注于无服务器部署过程。该数据集包含四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,并将样本分类为三类:Iris Setosa、Iris Versicolour 和 Iris Virginica。
具体来说,就是通过 AWS 的一些服务(比如 Lambda 和 API Gateway)来实现模型的预测功能。让我用更通俗的方式解释这些
步骤:
-
Lambda 函数开发
你需要编写一个核心函数lambda_handler
,这个函数负责接收从外部传来的输入数据(比如花萼和花瓣的长度和宽度等),然后用这个数据调用已经给你的predict
函数(这个函数用的是你训练好的模型),最后把模型的预测结果返回给调用者。简单来说,这个步骤的任务是:写一个函数接收输入、调用模型、返回结果。
-
环境设置
为了能完成开发和测试,你需要把开发环境设置好,确保自己的电脑上有几个关键工具:简单来说,这部分的要求就是让你安装好开发所需的工具,确保能顺利完成后续工作。
- Docker:用于打包你的程序和模型,让它们可以在任何地方运行。
- AWS CLI:这是用来和 AWS 进行通信的工具,比如上传代码、创建资源等。
- Python 和 pip:Python 是用来开发代码的语言,pip 是它的包管理工具,确保你能安装需要的库。
- Git(可选):方便管理代码版本和共享代码。
-
Docker 镜像创建
你需要创建一个 Docker 镜像,这个镜像是一个完整的“包裹”,里面包含你的代码、模型以及所有需要的环境。打包好后,它可以在任何支持 Docker 的地方运行,比如 AWS Lambda。通俗点讲,这个步骤就是把你的程序“打包”成一个可以在任何机器上运行的小盒子。
-
ECR 仓库设置
你需要在 AWS 上创建一个 ECR(Elastic Container Registry)仓库,这个仓库就像一个存放 Docker 镜像的地方。你把打包好的 Docker 镜像上传到这个仓库后,AWS Lambda 才能使用这个镜像运行你的预测模型。通俗来说,就是你得先把打包好的“盒子”放到 AWS 的仓库里,Lambda 才能拿来用。
-
Lambda 函数创建
接着,你要在 AWS Lambda 上创建一个函数,它会使用你上传的 Docker 镜像作为它的运行环境。这个函数就是你之前写的lambda_handler
,负责接收数据、调用模型、返回预测结果。这一步就是在 AWS 上“安装”你写好的模型程序,让它可以对外提供预测服务。
-
API Gateway 配置
为了让外界能够访问你的 Lambda 函数,你需要配置一个 API Gateway。API Gateway 就像一个“门口”,外部的请求通过这个门进来,访问 Lambda 函数,得到预测结果。通俗来说,这一步就是给你的预测服务配一个“入口”,方便别人访问。
-
负载测试与分析
你需要使用 Locust 这款工具来进行负载测试,看看你的预测服务在不同情况下的表现,比如在高并发下会不会变慢。另外,你需要分析冷启动现象,也就是当 Lambda 函数刚启动时的响应速度和它连续运行时的响应速度有什么区别。这部分的要求是对你的服务进行测试,看它能处理多少请求,速度如何,以及分析第一次运行(冷启动)和后续请求(热请求)之间的差异。
1. Lambda 函数开发
你需要实现一个核心函数 lambda_handler
,它的作用是接收从事件传来的输入数据,然后调用模型进行预测,最后返回预测结果。
具体步骤:
- 提取输入值:从传入的事件中获取预测所需的特征值。事件中的数据是 JSON 格式,需要将其解析为 Python 数据结构,并确保处理可能的错误情况(例如输入缺失或无效 JSON 数据)。
- 调用 predict 函数:把提取到的特征值传给已经提供的
predict
函数,predict
会返回预测结果(如分类为哪种 Iris 花的类型)。 - 返回结果:将预测结果以 JSON 格式返回给调用方。
你可以使用模拟的输入数据在 AWS Lambda 控制台上进行测试。
2. 环境设置
这一步是为了设置开发环境,确保你有完成任务所需的工具:
- Docker:用于创建和运行容器,封装你的应用程序及其依赖项。
- AWS CLI:用于与 AWS 交互,例如创建资源、推送 Docker 镜像等。
- Python 3 和 pip:开发语言和包管理工具,确保你可以安装所需的 Python 库。
- Git(可选):用于版本控制,方便管理代码。
确保你正确配置了 AWS 凭证,这样你的本地环境可以连接到 AWS。
3. Docker 镜像创建
你需要创建一个 Docker 镜像,把你的代码和模型封装到这个镜像中,然后在本地运行以确保它正常工作。
- 构建镜像:通过
docker build -t iris_image .
命令构建 Docker 镜像。 - 运行容器:使用
docker run -it --rm -p 8080:8080 iris_image:latest
来在本地启动容器,并映射端口 8080。 - 测试镜像:通过执行测试文件
test.py
,验证镜像是否正常工作。
4. ECR 仓库设置
为了让 AWS Lambda 使用你创建的 Docker 镜像,你需要把镜像上传到 AWS 的 ECR(Elastic Container Registry)仓库。
- 创建仓库:使用
aws ecr create-repository --repository-name iris-registry
命令创建 ECR 仓库。 - 登录 ECR:使用命令登录 ECR 仓库,允许 Docker 客户端与 ECR 交互。
- 推送镜像:先给镜像打标签,然后推送到 ECR 仓库,以便 AWS Lambda 可以使用。
5. Lambda 函数创建
在 AWS 控制台上,你需要通过容器镜像创建一个 Lambda 函数,选择已经创建的 Docker 镜像作为函数的运行环境,并指定执行角色(LabRole),确保 Lambda 函数可以正确运行。
6. API Gateway 配置
你需要使用 API Gateway 为你的 Lambda 函数创建一个 REST API,这样外部用户可以通过这个 API 发送请求进行预测。
- 测试 API:使用 curl 或 Windows 的 Invoke-WebRequest 来模拟发送请求,测试 API 是否能返回正确的预测结果。
7. 负载测试与分析
为了确保你的 API 在高并发场景下依然表现良好,你需要使用 Locust 进行负载测试,并分析冷启动与热请求的响应时间差异。
- 负载测试:使用 Locust 工具向 API 发送大量请求,模拟多个用户同时访问,评估 API 的性能。你需要运行 locustfile.py 脚本,指定 API 的地址和测试参数。
- 分析:在 Google Colab 上使用提供的性能分析 notebook,上传测试日志,生成冷启动和热请求的响应时间图表,并分析它们的差异。你需要提供线性图、冷启动响应时间的直方图、热请求响应时间的直方图,并为分析结果提供清晰的解释。
总结:这部分的要求是一步步引导你把机器学习模型通过 AWS 部署成无服务器应用,并且通过负载测试评估 API 的性能,尤其是冷启动现象的影响。
CSC4160 作业 3:
使用 AWS Lambda 和冷启动性能分析的模型服务 (6 分)
概述 在这个作业中,你将学习如何使用 AWS Lambda 和 API Gateway 将机器学习模型部署为无服务器应用程序。你将创建 Docker 镜像,将它们推送到 Amazon Elastic Container Registry (ECR),并对你的部署应用程序进行负载测试。此外,你还将分析与无服务器函数相关的冷启动现象。
我们将使用著名的 IRIS 数据集,以保持机器学习模型简单,专注于无服务器部署过程。该数据集包括四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度,并将样本分类为三个类别:Iris Setosa、Iris Versicolour 和 Iris Virginica。
组件 Lambda 函数开发
实现 lambda_handler 函数。 环境设置
设置你的本地开发环境。 Docker 镜像创建
制作一个 Docker 镜像,该镜像将使用训练好的模型生成预测。 ECR 仓库设置
创建一个 AWS ECR 仓库,并将你的 Docker 镜像推送到 AWS ECR。 在 AWS 控制台中创建 Lambda 函数
使用容器镜像创建 Lambda 函数。 API Gateway 配置
使用 API 网关访问预测 API 负载测试和分析
使用 Locust 对你的部署 API 进行负载测试。 绘制结果以观察冷启动趋势。 分析冷启动和热请求响应时间之间的差异。 说明
- Lambda 函数开发 你将获得 predict 函数和模型文件;你的任务是实现 lambda_handler 函数。
lambda_handler 函数执行以下任务:
提取值:它从传入的事件中检索用于进行预测的特征值。 调用 predict 函数:它调用 predict 函数,传递提取的值以根据机器学习模型生成预测。 返回预测结果:最后,它将预测结果格式化为 JSON 响应并返回给调用者。 实现 lambda_handler 的步骤 测试函数 2. 环境设置 在你的机器上设置本地开发环境:
为你的操作系统安装 Docker Desktop:Docker: Accelerated Container Application Development
安装 AWS CLI:Installing or updating to the latest version of the AWS CLI - AWS Command Line Interface
确保你已安装 Python 3 和 pip。
(可选但推荐)安装 Git:https://git-scm.com/downloads
配置你的 AWS 凭据:
AWS 凭据配置 3. Docker 镜像创建 在构建 Docker 镜像之前,请确保 Docker 守护进程正在运行(在 Windows/macOS 上启动 Docker Desktop,或在 Linux 上使用 sudo systemctl start docker)。
在你的本地机器上:
使用提供的 Dockerfile 创建 Docker 镜像:
docker build -t iris_image .
在本地运行 Docker 容器:
docker run -it --rm -p 8080:8080 iris_image:latest
这里,我们映射了端口 8080。
通过执行 test.py 验证镜像是否正常工作。
- ECR 仓库设置 首先,启动你的 AWS Academy Learner Lab 并确保你的 AWS 凭据配置正确。然后,在你的本地计算机上,按照以下步骤进行。
创建一个 ECR 仓库:
aws ecr create-repository --repository-name iris-registry
使用 ECR 认证你的 Docker 客户端:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com
获取镜像 ID:
docker image ls
标记并推送你的 Docker 镜像:
docker tag <image_id> <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/iris-registry:latest
docker push <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/iris-registry:latest
-
Lambda 函数创建 在 AWS 控制台中,使用你构建的现有容器镜像创建 Lambda 函数,并选择 LabRole 作为执行角色。
-
API Gateway 配置 通过 AWS 控制台使用 API Gateway 为你的 Lambda 函数创建一个 REST API。
使用 curl(Linux)在你的本地机器上测试你的 API:
curl --header "Content-Type: application/json" --request POST --data "{\"values\": [[<value1>, <value2>, <value3>, <value4>]]}" https://<your_api_id>.execute-api.<region>.amazonaws.com/default/<your_lambda_function>
或使用 Invoke-WebRequest(Windows):
powershell
Invoke-WebRequest -Method Post -Uri "https://<your_api_id>.execute-api.<region>.amazonaws.com/default/<your_lambda_function>" `-Headers @{ "Content-Type" = "application/json" } `-Body '{"values": [[<value1>, <value2>, <value3>, <value4>]]}'
- 负载测试和分析 负载测试 在你的本地机器上,使用提供的 Locust 负载测试脚本来评估你的部署 API 的性能。
安装 Locust
pip install locust
导航到包含 locustfile.py 的目录。
使用以下命令运行 Locust 测试:
locust -f locustfile.py --host https://<your_api_gateway_id>.execute-api.us-east-1.amazonaws.com --users 10 --spawn-rate 5 --run-time 60s --csv "locust_logs/test" --csv-full-history --html "locust_logs/test_locust_report.html" --logfile "locust_logs/test_locust_logs.txt" --headless
对于 Windows 用户,设置 locust 的 PATH,或直接使用 locust.exe,指定其路径,例如:
c:\users\user\appdata\roaming\python\python39\scripts\locust.exe -f locustfile.py --host https://<your_api_gateway_id>.execute-api.us-east-1.amazonaws.com --users 10 --spawn-rate 5 --run-time 60s --csv "locust_logs/test" --csv-full-history --html "locust_logs/test_locust_report.html" --logfile "locust_logs/test_locust_logs.txt" --headless
分析 使用 Google Colab 上的性能分析笔记本分析结果。上传你的日志并运行笔记本 performance_analysis.ipynb。在绘制直方图比较冷启动和热请求响应时间之前,填写估计的冷启动时间(在 <FILL IN>)。
你将在你的 .ipynb 中包含所需的图表以获得 1 分:一条线图,一个冷启动直方图,以及一个热请求直方图。此外,如果你提供清晰的分析解释,将额外获得 0.5 分。
问题 理解 AWS Lambda、API Gateway 和 ECR AWS Lambda 函数 (0.5 分):
Lambda 函数在无服务器部署中扮演什么角色?lambda_handler 函数如何处理请求?
答案: <你的答案在这里>。
API Gateway 和 Lambda 集成 (0.5 分):
解释 API Gateway 在此部署过程中的目的。它如何将请求路由到 Lambda 函数?
答案: <你的答案在这里>。
ECR 角色 (0.5 分):
ECR 在此部署中扮演什么角色?它如何与 Lambda 集成以管理容器化应用程序?
答案: <你的答案在这里>。
冷启动现象分析 冷启动与热请求 (1 分):
提供你的分析,比较在冷启动期间与热请求的性能(基于你在 performance_analysis.ipynb 中获得的线图和直方图)。讨论响应时间的差异以及在负载测试期间观察到的任何显著模式。
答案: <你的答案在这里>。
影响和策略 (0.5 分):
讨论冷启动对无服务器应用程序的影响及其对性能的影响。可以采用哪些策略来减轻这些影响?
答案: <你的答案在这里>。
API Gateway 和 Lambda 集成 (0.5 分):
解释 API Gateway 在此部署过程中的目的。它如何将请求路由到 Lambda 函数?
答案: <你的答案在这里>。
ECR 角色 (0.5 分):
ECR 在此部署中扮演什么角色?它如何与 Lambda 集成以管理容器化应用程序?
答案: <你的答案在这里>。
冷启动现象分析 冷启动与热请求 (1 分):
提供你的分析,比较在冷启动期间与热请求的性能(基于你在 performance_analysis.ipynb 中获得的线图和直方图)。讨论响应时间的差异以及在负载测试期间观察到的任何显著模式。
答案: <你的答案在这里>。
影响和策略 (0.5 分):
讨论冷启动对无服务器应用程序的影响及其对性能的影响。可以采用哪些策略来减轻这些影响?
答案: <你的答案在这里>。
提交要求
请将你的作业通过 BlackBoard 提交为一个 .zip 文件,包括以下文件:
README.md(回答所有问题)(3 分)
lambda_function.py(你的 Lambda 函数实现)(1 分)
提取值 调用 predict 函数 返回预测结果 提供你的 Lambda 函数调用的一个 CloudWatch 日志事件。 (0.5 分)
使用 curl 或 Invoke-WebRequest 显示正确预测输出的成功请求和响应的屏幕截图。 (0.5 分)
performance_analysis.ipynb,包括: 线图、冷启动直方图和热请求直方图的图表。 (0.5 分)
test_locust_logs.txt(Locust 负载测试日志)(0.5 分)