• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 開發與優化

    借助 NVIDIA 多進程服務更大限度地提高 OpenMM 分子動力學吞吐量

    分子動力學 (MD) 模擬模擬原子在一段時間內的相互作用,并且需要強大的計算能力。然而,許多模擬的系統規模很小 (約 400K 個原子) ,未充分利用現代 GPU,導致一些計算能力閑置。為更大限度地提高 GPU 利用率并提高吞吐量,使用 NVIDIA 多進程服務 (MPS) 在同一 GPU 上同時運行多個模擬可能是一種有效的解決方案。

    本文將介紹 MPS 的背景及其啟用方式,以及吞吐量提升的基準測試。它還提供了一些使用 OpenMM (一種熱門的 MD 引擎和框架) 的常見使用場景作為示例。

    什么是 MPS?

    MPS 是 CUDA 應用編程接口 (API) 的另一種二進制兼容實現。它允許多個進程通過減少上下文交換開銷來更高效地共享 GPU,從而提高整體利用率。通過讓所有進程共享一組調度資源,MPS 消除了在切換上下文時打開和關閉 GPU 的調度資源交換需求。

    從 NVIDIA Volta GPU 生成開始,MPS 還允許不同進程的內核并發運行,這在單個進程無法使整個 GPU 完全飽和時很有幫助。所有 NVIDIA GPU、Volta 架構及更高版本均支持此功能。

    MPS 的一個主要優勢是可以使用常規用戶權限啟動。如需了解啟用和禁用 MPS 的最簡單方法,請使用以下代碼:

    nvidia-cuda-mps-control -d # Enables MPS
    echo quit | nvidia-cuda-mps-control # Disables MPS

    要與 MPS 同時運行多個 MD 模擬,請啟動多個 sim.py 實例,每個實例都作為一個單獨的進程。如果一個系統上有多個 GPU,您可以使用 CUDA_VISIBLE_DEVICES 進一步控制一個進程的目標 GPU 或 GPU。

    CUDA_VISIBLE_DEVICES=0 python sim1.py &
    CUDA_VISIBLE_DEVICES=0 python sim2.py &
    ...

    請注意,啟用 MPS 后,每次模擬的速度可能會變慢,但由于您可以并行運行多個模擬,因此整體吞吐量會更高。

    OpenMM 教程

    在本簡短教程中,我們使用 OpenMM 8.2.0、CUDA 12 和 Python 3.12。

    測試設置

    要創建此環境,請參閱 OpenMM 安裝指南

    conda create -n openmm8.2
    conda activate openmm8.2
    conda install -c conda-forge openmm cuda-version=12

    安裝后,使用以下命令進行測試:

    python -m openmm.testInstallation

    我們使用了 openmm/examples/benchmark.py GitHub 庫中的基準測試腳本。我們使用以下代碼段同時運行多個模擬:

    NSIMS=2 # or 1, 4, 8
    for i in `seq 1 NSIMS`;
    do
      python benchmark.py --platform=CUDA --test=pme --seconds=60 &
    done
    # test systems: pme (DHFR, 23k atoms), apoa1pme (92k), cellulose (409k)

    MPS 基準測試

    一般來說,系統尺寸越小,預期提升幅度就越大。圖 1、2 和 3 顯示了在三個基準系統上應用 MPS 的結果:使用一系列 GPU 的 DHFR ( 23K 個原子) 、ApoA1 ( 92K 個原子) 和纖維素 ( 408K 個原子) 。這些圖表顯示了在同一 GPU 上同時運行的模擬數量以及最終的總吞吐量。

    A chart listing the aggregate simulation throughput when enabling MPS. The simulated system is DHFR, with a total system size of 23,558 atoms. It lists many NVIDIA GPUs, from A10 to H100. By running more simulations at the same time, the aggregate simulation throughput goes up.
    圖 1。DHFR 測試系統 ( 23558 個原子) 的 MPS 性能

    DHFR 測試系統是這三個系統中最小的,因此在使用 MPS 的情況下,性能提升最大。對于包括 NVIDIA H100 Tensor Core 在內的部分 GPU,總吞吐量可增加一倍以上。

    A chart listing the aggregate simulation throughput when enabling MPS. The simulated system is ApoA1, with a total system size of 92,236 atoms. It lists many NVIDIA GPUs, from A10 to H100. By running more simulations at the same time, the aggregate simulation throughput goes up for larger GPUs such as L40S and H100.
    圖 2。ApoA1 測試系統 ( 92236 個原子) 的 MPS 性能
    A chart listing the aggregate simulation throughput when enabling MPS. The simulated system is cellulose, with a total system size of 408,609 atoms. It lists many NVIDIA GPUs, from A10 to H100. By running more simulations at the same time, the aggregate simulation throughput goes up for the largest GPUs such as H100s.
    圖 3。纖維素測試系統 ( 408609 個原子) 的 MPS 性能

    即使系統大小增長到 40.9 萬個原子 (如纖維素基準測試) ,MPS 仍能使高端 GPU 實現約 20% 的總吞吐量。

    CUDA_MPS_ACTIVE_THREAD_PERCENTAGE 實現更高吞吐量

    默認情況下,MPS 允許所有進程訪問 GPU 的所有資源。這有利于提升性能,因為當其他模擬處于空閑狀態時,模擬可以充分利用所有可用資源。MD 模擬的力計算階段比位置更新階段具有更多的并行性,允許模擬使用更多的 GPU 資源來提高性能。

    但是,由于多個進程同時運行,這通常是不必要的,并且可能會導致對性能的破壞性干擾。CUDA_MPS_ACTIVE_THREAD_PERCENTAGE 是一個環境變量,允許用戶設置單個進程可用線程的最大百分比,這可用于進一步提高吞吐量。

    要實現此結果,請修改代碼段:

    NSIMS=2 # or 1, 4, 8
    export CUDA_MPS_ACTIVE_THREAD_PERCENTAGE=$(( 200 / NSIMS ))
    for i in `seq 1 NSIMS`;
    do
      python benchmark.py --platform=CUDA --test=pme --seconds=60 &
    done
    A chart listing the aggregate simulation throughput when enabling MPS and changing the environment variable CUDA_MPS_ACTIVE_THREAD_PERCENTAGE. The simulation throughput for DHFR (23,558 atoms) is further improved on L40S and H100 GPUs.
    圖 4。更改 CUDA_MPS_ACTIVE_THREAD_PERCENTAGE 可進一步提高某些 GPU 的吞吐量

    此測試表明,200 / number of MPS processes 的百分比會導致最高吞吐量。在此設置下,在單個 NVIDIA L40S 或 NVIDIA H100 GPU 上,8 次 DHFR 模擬的總吞吐量進一步增加約 15% – 25%,接近每天 5 微秒。這不僅僅是 GPU 上單個模擬的吞吐量翻倍。

    用于 OpenFE 自由能計算的 MPS

    估計自由能微擾 (FEP) 是 MD 模擬的熱門應用。FEP 依賴于復制交換分子動力學 (REMD) 模擬,其中不同窗口中的多個模擬以并行和交換配置運行,以增強采樣。在 OpenMM 生態系統中,OpenFreeEnergy (OpenFE) 包提供基于 openmmtools 中的多狀態實現的協議。但是,這些仿真通過 OpenMM 上下文切換運行,一次僅執行一次仿真。因此,它也面臨 GPU 利用率不足的問題。

    MPS 可用于解決此問題。安裝 OpenFE 后,可使用以下命令運行 FEP 分支:

    openfe quickrun <input> <output directory>

    按照相同的邏輯,您可以同時運行多個分支:

    nvidia-cuda-mps-control -d # Enables MPS
    openfe quickrun <input1> <output directory> &
    openfe quickrun <input2> <output directory>
    ...

    測量運行復制交換模擬的均衡階段所需的時間,其中包括 12 × 100 ps 模擬。仿真在 L40S 或 H100 GPU 上運行。我們觀察到,使用三個 MPS 進程時,吞吐量提高了 36%。

    Bar chart showing that the application of MPS to OpenFE free energy perturbation simulations increases throughput on both NVIDIA H100 and L40S GPUs.
    圖 5。將 MPS 應用于 OpenFE 自由能微擾模擬可提高吞吐量

    開始使用 MPS

    MPS 是一款易于使用的工具,無需大量編碼工作即可增加 MD 模擬吞吐量。本文探討了使用多個不同的基準系統時不同 GPU 吞吐量的提升情況。我們研究了如何使用 CUDA_MPS_ACTIVE_THREAD_PERCENTAGE 進一步提高吞吐量。我們還將 MPS 應用于 OpenFE 自由能模擬,并觀察到吞吐量增加。

    在 NVIDIA GTC 點播會議“優化 GPU 利用率:了解 MIG 和 MPS”中詳細了解 MPS。您可以在 NVIDIA 開發者 CUDA 論壇上提出 MPS 實施問題。

    要開始使用 OpenMM 分子動力學模擬代碼,請查看 OpenMM 教程

    ?

    0

    標簽

    人人超碰97caoporen国产