HPC için İleti Geçirme Arabirimi'ni ayarlama

Dikkat

Bu makalede, Kullanım Süresi Sonu (EOL) durumuna yakın bir Linux dağıtımı olan CentOS'a başvuruda bulunur. Lütfen kullanımınızı göz önünde bulundurun ve uygun şekilde planlayın. Daha fazla bilgi için bkz . CentOS Kullanım Süresi Sonu kılavuzu.

Şunlar için geçerlidir: ✔️ Linux VM'leri ✔️ Windows VM'leri ✔️ Esnek ölçek kümeleri ✔️ Tekdüzen ölçek kümeleri

İleti Geçirme Arabirimi (MPI), dağıtılmış bellek paralelleştirmesi için açık bir kitaplık ve olgu kaldırma standardıdır. Yaygın olarak birçok HPC iş yükünde kullanılır. RDMA özellikliHB serisi ve N serisi VM'lerdeki HPC iş yükleri, düşük gecikme süresi ve yüksek bant genişliğine sahip InfiniBand ağı üzerinden iletişim kurmak için MPI kullanabilir.

  • Azure'da SR-IOV özellikli VM boyutları, Mellanox OFED ile neredeyse tüm MPI türlerinin kullanılmasına olanak sağlar.
  • SR-IOV özellikli olmayan VM'lerde, desteklenen MPI uygulamaları VM'ler arasında iletişim kurmak için Microsoft Ağ Doğrudan (ND) arabirimini kullanır. Bu nedenle yalnızca Microsoft MPI (MS-MPI) 2012 R2 veya üstü ve Intel MPI 5.x sürümleri desteklenir. Intel MPI çalışma zamanı kitaplığının sonraki sürümleri (2017, 2018) Azure RDMA sürücüleriyle uyumlu olabilir veya olmayabilir.

SR-IOV özellikli RDMA özellikli VM'ler için Ubuntu-HPC VM görüntüleri ve AlmaLinux-HPC VM görüntüleri uygundur. Bu VM görüntüleri, RDMA ve yaygın olarak kullanılan çeşitli MPI kitaplıkları ve bilimsel bilgi işlem paketleri için OFED sürücüleriyle iyileştirilmiş ve önceden yüklenmiş olarak gelir ve kullanmaya başlamanın en kolay yoludur.

Buradaki örnekler RHEL/CentOS için olsa da adımlar geneldir ve Ubuntu (18.04, 20.04, 22.04) ve SLES (12 SP4 ve 15 SP4) gibi uyumlu herhangi bir Linux işletim sistemi için kullanılabilir. Diğer dağıtımlarda diğer MPI uygulamalarını ayarlamaya yönelik diğer örnekler azhpc-images deposundadır.

Not

SR-IOV özellikli VM'lerde belirli MPI kitaplıklarıyla (Platform MPI gibi) MPI işlerini çalıştırmak, yalıtım ve güvenlik için bir kiracı genelinde bölüm anahtarlarının (p anahtarları) ayarlanmasını gerektirebilir. p-key değerlerini belirleme ve bu MPI kitaplığıyla bir MPI işi için doğru şekilde ayarlama hakkında ayrıntılı bilgi için Bölüm anahtarlarını bulma bölümündeki adımları izleyin.

Not

Aşağıdaki kod parçacıkları örnek olarak verilmiştir. Paketlerin en son kararlı sürümlerini kullanmanızı veya azhpc-images deposuna başvurmanızı öneririz.

MPI kitaplığı seçme

Bir HPC uygulaması belirli bir MPI kitaplığı önerirse, önce bu sürümü deneyin. Seçebileceğiniz MPI ile ilgili esnekliğiniz varsa ve en iyi performansı istiyorsanız HPC-X'i deneyin. Genel olarak HPC-X MPI, InfiniBand arabirimi için UCX çerçevesini kullanarak en iyi performansı gösterir ve tüm Mellanox InfiniBand donanım ve yazılım özelliklerinden yararlanır. Buna ek olarak, HPC-X ve OpenMPI ABI uyumlu olduğundan, OpenMPI ile oluşturulmuş HPC-X ile bir HPC uygulamasını dinamik olarak çalıştırabilirsiniz. Benzer şekilde, Intel MPI, MVAPICH ve MPICH ABI ile uyumludur.

Aşağıdaki şekilde popüler MPI kitaplıklarının mimarisi gösterilmektedir.

Popüler MPI kitaplıkları için mimari

HPC-X

HPC-X yazılım araç seti UCX ve HCOLL içerir ve UCX'e karşı oluşturulabilir.

HPCX_VERSION="v2.6.0"
HPCX_DOWNLOAD_URL=https://azhpcstor.blob.core.windows.net/azhpc-images-store/hpcx-v2.6.0-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64.tbz
wget --retry-connrefused --tries=3 --waitretry=5 $HPCX_DOWNLOAD_URL
tar -xvf hpcx-${HPCX_VERSION}-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64.tbz
mv hpcx-${HPCX_VERSION}-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64 ${INSTALL_PREFIX}
HPCX_PATH=${INSTALL_PREFIX}/hpcx-${HPCX_VERSION}-gcc-MLNX_OFED_LINUX-5.0-1.0.0.0-redhat7.7-x86_64

Aşağıdaki komut, HPC-X ve OpenMPI için önerilen bazı mpirun bağımsız değişkenlerini gösterir.

mpirun -n $NPROCS --hostfile $HOSTFILE --map-by ppr:$NUMBER_PROCESSES_PER_NUMA:numa:pe=$NUMBER_THREADS_PER_PROCESS -report-bindings $MPI_EXECUTABLE

konumu:

Parametre Açıklama
NPROCS MPI işlemlerinin sayısını belirtir. Örneğin: -n 16.
$HOSTFILE MPI işlemlerinin çalıştığı konumu belirtmek için konak adını veya IP adresini içeren bir dosya belirtir. Örneğin: --hostfile hosts.
$NUMBER_PROCESSES_PER_NUMA Her NUMA etki alanında çalışan MPI işlemlerinin sayısını belirtir. Örneğin, NUMA başına dört MPI işlemi belirtmek için kullanırsınız --map-by ppr:4:numa:pe=1.
$NUMBER_THREADS_PER_PROCESS MPI işlemi başına iş parçacığı sayısını belirtir. Örneğin, NUMA başına bir MPI işlemi ve dört iş parçacığı belirtmek için kullanırsınız --map-by ppr:1:numa:pe=4.
-report-bindings Çekirdeklerle eşlenen MPI işlemlerini yazdırır. Bu, MPI işlem sabitlemenizin doğru olduğunu doğrulamak için kullanışlıdır.
$MPI_EXECUTABLE MPI kitaplıklarında yerleşik MPI yürütülebilir bağlantısını belirtir. MPI derleyici sarmalayıcıları bunu otomatik olarak yapar. Örneğin: mpicc veya mpif90.

OSU gecikme süresi mikrobenchmark'ını çalıştırma örneği aşağıdaki gibidir:

${HPCX_PATH}mpirun -np 2 --map-by ppr:2:node -x UCX_TLS=rc ${HPCX_PATH}/ompi/tests/osu-micro-benchmarks-5.3.2/osu_latency

MPI kollektiflerini iyileştirme

MPI Kolektif iletişim ilkelleri, grup iletişimi işlemlerini uygulamak için esnek, taşınabilir bir yol sunar. Bunlar çeşitli bilimsel paralel uygulamalarda yaygın olarak kullanılır ve genel uygulama performansı üzerinde önemli bir etkiye sahiptir. Toplu iletişim için HPC-X ve HCOLL kitaplığını kullanarak toplu iletişim performansını iyileştirmeye yönelik yapılandırma parametreleriyle ilgili ayrıntılar için TechCommunity makalesine bakın.

Örneğin, sıkı bir şekilde bağlanmış MPI uygulamanızın aşırı miktarda kolektif iletişim gerçekleştirdiğini düşünüyorsanız hiyerarşik kolektifleri (HCOLL) etkinleştirmeyi deneyebilirsiniz. Bu özellikleri etkinleştirmek için aşağıdaki parametreleri kullanın.

-mca coll_hcoll_enable 1 -x HCOLL_MAIN_IB=<MLX device>:<Port>

Not

HPC-X 2.7.4+ ile, MOFED'deki UCX sürümü ile HPC-X'teki UCX sürümü farklıysa LD_LIBRARY_PATH açıkça geçirmek gerekebilir.

OpenMPI

Yukarıda açıklandığı gibi UCX'i yükleyin. HCOLL, HPC-X yazılım araç setinin bir parçasıdır ve özel yükleme gerektirmez.

OpenMPI, depoda bulunan paketlerden yüklenebilir.

sudo yum install –y openmpi

UCX ile OpenMPI'nin en son ve kararlı sürümünü oluşturmanızı öneririz.

OMPI_VERSION="4.0.3"
OMPI_DOWNLOAD_URL=https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-${OMPI_VERSION}.tar.gz
wget --retry-connrefused --tries=3 --waitretry=5 $OMPI_DOWNLOAD_URL
tar -xvf openmpi-${OMPI_VERSION}.tar.gz
cd openmpi-${OMPI_VERSION}
./configure --prefix=${INSTALL_PREFIX}/openmpi-${OMPI_VERSION} --with-ucx=${UCX_PATH} --with-hcoll=${HCOLL_PATH} --enable-mpirun-prefix-by-default --with-platform=contrib/platform/mellanox/optimized && make -j$(nproc) && make install

En iyi performans için ve hcollile ucx OpenMPI'yi çalıştırın. Ayrıca BKZ. HPC-X ile ilgili örnek.

${INSTALL_PREFIX}/bin/mpirun -np 2 --map-by node --hostfile ~/hostfile -mca pml ucx --mca btl ^vader,tcp,openib -x UCX_NET_DEVICES=mlx5_0:1  -x UCX_IB_PKEY=0x0003  ./osu_latency

Yukarıda belirtildiği gibi bölüm anahtarınızı denetleyin.

Intel MPI

Intel MPI sürümünü seçtiğiniz sürümü indirin. Intel MPI 2019 sürümü, Open Fabrics Alliance (OFA) çerçevesinden Open Fabrics Arabirimleri (OFI) çerçevesine geçti ve şu anda libfabric'i destekliyor. InfiniBand desteği için iki sağlayıcı vardır: mlx ve fiiller. sürüme bağlı olarak I_MPI_FABRICS ortam değişkenini değiştirin.

  • Intel MPI 2019 ve 2021: kullanınI_MPI_FABRICS=shm:ofi. I_MPI_OFI_PROVIDER=mlx Sağlayıcı mlx UCX kullanır. Fiillerin kullanımının kararsız ve daha az performanslı olduğu bulunmuştur. Daha fazla ayrıntı için TechCommunity makalesine bakın.
  • Intel MPI 2018: use I_MPI_FABRICS=shm:ofa
  • Intel MPI 2016: use I_MPI_DAPL_PROVIDER=ofa-v2-ib0

Intel MPI 2019 güncelleştirme 5+ için önerilen bazı mpirun bağımsız değişkenleri aşağıdadır.

export FI_PROVIDER=mlx
export I_MPI_DEBUG=5
export I_MPI_PIN_DOMAIN=numa

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

konumu:

Parametre Açıklama
FI_PROVIDER Kullanılacak libfabric sağlayıcısını belirtir; bu, kullanılacak API'yi, protokolü ve ağı etkiler. fiiller başka bir seçenektir, ancak genellikle mlx size daha iyi performans sağlar.
I_MPI_DEBUG İşlemlerin nereye sabitlendiği ve hangi protokol ve ağın kullanıldığı hakkında ayrıntılı bilgi sağlayabilecek ek hata ayıklama çıktısı düzeyini belirtir.
I_MPI_PIN_DOMAIN İşlemlerinizi nasıl sabitlemek istediğinizi belirtir. Örneğin, çekirdeklere, yuvalara veya NUMA etki alanlarına sabitleyebilirsiniz. Bu örnekte, bu ortam değişkenini numa olarak ayarlarsınız; bu da işlemlerin NUMA düğüm etki alanlarına sabitlendiği anlamına gelir.

MPI kollektiflerini iyileştirme

Özellikle kolektif işlemler önemli miktarda zaman alıyorsa deneyebileceğiniz başka seçenekler de vardır. Intel MPI 2019 güncelleştirme 5+, mlx sağlamayı destekler ve InfiniBand ile iletişim kurmak için UCX çerçevesini kullanır. Ayrıca HCOLL'i de destekler.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

SR-IOV olmayan VM'ler

SR-IOV olmayan VM'ler için 5.x çalışma zamanı ücretsiz değerlendirme sürümünü indirme örneği aşağıdaki gibidir:

wget http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9278/l_mpi_p_5.1.3.223.tgz

Yükleme adımları için bkz . Intel MPI Kitaplığı Yükleme Kılavuzu. İsteğe bağlı olarak, kök olmayan hata ayıklayıcı olmayan işlemler (Intel MPI'nin en son sürümleri için gereklidir) için ptrace'i etkinleştirmek isteyebilirsiniz.

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

SUSE Linux

SUSE Linux Enterprise Server VM görüntü sürümleri için - HPC için SLES 12 SP3, HPC için SLES 12 SP3 (Premium), HPC için SLES 12 SP1, HPC için SLES 12 SP1 (Premium), SLES 12 SP4 ve SLES 15 için RDMA sürücüleri yüklenir ve Intel MPI paketleri VM'ye dağıtılır. Aşağıdaki komutu çalıştırarak Intel MPI'yi yükleyin:

sudo rpm -v -i --nodeps /opt/intelMPI/intel_mpi_packages/*.rpm

MVAPICH

Aşağıda, MVAPICH2 oluşturma örneği verilmiştir. Aşağıda kullanılandan daha yeni sürümlerin kullanılabilebileceğini unutmayın.

wget http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.3.tar.gz
tar -xv mvapich2-2.3.tar.gz
cd mvapich2-2.3
./configure --prefix=${INSTALL_PREFIX}
make -j 8 && make install

OSU gecikme süresi mikrobenchmark'ını çalıştırma örneği aşağıdaki gibidir:

${INSTALL_PREFIX}/bin/mpirun_rsh -np 2 -hostfile ~/hostfile MV2_CPU_MAPPING=48 ./osu_latency

Aşağıdaki listede önerilen mpirun birkaç bağımsız değişken bulunur.

export MV2_CPU_BINDING_POLICY=scatter
export MV2_CPU_BINDING_LEVEL=numanode
export MV2_SHOW_CPU_BINDING=1
export MV2_SHOW_HCA_BINDING=1

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

konumu:

Parametre Açıklama
MV2_CPU_BINDING_POLICY Hangi bağlama ilkesinin kullanılacağını belirtir. Bu ilke, işlemlerin çekirdek kimliklere nasıl sabitlendiğini etkiler. Bu durumda, öğesini belirtirsiniz scatter, bu nedenle işlemler NUMA etki alanları arasında eşit bir şekilde dağılır.
MV2_CPU_BINDING_LEVEL İşlemlerin nereye sabitlenmiş olduğunu belirtir. Bu durumda, işlemlerin NUMA etki alanı birimlerine sabitlendiği anlamına gelen numanode olarak ayarlarsınız.
MV2_SHOW_CPU_BINDING İşlemlerin sabitlendiği yerle ilgili hata ayıklama bilgilerini almak isteyip istemediğinizi belirtir.
MV2_SHOW_HCA_BINDING Her işlemin hangi konak kanalı bağdaştırıcısını kullandığı hakkında hata ayıklama bilgileri almak isteyip istemediğinizi belirtir.

Platform MPI'sı

Platform MPI Community Edition için gerekli paketleri yükleyin.

sudo yum install libstdc++.i686
sudo yum install glibc.i686
Download platform MPI at https://www.ibm.com/developerworks/downloads/im/mpi/index.html 
sudo ./platform_mpi-09.01.04.03r-ce.bin

Yükleme işlemini izleyin.

Aşağıdaki komutlar CentOS-HPC 7.6, 7.8 ve 8.1 VM görüntülerini kullanarak HBv3 VM'lerinde Platform MPI kullanarak MPI pingpong ve allreduce çalıştırma örnekleridir.

/opt/ibm/platform_mpi/bin/mpirun -hostlist 10.0.0.8:1,10.0.0.9:1 -np 2 -e MPI_IB_PKEY=0x800a  -ibv  /home/jijos/mpi-benchmarks/IMB-MPI1 pingpong
/opt/ibm/platform_mpi/bin/mpirun -hostlist 10.0.0.8:120,10.0.0.9:120 -np 240 -e MPI_IB_PKEY=0x800a  -ibv  /home/jijos/mpi-benchmarks/IMB-MPI1 allreduce -npmin 240

MPICH

Yukarıda açıklandığı gibi UCX'i yükleyin. MPICH oluşturun.

wget https://www.mpich.org/static/downloads/3.3/mpich-3.3.tar.gz
tar -xvf mpich-3.3.tar.gz
cd mpich-3.3
./configure --with-ucx=${UCX_PATH} --prefix=${INSTALL_PREFIX} --with-device=ch4:ucx
make -j 8 && make install

MPICH çalıştırılıyor.

${INSTALL_PREFIX}/bin/mpiexec -n 2 -hostfile ~/hostfile -env UCX_IB_PKEY=0x0003 -bind-to hwthread ./osu_latency

Yukarıda belirtildiği gibi bölüm anahtarınızı denetleyin.

OSU MPI Karşılaştırmaları

OSU MPI Benchmarks ve untar'ı indirin.

wget http://mvapich.cse.ohio-state.edu/download/mvapich/osu-micro-benchmarks-5.5.tar.gz
tar –xvf osu-micro-benchmarks-5.5.tar.gz
cd osu-micro-benchmarks-5.5

Belirli bir MPI kitaplığını kullanarak Karşılaştırmalar oluşturun:

CC=<mpi-install-path/bin/mpicc>CXX=<mpi-install-path/bin/mpicxx> ./configure 
make

MPI Karşılaştırmaları klasörün altındadır mpi/ .

Bölüm anahtarlarını bulma

Aynı kiracıdaki diğer VM'lerle (Kullanılabilirlik Kümesi veya Sanal Makine Ölçek Kümesi) iletişim kurmak için bölüm anahtarlarını (p anahtarları) keşfedin.

/sys/class/infiniband/mlx5_0/ports/1/pkeys/0
/sys/class/infiniband/mlx5_0/ports/1/pkeys/1

İkisinin büyük kısmı MPI ile kullanılması gereken kiracı anahtarıdır. Örnek: Aşağıdakiler p anahtarlarıysa, MPI ile 0x800b kullanılmalıdır.

cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/0
0x800b
cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/1
0x7fff

Not arabirimleri, HPC VM görüntülerinin içinde olarak mlx5_ib* adlandırılır.

Ayrıca kiracı (Kullanılabilirlik Kümesi veya Sanal Makine Ölçek Kümesi) mevcut olduğu sürece PKEY'lerin aynı kaldığına da dikkat edin. Düğümler eklendiğinde/silindiğinde bile bu durum geçerlidir. Yeni kiracılar farklı PKEY'ler alır.

MPI için kullanıcı sınırlarını ayarlama

MPI için kullanıcı sınırları ayarlayın.

cat << EOF | sudo tee -a /etc/security/limits.conf
*               hard    memlock         unlimited
*               soft    memlock         unlimited
*               hard    nofile          65535
*               soft    nofile          65535
EOF

MPI için SSH anahtarlarını ayarlama

Bunu gerektiren MPI türleri için SSH anahtarlarını ayarlayın.

ssh-keygen -f /home/$USER/.ssh/id_rsa -t rsa -N ''
cat << EOF > /home/$USER/.ssh/config
Host *
    StrictHostKeyChecking no
EOF
cat /home/$USER/.ssh/id_rsa.pub >> /home/$USER/.ssh/authorized_keys
chmod 600 /home/$USER/.ssh/authorized_keys
chmod 644 /home/$USER/.ssh/config

Yukarıdaki söz diziminde paylaşılan bir giriş dizini olduğu varsayılır; aksi halde .ssh dizinin her düğüme kopyalanması gerekir.

Sonraki adımlar