Encored Technologies 如何使用 亚马逊云科技 构建无服务器事件驱动的数据管道

这篇文章是与 Encored Technologies 的李宣正、严载润和杨贤锡共同撰写的客座文章。

Encored Technologies (Encored)是一家位于韩国的能源信息技术 公司,通过提供各种基于人工智能的解决方案,帮助其客户在可再生能源行业创造更高的收入并降低运营成本。Encored 开发了预测和优化各种能源相关过程的机器学习 (ML) 应用程序,他们的关键举措是预测可再生能源发电厂的发电量。

在这篇文章中,我们分享了 Encored 如何在 亚马逊云科技 上为容器化机器学习应用程序运行数据工程管道,以及他们如何使用 A WS Lambda 来提高性能、降低成本和提高运营效率。我们还演示了如何使用 亚马逊云科技 服务摄取和处理 GRIB(GridDed Binary)格式的数据,这是气象学中常用的一种文件格式,用于以压缩二进制形式存储和交换天气和气候数据。它可以实现高效的数据存储和传输,并使用专门的软件轻松操作数据。

业务和技术挑战

Encored正在将其业务扩展到多个国家,为最终客户提供电力交易服务。随着时间的推移,数据量和收集数据所需的发电厂数量正在迅速增加。例如,训练其中一个 ML 模型所需的数据量超过 200 TB。为了满足不断增长的业务需求,数据科学和平台团队需要加快交付模型输出的过程。作为解决方案,Encored旨在迁移现有数据并在亚马逊云科技云环境中运行机器学习应用程序,以高效处理可扩展且强大的端到端数据和机器学习管道。

解决方案概述

该解决方案的主要目标是开发优化的数据采集管道,以解决与数据摄取相关的扩展挑战。在之前在本地环境中部署期间,处理从摄取到准备训练数据集的数据所花费的时间超过了所需的服务级别协议 (SLA)。机器学习模型所需的输入数据集之一是韩国气象局 (KMA) 提供的天气数据。为了将 GRIB 数据集用于机器学习模型,Encored 需要准备原始数据,使其适合构建和训练 ML 模型。第一步是将 GRIB 转换为 Parquet 文件格式。

Encored 使用 Lambda 运行在基于 Linux 的容器映像中构建的现有数据提取管道。Lambda 是一项计算服务,允许您在不预置或管理服务器的情况下运行代码。Lambda 在高可用性计算基础设施上运行您的代码,并执行计算资源的所有管理,包括服务器和操作系统维护、容量预置和自动扩展以及日志记录。当 GRIB 数据文件上传到亚马逊 S imple Storage S ervice (Amazon S3) 时,亚马逊云科技 Lambda 会被触发以摄取和处理。 处理完文件后,它们将以 Parquet 格式存储在另一个 S3 存储桶中。Encored 全天接收 GRIB 文件,每当新文件到达时,亚马逊云科技 Lambda 函数都会运行在亚马逊弹性容器注册表 (ECR) 中注册的容器映像。这个基于事件的管道会触发打包在基于容器的解决方案中的自定义数据管道。利用亚马逊 亚马逊云科技 Lambda,该解决方案具有成本效益、可扩展且性能卓越。Encored 使用 Python 作为他们的首选语言。

下图说明了解决方案架构。

Lambda-data-pipeline

对于数据密集型任务,例如提取、转换和加载 (ETL) 任务和机器学习推理,Lambda 是理想的解决方案,因为它具有多项关键优势,包括快速扩展以满足需求、不使用时自动扩展到零,以及可以启动操作以响应对象创建事件的 S3 事件触发器。所有这些都有助于建立可扩展且具有成本效益的数据事件驱动管道。除了这些好处外,Lambda 还允许您配置 512—10,240 MB 之间的临时存储 (/tmp)。Encored 在读取或写入数据时将此存储用于其数据应用程序,使他们能够优化性能和成本效益。此外,Lambda 的按使用量付费定价模式意味着用户只需为使用的计算时间付费,这使其成为适用于各种用例的经济高效的解决方案。

先决条件

在本演练中,您应该具备以下内容:

  • 一个 亚马逊云科技 账户
  • 安装 亚马逊云科技 命令行接口 (亚马逊云科技 CLI)
  • Docker 命令 行界面
  • 你的函数码

构建 Docker 映像所需的应用程序

第一步是开发一个可以采集和处理文件的应用程序。此应用程序读取从 添加到 Lambd a 函数的触发器 传递的存储桶名称和对象密钥。处理逻辑包括三个部分:将文件从 Amazon S3 下载到 临时存储 ( /tmp )、解析 GRIB 格式的数据以及将解析后的数据保存为 Parquet 格式。

客户有一个 Python 脚本(例如, app.py ),可以按如下方式执行这些任务:

import os
import tempfile
import boto3
import numpy as np
import pandas as pd
import pygrib

s3_client = boto3.client('s3')
def handler(event, context):
    try:
        # Get trigger file name
        bucket_name = event["Records"][0]["s3"]["bucket"]["name"]
        s3_file_name = event["Records"][0]["s3"]["object"]["key"]

        # Handle temp files: all temp objects are deleted when the with-clause is closed
        with tempfile.NamedTemporaryFile(delete=True) as tmp_file:
            # Step1> Download file from s3 into temp area
            s3_file_basename = os.path.basename(s3_file_name)
            s3_file_dirname = os.path.dirname(s3_file_name)
            local_filename = tmp_file.name
            s3_client.download_file(
                Bucket=bucket_name,
                Key=f"{s3_file_dirname}/{s3_file_basename}",
                Filename=local_filename
            )

            # Step2> Parse – GRIB2 
            grbs = pygrib.open(local_filename)
            list_of_name = []
            list_of_values = []
            for grb in grbs:
                list_of_name.append(grb.name)
                list_of_values.append(grb.values)
            _, lat, lon = grb.data()
            list_of_name += ["lat", "lon"]
            list_of_values += [lat, lon]
            grbs.close()

            dat = pd.DataFrame(
                np.transpose(np.stack(list_of_values).reshape(len(list_of_values), -1)),
                columns=list_of_name,
            )

        # Step3> To Parquet
        s3_dest_uri = S3path
        dat.to_parquet(s3_dest_uri, compression="snappy")

    except Exception as err:
        print(err)

准备一个 Docker 文件

第二步是使用 亚马逊云科技 基础映像创建 Docker 镜像。为此,你可以在本地计算机上使用文本编辑器创建新的 Dockerfile。这个 Dockerfile 应该包含两个环境变量:

  • lambda_task_root=/var/Task
  • lambda_runtime_dir=/var/runtime

务必将所有依赖项安装在函数处理程序旁边的 $ {LAMBDA_TASK_ROOT} 目录下,以确保 Lambda 运行时可以在调用函数时找到它们。有关更多信息,请参阅 可用的自定义运行时的 Lambda 基础映像

FROM public.ecr.aws/lambda/python:3.8

# Install the function's dependencies using file requirements.txt
# from your project folder.

COPY requirements.txt  .
RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]

构建 Docker 镜像

第三步是使用 docker 编译命令来构建 Dock er 镜像。 运行此命令时,请务必输入图像的名称。例如:

docker build-t process-grib。

在此示例中,图像的名称为 proc ess-grib 。你可以为你的 Docker 镜像选择任何你喜欢的名称。

将图片上传到亚马逊 ECR 存储库

您的容器映像需要存放在 亚马逊弹性容器注册表 (Amazon ECR) 存储库中。Amazon ECR 是一个完全托管的容器注册表,提供高性能托管,因此您可以在任何地方可靠地部署应用程序映像和构件。有关创建 ECR 存储库的说明,请参阅 创建私有存储库

第一步是将 Docker CLI 验证到您的 ECR 注册表,如下所示:

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com 

第二步是标记您的映像以匹配您的存储库名称,然后使用 docker pus h 命令将映像部署到 Amazon ECR:

docker tag  hello-world:latest 123456789012.dkr.ecr. ap-northeast-2.amazonaws.com/hello-world:latest
docker push 123456789012.dkr.ecr. ap-northeast-2.amazonaws.com/hello-world:latest     

将 Lambda 函数部署为容器镜像

要创建您的 Lambda 函数,请完成以下步骤:

  1. 在 Lambda 控制台上, 在导航 窗格中选择函数
  2. 选择 创建函数
  3. 选择 容器镜像 选项。
  4. 函数名称中 ,输入一个名称。
  5. 对于 容器镜像 URI ,请提供容器镜像。您可以输入 ECR 图像 URI 或浏览 ECR 图像。
  6. 容器映像覆盖下 ,您可以替换 Dockerfile 中包含的入口点或工作目录等配置设置。
  7. 在 “ 权限” 下 ,展开 “ 更改默认执行角色” 。
  8. 选择创建新角色或使用现有角色。
  9. 选择 创建函数

关键注意事项

为了同时快速地处理大量数据,Encored 需要将 GRIB 格式的文件存储在 Lambda 附带的临时存储 ( / tmp) 中。为了满足这一要求,Encored 使用了 tempfile.namedTemporaryFile ,它允许用户轻松创建临时文件,在不再需要时将其删除。使用 Lambda,您可以配置 512 MB—10,240 MB 之间的临时存储空间用于读取或写入数据,从而允许您运行 ETL 作业、机器学习推理或其他数据密集型工作负载。

业务成果

Hyoseop Lee(Encored Technologies首席技术官)说:“自迁移到亚马逊云科技云以来,Encored取得了积极的成果。最初,人们认为在 亚马逊云科技 上运行工作负载比使用本地环境更昂贵。但是,当我们开始在 亚马逊云科技 上运行应用程序后,我们发现情况并非如此。亚马逊云科技 服务最引人入胜的方面之一是它为处理、存储和访问不经常需要的大量数据提供了灵活的架构选项。”

结论

在这篇文章中,我们介绍了 Encored 如何使用 Lambda 和 Amazon ECR 构建无服务器数据管道,以实现性能改进、成本降低和运营效率。

Encored 成功构建了一个架构,该架构将通过 亚马逊云科技 服务和 亚马逊云科技 数据实验室计划支持其全球扩张并增强技术能力。基于Encored整合和整理的架构和各种内部数据集,Encored计划提供可再生能源预测和能源交易服务。

感谢您阅读这篇文章,希望您发现它有用。为了利用机器学习加速您的数字化转型,亚马逊云科技 可以通过提供针对特定用例的规范性架构指导、分享最佳实践和消除技术障碍来为您提供支持。您将使用根据您的需求量身定制的架构或工作原型、生产路径以及对 亚马逊云科技 服务的更深入了解。请联系您的 亚马逊云科技 客户经理或解决方案架构师开始使用。如果您没有 亚马逊云科技 账户经理,请联系 销售人员

要了解有关 Lambda 机器学习推理用例的更多信息,请查看以下博客文章:

  • 使用 亚马逊云科技 无服务器进行大规模机器学习推断
  • 在 亚马逊云科技 Lambda 上部署机器学习推理数据捕获解决方案

这些资源将为您提供有关如何使用 Lambda 进行机器学习推理的宝贵见解和实际示例。


作者简介

lee SeonJeong Lee 是 Encored 的算法主管。她是一位数据从业者,她从漂亮的代码和公式中找到了安心。

yim JaerYun Yim 是 Encored 的资深数据科学家。他专注于我的作品中的简单性和本质,努力改善工作和生活。

yang HyeonSeok Yang 是 Encored 的平台团队负责人。他始终以激情和精神努力工作,像初级开发人员一样不断挑战自我,成为他人的榜样。

younggu Younggu Yun 在韩国 亚马逊云科技 数据实验室 工作。他的职责包括通过提供规范性架构指导、分享最佳实践和共同构建创新解决方案,帮助亚太地区的客户实现其业务目标并克服技术挑战。