能源行業的數字化轉型需要大幅增加對關鍵 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. 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 能源示例 。探索 人工智能和高性能計算對于地下作業的應用 。
?