Blogginlägg Volupe

Hur man effektivt hanterar arbetsstationsresurser

Numera garanterar klusterkösystem och IT-förfaranden vanligtvis en smidig användarupplevelse. De gör det enkelt att fördela din simulations på ett rättvist och effektivt sätt till resurserna. Men vad händer om du inte har ett kluster och inte heller ett kösystem utan snarare en kraftfull arbetsstation? Låt oss ta reda på hur du kan optimera användningen av hårdvaruresurser. I veckans blogginlägg delar vi stolt med oss av en fantastiskt skriptbaserad resurshanterare för Linux-miljö av vår kund Luc Evertzen, R&D Lead Developers/Simulation på Brink Climate Systems.

Resurser för arbetsstationer

Arbeta med parallella servrar

Det är mycket önskvärt att beräkna CFD-lösningar parallellt genom att fördela nätet på flera processer på flera kärnor. Denna funktionalitet bygger på ett koncept för dataparallellism där varje process tillämpar numeriska metoder som är identiska med dem som används i en seriell lösning.

Kommunikationen mellan processerna säkerställer överensstämmelse med en seriell lösning genom att meddelanden skickas via MPI (Message Passing Interface). Oavsett om du använder en lokal arbetsstation med flera kärnor, fjärrmaskiner eller ett fjärrkluster för att köra din parallellserver, kräver alla tillvägagångssätt en implementering av MPI som följer med installationen av STAR-CCM+.

 

Använda en arbetsstation med flera kärnor eller en grupp av maskiner

Du kan använda en lokal arbetsstation med flera kärnor eller gruppera flera datorer i ett kluster. Men för att kunna köra parallellt måste Simcenter STAR-CCM+ installeras på varje maskin som du vill köra på. Och servrarna måste vara en uppsättning homogena maskiner (antingen Windows- eller Linux-maskiner kan kopplas ihop). En simulering kan startas på en grupp maskiner genom att:

  • Definiera en maskinfil för parallella värdar

    En lista över maskiner som du vill placera processer på.

  • Starting ett kluster av maskiner manuellt

    Föreskrivning av de värdar där processerna inleds.

  • Användning av system för hantering av batch

    Ett batchsystem hanterar jobbet och tilldelar det till specifika maskiner när de blir tillgängliga baserat på de begärda resurserna.

Resurshantering på en arbetsstation med en enda maskin

Det kan vara en utmaning att använda hårdvaran effektivt. Tillgång till licenser och olika användares önskemål måste anpassas till hårdvaruresurserna. Ett batchhanteringssystem är ett sofistikerat alternativ för att delegera beräkningsjobb, men installationen och konfigurationen är ambitiös. I de följande två avsnitten beskriver vi installation och konfiguration av ett Batch Management System och en Linuxmiljö (testad på Rocky Linux 8.5), samt en strömlinjeformad men effektiv skriptmetod med individuella anpassningar för att hålla arbetsstationen sysselsatt.

Installation av SLURM-systemet för hantering av partier

Simcenter STAR-CCM+ kan köras i batchläge under kontroll av olika batch-system som SLURM, PBS eller Grid Engine. SLURM är ett utmärkt verktyg för schemaläggning av arbete för högpresterande datorkluster. Dessutom kan det vara ett värdefullt verktyg på ett lokalt skrivbord eller en enskild server när du behöver köra flera program samtidigt och ställa dem i kö samtidigt som du ser till att du inte överbelastar din dator eller server. Dessutom kan det vara användbart när du delar en server med andra användare eller behöver köra flera jobb över natten.

1. Installera paket

Först installerar vi SLURM-paket

sudo yum update -y
sudo yum install slurm-slurmd slurmctld -y

Slurm använder MUNGE-tjänsten för autentisering inom en grupp värdar. Strängt taget har vi bara en värd (localhost), men vi behöver ändå en Munge-nyckel för att autentisera oss när vi skickar in ett jobb.

sudo yum install epel-release -y
yum install munge munge-libs munge-devel -y

2. Konfigurera

Konfigurera SLURM:s köuppsättning i SLURM:s konfigurationsfil. Här justerar vi avsnittet COMPUTE NODES till din maskins specifikationer, t.ex. om du har 10 kärnor CPUs=10 och ditt minne är 32000MB RealMemory=32000 . Du måste också ställa in MpiDefault=none.

sudo chmod 777 /etc/slurm/
vi /etc/slurm/slurm.conf

Skapa en MUNG-nyckel och ange behörigheter

sudo mkdir /etc/munge
dd if=/dev/urandom bs=1 count=1024 | sudo tee -a /etc/munge/munge/munge.key
sudo chown munge: /etc/munge/munge.key
sudo chmod 400 /etc/munge/munge.key
sudo chmod a+x /var/run/munge

3. Start och kontrollera

Start tjänsten MUNG

sudo systemctl enable munge
sudo systemctl start munge

Låt oss nu starta SLURM med systemd:

sudo systemctl start slurmd -l
sudo systemctl start slurmctld.services -l

4. Ställ in maskinen på tomgång

Till sist ställer vi in vår maskin som idle, så att vi kan börja ställa jobb i kö:

sudo scontrol update nodename=localhost state=idle
sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
LocalQ* up infinite 1 idle localhost

Om du ser ovanstående och lyckas, har du fått igång slurm. Du har nu en kö (eller "partition" på slurmspråk) kallad LocalQ som du nu kan skicka in ditt arbete till. Om du har några problem kan du felsöka dem genom att titta i logfilerna i /var/log/slurm-llnl/slurmd.log och /var/log/slurm-llnl/slurmctld.log.

För att skicka ett jobb till kön kan du använda kommandot sbatch. Nedan finns ett kort exempel på ett manuskript för inlämning av ett Simcenter STAR-CCM+-jobb:

#!/bin/bash
#SBATCH -J starXX
#SBATCH --nodes=3
#SBATCH --ntaks=28
#SBATCH -n 84
#SBATCH exclusive

#SBATCH -o output_file.o
#SBATCH -e error_flie.e

#SBATCH -t 00:30:00

Modulladdning starccm+/17.02.010

sim_file="simulation.sim"
STARTMACRO="/home/MYCASE/runsim.java"

starccm+ -power -podkey your_PoD_key -licpath 1999@flex.cd-adapco.com -np 84 $sim_file -batch $STARTMACRO -batch-report

Skriptning

Ett mer flexibelt och rationellt tillvägagångssätt kan vara att skriva ett eget bash-skript. Ett bash-skript är en vanlig textfil som innehåller en rad kommandon som vi normalt skulle skriva själva på kommandoraden. Men det kan även innehålla slingor och IF-uttalanden.

Ett mycket enkelt skript kan komponeras för att köra flera simulations i sekvenser:

#!/bin/bash

starccm+ -batch -np 2 File1.sim ;
starccm+ -batch -np 2 File2.sim ;
starccm+ -batch -np 2 File3.sim ;

Vår kund Luc Evertzen kom dock på ett mycket smartare bash-skript. Det här skriptet körs med kommandot nohup (står för no hangup) för att skapa en kontinuerlig bakgrundsuppgift. Det körs kontinuerligt med en väntetid på 20 sekunder och söker i en mapp efter nytillkomna .sim/.dmprj-filer.

För varje sim- och dmprj-fil körs sedan starccm+-kommandon beroende på filtyp. När simuleringen har lösts placeras en tom fil i samma mapp med samma namn som simuleringen, men med tillägget .solved. Denna flagga talar om för skriptet att undvika att köra redan lösta simulations. Så nu kan du bara kasta simulations på servern och simulations kommer att köras.

#!/bin/sh

Skript för # Job Manager skapat av Luc Evertzen
while true; do
 dag=$(datum +'%d')
 if [ "$day" == 1 ]; then
  : > nohup.out
 Fi

# Hitta alla simuleringsfiler i den aktuella mappen
 for i in "*.{sim,dmprj}"; do
# Om det inte finns någon fil med samma namn men med tillägget .solved, skicka in!
  if ! test -f $i.solved; then
   string=$i
   extension=".sim"
   case "$string" i
    *$extension*)
# Fall för sim filer
     starInstallationPath/star/bin/starccm+ -batch Run.java -power -np 32 -load $i;
     touch $i.solved ;
     rm *.sim~;;
# Fall för dmprj filer
    * )
     starInstallationPath/star/bin/starccm+ $i -batch -dmnoshare -passtodesign "-power";
     touch $i.solved ;
     rm *.dmprj~;;;
   esac
  fi
 gjort
 sov 20
done

simulations körs med ett javamakro som ger ytterligare ett lager av automatisering till inlämningen. Skriptet kontrollerar utifrån vissa namnkonventioner om simuleringen ska rensas, om nätpipeline ska köras eller om fysiken ska lösas. Namnkonventionerna använder dubbla understrykningar för att skilja filnamnet från driftskommandon och lyder som följer:

  • Tydlig simulering: MySim__c.sim
  • Nät-simulering: MySim__m.sim
  • Kör simulering: MySim__s.sim

Namnkonventionen kan också användas för att kombinera operationer. Till exempel:

  • Rensa och lösa simuleringen: MySim__cs.sim
  • Nät och lös simuleringen: MySim__mc.sim
  • osv.

Den innehåller också en reservklausul som innebär att den helt enkelt kommer att maskera och lösa om operationskommandon utelämnas i filnamnet. Slutligen kan antalet unika processer anpassas genom att helt enkelt lägga till ytterligare if-satser i java-filen. Till exempel:

  • Om (commands.contains("r")): Kan användas för att återge eventuella manuskript
  • Om (commands.contains("p")): Kan användas för att spara alla scener och tomter som finns i simuleringen.
// STAR-CCM+ makro: MeshRunAndSave.java
paket makro;
importera java.io.*;
import star.base.neo.*;
importera star.common.*;
importera star.meshing.*;
importera star.surfacewrapper.*;
importera java.util.*;

public class Run extends StarMacro {
    public void execute() {
        Simulering sim = getActiveSimulation();
        String name = sim.getPresentationName();
        försök {
            String commands = name.split("__")[1];
            if (commands.contains("c")) {
                sim.getSolution().clearSolution();
                sim.saveState(sim.getPresentationName() + ".sim");
            }
            if (commands.contains("m"))) {
                MeshPipelineController meshPipelineController_0 =
                    sim.get(MeshPipelineController.class);
                meshPipelineController_0.generateVolumeMesh();
                sim.saveState(sim.getPresentationName() + ".sim");
            }
            if (commands.contains("s")) {
                sim.getInterfaceManager().initialize();
                sim.getSimulationIterator().run();
                sim.saveState(sim.getPresentationName() + ".sim");
            }
        } catch (Exception ex) {
            MeshPipelineController meshPipelineController_0 =
                    sim.get(MeshPipelineController.class);
                meshPipelineController_0.generateVolumeMesh();
            sim.getInterfaceManager().initialize();
            sim.getSimulationIterator().run();
            sim.saveState(sim.getPresentationName() + ".sim");
        }
    }
}

Kombinationen av både bash-skriptet och javamakrot gör det möjligt att köra ett jobb med minsta möjliga användarinteraktion. Användaren behöver bara placera filerna i "körkatalogen" och vänta på att filen *.solved visas. Allt detta är dock möjligt tack vare en licensfunktion i Simcenter STAR-CCM+ som gör att ett jobb väntar tills licenser blir tillgängliga igen. Normalt returnerar FlexNet om en licens inte är tillgänglig och koden avslutas. Om miljövariabeln STARWAIT är inställd kommer FlexNet att vänta tills en licens blir tillgänglig. Ett viktigt steg är alltså att helt enkelt lägga till kommandot "export STARWAIT=1" i ditt batch-skript.

Kösystemet kan dödas genom att köra kommandot "ps fjx" och döda processen "/bin/sh ./run.sh" med kommandot "kill 'PID'", där "PID" är PID för skriptprocessen (andra kolumnen).

Den oändliga slingan i skriptet kan eventuellt tas bort och skriptet med endast case-angivelsen kan schemaläggas av ett crown-jobb. På så sätt kan man undvika problem med att stoppa utförandet. Vi hoppas att det här blogginlägget hjälper dig att hantera dina datorresurser på bästa möjliga sätt. För mer information eller om du har några frågor är du alltid välkommen att kontakta oss på följande adress

 

Författarna

Luc Evertzen
FoU-ingenjör på Brink Climate Systems


Florian Vesting, doktorsexamen
Kontakt: support@volupe.com
+46 768 51 23 46

Fler blogginlägg

sv_SESwedish