Generated banner for Pathways Workload
Generated logo for Pathways Workload

Pathways Workload

GoogleOfficialPublished by Google

  • Skill
  • Review and audit
  • Software development
  • Apache-2.0
  • Low risk
  • Has scripts

From the author

Debugs failed, crashing or hung Pathways on Cloud workloads (JAX training or inference on Cloud TPU in GKE, run as a JobSet, PathwaysJob or LeaderWorkerSet). Reads Cloud Logging for every Pathways container (user workload, IFRT proxy, pathways-rm, pathways-worker, colocated Python sidecar), node kernel logs and GKE events, then reports the earliest real error, the root cause and a fix. Use when a Pathways workload fails to start, crashes, restarts or stops making progress, or shows errors such as IFRT proxy connection failures, DEADLINE_EXCEEDED lost connection to peer, host OOM kills, ImagePullBackOff, or JAX and Pathways version mismatches. Don't use for GKE workloads that don't use Pathways, or for creating clusters or deploying new Pathways workloads.
— the description by Google

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured approach to diagnosing issues with Pathways on Cloud workloads, such as JAX training or inference running on Cloud TPUs in GKE. It utilizes a provided script to aggregate and analyze logs from various components, including the IFRT proxy, resource manager, workers, and sidecars. The workflow emphasizes identifying the earliest error in the system to determine the root cause, distinguishing it from downstream symptoms like connection failures or SIGTERMs. It includes specific playbooks for different container types and common failure scenarios.

What it does

  • Automates log collection and analysis across multiple Pathways components.
  • Identifies the root cause by pinpointing the earliest error in a distributed system.
  • Provides specific debugging playbooks for user workloads, proxies, resource managers, and workers.
  • Diagnoses GKE scheduling issues, infrastructure interruptions, and OOM kills.
  • Offers guidance on handling common failure patterns like version mismatches and connectivity errors.

When to use it

  • When a Pathways workload fails to start, crashes, or stops making progress.
  • When encountering errors like IFRT proxy connection failures, DEADLINE_EXCEEDED, or host OOM kills.
  • When investigating unexpected restarts or SIGTERM events in a JobSet or LeaderWorkerSet.
  • When JAX and Pathways version mismatches are suspected.

Advantages

  • Reduces manual log searching by centralizing queries across distributed containers.
  • Prevents chasing downstream symptoms by enforcing an 'earliest error' debugging methodology.
  • Provides clear, actionable steps for complex distributed system failures.
  • Includes built-in support for common GKE and TPU-specific failure modes.

Usage examples

“My Pathways JobSet is stuck in a suspended state, how do I debug it?”
The agent will guide you to check the JobSet controller manager logs in the jobset-system namespace and use the debug_workload script with the --action=summary flag to identify configuration or validation errors.
“My JAX training job crashed with a connection error to the IFRT proxy.”
The agent will instruct you to verify if the proxy server started successfully using the debug_workload script, then check the resource manager and worker logs to find the root cause of the connection termination.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/google/pathways-workload/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip pathways-workload.zip -d .agents/skills

Documentation by Google

Pathways on Cloud Workload Debugging Skill

This skill provides comprehensive instructions, debugging playbooks, and helper utilities to troubleshoot Pathways on Cloud GKE workloads.

Usage Attribution

MUST READ: Before executing any gcloud, REST API, or MCP command, you MUST read and follow the instructions in Usage Attribution.


Overview

Pathways: Pathways on Cloud Introduction

Understanding Initial Setup for JAX+Pathways on Cloud

A GKE cluster is required to use Pathways. We have instructions to create one which utilize either 1) a one click setup like XPK or 2) a series of gcloud commands here: https://docs.cloud.google.com/ai-hypercomputer/docs/workloads/pathways-on-cloud/create-gke-cluster

Advanced customers have built custom infrastructure which rolls Pathways based JobSets and cluster creation commands. To debug their infra issues, we may want to ask them to share their jobset YAMLs with us (redacting their main container definition is fine).

Parsing Important Logs

How to determine if various Pathways components have started successfully

IFRT Proxy Server (a.k.a Pathways Client) Ready

IFRT proxy server started with status OK

Pathways worker Ready: Pathways Server serving on [::]:29001

RM (Resource Manager) Ready and eventually all TPU slices are ready

Pathways Server serving on [::]:29001
...
...
***<num slices>/<num slices> Pathways Slices Now Ready ***

Individual Pathways worker (on a TPU host) Ready

Pathways Server serving on [::]:29001

Step 1: Metadata & Configuration Gathering

Before initiating debugging, gather critical parameters to construct accurate queries: 1. project 2. cluster_name 3. location 4. the workload name and kind (see Identifying the Workload) 5. namespace (default: default) 6. issue_time (UTC, when the failure was first noticed)

Always bound log queries in time. Use the window [issue_time - 30m, issue_time + 30m], i.e. pass --start_time="{start_time}" --duration=1h to the debug_workload script, where {start_time} is issue_time - 30m in RFC 3339 (e.g. 2026-10-22T11:10:00Z). Unbounded queries are slow and get truncated by --limit. Widen the window only if the first error is not in it.

  • If the window contains more than one failure, report each with timestamps and say which one matches the user's symptom.

  • Report the root cause and the workaround separately. The root cause is the component that logged the earliest stall or error (for example the proxy, the RM or a worker). A configuration change that avoids that code path (a different checkpoint handler, flag or topology) is a workaround or a contributing factor: list it under the fix, not as the root cause.

  • When you compare with other runs (an earlier attempt, a sibling test that passed, or the same test on other days), use the comparison to narrow down which code path is affected, not as proof of the cause. A setting that differs in a passing run does not explain the failure if a Pathways component logged the stall or error.

  • End the report with the checks you ran and their result, so the user can repeat them: preflight, the actions or gcloud logging read queries you used (with their time window), pod events, and node OOMs. Include checks that failed or could not run (e.g. no log access) and say what to run instead.

[!TIP]

Always check the recent chat context or shared log queries from the user. Often, all five fields can be directly scraped from their console links or queries!

Identifying the Workload

The debug_workload script finds the workload's logs by the object that created its pods. Use the matching flag (the examples in this skill use --jobset_name):

Workload kindFlagFind it with
JobSet (most training workloads, XPK)--jobset_name=<name>kubectl get jobsets -n {namespace}
LeaderWorkerSet (e.g. Pathways inference)--lws_name=<name>kubectl get leaderworkersets -n {namespace}
Plain Job (not created by a JobSet)--job_name=<name>kubectl get jobs -n {namespace} -l '!jobset.sigs.k8s.io/jobset-name'
Anything else (bare pods, custom controllers)--pod_prefix=<prefix>kubectl get pods -n {namespace}

For past incidents, list the pods that logged in the window and their owner labels instead:

gcloud logging read 'resource.type="k8s_container"
  resource.labels.cluster_name="{cluster_name}"
  resource.labels.namespace_name="{namespace}"
  timestamp>="{start_time}" timestamp<="{end_time}"' \
  --project="{project}" --limit=10000 \
  --format='value(resource.labels.pod_name,labels."k8s-pod/jobset_sigs_k8s_io/jobset-name",labels."k8s-pod/leaderworkerset_sigs_k8s_io/name",labels."k8s-pod/batch_kubernetes_io/job-name")' \
  | sort -u

If parts of the workload run in different objects, query them together by repeating --workload=<kind>:<name> (kinds: jobset, lws, job, pod). For example, if the JAX client or the proxy runs in its own Job next to the Pathways JobSet, debug both: --workload=jobset:{jobset_name} --workload=job:{client_job_name}.

To see what else ran on the same nodes, run scripts/debug_workload.py with --action=neighbors --execute. It lists every namespace/pod/container that logged on the workload's nodes and marks the ones that are not part of the workload. Use it to spot another workload sharing the hosts (e.g. a second resource manager or proxy on the same host and port when host exclusivity is not set) and to find the real container names of the workload's pods (e.g. a custom-named colocated Python sidecar).

Retrieving Active YAML Configuration

If the workload is still active/alive, run the following command to inspect how it is structured and identify misconfigurations (use leaderworkerset or job instead of jobset for those kinds):

kubectl get jobset {jobset_name} -n {namespace} -o yaml

If the workload has been deleted but you suspect misconfiguration, request the user to paste or share the workload YAML in the chat.

Recording Versions

Before reading errors, record each component's image tag (from the YAML or the pod spec) and Build label (logged at startup by pathways-rm, pathways-proxy and pathways-worker), plus the client's JAX, jaxlib and pathwaysutils versions. Check that they are from matching releases and that the flags passed to each component exist in its image.


Step 1.5: Quick Triage - Preflight, Then Crash Sweep

First run the preflight check. It verifies that you can read the project's logs and that the workload logged in the time window. An empty result from any other action is not a clean result until preflight passes. If you cannot run commands yourself (for example no log access) and give the user a plan or a list of commands instead, start that plan with the preflight command:

python3 scripts/debug_workload.py \
  --project="{project}" \
  --cluster_name="{cluster_name}" \
  --location="{location}" \
  --jobset_name="{jobset_name}" \
  --start_time="{start_time}" --duration=1h \
  --action=preflight

Then, before reading containers one by one, run the crash and fatal-error sweep across all containers of the workload. It looks for segfaults, Check failed, Python tracebacks, OOM kills, unknown flags, permission errors, etc., and returns the earliest hits first:

python3 scripts/debug_workload.py \
  --project="{project}" \
  --cluster_name="{cluster_name}" \
  --location="{location}" \
  --jobset_name="{jobset_name}" \
  --start_time="{start_time}" --duration=1h \
  --action=errors \
  --execute

The container of the earliest hit is usually where the root cause is; then use the container-specific playbook in Step 3 for that container. If the sweep is empty, also run --action=node-ooms (OOM kills often do not appear in container logs) and --action=pod-events.

If a cascade fills the output (hundreds of pods logging the same error), you may add --first_per_pod=N to keep only the first N matching log lines of each pod/container plus its last matching line, e.g. --first_per_pod=1 to see which pod failed first and how the failure spread, or --first_per_pod=3 to also see each pod's next few lines. Use it at your discretion: it fetches up to --fetch_limit lines (default 1000) before grouping, so it is slower than a plain query and can be slow or time out when the workload has many pods. Narrow the time window first, and prefer a plain query when only a few pods are involved. Never conclude "no crash" from a --first_per_pod sweep alone: it skips lines in the middle of each pod's log, and the fetch limit can cut off later pods. Confirm with a plain query on the suspect container.


Step 2: GKE JobSet Lifecycle Verification

If the workload has not started or failed immediately at scheduling time:

1. Verify Webhook & Scheduling Status

Identify if scheduling blocks are occurring due to insufficient cluster resources or webhook failures.

Check for webhook mutating errors, OOMKilled controller managers, or Unschedulable conditions:

# Check controller manager pods in the JobSet system namespace
kubectl get pods -n jobset-system
2. Symptom: Forever Suspended JobSet

If a JobSet is created but remains in a permanently Suspended state and never spawns child pods:

  • Potential Root Causes:

    • The JobSet name is too long. Because JobSet appends replicated job names and index numbers to child resources, long prefixes fail standard Kubernetes resource name validation (max 63/253 chars).

    • The JobSet YAML is malformed (e.g. invalid or missing fields, wrong resource requests or node selectors), so the workload is never admitted to the queue and stays suspended. Ask the user for the YAML (see Retrieving Active YAML Configuration) and check it for errors.

  • Diagnosis: Check the JobSet controller manager logs in jobset-system namespace to find truncation, length limit, name-generation, or validation errors. You can use the debug_workload script to quickly query the logs:

python3 scripts/debug_workload.py \
  --project="{project}" \
  --cluster_name="{cluster_name}" \
  --location="{location}" \
  --jobset_name="{jobset_name}" \
  --start_time="{start_time}" --duration=1h \
  --action=summary \
  --execute
3. SIGTERM and Pre-emption Diagnosis
  • SIGTERMs are the most common mechanism for GKE to stop/restart workloads. A SIGTERM is a symptom; find out who sent it.

  • Common senders: Spot VM preemption, Compute Engine host maintenance, host errors, node auto-repair, or a JobSet restart triggered by another failed container. Check infrastructure interruptions and pod events for the time window:

    python3 scripts/debug_workload.py \
      --project="{project}" \
      --cluster_name="{cluster_name}" \
      --location="{location}" \
      --jobset_name="{jobset_name}" \
      --start_time="{start_time}" --duration=1h \
      --action=interruptions \
      --execute
    # then the same command with --action=pod-events
  • If no infrastructure event explains the SIGTERM, trace the failure back from the user workload to the TPU that failed first:

    1. In the user workload logs (--action=user-workload), find the time of the first error or the last completed step.

    2. In the RM logs (--action=pathways-rm) around that time, find when the first failure occurred or the first TPU slice/worker stopped responding (e.g. a slice leaving the ready state or Job cancelled due to ...), and which slice/worker it was.

    3. Inspect that worker's logs (--action=workers, adding --min_severity=WARNING if needed) and its node's events (--action=pod-events, --action=node-ooms, --action=interruptions) to find out what happened there.

    4. The cause can be a user code error (unlikely) or another fault, such as a hardware failure, an OOM, a crash in the worker, or a node interruption.

  • kubectl get events -n {namespace} --field-selector involvedObject.name={jobset_name} only works for live incidents: Kubernetes keeps events for a certain time only. For past incidents use --action=pod-events / --action=summary, which read the events from Cloud Logging.

  • For deeper analysis of restarts and interruptions, follow the public gke-ai-troubleshooting-jobset-interruption skill; for host maintenance, follow gke-ai-troubleshooting-handle-disruption-gpu-tpu.


Step 3: Container-Specific Debugging Playbook

Because Pathways is distributed, inspect logs container-by-container in logical order to avoid cascade noise, and always chase the earliest error. Before you query a container, read its section in Container Playbooks: it has the log signals, the debug_workload.py command and the gotchas for that container.

OrderContainerActionLook forPlaybook
1User workload (user-workload, main, jax-tpu)--action=user-workloadThe last completed step, then the first exceptionA
2IFRT proxy--action=proxyConnection refused to the RM port (:29001), Socket closedB
3Resource manager (pathways-rm)--action=pathways-rmSlice ready transitions, placement, a repeated Build label (restarts)C
4Pathways workers (pathways-worker)--action=workersThe first worker that failed, Megascale stall detectors (HANG_DETECTED)D
5Colocated Python sidecar--action=colocated-python-sidecarWorkers waiting for a sidecar that diedE

Rules that apply to every container:

  • A client-side Unable to initialize backend 'proxy': UNAVAILABLE: Unable to establish connection is a symptom. Check whether the proxy, RM and workers started (see Parsing Important Logs) and find their earliest error before you suspect the user's code.

  • IFRT proxy server was terminated: UNAVAILABLE: Socket closed and SLICE_FAILURE_CHIP_DRIVER_ERROR are downstream errors: go to the RM and worker logs.

  • When one worker fails, the other workers of the slice fail shortly after. The root cause is in the logs of the first worker that failed.

  • The built-in search terms only cover known failures. If an action returns nothing useful, re-run it with --min_severity=WARNING (DEFAULT for the user workload) and add the workload's own strings with --extra_terms.

  • If the logs still don't explain the failure, read all logs of the container (F), then ask for more verbose proxy logs or XProfs (G).


Step 4: Special Scenarios

These known failures have a specific cause and fix. When an error or symptom matches a row, read that scenario in Special Scenarios before you conclude:

Error or symptomScenario
JaxRuntimeError with DATA_LOSS during scale changes; elastic recovery or checkpoint restore fails1. Elastic training and checkpoint restore
Container restarts or exit code 137 without OOMKilled; Memory cgroup out of memory, oom-kill, OOMKilling2. Host OOM kills on the head pod or TPU hosts
Unable to initialize backend 'proxy': Backend 'proxy' is not in the list of known backends3. Backend proxy is not in the list of known backends
SIGTERM received by PID 1; containers stop without a clear error4. SIGTERM received by PID 1
FAILED_PRECONDITION: The newly added instance does not match with the expected instances5. Newly added instance does not match the expected instances
Connection to IFRT proxy server was terminated: FAILED_PRECONDITION: GrpcClientSession: writes no longer allowed6. Connection to the IFRT proxy server was terminated
XlaRuntimeError: ABORTED: ... The metadata for object was edited during the operation7. Cached executable metadata was edited during the operation
DEADLINE_EXCEEDED: lost connection to peer or DATA_LOSS: Pipe from scheduler to aggregator8. Lost connection to peer
Status 11 from handshaker service: Input frame length is out of range9. ALTS handshake error from a client outside Google Cloud
Lifecycle matches_prefix cannot specify more than 50 prefixes per config10. Cloud Storage lifecycle prefix limit
IFRT Proxy client and server failed to agree on the protocol version, or Failed to deserialize the Mosaic module: ... Unsupported version11. JAX and Pathways version mismatch: compare the client's JAX, jaxlib and pathwaysutils versions with the Pathways image tags and Build labels
Pods in ImagePullBackOff or ErrImagePull12. Pods stuck in ImagePullBackOff or ErrImagePull: read the pull error in the pod events, then list the registry's tags (gcloud artifacts docker tags list)
Address already in use, Init:Error, or didn't have free ports13. Port collisions with hostNetwork
No error anywhere, but the job stops making progress14. The job hangs without failing
Still waiting to acquire semaphore, Recv completion error, GOAWAY15. Proxy-to-worker transfers stall

These public skills from github.com/google/skills complement this skill. If they are installed, use them by name; otherwise read them from the links.

SymptomPublic skill
Writing a custom Cloud Logging querycloud-logging-query-generation (GKE examples: query_gke.md)
JobSet restarts, Spot preemption, maintenance, host terminationgke-ai-troubleshooting-jobset-interruption
Compute Engine host maintenance on TPU/GPU nodesgke-ai-troubleshooting-handle-disruption-gpu-tpu
Multi-slice job stops responding (HANG_DETECTED)gke-ai-troubleshooting-tpu-mxla-hang
Node NotReady, unresponsive node, auto-repairgke-ai-troubleshooting-node-unresponsive-timeout

When you write your own queries:

  • Always use double quotes for strings, uppercase AND/OR/NOT, and parentheses to group terms.

  • Restrict resource.type (k8s_container, k8s_pod, k8s_node, gke_nodepool, gce_instance) and use log_id("events"), log_id("stdout") or log_id("stderr") where possible.

  • Always add a time window (timestamp>="..." and timestamp<="...").

  • Pathways components log glog lines into jsonPayload.message (some containers) or textPayload (others); bare quoted terms or SEARCH() match both.

  • Pod label keys are stored with . replaced by _, e.g. labels."k8s-pod/batch_kubernetes_io/job-completion-index" and labels."k8s-pod/jobset_sigs_k8s_io/jobset-name". Some public examples spell the Job label with dots (batch.kubernetes.io/job-name); that form does not match Pathways logs.

Files

references/special-scenarios.md

Special Scenarios

Known Pathways on Cloud failure signatures, with their cause and fix. Step 4 of SKILL.md lists them by error and symptom. Run the commands from the skill directory, as in SKILL.md.

Contents

  • 1. Elastic training and checkpoint restore: lines 27-62

  • 2. Host OOM kills on the head pod or TPU hosts: lines 63-91

  • 3. Backend proxy is not in the list of known backends: lines 92-100

  • 4. SIGTERM received by PID 1: lines 101-139

  • 5. Newly added instance does not match the expected instances: lines 140-154

  • 6. Connection to the IFRT proxy server was terminated: lines 155-165

  • 7. Cached executable metadata was edited during the operation: lines 166-178

  • 8. Lost connection to peer: lines 179-192

  • 9. ALTS handshake error from a client outside Google Cloud: lines 193-205

  • 10. Cloud Storage lifecycle prefix limit: lines 206-217

  • 11. JAX and Pathways version mismatch: lines 218-230

  • 12. Pods stuck in ImagePullBackOff or ErrImagePull: lines 231-247

  • 13. Port collisions with hostNetwork: lines 248-256

  • 14. The job hangs without failing: lines 257-270

  • 15. Proxy-to-worker transfers stall: lines 271-289


1. Elastic training and checkpoint restore

During scale transitions, JAX raises JaxRuntimeError with DATA_LOSS, and the elastic training loop recovers from an in-memory snapshot or a persistent checkpoint. To debug a failed recovery, rebuild its timeline from the JAX client and pathways-rm:

python3 scripts/debug_workload.py ... --action=elastic --limit=500 --execute

Line up these events:

  • Slice loss and return: Slices Now Ready, placed -> unplaced, Unassigning (pathways-rm).

  • Recovery start: Elastic attempt, New slices found.

  • Snapshot path: Restoring the in-memory snapshot, or snapshots skipped because a checkpoint save was in progress.

  • Checkpoint path: Falling back to persistent checkpoint, Restoring ... with the step.

  • Outcome: Resuming at step ... or the next error. The elastic action also matches the crash and fatal-error list, so the exception that ended a recovery attempt shows up in the same timeline.

Then answer, in order:

  1. Which slice was lost, and when?

  2. Did a usable snapshot exist?

  3. Which restore path ran, and from which step?

  4. Was that step committed (commit_success / _CHECKPOINT_METADATA in the checkpoint directory)?

  5. Did the JobSet restart or tear down the job before the elastic wait finished? Compare JobSet and pod events (--action=summary, --action=pod-events) with the wait timeout.

  6. Was the proxy started in elastic mode?

2. Host OOM kills on the head pod or TPU hosts

OOMs on the head pod (python, proxy, or RM containers) and on TPU hosts (worker, colocated Python sidecar) often do not appear in container logs or as an OOMKilled pod event, but in the underlying node's kernel logs. A container restart or exit code 137 without an OOMKilled reason also points here. Query the node kernel logs for OOM kills:

python3 scripts/debug_workload.py \
  --project="{project}" \
  --cluster_name="{cluster_name}" \
  --location="{location}" \
  --jobset_name="{jobset_name}" \
  --start_time="{start_time}" --duration=1h \
  --action=node-ooms \
  --execute

When you find a host OOM kill (Memory cgroup out of memory: Killed process, oom-kill or OOMKilling):

  • Say in the report that it is host (CPU) RAM, not TPU HBM. An HBM OOM shows up as RESOURCE_EXHAUSTED in the worker or user-workload logs instead, and needs different fixes (sharding, batch size), not more container memory.

3. Backend proxy is not in the list of known backends

RuntimeError: Unable to initialize backend 'proxy': Backend 'proxy' is not in the list of known backends: ['cpu', 'tpu', 'cuda']. (set JAX_PLATFORMS='' to automatically choose an available backend)

The proxy backend is missing. Solution: Add pathwaysutils.initialize() at the beginning of your program.

4. SIGTERM received by PID 1

This means that the GKE scheduler has sent a SIGTERM to the corresponding pathways container and the container has exited in response to that. This can happen due to a variety of events: GKE preempting your nodes due to lower level defrag/maintenance events or higher level preemption events. Application errors typically seen on proxy or RM happen before the first SIGTERM was received. K8s decided to terminate all the pods in the jobset since the controller exiting needs a jobset restart If no concrete error is found in the logs, check the Kubernetes events and infrastructure interruptions with --action=pod-events, --action=summary and --action=interruptions (see Step 2.3 in SKILL.md). Check Resource Allocation: Insufficient CPU or memory allocated to the JAX, proxy, or resource manager (RM) containers is a leading cause of crashes without clear error messages. To check if a container has OOMed, you should look at the GCE instance logs which is hosting the corresponding container by searching for the string oom-killer. It would describe the specific process (if any) that OOMed on the pathways head node. The query filter to get that information is covered by --action=node-ooms, which checks node-problem-detector OOMKilling/SystemOOM events, kernel Memory cgroup out of memory lines on the cluster's nodes, and serial-console logs of the JobSet's nodes (discovered automatically from the pods' Scheduled events, or pass --node_names=gke-...,gke-...). To look at a single node manually:

resource.type="gce_instance"
labels."compute.googleapis.com/resource_name"="<Pathways head node>"
log_id("serialconsole.googleapis.com/serial_port_1_output")
SEARCH("oom-kill")

As a starting point, consider the following allocations:

ContainerRecommended Memory  Recommended CPU
JAX Client100 GiB16
Pathways Proxy100 GiB16
Resource Manager (RM)32 GiB16

5. Newly added instance does not match the expected instances

FAILED_PRECONDITION: The newly added instance does not match with the expected instances

This typically occurs when there is a discrepancy between the expected TPU slice topology by the RM and the actual instances provisioned by GKE for the worker. This is the mapping supported by Pathways for various TPU chip generations and their configurations. You can compare the expected and actual topologies by looking at the proto in the RM logs for the topology that RM was expecting (indicated as “expected topology”) and the topology that it got from the worker (indicated as “Newly added slice topology”)

6. Connection to the IFRT proxy server was terminated

UNAVAILABLE:Connection to IFRT proxy server was terminated: FAILED_PRECONDITION: GrpcClientSession: writes no longer allowed

The Pathways cluster and specifically the pathways proxy container that your JAX client was connected to has terminated or restarted since the original connection was established. Try restarting your workload to see if the issue goes away.

7. Cached executable metadata was edited during the operation

XlaRuntimeError: ABORTED: Permanent error, with a last message “” of The metadata for object was edited during the operation. Please try again

Possible race condition between writing and reading the cached executable object in GCS. We recommend using GCSFuse to mount your GCS bucket as a local directory. It translates the GCS preconditions to the filesystem level to do parallel writes atomically and prevent metadata conflicts you are seeing.

8. Lost connection to peer

One of these errors:

XlaRuntimeError: DEADLINE_EXCEEDED: lost connection to peer
DATA_LOSS: Pipe from scheduler to aggregator

A TPU worker likely exited either due to a hardware failure or a software fatal error like OOMs. The GKE instance ID is generally part of the error message and should be used to navigate to the instance logs to find more pointers for determining the root cause.

9. ALTS handshake error from a client outside Google Cloud

Status 11 from handshaker service: Input frame length is out of range

This indicates an auth mismatch between the IFRT proxy client and the server. IFRT Proxy uses ALTS for authentication by default. ALTS handshaker is running on GCP VMs by default, so if your JAX client is running on a non GCP VM, this error is expected. To fix, disable authentication on both the proxy client and server by adding this environment variable to the JAX process and IFRT proxy container: IFRT_PROXY_USE_INSECURE_GRPC_CREDENTIALS="true". This turns off authentication and encryption of the proxy traffic, so use it only on a trusted network. To keep ALTS, run the JAX client on Google Cloud instead, for example in the same GKE pod as the proxy.

10. Cloud Storage lifecycle prefix limit

INVALID_ARGUMENT : Permanent error, with a last message of Lifecycle matches_prefix cannot specify more than 50 prefixes per config.; Error while initializing persistent cache storage Cloud Storage

This error occurs if the Cloud Storage bucket passed in to the --gcs_scratch_location flag has reached the maximum lifecycle policy limit. If this occurs, clean up Cloud Storage lifecycle policies that are no longer being used. To avoid hitting this issue repeatedly, consider using a common prefix across all your workloads.

11. JAX and Pathways version mismatch

One of these errors:

IFRT Proxy client and server failed to agree on the protocol version; supported versions: client = [1, 1], server = [3, 14]
ValueError: Failed to deserialize the Mosaic module: INTERNAL: Unsupported version: expected <= 7 but got 8

This indicates that your pathways images are incompatible with the JAX version you are using. Please ensure that you are using a pathways image tag jax-0.x.y matching your JAX version.

Check the versions first: compare the client's JAX, jaxlib and pathwaysutils versions (pip show jax jaxlib pathwaysutils) with the Pathways server and proxy image tags and the Build label they log at startup, and report both in the answer.

12. Pods stuck in ImagePullBackOff or ErrImagePull

Go through these steps in order, and include each one in the report:

  1. Read the exact pull error in the pod events (--action=pod-events or kubectl describe pod): a missing tag or manifest (manifest unknown, not found), a permission error, or a network timeout.

  2. For a missing tag or manifest, list the tags that exist in the registry (gcloud artifacts docker tags list <repository>/<image> or gcloud artifacts docker images list <repository>).

  3. Switch to a published tag that matches the workload's JAX version. For a permission error, check that the node service account can pull from that repository instead.

The Pathways containers never started, so their logs are empty: do not look for the root cause there.

13. Port collisions with hostNetwork

Pathways pods usually run with hostNetwork: true, so the Pathways ports (RM, proxy, worker, Megascale) and any extra ports (e.g. metrics exporters enabled with debugging flags) are shared by every container in the pod and every pod on the node. Look for Address already in use or other bind errors, Init:Error, or FailedScheduling ... didn't have free ports. Use --action=neighbors to see what else ran on the node.

14. The job hangs without failing

When nothing reports an error, go through these steps in order:

  1. Find the last progress line of every container: user steps (completed step), RM slice state (Slices Now Ready, placed or unplaced slices), worker program launches, and proxy requests. Use --order=desc --first_per_pod=1 with --min_severity=DEFAULT on each container action to get each pod's latest line.

  2. The component that stopped first is the lead.

  3. Check for pods that are Pending, missing or restarted (--action=pod-events).

  4. Check the Megascale stall detectors (HANG_DETECTED, --action=workers).

15. Proxy-to-worker transfers stall

The proxy repeats Still waiting to acquire semaphore for destination ... to send Chunk, the workers log Recv completion error, and the gRPC transport may later fail with GOAWAY (ping_timeout or settings_timeout). The client usually just stops making progress, often while restoring a checkpoint or doing another large host-to-device transfer through the proxy. This means host-to-device transfers from the IFRT proxy to the workers stalled: it is a Pathways runtime issue, not Orbax, Cloud Storage or user code. The proxy and workers actions match these lines.

  • Check for an image regression: compare the server and proxy image tags and Build labels of the failing run with the last run of the same workload that passed. If they differ, run on the last-good images and report the change to Google Cloud support with the logs.

  • Workaround: avoid sending the checkpoint data through the proxy. Call pathwaysutils.initialize() before creating the Orbax checkpoint manager, so restores use the Pathways checkpoint handler (CloudPathwaysArrayHandler) and the workers read Cloud Storage directly.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs a command-line tool, Needs Python, Needs Node.js

Security

What our scanner noticed· Low risk

  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
Google
Publisher
Google (Official)
Source
google/skills · skills/cloud/pathways-workload · commit 2194d3b
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Google or Google.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download pathways-workload.zip