데이터과학 삼학년

GCP AI-platform Stream Logs error 본문

GCP

GCP AI-platform Stream Logs error

Dan-k 2020. 2. 22. 16:28
반응형

GCP의 서비스 중 ai-platform(구 CMLE) 기능을 사용할 때 나타나는 에러에 대해 언급하려 한다.

 

stream logs 에서 나는 에러가 있다. 바로 아래 그림이다.

gcp 서버쪽으로 logs 관련 api를 호출하는 과정에서 나는 서버 에러로 보인다.

이러한 에러는 실제로 gcp의 ai-platform에서 학습과 예측을 시키는데 전혀 문제가 없지만

파이프 라인으로 구성한 프로젝트 잡의 경우에는 매우 치명적이다.

 

예를 들어

 

파이프라인으로 데이터 전처리 - 학습 - 예측 - 결과적재 의 단계를 실행 시킬때

 

학습의 단계가 완료 된후 예측으로 넘어가야하기 때문에 학습이 완료된 지 여부를 알아야한다.

이것을 위해 사용하는 것이 stream-logs 라는 옵션이다.  

이 옵션을 넣게 되면 학습이 다 될때까지 stream logs가 실행되면서 학습의 완료 후에 다음단계인 예측단계로 넘어갈 수 있다.

gcloud ai-platform jobs submit training train_jobs1 \
                 --project=${PROJECT_ID} \
                 --job-dir gs:// --- \
                 --module-name trainer.task \
                 --package-path model/trainer \
                 --region us-central1 \
                 --python-version 3.5 \
                 --runtime-version 1.14 \
                 --stream-logs \
                 -- \
                 

그러나 gcp 내부에서 stream-logs 관련 에러가 나게 되면 파이프라인 자체가 종료되기 때문에 학습은 되더라도 다음 단계인 예측-결과적재 부분의 stage가 실행되지 못한다.

 

예측부분에는 stream-logs라는 옵션이 없기 때문에 jobs stream-logs라는 명령어로 예측을 기다리기도 하는데

이 역시 gcp내의 서버에러가 나면 무용지물이다.

gcloud ai-platform jobs stream-logs JOB 
                                    [--allow-multiline-logs] 
                                    [--polling-interval=POLLING_INTERVAL; default=60] 
                                    [--task-name=TASK_NAME] 
                                    [GCLOUD_WIDE_FLAG …]

 

이런 문제를 해결하기 위한 방법은... stream-logs 옵션을 지우고

gcp에 계속해서 requests로 완료가 되었는지 찔러주며 학습 또는 예측이 완료되었는지 확인한 후 다음 단계(코드)를 실행시키는 방법이다.

import os
import argparse
import time

from google.oauth2.service_account import Credentials
from googleapiclient import discovery
from googleapiclient import errors


parser = argparse.ArgumentParser(description='')
parser.add_argument("--project_id", required=True)
parser.add_argument("--job_id", required=True)

args = parser.parse_args()
projectName = args.project_id
jobName     = args.job_id

projectId   = 'projects/{}'.format(projectName)
jobId       = '{}/jobs/{}'.format(projectId, jobName)
print("job_name : ", jobName)
print("job_id :", jobId)


service_account_credentials_path = '{}/credentials/credentials.json'.format(os.getenv("HOME"))
credentials = Credentials.from_service_account_file(service_account_credentials_path)


ml = discovery.build('ml','v1', credentials=credentials)
request = ml.projects().jobs().get(name=str(jobId))
response = None

time.sleep(60)
while True:
    try:
        response = request.execute()
        print('response:',response)
    except errors.HttpError:
        pass

    if response == None:
        print('[ERROR] Response is None.')
        break

    state = response['state']
    if state == 'SUCCEEDED':
        print('[SUCCESS] Job finished successfully.')
        break
    elif state == 'FAILED' or state == 'CANCELLED' or state == 'STATE_UNSPECIFIED':
        print('[ERROR] Job finished unsuccessfully.')
        print('Job state: {}'.format(response['state']))
        break
        
    time.sleep(30)

 

다른 방법은 학습과 예측에 소요되는 시간을 예상하여 sleep을 걸어주는 방법이 있을 수 있다.(그러나 이것은 매우 비추...)

 

 

GCP.....해결할 수 없는 에러들은...쓰는 사람이 잘 빠져나갈 수 있게 써야하는 것인가...

 

사람들이 많이 쓰는 Cloud 서비스는 왜 쓰는지 그 이유가 있는 것이라는 것을...

슬슬 입문해봐야겠다. 사람들이 많이 쓰는 Cloud 서비스

 

 

 

출처 : https://cloud.google.com/ml-engine/docs/python-client-library?hl=ko
 

Python 클라이언트 라이브러리 사용  |  AI Platform  |  Google Cloud

이 가이드는 Python 클라이언트 라이브러리에 익숙해지도록 고안된 기본 가이드입니다. 이 실습을 마치면 다음을 할 수 있습니다. AI Platform 서비스를 Python 방식으로 표현할 수 있습니다. 이 표현을 사용하여 프로젝트에 모델을 만들면 다른 모델 및 작업 관리 API를 호출하는 방법을 이해할 수 있습니다. 참고: 이 가이드의 코드 샘플에서는 Python 2.7을 사용합니다. AI Platform에서는 Python 2.7 또는 Python 3.

cloud.google.com

 

728x90
반응형
LIST

'GCP' 카테고리의 다른 글

AutoML Natural Language 소개  (0) 2020.05.22
Dataflow SQL  (0) 2020.04.06
Bigquery Table_Suffix 관련 error(적재되는 data type이 꼬였을 때)  (0) 2020.01.30
Data_analysis on GCP  (0) 2020.01.17
Data engineering on GCP  (0) 2020.01.17
Comments