分子動力學 (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 上同時運行的模擬數量以及最終的總吞吐量。

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


即使系統大小增長到 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 |

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%。

開始使用 MPS
MPS 是一款易于使用的工具,無需大量編碼工作即可增加 MD 模擬吞吐量。本文探討了使用多個不同的基準系統時不同 GPU 吞吐量的提升情況。我們研究了如何使用 CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
進一步提高吞吐量。我們還將 MPS 應用于 OpenFE 自由能模擬,并觀察到吞吐量增加。
在 NVIDIA GTC 點播會議“優化 GPU 利用率:了解 MIG 和 MPS”中詳細了解 MPS。您可以在 NVIDIA 開發者 CUDA 論壇上提出 MPS 實施問題。
要開始使用 OpenMM 分子動力學模擬代碼,請查看 OpenMM 教程。
?