能源行业的数字化转型需要大幅增加对关键 HPC 工作负载和应用程序的计算需求。这一趋势以先进的地震成像方法(例如逆时偏移(RTM)和全波形反演(FWI))为例,其中最大频率的翻倍可使计算工作负载增加 16 倍。同样,在油藏模拟中,网格离散化在所有三个维度中减少一半,可将计算需求放大 8 倍。
这些发展凸显了对灵活且可扩展的计算资源的迫切需求,这些资源可根据能源行业不断变化的 HPC 需求量身定制。云计算是满足日益增长的计算需求的可行解决方案。然而,实现云计算的最佳性能和成本需要大量工程工作来实现现有 HPC 应用的现代化。
AWS Energy HPC Orchestrator 提供了一个集成环境来克服这些挑战。这个开放式行业平台和市场生态系统由 AWS 和领先能源公司合作开发,并与 NVIDIA Energy Samples 直接提供,专注于实现处理模块之间的互操作性,以提供优化的可扩展性、灵活性和经济效益。它还提供了一系列预先优化的云原生 HPC 模板,以简化现代化工程工作,并创建一个开放的 HPC 市场,让每个参与者都可以专注于自己的差异化技术。
在本文中,我们详细介绍了如何集成 NVIDIA 能源示例,这些示例用于在 AWS Energy HPC Orchestrator 上构建衍生解决方案。此平台使用 AWS 云优化模板快速构建云原生地震应用,并使用数百个 NVIDIA 支持的实例对其进行扩展。
设计 AWS Energy HPC Orchestrator
AWS Energy HPC Orchestrator 参考架构包含以下基本组件:
- 一个能够实现以下功能的系统:
- 编排使用通用存储系统的不同类型的 HPC 应用程序。
- 企业功能,例如用户、项目和数据管理。
- 与 AWS Energy HPC Orchestrator 兼容并通过市场分发的 HPC 应用程序生态系统。
- 一组数据标准,用于实现 HPC 应用程序之间的互操作性(数据交换)。

扩展程序
扩展程序是系统的插件,可提供特定领域的功能。例如,您可以使用不同的扩展程序来实现算法,例如 RTM 或 FWI。扩展程序需要实现核心定义的基于事件的协议。
RTM 模板
模板可重复用于一类算法,并封装了在 AWS 上运行这些算法的最佳实践。
RTM 模板旨在将传统的 RTM 应用转变为现代化的云原生应用,以提升高端地震成像算法的可扩展性、弹性和运营效率。该设计利用强大的 AWS 服务来实现这一目标。

RTM 算法的执行在动态后端展开,并被分割成四个不同的解耦的微服务,每个微服务都专用于 RTM 算法的一项任务:
- 分析
- 迁移
- 归约
- 转换器
分析服务
此微服务通过从输入数据队列中获取工作项(通常是指向地震文件位置(对象存储 URI)的指针)来启动工作流。然后,它扫描文件的标头或其元数据,以确定其包含的镜头数量。
随后,对于检测到的每个镜头,分析服务会制定单独的工作项目详细信息,并将这些元数据分配到迁移队列中,从而将任务分割成较小的独立处理单元。
迁移服务
迁移服务从迁移队列中提取工作项详细信息。该服务从输入的地震数据文件中加载模型并读取数据,然后求解正向波方程和伴随波方程,生成 3D 图像,并上传到对象存储。随后,相应的归约工作项被推送到归约队列,以进行后续的堆栈处理。
扣减服务
此服务通过从归约队列中检索两个工作项目来激活。它从对象存储中检索两个相应的图像,并将它们堆叠成一个单个图像。该堆叠图像被重新上传到对象存储,工作项目被重新加入归约队列。
此循环一直持续到归约队列中剩下单个合成工作项,表示整个数据集的 RTM 过程已完成。
转换器服务
此服务将最终堆叠图像转换为适当的最终格式。
排队和扩展
微服务通过排队系统进行间接交互,不仅能增强系统的弹性和容错能力,还能实现每个服务的自主扩展。通过自动扩展组,服务可根据排队的工作项目或地震镜头数量动态调整规模,确保资源分配最优化。
通过使用云原生服务(例如用于实时监控和事件驱动操作的无服务器计算),该架构避开了传统的 HPC 编排方法(如 MPI 或 Slurm),而是为在云中实施实时监控提供了一种更敏捷、更可靠的方法。
每个服务的工作流程都是异步的,防止任何单点故障或单个操作造成瓶颈。基于队列的通信将服务解耦,以增强容错能力,并促进高度异步的处理系统。异步处理确保可扩展性,进一步增强系统的容错能力。
每个微服务都可以自治地运行,并可以根据排队的工作负载进行纵向或横向扩展。这种设计可以保证针对单个组件故障的恢复能力,并提供高效管理各种负载的灵活性。
此架构具有异步和弹性的特性,使用 AWS Spot 实例还可在性能和成本优化方面提供显著优势。
可以将不同的实例类型分配到各种服务,从而在成本和性能之间实现最佳平衡。例如,Analysis Service 可以使用通用实例。Migration Service 可以使用 HPC 实例,而 Reduction Service 可以选择适合其工作负载的网络优化实例。
集成 NVIDIA 能源样本
RTM 是一种先进的地震成像技术,广泛应用于地球物理学领域,尤其是石油和天然气勘探领域。RTM 在创建准确的地下图像方面发挥着至关重要的作用。该技术涉及解决通过地球地下计算模型传播的地震波,使地球物理学家能够生成地质结构的高分辨率图像。
与传统的迁移方法不同,RTM 可以处理复杂的速度模型和地下面的清晰对比,因此对于具有复杂地质学的区域(例如盐体或急剧倾斜的层)进行地下成像至关重要。
NVIDIA Energy Samples 是地震处理中关键算法(例如 RTM、Kirchoff 和 FWI)的参考实现集合,所有这些都是用 CUDA 编写的,并针对 NVIDIA GPU 上的最大增益进行了调整。这些算法已准备好在云平台上运行,但不能视为生产级实现。这些示例直接从 NVIDIA 获取,使得地球物理学家可以轻松生成功能齐全、高性能的实现,方法是包含每个地球物理组特有的自定义功能。
RTM 是一个计算密集型过程,能够从 NVIDIA 提供的加速计算中受益匪浅。NVIDIA Energy Samples 是一组示例代码,展示了如何充分利用 NVIDIA GPU 的强大功能来实现关键的地震处理算法。尽管这些示例并不提供完整的生产解决方案,但它们仍能帮助地球物理学家将其独特的 RTM 算法转化为高性能的 GPU 代码。
AWS 提供经优化的云原生 RTM 模板作为 Python 代码,并将其解为四个微服务:Analysis、Migration、Reduction 和 SegyConverter。
借助 AWS RTM 模板,您无需修改任何代码即可使用标准的分析服务、归约服务和 SegyConverter 服务。这些服务旨在以原生方式与 Amazon S3 配合使用,并经过预先优化,可实现最佳性能。
为使 NVIDIA Energy Samples 能够与 AWS Energy HPC Orchestrator (EHO)集成,我们对迁移服务作出了以下修改:
- 参数转换
- 模型处理
- 数据处理
参数转换
EHO 有一个 Web 界面,可用于以 JSON 格式向 HPC 应用程序传递参数。但是,NVIDIA Energy Samples 的 RTM 示例将参数作为普通 ASCII 格式。您必须编写自定义 Python 函数,以将参数 JSON 转换为 ASCII 格式:
#!/usr/bin/python3
import json
from sys import *
def json2par(data, local_shot_file, local_modelfiles, local_img_fname, dt, nt, ntr):
strpar=""
# hardcode part
strpar+=f"storageFileName=/scr\n"
strpar+=f"imagingData= {local_img_fname}\n"
strpar+=f"InputData= {local_shot_file}\n"
strpar+=f"InputHeaders= {local_shot_file}.hdr\n"
strpar+=f"NTraces= {ntr}\n"
strpar+=f"Nsamples= {nt}\n"
strpar+=f"SRate= {dt}\n"
strpar+=f"FirstShotSelect= 0\n"
strpar+=f"LastShotSelect= 0\n"
strpar+=f"velocityData= {local_modelfiles['vp']}\n"
strpar+=f"epsilonData= {local_modelfiles['epsilon']}\n"
strpar+=f"deltaData= {local_modelfiles['delta']}\n"
strpar+=f"thetaData= {local_modelfiles['dip']}\n"
strpar+=f"phiData= {local_modelfiles['azimuth']}\n"
# jobrelated part
sdgp = data["Standardized Geophysical Parameters"]
rp = data["Runtime Parameters"]
spgp = data["Specialized Geophysical Parameters"]
srp = data["Specialized Runtime Parameters"]
gp = data["Grid Parameters"]
strpar+=f"ngpus={srp['nGPUs']}\n"
strpar+=f"storage={srp['LocalComputeStorage']}\n"
strpar+=f"nb_quants_bitcomp={srp['nb_quants_compression']}\n"
strpar+=f"cyclesSkip4Imaging={spgp['imagingStep']}\n"
strpar+=f"noperator={spgp['fdOperator']}\n"
strpar+=f"weightPower={spgp['weightPower']}\n"
strpar+=f"inputDataMultiply={spgp['inputDataMultiply']}\n"
strpar+=f"dtPropagation={spgp['dtPropagation']}\n"
strpar+=f"minValueOfVelocity={spgp['minVelocity']}\n"
strpar+=f"maxValueOfVelocity={spgp['maxVelocity']}\n"
strpar+=f"aperture_inline={sdgp['aperture']['inlineAperture']}\n"
strpar+=f"aperture_xline={sdgp['aperture']['xlineAperture']}\n"
模型处理
下一步涉及修改 download_and_cache_models
函数。该函数负责下载地震速度模型并将其缓存到 NVIDIA GPU 实例上,直到 RTM 过程完成。由于 NVIDIA Energy Samples 中的 RTM 示例需要原始浮点二进制格式的模型,因此需要转换下载的 SEGY 格式模型。
# Overwrite this method to post-process the model files after download
def download_and_cache_models(self, job_info, tmpdirname) -> dict[str, str]:
‘’’
See base class for more details
‘’’
# result = super().download_and_cache_models(job_info, tmpdirname)
local_model = {}
for input_model in job_info["module_configuration"]["Input"]["InputModelFiles"]:
url = urlparse(input_model[‘modelFile’])
local_segy_file = f"{tmpdirname}/{os.path.split(url.path)[1]}"
local_file = f"{local_segy_file}.bin"
local_file_hdr = f"{local_segy_file}.bin.hdr"
local_file_att = f"{local_segy_file}.bin.attributes.txt"
local_model[input_model['property']]=local_file
if not os.path.exists(local_file):
object_path = url.path.lstrip('/')
self.download_file(url.hostname, object_path, local_segy_file)
trace_batch=1000
process_segy.process_segy_file(local_segy_file, trace_batch, local_file, local_file_hdr, local_file_att)
os.remove(local_segy_file)
return local_model
数据处理
接下来,修改 AWS RTM 模板提供的 download_shot_file
函数,以支持从 S3 对象下载部分地震采样数据。NVIDIA Energy Samples 的 RTM 样本要求地震数据采用特定格式,由原始二进制数据和原始二进制标头组成。原始二进制数据仅包含地震测量结果,而二进制标头则包含每个跟踪的七个浮点值:
- 源 x、y 和 z (高度) 坐标
- 接收端 x、y 和 z (高度) 坐标
- 额外的浮点表示追踪有效性(1 表示无效,0 表示有效)
# Overwrite this method to customize the download of shot file
def download_shot_file(self, data_bucket_name:str, data_object_key:str,
start_offset:int, end_offset:int, local_shot_file:str):
'''
See base class for more details
'''
local_shot_segy_file=f"{local_shot_file}.segy"
ranges=[[0,3599], [start_offset, end_offset-1]]
t = S3CRTFileTransfer(18)
t.download_parts2file(data_bucket_name, data_object_key,
local_shot_segy_file, ranges)
trace_batch=1000
local_shot_file_hdr = f"{local_shot_file}.hdr"
local_shot_file_att = f"{local_shot_file}.attributes.txt"
process_segy.process_segy_file(local_shot_segy_file, trace_batch,
local_shot_file, local_shot_file_hdr,
local_shot_file_att)
os.remove(local_shot_segy_file)
return
接下来,修改 migration_single_shot
函数,以执行 NVIDIA Energy Samples 中的 RTM 示例,方法是使用 Python 子进程调用它,并使用生成的 ASCII 参数文件。
# Overwrite this method to customize the download of shot file
def migrate_shot_local(self, job_info, working_dir:str, local_shot_file:str,
shot_id:int, local_model_files:dict[str,str],
local_img_fname:str) -> bool:
datattfile = open(f"{local_shot_file}.attributes.txt", "r")
lines = datattfile.readlines()
datattfile.close()
t,dt=lines[0].split(":")
dt=str(float(dt.lstrip().rstrip()/1000.0)
t,nt=lines[1].split(":")
nt = nt.lstrip().rstrip()
lssize = os.stat(local_shot_file).st_size
ntr=str(int(lssize/int(nt)/4))
'''
See base class for more details
'''
jsondata = job_info['module_configuration']
strpar = json2par.json2par(jsondata, local_shot_file, local_model_files,
local_img_fname, dt, nt, ntr)
parfname = "/scr/parfile/singleshot"
parfile = open(parfname, "w")
parfile.write(strpar)
parfile.close()
cmd = f"LD_LIBRARY_PATH=/usr/local/cuda-12.5/targets/x86_64-linux/lib:/work/nvcomp_3.0.4/lib /work/rtm parfile= {parfname} >& /scr/run.log"
logging.info("running RTM cmd: %s", cmd)
logging.info("Starting Nvidia RTM migration...")
subprocess.run(cmd, cwd=working_dir, shell=True, text=True, check=True)
logging.info("Migration ended.")
return True
然后,将迁移服务代码和来自 NVIDIA Energy Samples 的 RTM 示例以及所需的库打包成 Docker 镜像,随后将其推送到 Amazon Elastic Container Registry (ECR)。这样,AWS RTM 模板就能在数百个 NVIDIA GPU 实例中自动扩展来自 NVIDIA Energy Samples 的 RTM 示例。
构建 NVIDIA 能源样本
以下是如何根据 NVIDIA Energy Samples 和用于 NVIDIA GPU 实例的 AWS 镜像构建 RTM 示例。
这里有几个前提条件:
- 从 NVIDIA 开发者 Web 门户下载并安装 nv_comp 库 。
- 使用 AWS 深度学习 AMI,该 AMI 已预安装所有必要的 NVIDIA CUDA 库和 NVIDIA CUDA GPU 驱动程序。
以下是多个 NVIDIA CUDA 版本、驱动和 Amazon EC2 实例支持的 Amazon Linux 2 主屏幕。
, #_
~\_ ####_ Amazon Linux 2
~~ \######\
~~ \#######| AL2 End of Life is 2025-06-30.
~~ ####/ ---
~~ V~' '~->
~~~ /
~~._. _/
_/_/_/
_/m/'
A newer version of Amazon Linux is available!
Amazon Linux 2023, GA and supported until 2028-03-15.
https://aws.amazon.com/linux/amazon-linux-2023/
27 package(s) needed for security, out of 37 available
Run "sudo yum update" to apply all updates.
=================================================================
AMI Name: Deep Learning Base OSS Nvidia Driver AMI (Amazon Linux 2) Version 65
Supported EC2 instances: G4dn, G5, G6, Gr6, P4d, P4de, P5
NVIDIA driver version: 535.183.01
CUDA versions available: cuda-11.8 cuda-12.1 cuda-12.2 cuda-12.3
Default CUDA version is 12.1
修改 CMakeLists.txt,根据 NVIDIA GPU 实例正确设置 arch。
set(CMAKE_CUDA_FLAGS “${CMAKE_CUDA_FLAGS} -gencode arch=compute_75,code=sm_75 ”)
然后,使用 CMake 从 NVIDIA Energy Samples 中构建 RTM 示例,并生成可集成到 EHO 的 RTM 可执行二进制文件。
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 14 registers, 496 bytes cmem[0]
ptxas info : Compiling entry function '_Z13add_receiversPfPN6common16SeismicHeaderStrES_NS0_5grid4Ejjjf' for 'sm_75'
ptxas info : Function properties for _Z13add_receiversPfPN6common16SeismicHeaderStrES_NS0_5grid4Ejjjf
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 30 registers, 496 bytes cmem[0], 16 bytes cmem[2]
ptxas info : Compiling entry function '_Z19add_source_withsincPf6float4N6common5gridEf' for 'sm_75'
ptxas info : Function properties for _Z19add_source_withsincPf6float4N6common5gridEf
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 38 registers, 484 bytes cmem[0]
ptxas info : Compiling entry function '_Z10add_sourceP6float26float4N6common5grid4Ef' for 'sm_75'
ptxas info : Function properties for _Z10add_sourceP6float26float4N6common5grid4Ef
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 11 registers, 484 bytes cmem[0]
ptxas info : Compiling entry function '_Z1-add_sourcePf6float4N6common5grid4Ef' for 'sm_75'
ptxas info : Function properties for _Z1-add_sourcePf6float4N6common5grid4Ef
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 11 registers, 484 bytes cmem[0]
[100%] Linking CUDA executable ../bin/rtm
[100%] Built target rtm
HPC 在能源领域的未来
NVIDIA Energy Samples 应用程序与 AWS Energy HPC Orchestrator 的集成展示了云原生解决方案在满足能源行业日益增长的计算需求方面的潜力。使用预先优化的云原生模板简化了该过程,从而加快了部署速度并实现了高效的资源管理。
随着能源部门继续拥抱数字化转型,采用此类基于云的集成系统对于解决日益复杂的计算挑战至关重要。
有关更多信息,请参阅 AWS Energy HPC Orchestrator 并获取 NVIDIA 能源示例 。探索 人工智能和高性能计算对于地下作业的应用 。