企业文化

  • 首页
  • 企业文化
  • 使用 AWS Batch 多容器作业运行大规模模拟 最新消息博客

使用 AWS Batch 多容器作业运行大规模模拟 最新消息博客

2026-01-27 12:49:25

使用 AWS Batch 多容器作业进行大规模模拟

重点总结

AWS Batch 现支持多容器作业,简化复杂计算工作负载的运行管理。多容器作业适用于汽车、机器人和金融等行业,提升了模拟和数据分析的效率。使用示例代码演示了如何在 AWS Batch 中配置并运行一个基于迷宫探索的模拟作业。

在汽车、机器人和金融等行业,越来越多的企业开始应用计算工作负载,例如模拟、机器学习(ML)模型训练和大数据分析,以改进产品。例如,汽车制造商依赖模拟来测试自动驾驶特性,机器人公司训练机器学习算法以增强机器人感知能力,而金融公司则进行深入分析以更好地管理风险、处理交易和检测欺诈。

这些工作负载中,特别是模拟,由于组件的多样性和计算需求的强度,使得运行起来尤其复杂。例如,驾驶模拟需要生成三维虚拟环境、车辆传感器数据、以及控制汽车行为的车辆动力学等。一个机器人模拟可能测试数百个自动送货机器人在大规模仓库环境中的互相交互。

AWS Batch 是一项完全托管的服务,能够助您在多种 AWS 计算产品上运行批量工作负载,包括 Amazon Elastic Container Service (Amazon ECS)、Amazon Elastic Kubernetes Service (Amazon EKS)、AWS Fargate,以及 Amazon EC2 Spot 或 OnDemand 实例。传统上,AWS Batch 仅允许单个容器作业,并要求额外步骤将所有组件合并到单一的容器中。此外,它也不支持使用分开的“侧车”容器,这些辅助容器提供额外的服务,如数据记录。这需要多个团队之间的协调,包括软件开发、IT 运维和质量保证QA,因为任何代码更改都意味着需要重新构建整个容器。

现在,AWS Batch 提供多容器作业,使得在自动驾驶和机器人等领域中运行大规模模拟更为简单和快速。这些工作负载通常分为模拟本身和被测系统也称为代理,后者与模拟进行交互。这两个组件通常由不同的团队进行开发和优化。通过在每个作业中运行多个容器,您将受益于 AWS Batch 提供的先进扩展、调度和成本优化,同时可以使用代表不同组件的模块化容器,如 3D 环境、机器人传感器或监控侧车。事实上,像 IPG Automotive、MORAI 和 Robotecai 的客户已经在使用 AWS Batch 多容器作业在云中运行他们的模拟软件。

接下来,让我们通过一个简化示例来了解其具体操作,并试着解决一个迷宫。

使用 AWS Batch 多容器作业运行大规模模拟 最新消息博客

构建基于容器运行的模拟

在实际生产中,您可能会使用现有的模拟软件。对于本篇文章,我构建了一个简化版的代理/模型模拟。如果您对代码细节不感兴趣,可以跳过此部分,直接查看如何配置 AWS Batch。

在这个模拟中,探险的世界是一个随机生成的二维迷宫。代理的任务是探索迷宫找到一个钥匙,然后到达出口。这在某种程度上是路径寻找问题的经典示例,有三个位置。

以下是我提供的迷宫样本地图,我已强调起点S、终点E和钥匙K位置。

代理和模型分成两个独立的容器,让不同团队可以分别进行工作。每个团队可以专注于改进自己的部分,例如在模拟中添加细节或寻找更好的策略让代理探索迷宫。

以下是迷宫模型的代码apppy。我使用 Python 编写以下示例。该模型公开了一个 REST API,代理可以利用该 API 在迷宫中移动,并得知是否找到钥匙并达到了出口。迷宫模型使用 Flask 来构建 REST API。

pythonimport jsonimport randomfrom flask import Flask request Response

省略部分代码,以免冗长

app = Flask(name)

@approute(/)def hellomaze() return

Hello Maze!

其他路由和逻辑

Dockerfile 示例

为了创建一个运行迷宫模型的容器镜像,我使用以下 Dockerfile:

dockerfileFROM platform=linux/amd64 publicecraws/docker/library/python312alpine

WORKDIR /app

COPY requirementstxt requirementstxtRUN pip3 install r requirementstxt

COPY

CMD [ python3 m flask run host=0000 port=5555]

以下是代理agentpy的代码。代理首先询问模型迷宫的大小和起始位置。然后,它应用自己的策略探索并解决迷宫。在这个实现中,代理随机选择路径,尽量避免重复走同一路径。

pythonimport randomimport requestsfrom requestsadapters import HTTPAdapter Retry

省略部分代码,以免冗长

sclose()

与迷宫模型一样,为了创建运行代理的容器镜像,我使用类似的 Dockerfile。

dockerfileFROM platform=linux/amd64 publicecraws/docker/library/python312alpine

WORKDIR /app

COPY requirementstxt requirementstxtRUN pip3 install r requirementstxt

COPY

CMD [ python3 agentpy]

您可以轻松地在本地运行这个简化版本的模拟,但云环境允许您以更大规模运行例如,具有更大和更复杂的迷宫,并测试多个代理以找到最佳策略。在实际场景中,代理的改进将被实施到实际设备中,如自动驾驶汽车或机器人吸尘器中。若要增加模拟的复杂性并扩展到数以万计甚至几十万的动态实体,请查看 AWS SimSpace Weaver。

使用多容器作业运行模拟

要使用 AWS Batch 运行作业,我需要配置三个资源: 计算环境:用以运行作业 作业队列:提交作业的队列 作业定义:描述如何运行作业,包括使用的容器镜像

在 AWS Batch 控制台中,我在导航窗格中选择计算环境,然后选择创建。此时,我可以选择使用 Fargate、Amazon EC2 或 Amazon EKS。Fargate 让我可以精准匹配作业定义中指定的资源要求。然而,模拟通常要求访问大量静态资源,并使用 GPU 来加速计算。因此,我选择Amazon EC2。

我选择托管编排类型,以便 AWS Batch 为我自动扩展和配置 EC2 实例。接着,我输入计算环境的名称,并选择之前创建的服务链接角色和容器代理使用的实例角色。然后,点击下一步。

在实例配置设置中,我选择 EC2 实例的大小和类型。例如,可以选择带有 GPU 的实例类型或使用 Graviton 处理器。由于我没有特定的要求,因此保持所有设置为默认值。在网络配置中,控制台已经选择了我的 默认 VPC 和 默认安全组。在最后一步,我检查所有配置并完成计算环境的创建。

接下来,我选择导航窗格中的作业队列,然后选择创建。我选择与计算环境相同的编排类型Amazon EC2。在作业队列配置中,我输入作业队列的名称。在连接的计算环境下拉列表中,选择刚创建的计算环境,然后完成队列的创建。

之后,我选择导航窗格中的作业定义,然后选择创建。与之前一样,我为编排类型选择Amazon EC2。

为了使用多个容器,我禁用使用传统的 containerProperties 结构选项并进入下一步。默认情况下,如果帐户中已有传统的作业定义,控制台会创建一个传统的单容器作业定义,这正好是我碰到的情况。对于没有传统作业定义的帐户,此选项会被禁用。

我为作业定义输入一个名称。接着,我需要考虑该作业所需的权限。我想在该作业中使用的容器镜像存储在 Amazon ECR 私有仓库中。为了允许 AWS Batch 将这些镜像下载到计算环境中,在任务属性部分,我选择一个执行角色,为 ECR 仓库提供只读访问权限。我不需要配置任务角色,因为模拟代码并未调用 AWS API。例如,如果我的代码上传结果到 Amazon Simple Storage Service (Amazon S3) 存储桶,我可以在这里选择一个拥有相关权限的角色。

在下一步中,我配置该作业使用的两个容器。第一个是 mazemodel。我输入名称和镜像位置。这里,我可以指定容器在 vCPU、内存和 GPU 方面的资源要求。这与为 ECS 任务 配置容器类似。

我为代理添加第二个容器,并像之前一样输入名称、镜像位置和资源要求。由于代理在启动时需要访问迷宫,我在依赖关系部分添加容器依赖项。我选择 mazemodel 作为容器名称,并将条件设置为START。如果我不添加该依赖性,agent 容器可能会在 mazemodel 容器尚未运行且无法响应的情况下失败。由于这两个容器在此作业定义中均被标记为关键,整体作业将以失败告终。

我检查所有配置并完成作业定义。现在,您可以开始作业了。

在导航窗格的作业部分,我提交一个新作业,输入一个名称,选择刚创建的作业队列和作业定义。

在接下来的步骤中,我不需要覆盖任何配置并创建作业。几分钟后,作业成功完成,我可以访问两个容器的日志。

代理成功解决了迷宫,我可以从日志中获取所有细节。以下是作业的输出,展示了代理如何开始,获取钥匙并找到出口。

SIZE {width 80 height 20}START {x 0 y 18}(32 2) key found(79 16) exitSolution length 437[(0 18) (1 18) (0 18) (79 14) (79 15) (79 16)]

在地图上,红色星号 () 显示了代理在起点S、钥匙K和出口E位置之间所使用的路径。

通过侧车容器提高可观察性

在运行复杂作业时,增加对多个组件的可见性是很有帮助的。例如,如果出现错误或性能问题,相关信息可以帮助您找到问题所在。

为此,我使用 AWS Distro for OpenTelemetry 进行应用程序的可观察性:

首先,我更新 agent 和 mazemodel 容器,使其使用 Python 自动仪表化,如 本文所述。对于其他平台如 Go、Java 和 JavaScript 也有类似的教程。为了获取特定于我的应用程序的信息,我可以选择 手动仪表化 代码。然后,我添加一个使用 AWS Distro for OpenTelemetry 收集器 的侧车容器来自 Amazon ECR 公共库。collector 容器将接收来自其他容器的遥测数据,并将跟踪信息发送到 AWS XRay 和指标到 Amazon CloudWatch、Amazon 管理服务 Prometheus 或自管理 Prometheus。OpenTelemetry 使共享数据变得更加简便,可以与 多个监控和可观察性平台 集成。

通过这种方式收集的遥测数据,我可以设置仪表板例如,使用 CloudWatch 或 Amazon Managed Grafana和警报使用 CloudWatch 或 Prometheus,帮助我更好地理解正在发生什么,并减少解决问题的时间。更普遍地说,侧车容器有助于将 AWS Batch 作业的遥测数据与您的监控和可观察性平台集成。

需要知道的事项

AWS Batch 对多容器作业的支持今天已在 AWS 管理控制台、AWS 命令行界面 (AWS CLI) 和 AWS SDK 中提供,覆盖了所有提供 Batch 的 AWS 区域。有关更多信息,请参见 AWS 服务按地区列表。

使用 AWS Batch 不需要额外的费用。实际上,使用 AWS Batch 没有额外收费。您只需为创建以存储和运行应用程序的 AWS 资源付费,例如 EC2 实例和 Fargate 容器。为了优化成本,您可以在计算环境中使用 保留实例、节省计划、EC2 Spot 实例以及 Fargate。

使用多容器作业通过减少作业准备工作,加快了开发时间,消除了将多个团队的工作合并到一个容器中所需的自定义工具的需求。它还简化了 DevOps,通过明确组件的职责,使团队能快速定位并解决自己领域的问题,而不被其它事务干扰。

飞鸟加速器ios版版本

想了解更多,请查看 AWS Batch 用户指南。

Danilo

Danilo Poccia

Danilo 在各类规模的初创企业和公司中支持创新。在亚马逊网络服务AWS担任EMEA区域首席布道师时,他利用自己的经验,帮助人们实现想法,重点关注无服务器架构和事件驱动编程,以及机器学习和边缘计算的技术和商业影响。他是《AWS Lambda in Action》一书的作者。