【CV】第 17 章:将模型移至生产

  🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

 

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

了解 API 的基础知识

在本地服务器上创建 API 并进行预测

安装 API 模块和依赖项

服务于图像分类器

fmnist.py

server.py

运行服务器

将 API 迁移到云端

比较 Docker 容器和 Docker 镜像

创建 Docker 容器

创建 requirements.txt 文件

创建 Dockerfile

构建 Docker 镜像和创建 Docker 容器

在云中运送和运行 Docker 容器

配置 AWS

在 AWS ECR 上创建 Docker 存储库并推送映像

创建 EC2 实例

拉取镜像并构建 Docker 容器

概括


将模型投入生产是朝着让外部方使用我们的模型迈出的一步。我们应该向世界展示我们的模型,并开始在真实的、看不见的输入上渲染预测。

 拥有经过训练的 PyTorch 模型进行部署是不够的。我们需要额外的服务器组件来创建从现实世界到 PyTorch 模型再回到现实世界的通信通道。重要的是我们知道如何创建一个 API(用户可以通过它与模型交互),将其包装为一个独立的应用程序(以便它可以部署在任何计算机上),并将其发送到云端——这样任何拥有所需 URL 和凭据的人都可以与模型进行交互。要将模型成功地投入生产,所有这些步骤都是必要的。在本章中,我们将部署一个可以从 Internet 上的任何地方访问的简单应用程序。我们还将了解如何部署Fashion MNIST ( FMNIST) 模型并让任何用户上传他们想要分类和获取结果的图片。

本章将涵盖以下主题:

  • 了解 API 的基础知识
  • 在本地服务器上创建 API 并进行预测
  • 将 API 迁移到云端

了解 API 的基础知识

到目前为止,我们已经知道如何为各种任务创建深度学习模型。它接受/返回张量作为输入/输出。但是像客户端/最终用户这样的局外人只会谈论图像和类。此外,他们希望通过可能与 Python 无关的通道发送和接收输入/输出。互联网是最简单的交流渠道。因此,对于客户来说,最好的部署方案是我们可以设置一个公开可用的 URL 并要求他们在那里上传他们的图像。一种这样的范例称为应用程序编程接口API ),它具有通过 Internet 接受输入和发布输出的标准协议,同时将用户从如何处理输入或生成输出中抽象出来。

API 中的一些常见协议是 POST、GET、PUT 和 DELETE,它们由客户端作为请求连同相关数据一起发送到主机服务器。根据请求和数据,服务器执行相关任务并以响应的形式返回适当的数据——客户端可以 在其下游任务中使用这些数据。在我们的例子中,客户端将发送一个带有服装图像作为文件附件的 POST 请求。我们应该保存文件,处理它,并返回适当的 FMNIST 类作为对请求的响应,我们的工作就完成了。

请求是通过 Internet 发送以与 API 服务器通信的有组织的数据包。通常,请求中的组件如下:

  • 端点 URL:这将是 API 服务的地址。例如,https://www.packtpub.com/将是连接到 Packt Publishing 服务并浏览其最新书籍目录的端点。
  •  headers集合:此信息有助于 API 服务器返回输出;如果标头包含客户端在移动设备上的信息,则 API 可以返回具有移动友好布局的 HTML 页面。
  • 查询的集合,以便仅从服务器数据库中获取相关项目。例如,PyTorch在前面的示例中,搜索字符串将仅返回与 PyTorch 相关的书籍。(在本章中,我们不会处理查询,因为对图像的预测不需要查询——它需要文件名。)
  • 可以上传到服务器的文件列表,或者在我们的例子中,用于进行深度学习预测。

cURL是一个计算机软件项目,提供了一个库和命令行工具,用于使用各种网络协议传输数据。它是调用 API 请求并返回响应的最轻量级、最常用和最简单的应用程序之一。

我们将使用一个现成的 Python 模块,该模块Fast-API使我们能够执行以下操作:

  1. 设置通信 URL。
  2. 在将输入发送到 URL 时接受来自各种环境/格式的输入。
  3. 将每种形式的输入转换为机器学习模型作为输入所需的确切格式。
  4. 使用经过训练的基于深度学习的模型进行预测。
  5. 将预测转换为正确的格式,并用预测响应客户的请求。

我们将使用 FMNIST 分类器作为示例来演示这些概念。

了解基本设置和代码后,您可以为任何类型的深度学习任务创建 API,并通过本地计算机上的 URL 提供预测。虽然这是创建应用程序的合乎逻辑的结果,但同样重要的是,我们将其部署在任何无法访问我们的计算机或模型的人都可以访问的地方。

在接下来的两节中,我们将介绍如何将应用程序包装在一个独立的 Docker 镜像中,该镜像可以在云上的任何地方发布和部署。一旦准备好 Docker 镜像,就可以从它创建一个容器并部署在任何主要的云服务提供商上,因为它们都接受 Docker 作为标准输入。在本章的最后一节,我们将具体介绍在Amazon Web Services AWS )弹性计算云EC2 )实例上部署 FMNIST 分类器的示例。让我们在下一节中使用 Python 库 FastAPI 来创建 API,并验证我们是否可以直接从终端进行预测(无需 Jupyter 笔记本)。

在本地服务器上创建 API 并进行预测

在本节中,我们将学习如何在本地服务器上进行预测(与云无关)。在高层次上,这涉及以下步骤:

  1. 安装FastAPI
  2. 创建路由以接受传入请求
  3. 在磁盘上保存传入的请求
  4. 加载请求的图像,然后使用训练好的模型进行预处理和预测
  5. 对结果进行后处理并将预测作为对同一传入请求的响应发回
本节中的所有步骤都在此处总结为视频演练:https ://tinyurl.com/MCVP-Model2FastAPI 。

让我们从在以下小节中安装 FastAPI 开始。

安装 API 模块和依赖项

由于 FastAPI 是一个 Python 模块,我们可以pip用于安装,并准备编写 API。我们现在将打开一个新终端并运行以下命令:

$pip install fastapi uvicorn aiofiles jinja2
 
 

我们已经安装了 FastAPI 所需的更多依赖项。uvicorn是用于设置 API 的最小低级服务器/应用程序接口。aiofiles使服务器能够异步处理请求,例如同时接受和响应多个独立的并行请求。这两个模块是 FastAPI 的依赖项,我们不会直接与它们交互。

让我们创建所需的文件并在下一节中对它们进行编码。

服务于图像分类器

第一步是设置文件夹结构,如下所示:

设置非常简单,如下所示:

  • 该files文件夹将用作传入请求的下载位置。
  • fmnist.weights.pth包含我们训练的 FMNIST 模型的权重。
  • fmnist.py将包含加载权重、接受传入图像、预处理、预测和后处理预测的逻辑。
  • server.py将包含 FastAPI 功能,可以设置 URL、接受来自 URL 的客户端请求、发送/接收来自 的输入/输出fmnist.py,并将输出作为对客户端请求的响应发送。
请注意以下几点:
该files文件夹为空,仅用于存储上传的文件。
我们假设我们的训练模型的权重为fmnist.weights.pth。

现在让我们了解它们fmnist.py的server.py构成和编码。

fmnist.py

如前所述,该fmnist.py文件应该具有加载模型并返回给定图像的预测的逻辑。

我们已经熟悉如何创建 PyTorch 模型。该类的唯一附加组件是predict方法,用于对图像进行任何必要的预处理和对结果进行后处理。

在下面的代码中,我们首先创建构成模型架构的模型类,并通过以下代码使用最优权重进行初始化torch.load:


 
 
  1. from torch_snippets import *
  2. device = 'cuda' if torch.cuda. is_available() else 'cpu'
  3. class FMNIST(nn.Module):
  4. classes = [ 'T-shirt/top', 'Trouser', 'Pullover', 'Dress',
  5. 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
  6. def __init__( self, fpath = 'fmnist.weights.pth'):
  7. super().__init__()
  8. self.model = nn. Sequential(
  9. nn.Linear( 28 * 28, 1000),
  10. nn.ReLU(),
  11. nn.Linear( 1000, 10)
  12. ). to(device)
  13. self.model.load_state_dict(torch.load(fpath))
  14. logger.info( 'Loaded FMNIST Model')

以下代码块突出显示了该forward方法:


 
 
  1. @torch. no_grad()
  2. def forward( self, x):
  3. x = x.view( 1, - 1). to(device)
  4. pred = self.model(x)
  5. pred = F.softmax(pred, - 1)[ 0]
  6. conf, clss = pred.max(- 1)
  7. clss = self.classes[clss.cpu().item()]
  8. return conf.item(), clss

以下代码块突出显示了predict进行必要的预处理和后处理的方法:


 
 
  1. def predict( self, path):
  2. image = cv 2.imread(path, 0)
  3. x = np.array(image)
  4. x = cv 2.resize(x, ( 28,28))
  5. x = torch.Tensor( 255 - x) / 255
  6. conf, clss = self.forward(x)
  7. return { 'class': clss, 'confidence': f '{conf:.4f}'}

在该__init__方法中,我们正在初始化模型并加载预训练的权重。在该forward方法中,我们通过模型传递图像并获取预测。在该predict方法中,我们从预定义的路径加载图像,在将图像传递forward给模型的方法之前对其进行预处理,并将输出包装在字典中,同时返回预测的类及其置信度。

server.py

这是 API 中将用户请求与 PyTorch 模型连接起来的代码部分。让我们逐步创建文件:

1.加载库:


 
 
  1. import os, io
  2. from fmnist import FMNIST
  3. from PIL import Image
  4. from fastapi import FastAPI, Request, File, UploadFile

FastAPI是将用于创建 API 的基本服务器类。

Request, File, 和UploadFile是客户端请求和他们将上传的文件的代理占位符。有关更多详细信息,我们鼓励您阅读官方 FastAPI 文档。

2.加载模型:


 
 
  1. # 从 fmnist.py 加载模型
  2. model = FMNIST()

3.创建一个app可以为我们提供上传和显示 URL 的模型:

app = FastAPI()
 
 

4.创建一个 URL"/predict"以便客户端可以向(我们将在下一节中了解服务器)发送POST请求并接收响应:"<hosturl>/predict"<hosturl>


 
 
  1. @app.post( "/predict")
  2. def predict(request: Request, file:UploadFile = File(...)):
  3. content = file. file. read()
  4. image = Image. open(io.BytesIO( content)).convert( 'L')
  5. output = model.predict(image)
  6. return output

而已!我们拥有所有组件来利用我们的图像分类器在我们的本地服务器上进行预测。让我们设置服务器并在本地服务器上进行一些预测。

运行服务器

现在我们已经设置了所有组件,我们已经准备好运行服务器了。打开一个新终端和cd包含fmnist.py,的文件夹server.py:

1.运行服务器:

$ uvicorn server:app
 
 

您将看到如下消息:

该Uvicorn running on ... 消息表明服务器已启动并正在运行。

2.要获取预测,我们将在终端中运行以下命令来获取存在于 中的示例图像的预测/home/me/Pictures/shirt.png:

$ curl -X POST "http://127.0.0.1:8000/predict" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@/home/me/Pictures/shirt.png;type=image/png"
 
 

上述代码行的主要组成部分如下:

  • API 协议:我们调用的协议是POST,表示我们要将自己的数据发送到服务器。
  • URL – 服务器地址:服务器主机 URL 是http://127.0.0.1:8000/(这是本地服务器,8000是默认端口),/predict/是给客户端创建请求的路由;未来的客户必须将他们的数据上传到 URL – . POSThttp://127.0.0.1:8000/predict
  • Headers:请求具有-H标志形式的组件。这些解释了附加信息,例如:
    • 输入内容类型将是什么multipart/form-data——这是 API 行话,表示输入数据是文件的形式
    • 预期的输出类型是什么application/json——这意味着 JSON 格式。还有其他格式,例如 XML、文本和八位字节流,根据生成的输出的复杂性而适用。
  • Files:最后一个-F标志指向我们要上传的文件所在的位置,以及它的类型。

输出字典,一旦我们运行前面的代码,将在终端打印:

我们现在可以从本地服务器获取模型预测。在下一节中,我们将研究从云中获取模型预测,以便任何用户都可以获得模型预测。

将 API 迁移到云端

到目前为止,我们已经了解了在本地服务器上进行预测(http://127.0.0.1是本地服务器的 URL,无法在 Web 上访问)——因此,只有本地机器的所有者才能使用该模型。在本节中,我们将学习如何将此模型移动到云端,以便任何人都可以使用图像进行预测。

通常,公司在冗余机器中部署服务以确保可靠性,并且对云提供商提供的硬件几乎没有控制权。不方便跟踪所有文件夹及其代码,或者复制粘贴所有代码,然后安装所有依赖项,确保代码在新环境中按预期工作,并在所有云机器上转发端口。对于每台新机器上的相同代码,需要执行的步骤太多。重复这些步骤对开发人员来说是浪费时间,而且这样的过程很容易出错。

我们宁愿安装一个包含所有内容的包,而不是安装多个单独的包(例如运行应用程序所需的单独模块和代码)并在以后连接它们。因此,我们能够将整个代码库和模块包装到一个包中(类似于.exeWindows 中的文件),以便只需一个命令即可部署该软件包,并且仍然确保它在所有硬件上的工作方式完全相同。为此,我们需要学习如何使用 Docker——它本质上是一个带有代码的精简操作系统。创建的 Docker 容器是轻量级的,只会执行我们希望它们执行的任务。在我们的示例中,我们将创建的 Docker 映像将运行 API 来执行预测 FMNIST 映像类别的任务。但首先,让我们了解一些 Docker 术语。

比较 Docker 容器和 Docker 镜像

Docker 镜像是打包代码及其所有依赖项的标准软件单元。这样,应用程序可以快速可靠地从一个计算环境运行到另一个计算环境。Docker 镜像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。

Docker 容器是镜像的快照,它将在需要部署的任何地方实例化。我们可以从单个镜像创建任意数量的 Docker 镜像副本,并且它们都应该执行相同的任务。将图像视为父副本,将容器视为子副本。

在高层次上,我们将执行以下任务:

  1. 创建 Docker 映像。从中创建一个 Docker 容器并对其进行测试。
  2. 将 Docker 镜像推送到云端。
  3. 在云端构建 Docker 容器。
  4. 在云端部署 Docker 容器。

创建 Docker 容器

在上一节中,我们构建了一个 API,它获取图像并返回图像的类别以及与本地服务器上该图像类别相关联的概率。现在,是时候将我们的 API 包装在一个可以在任何地方运送和部署的包中了。

确保 Docker 已安装在您的机器上。有关安装说明,您可以参考 https://docs.docker.com/get-docker/ 

创建 Docker 容器的过程有四个步骤:

  1. 创建一个requirements.txt文件。
  2. 创建一个 Dockerfile。
  3. 构建 Docker 映像。
  4. 从映像创建 Docker 容器并对其进行测试。
以下部分中的代码也在这里总结为视频演练:https ://tinyurl.com/MCVP-Model2FastAPI 。本节的相关部分从视频中的 2 分钟开始。

我们现在将通过并了解这四个步骤,在下一节中,我们将学习如何将映像发送到 AWS 服务器。

创建 requirements.txt 文件

我们需要告诉 Docker 镜像要安装哪些 Python 模块来运行应用程序。该requirements.txt文件包含所有这些 Python 模块的列表:

1.打开终端并转到包含fmnist.py,的文件夹server.py。接下来,我们将创建一个空白的虚拟环境并在我们的本地终端的根文件夹中激活它:


 
 
  1. $ python 3 -m venv fastapi-venv
  2. $ source fastapi-env /bin /activate

我们之所以创建一个空白的虚拟环境,是为了保证环境中安装需要的模块,这样在发货的时候,我们就不会浪费宝贵的空间。

2.安装所需的包(fastapi、uvicorn、aiofiles、torch和torch_snippets)以运行 FMNIST 应用程序:

$ pip install fastapi uvicorn aiofiles torch torch_snippets
 
 

3.在同一终端中,运行以下命令来安装所有必需的 Python 模块:

$ pip freeze > requirements.txt
 
 

上述代码将所有 Python 模块及其对应的版本号提取到文件中,该文件将用于在 Docker 映像中安装依赖项:requirements.txt

我们可以打开文本文件,它看起来类似于之前的屏幕截图。现在我们已经具备了所有先决条件,让我们在下一节中创建 Dockerfile。

创建 Dockerfile

如上一节所述,Docker 镜像是一个自包含的应用程序,具有自己的操作系统和依赖项。给定一个计算平台(例如 EC2 实例),图像可以独立运行并执行其设计执行的任务。为此,我们需要为 Docker 应用程序提供启动应用程序所需的指令(依赖项、代码和命令)。Dockerfile让我们在一个名为根目录的文本文件中创建这些指令,该文件server.py包含fmnist.py我们在创建项目文件夹后已经放置的 FMINST 项目。该文件需要命名(无扩展名)作为约定。文本文件的内容如下: Dockerfile


 
 
  1. FROM tiangolo /uvicorn-gunicorn-fastapi:python 3.7
  2. COPY . /requirements.txt /app /requirements.txt
  3. 运行 pip install --no-cache-dir -r requirements.txt
  4. WORKDIR /app
  5. COPY/app
  6. EXPOSE 5000
  7. CMD [ "uvicorn", "server:app", "--host", "0.0.0.0"]

让我们一步一步理解前面的代码:

  1. FROM正在指示使用哪个操作系统基础。该tiangolo/uvicorn-gunicorn-fastapi:python3.7位置是 Docker 从 Internet 解析的地址,它获取已安装 Python 和其他 FastAPI 模块的基本映像。
  2. 接下来,我们正在复制requirements.txt我们创建的文件。这提供了我们要安装的软件包。在下一行中,我们向pip install包询问图像。
  3. WORKDIR是我们的应用程序将运行的文件夹。因此,我们/app在 Docker镜像中创建了一个名为的新文件夹,并将根文件夹的内容复制到镜像/app的文件夹中。
  4. 最后,我们像在上一节中那样运行服务器。

这样,我们就建立了一个蓝图,从头开始创建一个全新的操作系统和文件系统(将其视为新的 Windows 可安装 CD),其中仅包含我们指定的代码并仅运行一个应用程序,是 FastAPI。

构建 Docker 镜像和创建 Docker 容器

请注意,到目前为止,我们只为 Docker 映像创建了一个蓝图。让我们构建图像并从中创建一个容器。

从同一个终端(我们在包含应用程序文件的根目录中)运行以下命令:

1.构建 Docker映像并将其标记为fmnist:latest:

$ docker build -t fmnist:latest 
 
 

经过一长串输出后,我们得到以下信息,告诉我们图像已构建:

我们已经成功创建了一个名称为 Docker的镜像fmnist:latest(其中fmnist是镜像名称,latest是我们提供的标签,表示它的版本号)。Docker 在系统中维护一个注册表,可以从中访问所有这些图像。此 D o cker 注册表 现在包含一个独立映像,其中包含运行 FMNIST API 的所有代码和逻辑。

我们总是可以通过$ docker image ls在命令提示符中输入来检查 Docker 注册表:

2.使用-p 5000:5000从镜像内部的转发端口5000到我们本地机器上的端口5000运行构建的镜像。最后一个参数是从图像创建的容器的名称:

$ docker run -p 5000: 5000 fmnist:latest
 
 
端口转发很重要。通常,我们对云暴露的端口没有发言权。因此,作为演示,即使我们的uvicorn模型5000为操作创建了一个端口POST,我们仍然使用 Docker 的功能将外部请求从5000to 路由到5000,这uvicorn就是监听的地方。

这应该给出最后几行的提示,如下所示:

3.现在,curl从一个新的终端运行一个请求并访问上一节中描述的 API,但这一次,应用程序是由 Docker 提供的:

尽管到目前为止我们还没有将任何东西迁移到云端,但将 API 包装在 Docker 中使我们不必再担心pip install或复制粘贴代码。接下来,我们会将其发送给云提供商,并让该应用程序可供全世界使用。

您现在可以将映像发送到任何也具有 Docker 的计算机。无论我们将它发送到哪种类型的计算机,调用docker run总是会创建一个完全按照我们预期的方式工作的容器。我们不再需要担心pip install或复制粘贴代码了。

在云中运送和运行 Docker 容器

我们将依赖 AWS 来满足我们的云需求。我们将使用 AWS 的两个免费产品来实现我们的目的:

  • Elastic Container Registry ( ECR ):在这里,我们将存储我们的 Docker 镜像。
  • EC2:在这里,我们将创建一个 Linux 系统来运行我们的 API Docker 映像。

对于本节,我们只关注其中的 ECR 部分。我们将遵循的将 Docker 映像推送到云的步骤的高级概述如下:

  1. 在本地机器上配置 AWS。
  2. 在 AWS ECR 上创建 Docker 存储库并推送fmnist:latest映像。
  3. 创建一个 EC2 实例。
  4. 在 EC2 实例上安装依赖项。
  5. 在 EC2 实例上创建并运行 Docker 映像。
以下部分中的代码也总结为视频演练:https ://tinyurl.com/MCVP-FastAPI2AWS 。

让我们实施前面的步骤,从下一节中的配置 AWS 开始。

配置 AWS

我们将从命令提示符登录到 AWS 并推送我们的 Docker 映像。让我们一步一步来:

1.Cloud Computing Services - Amazon Web Services (AWS)创建一个 AWS 账户并登录。

2.在您的本地计算机(包含 Docker 映像)上安装 AWS CLI。

AWS CLI 是适用于所有 Amazon 服务的命令行界面应用程序。它应该首先从您的操作系统的官方网站安装。访问Installing or updating the latest version of the AWS CLI - AWS Command Line Interface了解更多详情。

3.aws --version通过在本地终端中运行来验证它是否已安装。

4.配置 AWS CLI。从https://aws.amazon.com/获取以下令牌:

  • aws_account_id
  • 访问密钥 ID
  • 秘密访问密钥
  • 地区

我们可以在 AWS的身份和访问管理IAM ) 部分中找到所有上述变量。在终端中运行aws configure并在询问时提供适当的凭据:


 
 
  1. $ aws configure
  2. AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
  3. AWS Secret Access Key [None]:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  4. Default region name [None]: region
  5. Default output format [None]:json

我们现在已经从我们的计算机登录到亚马逊的服务。原则上,我们可以直接从终端访问他们的任何服务。在下一节中,让我们连接到 ECR 并推送 Docker 映像。

在 AWS ECR 上创建 Docker 存储库并推送映像

现在,我们将创建 Docker 存储库,如下所示:

1.配置完成后,使用以下命令登录AWS ECR(以下代码均为一行),在以下代码中以粗体给出的位置提供上述区域和账户ID详细信息:

$ aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
 
 

前面的代码行创建并将您连接到您自己在 Amazon 云中的 Docker 注册表。与本地系统中的 Docker 注册表非常相似,这是映像将驻留的位置,但相反,它将位于云中。

2.通过运行以下命令从 CLI 创建存储库:

$ aws ecr create-repository --repository-name fmnist_app
 
 

使用前面的代码,现在可以在云中创建一个可以保存 Docker 映像的位置。

3.通过运行以下命令标记您的本地映像,以便在您推送映像时,它将被推送到标记的存储库。请记住在以下代码的粗体部分中给出您自己的值aws_accound_id和值:region

$ docker tag fmnist:latest aws_account_id.dkr.ecr.region.amazonaws.com/fmnist_app

 
 

4.运行以下命令将本地 Docker 镜像推送到云中的 AWS 存储库:

$ docker push aws_account_id.dkr.ecr.region.amazonaws.com/fmnist_app
 
 

我们已经成功地在云中为我们的 API 创建了一个位置,并将 Docker 映像推送到该位置。正如您现在所知道的,此映像已经具有运行 API 的所有组件。剩下的唯一方面是在云中创建一个 Docker 容器,我们将成功地将我们的应用程序转移到生产环境中!

创建 EC2 实例

将 Docker 映像推送到 AWS ECR 就像将代码推送到 GitHub 存储库。它只是驻留在一个地方,我们仍然需要用它来构建应用程序。

为此,您必须创建一个可以为您的 Web 应用程序提供服务的 Amazon EC2 实例:

1.转到 AWS 管理控制台的搜索栏并搜索EC2.

2.选择启动实例。

3.您将获得可用实例的列表。AWS 在免费套餐中提供了许多实例。我们在这里选择了具有 20 GB空间的Amazon Linux 2 AMI - t2.micro实例 (您也可以使用其他实例,但请记住相应地更改配置)。

4.在配置实例创建时,在Configure Security Group部分中,添加一个设置了Custom TCP的规则,并将Port Range设置为5000(因为我们5000在 Docker 映像中公开了端口),如下所示:

 5.在Launch Instances弹出窗口(参见以下屏幕截图)中,这是最后一步,创建一个新的密钥对(这将下载一个.pem文件,该文件是登录实例所需的)。这和密码一样好,所以不要丢失这个文件:

6.将.pem文件移动到安全位置并通过运行更改其权限chmod 400 fastapi.pem。

此时您应该会在 EC2 仪表板中看到一个正在运行的实例:

7.复制如下所示的 EC2 实例名称:

ec2-18-221-11-226.us-east-2.compute.amazonaws.com
 
 

8.在本地终端中使用以下命令登录 EC2 实例:

$ ssh -i fastapi.pem ec2-user@ec2-18-221-11-226.us-east-2.compute.amazonaws.com
 
 

我们已经创建了一个具有必要空间和操作系统的 EC2 实例。此外,我们能够从机器公开端口,还可以记录这台机器的公共 URL(该 URL 将被客户端用于发送请求)。最后,我们能够通过成功使用下载的文件登录它,将 EC2 机器视为可以安装软件的任何其他机器。 8000POST .pem

拉取镜像并构建 Docker 容器

让我们在 EC2 机器上安装运行 Docker 镜像的依赖项,然后我们就可以运行 API。以下命令都需要在我们在上一节中登录的 EC2 控制台中运行(上一节的第8 步 ):

1.在 Linux 机器上安装和配置 Docker 镜像:


 
 
  1. $ sudo yum install -y docker
  2. $ sudo groupadd docker
  3. $ sudo gpasswd -a ${USER} docker
  4. $ sudo service docker restart

groupadd并gpasswd确保 Docker 具有运行所需的所有权限。

2.正如您之前所做的那样,在 EC2 实例中配置 AWS,然后重新启动机器:


 
 
  1. $ aws configure
  2. AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
  3. AWS Secret Access Key [None]:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  4. Default region name [None]: us-west-2
  5. Default output format [None]:json
  6. $ reboot

3.使用以下命令从本地终端再次登录到实例:

$ ssh -i fastapi.pem ec2-user@ec2-18-221-11-226.us-east-2.compute.amazonaws.com
 
 

4.现在,从 EC2 登录控制台(已安装 Docker)登录 AWS ECR(更改以下代码中以粗体显示的区域):

$ aws ecr get-login --region region --no-include-email
 
 

5.复制上述代码的输出,然后在命令行中粘贴并运行它。成功登录 AWS ECR 后,您将在控制台中看到Login Succeeded 。

6.从 AWS ECR 拉取 Docker 映像:

$ docker pull aws_account_id.dkr.ecr.region.amazonaws.com/fmnist_app:latest
 
 

7.最后,在 EC2 机器上运行拉取的 Docker 镜像:

docker run -p 5000:5000 aws_account_id.dkr.ecr.region.amazonaws.com/fmnist_app
 
 

我们的 API 在 EC2 上运行。我们所要做的就是获取机器的公共 IP 地址并curl使用该地址代替127.0.0.1. 您可以在页面右侧的 EC2 仪表板上找到此地址:

8.您现在可以POST从任何计算机调用请求,EC2 实例将响应它,预测我们上传的服装图像类型:

$ curl -X POST "http://54.229.16.169:5000/predict" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@/home/me /图片/shirt.png;type=image/png"

前面的代码产生以下输出:

$ curl -X POST "http://54.229.16.169:5000/predict" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@/home/me/Pictures/shirt.png;type=image/png"
 
 

在本节中,我们能够安装 EC2 的依赖项、拉取 Docker 映像并运行 Docker 容器,以使任何具有 URL 的用户都能够对新映像进行预测。

概括

在本章中,我们了解了将模型转移到生产环境需要哪些额外步骤。我们了解了 API 是什么以及它的组件是什么。创建 API 之后,使用 FastAPI,我们浏览了创建 API 的 Docker 镜像的核心步骤。使用 AWS,我们在云中创建了自己的 Docker 注册表,并完成了将 Docker 映像推送到那里的步骤。我们看到了创建 EC2 实例并安装所需的库以从 ECR 中提取 Docker 映像、从中构建 Docker 容器并将其部署以供任何用户进行预测所需的工作。

在下一章也是最后一章中,我们将了解 OpenCV,它的实用程序有助于解决受限环境中的一些图像相关问题。我们将通过五个不同的用例来了解如何利用 OpenCV 进行图像分析。学习 OpenCV 的功能将进一步加强我们的计算机视觉库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值