대화형 셸을 사용한 학습 모니터링 및 디버깅

이 페이지에서는 대화형 셸을 사용해서 학습 코드가 실행되는 컨테이너를 조사하는 방법을 보여줍니다. Vertex AI에서 실행되는 각 사전 빌드된 컨테이너 또는 커스텀 컨테이너에서 파일 시스템을 탐색하고 디버깅 유틸리티를 실행할 수 있습니다.

대화형 셸을 사용하여 학습 컨테이너를 검사하면 학습 코드 또는 Vertex AI 구성 문제를 디버깅하는 데 도움이 됩니다. 예를 들어 대화형 셸을 사용하여 다음을 수행할 수 있습니다.

  • 추적 및 프로파일링 도구 실행
  • GPU 사용량 분석
  • 컨테이너에 제공되는 Google Cloud 권한 확인

또한 Vertex AI가 TensorFlow 프로파일러에 통합되어, 커스텀 학습 작업을 위한 모델 학습 성능 디버깅에 사용할 수 있습니다. 자세한 내용은 프로파일러를 사용하여 모델 학습 성능 프로파일링을 참조하세요.

시작하기 전에

CustomJob 리소스, HyperparameterTuningJob 리소스, 커스텀 TrainingPipeline 리소스로 커스텀 학습을 수행할 때 대화형 셸을 사용할 수 있습니다. 학습 코드를 준비하고 선택한 커스텀 학습 리소스를 구성할 때는 다음 요구사항을 충족해야 합니다.

  • 학습 컨테이너에 bash가 설치되어 있는지 확인합니다.

    모든 사전 빌드된 학습 컨테이너bash가 설치되어 있습니다. 학습용 커스텀 컨테이너를 만드는 경우 bash가 포함된 기본 컨테이너를 사용하거나 Dockerfile에 bash를 설치합니다.

  • 대화형 셸을 지원하는 리전에서 커스텀 학습을 수행합니다.

  • 대화형 셸에 액세스하려는 모든 사용자에게 커스텀 학습이 실행되는 Google Cloud 프로젝트에 대해 다음 권한이 있는지 확인합니다.

    • aiplatform.customJobs.create
    • aiplatform.customJobs.get
    • aiplatform.customJobs.cancel

    커스텀 학습을 직접 시작하는 경우 이미 이러한 권한이 있을 가능성이 크므로 대화형 셸에 액세스할 수 있습니다. 그러나 대화형 셸을 사용하여 조직 내 다른 사람이 만든 커스텀 학습 리소스를 검사하려면 이러한 권한을 가져와야 할 수 있습니다.

    이러한 권한을 얻는 한 가지 방법은 조직의 관리자에게 Vertex AI 사용자 역할(roles/aiplatform.user)을 부여해 달라고 요청하는 것입니다.

고급 사례 요구사항

특정 고급 기능을 사용하는 경우 다음 추가 요구사항을 충족합니다.

  • 커스텀 학습 리소스에 커스텀 서비스 계정을 연결하는 경우 대화형 셸에 액세스하려는 모든 사용자에게 연결된 서비스 계정에 대해 iam.serviceAccounts.actAs 권한이 있는지 확인합니다.

    커스텀 서비스 계정 가이드에는 서비스 계정을 연결하기 위해 이 권한이 필요하다고 표시됩니다. 또한 커스텀 학습 중 대화형 셸을 보기 위해 이 권한이 필요합니다.

    예를 들어 서비스 계정이 연결된 CustomJob을 만들려면 서비스 계정에 대해 iam.serviceAccounts.actAs 권한이 있어야 합니다. 동료 중 한 명이 이 CustomJob에 대해 대화형 셸을 보려면 동일한 iam.serviceAccounts.actAs 권한이 있어야 합니다.

  • Vertex AI에서 VPC 서비스 제어를 사용하도록 프로젝트를 구성한 경우 다음 추가 제한사항을 고려하세요.

    • 커스텀 학습에는 비공개 IP를 사용할 수 없습니다.

    • 대화형 셸 내에서 공개 인터넷 또는 서비스 경계 외부의 Google Cloud 리소스에 액세스할 수 없습니다.

    • 대화형 셸 액세스를 보호하려면 aiplatform.googleapis.com 외에도 서비스 경계에서 제한된 서비스로 notebooks.googleapis.com을 추가해야 합니다. aiplatform.googleapis.com만 제한하고 notebooks.googleapis.com을 제한하지 않으면 사용자가 서비스 경계 외부의 머신에서 대화형 셸에 액세스하여 VPC 서비스 제어를 사용하는 데 따른 보안 이점을 줄여줍니다.

대화형 셸 사용 설정

커스텀 학습 리소스에 대화형 셸을 사용 설정하려면 CustomJob, HyperparameterTuningJob 또는 커스텀 TrainingPipeline을 만들 때 enableWebAccess API 필드true로 설정합니다.

다음 예시에서는 여러 다른 도구를 사용하여 이를 수행하는 방법을 보여줍니다.

Console

Google Cloud Console에서 커스텀 TrainingPipeline 만들기 가이드를 따릅니다. 새 모델 학습 창에서 모델 세부정보 단계에 도달하면 다음을 수행합니다.

  1. 고급 옵션을 클릭합니다.

  2. 학습 디버깅 사용 설정 체크박스를 선택합니다.

그런 후 새 모델 학습 워크플로의 나머지를 완료합니다.

gcloud

이러한 명령어를 사용하는 방법은 CustomJob 만들기 가이드와 HyperparameterTuningJob 만들기를 참조하세요.

API

다음의 부분적인 REST 요청 본문에 각 커스텀 학습 리소스 유형에 enableWebAccess 필드를 지정하는 위치가 나와 있습니다.

CustomJob

다음 예시는 projects.locations.customJobs.create API 메서드에 대한 부분 요청 본문입니다.

{
  ...
  "jobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

CustomJob을 만들기 위한 API 요청 전송 예시는 커스텀 학습 작업 만들기를 참조하세요.

HyperparameterTuningJob

다음 예시는 projects.locations.hyperparameterTuningJobs.create API 메서드에 대한 부분 요청 본문입니다.

{
  ...
  "trialJobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

HyperparameterTuningJob을 만들기 위한 API 요청 전송 예시는 초매개변수 조정 사용을 참조하세요.

커스텀 TrainingPipeline

다음 예시에서는 projects.locations.trainingPipelines.create API 메서드의 부분 요청 본문을 보여줍니다. 초매개변수 조정을 사용하는지 여부에 따라 다음 탭 중 하나를 선택합니다.

초매개변수 조정 사용 안함

{
  ...
  "trainingTaskInputs": {
    ...
    "enableWebAccess": true
  }
  ...
}

초매개변수 조정 사용

{
  ...
  "trainingTaskInputs": {
    ...
    "trialJobSpec": {
      ...
      "enableWebAccess": true
    }
  }
  ...
}

커스텀 TrainingPipeline을 만들기 위해 API 요청을 전송하는 예시는 학습 파이프라인 만들기를 참조하세요.

Python

Python용 Vertex AI SDK를 설치하거나 업데이트하는 방법은 Python용 Vertex AI SDK 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 확인하세요.

다음 메서드 중 하나를 실행할 때 enable_web_access 매개변수를 true로 설정합니다.

이전 섹션의 안내에 따라 커스텀 학습을 시작한 후 Vertex AI는 대화형 셸 액세스를 위해 사용할 수 있는 하나 이상의 URI를 생성합니다. Vertex AI는 작업에서 각 학습 노드에 대해 고유한 URI를 생성합니다.

다음 방법 중 하나로 대화형 셸로 이동할 수 있습니다.

  • Google Cloud Console에서 링크를 클릭합니다.
  • Vertex AI API를 사용하여 셸의 웹 액세스 URI를 가져옵니다.
  1. Google Cloud Console의 Vertex AI 섹션에서 다음 페이지 중 하나로 이동합니다.

  2. 커스텀 학습 리소스의 이름을 클릭합니다.

    커스텀 학습을 위해 TrainingPipeline을 만든 경우 TrainingPipeline으로 생성된 CustomJob 또는 HyperparameterTuningJob의 이름을 클릭합니다. 파이프라인에 PIPELINE_NAME 이름이 포함된 경우 PIPELINE_NAME-custom-job 또는 PIPELINE_NAME-hyperparameter-tuning-job으로 불릴 수 있습니다.

  3. 작업 페이지에서 웹 터미널 실행을 클릭합니다. 작업에 여러 노드가 사용되는 경우 대화형 셸을 원하는 노드 옆에서 웹 터미널 실행을 클릭합니다.

    작업이 실행되는 동안에만 대화형 셸에 액세스할 수 있습니다. 웹 터미널 실행이 표시되지 않으면 Vertex AI가 작업 실행을 아직 시작하지 않았거나 작업이 이미 완료되었거나 실패했기 때문일 수 있습니다. 작업의 상태Queued 또는 Pending이면 1분 정도 기다린 후 페이지를 새로고침합니다.

    초매개변수 조정을 사용하는 경우 각 시도에 대해 개별 웹 터미널 실행 링크가 있습니다.

API에서 웹 액세스 URI 가져오기

projects.locations.customJobs.get API 메서드 또는 projects.locations.hyperparameterTuningJobs.get API 메서드를 사용하여 대화형 셸에 액세스하기 위해 사용할 수 있는 URI를 확인합니다.

사용 중인 커스텀 학습 리소스의 유형에 따라 다음 탭 중 하나를 선택하여 작업에서 각 노드의 대화형 셸 URI가 포함된 webAccessUris API 필드를 찾는 방법의 예시를 확인합니다.

CustomJob

다음 탭에서는 projects.locations.customJobs.get 요청을 보내는 다양한 방법을 보여줍니다.

gcloud

gcloud ai custom-jobs describe 명령어를 실행합니다.

gcloud ai custom-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

다음을 바꿉니다.

  • JOB_ID: 작업의 숫자 ID입니다. 이 ID는 작업의 name 필드 중 마지막 부분입니다. 작업을 만들 때 ID를 보았을 수 있습니다. 작업 ID를 모르는 경우 gcloud ai custom-jobs list 명령어를 실행하여 적절한 작업을 찾을 수 있습니다.

  • LOCATION: 작업을 만든 리전입니다.

REST

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION: 작업을 만든 리전입니다.

  • PROJECT_ID: 프로젝트 ID

  • JOB_ID: 작업의 숫자 ID입니다. 이 ID는 작업의 name 필드 중 마지막 부분입니다. 작업을 만들 때 ID를 보았을 수 있습니다.

HTTP 메서드 및 URL:

GET http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

 

출력에서 다음을 확인합니다.

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "webAccessUris": {
    "workerpool0-0": "INTERACTIVE_SHELL_URI"
  }
}

webAccessUris 필드가 표시되지 않으면 Vertex AI에서 작업 실행이 아직 시작되지 않았기 때문일 수 있습니다. state 필드에 JOB_STATE_RUNNING이 표시되는지 확인합니다. 상태가 JOB_STATE_QUEUED 또는 JOB_STATE_PENDING이면 1분 동안 기다린 다음 프로젝트 정보를 다시 가져옵니다.

HyperparameterTuningJob

다음 탭에서는 projects.locations.hyperparameterTuningJobs.get 요청을 보내는 다양한 방법을 보여줍니다.

gcloud

gcloud ai hp-tuning-jobs describe 명령어를 실행합니다.

gcloud ai hp-tuning-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

다음을 바꿉니다.

  • JOB_ID: 작업의 숫자 ID입니다. 이 ID는 작업의 name 필드 중 마지막 부분입니다. 작업을 만들 때 ID를 보았을 수 있습니다. 작업 ID를 모르는 경우 gcloud ai hp-tuning-jobs list 명령어를 실행하여 적절한 작업을 찾을 수 있습니다.

  • LOCATION: 작업을 만든 리전입니다.

REST

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION: 작업을 만든 리전입니다.

  • PROJECT_ID: 프로젝트 ID

  • JOB_ID: 작업의 숫자 ID입니다. 이 ID는 작업의 name 필드 중 마지막 부분입니다. 작업을 만들 때 ID를 보았을 수 있습니다.

HTTP 메서드 및 URL:

GET http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

 

출력에서 다음을 확인합니다.

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "trials": [
    ...
    {
      ...
      "state": "ACTIVE",
      ...
      "webAccessUris": {
        "workerpool0-0": "INTERACTIVE_SHELL_URI"
      }
    }
  ],
}

webAccessUris 필드가 표시되지 않으면 Vertex AI에서 작업 실행이 아직 시작되지 않았기 때문일 수 있습니다. state 필드에 JOB_STATE_RUNNING이 표시되는지 확인합니다. 상태가 JOB_STATE_QUEUED 또는 JOB_STATE_PENDING이면 1분 동안 기다린 다음 프로젝트 정보를 다시 가져옵니다.

Vertex AI는 시도가 ACTIVE 상태가 되면 각 초매개변수 미세 조정 시도에 대한 대화형 셸 URI 집합을 제공합니다. 나중에 시도에 사용할 대화형 셸 URI를 가져오려면 평가판이 시작된 후 작업 정보를 다시 가져옵니다.

앞의 예시는 단일 복제본 학습에 예상되는 출력(기본 학습 노드에 대한 URI 1개)을 보여줍니다. 분산 학습을 수행하는 경우 출력에는 작업자 풀로 식별되는 각 학습 노드에 대한 URI 1개가 포함됩니다.

예를 들어 작업에 하나의 복제본이 포함된 기본 작업자 풀과 2개의 복제본이 포함된 보조 작업자 풀이 있으면 webAccessUris 필드가 다음과 비슷하게 표시됩니다.

{
  "workerpool0-0": "URI_FOR_PRIMARY",
  "workerpool1-0": "URI_FOR_FIRST_SECONDARY",
  "workerpool1-1": "URI_FOR_SECOND_SECONDARY"
}

대화형 셸 사용

학습 노드에 대화형 셸을 사용하려면 이전 섹션에서 찾은 URI 중 하나로 이동합니다. 브라우저에 Bash 셸이 표시되어 Vertex AI가 학습 코드를 실행 중인 컨테이너의 파일 시스템에 액세스할 수 있습니다.

다음 섹션에서는 셸을 사용할 때 고려해야 할 사항을 설명하고 셸에서 사용할 수 있는 모니터링 도구의 몇 가지 예시를 제공합니다.

작업 종료 방지

Vertex AI에서 작업 또는 시도 실행을 완료하면 대화형 셸에 즉시 액세스할 수 없게 됩니다. 이 경우 command terminated with exit code 137 메시지가 표시되거나 셸이 응답을 중지할 수 있습니다. 컨테이너의 파일 시스템에서 파일을 만든 경우 작업이 종료된 후에는 유지되지 않습니다.

경우에 따라 작업을 대화형 셸로 디버깅하기 위해 작업을 의도적으로 더 오래 실행할 수 있습니다. 예를 들어 다음과 같은 코드를 학습 코드에 추가하여 예외가 발생한 후 최소 1시간 동안 작업이 계속 실행되도록 할 수 있습니다.

import time
import traceback

try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour

하지만 작업이 계속 실행되는 한 Vertex AI 학습 요금이 발생합니다.

권한 문제 확인

대화형 셸 환경은 Vertex AI가 학습 코드를 실행하는 데 사용하는 서비스 계정에 대해 애플리케이션 기본 사용자 인증 정보(ADC)를 사용하여 인증됩니다. 자세한 내용은 셸에서 gcloud auth list를 실행하여 확인할 수 있습니다.

셸에서 gsutil, bq 및 ADC를 지원하는 기타 도구를 사용할 수 있습니다. 이를 통해 학습 코드에 필요한 특정 Cloud Storage 버킷, BigQuery 테이블 또는 기타 Google Cloud 리소스에 작업이 액세스할 수 있는지 확인할 수 있습니다.

py-spy로 Python 실행 시각화

py-spy를 사용하면 실행 중인 Python 프로그램을 수정하지 않고 프로파일링할 수 있습니다. 대화형 셸에서 py-spy를 사용하려면 다음을 수행합니다.

  1. py-spy을 설치합니다.

    pip3 install py-spy
    
  2. 셸에서 ps aux를 실행하고 Python 학습 프로그램의 PID를 찾습니다.

  3. 이전 단계에서 찾은 PID를 사용하여 py-spy 문서에 설명된 하위 명령어를 실행합니다.

  4. py-spy record를 사용하여 SVG 파일을 만드는 경우 나중에 로컬 컴퓨터에서 볼 수 있도록 이 파일을 Cloud Storage 버킷에 복사합니다. 예를 들면 다음과 같습니다.

    gsutil cp profile.svg gs://BUCKET
    

    BUCKET을 액세스할 수 있는 버킷의 이름으로 바꿉니다.

perf를 사용하여 성능 분석

perf를 사용하면 학습 노드의 성능을 분석할 수 있습니다. 노드의 Linux 커널에 적합한 perf 버전을 설치하려면 다음 명령어를 실행합니다.

apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf

그런 다음 perf 문서에 설명된 하위 명령어를 실행할 수 있습니다.

GPU 사용량 정보 검색

GPU가 있는 노드에서 실행되는 GPU 지원 컨테이너에는 일반적으로 GPU 사용량을 모니터링하는 데 도움이 되는 여러 명령줄 도구가 사전 설치되어 있습니다. 예를 들면 다음과 같습니다.

  • nvidia-smi를 사용하여 다양한 프로세스의 GPU 사용률을 모니터링합니다.

  • nvprof를 사용하여 다양한 GPU 프로파일링 정보를 수집합니다. nvprof는 기존 프로세스에 연결할 수 없으므로 이 도구를 사용하여 학습 코드를 실행하는 추가 프로세스를 시작하는 것이 좋습니다. 즉, 학습 코드가 노드에서 두 번 실행됩니다. 예를 들면 다음과 같습니다.

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    MODULE_NAME학습 애플리케이션 진입점 모듈의 정규화된 이름으로 바꿉니다(예: trainer.task).

    그런 다음 나중에 로컬 컴퓨터에서 분석할 수 있도록 출력 파일을 Cloud Storage 버킷으로 전송합니다. 예를 들면 다음과 같습니다.

    gsutil cp prof.nvvp gs://BUCKET
    

    BUCKET을 액세스할 수 있는 버킷의 이름으로 바꿉니다.

  • 구성 또는 Vertex AI 문제가 아닌 GPU 오류가 발생하면 nvidia-bug-report.sh를 사용하여 버그 신고를 만듭니다.

    그런 다음 나중에 로컬 컴퓨터에서 분석할 수 있도록 보고서를 Cloud Storage 버킷으로 전송하거나 NVIDIA로 보낼 수 있습니다. 예를 들면 다음과 같습니다.

    gsutil cp nvidia-bug-report.log.gz gs://BUCKET
    

    BUCKET을 액세스할 수 있는 버킷의 이름으로 바꿉니다.

bash에서 다음과 같은 NVIDIA 명령어를 찾을 수 없으면 셸의 PATH/usr/local/nvidia/bin/usr/local/cuda/bin을 추가해 봅니다.

export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"

다음 단계