클라우드에서 Pathways 문제 해결

시작하기 전에

이 문서에서는 Pathways 워크로드 문제를 해결하는 방법을 설명합니다.

로그 보기

Cloud Logging 로그 탐색기에서 프로젝트, 리전, 클러스터, 워크로드에 맞게 조정된 다음 쿼리를 사용합니다.

resource.type="k8s_container"
resource.labels.project_id="PROJECT"
resource.labels.location="LOCATION"
resource.labels.cluster_name="CLUSTER"
resource.labels.namespace_name="default"
resource.labels.pod_name:"WORKLOAD_NAME"

다음을 바꿉니다.

  • PROJECT : Google Cloud 프로젝트 ID
  • LOCATION: GKE 클러스터를 만든 리전 또는 영역입니다.
  • CLUSTER : GKE 클러스터의 이름
  • WORKLOAD_NAME : XPK를 사용하는 경우 워크로드의 이름, kubectl를 사용하는 경우 JobSet 이름

이 쿼리는 pathways-rm, pathways-proxy, pathways-worker와 같은 이름의 여러 Pathways Kubernetes 컨테이너와 일치합니다. resource.labels.container_name:"<container_name>"와 같은 컨테이너 이름에 필터를 추가하여 문제를 일으키는 컨테이너를 좁힐 수 있습니다.

모니터링

상태 모니터링

컨테이너 로그에서 항목을 찾아 다양한 Pathways 구성요소의 상태를 모니터링할 수 있습니다. 예를 들면 다음과 같습니다.

다음 로그가 작성되면 pathways-proxy가 새 연결 요청을 처리할 준비가 된 것입니다.

kubectl logs ${HEAD_POD_NAME} --container pathways-proxy
...
I1101 04:51:41.967764       1 proxy_server.cc:125] IFRT proxy server started with status OK

다음 로그가 작성되면 pathways-rm가 새 연결 요청을 처리할 준비가 된 것입니다.

kubectl logs $HEAD_POD_NAME --container pathways-rm
...
I1101 04:50:41.967764       1 server_lib.cc:1473] Pathways Server serving on [::]:29001

Pathways Resource Manager에 등록된 모든 TPU가 준비되었는지 확인하려면 pathways-rm 컨테이너 로그에서 ***<num slices>/<num slices> Pathways Slices Now Ready ***를 찾으면 됩니다.

kubectl logs $HEAD_POD_NAME --container pathways-rm
...
I1101 04:52:41.967764       1 multi_job_allocator.cc:1063] *** 2/2 Pathways Slices Now Ready ***

모든 슬라이스가 준비되지 않았더라도 프록시 서버가 준비되어 있으면 Pathways 클라이언트가 IFRT 프록시 서버에 연결할 수 있습니다. 슬라이스가 준비될 때까지 작업은 가상 슬라이스로 작동합니다. 가상 슬라이스를 사용하면 TPU를 사용할 수 없을 때 코드를 실행할 수 있습니다.

다음 로그가 작성되면 pathways-worker가 새 연결 요청을 처리할 준비가 된 것입니다.

kubectl logs $WORKER_POD_NAME --container pathways-worker
...
I1101 04:50:41.967764       1 server_lib.cc:1473] Pathways Server serving on [::]:29001

측정항목 수집

경로는 디버깅을 위해 하위 수준 시스템 측정항목을 Cloud Monitoring에 쓸 수 있습니다. 다음과 같은 측정항목이 포함됩니다.

  • DCN 전송 지연 시간
  • 집합적 지연 시간
  • 호스트-기기 전송 지연 시간
  • 기기-호스트 전송 지연 시간

GKE 클러스터가 실행 중인 {gcp_name} 프로젝트의 Cloud Monitoring 대시보드에서 측정항목을 확인할 수 있습니다.

측정항목 탐색기에서 이러한 측정항목을 모니터링하려면 다음 단계를 따르세요.

  1. 측정항목 탐색기로 이동합니다.
  2. 측정항목 선택 필드를 사용하여 측정항목 이름으로 필터링
  3. 필터 추가를 선택하여 워크로드 이름과 기간을 기준으로 필터링하고 pod_name을 기준으로 필터링합니다.
  4. 모니터링하는 측정항목과 워크로드에 따라 적절한 집계 유형을 선택합니다.

DCN 전송 지연 시간

멀티슬라이스 트래픽의 네트워크 전송 지연 시간의 누적 분포를 측정하는 메가스케일 XLA (MXLA) 측정항목입니다. 지연 시간 측정은 DCN을 통해 데이터를 전송하라는 요청이 발행될 때 시작되고 데이터 전송이 완료되었다는 확인이 수신될 때 종료됩니다. 이 측정항목을 모니터링하려면 dcn_transfer_latencies 측정항목 이름으로 필터링하세요.

집합적 지연 시간

멀티슬라이스 트래픽의 엔드 투 엔드 집합 지연 시간의 누적 분포를 측정하는 MXLA 측정항목입니다. 지연 시간 측정은 수집 요청이 발행될 때 시작되고 데이터 전송이 완료되었다는 확인이 수신될 때 종료됩니다. 이 측정항목을 모니터링하려면 collective_e2e_latency 측정항목 이름으로 필터링하세요.

호스트-기기 전송 지연 시간

멀티슬라이스 트래픽의 호스트-기기 전송 지연 시간의 누적 분포를 측정하는 MXLA 측정항목입니다. 지연 시간 측정은 DCN을 통해 데이터를 전송하라는 요청이 발행될 때 시작되고 데이터 전송이 완료되었다는 확인이 수신될 때 종료됩니다. 이 측정항목을 모니터링하려면 host_to_device_transfer_latencies 측정항목 이름으로 필터링하세요.

기기-호스트 전송 지연 시간

멀티슬라이스 트래픽의 기기-호스트 전송 지연 시간의 누적 분포를 측정하는 MXLA 측정항목입니다. 지연 시간 측정은 DCN을 통해 데이터를 전송하라는 요청이 발행될 때 시작되고 데이터 전송이 완료되었다는 확인이 수신될 때 종료됩니다. 이 측정항목을 모니터링하려면 device_to_host_transfer_latencies 측정항목 이름으로 필터링하세요.

일반적인 오류 디버깅

액셀러레이터 구성을 해싱할 수 없음 경고

다음 메시지는 경고일 뿐이며 JAX 코드의 성능에 영향을 주지 않습니다.

INFO:jax._src.cache_key:get (_hash_accelerator_config): unable to hash accelerator config, falling back to hashing devices + platform: UNIMPLEMENTED: GetTopologyForDevices is not supported for the IFRT proxy client. (type <class 'jaxlib.xla_extension.XlaRuntimeError'>)

리소스에 대한 logging.logEntries.create 권한이 거부됨

다음 오류가 표시되면 Vertex AI Workbench에서 사용하는 Compute Engine 서비스 계정에 Google Cloud 로깅 시스템에 로그 항목을 쓸 수 있는 권한이 있는지 확인하세요.

INFO:absl:Created 'ArrayHandler' with primary_host=0, replica-id=0
WARNING:absl:pathwaysutils: Detected Pathways-on-Cloud backend. Applying changes.
Failed to submit 1 logs.
Traceback (most recent call last):
  File "/opt/conda/lib/python3.10/site-packages/google/api_core/grpc_helpers.py", line 65, in error_remapped_callable
    return callable_(**args, **kwargs)
  File "/opt/conda/lib/python3.10/site-packages/grpc/_channel.py", line 1181, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/opt/conda/lib/python3.10/site-packages/google/api_core/grpc_helpers.py", line 1006, in _end_unary_response_blocking
    raise _InactiveRpcError(state) # pytype: disable-not-instantiable
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
  status = StatusCode.PERMISSION_DENIED
  details = "Permission 'logging.logEntries.create' denied on resource (or it may not exist)."
  debug_error_string = "UNKNOWN:Error received from peer ipv4:216.239.34.174:443 {created_time:"2024-10-03T20:30:44.820425276+00.00", grpc_status:7, grpc_message:"Permission \'logging.logEntries.create\' denied on resource (or it may not exist)."}"
>

이 문제를 해결하려면 Compute Engine 서비스 계정에 로그 작성자 역할을 추가합니다.

IFRT 프록시 서버에 연결할 수 없음

이 오류가 표시되면 IFRT 프록시 클라이언트가 IFRT 프록시 서버에 연결할 수 없는 것입니다.

  • VPC 네트워크가 올바르게 구성되었는지 확인
  • 방화벽이 연결을 허용하도록 구성되어 있는지 확인
  • 개발자 과정 클러스터가 프로비저닝되었는지 확인
  • 시작 오류 메시지 확인

Pathways 클러스터에 IFRT 명령어를 전송하는 첫 번째 JAX 명령어가 실행되려고 하면 약 1분 동안 응답이 중지된 후 다음과 같은 RuntimeError가 표시됩니다.

RuntimeError: Unable to initialize backend 'proxy': UNAVAILABLE: Unable to establish connection to ifrt_proxy server, please check provided address example-workload-proxy-0-0.example-workload.default.svc.example-cluster-domain.:38676'; detailed error: DNS resolution failed (set JAX_PLATFORMS='' to automatically choose an available backend)

Pathways 클러스터에 대한 기존 연결이 있습니다

경로 클러스터는 한 번에 하나의 클라이언트와의 세션만 유지할 수 있습니다. 두 개의 별도 노트북이 동일한 Pathways 클러스터에 연결하려고 하면 하나는 연결할 수 있고 다른 하나는 다음 오류를 표시합니다.

INFO:absl:Created ArrayHandler with primary_host=0, replica_id=0
WARNING:absl:pathwaysutils: Detected Pathways-on-Cloud backend. Applying changes.
E0927 21:19:52.919607   37624 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
E0927 21:20:03.467547   37719 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
E0927 21:20:14.011645   37807 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
E0927 21:20:24.557955   37924 rpc_helper.cc:56] Connection to IFRT proxy server was terminated: CANCELLED: Cancelled
---------------------------------------------------------------------------
XlaRuntimeError                           Traceback (most recent call last)
File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:887, in backends()
    885   continue
--> 887 backend = _init_backend(platform)
    888 _backends[platform] = backend

File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:973, in _init_backend(platform)
    972 logger.debug("Initializing backend '%s'", platform)
--> 973 backend = registration.factory()
    974 # TODO: consider raising more descriptive errors directly from backend
    975 # factories instead of returning None.

File /opt/conda/lib/python3.10/site-packages/pathwaysutils/proxy_backend.py:24, in register_backend_factory.<locals>.<lambda>()
     21 def register_backend_factory():
     22   xla_bridge.register_backend_factory(
     23       "proxy",
---> 24       lambda: ifrt_proxy.get_client(
     25           jax.config.read("jax_backend_target"),
     26           ifrt_proxy.ClientConnectionOptions(),
     27       ),
     28       priority=-1,
     29   )

XlaRuntimeError: UNAVAILABLE: Unable to establish connection to ifrt_proxy server, please check provided address example-workload-proxy-0-0.example-workload.default.svc.example-cluster-domain.:38676'; detailed error: Connection to IFRT proxy server was terminated: CANCELLED: Cancelled

During handling of the above exception, another exception occurred:

RuntimeError                              Traceback (most recent call last)
Cell In[2], line 4
      1 import pathwaysutils
      3 import jax
----> 4 print(jax.devices())

File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:1085, in devices(backend)
   1060 def devices(
   1061     backend: str | xla_client.Client | None = None
   1062 ) -> list[xla_client.Device]:
   1063   """Returns a list of all devices for a given backend.
   1064
   1065   .. currentmodule:: jaxlib.xla_extension
   (...)
   1083     List of Device subclasses.
   1084   """
-> 1085   return get_backend(backend).devices()

File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:1019, in get_backend(platform)
   1015 @lru_cache(maxsize=None)  # don't use util.memoize because there is no X64 dependence.
   1016 def get_backend(
   1017     platform: None | str | xla_client.Client = None
   1018 ) -> xla_client.Client:
-> 1019   return _get_backend_uncached(platform)

File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:998, in _get_backend_uncached(platform)
    994   return platform
    996 platform = (platform or _XLA_BACKEND.value or _PLATFORM_NAME.value or None)
--> 998 bs = backends()
    999 if platform is not None:
   1000   platform = canonicalize_platform(platform)

File /opt/conda/lib/python3.10/site-packages/jax/_src/xla_bridge.py:903, in backends()
    901       else:
    902         err_msg += " (you may need to uninstall the failing plugin package, or set JAX_PLATFORMS=cpu to skip this backend.)"
--> 903       raise RuntimeError(err_msg)
    905 assert _default_backend is not None
    906 if not config.jax_platforms.value:

RuntimeError: Unable to initialize backend 'proxy': UNAVAILABLE: Unable to establish connection to ifrt_proxy server, please check provided address 'example-workload-proxy-0-0.example-workload.default.svc.example-cluster-domain.:38676'; detailed error: Connection to IFRT proxy server was terminated: CANCELLED: Cancelled (set JAX_PLATFORMS='' to automatically choose an available backend)

원래 클라이언트의 연결이 끊어지면 두 번째 클라이언트가 연결할 수 있습니다. 예기치 않은 연결 해제 후 다른 클라이언트가 연결할 수 있도록 Pathways 클러스터를 다시 시작해야 할 수 있습니다.

LocalProxy.init()에 예기치 않은 키워드 인수 'unbound_message'가 있습니다.

pathwaysutils를 가져온 후 이 오류가 표시되면 환경에 오래된 버전의 Flask 또는 Werkzeug가 설치되어 있는지 확인하세요.

 pip3 list --outdated (replacing pip with pip3 as needed)

Flask 또는 Werkzeug가 나열되면 업그레이드하는 것이 좋습니다. 단, 업그레이드하면 프로젝트의 다른 패키지나 종속 항목이 중단될 수 있습니다.

 pip install flask Werkzeug --upgrade ()

프록시 서버의 내부 오류

"Internal error from proxy server during Array::IsDeleted(): UNAVAILABLE:Connection to IFRT proxy server was terminated: FAILED_PRECONDITION:
GrpcClientSession: writes no longer allowed."

이 오류는 IFRT 프록시 서버가 클라이언트에서 연결이 해제되었음을 나타냅니다. 클라이언트를 다시 시작하면 이 문제가 해결될 수 있습니다. 노트북의 경우 노트북 커널을 다시 시작하고 노트북을 다시 실행하면 됩니다.

SIGTERMS 및 HBM OOM

RESOURCE_EXHAUSTED 오류와 연결된 로그에서 SIGTERM이 발견되면 HBM OOM을 나타낼 수 있습니다. 이 경우 JAX 코드에서 사용되는 HBM 메모리 양을 줄일 수 있습니다.

INVALID_ARGUMENT

"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"

이 오류는 --pathways_gcs_location 플래그에 전달된 Cloud Storage 버킷이 최대 수명 주기 정책 한도에 도달한 경우에 발생합니다. 이 문제가 발생하면 더 이상 사용되지 않는 Cloud Storage 수명 주기 정책을 정리하세요.

영구 오류

Permanent error, with a last message of The specified bucket does not exist.; Error while initializing persistent cache storage gcs

이 오류는 경로 컨테이너에 잘못된 Cloud Storage 위치를 제공할 때 리소스 관리자 또는 경로 작업자에 출력됩니다.

데몬의 오류 응답

Error response from daemon: dockerfile parse error line 16: Unknown flag: exclude

이 문제는 이전 버전의 Docker로 인해 발생합니다. Docker 버전을 업그레이드하세요.

IFRT 프록시 클라이언트와 서버가 동의하지 못함

IFRT Proxy client and server failed to agree on the protocol version; supported versions: client = [1, 1], server = [3, 14]

이는 이전 버전의 MaxText가 사용되고 있음을 나타냅니다. 최신 MaxText 이미지를 다시 빌드하세요.

다음 단계