AWS Machine LearningVeröffentlichung der Quelle

Leiht und nutzt Ressourcen zwischen Teams mit der Quotenverwaltung von AWS Batch für SageMaker-Training-Jobs

Mit der Einführung von AWS Batch erhalten Kunden Unterstützung für Amazon SageMaker-Trainingjobs. Dadurch erhalten sie eine vollständig verwaltete Methode, um Workloads für maschinelles Lernen (ML) zu warten, zu planen und wiederholen – ohne eigene Infrastruktur aufzubauen.

Mit der Einführung von AWS Batch erhalten Kunden Unterstützung für Amazon SageMaker-Trainingjobs. Dadurch erhalten sie eine vollständig verwaltete Methode, um Workloads für maschinelles Lernen (ML) zu warten, zu planen und wiederholen – ohne eigene Infrastruktur aufzubauen. Stattdessen nutzen sie die Funktionen zur Wartung und Planung von AWS Batch. Wenn Organisationen ihre künstliche Intelligenz- und maschinellen Lernoperationsen ausweiten und mehr Teams hinzufügen, kann die Koordination des Zugriffs auf gemeinsame Grafikprozessorkapazitäten zusätzliche Kommunikation, Koordination und Konfiguration für Administrator erfordern. Dazu gehören die Einrichtung separater Wartebereiche, die Anpassung von Kapazitätsgrenzen und die sorgfältige Organisation der richtigen Workloads, um die richtigen Ressourcen zur richtigen Zeit zu erhalten. Ein wesentlicher Vorteil von AWS Batch ist, dass es Kunden dabei hilft, den Einsatz ihrer Rechenkapazität zu erhöhen. Da die Trainingsumgebungen größer werden, steigt auch die Möglichkeit, mit der bestehenden Kapazität mehr zu erreichen.

Von Kunden, die mehrteilige Trainingsumgebungen verwalten, hörten wir eine konstante Anforderung: Wir sollen eine Möglichkeit haben, die Zuweisungen pro Team oder Projekt zu definieren, die ungenutzte Kapazität automatisch zu teilen und die mit der höchsten Priorität ausgeführte Arbeit zuerst durchzuführen. Diese Anforderung führte dazu, dass wir Quota-Management entwickelten, eine neue Planungsfunktion für AWS Batch. Administratoren können dies nutzen, um die Rechenkapazität in Quotenanteile aufzuteilen, die nach Team, Projekt oder Arbeitslast geordnet sind. Jeder Quotenanteil verwendet konfigurierbare Ressourcenteilungsstrategien, um die GPU-Nutzung zu maximieren und gleichzeitig die Zuweisungen jedes Teams zu berücksichtigen, wenn es am wichtigsten ist.

Dieser Artikel zeigt, wie die Quotenverwaltung funktioniert, einschließlich der Konfiguration von Quotenanteilen durch Lending- und Borrowing-Strategien, der Einrichtung einer In-Share-Prämienregelung für Prioritätsaufgaben sowie dem Start mit dem SageMaker Python SDK.

Quotenanteile und Vorkaufsrechte

Administratoren können eingeschränkte GPU-Ressourcen zuweisen und teilen, indem sie Quoten für separate Einheiten definieren, wie z. B. einzelne Teams oder Projekte. Jede Quotenverteilung umfasst Rechenquoten (Leistungsgrenzen) sowie Strategien für die gemeinsame Nutzung von Ressourcen für ungenutzten Rechenaufwand. Diese Strategien bestimmen, ob der ungenutzte Rechenaufwand reserviert wird, bis Arbeitsaufgaben eintreffen (RESERVE), an andere Quotenverteilungen verliehen wird, die Arbeit haben (LEND), oder sowohl reserviert als auch verliehen wird, wenn die Quotenverteilung Arbeit hat, die von Nutzen sein könnte (LEND_AND_BORROW).

Eine Quotenanteil funktioniert als virtuelle Warteschlange, die hierarchisch in einer verknüpften Job-Warteschlange angeordnet ist. Bei der Planung von Jobs für eine Job-Warteschlange priorisiert AWS Batch die Quotenanteile, die unter den Kapazitätsgrenzen liegen, während es durch die verknüpften Quotenanteile geht. Wenn Jobs in einem Quotenanteil eintreffen, dessen Kapazität bereits ausgeschöpft ist, führt AWS Batch eine Preemption zwischen den Anteilen durch. Dies erhält Ressourcen für die Quotenverteilung der Leasingkapazität, sodass Administratoren nicht notwendig sind, die Arbeitslasten, die Kapazität beanspruchen, zu überwachen und sie eigenständig zu beenden. Wenn Arbeitslasten in einer Quotenverteilung auftreten, die dem oder über dem Kapazitätslimit liegt, prüft AWS Batch, ob es verfügbare Kapazität aus einer anderen Quotenverteilung gibt. Wenn ja, können die Workloads unter Verwendung der sonst ungenutzten Kapazität laufen.

Sie können die prioritätsbasierte In-Share-Präemption aktivieren, wenn Sie eine Quota-Share-Konfiguration vornehmen. Wenn die Cross-Share-Präemption die geliehene Kapazität zurückholt, sobald Jobs in einer Quota-Share-Kapazitätsgrenze eintreffen, prüft die In-Share-Präemption Jobs mit niedrigerer Priorität im SCHEDULED-, STARTING- oder RUNNING-Zustand. Dadurch können Jobs mit höherer Priorität an der Spitze der Warteschlange früher starten.

Voraussetzungen

Bevor Sie mit diesem Beispiel fortfahren, müssen Sie eine AWS-Konto mit Berechtigungen haben, um AWS Batch-Ressourcen zu erstellen und zu verwalten. Für dieses Beispiel siehe die Beispiel-IAM-Berechtigungen, die erforderlich sind, um die AWS Batch- und SageMaker-APIs zu aufrufen.

Das Beispiel verwendet das SageMaker Python SDK v3. Führen Sie die erforderlichen Einrichtungen aus, um eine kompatible Version des SageMaker Python SDK zu installieren:

!pip install sagemaker

Konfiguration der Quotenverwaltungsressourcen

Die Verwendung der neuen Kapazitätsverwaltungsfunktionen erfordert die Erstellung einer Scheduling Policy, die eine quotaSharePolicy enthält, eine Service Environment, die ihre Kapazitätsbegrenzungen in Bezug auf bestimmte Instanzen festlegt, sowie eine SageMaker Training-Job-Queue, die mit beiden verbunden ist. Danach können Kapazitätsanteile einer Job-Queue zugeordnet werden. Die Benutzeranleitung enthält Beispiele für die AWS Command Line Interface (AWS CLI) und die Konsole zur Konfiguration von Kapazitätsverwaltungsressourcen sowie zur Kapazitätsanteile. Ein End-to-End-Beispiel für die Integration der Kapazitätsverwaltung mit dem aws_batch Modul im SageMaker Python SDK v3 befindet sich in einem Beispielnotizbuch. In diesem Beispiel durchlaufen wir Codeabschnitte, die die wichtigsten Komponenten zusammenfassen, und verwenden die Hilfsfunktionen aus dem Notizbuch, um eine Scheduling Policy, eine Service Environment, eine Job-Queue und drei Kapazitätsanteile zu erstellen.

Die drei Quota-Shares, die hier konfiguriert sind, bezeichnen drei verschiedene Projekte. Jedes hat eine gleich große Kapazitätsbegrenzung: eine einzelne ml.g5.xlarge Instanz. Der QS1-Quota-Share umfasst Hintergrundjobs. Für dieses Projekt möchten Sie den wichtigsten Hintergrundjob zuerst ausführen und so viel freie Kapazität wie möglich nutzen. Innerhalb dieses Quota-Shares sind keine Jobs dringend, und die Übernahme von Aufgaben ist akzeptabel, da alle Jobs Checkpointing verwenden. Dieser Quota-Share verwendet die LEND_AND_BORROW Ressourcennutzungsstrategie und hat die in-share-Übernahme aktiviert. Höhere Prioritätige Jobs innerhalb desselben Quota-Shares können dann die laufenden, niedriger Prioritätigen Jobs übernehmen.

from sagemaker.train.aws_batch.boto_client import get_batch_boto_client
from utils.aws_batch_resource_management import AwsBatchResourceManager, QuotaShareConfig, create_quota_management_resources

INSTANCE_TYPE = "ml.g5.xlarge"

# Create SchedulingPolicy, ServiceEnvironment, JobQueue, and QuotaShares
resource_manager = AwsBatchResourceManager(get_batch_boto_client())
qs1 = QuotaShareConfig(
    name="QS1",
    capacity_unit=INSTANCE_TYPE,
    max_capacity=1,
    in_share_preemption=True,
    sharing_strategy="LEND_AND_BORROW",
    borrow_limit=200
)

QS2 stellt Arbeitslasten mittlerer Priorität dar. Teams, die diese Konfiguration wählen, würden es bevorzugen, auf die Verfügbarkeit der Kapazität zu warten, anstatt weitere Vorräumungen zu ertragen. Diese Vorräumungen entstehen durch die Wiedererlangung ausgelieferter Kapazität oder durch in-share Vorräumungen aufgrund höherer Priorität der Job-Submissionen. Dies ist geeignet für kürzere Jobs oder wenn die meisten eingesendeten Jobs ähnliche Prioritäten haben. Die Quotenverteilung profitiert weiterhin davon, dass die Job-Priorität bei der Job-Ausgabe berücksichtigt wird. Die eingereichten Jobs aktivieren AWS Batch, damit die benötigte Kapazität zur Ausführung der Jobs zurückgezogen wird.

qs2 = QuotaShareConfig(
    name="QS2",
    capacity_unit=INSTANCE_TYPE,
    max_capacity=1,
    in_share_preemption=False,
    sharing_strategy="LEND"
)

QS3 repräsentiert Arbeitslasten, die so schnell wie möglich starten müssen, mit minimalen Unterbrechungen. Es ist konfiguriert, Kapazität zu reservieren, und leiht oder borght weder andere Quotenanteile noch gibt sie an. Es erlebt keine Cross-Share-Präemptions, da die Arbeitslasten ihre Kapazitätsgrenzen nicht überschreiten. Durch das Ausschalten der In-Share-Präemption werden auch die Arbeitslasten, die an diesen Quotenanteil gesendet werden, von AWS Batch nicht präemptiert, solange die Kapazitätsgrenze unverändert bleibt.

qs3 = QuotaShareConfig(
    name="QS3",
    capacity_unit=INSTANCE_TYPE,
    max_capacity=1,
    in_share_preemption=False,
    sharing_strategy="RESERVE"
)

Diese Quotenverteilungskonfigurationen sind Eingaben für die Funktion create_quota_management_resources im Beispielnotizbuch, die außerdem die entsprechende Planungsstrategie, den Dienstumfeld und die Job-Queue mit den gewählten Konstantennamen konfiguriert.

SCHEDULING_POLICY_NAME = "my-qm-scheduling-policy"
JOB_QUEUE_NAME = "my-sm-training-qm-jq"
SERVICE_ENVIRONMENT_NAME = "my-sm-training-qm-se"

resources = create_quota_management_resources(
    resource_manager=resource_manager,
    scheduling_policy_name=SCHEDULING_POLICY_NAME,
    job_queue_name=JOB_QUEUE_NAME,
    service_environment_name=SERVICE_ENVIRONMENT_NAME,
    capacity_unit=INSTANCE_TYPE,
    max_capacity=3,
    quota_share_configs=[qs1, qs2, qs3]
)

Senden Sie SageMaker-Trainingaufgaben an QS1

Der aws_batch Modul im SageMaker Python SDK wurde erweitert, um die programmierte Einreichung von SageMaker-Training-Jobs in eine AWS Batch-Job-Kurve mit Quotenverwaltung zu ermöglichen. Um diese neuen Funktionen zu demonstrieren, verwenden wir einen Hello World ModelTrainer, der in die Job-Kurve eingereicht wird. Der folgende Codeausschnitt identifiziert eine Bild-URI, die je nach ausgewähltem Region und Instanztyp verwendet werden kann.

import logging

logging.basicConfig(
    level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logging.getLogger("botocore.client").setLevel(level=logging.WARN)
logger = logging.getLogger(__name__)

from sagemaker.core.helper.session_helper import Session
from sagemaker.core import image_uris

session = Session()

image_uri = image_uris.retrieve(
    framework="pytorch",
    region=session.boto_session.region_name,
    version="2.5",
    instance_type=INSTANCE_TYPE,
    image_scope="training",
)

Wir verwenden diesen Bild-URI in einem einfachen Hello-World-Modelltrainer-Beispiel:

from sagemaker.train.model_trainer import ModelTrainer
from sagemaker.train.configs import SourceCode, Compute, StoppingCondition

TRAINING_JOB_NAME = "hello-world-simple-job"
MAX_RUN_TIME = 300

source_code = SourceCode(command="echo 'Hello World'")

model_trainer = ModelTrainer(
    training_image=image_uri,
    source_code=source_code,
    base_job_name=TRAINING_JOB_NAME,
    compute=Compute(instance_type=INSTANCE_TYPE, instance_count=INSTANCE_COUNT),
    stopping_condition=StoppingCondition(max_runtime_in_seconds=MAX_RUN_TIME),
)

Um die Job-Queue im SageMaker Python SDK zu verwenden, geben Sie den Namen der Queue an den TrainingQueue-Konstruktor innerhalb des aws_batch-Moduls.

from sagemaker.train.aws_batch.training_queue import TrainingQueue, TrainingQueuedJob

# Construct the queue object using the SageMaker Python SDK
queue = TrainingQueue(JOB_QUEUE_NAME)
logger.info(f"Using queue: {queue.queue_name}")

Wir können dann drei Jobs an QS1 senden, unsere Quotenverteilung für Hintergrundjobs. Der zuletzt gesendete Job hat die höchste Priorität, gefolgt von dem mit mittlerer Priorität, und schließlich dem mit der niedrigsten Priorität. Da im Moment nichts in QS1 oder QS2 läuft, sollten zwei Instanzen von Jobs starten, was den ersten und zweiten gesendeten Jobs entspricht (da sie die höchste relative Priorität hatten). Beachten Sie, dass dies nur ein „Hello World“-Trainingjob ist, der keine Daten benötigt, aber typischerweise erfordert ein ModelTrainer Daten für das Training.

from utils.aws_batch_resource_management import JobStatus, await_jobs, list_jobs_by_quota_share

# Submit three jobs to QS1, all with different priorities to guarantee dispatch ordering.
qs1_job_high: TrainingQueuedJob = queue.submit(job_name="qs1_job_high", training_job=model_trainer, quota_share_name=qs1.name, priority=3, inputs=None)
qs1_job_med: TrainingQueuedJob = queue.submit(job_name="qs1_job_med", training_job=model_trainer, quota_share_name=qs1.name, priority=2, inputs=None)
qs1_job_low: TrainingQueuedJob = queue.submit(job_name="qs1_job_low", training_job=model_trainer, quota_share_name=qs1.name, priority=1, inputs=None)

logger.info(f"Submitted jobs: {qs1_job_high.job_name}, {qs1_job_med.job_name}, {qs1_job_low.job_name}")
logger.info(f"Waiting for jobs to transition...")

# qs1_job_high is dispatched first using capacity from QS1, and qs1_job_med is dispatched second borrowing idle capacity from QS2
await_jobs([([qs1_job_high, qs1_job_med], JobStatus.dispatched() | JobStatus.terminal())])
list_jobs_by_quota_share(queue, [qs1.name, qs2.name, qs3.name], JobStatus.active())

Die Eingabe von Jobs an QS2 führt zu einer Cross-Share-Begrenzung, um die verliehene Kapazität zurückzuholen

Die Teammitglieder, die für QS2 verantwortlich sind, könnten feststellen, dass sie Arbeit zu erledigen haben, und eine Aufgabe an QS2 übergeben. Dadurch wird die Kapazität von QS1 zurückgeholt, die derzeit diese Kapazität ausleiht (die Kapazität von QS3 ist nicht so konfiguriert, dass sie ausgeliehen werden kann). Dies ist eine cross-share-Preemption.

# When a job is submitted to QS2, it will preempt its capacity back from QS1
qs2_job_1: TrainingQueuedJob = queue.submit(job_name="qs2_job_1", training_job=model_trainer, quota_share_name=qs2.name, priority=1, inputs=None)

logger.info(f"Submitted job {qs2_job_1.job_name}")
logger.info(f"Waiting for jobs to transition...")

await_jobs([
    ([qs2_job_1], JobStatus.dispatched() | JobStatus.terminal()),
    ([qs1_job_med], {JobStatus.RUNNABLE}) # Lowest priority QS1 job will be preempted
])
list_jobs_by_quota_share(queue, [qs1.name, qs2.name, qs3.name], JobStatus.active())

Die Aktualisierung der Jobprioritäten in QS1 löst eine In-Share-Präemption aus, sodass die mit höchster Priorität angeforderten Jobs ausgeführt werden.

Wenn ein Wissenschaftler erkennt, dass die qs1_job_low-Arbeitsaufgabe in QS1, die noch lauffähig ist, aufgrund von Veränderungen der Prioritäten jetzt starten muss, kann er die neue UpdateServiceJob API verwenden, um die Priorität einer bereits eingereichten Arbeitsaufgabe in QS1 zu erhöhen. Da es keine verfügbare Kapazität gibt, kann dies eine In-Share-Preemption auslösen, sodass die derzeit laufende Arbeitsaufgabe unterbrochen wird und qs1_job_low beginnen kann.

# Updating qs1_job_low to be the highest priority job in QS1
qs1_job_low.update(scheduling_priority=4)

logger.info(f"Updated job {qs1_job_low.job_name} to increase its priority")
logger.info(f"Waiting for jobs to transition...")

await_jobs([
    ([qs1_job_low], JobStatus.dispatched() | JobStatus.terminal()),
    ([qs1_job_high], {JobStatus.RUNNABLE}) # High priority job will preempt lower priority jobs within the same quota share
])
list_jobs_by_quota_share(queue, [qs1.name, qs2.name, qs3.name], JobStatus.active())

(Opcional) Reinigen der erstellten Ressourcen

Um die in diesem Beitrag erstellten Ressourcen zu bereinigen, führen Sie den folgenden Code aus:

from utils.aws_batch_resource_management import delete_resources

delete_resources(resource_manager, resources)

Schlussfolgerung

In diesem Beitrag haben wir die Quotenverwaltung, eine neue Planungsfunktion in AWS Batch sowie wie man sie mit SageMaker Training-Jobs verwendet und mit der Einrichtung von Quotenanteilen für eigene Projekte beginnt, behandelt. Für weitere Details siehe die AWS Batch Quotenverwaltungs-Erweiterungshandbuch.

AWS Batch mit Quotenverwaltung kann Ihre Organisation dabei unterstützen, die Rechenleistung zu erhöhen und die Teams sowie Arbeitslasten effektiver zu priorisieren, wodurch Zeit für die Infrastrukturanlagenverwalter und ML-Wissenschaftler frei wird. Durch die Implementierung von Quotenverwaltung können Ihre Teams sich auf ihre Arbeitslasten konzentrieren und die Zeit, die sie für die Verwaltung und Koordination der Infrastruktur verwenden, reduzieren. Diese Fähigkeit ist besonders leistungsfähig mit den Amazon SageMaker AI-Trainingplänen, sodass Ihre Organisation die Kapazität in der erforderlichen Menge und zum gewünschten Zeitpunkt reservieren kann. Durch die Verwendung von AWS Batch mit SageMaker AI können Sie das Trainingplan voll ausnutzen. Wir empfehlen Ihnen, diese neue Fähigkeit auszuprobieren, damit sie einen bedeutenden Einfluss auf Ihre Betriebsabläufe haben kann.

 


Über die Autoren

Originalquelle

AWS Machine Learning

Hinweise zum Inhalt

Originalveröffentlichung und Rechte liegen bei der Quelle.

Maschinelle Übersetzung · Original beachten