Moleküler dinamik (MD) simülasyonları, atomik etkileşimleri zaman içinde modelleyerek önemli hesaplama gücü gerektirir. Ancak, birçok simülasyon, 400 K atomdan daha küçük sistem boyutlarına sahip olduğundan, modern GPU’ları‘nın potansiyelinden tam olarak faydalanılamaz ve bu da bazı işlem gücünün boşa gitmesine yol açar. GPU verimliliğini artırmak ve üretkenliği geliştirmek için, NVIDIA Çoklu Süreç Hizmeti (MPS) kullanarak aynı GPU üzerinde birden fazla simülasyon yürütmek etkili bir çözüm olabilir.
Bu yazıda, MPS’nin arka planı, nasıl etkinleştirileceği ve performans artışı ile ilgili ölçümler ele alınacak. Ayrıca, OpenMM simülasyon motorunu ve çerçevesini örnek göstererek yaygın kullanım senaryolarına da yer verilecektir.
MPS Nedir?
MPS, CUDA Uygulama Programlama Arayüzü (API) için alternatif, ikili uyumlu bir uygulamadır. Birden fazla sürecin GPUyu daha verimli şekilde paylaşmasını sağlar. Böylece, bağlam değiştirme maliyetlerini azaltarak genel verimliliği arttırır. Süreçlerin tek bir set çizelgeleme kaynağını paylaşması, bağlam değiştirirken GPU’dan kaynakların çıkartılıp geri yüklenmesi gerekliliğini ortadan kaldırır.
NVIDIA’nın Volta GPU neslinden başlayarak, MPS, farklı süreçlerin karnellerinin eş zamanlı çalışmasına da olanak tanır. Bu durum, bireysel süreçlerin GPU’yu tam olarak kullanamadığı durumlarda oldukça faydalıdır. MPS, Volta nesli ve sonrasındaki bütün NVIDIA GPU’ları tarafından desteklenmektedir.
MPS’nin sağladığı en önemli avantajlardan biri, normal kullanıcı yetkileriyle başlatılabilmesidir. MPS’yi etkinleştirmek ve devre dışı bırakmak için aşağıdaki kod kullanılır:
nvidia-cuda-mps-control -d # MPS'yi etkinleştirir
echo quit | nvidia-cuda-mps-control # MPS'yi devre dışı bırakır
Aynı GPU üzerinde birden fazla MD simülasyonu çalıştırmak için, her biri ayrı birer süreç olarak sim.py
‘yi başlatın. Bir sistemde birden fazla GPU varsa, süreç için hedef GPU veya GPU’ları daha iyi kontrol etmek için CUDA_VISIBLE_DEVICES
kullanabilirsiniz.
CUDA_VISIBLE_DEVICES=0 python sim1.py &
CUDA_VISIBLE_DEVICES=0 python sim2.py &
...
MPS etkinleştirildiğinde, her simülasyon biraz yavaşlayabilir; ancak birden fazla simülasyonu paralel olarak çalıştırabileceğiniz için toplam üretkenlik artar.
OpenMM için Kılavuz
Bu kısa kılavuzda, OpenMM 8.2.0, CUDA 12, ve Python 3.12 kullanacağız.
Test Yapılandırması
Bu ortamı oluşturmak için, OpenMM Kurulum Kılavuzuna başvurabilirsiniz.
conda create -n openmm8.2
conda activate openmm8.2
conda install -c conda-forge openmm cuda-version=12
Kurulumdan sonra, aşağıdaki komutla testi gerçekleştirin:
python -m openmm.testInstallation
Benchmarking scriptini, OpenMM GitHub repo adresinden aldık. Aşağıdaki kod snippet’i ile aynı anda birden fazla simülasyon çalıştırdık:
NSIMS=2 # veya 1, 4, 8
for i in `seq 1 NSIMS`;
do
python benchmark.py --platform=CUDA --test=pme --seconds=60 &
done
# test sistemleri: pme (DHFR, 23k atom), apoa1pme (92k), cellulose (409k)
MPS’nin Performans Testi
Genel olarak, sistem boyutu ne kadar küçükse, beklediğiniz performans artışı da o kadar fazla olur. Şekil 1, 2 ve 3, DHFR (23K atom), ApoA1 (92K atom) ve Selüloz (408K atom) sistemleri üzerinde MPS’nin uygulanmasının sonuçlarını gösterir. Grafiklerde, aynı GPU üzerinde birden fazla simülasyonun çalıştırılmasının ardından elde edilen toplam throughput gözlemlenmektedir.

DHFR test sistemi, üç sistemin en küçüğü olduğundan, MPS ile elde edilecek performans artışı da en yüksektir. Özellikle NVIDIA H100 Tensor Core gibi bazı GPU’lar için toplam throughput iki katına kadar çıkabilmektedir.


Selüloz benchmark sisteminde bile, MPS’nin yüksek uçlu GPU’lar için toplam throughput’u %20 daha fazla hale getirdiği gözlemlenmiştir.
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE ile Daha Fazla Üretkenlik
Varsayılan olarak, MPS tüm süreçlerin GPU’nun tüm kaynaklarına erişimini sağlar. Bu, performans açısından faydalıdır çünkü simülasyonlar diğer simülasyonlar boşta kaldığında GPU kaynaklarını tam anlamıyla kullanabilir. MD simülasyonlarının kuvvet hesaplama aşaması, konum güncelleme aşamasına göre çok daha fazla paralellik sunar; bu sayede birden fazla süreç aynı anda çalıştığında, kaynaklardan daha fazla yararlanmak performansı artırır.
Ancak, birden fazla süreç eş zamanlı çalıştığından, bu genellikle gereksiz hale gelir ve performans açısından olumsuz etkiler yaratabilir. CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
, kullanıcılara tek bir süreç için mevcut olan maksimum iş parçacığı yüzdesini ayarlama olanağı sunar ve bu, toplam verimliliği artırmak için daha fazla kullanım sağlar.
Bu sonucu elde etmek için, kod kısmını şöyle değiştirebilirsiniz:
NSIMS=2 # veya 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
ayarının throughput’u artırmasıBu testler, 200 / MPS süreç sayısı
yüzdesinin en yüksek throughput’u sağladığını göstermektedir. Bu ayar ile 8 DHFR simülasyonu için toplam throughput %15 – %25 oranında artarak, NVIDIA L40S veya NVIDIA H100 GPU üzerinde günde 5 mikro saniyeye yaklaşmıştır. Bu da, bir GPU üzerinde tek bir simülasyonun throughput’unu iki katından fazla yapmaktadır.
MPS ile OpenFE Serbest Enerji Hesaplamaları
Serbest enerji perturbasyonu (FEP) tahmini, MD simülasyonlarının en popüler uygulamalarından biridir. FEP, farklı λ pencerelerinde birden fazla simülasyon yürüten replica-exchange molecular dynamic (REMD) simülasyonlarına dayanır ve bu simülasyonlar, örneklemeyi artırmak için eş zamanlı olarak yapılandırmalar değiş tokuş eder. OpenMM ekosisteminde, OpenFreeEnergy (OpenFE) paketi, openmmtools
içindeki çok durumlu uygulama protokollerini sağlar. Ancak, bu simülasyonlar OpenMM bağlam değiştirme ile yürütülür; bu da yalnızca bir simülasyonun gerçekleştirilmesine olanak tanır. Sonuç olarak, bu yöntem de GPU’ların kötü kullanılmasına sebep olur.
MPS, bu sorunu çözmek üzere kullanılabilir. OpenFE yüklendiğinde, bir FEP bacağının çalıştırılması şu komutla yapılabilir:
openfe quickrun <input> <output directory>
Aynı mantıkla, birden fazla bacağı aynı anda çalıştırabilirsiniz:
nvidia-cuda-mps-control -d # MPS'yi etkinleştirir
openfe quickrun <input1> <output directory> &
openfe quickrun <input2> <output directory>
...
Replica exchange simülasyonlarının eşitlenme aşamasının süre ölçümü yapılmıştır; bu süreç, 12 * 100 ps simülasyonlarını içerir. Bu simülasyonlar L40S veya H100 GPU üzerinde gerçekleştirilmiştir. Üç MPS süreci kullanıldığında %36 daha yüksek throughput gözlemlenmiştir.

MPS ile Başlayın
MPS, çok fazla kodlama çabası gerektirmeden MD simülasyonlarının throughput’unu artıran kullanıcı dostu bir araçtır. Bu yazıda, çeşitli benchmarking sistemlerinde farklı GPU’lar üzerindeki throughput artışını inceledik. Ayrıca, CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
kullanarak throughput’u daha da artırmayı gözlemledik. MPS’yi OpenFE serbest enerji simülasyonlarına uygulayarak throughput artışını belirledik.
MPS hakkında daha fazla bilgi almak için NVIDIA GTC oturumunda, GPU Kullanımını Optimize Etme: MIG ve MPS’yi Anlamak başlıklı oturumunu izleyebilirsiniz. MPS uygulamanız hakkında sorularınızı NVIDIA Geliştirici CUDA forumu‘nda paylaşabilirsiniz.
OpenMM moleküler dinamik simülasyon kodu ile başlayabilmek için, OpenMM eğitimlerine göz atın.