ScaleMP

Z MetaCentrum
Přejít na: navigace, hledání

ScaleMP je SW vrstva (hypervizor), která spojuje několik běžných x86 serverů do jednoho SMP stroje. Smyslem takové agregace je zpřístupnit na jednom virtuálním stroji agregované zdroje (CPU, RAM) z mnoha serverů. Je to v podstatě opak klasické virtualizace, kdy na jednom serveru provozujeme několik virtuálních strojů. Firma ScaleMP označuje takovou architekturu jako versatile SMP či vSMP a její implementaci jako vSMP Foundation, lidově též ScaleMP.

V Metacentru je od roku 2015 zapojený stroj alfrid.meta.zcu.cz, což je vSMP systém pořízený z prostředků NTIS (ECE OP VaVpI, ZČU).

Pro koho je a není stroj vhodný

Výhody ScaleMP:

  • uživatelská aplikace má k dispozici veškerou agregovanou paměť a CPU, odpadá nutnost dodatečné paralelizace úlohy
  • systém je sestavený z běžně dostupného HW, je tedy o něco levnější než řešení implementující SMP na úrovni HW
  • systém může přinést výrazné finanční úspory u SW s licencí vázanou na fyzické uzly (ikdyž právní výklad by mohl být asi sporný)

Nevýhody ScaleMP:

  • systém ve své obecnosti často nedosahuje takového zrychlení aplikace, jakou by přinesla důsledná manuální paralelizace
  • pokud chceme dosáhnout přijatelných výsledků v rychlosti běhu aplikace, je třeba i zde počítat z jistým úsilím při přípravě běhu úlohy

Z výše uvedeného vyplývá i vhodnost stroje pro konkrétní úlohy. Obecně lze říci, že stroj je vhodný zejména pro samostatně běžící úlohy, které potřebují velké množství procesorů a/nebo paměti, jejichž paralelizace je obtížná a přípravě jejich běhu je uživatel ochoten věnovat jisté netriviální usilí. Systém není příliš vhodný pro souběžný provoz menších neupravených úloh, u kterých se často projevuje výrazné zpomalení doby běhu proti běžnému nevirtualizovanému HW.

Z čeho se stroj skládá

Technicky se stroj alfrid skládá z 16 serverů (IBM x3550 M4) propojených 2xFDR infinibandem (SX6036), které maji v součtu 256 jader a 4TB paměti. Jako scratch slouží diskové pole IBM V3700 (24x 10k 600gb disky, propojené přes SAS do masternodu). Cluster má 2x10Gb/s uplink (z master nodu) do sítě Metacentra na ZČU. Součástí instalace je i 17. server, sloužící jako licenční a image server ScaleMP a dále pak lokální ethernetový switch (SG500-52) na agregaci IPMI a bootovaní po síti.

Jak na stroj získám přístup

Pro přístup ke stroji alfrid je třeba být členem Metacentra (podmínky a přiláška zde). Automatický přístup mají členové uživatelských skupin iti nebo kky, o individuální přístup je třeba požádat vlastníky HW, nejlépe emailem na meta@cesnet.cz s kopii na honzas@ntis.zcu.cz. Pokud máte afiliaci k výzkumnému centru NTIS, o členství ve zmíněných skupinách je možné požádat zástupce jednotlivých skupin (KKY - Jan Švec|Flídr Miroslav, KMA - Jan Nejedlý, KFY - Jiří Houška, KIV - Ladislav Pešička, KME - Miroslav Horák), kteří mají práva nové uživatele přidávat ( návod zde).

Členství ve skupině lze ověřit náhledem do /etc/group na libovolném stroji Metacentra nebo na stránkách Metacentra v sekci Můj účet -> Osobní údaje, na kartě VO setting se vybere VO Metacentrum a v pravé dolní části stránky se zobrazí seznam skupin.

Jak na stroji pustím úlohu

Přístup ke stroji řídí dávkový systém PBS. Pokud s tímto systémem nemáte žádné zkušenosti nebo jste v prostředí Metacentra nováčkem, doporučujeme přečíst si alespoň základní informace v tutoriálu Jak začít počítat.

Úlohy musí na stroj alfrid přistupovat přes speciální frontu scalemp a je třeba specifikovat konkrétní skupinu, kterou k přístupu používáte. Vlastní příkaz pro spuštění by tedy vypadal např. takto:

qsub -q scalemp -W group_list=iti .....

V případě, že potřebujete celý stroj pro sebe, je možné při submitování buď požádat o všechny procesory (-l nodes=1:ppn=256) nebo použádat o stroj exkluzivně (-l nodes=1#excl). Pokud dáváte přednost interaktivnímu přístupu, přidejte k příkazu qsub volbu -I.

Pozn: Na stroj alfrid, tak jako na všechny ostatní stroje, je možné přihlásit se pomocí ssh, nicméně pro spouštění úloh je, z důvodů vyloučení kolize výpočtů, třeba používat výhradně systém PBS.

Jak upravit úlohu plně využila předností stroje

Hlavní příčinou pomalého běhu aplikací na vSMP systému je fyzická vzdálenost většiny paměti od procesoru, který zpracovává data (viz NUMA; zjednodušeně - místo aby si procesor došel po rychlé systémové sběrnici do lokální RAM, musí do PCI karty, dále po drátech do switche, odtud do sousedního uzlu, tam do paměti a pak zase celou trasu zpět. Celý proces komplikuje např. i udržování koherence keší mezi procesory). Přístup do nelokální paměti může být o jeden i více řádů pomalejší než přístup do lokální paměti. Proto je pro uspokojivý běh aplikace třeba zaměřit se zejména na zajištění lokality zpracovávaných dat, případně omezení souběžného přepisu konkrétní paměťové stránky v keši.

Na stránkách ScaleMP je po registraci k dispozici dokumnetace obsahující mimo jiné např. Best practices či návody pro úspešné zprovoznění nejpoužívanějšího SW (Ansys, Matlab, Fluent, VASP apod.).

Další doporučení, příklady a postupy, určené spíše pro optimalizaci vlastních aplikací, jsou ve formě příkladů k dispozici též na alfrid:/opt/ScaleMP/examples

V praxi se nám osvědčil následující postup:

  1. pročíst si alespoň základní dokumentaci ke ScaleMP
  2. podívat se, zda po váš SW není k dispozici podrobnější návod
  3. připravit si základní zadání úlohy, které bude počítat zhruba hodinu
  4. vyzkoušet pustit úlohu se všemi doporučeními na _prázném_ stroji
  5. zhodnotit jaké zrychlení jste dosáhli proti běžnému HW
  6. v případě neuspokojivých výsledků se obrátit na podporu Metacentra (meta@cesnet.cz) či podporu ScaleMP (Support@ScaleMP.com)


Jak těžké je upravit si aplikaci - modelový příklad: nejjednodušší úprava

Jako úplně první pokus o optimalizaci běhu aplikace lze vyzkouset před jejím spuštěním (např. do spoustěcího scriptu) přidat následující úpravu:

....
# najdi $NCPU procesoru, ktere jsou 'nejprihodnejsi'
CPULIST=`/opt/ScaleMP/numabind/bin/numabind --offset $NCPU --flags=best
2>/dev/null`

# svaz tento proces a jeho potomky s temito konkretnimi procesory
taskset -pc $CPULIST $$

# pust vypocet
....

Pravděpodobně lze dosáhnout dalšího zlepšení použitím dalších optimalizačních nastavení či upravených knihoven dodávaných firmou ScaleMP, viz odkazy na dokumentaci v odstavci výse.

Jak těžké je upravit si aplikaci - modelový příklad: vynásobení dvou matic v MATLABu

Základem je obyčejný script pro MATLAB, který vynásobí dvě náhodné matice:

nproc=str2num(getenv('NPROC'));
maxNumCompThreads(nproc); % Enable multithreading
setenv('MKL_NUM_THREADS', getenv('NPROC'));
% Set parameters
numRuns = 1;
% Number of runs to average over
% dataSize = 100000; % Data size to test
dataSize = str2num(getenv('DATASIZE'));
x=rand(dataSize,dataSize); % Random square matrix
% Matrix multiplication
for i = 1:numRuns
y=x * x;
end
quit


To co je specifické pro ScaleMP je nastavení prostředí na fixace procesů na konkrétní procesory před vlastním spuštěním výpočtu:

#! /bin/bash
# Make MATLAB accessible
export PATH=$PATH:/software/matlab-8.5/bin
#
# Get arguments
export NPROC=16
[ "_$1" != "_" ] && NPROC=$1
export DATASIZE=10000
[ "_$2" != "_" ] && DATASIZE=$2
#
# ScaleMP specific stuff
#
# Intel OpenMP and MKL environment variables
export KMP_AFFINITY=compact,granularity=fine
export KMP_LIBRARY=turnaround
export MKL_DYNAMIC=FALSE
export MKL_VSMP=1
#
# Find which CPUs to run MATLAB on
CPULIST=`/opt/ScaleMP/numabind/bin/numabind --offset $NPROC --flags=best 2>/dev/null`
export NUMBIND_RESERVED=$CPULIST
taskset -pc $CPULIST $$
#
# Run MATLAB
echo "Running with $NPROC threads on $DATASIZE x $DATASIZE matrices"
matlab -nodisplay -nojvm -r matmul 2>&1