Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
CycleCloud GridEngine Project README (Projekt klastra CycleCloud GridEngine README)
Open Grid Scheduler (Grid Engine) można łatwo włączyć w klastrze Usługi Azure CycleCloud, modyfikując definicję "run_list". Klaster Grid Engine składa się z dwóch podstawowych komponentów. Pierwszy to węzeł "główny", który udostępnia wspólny system plików, w którym działa oprogramowanie Grid Engine. Drugi to zestaw węzłów wykonawczych, które jako hosty montują wspólny system plików i uruchamiają przesłane zadania. Na przykład prosty fragment szablonu klastra Grid Engine może wyglądać następująco:
[cluster grid-engine]
[[node master]]
ImageName = cycle.image.centos7
MachineType = Standard_A4 # 8 cores
[[[configuration]]]
run_list = role[sge_master_role]
[[nodearray execute]]
ImageName = cycle.image.centos7
MachineType = Standard_A1 # 1 core
[[[configuration]]]
run_list = role[sge_execute_role]
Uwaga
Nazwy ról zawierają "sge" ze starszych powodów: Grid Engine był produktem Sun Microsystems.
Importowanie i uruchamianie klastra z definicją w usłudze CycleCloud powoduje utworzenie jednego węzła głównego. Węzły execute można dodać do klastra za pomocą polecenia cyclecloud add_node. Na przykład, aby dodać 10 kolejnych węzłów „execute”:
cyclecloud add_node grid-engine -t execute -c 10
Autoskalowanie systemu Grid Engine
Usługa Azure CycleCloud obsługuje skalowanie automatyczne dla Grid Engine. To zachowanie oznacza, że oprogramowanie stale monitoruje stan kolejki i automatycznie włącza lub wyłącza węzły zgodnie z potrzebami, aby wydajnie ukończyć obciążenie zarówno pod względem czasu, jak i kosztu. Automatyczne skalowanie dla Grid Engine można włączyć, dodając Autoscale = true do definicji klastra.
[cluster grid-engine]
Autoscale = True
Domyślnie wszystkie zadania przesłane do kolejki Grid Engine są wykonywane na maszynach typu "execute". Te maszyny zdefiniowane przez tablicę węzłów o nazwie "execute". Nie jesteś ograniczony do nazwy 'execute', ani do jednego typu konfiguracji maszyny, aby uruchamiać zadania i skalować automatycznie.
Na przykład typowy scenariusz obejmuje klaster z dwiema różnymi definicjami węzłów. Jeden z nich jest przeznaczony do uruchamiania "normalnych" zadań, które używają standardowych procesorów CPU. Druga jest przeznaczona dla zadań wymagających maszyn z obsługą procesora GPU. W takim przypadku należy niezależnie skalować kolejkę zarówno przez zwykłe zadania, jak i zadania GPU, aby upewnić się, że masz odpowiednią liczbę każdej maszyny do obsługi kolejki pracy. Przykładowa definicja będzie wyglądać następująco:
[cluster grid-engine]
Autoscale = True
[[node master]]
ImageName = cycle.image.centos7
MachineType = Standard_A3 # 4 cores
[[[configuration]]]
run_list = role[sge_master_role]
[[nodearray execute]]
ImageName = cycle.image.centos7
MachineType = Standard_A4 # 8 cores
[[[configuration]]]
run_list = role[sge_execute_role]
[[nodearray gpu]]
MachineType = Standard_NV12 # 2 GPUs
ImageName = cycle.image.centos7
# Set the number of cores to the number of GPUs for autoscaling purposes
CoreCount = 2
[[[configuration]]]
run_list = role[sge_execute_role]
gridengine.slot_type = gpu
gridengine.slots = 2
W przedstawionym przykładzie istnieją teraz dwie tablice węzłów: jedna jest standardową tablicą węzłów execute, a druga nosi nazwę gpu, dostarczając typ maszyny z dwoma układami GPU NVIDIA (Standard_NV12 w Azure). Należy również pamiętać, że istnieją teraz dwa nowe elementy w sekcji konfiguracji oprócz przepisu "csge:sgeexec". Dodanie gridengine.slot_type = gpu informuje harmonogram Grid Engine, że te węzły powinny być nazwane jako węzły "gpu", a zatem powinny uruchamiać tylko zadania "gpu". Nazwa "gpu" jest dowolna, ale najbardziej przydatna jest nazwa opisującą węzeł. Ustaw gridengine.slots = 2, aby poinformować oprogramowanie, że ten typ węzła może maksymalnie uruchamiać dwa zadania jednocześnie (Standard_NV12 ma tylko 2 GPU).
Domyślnie Grid Engine przypisuje liczbę miejsc na węzeł na podstawie liczby jednostek CPU w systemie. W takim przypadku domyślne zachowanie może spowodować jednoczesne uruchomienie zbyt wielu zadań w jednym węźle. W przedstawionym przykładzie parametr CoreCount=2 jest ustawiany na tablicy nodearray, aby dopasować liczbę procesorów GPU dostępnych w typie maszyny, co umożliwia usłudze CycleCloud poprawne skalowanie tej tablicy zgodnie z liczbą procesorów GPU w porównaniu do liczby procesorów CPU.
Liczbę gniazd i typy gniazda dla maszyn można zweryfikować, uruchamiając polecenie:
-bash-4.1# qstat -F slot_type
queuename qtype resv/used/tot. load_avg arch states
---------------------------------------------------------------------------------
all.q@ip-0A000404 BIP 0/0/4 0.17 linux-x64
hf:slot_type=execute
---------------------------------------------------------------------------------
all.q@ip-0A000405 BIP 0/0/2 2.18 linux-x64
hf:slot_type=gpu
---------------------------------------------------------------------------------
all.q@ip-0A000406 BIP 0/0/4 0.25 linux-x64
Zwróć uwagę, że jest po jednym rodzaju "slot_type", czyli "execute" i "gpu". Typy gniazd są konfigurowane indywidualnie, a liczba gniazd dla gniazda "execute" wynosi 4, co odpowiada liczbie procesorów CPU w maszynie. Liczba miejsc dla typu gniazda "gpu" wynosi 2, które określono w naszym szablonie konfiguracji klastra. Trzecia maszyna to węzeł główny, który nie uruchamia zadań.
Zaawansowane korzystanie z systemu "Grid Engine"
Te ustawienia konfiguracji umożliwiają zaawansowane dostosowywanie węzłów i tablic węzłów. Na przykład, jeśli zadania wymagają określonej ilości pamięci, powiedzmy 10 GB każde, można zdefiniować tablicę węzłów 'wykonawczych', która uruchamia maszyny z 60 GB pamięci, a następnie dodać opcje konfiguracji gridengine.slots = 6 w celu zapewnienia, że na tego typu węźle może być uruchomionych współbieżnie tylko 6 zadań (zapewniając, że każde zadanie ma co najmniej 10 GB pamięci do pracy).
Pogrupowane węzły w Grid Engine
Gdy zadanie równoległe jest przesyłane do silnika gridowego, domyślne zachowanie autoskalowania stosowane przez CycleCloud traktuje każde zadanie MPI jako pojedyncze żądanie dotyczące pogrupowania węzłów. Pogrupowane węzły są ściśle powiązane i idealnie nadają się do przepływów pracy MPI.
Gdy zestaw zgrupowanych węzłów dołączy do klastra Grid Engine, identyfikator grupy każdego węzła jest używany jako wartość złożona affinity_group. Wymaganie określenia elementu affinity_group dla zadań umożliwia harmonogramowi Grid Engine zapewnienie, że zadania umieszczane są tylko na maszynach, które znajdują się w tej samej grupie.
Automatyzacja usługi CycleCloud automatycznie tworzy zapotrzebowanie na zgrupowane węzły i przypisuje je do dostępnych grup affinity po napotkaniu zadań równoległych.
Przesyłanie zadań do Grid Engine
Najbardziej ogólnym sposobem przesyłania zadań do harmonogramu Grid Engine jest użycie polecenia:
qsub my_job.sh
To polecenie przesyła zadanie uruchamiane na węźle typu "execute", czyli na węźle zdefiniowanym przez zbiór węzłów 'nodearray' "execute". Aby wykonać zadanie w środowisku nodearray innego typu, na przykład pokazano typ węzła "gpu", modyfikujemy nasze przesyłanie:
qsub -l slot_type=gpu my_gpu_job.sh
To polecenie gwarantuje, że zadanie jest uruchamiane tylko na 'slot_type' równym 'gpu'.
W przypadku pominięcia slot_type polecenie "execute" automatycznie przypisuje zadanie. Użytkownik może zmodyfikować mechanizm, który automatycznie przypisuje slot_type do zadań. Skrypt języka Python znajdujący się w lokalizacji /opt/cycle/jetpack/config/autoscale.py można utworzyć, co powinno definiować pojedynczą funkcję "sge_job_handler". Ta funkcja otrzymuje słownikową reprezentację zadania, podobną do danych wyjściowych qstat -j JOB_ID polecenia i powinna zwrócić słownik zasobów twardych, które muszą zostać zaktualizowane dla zadania.
Na przykład poniższy skrypt przypisuje zadanie do slot_type "gpu", jeśli nazwa zadania zawiera litery "gpu". Użytkownicy mogą automatycznie przesyłać swoje zadania bez zmieniania parametrów zadania, jednocześnie zapewniając uruchamianie zadań i automatyczne skalowanie odpowiednich węzłów:
#!/usr/env python
#
# File: /opt/cycle/jetpack/config/autoscale.py
#
def sge_job_handler(job):
# The 'job' parameter is a dictionary containing the data present in a 'qstat -j JOB_ID':
hard_resources = {'slot_type': 'execute', 'affinity_group' : 'default' }
# Don't modify anything if the job already has a slot type
# You could modify the slot type at runtime by not checking this
if 'hard_resources' in job and 'slot_type' in job['hard_resources']:
return hard_resources
# If the job's script name contains the string 'gpu' then it's assumed to be a GPU job.
# Return a dictionary containing the new job_slot requirement to be updated.
# For example: 'big_data_gpu.sh' would be run on a 'gpu' node.
if job['job_name'].find('gpu') != -1:
hard_resources {'slot_type': 'gpu'}
else:
return hard_resources
Parametr "job" przekazany jako argument jest słownikiem zawierającym dane w wywołaniu qstat -j JOB_ID.
{
"job_number": 5,
"job_name": "test.sh",
"script_file": "test.sh",
"account": "sge",
"owner": "cluster.user",
"uid": 100,
"group": "cluster.user",
"gid": 200,
"submission_time": "2013-10-09T09:09:09",
"job_args": ['arg1', 'arg2', 'arg3'],
"hard_resources": {
'mem_free': '15G',
'slot_type': 'execute'
}
}
Za pomocą tej funkcji skryptów można automatycznie przypisywać slot_type na podstawie dowolnego zdefiniowanego parametru zadania, takiego jak argumenty, wymagania dotyczące zasobów, takie jak pamięć lub przesyłający użytkownik.
Załóżmy, że przesyłasz 5 zadań dla każdego rodzaju „slot_type”:
qsub -t 1:5 gpu_job.sh
qsub -t 1:5 normal_job.sh
W kolejce będzie teraz 10 zadań. Ze względu na zdefiniowany skrypt pięć zadań ze słowem 'gpu' w nazwie zostanie automatycznie skonfigurowanych do uruchamiania tylko na węzłach 'slot_type=gpu'. Mechanizm automatycznego skalowania CycleCloud wykryłby, że istnieje 5 zadań „gpu” i 5 zadań „wykonawczych”. Ponieważ tablica węzłów 'gpu' jest zdefiniowana jako mająca 2 gniazda na węzeł, usługa CycleCloud uruchomi 3 z tych węzłów (5/2=2,5 zaokrąglone do 3).
Istnieje pięć normalnych zadań, ponieważ typ maszyny dla "execute" nodearray ma 4 CPU, CycleCloud uruchomi 2 z tych węzłów, aby obsłużyć zadania (5/4=1,25 zaokrąglone do 2). Po krótkim okresie uruchamiania nowo uruchomione węzły są uruchamiane i konfigurowane samodzielnie. Po przygotowaniu wszystkie 10 zadań zostanie wykonanych do końca. Następnie 5 węzłów zostanie automatycznie zamkniętych przed rozpoczęciem kolejnego cyklu rozliczeniowego od dostawcy usług w chmurze.
Zakłada się, że zadania mają czas trwania jednej godziny. Jeśli środowisko uruchomieniowe zadania jest znane, algorytm skalowania automatycznego może korzystać z tych informacji. Poinformuj o automatycznym skalowaniu oczekiwanego czasu wykonywania zadania, dodając go do kontekstu zadania. Poniższy przykład ustawia czas wykonywania zadania dla automatycznego skalowania na 10 minut.
qsub -ac average_runtime=10 job_with_duration_of_10m.sh
Dokumentacja konfiguracji Grid Engine
Poniżej przedstawiono opcje konfiguracji specyficzne dla Grid Engine, które można przełączać, aby dostosować funkcjonalność:
| Opcje konfiguracji SGE-Specific | Opis |
|---|---|
| gridengine.slots | Liczba gniazd dla danego węzła do zgłaszania w Grid Engine. Liczba miejsc jest liczbą współbieżnych zadań, które może wykonać węzeł. Ta wartość jest domyślnie liczbą procesorów CPU na danym komputerze. Tę wartość można zastąpić w przypadkach, w których nie uruchamiasz zadań na podstawie procesora CPU, ale pamięci, procesorów GPU itp. |
| gridengine.slot_type | Nazwa typu "slotu", który zapewnia węzeł. Wartość domyślna to "execute". Gdy zadanie jest oznaczone zasobem stałym "slot_type=", uruchamiane jest tylko na maszynie takiego samego typu gniazda. Etykietowanie pozwala na stworzenie różnych konfiguracji oprogramowania i sprzętu dla każdego węzła oraz zapewnia, że odpowiednie zadanie jest zawsze przypisane do właściwego typu węzła. |
| gridengine.ignore_fqdn (ignorowanie pełnej nazwy domeny) | Wartość domyślna: true. Ustaw wartość false, jeśli wszystkie węzły w klastrze nie są częścią jednej domeny DNS. |
| gridengine.version | Ustawienie domyślne: "2011.11". Ta opcja konfiguracji określa wersję Grid Engine do zainstalowania i uruchomienia. Obecnie jest to domyślna i jedyna dostępna opcja. Inne wersje oprogramowania Grid Engine mogą być obsługiwane w przyszłości. |
| gridengine.root | Ustawienie domyślne: "/sched/sge/sge-2011.11" Ta lokalizacja jest miejscem, gdzie Grid Engine instaluje i montuje na każdym węźle w systemie. Najlepiej zachować tę wartość bez zmian. Jeśli jednak zmodyfikujesz, upewnij się, że ustawiono tę samą wartość w każdym węźle w klastrze. |
Usługa CycleCloud obsługuje standardowy zestaw atrybutów automatycznego zatrzymania w różnych harmonogramach.
| Atrybut | Opis |
|---|---|
| cyclecloud.klaster.autoskalowanie.zatrzymanie_wlaczone | Włącza automatyczne zatrzymanie w tym węźle. [prawda/fałsz] |
| cyclecloud.cluster.autoscale.czas_bezczynności_po_zadaniach | Ilość czasu (w sekundach), przez jaki węzeł pozostaje bezczynny po zakończeniu zadań, zanim nastąpi jego automatyczne zatrzymanie. |
| cyclecloud.klaster.autoskalowanie.czas_bezczynności_przed_zadaniami | Czas (w sekundach), przez który węzeł pozostaje bezczynny przed ukończeniem zadań, zanim zostanie automatycznie zatrzymany. |
Znane problemy
-
qshpolecenie sesji interakcyjnej nie działa. Użyjqrshjako alternatywy. - Skalowanie automatyczne nie uwzględnia
exclusive=1kompleksu, co może spowodować uruchomienie mniejszej liczby węzłów niż oczekiwano.
Uwaga
Mimo że system Windows jest oficjalnie obsługiwaną platformą GridEngine, obecnie usługa CycleCloud nie obsługuje uruchamiania narzędzia GridEngine w systemie Windows.
Ta strona dotyczy możliwości i konfiguracji używania (Altair) GridEngine z usługą CycleCloud.
Konfigurowanie zasobów
Aplikacja cyclecloud-gridengine dopasowuje zasoby SGE do zasobów w chmurze Microsoft Azure, aby zapewnić zaawansowane narzędzia do automatycznego skalowania oraz konfiguracji klastra. Aplikacja jest wdrażana automatycznie dla klastrów utworzonych za pośrednictwem interfejsu użytkownika cycleCloud lub można ją zainstalować na dowolnym hoście administracyjnym usługi GridEngine w istniejącym klastrze.
Instalowanie lub uaktualnianie CycleCloud-GridEngine
Pakiet cyclecloud-gridengine jest dostępny na GitHub jako artefakt wydania. Instalowanie i uaktualnianie jest zgodne z tym samym procesem. Aplikacja wymaga języka Python3 z elementem virtualenv.
tar xzf cyclecloud-gridengine-pkg-*.tar.gz
cd cyclecloud-gridengine
./install.sh
Ważne pliki
Aplikacja analizuje konfigurację sge za każdym razem, gdy jest uruchamiana — zadania, kolejki, kompleksy. Informacje są udostępniane w stderr i stdout polecenia i w pliku dziennika, zarówno na konfigurowalnych poziomach. Wszystkie polecenia zarządzania GridEngine z argumentami również są rejestrowane w pliku.
| Opis | Lokalizacja |
|---|---|
| Autoskalowanie konfiguracji | /opt/cycle/gridengine/autoscale.json |
| Rejestr automatycznego skalowania | /opt/cycle/jetpack/logs/autoscale.log |
| dziennik śledzenia qconf | /opt/cycle/jetpack/logs/qcmd.log |
Kolejki SGE, grupy hostów i środowiska równoległe
Narzędzie do automatycznego skalowania cyclecloud-gridengine dodaje azgehosty do klastra zgodnie z konfiguracją klastra. Operacje skalowania automatycznego wykonują następujące akcje.
- Przeczytaj żądanie zasobu zadania i znajdź odpowiednią maszynę wirtualną do uruchomienia
- Uruchom maszynę wirtualną i poczekaj na jej gotowość
- Odczytaj kolejkę i środowisko równoległe z zadania
- Na podstawie kolejki/pe przypisz hosta do odpowiedniej grupy hostów
- Dodaj hosta do klastra i do dowolnej innej kolejki zawierającej grupę hostów
Rozważ następującą definicję kolejki dla kolejki o nazwie short.q
hostlist @allhosts @mpihg01 @mpihg02 @lowprio
...
seq_no 10000,[@lowprio=10],[@mpihg01=100],[@mpihg02=200]
pe_list NONE,[@mpihg01=mpi01], \
[@mpihg02=mpi02]
Przesłanie zadania przez qsub -q short.q -pe mpi02 12 my-script.sh uruchamia przynajmniej jedną maszynę wirtualną. Po dodaniu klastra dołącza do @mpihg02 grupy hostów, ponieważ jest to grupa hostów dostępna zarówno dla kolejki, jak i środowiska równoległego. Również dołącza do specjalnej grupy hostów @allhosts.
Jeśli przesyłasz zadanie z elementem qsub -q short.q my-script.sh i nie określisz środowiska równoległego pe, wynikowa maszyna wirtualna dołącza do grup hostów @allhosts i @lowpriority połączonych z kolejką, do której nie są przypisane żadne pe.
Ostatecznie, zadanie przesłane z qsub -q short.q -pe mpi0* 12 my-script.sh skutkuje dodaniem maszyny wirtualnej do @mpihg01 lub @mpihg02, w zależności od przewidywań co do alokacji usługi CycleCloud.
Środowiska równoległe niejawnie są równoważne grupie umieszczania Cyclecloud. Maszyny wirtualne w środowisku PE są ograniczone do znajdowania się w tej samej sieci. Jeśli chcesz użyć pe, który nie przechowuje grupy umieszczania, użyj autoscale.json , aby zrezygnować.
W tym miejscu zrezygnujemy z grup alokacji dla make pe:
"gridengine": {
"pes": {
"make": {
"requires_placement_groups": false
}
},
Grupy umieszczania CycleCloud
Grupy umieszczania CycleCloud mapują się jeden do jednego do usługi Azure VMSS z funkcją SinglePlacementGroup — maszyny wirtualne w grupie umieszczania współużytkują fabrykę Infiniband i udostępniają tylko maszynom wirtualnym w grupie umieszczania. Aby intuicyjnie zachować te silosy, grupy umieszczania mapują 1:1 ze środowiskiem równoległym GridEngine.
Określenie środowiska równoległego dla zadania ogranicza jego uruchamianie do grupy lokalizacyjnej za pomocą logiki inteligentnego przypisania do grupy hostów. To zachowanie można wyłączyć za pomocą odpowiedniej konfiguracji w autoscale.json: "required_placement_groups" : false.
Konfiguracja skalowania automatycznego
Ta wtyczka automatycznie skaluje siatkę w celu spełnienia wymagań obciążenia. Plik konfiguracjiautoscale.json określa zachowanie autoskalatora aparatu siatki.
- Ustawianie szczegółów połączenia cyclecloud
- Ustaw czasomierz zakończenia dla bezczynnych węzłów
- Obsługiwane jest skalowanie automatyczne wielowymiarowe. Można skonfigurować atrybuty, które mają być używane w pakowaniu zadania, na przykład miejsca lub pamięć
- Rejestruj kolejki, środowiska równoległe i grupy hostów do zarządzania
| Konfiguracja | Typ | Opis |
|---|---|---|
| Adres URL | Sznurek | ADRES URL CC |
| nazwa użytkownika/hasło | Sznurek | Szczegóły połączenia CC |
| nazwa_klastra | Sznurek | Nazwa klastra CC |
| zasoby_domyślne | Mapa | Połącz zasób węzła z zasobem hosta Grid Engine dla automatycznego skalowania |
| limit czasu bezczynności | Int | Czas oczekiwania przed wyłączeniem bezczynnych węzłów (sekundy) |
| czas zakończenia rozruchu | Int | Czas oczekiwania przed kończeniem węzłów w długich fazach konfiguracji (s) |
| komponenty_gridowe.istotne_złożoności | Lista (ciąg) | Kompleksy Grid Engine do rozważenia w skalowaniu automatycznym, na przykład sloty, mem_free |
| gridengine.logowanie | Plik | Lokalizacja pliku konfiguracji rejestrowania |
| gridengine.pes | Struktur | Określ działanie elementów przetwarzających, na przykład requires_placement_group = false |
Program skalowania automatycznego uwzględnia tylko odpowiedni zasób
Inny zasób automatycznego skalowania
Domyślnie zadania żądają wielu miejsc, a klaster jest skalowany na podstawie tych żądań.
Załóżmy, że chcemy automatycznie skalować względem zasobu wymaganego przez zadanie dla elementu m_mem_free.
- Dodaj
m_mem_freedogridengine.relevant_resourcesautoscale.json - Połącz
m_mem_freez zasobem pamięci na poziomie węzła w autoscale.json
Te atrybuty mogą być odwoływane za pomocą node.* jako wartość w _default/zasobach.
| Node | Typ | Opis |
|---|---|---|
| nodearray | Sznurek | Nazwa tablicy węzłów w CycleCloud |
| grupa lokalizacyjna | Sznurek | Nazwa grupy umieszczania cyclecloud w ramach nodearray |
| vm_size | Sznurek | Nazwa produktu maszyny wirtualnej, na przykład "Standard_F2s_v2" |
| liczba_vcpu | Int | Wirtualne procesory dostępne na węźle, jak wskazano na indywidualnych stronach produktu. |
| pcpu_count | Int | Fizyczne procesory dostępne na węźle |
| pamięć | Sznurek | Przybliżona ilość pamięci fizycznej dostępnej na maszynie wirtualnej ze wskaźnikiem jednostki, na przykład "8,0g" |
Inne atrybuty znajdują się w node.resources.* przestrzeni nazw, na przykład "node.resources".
| Node | Typ | Opis |
|---|---|---|
| ncpus | Sznurek | Liczba CPU dostępnych w maszynie wirtualnej |
| pcpus | Sznurek | Liczba fizycznych procesorów CPU dostępnych na maszynie wirtualnej |
| ngpus | Liczba całkowita | Liczba procesorów GPU dostępnych na maszynie wirtualnej |
| członek | Sznurek | Przybliżona ilość pamięci fizycznej dostępnej na maszynie wirtualnej ze wskaźnikiem jednostki, na przykład "8,0b" |
| memkb | Sznurek | Przybliżona ilość pamięci fizycznej dostępnej na maszynie wirtualnej ze wskaźnikiem jednostki, na przykład "8,0 tys." |
| memmb | Sznurek | Przybliżona ilość pamięci fizycznej dostępnej na maszynie wirtualnej ze wskaźnikiem jednostki, na przykład "8,0 MB" |
| memgb | Sznurek | Przybliżona ilość pamięci fizycznej dostępnej na maszynie wirtualnej ze wskaźnikiem jednostki, na przykład "8,0g" |
| memtb | Sznurek | Przybliżona ilość pamięci fizycznej dostępnej na maszynie wirtualnej ze wskaźnikiem jednostki, na przykład "8,0t" |
| Slotów | Liczba całkowita | Tak samo jak ncpus |
| typ slotu | Sznurek | Etykieta dodatkowa dla rozszerzeń. Nie używany. |
| m_mem_free | Sznurek | Oczekiwana wolna pamięć na hoście wykonawczym, na przykład "3.0g" |
| mfree | Sznurek | Takie same jak _m/_mem/bezpłatne |
Mapowanie zasobów
Dostępne są również obliczenia matematyczne dla default_resources — zmniejsz liczbę miejsc w określonej tablicy węzłów o dwa i dodaj zasób platformy Docker do wszystkich węzłów:
"default_resources": [
{
"select": {"node.nodearray": "beegfs"},
"name": "slots",
"value": "node.vcpu_count",
"subtract": 2
},
{
"select": {},
"name": "docker",
"value": true
},
Mapowanie procesorów wirtualnych węzła na złożoną strukturę gniazd oraz wartości domyślne memmb i mem_free są często używane.
Pierwsze skojarzenie jest wymagane.
"default_resources": [
{
"select": {},
"name": "slots",
"value": "node.vcpu_count"
},
{
"select": {},
"name": "mem_free",
"value": "node.resources.memmb"
}
],
Jeśli kompleks ma skrót nie równy całej wartości, zdefiniuj obie w default_resources gdzie physical_cpu jest nazwą złożoną:
"default_resources": [
{
"select": {},
"name": "physical_cpu",
"value": "node.pcpu_count"
},
{
"select": {},
"name": "pcpu",
"value": "node.resources.physical_cpu"
}
]
Kolejność jest ważna, gdy chcesz uzyskać określone zachowanie dla konkretnego atrybutu. Aby przydzielić jedno miejsce dla określonej tablicy węzłów przy zachowaniu domyślnej liczby miejsc dla wszystkich innych tablic węzłów:
"default_resources": [
{
"select": {"node.nodearray": "FPGA"},
"name": "slots",
"value": "1",
},
{
"select": {},
"name": "slots",
"value": "node.vcpu_count"
},
]
Grupy hostów
Narzędzie do automatycznego skalowania CycleCloud, próbując spełnić wymagania dotyczące zadań, przypisuje węzły do odpowiedniej grupy hostów. Wszystkie kolejki, środowiska równoległe i złożone są brane pod uwagę. Większość logiki polega na dopasowywaniu odpowiedniego koszyka cyclecloud (i liczby węzłów) do odpowiedniej grupy hostów sge.
W przypadku zadania przesłanego jako: qsub -q "cloud.q" -l "m_mem_free=4g" -pe "mpi*" 48 ./myjob.sh
Usługa CycleCloud znajduje skrzyżowanie grup hostów, które:
- Są uwzględniane w pe_list dla pliku cloud.q i są zgodne z nazwą pe, na przykład
pe_list [@allhosts=mpislots],[@hpc1=mpi]. - Mieć odpowiednie zasoby i limit subskrypcji, aby zapewnić wszystkie zasoby zadań.
- Konfiguracja ograniczeń grupy hostów nie filtruje ich.
Wiele grup hostów może spełniać te wymagania. W takim przypadku system musi zdecydować, który z nich ma być używany. Istnieją trzy sposoby rozwiązywania konfliktów członkostwa grupy hostów:
- Skonfiguruj kolejki, żeby uniknąć niejednoznaczności.
- Dodaj ograniczenia do autoscale.json.
- Pozwól CycleCloud wybrać odpowiednie grupy hostów w kolejności alfabetycznej, dostosowując
weight_queue_host_sort < weight_queue_seqnow konfiguracji harmonogramu. - Ustaw
seq_no 10000,[@hostgroup1=100],[@hostgroup2=200]w konfiguracji kolejki, aby wskazać preferencję grupy hostów.
Ograniczenia grupy hostów
Gdy kolejka lub xproject definiuje wiele grup hostów, każda z tych grup może potencjalnie przyjmować nowe hosty. Aby kontrolować, które hosty kwalifikują się do kolejki, można zastosować ograniczenia grupy hostów na podstawie właściwości węzła.
"gridengine": {
"hostgroups": {
"@mpi": {
"constraints": {
"node.vm_size": "Standard_H44rs"
}
},
"@amd-mem": {
"constraints" : {
"node.vm_size": "Standard_D2_v3",
"node.nodearray": "hpc"
}
},
}
}
WSKAZÓWKA: Sprawdź wszystkie dostępne właściwości węzła za pomocą
azge buckets.
azge
Ten pakiet jest dostarczany z wierszem polecenia, azge. Ten program służy do automatycznego skalowania i przerywa wszystkie podprocesy w ramach autoskalowania na oddzielne składniki. Te polecenia polegają na ustawieniu zmiennych środowiskowych GridEngine — musisz mieć możliwość wywołania qconf i qsub z tego samego profilu, w którym azge jest wywoływana.
| polecenia azge | Opis |
|---|---|
| sprawdzać poprawność | Sprawdza znane błędy konfiguracji w narzędziu autoscaler lub GridEngine |
| Zadania | Pokazuje wszystkie zadania w kolejce |
| Wiadra | Pokazuje dostępne pule zasobów na potrzeby skalowania automatycznego |
| Węzły | Pokazuje hosty i właściwości klastra |
| popyt | Dopasowuje wymagania dotyczące zadań do zasobników cyclecloud i zapewnia wynik skalowania automatycznego |
| automatyczne skalowanie | Wykonuje pełne skalowanie automatyczne, uruchamianie i usuwanie węzłów zgodnie z konfiguracjami |
Podczas modyfikowania konfiguracji harmonogramu (qconf) lub konfiguracji autoskalowania (autoscale.json), a nawet przy pierwszej konfiguracji, narzędzie azge może być używane do sprawdzania, czy zachowanie autoskalowania jest zgodne z oczekiwaniami. Jako użytkownik główny możesz uruchomić następujące operacje. Aby zrozumieć, jak działa autoskalowanie, ważne jest, aby zapoznać się z tymi pojęciami.
- Uruchom polecenie
azge validate, aby zweryfikować konfiguracje pod kątem znanych problemów. - Uruchom polecenie
azge buckets, aby sprawdzić zasoby oferowane przez klaster CycleCloud. - Uruchom polecenie
azge jobs, aby sprawdzić szczegóły zadania w kolejce. - Uruchom
azge demandi wykonaj zadanie dopasowywania do zasobnika. Następnie zbadaj, które zadania są przypisane do konkretnych segmentów i grup hostów. - Uruchom polecenie
azge autoscale, aby rozpocząć proces alokacji węzła lub dodaj węzły, które są gotowe do przyłączenia.
Gdy polecenia będą działać zgodnie z oczekiwaniami, włącz bieżące autoskalowanie, dodając polecenie azge autoscale do głównego pliku crontab. Upewnij się, że z wyprzedzeniem załadujesz zmienne środowiskowe GridEngine.
* * * * * . $SGE_ROOT/common/settings.sh && /usr/local/bin/azge autoscale -c /opt/cycle/gridengine/autoscale.json
Tworzenie klastra hybrydowego
Usługa CycleCloud obsługuje scenariusz cloud bursting. Konfiguracja podstawowa zakłada, że $SGE_ROOT katalog jest dostępny dla węzłów chmury. To założenie może być złagodzone przez ustawienie gridengine.shared.spool = false, gridengine.shared.bin = falsei zainstalowanie usługi GridEngine lokalnie.
Dla prostego przypadku należy zapewnić system plików, który węzły "execute" mogą zamontować. Ten system plików musi zawierać ... katalog, a montowanie skonfigurujesz w ustawieniach opcjonalnych. Po wydaniu zależności katalogów 'sched' oraz 'shared', można zamknąć węzeł harmonogramu, który domyślnie jest częścią klastra, i korzystać z konfiguracji znajdujących się w zewnętrznym systemie plików.
- Utwórz nowy klaster Gridengine.
- Wyłącz proxy zwrotny.
- Zastąp /sched i /shared zewnętrznymi systemami plików.
- Zapisz klaster.
- Usuń węzeł harmonogramu jako akcję w interfejsie użytkownika.
- Uruchom klaster. Początkowo nie uruchamia się żadnych węzłów.
- Skonfiguruj
cyclecloud-gridengineza pomocą autoscale.json w celu użycia nowego klastra
Korzystanie z Univa Grid Engine w usłudze CycleCloud
Projekt CycleCloud dla GridEngine domyślnie używa biblioteki sge-2011.11 . Możesz korzystać z własnych instalatorów Altair GridEngine zgodnie z umową licencyjną Altair. W tej sekcji opisano sposób korzystania z usługi Altair GridEngine z projektem CycleCloud GridEngine.
Wymagania wstępne
W tym przykładzie użyto wersji demonstracyjnej 8.6.1, ale obsługiwane są wszystkie wersje GE większe niż 8.4.0.
- Użytkownicy muszą podać pliki binarne ugE
- ge-8.6.x-bin-lx-amd64.tar.gz
- ge-8.6.x-common.tar.gz
- Należy skonfigurować interfejs wiersza polecenia CycleCloud. Dokumentacja jest dostępna tutaj
Skopiuj pliki binarne do przechowalni w chmurze
Uzupełniająca wersja AGE (8.6.7-demo) jest dystrybuowana z aplikacją CycleCloud. Aby użyć innej wersji, prześlij pliki binarne na konto magazynowania, które wykorzystuje CycleCloud.
$ azcopy cp ge-8.6.12-bin-lx-amd64.tar.gz https://<storage-account-name>.blob.core.windows.net/cyclecloud/gridengine/blobs/
$ azcopy cp ge-8.6.12-common.tar.gz https://<storage-account-name>.blob.core.windows.net/cyclecloud/gridengine/blobs/
Modyfikowanie konfiguracji do szablonu klastra
Utwórz lokalną kopię szablonu GridEngine i zmodyfikuj go tak, aby używał instalatorów UGE zamiast domyślnego.
wget https://raw.githubusercontent.com/Azure/cyclecloud-gridengine/master/templates/gridengine.txt
W pliku gridengine.txt znajdź pierwsze wystąpienie [[[configuration]]] i wstaw tekst, aby dopasować go do poniższego fragmentu kodu. Plik nie jest wrażliwy na wcięcie.
Uwaga
Szczegóły w konfiguracji, szczególnie w wersji, powinny być zgodne z nazwą pliku instalatora.
[[[configuration gridengine]]]
make = ge
version = 8.6.12-demo
root = /sched/ge/ge-8.6.12-demo
cell = "default"
sge_qmaster_port = "537"
sge_execd_port = "538"
sge_cluster_name = "grid1"
gid_range = "20000-20100"
qmaster_spool_dir = "/sched/ge/ge-8.6.12-demo/default/spool/qmaster"
execd_spool_dir = "/sched/ge/ge-8.6.12-demo/default/spool"
spooling_method = "berkeleydb"
shadow_host = ""
admin_mail = ""
idle_timeout = 300
managed_fs = true
shared.bin = true
ignore_fqdn = true
group.name = "sgeadmin"
group.gid = 536
user.name = "sgeadmin"
user.uid = 536
user.gid = 536
user.description = "SGE admin user"
user.home = "/shared/home/sgeadmin"
user.shell = "/bin/bash"
Te konfiguracje GridEngine zastępują domyślną wersję i lokalizację instalacji GridEngine po uruchomieniu klastra. Nie jest bezpieczne przeniesienie się z /sched, ponieważ jest to wspólna lokalizacja systemu plików NFS w klastrze.