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

학습 중에 대화형 셸을 사용하여 학습 코드가 실행되는 컨테이너를 검사할 수 있습니다. AI Platform Training에서 실행되는 각 런타임 버전 또는 커스텀 컨테이너에서 파일 시스템을 탐색하고 디버깅 유틸리티를 실행할 수 있습니다.

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

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

시작하기 전에

학습 또는 초매개변수 조정 작업을 실행할 때 대화형 셸을 사용할 수 있습니다. 학습 코드를 준비하고 학습 작업을 실행할 때는 다음 요구사항을 충족해야 합니다.

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

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

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

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

    • ml.jobs.create
    • ml.jobs.get
    • ml.jobs.cancel

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

    이러한 권한을 얻는 한 가지 방법은 조직의 관리자에게 AI Platform Training 관리자 역할(roles/ml.admin)을 부여해 달라고 요청하는 것입니다. AI Platform Training 개발자 역할(roles/ml.developer)이 부여된 경우 만든 작업의 대화형 셸에 액세스할 수 있습니다.

고급 사례 요구사항

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

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

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

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

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

    • VPC 네트워크 피어링에 VPC 서비스 제어를 사용할 수 없습니다.

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

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

대화형 셸 사용 설정

학습 작업에 대화형 셸을 사용 설정하려면 학습 작업을 만들 때 작업의 trainingInput 필드에서 enableWebAccess API 필드true로 설정합니다.

다음 예시에서는 gcloud CLI를 사용할 때 --enable-web-access 플래그를 추가하여 이를 수행하는 방법을 보여줍니다. 현재 Google Cloud Console에서 대화형 셸을 사용 설정하여 학습 작업을 만들 수 없습니다.

이 예시에서는 trainer 디렉터리의 로컬 파일 시스템에 모듈 이름이 task학습 애플리케이션이 있다고 가정합니다.

학습 작업을 만들려면 다음 명령어를 실행합니다.

  gcloud ai-platform jobs submit training JOB_ID \
    --enable-web-access \
    --job-dir=JOB_DIR \
    --module-name=trainer.task \
    --package-path=trainer \
    --python-version=3.7 \
    --region=REGION \
    --runtime-version=2.11 \
    --scale-tier=CUSTOM \
    --master-machine-type=n1-highmem-8

이 명령어에서 다음 자리표시자를 바꿉니다.

  • JOB_ID: 작업에 대해 선택하는 이름입니다.
  • JOB_DIR: 학습 애플리케이션이 업로드될 Cloud Storage 디렉터리의 경로입니다.
  • REGION: 학습 작업을 만들려는 리전입니다. 대화형 셸을 지원하는 리전이어야 합니다.

    성공하면 명령어가 다음과 같은 출력을 생성합니다.

    Job [JOB_ID] submitted successfully.
    Your job is still active. You may view the status of your job with the command
    
      $ gcloud ai-platform jobs describe JOB_ID
    
    or continue streaming the logs with the command
    
      $ gcloud ai-platform jobs stream-logs JOB_ID
    jobId: JOB_ID
    state: QUEUED
    

웹 액세스 URI 가져오기

이전 섹션의 안내에 따라 학습을 시작한 후 Google Cloud Console 또는 gcloud 명령줄 도구를 사용하여 대화형 셸에 액세스하는 데 사용할 수 있는 URI를 확인합니다. AI Platform Training은 작업에 포함된 각 학습 노드의 URI를 제공합니다.

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

학습 작업

다음 탭에는 표준 학습 작업의 TrainingOutput에 액세스하는 다양한 방법이 나와 있습니다.

gcloud

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

gcloud ai-platform jobs describe JOB_ID

다음을 바꿉니다.

  • JOB_ID: 작업의 ID입니다. 작업을 만들 때 이 ID를 설정합니다. 작업의 ID를 모르는 경우 gcloud ai-platform jobs list 명령어를 실행하여 적절한 작업을 찾을 수 있습니다.

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

trainingOutput:
  webAccessUris:
    master-replica-0: INTERACTIVE_SHELL_URI

콘솔

  1. Google Cloud Console에서 AI Platform Training 작업 페이지를 엽니다.

    Google Cloud Console에서 작업 열기

  2. 목록에서 작업 이름을 클릭하여 작업 세부정보 페이지를 엽니다.

  3. 학습 출력 섹션에서 Json 표시 버튼을 클릭하여 작업의 TrainingOutput에 대한 JSON 뷰를 확장합니다.

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

{
  "webAccessUris": {
    "master-replica-0": "INTERACTIVE_SHELL_URI"
  }
}

webAccessUris 필드가 표시되지 않는다면 AI Platform Training에서 작업이나 시도 실행을 시작하지 않았기 때문일 수 있습니다. state 필드에 RUNNING이 표시되는지 확인합니다. 상태가 QUEUED 또는 PREPARING이면 1분 동안 기다린 다음 작업 정보를 다시 가져옵니다.

초매개변수 조정 작업

다음 탭에서는 초매개변수 조정 작업의 TrainingOutput에 액세스하는 다양한 방법을 보여줍니다.

gcloud

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

gcloud ai-platform jobs describe JOB_ID

다음을 바꿉니다.

  • JOB_ID: 작업의 ID입니다. 작업을 만들 때 이 ID를 설정합니다. 작업의 ID를 모르는 경우 gcloud ai-platform jobs list 명령어를 실행하여 적절한 작업을 찾을 수 있습니다.

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

trainingOutput:
  trials:
  - trialId: '1'
    webAccessUris:
      master-replica-0: INTERACTIVE_SHELL_URI

콘솔

  1. Google Cloud Console에서 AI Platform Training 작업 페이지를 엽니다.

    Google Cloud Console에서 작업 열기

  2. 목록에서 작업 이름을 클릭하여 작업 세부정보 페이지를 엽니다.

  3. 학습 출력 섹션에서 Json 표시 버튼을 클릭하여 작업의 TrainingOutput에 대한 JSON 뷰를 확장합니다.

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

{
  "trials": [
    {
      ...
      "webAccessUris": {
        "master-replica-0": "INTERACTIVE_SHELL_URI"
      }
    },
    ...
  ]
}

webAccessUris 필드가 표시되지 않는다면 AI Platform Training에서 작업이나 시도 실행을 시작하지 않았기 때문일 수 있습니다. state 필드에 RUNNING이 표시되는지 확인합니다. 상태가 QUEUED 또는 PREPARING이면 1분 동안 기다린 다음 작업 정보를 다시 가져옵니다.

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

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

예를 들어 작업에 마스터와 두 작업자가 있는 경우 webAccessUris 필드는 다음과 유사합니다.

{
  "master-replica-0": "URI_FOR_PRIMARY",
  "worker-replica-0": "URI_FOR_FIRST_SECONDARY",
  "worker-replica-1": "URI_FOR_SECOND_SECONDARY"
}

사용 가능한 리전

AI Platform Training용 대화형 셸 사용은 다음 리전에서 지원됩니다.

미주

  • 오리건(us-west1)
  • 로스앤젤레스(us-west2)
  • 아이오와(us-central1)
  • 사우스캐롤라이나(us-east1)
  • 북 버지니아(us-east4)
  • 몬트리올(northamerica-northeast1)

유럽

  • 런던(europe-west2)
  • 벨기에(europe-west1)
  • 취리히(europe-west6)
  • 프랑크푸르트(europe-west3)

아시아 태평양

  • 싱가포르(asia-southeast1)
  • 타이완(asia-east1)
  • 도쿄(asia-northeast1)
  • 시드니(australia-southeast1)
  • 서울(asia-northeast3)

또한 AI Platform Training은 학습을 위한 추가 리전을 제공합니다.

대화형 셸 사용

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

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

작업 종료 방지

AI Platform Training에서 작업 또는 시도 실행을 완료하면 대화형 셸에 즉시 액세스할 수 없게 됩니다. 이 경우 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

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

권한 문제 확인

대화형 셸 환경은 AI Platform Training이 학습 코드를 실행하는 데 사용하는 서비스 계정에 대해 애플리케이션 기본 사용자 인증 정보(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을 액세스할 수 있는 버킷의 이름으로 바꿉니다.

  • 구성 또는 AI Platform Training에 문제가 아닌 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}"

다음 단계