TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 머신러닝>

[머신러닝]텐서플로 모델 훈련과 배포: 버텍스 AI (실패 및 보류)

by 기록자_Recordian 2024. 12. 7.
728x90
반응형
이전 내용
 

[머신러닝] 텐서플로 모델 훈련과 배포

머신러닝 [머신러닝] 머신러닝 기반 분석 모형 선정머신러닝 기반 분석 모형 선정   지도 학습, 비지도 학습, 강화 학습, 준지도 학습, 전이 학습 1) 지도 학습: 정답인 레이블(Label)이 포함되어

puppy-foot-it.tistory.com


버텍스 AI란?
출처: 구글 클라우드 - 버텍스 AI 사이트

 

https://cloud.google.com/vertex-ai/docs/start/introduction-unified-platform?hl=ko

 

Vertex AI 소개  |  Google Cloud

의견 보내기 Vertex AI 소개 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Vertex AI는 ML 모델과 AI 애플리케이션을 학습 및 배포하고 AI 기반 애플리케이션에서

cloud.google.com

Vertex AI는 ML 모델과 AI 애플리케이션을 학습 및 배포하고 AI 기반 애플리케이션에서 사용할 대규모 언어 모델(LLM)을 맞춤설정할 수 있게 해주는 머신러닝(ML) 플랫폼이다. Vertex AI는 데이터 엔지니어링, 데이터 과학, ML 엔지니어링 워크플로를 결합하여 팀이 공통의 도구 모음을 사용하여 공동작업을 수행하고 Google Cloud의 이점을 사용하여 애플리케이션을 확장할 수 있도록 지원한다.

Vertex AI는 모델 학습 및 배포를 위한 여러 옵션을 제공한다.

  • AutoML을 사용하면 코드를 작성하거나 데이터 분할을 준비하지 않고도 테이블 형식, 이미지, 텍스트 또는 동영상 데이터를 학습시킬 수 있다. 이러한 모델은 온라인 예측을 위해 배포하거나 일괄 예측을 위해 직접 쿼리할 수 있다.
  • 커스텀 학습을 사용하면 선호하는 ML 프레임워크 사용, 자체 학습 코드 작성, 초매개변수 조정 옵션 선택 등 학습 프로세스를 완벽하게 제어할 수 있다. 커스텀 학습 모델을 Model Registry로 가져와 사전 빌드된 또는 커스텀 컨테이너를 사용하여 온라인 예측을 위한 엔드포인트에 배포할 수 있다. 또는 일괄 예측을 위해 직접 쿼리할 수도 있다.
  • Model Garden을 사용하면 Vertex AI를 검색, 테스트, 맞춤설정 및 배포하고 오픈소스(OSS) 모델 및 애셋을 선택할 수 있다.
  • 생성형 AI는 여러 모달(텍스트, 코드, 이미지, 음성)에 대한 Google의 대규모 생성형 AI 모델에 대한 액세스를 제공다. 필요에 맞게 Google의 LLM을 조정한 후 AI 기반 애플리케이션에서 사용하도록 배포할 수 있다.

모델을 배포한 후에는 Vertex AI의 엔드 투 엔드 MLOps 도구를 사용하여 ML 수명 주기 전반에 걸쳐 프로젝트를 자동화하고 확장한다. 이러한 MLOps 도구는 성능 및 예산 요구사항에 따라 맞춤설정할 수 있는 완전 관리형 인프라에서 실행된다.

 

Python용 Vertex AI SDK를 사용하여 Jupyter 노트북 기반 개발 환경인 Vertex AI Workbench에서 전체 머신러닝 워크플로를 실행할 수 있다. Vertex AI와 통합된 Colaboratory 버전인 Colab Enterprise에서 모델을 개발하기 위해 팀과 협력할 수 있다. 기타 사용 가능한 인터페이스로는 Google Cloud 콘솔, Google Cloud CLI 명령줄 도구, 클라이언트 라이브러리, Terraform(제한적으로 지원)이 있다.


Vertex AI 및 머신러닝(ML) 워크플로
출처:구글 클라우드 - 버텍스 AI 사이트

 

 Vertex AI를 사용하여 모델을 빌드하고 배포하는 방법

  1. 데이터 준비: 데이터 세트를 추출하고 정리한 후 탐색적 데이터 분석(EDA)을 수행하여 ML 모델에서 예상하는 데이터 스키마와 특성을 파악한다. 데이터 변환 및 특성 추출을 모델에 적용하고 데이터를 학습, 검증, 테스트 세트로 분할한다.
    • Vertex AI Workbench 노트북을 사용하여 데이터를 탐색하고 시각화한다. Vertex AI Workbench는 Cloud Storage 및 BigQuery와 통합되어 더욱 빠른 데이터 액세스 및 처리를 지원한다.
    • 대규모 데이터 세트의 경우 Vertex AI Workbench 노트북에서 Dataproc Serverless Spark를 사용하여 Dataproc 클러스터를 직접 관리할 필요 없이 Spark 워크로드를 실행한다.
  2. 모델 학습: 모델 학습 방법을 선택하고 성능을 위해 조정한다.
    • 코드를 작성하지 않고 모델을 학습시키려면 AutoML 개요를 참조하는 것이 좋다. AutoML은 테이블 형식, 이미지, 텍스트, 동영상 데이터를 지원한다.
    • 원하는 ML 프레임워크를 사용하여 학습 코드를 직접 작성하고 커스텀 모델을 학습시키려면 커스텀 학습 개요를 참조하하면 된다.
    • 커스텀 조정 작업을 사용하여 커스텀 학습 모델의 초매개변수를 최적화한다.
    • Vertex AI Vizier는 복잡한 머신러닝(ML) 모델에서 초매개변수를 미세 조정한다.
    • Vertex AI 실험으로 다양한 ML 기법을 사용하여 모델을 학습시키고 결과를 비교한다.
    • 학습된 모델을 버전 관리 및 프로덕션에 전달할 Vertex AI Model Registry에 등록한다. Vertex AI Model Registry는 모델 평가 및 엔드포인트와 같은 검증 및 배포 기능과 통합된다.
  3. 모델 평가 및 반복: 학습된 모델을 평가하고, 평가 측정항목을 기준으로 데이터를 조정하고, 모델을 반복한다.
    • 정밀도, 재현율과 같은 모델 평가 측정항목을 사용하여 모델의 성능을 평가하고 비교한다. Vertex AI Model Registry를 통해 평가를 만들거나 Vertex AI Pipelines 워크플로에 평가를 포함한다.
  4. 모델 서빙: 모델을 프로덕션에 배포하고 온라인 예측을 가져오거나 일괄 예측을 위해 직접 쿼리한다.
    • 사전 빌드된 또는 커스텀 컨테이너를 사용하여 커스텀 학습 모델을 배포하여 실시간 온라인 예측을 수행한다(HTTP 예측이라고도 함).
    • 엔드포인트에 배포할 필요가 없는 비동기 일괄 예측을 수행한다.
    • 최적화된 TensorFlow 런타임을 사용하면 오픈소스 기반 사전 빌드된 TensorFlow Serving 컨테이너보다 저렴한 비용으로 지연 시간이 짧은 TensorFlow 모델을 서빙할 수 있다.
    • 테이블 형식 모델이 있는 온라인 서빙 사례의 경우 Vertex AI Feature Store를 사용하여 중앙 저장소의 특성을 서빙하고 특성 상태를 모니터링한다.
    • Vertex Explainable AI는 각 특성이 모델 예측(특성 기여 분석)에 어떻게 기여하는지 이해하고 학습 데이터 세트에서 라벨이 잘못 지정된 데이터를 찾는 데 도움이 된다(예시 기반 설명).
    • BigQuery ML로 학습된 모델에 대한 온라인 예측을 배포하고 수행한다.
  5. 모델 모니터링: 배포된 모델의 성능을 모니터링한다. 수신되는 예측 데이터로 모델을 재학습시켜 성능을 높인다.
    • Vertex AI Model Monitoring은 학습-서빙 편향과 예측 드리프트에 대해 모델을 모니터링하고 수신 예측 데이터 편향이 학습 기준에서 너무 멀리 벗어나면 알림을 전송한다.

버텍스 AI 사용 전 구글 클라우드 플랫폼에서 사용 설정하기

 

◆ 구글 클라우드 플랫폼에서 사용 설정하기

1. 먼저 구글 클라우드에 들어간 뒤, 구글 계정으로 로그인 한다.

2. 왼쪽 상단의 줄 세개를 클릭 > API 및 서비스 > 사용 설정된 API 및 서비스 클릭

3. 검색 창에 vertex ai api를 검색한 뒤, 검색결과에 나오는 Vertex AI API 클릭

4. Vertex AI API '사용' 버튼 클릭

 

5. 나오는 팝업에서 계정 활성화를 시킨 뒤, 계속 클릭

6. 사용 설정이 완료되었다.

 

7-1. 그리고 콘솔에서 서비스 계정을 생성해야 하는데, 'IAM 및 관리자' > '서비스 계정' > '+서비스 계정 만들기'를 클릭 한다.

7-2. 서비스 계정 이름, ID 등을 입력하고, 완료 버튼을 누른다.

8-1. 서비스 계정이 생성되면 키를 발급받아야 하는데, 작업 - 키 관리 클릭

8-2. 키 추가 > 새 키 만들기 클릭

8-3. 키의 유형을 선택하고 만들기 클릭 (JSON 권장)

8-4. json 확장자 파일이 다운로드 되면서 키 할당이 완료된다. (키 번호 노출 안되게 주의할 것!)


로컬 컴퓨터에서 구글 클라우드 플랫폼 설정하기

 

◆ 로컬 컴퓨터에 구글 클라우드 플랫폼 설정하기

 

이제 로컬환경에서 GCP를 사용할 수 있도록 설정해야 한다.

1. Google Cloud SDK 설치
Google Cloud SDK를 설치하고 설정한다. 이미 설치되어 있는 경우, 이 단계를 건너뛸 수 있다.

 

gcloud CLI 설치  |  Google Cloud CLI Documentation

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 gcloud CLI 설치 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 페이지에는 Google Cloud CLI

cloud.google.com

 

1-1. PowerShell 터미널을 열고 다음 PowerShell 명령어를 실행

(New-Object Net.WebClient).DownloadFile("https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe", "$env:Temp\GoogleCloudSDKInstaller.exe")

& $env:Temp\GoogleCloudSDKInstaller.exe

 

1-2. Turn on screen reader mode 에 체크하고 Next 를 계속 누르면 설치가 완료 된다.

 

2-1. 그다음에 CMD 창이 뜨고 y를 입력하면

 

2-2. 구글 계정으로 로그인하는 창이 나오고, 로그인하게 되면 Google Cloud SDK 계정 연동 창이 나온다.

구글 계정 - Google Cloud SDK 연동 완료

 

그러면 아까 그 CMD 창에 연동된 구글 계정이 나오는데, 먼저 아래 명령어를 통해 GCP환경을 초기화 한다.

gcloud init

init을 하면 project의 아이디를 입력하도록 나온다.

기존 프로젝트를 선택하거나, 새로운 프로젝트를 만든다. 나는 사용하던 프로젝트가 있어 그것을 선택했다.

 

초기화 설정을 하고나면, 그 다음에 클라우드 프로젝트를 고르라는 화면이 나온다.

(필자는 2번 프로젝트를 고름)

 

이제 GCLI 사용을 위한 준비가 끝났다.


로컬 컴퓨터에서 GCP 사용하기
주의! 필자는 이거 해결하느라 거의 2~3일 날렸음.


1. Python 라이브러리 설치
로컬 환경에 필요한 라이브러리를 설치한다. 다음 명령어를 사용하여 google-cloud-storage와 google-cloud-bigquery 라이브러리를 설치한다.

pip install google-cloud-storage google-cloud-bigquery google-auth google-auth-oauthlib google-auth-httplib2

 

2. 주피터 노트북을 켜고 아래 코드를 입력한다.

'project_id'의 경우, GCLI CMD 창에서 선택한 프로젝트 명을 입력하면 된다.

'key_path'의 경우, 실제 GCP 키가 다운로드된 파일 경로를 입력하면 된다.

즉, key_path = json파일경로-파일명.json

import os
from google.oauth2 import service_account

project_id = "my_project"  ##### 이를 프로젝트 ID로 변경. #####

# 서비스 계정 키 파일 경로 설정
key_path = "path/to/your/service-account-file.json"
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = key_path

 

3. SaveModel을 저장할 구글 클라우드 스토리지(GCS) 버킷을 만든다.

※ 버킷: 데이터를 저장하는 컨테이너. GCS는 버킷을 위해 전 세계에 걸쳐 하나의 네임스페이스를 사용하므로 단순한 이름(예. 'machine-learning')은 사용하지 못할 가능성이 높다. 또한 버킷 이름은 공개되므로 이름에 사적인 내용을 넣지 않도록 한다.

from google.cloud import storage

bucket_name = "hands_bucket"  ##### 고유한 버킷 이름 #####
location = "us-central1"

storage_client = storage.Client(project=project_id)
bucket = storage_client.create_bucket(bucket_name, location=location)
#bucket = storage_client.bucket(bucket_name)  # 버킷을 재사용하는 경우

 

위의 코드를 입력했을 때, 하단의 에러가 나온다면

ImportError: cannot import name 'builder' from 'google.protobuf.internal' (C:\Users\niceq\anaconda3\envs\jun\lib\site-packages\google\protobuf\internal\__init__.py)

protobuf 라이브러리의 버전 차이 또는 호환성 문제로 인해 발생하는 에러이므로, protobuf 라이브러리를 최신 버전으로 업그레이드하면 된다.

pip install --upgrade protobuf

 

그리고 주피터노트북을 켠 뒤, 데이터셋을 훈련하려고 할 때 아래와 같은 에러가 나온다면,

attributeerror: module 'tensorflow python.util .dispatch has no attribute add_fallback_dispatch_list

 

케라스를 tensorflow-gpu와 같은 버전으로 재설치해준다. (필자의 경우는 2.6.0 버전이었으므로)

pip install keras==2.6.0

 

이번에는 하단의 에러가 뜨는데, 

ImportError: cannot import name 'builder' from 'google.protobuf.internal' (C:\Users\niceq\anaconda3\envs\jun\lib\site-packages\google\protobuf\internal\__init__.py)

 

이럴 때는 하단의 명령어로 protobuf를 업그레이드 해준다.

pip install --upgrade protobuf

 

4. 이전 시간에 저장했던 my_mnist_model 디렉터리를 새 버킷에 업로드해본다.

GCS에서는 파일을 블롭 또는 오브젝트라고 부르며, 내부적으로는 버킷에 디렉터리 구조 없이 배치된다. 블롭 이름은 임의의 유니코드 문자열일 수 있으며 슬래시를 포함할 수도 있다.

GCP 콘솔과 다른 도구는 이러한 슬래시를 사용하여 디렉터리가 있는 것처럼 보이게 하므로, my_mnist_model 디렉터리를 업로드할 때는 디렉터리 말고 파일만 신경쓰면 된다.

def upload_directory(bucket, dirpath):
    dirpath = Path(dirpath)
    for filepath in dirpath.glob("**/*"):
        if filepath.is_file():
            blob = bucket.blob(filepath.relative_to(dirpath.parent).as_posix())
            blob.upload_from_filename(filepath)

upload_directory(bucket, "my_mnist_model")

 

이 함수의 경우, 업로드할 파일이 많으면 속도가 매우 느려지는데, 멀티스레딩을 통해 속도를 높일 수 있다.

구글 클라우드 CLI를 사용하는 경우에는 아래 명령어를 사용할 수 있다.

#!gsutil -m cp -r my_mnist_model gs://{bucket_name}/

 

5. 버텍스 AI에 MNIST 모델에 관해 알려준다.

버텍스 AI와 통신하기 위해 google-cloud-aiplatform 라이브러리를 사용할 수 있다. 

이 라이브러리를 먼저 설치하고, 라이브러리를 임포트하고 초기화한다.

그리고 표시할 이름, 모델의 GCS 경로 (여기서는 버전 0001), 버텍스 AI가 이 모델을 실행하는 데 사용할 도커 컨테이너의 URL을 지정하여 새로운 버텍스 AI 모델을 만든다.

 

5-1. 라이브러리 설치

pip install google-cloud-aiplatform

※ protobuf 버전이 충돌을 일으킬 수 있으므로, 맞는 버전을 잘 설치해야 한다. (필자는 이거 갖고 며칠을 헤매서 공부 진행이 멈췄는데, 3.19.5 였나? 이 버전 설치하고 컴퓨터 껐다 켰더니 해결되었다.)

 

5-2. aiplatform 라이브러리 import 

from google.cloud import aiplatform

server_image = "gcr.io/cloud-aiplatform/prediction/tf2-gpu.2-8:latest"

aiplatform.init(project=project_id, location=location)
mnist_model = aiplatform.Model.upload(
    display_name="mnist",
    artifact_uri=f"gs://{bucket_name}/my_mnist_model/0001",
    serving_container_image_uri=server_image,
)

※ 이것도 에러가 두 번이나 발생했는데, 하나는 

PermissionDenied: 403 Vertex AI API has not been used in project my-project before or it is disabled.

▶ 이거는 구글 클라우드 콘솔 접속해서 Vertex AI 활성화를 시켰더니 해결되었다.

 

그리고 나서, 또 다른 에러를 받았는데,

FailedPrecondition: 400 Service account `service-******-aiplatform.iam.gserviceaccount.com` does not have `[storage.objects.get]` IAM permission(s) to the directory "gs://hands_bucket/my_mnist_model/0001". Please either copy the files to the Google Cloud Storage bucket owned by your project, or grant the required IAM permission(s) to the service account.

▶ 챗gpt에서 알려준대로 하니 해결됐다.

1. Google Cloud Console 접속
Google Cloud Console에 접속합니다.
로그인이 필요하면, 자신의 Google 계정으로 로그인하세요.
오른쪽 상단의 프로젝트 선택 버튼을 클릭하고, my--project 프로젝트를 선택합니다.
2. Google Cloud Storage (GCS) 버킷을 위한 IAM 권한
왼쪽 메뉴에서 “IAM & 관리자” -> **“IAM”**을 클릭합니다.
상단의 “+멤버 추가” 버튼을 클릭합니다.
3. 서비스 계정에 대한 권한 추가
새 멤버 칸에 오류 메시지에서 언급된 서비스 계정인 service-*******@gcp-sa-aiplatforhttp://m.iam.gserviceaccount.com을 입력합니다.
역할 선택 드롭다운 메뉴에서 “Cloud Storage” -> **“Storage Object Viewer”**를 선택합니다.
저장 버튼을 클릭하여 변경 사항을 저장합니다.
4. 필요한 경우 추가 권한 제공
필요에 따라 추가 권한을 제공해야 할 수도 있습니다. 예를 들어 “Storage Object Admin” 역할을 부여하면 더 많은 권한을 갖게 됩니다.

 

6. 모델 배포, gRPC 또는 REST API로 쿼리하여 예측 수행

이를 위해서는 먼저 엔드포인트를 만들고, 이 엔드포인트에 모델을 배포한다.

※ 엔드포인트: 클라이언트 애플리케이션이 서비스에 액세스하려고 할 때 연결하는 곳.

 

아래 코드를 실행하기 전에! 구글 클라우드 콘솔에서 Compute Engine API 라는 것을 활성화 시켜야 한다.

(이것도 모르고 계속 해보는 데 오류 나서 애먹었다.)

 

endpoint = aiplatform.Endpoint.create(display_name="mnist-endpoint")

endpoint.deploy(
    mnist_model,
    min_replica_count=1,
    max_replica_count=5,
    machine_type="n1-standard-4",
    accelerator_type="NVIDIA_TESLA_K80",
    accelerator_count=1
)

▶ 해당 코드를 실행했더니, 'NVIDIA_TESLA_K80' 가속기가 유효하지 않다는 에러가 발생했다.

그래서 구글클라우드 가속기 타입 리스트를 산출하는 코드를 실행해서 가속기 리스트를 받아 

import subprocess

def list_accelerator_types():
    try:
        result = subprocess.run(
            "gcloud compute accelerator-types list",
            capture_output=True,
            text=True,
            check=True,
            shell=True
        )
        # 명령어 출력 결과 표시
        print(result.stdout)
    except subprocess.CalledProcessError as e:
        print(f"Error: {e.stderr}")
    except FileNotFoundError as e:
        print(f"File not found error: {e}")

# 실행
list_accelerator_types()

사용 가능한 리스트가 엄청 많다.

 

그중 아무거나 수정해서 입력하였다.

endpoint = aiplatform.Endpoint.create(display_name="mnist-endpoint")

endpoint.deploy(
    mnist_model,
    min_replica_count=1,
    max_replica_count=5,
    machine_type="n1-standard-4",
    accelerator_type="NVIDIA_TESLA_V100",
    accelerator_count=1
)

그랬더니 이번에는

ResourceExhausted: 429 The following quotas are exceeded:

▶ 해당 오류는 할당된 리소스 한계를 초과했음을 나타내며, 특히 CustomModelServingV100GPUsPerProjectPerRegion 할당량을 초과한 경우 발생한다. 이는 특정 프로젝트 및 지역에서 NVIDIA Tesla V100 GPU를 사용할 수 있는 최대 수량을 초과했음을 의미한다.

그렇다고 리스트 중에 아무거나 넣으면 안되는게, 어떤 가속기를 넣으면 아래와 같이 해당 가속기가 머신 타입을 지원하지 않는다는 에러도 뜬다.

InvalidArgument: 400 Accelerator "NVIDIA_TESLA_A100" is not supported for machine type "n1-standard-4"

 

 

 

AcceleratorType  |  AI Platform Training  |  Google Cloud

This legacy version of AI Platform Training is deprecated and will no longer be available on Google Cloud after January 31, 2025. Migrate your resources to Vertex AI custom training to get new machine learning features that are unavailable in AI Platform.

cloud.google.com

 

구글 클라우드 플랫폼 한 번 써보기 정말 힘들다...

거기다가 예전에 구글 클라우드 크레딧을 모두 소진했으므로, 해당 프로젝트는 추후 실무 진행 시에 다시 해보는 걸로 하고 종료한다.


다음 내용

 


[출처]

핸즈 온 머신러닝

구글 클라우드 - 버텍스 AI

자세히 쓰는 Gemini API

https://manchann.tistory.com/24

728x90
반응형