Pathways è un sistema progettato per consentire la creazione di sistemi di machine learning su larga scala, multi-task e attivati in modo sparso. Consente l'utilizzo di migliaia o decine di migliaia di acceleratori, con la possibilità di allocare dinamicamente quantità variabili di calcolo per diverse attività in base ai loro requisiti di elaborazione.
Pathways semplifica i calcoli di machine learning su larga scala consentendo a un singolo client JAX di orchestrare i carichi di lavoro su più slice TPU di grandi dimensioni, potenzialmente su migliaia di chip TPU.
Pathways viene utilizzato internamente da Google per addestrare modelli di grandi dimensioni come Gemini. I percorsi su Cloud offrono gli stessi vantaggi ai clienti di Google Cloud .
Prima di iniziare
Assicurati di avere:
- Strumenti Kubernetes installati
- Installazione di gcloud CLI
- Abilitato l'API TPU
- Abilitato l'API Google Kubernetes Engine
Questo documento fornisce una panoramica di come utilizzare le TPU gestite Pathways su Google Kubernetes Engine (GKE) per carichi di lavoro batch, in tempo reale e interattivi. Presuppone che tu abbia già familiarità con l'utilizzo delle TPU con GKE, incluse le TPU single-slice e multi-slice su Google Kubernetes Engine, nonché esperienza generale con le TPU multi-slice.
Singolo controller e più controller
Esistono principalmente due modi diversi per gestire e orchestrare i calcoli su più dispositivi:
Funzionalità |
Singolo controller (percorsi) |
Multi-controller (JAX Default) |
Controllo |
Punto di controllo unico: un singolo programma client funge da controller centrale. |
Controllo distribuito: partecipano più processi, ognuno con la propria istanza dell'interprete Python. |
Visualizza |
Visualizzazione unificata: il client vede tutti i dispositivi come un unico sistema unificato. |
Visualizzazione localizzata: ogni processo Python vede solo i dispositivi a cui è connesso. |
Programmazione |
Programmazione semplificata: gli utenti interagiscono con un singolo client, facendo apparire il sistema come un'unica macchina di grandi dimensioni con molti acceleratori locali. |
SPMD: utilizza principalmente il paradigma SPMD, che richiede l'esecuzione dello stesso programma su tutti i dispositivi. |
Flessibilità |
Supporta pattern di calcolo più complessi oltre a SPMD, tra cui parallelismo della pipeline asimmetrico e sparsità computazionale. |
Può essere meno flessibile nella gestione delle risorse, soprattutto tra diverse sezioni TPU. |
Componenti di Pathways
La sezione seguente descrive i componenti principali dell'architettura Pathways.
Resource Manager di Pathways
Si tratta del control plane centrale del sistema Pathways. Gestisce tutte le risorse dell'acceleratore ed è responsabile del coordinamento dell'allocazione degli acceleratori per i job utente. Monitora l'integrità dei worker e gestisce la pianificazione, la sospensione e la ripresa dei job. Funge da unico punto di contatto per errori e stato del sistema. Questo componente richiede solo risorse CPU.
Client Pathways
Si tratta di un'implementazione di Interim Framework Runtime (IFRT) che funge da punto di accesso al sistema Pathways. Riceve operazioni di alto livello (HLO) dal tuo programma. Il client Pathways è responsabile del coordinamento con il gestore delle risorse Pathways per determinare dove inserire i programmi compilati per l'esecuzione in base al codice utente. Presenta una visualizzazione unificata del sistema a un determinato client JAX. Questo componente richiede solo risorse CPU.
Operatore di Pathways
Si tratta dei processi eseguiti sulle macchine acceleratrici (VM TPU). Ricevono eseguibili compilati del tuo programma dal server proxy IFRT ed eseguono i calcoli sulle TPU. I worker di Pathways inviano i dati al tuo programma tramite il server proxy IFRT. Questo componente richiede risorse di accelerazione.
Client proxy IFRT
Si tratta di un'implementazione OSS dell'API Interim Framework Runtime (IFRT) che separa il codice utente dal runtime sottostante e migliora la portabilità e la trasparenza del codice. JAX utilizza questa implementazione come alternativa al runtime multi-controller predefinito. Il client proxy IFRT funge da ponte di comunicazione tra il tuo programma e i componenti di Pathways. Invia richieste al server proxy IFRT e riceve i risultati. È un'implementazione OSS dell'API IFRT. Questo componente richiede solo risorse CPU.
Server proxy IFRT
Questo server gRPC riceve le richieste dal client proxy IFRT e le inoltra al client Pathways, che gestisce la distribuzione effettiva del lavoro. Questo componente richiede solo risorse CPU.
Server sidecar
Questo server gRPC si trova insieme al worker Pathways sulla VM dell'acceleratore per eseguire il codice Python specificato dall'utente direttamente sulla VM dell'acceleratore, in modo da ridurre la latenza di trasferimento dei dati dal controller agli acceleratori. Il server sidecar interagisce con il worker Pathways tramite un protocollo con controllo delle versioni personalizzato sul trasporto gRPC.
API PathwaysJob
L'API PathwaysJob è un'API OSS
nativa di Kubernetes che utilizzi per eseguire il deployment dei workload di addestramento ML e inferenza batch. Il controller per PathwaysJob utilizza l'API JobSet per gestire il ciclo di vita e il coordinamento di tutti i componenti di Pathways. Questa definizione di risorsa personalizzata (CRD) fornisce un'interfaccia di alto livello per definire i carichi di lavoro di Pathways, eliminando la necessità di gestire direttamente le specifiche dei singoli pod per gli scenari comuni. Per un elenco completo di tutti i parametri
e dei loro significati specifici, consulta la documentazione dell'API PathwaysJob su GitHub.
apiVersion: pathways-job.pathways.domain/v1 kind: PathwaysJob metadata: name: pathways-USER spec: maxRestarts: MAX_RESTARTS pathwaysVersion: jax-JAX_VERSION workers: - type: $(TPU_MACHINE_TYPE) topology: $(TOPOLOGY) numSlices: $(WORKLOAD_NODEPOOL_COUNT) maxSliceRestarts: # Optional customComponents: # This section is completely optional - componentType: proxy_server image: CUSTOM_PROXY_SERVER customFlags: - --flag_name_1=value_1 customEnv: - name: key_1 value: value_1 - componentType: pathways_server image: CUSTOM_PATHWAYS_SERVER customFlags: - --flag_name_1=value_1 customEnv: - name: key_1 value: value_1 - componentType: worker image: CUSTOM_WORKER customFlags: - --flag_name_1=value_1 customEnv: - name: key_1 value: value_1 - componentType: colocated_python_sidecar image: CUSTOM_SIDECAR_IMAGE customFlags: - --flag_name_1=value_1 customEnv: - name: key_1 value: value_1 pathwaysDir: "gs://BUCKET_NAME" # Pre-create this bucket. controller: deploymentMode: default # Default mode deploys pathways cpu resources (resource # manager and proxy server) on a dedicated CPU node, recommended for training elasticSlices: ELASTIC_SLICES template: spec: containers: - name: main image: python:3.11 command: - bash - -c - | pip install pathwaysutils python3 -c 'import pathwaysutils; import jax; pathwaysutils.initialize(); print(jax.devices())'
La seguente tabella descrive le impostazioni per l'API PathwaysJob:
| Attributo | Descrizione |
|---|---|
apiVersion |
Specifica la versione API per la definizione di risorsa personalizzata (CRD) PathwaysJob: pathways-job.pathways.domain/v1. |
kind |
Identifica l'oggetto Kubernetes come PathwaysJob. |
metadata.name |
Il nome dell'oggetto PathwaysJob in Kubernetes, in genere seguendo il pattern percorsi- |
spec |
Definisce lo stato e la configurazione desiderati per PathwaysJob. |
spec.maxRestarts |
Il numero massimo di volte in cui PathwaysJob può essere riavviato automaticamente dal sistema in caso di errori. |
spec.pathwaysVersion |
(Facoltativo) Specifica la versione desiderata del framework JAX da utilizzare nell'ambiente Pathways per questo job (ad esempio jax-0.5.3). |
spec.workers |
Un array che definisce la configurazione del pool di worker di PathwaysJob, in genere utilizzando risorse TPU. |
spec.workers[].type |
Il tipo di macchina TPU da utilizzare per i nodi worker (ad esempio, $TPU_MACHINE_TYPE potrebbe essere ct6e-standard-4t) |
spec.workers[].topology |
La topologia delle sezioni TPU allocate ai worker (ad esempio, $TOPOLOGY potrebbe essere 2x2, 4x4, 2x2x2). |
spec.workers[].numSlices |
Il numero di slice TPU da eseguire il provisioning per il pool di worker (ad esempio, $WORKLOAD_NODEPOOL_COUNT potrebbe essere 2). |
spec.workers[].maxSliceRestarts |
(Facoltativo) Il numero massimo di volte in cui un singolo worker all'interno di una sezione può essere riavviato in caso di errore. |
spec.customComponents |
(Facoltativo) Un array che ti consente di definire ed eseguire il deployment di componenti personalizzati (come server proxy, server Pathways o worker aggiuntivi) insieme al job principale. |
spec.customComponents[].componentType |
Specifica il tipo di componente personalizzato in fase di definizione (ad esempio proxy_server, pathways_server, worker, colocated_python_sidecar). |
spec.customComponents[].image |
L'immagine Docker da utilizzare per il container di questo componente personalizzato. |
spec.customComponents[].customFlags |
Un array di flag della riga di comando personalizzati che verranno passati al container all'avvio. |
spec.customComponents[].customEnv |
Un array di variabili di ambiente personalizzate da impostare all'interno del container. Ogni elemento ha un nome e un valore. |
spec.pathwaysDir |
Il bucket Cloud Storage utilizzato da PathwaysJob per
archiviare gli artefatti di compilazione e altri dati temporanei.
Questo bucket deve essere creato prima di eseguire il workload. |
spec.controller |
Impostazioni di configurazione del controller dei percorsi, che gestisce l'esecuzione complessiva del job. |
spec.controller.deploymentMode |
Specifica come vengono implementate le risorse CPU del controller Pathways (Pathways resource manager e server proxy). La modalità predefinita li esegue il deployment su un nodo CPU dedicato, mentre colocate_head_with_workers li esegue il deployment insieme a un worker TPU. |
spec.controller.elasticSlices |
(Facoltativo) Il numero massimo di slice TPU che possono diventare non disponibili durante l'esecuzione del job prima che venga considerato non integro. |
spec.controller.template |
(Facoltativo) Definisce il modello di pod per il job dell'utente. Questo è necessario per i workload batch, ma non per quelli interattivi. |
spec.controller.template.spec |
La specifica del pod per il job utente. |
spec.controller.template.spec.containers |
Un array che definisce i container che verranno eseguiti all'interno del job utente |
spec.controller.template.spec.containers[].name |
Il nome del contenitore all'interno del job utente (in questo esempio, è main). |
spec.controller.template.spec.containers[].image |
L'immagine Docker da utilizzare per il container nel container principale (in questo esempio, python:3.11). |
spec.controller.template.spec.containers[].command |
Il comando da eseguire all'avvio del container principale. In questo esempio, installa `pathwaysutils`, inizializza Pathways e stampa i dispositivi JAX. |
Componenti di Pathways su GKE
Questa sezione mappa i componenti di Pathways ai componenti di Google Kubernetes Engine come container e pod.
Puoi trovare le immagini container di Pathways nelle seguenti posizioni.
Tipo di contenitore |
Località |
Server proxy IFRT |
|
Resource Manager/worker di Pathways |
|
Resource Manager di Pathways
Dopo aver creato un cluster GKE, puoi utilizzare il seguente containerSpec per eseguire il deployment di Resource Manager per i percorsi:
- name: pathways-rm image: us-docker.pkg.dev/cloud-tpu-v2-images/pathways/server:latest imagePullPolicy: Always env: - name: HOST_ADDRESS valueFrom: fieldRef: fieldPath: "metadata.labels['jobset.sigs.k8s.io/coordinator']" - name: TPU_SKIP_MDS_QUERY value: "true" args: - --server_port=29001 - --node_type=resource_manager - --instance_count=WORKLOAD_NODEPOOL_COUNT - --instance_type=SLICE_TOPOLOGY - --gcs_scratch_location=gs://BUCKET_NAME
Descrizioni degli argomenti:
--server_port: Resource Manager di Pathways utilizza questa porta per comunicare con altri componenti di Pathways.--node_type: il tipo di nodo. Deve essere impostato su "resource_manager" per il gestore delle risorse di Pathways e non è necessario per gli altri contenitori.--instance_count: il numero di sezioni TPU.--instance_type: il tipo di TPU e la topologia della sezione. Nel formatotpu{TPU type}:{TPU topology}, ad esempiotpuv5e:4x4.--gcs_scratch_location: un bucket Cloud Storage utilizzato per i file temporanei.
Server proxy IFRT
Puoi utilizzare il seguente containerSpec per eseguire il deployment di un server proxy IFRT:
- name: pathways-proxy image: us-docker.pkg.dev/cloud-tpu-v2-images/pathways/proxy_server:latest imagePullPolicy: Always env: - name: PATHWAYS_HEAD valueFrom: fieldRef: fieldPath: "metadata.labels['jobset.sigs.k8s.io/coordinator']" args: - --resource_manager_address=$(PATHWAYS_HEAD):29001 - --server_port=29000 - --gcs_scratch_location=gs://BUCKET_NAME ports: - containerPort: 29000
Descrizioni degli argomenti:
--resource_manager_address: l'hostname e la porta utilizzati dal server proxy per comunicare con Pathways Resource Manager. La porta deve essere la stessa del valore--server_portutilizzato per il contenitore di Pathways Resource Manager.--server_port: il server proxy IFRT utilizza questa porta per comunicare con il client proxy IFRT.--gcs_scratch_location: un bucket GCS utilizzato per i file temporanei.
Operatore di Pathways
Puoi utilizzare i seguenti containerSpec per eseguire il deployment dei worker di Pathways:
- name: worker image: us-docker.pkg.dev/cloud-tpu-v2-images/pathways/server:latest imagePullPolicy: Always env: - name: PATHWAYS_HEAD valueFrom: fieldRef: fieldPath: "metadata.labels['jobset.sigs.k8s.io/coordinator']" - name: MEGASCALE_NUM_SLICES valueFrom: fieldRef: fieldPath: "metadata.labels['jobset.sigs.k8s.io/replicatedjob-replicas']" - name: MEGASCALE_SLICE_ID valueFrom: fieldRef: fieldPath: "metadata.labels['jobset.sigs.k8s.io/job-index']" - name: MEGASCALE_COORDINATOR_ADDRESS value: "$(PATHWAYS_HEAD)" args: - --server_port=29001 - --resource_manager_address=$(PATHWAYS_HEAD):29001 - --gcs_scratch_location=gs://BUCKET_NAME ports: - containerPort: 29001 resources: limits: google.com/tpu: "4"
Descrizioni degli argomenti:
--resource_manager_address: l'hostname e la porta utilizzati dai worker TPU per comunicare con il gestore delle risorse Pathways. La porta deve essere la stessa del valore--server_portutilizzato per il contenitore di Pathways Resource Manager--server_port: i worker utilizzano questa porta per comunicare con il server proxy e il gestore delle risorse di Pathways.--gcs_scratch_location: un bucket Cloud Storage utilizzato per i file temporanei.
Il gestore delle risorse di Pathways, il server proxy IFRT e i worker di Pathways possono avere porte diverse, ma in questo esempio il gestore delle risorse di Pathways e il worker di Pathways condividono la stessa porta.
Passaggi successivi
- Crea un cluster GKE con Pathways
- Esegui un carico di lavoro batch con Pathways
- Eseguire l'inferenza multihost utilizzando Pathways
- Eseguire un carico di lavoro interattivo con Pathways
- Formazione resiliente con Pathways
- Portare i carichi di lavoro JAX su Pathways
- Risolvi i problemi relativi ai percorsi sul cloud