문제해결

모델을 학습시키거나 클라우드에서 예측을 할 때 발생하는 오류의 원인을 찾기란 쉽지 않습니다. 이 페이지에서는 AI Platform Prediction에서 발생하는 문제를 찾고 디버깅하는 방법을 설명합니다. 사용 중인 머신러닝 프레임워크에 문제가 발생할 경우 머신러닝 프레임워크 문서를 대신 읽어보세요.

명령줄 도구

오류: (gcloud) 잘못된 선택: 'ai-platform'.

이 오류는 gcloud 업데이트가 필요함을 의미합니다. gcloud를 업데이트하려면 다음 명령어를 실행합니다.

gcloud components update
오류: (gcloud) 인식할 수 없는 인수: --framework=SCIKIT_LEARN.

이 오류는 gcloud 업데이트가 필요함을 의미합니다. gcloud를 업데이트하려면 다음 명령어를 실행합니다.

gcloud components update
오류: (gcloud) 인식할 수 없는 인수: --framework=XGBOOST.

이 오류는 gcloud 업데이트가 필요함을 의미합니다. gcloud를 업데이트하려면 다음 명령어를 실행합니다.

gcloud components update
오류: (gcloud) 모델 로드 실패: 모델을 로드할 수 없음: /tmp/model/0001/model.pkl. '\x03'. (오류 코드: 0)

이 오류는 모델을 내보내는 데 잘못된 라이브러리가 사용되었음을 의미합니다. 이 문제를 해결하려면 올바른 라이브러리를 사용하여 모델을 다시 내보냅니다. 예를 들어 model.pkl 형태의 모델은 pickle 라이브러리를 사용하여 내보내고 model.joblib 형태의 모델은 joblib 라이브러리를 사용하여 내보냅니다.

오류: (gcloud.ai-platform.jobs.submit.prediction) 인수 --데이터 형식: 잘못된 선택: 'json'.

이 오류는 일괄 예측 작업을 제출할 때 json--data-format 플래그의 값으로 지정되었음을 의미합니다. JSON 데이터 형식을 사용하려면 text--data-format 플래그의 값으로 제공해야 합니다.

Python 버전

오류: 잘못된 모델이 오류와 함께 감지되었습니다: '모델 로드 실패: 다음 모델을 로드할 수 없습니다:
/tmp/model/0001/model.pkl. 지원되지 않는 pickle 프로토콜: 3. 모델이
python 2를 사용하여 내보냈었는지 확인하세요. 그렇지 않은 경우
모델을 배포할 때 올바른 'python_version' 매개변수를 지정하세요. 현재,
'python_version'은 2.7 및 3.5를 허용합니다. (오류 코드: 0)'
Python 3으로 내보낸 모델 파일을 Python 2.7로 설정된 AI Platform Prediction 모델 버전 리소스에 배포할 때 이 오류가 발생합니다.

이 문제를 해결하려면 다음 안내를 따르세요.

  • 새 모델 버전 리소스를 만들고 'python_version'을 3.5로 설정합니다.
  • 동일한 모델 파일을 새 모델 버전 리소스에 배포합니다.

virtualenv 명령어를 찾을 수 없음

virtualenv를 활성화하려 할 때 이 오류가 발생한 경우, 가능한 한 가지 해결방법은 virtualenv가 포함된 디렉터리를 $PATH 환경 변수에 추가하는 것입니다. 이 변수를 수정하면 전체 파일 경로를 입력하지 않고도 virtualenv 명령어를 사용할 수 있습니다.

먼저 다음 명령어를 실행하여 virtualenv를 설치합니다.

pip install --user --upgrade virtualenv

설치 프로그램이 $PATH 환경 변수를 수정하라는 메시지를 표시하고 virtualenv 스크립트에 대한 경로를 제공합니다. macOS에서는 /Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin과 비슷하게 표시됩니다.

셸에서 환경 변수를 로드하는 파일을 엽니다. 일반적으로는 macOS에서 ~/.bashrc 또는 ~/.bash_profile입니다.

다음 줄을 추가하고 [VALUES-IN-BRACKETS]를 적절한 값으로 바꿉니다.

export PATH=$PATH:/Users/[YOUR-USERNAME]/Library/Python/[YOUR-PYTHON-VERSION]/bin

마지막으로 업데이트된 .bashrc(또는 .bash_profile) 파일을 로드하기 위해 다음 명령어를 실행합니다.

source ~/.bashrc

작업 로그 사용

문제해결을 시작하는 가장 좋은 방법은 Cloud Logging에서 캡처한 작업 로그를 확인하는 것입니다.

다양한 유형의 작업 로깅

다음 섹션에서 볼 수 있듯이 로깅 환경은 작업 유형에 따라 다릅니다.

일괄 예측 로그

모든 일괄 예측 작업은 로그에 기록됩니다.

온라인 예측 로그

온라인 예측 요청은 기본적으로 로그를 생성하지 않습니다. 모델 리소스를 만들 때 Cloud Logging을 사용 설정할 수 있습니다.

gcloud

gcloud ai-platform models create를 실행할 때 --enable-logging 플래그를 포함합니다.

Python

projects.models.create 호출을 위해 사용하는 Model 리소스에서 onlinePredictionLoggingTrue로 설정합니다.

로그 찾기

분산 학습을 사용할 때 클러스터의 모든 프로세스 이벤트를 비롯한 작업의 모든 이벤트가 작업 로그에 기록됩니다. 분산 학습 작업을 실행 중인 경우 마스터 작업자 프로세스에 대한 작업 수준 로그가 보고됩니다. 일반적으로 오류를 해결하는 첫 번째 단계는 클러스터의 다른 프로세스에 대해 로깅된 이벤트를 필터링하여 해당 프로세스의 로그를 검사하는 것입니다. 이 섹션의 예시는 이러한 필터링을 설명합니다.

Google Cloud 콘솔의 명령줄 또는 Cloud Logging 섹션에서 로그를 필터링할 수 있습니다. 두 경우 모두 필요에 따라 필터에 다음 메타데이터 값을 사용합니다.

메타데이터 항목 필터링 결과
resource.type "cloud_ml_job"과 동일
resource.labels.job_id 작업 이름과 동일
resource.labels.task_name 마스터 작업자의 로그 항목만 읽기 위해 'master-replica-0'과 동일
severity 오류 조건에 해당하는 로그 항목만 읽도록 오류보다 크거나 동일

명령줄

gcloud 베타 로깅 읽기를 사용하여 필요에 맞는 쿼리를 구성합니다. 예를 들면 다음과 같습니다.

각 예는 다음 환경 변수를 사용합니다.

PROJECT="my-project-name"
JOB="my_job_name"

원하는 경우 문자열 리터럴을 대신 입력할 수 있습니다.

작업 로그를 화면에 출력하는 방법은 다음과 같습니다.
gcloud ai-platform jobs stream-logs $JOB

gcloud ai-platform jobs stream-logs의 모든 옵션을 확인하세요.

마스터 작업자의 로그를 화면에 출력하는 방법은 다음과 같습니다.
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\""
마스터 작업자의 오류 로그만 화면에 출력하는 방법은 다음과 같습니다.
gcloud beta logging read --project=${PROJECT} "resource.type=\"ml_job\" and resource.labels.job_id=${JOB} and resource.labels.task_name=\"master-replica-0\" and severity>=ERROR"

앞의 예시는 AI Platform Prediction 학습 작업에서 로그를 필터링하는 가장 일반적인 경우입니다. Cloud Logging은 상세검색이 필요할 때 사용할 수 있는 여러 가지 강력한 필터링 옵션을 제공합니다. 고급 필터링 문서에서 이러한 옵션을 자세히 설명합니다.

콘솔

  1. Google Cloud 콘솔에서 AI Platform Prediction 작업 페이지를 엽니다.

    Google Cloud 콘솔에서 작업 열기

  2. 작업 페이지 목록에서 실패한 작업을 선택하여 세부정보를 확인합니다.

실패한 작업을 보여주는 AI Platform Prediction 작업 목록

  1. 로그 보기를 클릭하여 Cloud Logging을 엽니다.

실패한 작업의 작업 세부정보 페이지

Cloud Logging으로 바로 이동할 수 있지만 추가 단계를 통해 작업을 찾을 수도 있습니다.

  1. 리소스 선택기를 펼칩니다.
  2. 리소스 목록에서 AI Platform Prediction 작업을 펼칩니다.
  3. job_id 목록에서 작업 이름을 찾습니다. 검색창에 작업 이름의 처음 몇 글자를 입력하여 표시되는 작업 범위를 좁힐 수 있습니다.
  4. 작업 항목을 펼치고 작업 목록에서 master-replica-0을 선택합니다.

모두 펼쳐진 로그 필터 선택기

로그에서 정보 얻기

작업에 적합한 로그를 찾아 master-replica-0으로 필터링하면 로깅된 이벤트를 검사하여 문제의 원인을 찾을 수 있습니다. 이때 표준 Python 디버깅 절차가 필요하며 주의 사항은 다음과 같습니다.

  • 이벤트에는 여러 수준의 심각도가 있습니다. 필터링하여 오류 또는 오류 및 경고와 같은 특정 수준의 이벤트만 확인할 수 있습니다.
  • 트레이너가 복구할 수 없는 오류 조건으로 종료되는 문제는(반환 코드 > 0) 스택 trace 이전에 예외로 로깅됩니다.

섹션이 펼쳐지지 않은 로그 항목

  • 로깅된 JSON 메시지의 객체를 펼쳐 더 많은 정보를 가져올 수 있습니다(오른쪽 방향 화살표로 표시되며 콘텐츠는 {...} 형태로 나열됨). 예를 들어 jsonPayload를 펼치면 기본 오류 정보에 표시되는 것보다 더 읽기 쉬운 형식으로 스택 trace를 확인할 수 있습니다.

JSON 페이로드 섹션이 펼쳐진 로그 항목

  • 일부 오류는 재시도 가능한 오류의 인스턴스를 표시합니다. 이러한 오류는 일반적으로 스택 추적을 포함하지 않으므로 진단하기가 더 어려울 수 있습니다.

로깅을 최대한 활용

AI Platform 예측 학습 서비스는 다음 이벤트를 자동으로 로깅합니다.

  • 서비스 내부의 상태 정보
  • 트레이너 애플리케이션이 stderr로 전송하는 메시지
  • 트레이너 애플리케이션이 stdout으로 전송하는 출력 텍스트

적절한 프로그래밍 권장사항을 따르면 트레이너 애플리케이션의 오류를 더 쉽게 해결할 수 있습니다.

  • stderr로 의미 있는 메시지를 전송합니다(예를 들어 logging을 통해).
  • 문제가 생기면 가장 논리적이고 구체적인 예외를 발생시킵니다.
  • 예외 객체에 설명 문자열을 추가합니다.

예외에 대한 자세한 내용은 Python 문서를 참조하세요.

예측 문제해결

이 섹션에서는 예측 진행 시 일반적으로 발생하는 문제를 다룹니다.

온라인 예측의 특정 상황 처리

이 섹션에서는 일부 사용자들에게 영향을 미치는 온라인 예측 오류 조건에 대한 지침을 제공합니다.

예측 완료까지 너무 많은 시간 소요(30~180초)

온라인 예측을 느리게 만드는 가장 일반적인 원인은 처리 노드를 0에서부터 확장하는 것입니다. 만약 모델에 정기적으로 예측 요청을 하는 경우 시스템은 하나 이상의 노드를 준비시켜 예측 작업에 사용합니다. 모델이 오랜 시간 동안 예측을 제공하지 않으면 서비스에서 준비 노드를 0으로 '축소'합니다. 이러한 축소가 일어난 후 실행되는 다음 예측 요청에는 평소보다 더 많은 시간이 걸립니다. 이는 해당 요청을 처리하기 위해 서비스에서 노드를 프로비저닝해야 하기 때문입니다.

HTTP 상태 코드

온라인 예측 요청에 오류가 발생하면 일반적으로 서비스에서 HTTP 상태 코드가 반환됩니다. 다음은 온라인 예측 환경에서 일반적으로 발생하는 코드와 그 의미입니다.

429 - 메모리 부족

모델을 실행하는 동안 처리 노드의 메모리가 부족합니다. 이 시점에서 예측 노드에 할당된 메모리를 늘릴 방법은 없습니다. 모델을 실행하기 위해 다음을 시도해볼 수 있습니다.

  • 다음을 통해 모델 크기를 줄입니다.
    • 정밀도가 낮은 변수 사용
    • 지속적인 데이터 정량화
    • 다른 입력 기능의 크기 줄이기(예: 더 짧은 단어 사용)
    • 더 작은 인스턴스 배치를 사용하여 요청을 재전송
429 - 보류 중인 요청이 너무 많음

모델이 처리할 수 있는 것보다 더 많은 요청을 받고 있습니다. 자동 확장을 사용 중인 경우 시스템이 확장하는 것보다 더 빠르게 요청을 받는 경우입니다. 또한 최소 노드 값이 0이면 이 구성은 첫 번째 노드가 실행될 때까지 100% 오류율이 관측되는 '콜드 스타트' 시나리오로 이어질 수 있습니다.

자동 확장을 사용하면 지수 백오프로 요청을 재전송할 수 있습니다. 지수 백오프로 요청을 다시 전송하면 시스템이 조정할 시간을 벌 수 있습니다.

기본적으로 자동 확장은 CPU 사용률이 60%를 초과할 때 트리거되며 구성 가능합니다.

429 - 할당량

Google Cloud Platform 프로젝트에서 보낼 수 있는 요청은 100초당 10,000회(초당 약 100회)로 제한됩니다. 이 오류가 일시적으로 급증하는 경우 지수 백오프를 통해 재시도하여 모든 요청을 제시간에 처리할 수 있습니다. 이 코드가 지속적으로 나타나는 경우 할당량 증가를 요청할 수 있습니다. 자세한 내용은 할당량 페이지를 참조하세요.

503 - 시스템이 컴퓨터 네트워크에서 비정상적인 트래픽을 감지함

모델이 단일 IP에서 받은 요청의 비율이 너무 높아서 시스템에서 서비스 거부 공격을 의심합니다. 1분 동안 요청을 중단한 후 더 낮은 속도로 전송을 재개하세요.

500 - 모델을 로드할 수 없음

시스템이 모델을 로드하는 데 문제가 있는 경우입니다. 다음 단계를 시도해 보세요.

  • 트레이너가 올바른 모델을 내보내고 있는지 확인합니다.
  • gcloud ai-platform local predict 명령어로 테스트 예측을 시도합니다.
  • 모델을 다시 내보내고 로드를 재시도합니다.

예측 요청의 오류 형식 지정

다음 메시지는 모두 예측 입력과 관련되어 있습니다.

'요청 본문에 비어 있거나 잘못된/유효하지 않은 JSON이 있음'
서비스가 요청에서 JSON을 파싱하지 못했거나 요청이 비어 있습니다. JSON을 무효화하는 오류 메시지나 누락이 있는지 확인합니다.
'요청 본문에 누락된 '인스턴스' 필드가 있음'
요청 본문이 올바른 형식을 따르지 않는 경우입니다. 이는 모든 입력 인스턴스가 있는 목록을 포함하는 "instances"라는 단일 키를 가진 JSON 객체여야 합니다.
요청 생성 시 JSON 인코딩 오류 발생

요청에 base64로 인코딩된 데이터가 포함되어 있지만 적절한 JSON 형식은 아닙니다. 각 base64 인코딩된 문자열은 "b64"라는 단일 키가 포함된 객체로 표시해야 합니다. 예를 들면 다음과 같습니다.

  {"b64": "an_encoded_string"}

base64로 인코딩되지 않은 바이너리 데이터가 있는 경우에도 base64 오류가 발생합니다. 다음과 같이 데이터를 인코딩하고 형식을 지정합니다.

  {"b64": base64.b64encode(binary_data)}

자세한 내용은 바이너리 데이터 형식 지정 및 인코딩을 참조하세요.

데스크톱보다 클라우드에서 예측 소요 시간이 오래 걸림

온라인 예측은 높은 속도의 예측 요청을 신속하게 제공하도록 확장 가능한 서비스로 설계되었습니다. 이 서비스는 모든 제공 요청 전반의 집계 성능에 최적화되어 있습니다. 확장성에 중점을 두기 때문에 로컬 머신에서 작은 수의 예측을 생성할 때와는 다른 성능 특성을 갖게 됩니다.

다음 단계