[에러 해결] GCP Vertex AI Pipelines ModelGetOp 400 Request contains an invalid argument 원인과 해결 방법
Google Cloud Vertex AI Pipelines에서 ModelGetOp를 사용하여 Vertex AI Model Registry에 등록된 모델을 가져오려 할 때 400 Request contains an invalid argument 에러가 발생하는 문제에 직면할 수 있습니다. 이 가이드는 해당 에러의 원인을 분석하고 효과적인 해결 방법을 제시하여 여러분의 MLOps 파이프라인 구축을 돕습니다.
에러 상황 소개
여러분은 아마 다음과 같은 상황에서 이 에러를 마주했을 것입니다. Vertex AI Model Registry에 이미 학습된 모델이 등록되어 있고, 이를 Vertex AI Pipelines (Kubeflow Pipelines 기반) 내에서 배포하고자 할 때, ModelGetOp 컴포넌트가 예상치 못한 오류를 발생시킵니다.
아래 파이프라인 코드와 유사하게 ModelGetOp에 모델의 전체 리소스 경로(Full Resource Name)를 직접 전달했을 때 문제가 발생합니다:
@kfp.dsl.pipeline(
name=DISPLAY_NAME,
pipeline_root=BUCKET_URI,
)
def pipeline(PROJECT_ID: str):
model_task = ModelGetOp(
model_name='projects/80514224188/locations/us-central1/models/1800006515679555824',
project=PROJECT_ID,
location=GCP_REGION,
)
endpoint_op = EndpointCreateOp(
project=PROJECT_ID,
location=GCP_REGION,
display_name=DISPLAY_NAME,
)
ModelDeployOp(
model=model_task.outputs["model"],
endpoint=endpoint_op.outputs["endpoint"],
dedicated_resources_min_replica_count=1,
dedicated_resources_max_replica_count=1,
dedicated_resources_machine_type=MACHINE_TYPE,
)
파이프라인 실행 시 ModelGetOp 단계에서 400 Request contains an invalid argument 오류가 발생하며, 더 이상의 구체적인 로그는 제공되지 않아 디버깅에 어려움을 겪게 됩니다. 하지만 동일한 전체 리소스 경로를 사용하여 파이프라인 외부에서 aiplatform.Model('projects/...')와 같이 모델을 성공적으로 가져올 수 있다는 점에서 더욱 혼란스러울 수 있습니다.
발생 원인
이 에러의 핵심 원인은 ModelGetOp 컴포넌트의 model_name 파라미터가 예상하는 입력 형식에 대한 오해입니다.
- Vertex AI SDK for Python (
google.cloud.aiplatform)의aiplatform.Model()클래스는 모델의 전체 리소스 경로 (예:projects/<PROJECT_NUMBER>/locations/<LOCATION>/models/<MODEL_ID>)를 직접 파싱하여 사용할 수 있습니다. - 하지만 Kubeflow Pipelines의
ModelGetOp와 같은 Vertex AI SDK pre-built 컴포넌트들은 내부적으로 특정 형식의 인자를 기대합니다.ModelGetOp의model_name파라미터는 모델의 고유한 ID (숫자 문자열) 또는 표시 이름(Display Name)을 기대하며,project및location파라미터와 함께 사용하여 해당 프로젝트 및 위치 내에서 모델을 식별합니다. 전체 리소스 경로를 직접 전달하면, 컴포넌트 내부에서 이 경로를 유효한model_name으로 인식하지 못하고 잘못된 인자 오류(400)를 반환하게 됩니다.
해결 방법 코드 예시
ModelGetOp에 전체 리소스 경로 대신 모델의 고유한 숫자 ID를 전달해야 합니다. 전체 리소스 경로에서 모델 ID를 추출하는 간단한 방법은 다음과 같습니다.
에러 발생 코드 (Original Code)
# 에러 발생 코드 model_task = ModelGetOp( model_name='projects/80514224188/locations/us-central1/models/1800006515679555824', # <-- 문제의 코드 project=PROJECT_ID, location=GCP_REGION, )
수정된 코드 (Corrected Code)
# 모델의 전체 리소스 경로 (예시) FULL_MODEL_RESOURCE_NAME = 'projects/80514224188/locations/us-central1/models/1800006515679555824' # 전체 리소스 경로에서 모델 ID 추출 # 마지막 '/' 이후의 문자열이 모델 ID입니다. MODEL_ID = FULL_MODEL_RESOURCE_NAME.split('/')[-1] # 수정된 ModelGetOp 호출 model_task = ModelGetOp( model_name=MODEL_ID, # <-- 모델의 숫자 ID를 전달 project=PROJECT_ID, location=GCP_REGION, )
만약 model_name 파라미터에 모델의 표시 이름을 사용하고 싶다면, 해당 모델의 정확한 표시 이름을 전달하면 됩니다. 하지만 모델 ID를 사용하는 것이 더 명확하고 충돌 가능성이 적습니다.
향후 예방을 위한 팁
- 공식 문서 확인: Vertex AI SDK의 각 KFP 컴포넌트(예:
ModelGetOp,EndpointCreateOp등)의 공식 문서를 항상 참조하여 각 파라미터가 기대하는 정확한 입력 형식을 확인하세요. SDK 컴포넌트는 일반적인 Vertex AI API 또는 SDK 클라이언트와는 다른 파라미터 명명 규칙이나 값 형식을 가질 수 있습니다. - 파라미터 유형 이해: '리소스 이름'과 'ID' 또는 '표시 이름'을 구분하는 습관을 들이세요. 전체 리소스 이름은 API 호출이나 SDK 초기화에 자주 사용되지만, 특정 컴포넌트는 컨텍스트에 맞는 더 간결한 식별자를 요구할 수 있습니다.
- 디버깅 시 로그 활용:
400 Invalid Argument에러는 광범위하게 발생할 수 있으므로, 가능하다면 컴포넌트의 입력 파라미터를 출력하는 임시 단계를 파이프라인에 추가하여 실제 전달되는 값이 무엇인지 확인하는 것이 좋습니다. - 일관된 명명 규칙: 모델을 등록할 때 명확하고 일관된 표시 이름 또는 ID 명명 규칙을 사용하여 파이프라인에서 쉽게 참조할 수 있도록 합니다.
이 가이드를 통해 GCP Vertex AI Pipelines에서 ModelGetOp 에러를 해결하고 안정적인 MLOps 파이프라인을 구축하는 데 도움이 되기를 바랍니다.
답글 남기기