시작하기 전에
- XPK 설치
- Kubernetes 도구 설치
- gcloud CLI 설치
- TPU API 사용 설정
- Google Kubernetes Engine API 사용 설정
- Google Kubernetes Engine 클러스터 만들기
이 문서에서는 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 프로젝트 IDLOCATION: 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
측정항목 수집
Pathways는 디버깅을 위해 Cloud Monitoring에 낮은 수준의 시스템 측정항목을 쓸 수 있습니다. 다음과 같은 측정항목이 포함됩니다.
- DCN 전송 지연 시간
- 집합 지연 시간
- 호스트-기기 전송 지연 시간
- 기기-호스트 전송 지연 시간
GKE 클러스터가 실행 중인 {gcp_name} 프로젝트의 Cloud Monitoring 대시보드에서 측정항목을 찾을 수 있습니다.
측정항목 탐색기에서 이러한 측정항목을 모니터링하려면 다음 단계를 따르세요.
- 측정항목 탐색기로 이동합니다.
- 측정항목 선택 필드를 사용하여 측정항목 이름으로 필터링합니다.
- 필터 추가 를 선택하고 pod_name 으로 필터링하여 워크로드 이름과 기간으로 필터링합니다.
- 모니터링하는 측정항목 및 워크로드에 따라 적절한 집계 유형 을 선택합니다.
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 클러스터가 프로비저닝되었는지 확인합니다.
- 시작 오류 메시지를 확인합니다.
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 클러스터는 한 번에 하나의 클라이언트와만 세션을 유지할 수 있습니다. 두 개의 개별 노트북이 동일한 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
Pathways 컨테이너에 잘못된 Cloud Storage 위치를 제공하면 이 오류가 Resource Manager 또는 Pathways 작업자에 출력됩니다.
데몬의 오류 응답
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 이미지를 다시 빌드해야 합니다.
다음 단계
- Pathways를 사용한 멀티 호스트 추론
- Pathways를 사용한 일괄 워크로드
- Pathways 대화형 모드
- JAX 워크로드를 Pathways로 포팅
- Pathways를 사용한 복원력 있는 학습