Выполнение заданий STAR-CCM+ в кластере Linux RDMA в Azure с помощью пакета Microsoft HPC
Важно!
1 марта 2023 г. мы прекратим поддержку классических виртуальных машин.
Если вы используете ресурсы IaaS из ASM, выполните миграцию до 1 марта 2023 г. Рекомендуем осуществить этот переход как можно раньше, чтобы воспользоваться различными улучшенными функциями в Azure Resource Manager.
Дополнительные сведения см. в статье Перенесите свои ресурсы IaaS в Azure Resource Manager до 1 марта 2023 г.
В этой статье показано, как развернуть кластер пакета Microsoft HPC в Azure и запустить задание STAR-CCM+ CD-adapco на нескольких вычислительных узлах Linux, соединенных с помощью InfiniBand.
Примечание
В Azure предлагаются две модели развертывания для создания ресурсов и работы с ними: модель развертывания с помощью Resource Manager и классическая модель. В этой статье описывается использование обеих моделей, но для большинства новых развертываний корпорация Майкрософт рекомендует использовать модель диспетчера ресурсов.
Пакет Microsoft HPC предоставляет функции, необходимые для работы приложений высокопроизводительных и параллельных вычислений, включая приложения MPI, в кластерах виртуальных машин Microsoft Azure. Пакет HPC также поддерживает приложения высокопроизводительных вычислений для Linux на виртуальных вычислительных узлах Linux, развернутых в кластере HPC. Общие сведения об использовании вычислительных узлов Linux и пакета HPC см. в статье Начало работы с вычислительными узлами Linux в кластере пакета HPC в Azure.
Настройка кластера пакета HPC
Скачайте сценарии развертывания IaaS из пакета HPC из Центра загрузки и извлеките их в локальное расположение.
В системе должен быть установлен компонент Azure PowerShell. Если Azure PowerShell не настроен на локальном компьютере, то см. статью Установка и настройка Azure PowerShell.
На момент написания этой статьи образы Linux из Azure Marketplace (включая драйверы InfiniBand для Azure) предназначены для SLES 12, CentOS 6.5 и CentOS 7.1. В этой статье используется SLES 12. Чтобы получить имена всех образов Linux, поддерживающих HPC в Marketplace, можно выполнить следующую команду PowerShell:
get-azurevmimage | ?{$_.ImageName.Contains("hpc") -and $_.OS -eq "Linux" }
На экран будут выведены расположение этих образов и имя образа (ImageName), который будет использоваться в шаблоне развертывания позже.
Перед развертыванием кластера необходимо создать файл шаблона развертывания пакета HPC. Поскольку мы намереваемся создать небольшой кластер, головной узел будет контроллером домена и на нем будет размещаться локальная база данных SQL.
Этот головной узел можно развернуть с помощью следующего шаблона. Создайте XML-файл с именем MyCluster.xml и задайте для параметров SubscriptionId, StorageAccount, Location, VMName и ServiceName собственные значения.
<?xml version="1.0" encoding="utf-8" ?>
<IaaSClusterConfig>
<Subscription>
<SubscriptionId>99999999-9999-9999-9999-999999999999</SubscriptionId>
<StorageAccount>mystorageaccount</StorageAccount>
</Subscription>
<Location>North Europe</Location>
<VNet>
<VNetName>hpcvnetne</VNetName>
<SubnetName>subnet-hpc</SubnetName>
</VNet>
<Domain>
<DCOption>HeadNodeAsDC</DCOption>
<DomainFQDN>hpc.local</DomainFQDN>
</Domain>
<Database>
<DBOption>LocalDB</DBOption>
</Database>
<HeadNode>
<VMName>myhpchn</VMName>
<ServiceName>myhpchn</ServiceName>
<VMSize>Standard_D4</VMSize>
</HeadNode>
<LinuxComputeNodes>
<VMNamePattern>lnxcn-%0001%</VMNamePattern>
<ServiceNamePattern>mylnxcn%01%</ServiceNamePattern>
<MaxNodeCountPerService>20</MaxNodeCountPerService>
<StorageAccountNamePattern>mylnxstorage%01%</StorageAccountNamePattern>
<VMSize>A9</VMSize>
<NodeCount>0</NodeCount>
<ImageName>b4590d9e3ed742e4a1d46e5424aa335e__suse-sles-12-hpc-v20150708</ImageName>
</LinuxComputeNodes>
</IaaSClusterConfig>
Создайте головной узел, выполнив команду PowerShell в командной строке с повышенными привилегиями:
.\New-HPCIaaSCluster.ps1 -ConfigFile MyCluster.xml
Создание головного узла обычно занимает 20–30 минут. Вы можете подключиться к нему на портале Azure, щелкнув значок подключения виртуальной машины.
Со временем может потребоваться исправить DNS-сервер пересылки. Для этого необходимо запустить диспетчер DNS.
- Щелкните правой кнопкой мыши имя сервера в диспетчере DNS, выберите пункт Свойства и перейдите на вкладку Серверы пересылки.
- Нажмите кнопку Изменить, чтобы удалить серверы пересылки, а затем нажмите кнопку ОК.
- Убедитесь, что установлен флажок Использовать корневые ссылки, если нет доступных серверов пересылки, и нажмите кнопку ОК.
Настройка вычислительных узлов Linux
Развертывание вычислительных узлов Linux выполняется с помощью того же шаблона развертывания, который использовался для создания головного узла.
Скопируйте файл MyCluster.xml с локального компьютера на головной узел и обновите тег NodeCount с количеством узлов, которые требуется развернуть (<=20). Убедитесь, что в квотах Azure достаточно доступных ядер, так как для каждого экземпляра A9 в подписке используется 16 ядер. Если вы хотите увеличить число виртуальных машин в рамках того же бюджета, вместо A9 можно использовать экземпляры A8 (8 ядер).
В головном узле скопируйте сценарии развертывания IaaS из пакета HPC.
В командной строке с повышенными привилегиями выполните следующие команды Azure PowerShell:
Выполните командлет Add-AzureAccount , чтобы подключиться к подписке Azure.
При наличии нескольких подписок выполните командлет Get-AzureSubscription , чтобы получить их список.
Установите подписку по умолчанию, выполнив команду Select-AzureSubscription -SubscriptionName xxxx -Default .
Выполните команду .\New-HPCIaaSCluster.ps1 -ConfigFile MyCluster.xml, чтобы запустить развертывание вычислительных узлов Linux.
Откройте диспетчер кластера пакета HPC. Через несколько минут вычислительные узлы Linux станут периодически появляться в списке вычислительных узлов кластера. В режиме классического развертывания виртуальные машины IaaS создаются последовательно. Поэтому, если важно количество узлов, развертывание всех машин может занять значительное время.
Теперь, когда все узлы работают в кластере, нужно настроить дополнительные параметры инфраструктуры.
Настройка общей папки Azure для узлов Windows и Linux
Службу файлов Azure можно использовать для хранения сценариев, пакетов приложений и файлов данных. Служба файлов Azure предоставляет возможности CIFS на базе хранилища BLOB-объектов Azure как постоянного хранилища. Это не самое масштабируемое решение, но оно самое простое и не требует выделенных виртуальных машин.
Создайте общую папку Azure, следуя инструкциям в статье Приступая к работе с хранилищем файлов Azure в Windows.
Оставьте saname в качестве имени учетной записи хранения, sharename — в качестве имени общей папки и sakey — в качестве ключа учетной записи хранения.
Подключение общей папки Azure в головном узле
Откройте командную строку с повышенными привилегиями и выполните команду, указанную ниже, чтобы сохранить учетные данные в локальном хранилище компьютера.
cmdkey /add:<saname>.file.core.windows.net /user:<saname> /pass:<sakey>
Затем, чтобы подключить общую папку Azure, выполните следующую команду:
net use Z: \\<saname>.file.core.windows.net\<sharename> /persistent:yes
Подключение общей папки Azure в вычислительных узлах Linux
В пакете HPC содержится один полезный инструмент — средство clusrun. Это средство командной строки позволяет выполнить одну и ту же команду одновременно на нескольких вычислительных узлах. В нашем случае оно используется для подключения общей папки Azure и ее сохранения после перезагрузки. Выполните следующие команды в головном узле в командной строке с повышенными привилегиями.
Чтобы создать каталог подключения:
clusrun /nodegroup:LinuxNodes mkdir -p /hpcdata
Чтобы подключить общую папку Azure:
clusrun /nodegroup:LinuxNodes mount -t cifs //<saname>.file.core.windows.net/<sharename> /hpcdata -o vers=2.1,username=<saname>,password='<sakey>',dir_mode=0777,file_mode=0777
Чтобы сохранить общую папку подключения:
clusrun /nodegroup:LinuxNodes "echo //<saname>.file.core.windows.net/<sharename> /hpcdata cifs vers=2.1,username=<saname>,password='<sakey>',dir_mode=0777,file_mode=0777 >> /etc/fstab"
Установка STAR-CCM+
Экземпляры виртуальной машины Azure A8 и A9 обеспечивают поддержку InfiniBand и возможности RDMA. Драйверы ядра, обеспечивающие эти возможности, доступны для образов Windows Server 2012 R2, SUSE 12, CentOS 6.5 и CentOS 7.1 в Azure Marketplace. Microsoft MPI и Intel MPI (выпуск 5.x) — это две библиотеки MPI, которые поддерживают эти драйверы в среде Azure.
В состав пакета STAR-CCM+ CD-adapco (11.x и более поздней версии) входит библиотека Intel MPI версии 5.x, что обеспечивает поддержку InfiniBand для Azure.
Скачайте пакет Linux64 STAR-CCM+ с портала CD-adapco. В нашем случае мы использовали версию 11.02.010 в режиме смешанной точности.
На головном узле в общей папке Azure /hpcdata создайте сценарий оболочки setupstarccm.sh со следующим содержимым. Этот сценарий будет выполняться на каждом вычислительном узле для локальной настройки STAR-CCM+.
Пример сценария setupstarcm.sh
#!/bin/bash
# setupstarcm.sh to set up STAR-CCM+ locally
# Create the CD-adapco main directory
mkdir -p /opt/CD-adapco
# Copy the STAR-CCM package from the file share to the local directory
cp /hpcdata/StarCCM/STAR-CCM+11.02.010_01_linux-x86_64.tar.gz /opt/CD-adapco/
# Extract the package
tar -xzf /opt/CD-adapco/STAR-CCM+11.02.010_01_linux-x86_64.tar.gz -C /opt/CD-adapco/
# Start a silent installation of STAR-CCM without the FLEXlm component
/opt/CD-adapco/starccm+_11.02.010/STAR-CCM+11.02.010_01_linux-x86_64-2.5_gnu4.8.bin -i silent -DCOMPUTE_NODE=true -DNODOC=true -DINSTALLFLEX=false
# Update memory limits
echo "* hard memlock unlimited" >> /etc/security/limits.conf
echo "* soft memlock unlimited" >> /etc/security/limits.conf
Чтобы настроить STAR-CCM+ на всех вычислительных узлах Linux, откройте командную строку с повышенными привилегиями и выполните следующую команду:
clusrun /nodegroup:LinuxNodes bash /hpcdata/setupstarccm.sh
Во время выполнения команды можно отслеживать загрузку ЦП на тепловой карте диспетчера кластеров. Через несколько минут все узлы будут настроены должным образом.
Запуск заданий STAR-CCM+
Пакет HPC используется в качестве планировщика заданий для выполнения заданий STAR-CCM+. Для этого требуется обеспечить поддержку нескольких сценариев, которые используются для запуска задания и выполнения STAR-CCM+. Для упрощения входные данные хранятся в общей папке Azure.
Следующий сценарий PowerShell применяется для помещения задания STAR-CCM+ в очередь. Он принимает три аргумента:
- имя модели;
- количество используемых узлов;
- число используемых ядер на каждом узле.
Так как STAR-CCM+ может использовать всю пропускную способность памяти, как правило, лучше использовать меньше ядер на один вычислительный узел и добавлять новые узлы. Точное число ядер на каждый узел будет зависеть от семейства процессора и скорости взаимодействия.
Узлы выделяются исключительно для конкретного задания, и их не могут совместно использовать другие задания. Задание не запускается как задание MPI напрямую. Сценарий оболочки runstarccm.sh запустит средство запуска MPI.
Модель ввода и сценарий runstarccm.sh хранятся в общей папке /hpcdata, подключенной ранее.
Файлам журнала присваиваются имена с использованием идентификаторов заданий. Файлы журнала и выходные файлы STAR-CCM+ хранятся в общей папке /hpcdata.
Пример сценария SubmitStarccmJob.ps1
Add-PSSnapin Microsoft.HPC -ErrorAction silentlycontinue
$scheduler="headnodename"
$modelName=$args[0]
$nbCoresPerNode=$args[2]
$nbNodes=$args[1]
#---------------------------------------------------------------------------------------------------------
# Create a new job; this will give us the job ID that's used to identify the name of the uploaded package in Azure
#
$job = New-HpcJob -Name "$modelName $nbNodes $nbCoresPerNode" -Scheduler $scheduler -NumNodes $nbNodes -NodeGroups "LinuxNodes" -FailOnTaskFailure $true -Exclusive $true
$jobId = [String]$job.Id
#---------------------------------------------------------------------------------------------------------
# Submit the job
$workdir = "/hpcdata"
$execName = "$nbCoresPerNode runner.java $modelName.sim"
$job | Add-HpcTask -Scheduler $scheduler -Name "Compute" -stdout "$jobId.log" -stderr "$jobId.err" -Rerunnable $false -NumNodes $nbNodes -Command "runstarccm.sh $execName" -WorkDir "$workdir"
Submit-HpcJob -Job $job -Scheduler $scheduler
Замените runner.java предпочтительным средством запуска моделей Java и кодом ведения журнала STAR-CCM+.
Пример сценария runstarccm.sh
#!/bin/bash
echo "start"
# The path of this script
SCRIPT_PATH="$( dirname "${BASH_SOURCE[0]}" )"
echo ${SCRIPT_PATH}
# Set the mpirun runtime environment
export CDLMD_LICENSE_FILE=1999@flex.cd-adapco.com
# mpirun command
STARCCM=/opt/CD-adapco/STAR-CCM+11.02.010/star/bin/starccm+
# Get node information from ENVs
NODESCORES=(${CCP_NODES_CORES})
COUNT=${#NODESCORES[@]}
NBCORESPERNODE=$1
# Create the hostfile file
NODELIST_PATH=${SCRIPT_PATH}/hostfile_$$
echo ${NODELIST_PATH}
# Get every node name and write into the hostfile file
I=1
NBNODES=0
while [ ${I} -lt ${COUNT} ]
do
echo "${NODESCORES[${I}]}" >> ${NODELIST_PATH}
let "I=${I}+2"
let "NBNODES=${NBNODES}+1"
done
let "NBCORES=${NBNODES}*${NBCORESPERNODE}"
# Run STAR-CCM with the hostfile argument
#
${STARCCM} -np ${NBCORES} -machinefile ${NODELIST_PATH} \
-power -podkey "<yourkey>" -rsh ssh \
-mpi intel -fabric UDAPL -cpubind bandwidth,v \
-mppflags "-ppn $NBCORESPERNODE -genv I_MPI_DAPL_PROVIDER=ofa-v2-ib0 -genv I_MPI_DAPL_UD=0 -genv I_MPI_DYNAMIC_CONNECTION=0" \
-batch $2 $3
RTNSTS=$?
rm -f ${NODELIST_PATH}
exit ${RTNSTS}
В рамках теста мы использовали маркер лицензии увеличения мощности по требованию. Для этого маркера переменной среды $CDLMD_LICENSE_FILE необходимо присвоить значение 1999@flex.cd-adapco.com. Кроме того, нужно задать ключ в параметре командной строки -podkey.
После инициализации сценарий извлечет из переменных среды $CCP_NODES_CORES, заданных в пакете HPC, список узлов для создания файла узла, используемого средством запуска MPI. Этот файл узла будет содержать список имен вычислительных узлов, используемых для задания (по одному имени в строке).
Формат $CCP_NODES_CORES соответствует следующему шаблону:
<Number of nodes> <Name of node1> <Cores of node1> <Name of node2> <Cores of node2>...`
Где:
-
<Number of nodes>
— количество узлов, выделенных для этого задания. -
<Name of node_n_...>
— имя каждого узла, выделенного для этого задания. -
<Cores of node_n_...>
— количество ядер узла, выделенного для этого задания.
Число ядер ($NBCORES) рассчитывается на основе числа узлов ($NBNODES) и числа ядер на узел, заданного в параметре $NBCORESPERNODE.
Для Intel MPI в среде Azure используются следующие параметры MPI:
-
-mpi intel
для указания Intel MPI; -
-fabric UDAPL
для использования команд Azure InfiniBand; -
-cpubind bandwidth,v
для оптимизации пропускной способности для MPI со STAR-CCM+; -
-mppflags "-ppn $NBCORESPERNODE -genv I_MPI_DAPL_PROVIDER=ofa-v2-ib0 -genv I_MPI_DAPL_UD=0 -genv I_MPI_DYNAMIC_CONNECTION=0"
для настройки работы Intel MPI с Azure InfiniBand и задания необходимого числа ядер на узел; -
-batch
для запуска STAR-CCM+ в пакетном режиме без пользовательского интерфейса.
Наконец, чтобы запустить задание, убедитесь, что узлы работают и подключены в диспетчере кластера. В командной строке PowerShell выполните следующую команду:
.\ SubmitStarccmJob.ps1 <model> <nbNodes> <nbCoresPerNode>
Остановка узлов
Чтобы останавливать и запускать узлы после завершения тестов, можно выполнить следующие команды PowerShell пакета HPC:
Stop-HPCIaaSNode.ps1 -Name <prefix>-00*
Start-HPCIaaSNode.ps1 -Name <prefix>-00*
Дальнейшие действия
Попробуйте запустить другие рабочие нагрузки Linux. Например, ознакомьтесь со следующими статьями: