[云] 创建 Docker 镜像,将其推送到 Amazon Elastic Container Registry (ECR),并对已部署的应用程序进行负载测试

在此作业中,您将学习如何使用 AWS Lambda 和 API Gateway 将机器学习模型部署为无服务器应用程序。您将创建 Docker 镜像,将其推送到 Amazon Elastic Container Registry (ECR),并对已部署的应用程序进行负载测试。此外,您还将分析与无服务器函数相关的冷启动现象

我们将使用著名的 IRIS 数据集来简化机器学习模型,使其更专注于无服务器部署过程。该数据集包含四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,并将样本分类为三类:Iris Setosa、Iris Versicolour 和 Iris Virginica。

具体来说,就是通过 AWS 的一些服务(比如 Lambda 和 API Gateway)来实现模型的预测功能。让我用更通俗的方式解释这些

步骤:

  1. Lambda 函数开发
    你需要编写一个核心函数 lambda_handler,这个函数负责接收从外部传来的输入数据(比如花萼和花瓣的长度和宽度等),然后用这个数据调用已经给你的 predict 函数(这个函数用的是你训练好的模型),最后把模型的预测结果返回给调用者。

    简单来说,这个步骤的任务是:写一个函数接收输入、调用模型、返回结果。

  2. 环境设置
    为了能完成开发和测试,你需要把开发环境设置好,确保自己的电脑上有几个关键工具:

    简单来说,这部分的要求就是让你安装好开发所需的工具,确保能顺利完成后续工作。

    • Docker:用于打包你的程序和模型,让它们可以在任何地方运行。
    • AWS CLI:这是用来和 AWS 进行通信的工具,比如上传代码、创建资源等。
    • Python 和 pip:Python 是用来开发代码的语言,pip 是它的包管理工具,确保你能安装需要的库。
    • Git(可选):方便管理代码版本和共享代码。
  3. Docker 镜像创建
    你需要创建一个 Docker 镜像,这个镜像是一个完整的“包裹”,里面包含你的代码、模型以及所有需要的环境。打包好后,它可以在任何支持 Docker 的地方运行,比如 AWS Lambda。

    通俗点讲,这个步骤就是把你的程序“打包”成一个可以在任何机器上运行的小盒子。

  4. ECR 仓库设置
    你需要在 AWS 上创建一个 ECR(Elastic Container Registry)仓库,这个仓库就像一个存放 Docker 镜像的地方。你把打包好的 Docker 镜像上传到这个仓库后,AWS Lambda 才能使用这个镜像运行你的预测模型。

    通俗来说,就是你得先把打包好的“盒子”放到 AWS 的仓库里,Lambda 才能拿来用。

  5. Lambda 函数创建
    接着,你要在 AWS Lambda 上创建一个函数,它会使用你上传的 Docker 镜像作为它的运行环境。这个函数就是你之前写的 lambda_handler,负责接收数据、调用模型、返回预测结果。

    这一步就是在 AWS 上“安装”你写好的模型程序,让它可以对外提供预测服务。

  6. API Gateway 配置
    为了让外界能够访问你的 Lambda 函数,你需要配置一个 API Gateway。API Gateway 就像一个“门口”,外部的请求通过这个门进来,访问 Lambda 函数,得到预测结果。

    通俗来说,这一步就是给你的预测服务配一个“入口”,方便别人访问。

  7. 负载测试与分析
    你需要使用 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 进行负载测试。 绘制结果以观察冷启动趋势。 分析冷启动和热请求响应时间之间的差异。 说明

  1. 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 验证镜像是否正常工作。

  1. 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
  1. Lambda 函数创建 在 AWS 控制台中,使用你构建的现有容器镜像创建 Lambda 函数,并选择 LabRole 作为执行角色。

  2. 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>]]}'
  1. 负载测试和分析 负载测试 在你的本地机器上,使用提供的 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 分)

猜你喜欢

转载自blog.csdn.net/m0_74331272/article/details/143092076