

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Flask 和 AWS Elastic Beanstalk 可视化 AI/ML 模型结果 AWS Beanstalk
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk"></a>

*Chris Caudill 和 Durga Sury，Amazon Web Services*

## Summary
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk-summary"></a>

可视化人工智能和机器学习 (AI/ML) 服务输出通常需要复杂的 API 调用，这些调用必须由开发人员和工程师自定义。如果您的分析师想快速探索新数据集，这可能是一个缺点。

您可以使用基于 Web 的用户界面 (UI) 增强服务的可访问性并提供更具交互性的数据分析形式，该界面使用户能够上传自己的数据并在控制面板中可视化模型结果。

这种模式使用 [Flask](https://flask.palletsprojects.com/en/2.0.x/) 和 [Plotly](https://plotly.com/)，将 Amazon Comprehend 与自定义 Web 应用程序集成，并可视化用户提供的数据中的观点和实体。该模式还提供了通过 AWS Elastic Beanstalk 部署应用程序的步骤。您可以使用 A [mazon Web Services (AWS) AI 服务](https://aws.amazon.com/machine-learning/ai-services/)或托管在终端节点（例如，[亚马逊 SageMaker ](https://docs.aws.amazon.com/sagemaker/latest/dg/deploy-model.html)终端节点）上的自定义训练模型，来调整应用程序。

## 先决条件和限制
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户。 
+ AWS 命令行界面（AWS CLI）已在本地计算机上安装和配置。有关这方面的更多信息，请参阅 AWS CLI 文档中的[配置基础知识](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。您也可以使用 AWS Cloud9 集成式开发环境（IDE）；有关这方面的更多信息，请参阅 AWS Cloud9 文档中的 [AWS Cloud9 的 Python 教程](https://docs.aws.amazon.com/cloud9/latest/user-guide/sample-python.html)和[预览 AWS Cloud9 IDE 中运行的应用程序](https://docs.aws.amazon.com/cloud9/latest/user-guide/app-preview.html)。

  **注意**： AWS Cloud9 不再向新客户开放。的现有客户 AWS Cloud9 可以继续照常使用该服务。[了解详情](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)
+ 了解 Flask 的 Web 应用程序框架。有关 Flask 的更多信息，请参阅 Flask 文档中的 [Quickstart](https://flask.palletsprojects.com/en/1.1.x/quickstart)。
+ Python 版本 3.6 或更高版本，已安装并已配置。您可按照 AWS Elastic Beanstalk 文档中[设置 Python 开发环境](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/python-development-environment.html)中的说明安装 Python。
+ Elastic Beanstalk 命令行界面 (EB CLI)，已安装并配置。有关这方面的更多信息，请参阅 AWS Elastic Beanstalk 文档中的[安装 EB CLI](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install.html) 和[配置 EB CLI](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-configuration.html)。

**限制**
+ 此模式的 Flask 应用程序，旨在处理使用单个文本列且限制在 200 行以内的 .csv 文件。可调整应用程序代码以处理其他文件类型和数据量。
+ 该应用程序不考虑数据留存，将继续汇总上传的用户文件，直到手动删除这些文件。您可以将应用程序与 Amazon Simple Storage Service (Amazon S3) 集成以实现永久对象存储，也可以使用 Amazon DynamoDB 等数据库进行无服务器键值存储。
+ 该应用程序仅适用英文文档。但是，您可使用 Amazon Comprehend 来检测文档的主要语言。有关每个操作支持的语言的更多信息，请参见 Amazon Comprehend 文档中的 [API 参考](https://docs.aws.amazon.com/comprehend/latest/dg/API_Reference.html)。
+ *其他信息*部分提供了包含常见错误及其解决方案的故障排除列表。

## 架构
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk-architecture"></a>

**Flask 应用程序架构**

Flask 是轻量级框架，用于在 Python 中开发 Web 应用程序。它旨在将 Python 的强大数据处理功能与丰富的 Web 用户界面相结合。该模式的 Flask 应用程序向您展示了如何构建 Web 应用程序，该应用程序使用户能够上传数据，将数据发送至 Amazon Comprehend 进行推理，然后将结果可视化。  应用程序具有以下结构：
+ `static`— 包含所有支持 Web UI 的静态文件（例如 JavaScript，CSS 和图像）
+ `templates` – 包含应用程序的所有 HTML 页面
+ `userData` –存储上传的用户数据
+ `application.py` – Flask 应用程序文件
+ `comprehend_helper.py` – 用于对 Amazon Comprehend 进行 API 调用的函数
+ `config.py` – 应用程序配置文件
+ `requirements.txt` – 应用程序所需 Python 依赖项

`application.py` 脚本包含 Web 应用程序的核心功能，该功能由四个 Flask 路由组成。下图显示了这些 Flask 路由。

![\[构成 Web 应用程序核心功能的四个 Flask 路由。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/03d80cf1-ec97-43f7-adb5-2746a9ec70e6/images/9ca6bad1-26e2-4262-98d0-d54c172336bf.png)


 
+ `/` 是此应用程序的根目录，可将用户定向到 `upload.html` 页面（存储在 `templates` 目录中）。
+ `/saveFile` 是在用户上传文件后调用的路由。此路由通过 HTML 表单接收 `POST` 请求，其中包含用户上传的文件。文件保存在 `userData` 目录中，路由会将用户重定向至 `/dashboard` 路由。
+ `/dashboard` 将用户发送到 `dashboard.html` 页面。在此页面的 HTML 中，它运行中的 JavaScript 代码`static/js/core.js`，从`/data`路径中读取数据，然后为该页面构建可视化效果。
+ `/data` 是 JSON API，用于显示要在控制面板中可视化的数据。此路由读取用户提供的数据，并使用 `comprehend_helper.py` 中的函数将用户数据发送到 Amazon Comprehend，用于观点分析和命名实体识别 (NER)。Amazon Comprehend 的响应已格式化，并作为 JSON 对象返回。

**部署架构**

![\[使用 Flask 和 Elastic Bean AI/ML stalk 可视化模型结果的架构图。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/03d80cf1-ec97-43f7-adb5-2746a9ec70e6/images/d691bfd2-e2ec-4830-8bff-ffa1e3a95c4a.png)


[设计注意事项](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts.concepts.design.html)

 要详细了解在 AWS 云端使用 Elastic Beanstalk 部署的应用程序的设计注意事项，请 AWS Elastic Beanstalk 文档中的设计注意事项。

**技术堆栈**
+ Amazon Comprehend 
+ Elastic Beanstalk 
+ Flask 

**自动化和扩展**

系统会自动使用负载均衡器和自动扩缩组来设置 Elastic Beanstalk 部署。有关更多配置选项，请参阅 AWS Elastic Beanstalk 文档中的[配置 Elastic Beanstalk 环境](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html)。

## 工具
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk-tools"></a>
+ [AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)是一款统一的工具，提供了用于与 AWS 的各个部分进行交互的一致界面。
+ [Amazon Comprehend](https://docs.aws.amazon.com/comprehend/latest/dg/comprehend-general.html) 使用自然语言处理（NLP），提取有关文档内容的洞察，而无需进行特殊的预处理。
+ [AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/Welcome.html) 可帮助您在 AWS 云端快速部署和管理应用程序，而不必了解运行这些应用程序的基础设施。
+ [Elastic Beanstalk CLI（EB CLI）](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3.html)是 AWS Elastic Beanstalk 的命令行界面，提供了一些交互式命令来简化从本地存储库创建、更新和监控环境的过程。
+ [Flask](https://flask.palletsprojects.com/en/2.0.x/) 框架使用 Python 执行数据处理和 API 调用，并利用 Plotly 提供交互式 Web 可视化。

**代码**

该模式的代码可在[使用 Flask 和 AWS Elastic Beanstalk 存储库 GitHub 的可视化 AI/ML 模型结果](https://github.com/aws-samples/aws-comprehend-elasticbeanstalk-for-flask)中找到。

## 操作说明
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk-epics"></a>

### 设置 Flask 应用程序
<a name="set-up-the-flask-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆 GitHub 存储库。 | 运行以下命令，[使用 Flask 和 AWS Elastic Beanstalk 存储库从 GitHub 可视化 AI/ML 模型结果](https://github.com/aws-samples/aws-comprehend-elasticbeanstalk-for-flask)中提取应用程序代码：`git clone git@github.com:aws-samples/aws-comprehend-elasticbeanstalk-for-flask.git`确保使用配置 SSH 密钥 GitHub。 | 开发者版 | 
| 安装 Python 模块。 | 克隆存储库后，将创建新的本地 `aws-comprehend-elasticbeanstalk-for-flask` 目录。在该目录中，`requirements.txt` 文件包含运行该应用程序的 Python 模块和版本。使用以下命令安装模块：`cd aws-comprehend-elasticbeanstalk-for-flask``pip install -r requirements.txt` | Python 开发人员 | 
| 在本地测试应用程序。 | 运行以下命令以启动 Flask 服务器：`python application.py`这将返回有关正在运行的服务器的信息。您应该能够通过打开浏览器和访问 http://localhost:5000 来访问该应用程序如果在 AWS Cloud9 IDE 中运行应用程序，您需要将 `application.py` 文件中的 `application.run()` 命令替换为下面这行内容：`application.run(host=os.getenv('IP', '0.0.0.0'),port=int(os.getenv('PORT', 8080)))`在部署之前，您必须恢复此更改。 | Python 开发人员 | 

### 将应用程序部署到 Elastic Beanstalk
<a name="deploy-the-application-to-elastic-beanstalk"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启动 Elastic Beanstalk 应用程序。 | 要将您的项目作为 Elastic Beanstalk 应用程序启动，请从应用程序的根目录运行如下命令：`eb init -p python-3.6 comprehend_flask --region us-east-1`[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk.html)运行 `eb init -i` 命令，以获取更多部署配置选项。 | 架构师、开发人员 | 
| 部署 Elastic Beanstalk 环境。 | 从应用程序的根目录运行如下命令：`eb create comprehend-flask-env``comprehend-flask-env` 是 Elastic Beanstalk 环境的名称，您可以根据需求对其进行更改。此名称只能包含字母、数字和短划线。 | 架构师、开发人员 | 
| 授权部署使用 Amazon Comprehend。 | 尽管您的应用程序可能已成功部署，但您还应为部署提供访问 Amazon Comprehend 的权限。`ComprehendFullAccess` 是 AWS 托管式策略，它为已部署的应用程序提供对 Amazon Comprehend 进行 API 调用的权限。运行如下命令，以便将 `ComprehendFullAccess` 策略附加到 `aws-elasticbeanstalk-ec2-role`（此角色是自动为您的部署的 Amazon Elastic Compute Cloud（Amazon EC2）实例创建的）：`aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/ComprehendFullAccess --role-name aws-elasticbeanstalk-ec2-role``aws-elasticbeanstalk-ec2-role` 是在您的应用程序部署时创建的。您必须首先完成部署过程，才能附加 AWS Identity and Access Management（IAM）策略。 | 开发人员、安全架构师 | 
| 访问您所部署的应用程序。 | 成功部署应用程序后，您可通过运行 `eb open` 命令访问。您也可以运行 `eb status` 命令来接收有关您的部署的详细信息。部署 URL 列在 `CNAME` 下面。 | 架构师、开发人员 | 

### （可选）根据您的机器学习模型自定义应用程序
<a name="optional-customize-the-application-to-your-ml-model"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 授权 Elastic Beanstalk 访问新的模型。 | 确保 Elastic Beanstalk 拥有您的新模型端点所需访问权限。例如，如果您使用 Amazon SageMaker 终端节点，则您的部署需要拥有调用该终端节点的权限。 有关这方面的更多信息，请参阅 Amazon SageMaker 文档[InvokeEndpoint](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html)中的。 | 开发人员、安全架构师 | 
| 将用户数据发送至新模型。 | 若要更改此应用程序中的底层 ML 模型，必须更改以下文件：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk.html) | 数据科学家 | 
| 更新控制面板可视化效果。 | 通常，合并新的机器学习模型，意味着必须更新可视化效果以反映新的结果。这些更改在以下文件中进行：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk.html) | 网页开发人员 | 

### （可选）部署更新的应用程序
<a name="optional-deploy-the-updated-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 更新应用程序需求文件。 | 在向 Elastic Beanstalk 发送更改之前，请在应用程序的根目录中运行以下命令，以更新 `requirements.txt` 文件，反映任何新的 Python 模块：`pip freeze > requirements.txt` | Python 开发人员 | 
| 重新部署 Elastic Beanstalk 环境。 | 为确保您的应用程序更改反映在 Elastic Beanstalk 部署中，请导航到应用程序的根目录并运行以下命令：`eb deploy`这会将应用程序代码的最新版本发送至您现有的 Elastic Beanstalk 部署中。 | 系统管理员、架构师 | 

## 相关资源
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk-resources"></a>
+ [使用 Amazon API Gateway 和 AWS Lambda 调用亚马逊 SageMaker 模型终端节点](https://aws.amazon.com/blogs/machine-learning/call-an-amazon-sagemaker-model-endpoint-using-amazon-api-gateway-and-aws-lambda/)
+ [将 Flask 应用程序部署到 Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html)
+ [EB CLI 命令参考](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-cmd-commands.html)
+ [设置 Python 开发环境](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/python-development-environment.html)

## 附加信息
<a name="visualize-ai-ml-model-results-using-flask-and-aws-elastic-beanstalk-additional"></a>

**故障排除列表**

以下是六种常见错误及其解决方法。

***错误 1 * **

```
Unable to assume role "arn:aws:iam::xxxxxxxxxx:role/aws-elasticbeanstalk-ec2-role". Verify that the role exists and is configured correctly.
```

**解决方案**：如果您在运行 `eb create` 时出现此错误，请在 Elastic Beanstalk 控制台创建一个示例应用程序，以创建默认实例配置文件。有关此内容的更多信息，请参阅 AWS Elastic Beanstalk 文档中的[创建 Elastic Beanstalk 环境](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.environments.html)。

***错误 2***

```
Your WSGIPath refers to a file that does not exist.
```

**解决方案：**部署日志中会出现此错误，因为 Elastic Beanstalk 希望将 Flask 代码命名为 `application.py`。如果您选择了其他名称，请运行`eb config`并编辑， WSGIPath 如以下代码示例所示：

```
aws:elasticbeanstalk:container:python:
     NumProcesses: '1'
     NumThreads: '15'
     StaticFiles: /static/=static/
     WSGIPath: application.py
```

务必将 `application.py` 更换为您的文件名。

您还可利用 Gunicorn 与 Procfile。有关此方法的更多信息，请参阅 AWS Elastic Beanstalk 文档中的[通过 Procfile 配置 WSGI 服务器](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/python-configuration-procfile.html)。

***错误 3***

```
Target WSGI script '/opt/python/current/app/application.py' does not contain WSGI application 'application'.
```

**解决方案：**Elastic Beanstalk 希望将代表您的 Flask 应用程序变量命名为 `application`。确保 `application.py` 文件使用 `application` 作为变量名：

```
application = Flask(__name__)
```

***错误 4***

```
The EB CLI cannot find your SSH key file for keyname
```

**解决方案：**使用 EB CLI 指定要使用的密钥对，或者为部署的 EC2 实例创建密钥对。要解决错误，请运行 `eb init -i`，其中一个选项将询问：

```
Do you want to set up SSH for your instances?
```

以 `Y`响应，创建密钥对或指定现有密钥对。

***错误 5***

*我已更新了我的代码并进行了重新部署，但是我的部署没有反映我的更改。*

**解决方案**：如果您在部署时使用 Git 存储库，请确保在重新部署之前添加并提交更改。

***错误 6***

*您正在通过 AWS Cloud9 IDE 预览 Flask 应用程序，但遇到了错误。*

**解决方案：**有关这方面的更多信息，请参阅 AWS Cloud9 文档中的[在 AWS Cloud9 IDE 中预览正在运行的应用程序](https://docs.aws.amazon.com/cloud9/latest/user-guide/app-preview.html)。

 

 

**使用 Amazon Comprehend 进行自然语言处理**

通过选择使用 Amazon Comprehend，您现在可以通过运行实时分析或异步批处理作业来检测单个文本文档中的自定义实体。Amazon Comprehend 还允许训练自定义实体识别和文本分类模型，这些模型可以通过创建端点来实时使用。

这种模式使用异步批处理作业，检测包含多个文档的输入文件中的观点和实体。此模式提供的示例应用程序旨在让用户上传包含单列且每行一个文本文档的 .csv 文件。[使用 Flask 和 AWS Elastic Beanstalk 存储库 GitHub 可视化 AI/ML 模型结果`comprehend_helper.py`](https://github.com/aws-samples/aws-comprehend-elasticbeanstalk-for-flask)的文件读取输入文件并将输入发送到 Amazon Comprehend 进行处理。

*BatchDetectEntities*

Amazon Comprehend 检查一批文档的文本以查找命名实体，并返回检测到的实体、位置、[实体类型](https://docs.aws.amazon.com/comprehend/latest/dg/how-entities.html)，以及表明 Amazon Comprehend 可信度等级的分数。一次 API 调用最多可发送 25 个文档，每个文档的大小小于 5,000 字节。您可根据使用案例筛选结果以仅显示某些实体。例如，您可以跳过 `‘quantity’` 实体类型，为检测到的实体设置阈值分数 (例如 0.75)。我们建议，您在选择阈值之前，先浏览特定使用案例的结果。有关这方面的更多信息，请参阅亚马逊 Comprehend 文档[BatchDetectEntities](https://docs.aws.amazon.com/comprehend/latest/dg/API_BatchDetectEntities.html)中的。

*BatchDetectSentiment*

Amazon Comprehend 会检查一批传入的文档，并返回每份文档的普遍观点（`POSITIVE`、`NEUTRAL`、`MIXED` 或 `NEGATIVE`）。一次 API 调用最多可发送 25 个文档，每个文档的大小小于 5,000 字节。分析观点非常简单，您可选择分数最高的观点以显示在最终结果中。有关这方面的更多信息，请参阅亚马逊 Comprehend 文档[BatchDetectSentiment](https://docs.aws.amazon.com/comprehend/latest/dg/API_BatchDetectSentiment.html)中的。

 

 

**Flask 配置处理**

Flask 服务器使用一系列[配置变量](https://flask.palletsprojects.com/en/1.1.x/config/)控制服务器的运行方式。这些变量可以包含调试输出、会话令牌或者其他应用程序设置。您还可定义在应用程序运行时访问的自定义变量。设置配置变量的方法有很多种。

在这种模式中，配置是在 `config.py` 中定义，且在 `application.py` 中继承的。
+ 
**注意**  
`config.py` 包含在应用程序启动时设置的配置变量。此应用程序中定义了一个 `DEBUG` 变量，以便指示应用程序在[调试模式](https://flask.palletsprojects.com/en/1.1.x/config/#DEBUG)下运行服务器。：在生产环境中运行应用程序时，不应使用调试模式。`UPLOAD_FOLDER` 是一个自定义变量，被定义为稍后在应用程序中引用，并告知它应将上传的用户数据存储在哪里。
+ `application.py` 将启动 Flask 应用程序，并继承 `config.py` 中定义的配置设置。这通过以下代码执行：

```
application = Flask(__name__)
application.config.from_pyfile('config.py')
```