Private Service Connect를 사용하여 온프레미스에서 Vertex AI 일괄 예측에 액세스


일괄 예측은 모델을 엔드포인트에 배포할 필요 없이 모델 리소스에서 직접 예측을 요청하는 비동기식 요청입니다.

이 튜토리얼에서는 고가용성 VPN(HA VPN)을 사용하여 멀티 클라우드 및 온프레미스 비공개 연결의 기반이 되는 두 Virtual Private Cloud 네트워크 간에 학습된 모델에 비공개로 일괄 예측 요청을 전송합니다.

이 튜토리얼은 Vertex AI, 가상 프라이빗 클라우드(VPC), Google Cloud 콘솔, Cloud Shell에 익숙한 엔터프라이즈 네트워크 관리자, 데이터 과학자, 연구원을 대상으로 작성되었습니다. Vertex AI Workbench에 익숙하면 도움이 되지만 필수는 아닙니다.

Private Service Connect를 사용하여 일괄 예측에 액세스하는 아키텍처 다이어그램

목표

  • 이전 다이어그램에 나와 있듯이 2개의 가상 프라이빗 클라우드(VPC) 네트워크를 만듭니다.
    • 하나(vertex-networking-vpc)는 일괄 예측을 위해 Google API에 액세스하는 데 사용됩니다.
    • 다른 하나(onprem-vpc)는 온프레미스 네트워크를 나타냅니다.
  • vertex-networking-vpconprem-vpc를 연결하기 위해 HA VPN 게이트웨이, Cloud VPN 터널, Cloud Router를 배포합니다.
  • Vertex AI 일괄 예측 모델을 빌드하고 Cloud Storage 버킷에 업로드합니다.
  • Private Service Connect(PSC) 엔드포인트를 만들어 비공개 요청을 Vertex AI 일괄 예측 REST API로 전달합니다.
  • Private Service Connect 엔드포인트의 경로를 onprem-vpc에 공지하도록 vertex-networking-vpc에서 Cloud Router 커스텀 공지 모드를 구성합니다.
  • HA VPN을 통해 비공개로 일괄 예측 요청을 전송하는 클라이언트 애플리케이션(on-prem-client)을 나타내는 Compute Engine VM 인스턴스를 onprem-vpc에 만듭니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Google Cloud project.

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Cloud Shell을 열고 이 튜토리얼에 나열된 명령어를 실행합니다. Cloud Shell은 웹브라우저에서 프로젝트와 리소스를 관리할 수 있는 Google Cloud의 대화형 셸 환경입니다.
  5. Cloud Shell에서 현재 프로젝트를 Google Cloud 프로젝트 ID로 설정한 후 동일한 프로젝트 ID를 projectid 셸 변수에 저장합니다.
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    PROJECT_ID를 프로젝트 ID로 바꿉니다. 필요한 경우 Google Cloud 콘솔에서 프로젝트 ID를 찾을 수 있습니다. 자세한 내용은 프로젝트 ID 찾기를 참조하세요.
  6. 프로젝트 소유자가 아니라면 프로젝트 소유자에게 프로젝트 IAM 관리자(roles/resourcemanager.projectIamAdmin) 역할을 부여해 달라고 요청합니다. 다음 단계에서 IAM 역할을 부여하려면 이 역할이 있어야 합니다.
  7. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/compute.instanceAdmin.v1, roles/compute.networkAdmin, roles/compute.securityAdmin, roles/dns.admin, roles/iap.tunnelResourceAccessor, roles/notebooks.admin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/servicedirectory.editor, roles/serviceusage.serviceUsageAdmin, roles/storage.admin, roles/aiplatform.admin, roles/aiplatform.user, roles/resourcemanager.projectIamAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  8. Enable the DNS, Artifact Registry, IAM, Compute Engine, Notebooks, and Vertex AI APIs:

    gcloud services enable dns.googleapis.com artifactregistry.googleapis.com iam.googleapis.com compute.googleapis.com notebooks.googleapis.com aiplatform.googleapis.com

VPC 네트워크 만들기

이 섹션에서는 일괄 예측을 위해 Google API에 액세스하는 VPC 네트워크 1개와 온프레미스 네트워크를 시뮬레이션하기 위한 VPC 네트워크 1개를 만듭니다. 두 VPC 네트워크 각각에 Cloud Router와 Cloud NAT 게이트웨이를 만듭니다. Cloud NAT 게이트웨이는 외부 IP 주소가 없는 Compute Engine 가상 머신(VM) 인스턴스에 대한 발신 연결을 제공합니다.

  1. vertex-networking-vpc VPC 네트워크 만들기

    gcloud compute networks create vertex-networking-vpc \
      --subnet-mode custom
    
  2. vertex-networking-vpc 네트워크에서 기본 IPv4 범위가 10.0.1.0/28workbench-subnet이라는 서브넷을 만듭니다.

    gcloud compute networks subnets create workbench-subnet \
      --range=10.0.1.0/28 \
      --network=vertex-networking-vpc \
      --region=us-central1 \
      --enable-private-ip-google-access
    
  3. 온프레미스 네트워크(onprem-vpc)를 시뮬레이션하도록 VPC 네트워크를 만듭니다.

    gcloud compute networks create onprem-vpc \
      --subnet-mode custom
    
  4. onprem-vpc 네트워크에서 기본 IPv4 범위가 172.16.10.0/29onprem-vpc-subnet1이라는 서브넷을 만듭니다.

    gcloud compute networks subnets create onprem-vpc-subnet1 \
      --network onprem-vpc \
      --range 172.16.10.0/29 \
      --region us-central1
    

VPC 네트워크가 올바르게 구성되었는지 확인

  1. Google Cloud 콘솔의 VPC 네트워크 페이지에서 현재 프로젝트의 네트워크 탭으로 이동합니다.

    VPC 네트워크로 이동

  2. VPC 네트워크 목록에서 네트워크 2개(vertex-networking-vpconprem-vpc)가 생성되었는지 확인합니다.

  3. 현재 프로젝트의 서브넷 탭을 클릭합니다.

  4. VPC 서브넷 목록에서 workbench-subnetonprem-vpc-subnet1 서브넷이 생성되었는지 확인합니다.

하이브리드 연결 구성

이 섹션에서는 서로 연결된 HA VPN 게이트웨이 2개를 만듭니다. 하나는 vertex-networking-vpc VPC 네트워크에 있습니다. 다른 하나는 onprem-vpc VPC 네트워크에 있습니다. 각 게이트웨이에는 Cloud Router와 VPN 터널 쌍이 포함됩니다.

HA VPN 게이트웨이 만들기

  1. Cloud Shell에서 vertex-networking-vpc VPC 네트워크의 HA VPN 게이트웨이를 만듭니다.

    gcloud compute vpn-gateways create vertex-networking-vpn-gw1 \
       --network vertex-networking-vpc \
       --region us-central1
    
  2. onprem-vpc VPC 네트워크의 HA VPN 게이트웨이를 만듭니다.

    gcloud compute vpn-gateways create onprem-vpn-gw1 \
       --network onprem-vpc \
       --region us-central1
    
  3. Google Cloud 콘솔에서 VPN 페이지의 Cloud VPN 게이트웨이 탭으로 이동합니다.

    VPN으로 이동

  4. 2개의 게이트웨이(vertex-networking-vpn-gw1onprem-vpn-gw1)가 생성되었고 각 게이트웨이에 인터페이스 IP 주소 2개가 있는지 확인합니다.

Cloud Router 및 Cloud NAT 게이트웨이 만들기

두 VPC 네트워크 각각에 일반 Cloud Router 1개와 리전 Cloud Router 1개를 만듭니다. 각 리전 Cloud Router에서 Cloud NAT 게이트웨이를 만듭니다. Cloud NAT 게이트웨이는 외부 IP 주소가 없는 Compute Engine 가상 머신(VM) 인스턴스에 대한 발신 연결을 제공합니다.

  1. Cloud Shell에서 vertex-networking-vpc VPC 네트워크의 Cloud Router를 만듭니다.

    gcloud compute routers create vertex-networking-vpc-router1 \
       --region us-central1\
       --network vertex-networking-vpc \
       --asn 65001
    
  2. onprem-vpc VPC 네트워크의 Cloud Router를 만듭니다.

    gcloud compute routers create onprem-vpc-router1 \
       --region us-central1\
       --network onprem-vpc\
       --asn 65002
    
  3. vertex-networking-vpc VPC 네트워크의 리전 Cloud Router를 만듭니다.

    gcloud compute routers create cloud-router-us-central1-vertex-nat \
      --network vertex-networking-vpc \
      --region us-central1
    
  4. 리전 Cloud Router에서 Cloud NAT 게이트웨이를 구성합니다.

    gcloud compute routers nats create cloud-nat-us-central1 \
      --router=cloud-router-us-central1-vertex-nat \
      --auto-allocate-nat-external-ips \
      --nat-all-subnet-ip-ranges \
      --region us-central1
    
  5. onprem-vpc VPC 네트워크의 리전 Cloud Router를 만듭니다.

    gcloud compute routers create cloud-router-us-central1-onprem-nat \
      --network onprem-vpc \
      --region us-central1
    
  6. 리전 Cloud Router에서 Cloud NAT 게이트웨이를 구성합니다.

    gcloud compute routers nats create cloud-nat-us-central1-on-prem \
      --router=cloud-router-us-central1-onprem-nat \
      --auto-allocate-nat-external-ips \
      --nat-all-subnet-ip-ranges \
      --region us-central1
    
  7. Google Cloud 콘솔에서 Cloud Router 페이지로 이동합니다.

    Cloud Router로 이동

  8. Cloud Router 목록에서 다음 라우터가 생성되었는지 확인합니다.

    • cloud-router-us-central1-onprem-nat
    • cloud-router-us-central1-vertex-nat
    • onprem-vpc-router1
    • vertex-networking-vpc-router1

    새 값을 보려면 Google Cloud 콘솔 브라우저 탭을 새로고침해야 할 수 있습니다.

  9. Cloud Router 목록에서 cloud-router-us-central1-vertex-nat를 클릭합니다.

  10. 라우터 세부정보 페이지에서 cloud-nat-us-central1 Cloud NAT 게이트웨이가 생성되었는지 확인합니다.

  11. 뒤로 화살표를 클릭하여 Cloud Router 페이지로 돌아갑니다.

  12. 라우터 목록에서 cloud-router-us-central1-onprem-nat를 클릭합니다.

  13. 라우터 세부정보 페이지에서 cloud-nat-us-central1-on-prem Cloud NAT 게이트웨이가 생성되었는지 확인합니다.

VPN 터널 만들기

  1. Cloud Shell의 vertex-networking-vpc 네트워크에서 vertex-networking-vpc-tunnel0이라는 VPN 터널을 만듭니다.

    gcloud compute vpn-tunnels create vertex-networking-vpc-tunnel0 \
      --peer-gcp-gateway onprem-vpn-gw1 \
      --region us-central1 \
      --ike-version 2 \
      --shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
      --router vertex-networking-vpc-router1 \
      --vpn-gateway vertex-networking-vpn-gw1 \
      --interface 0
    
  2. vertex-networking-vpc 네트워크에서 vertex-networking-vpc-tunnel1이라는 VPN 터널을 만듭니다.

    gcloud compute vpn-tunnels create vertex-networking-vpc-tunnel1 \
      --peer-gcp-gateway onprem-vpn-gw1 \
      --region us-central1 \
      --ike-version 2 \
      --shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
      --router vertex-networking-vpc-router1 \
      --vpn-gateway vertex-networking-vpn-gw1 \
      --interface 1
    
  3. onprem-vpc 네트워크에서 onprem-vpc-tunnel0이라는 VPN 터널을 만듭니다.

    gcloud compute vpn-tunnels create onprem-vpc-tunnel0 \
      --peer-gcp-gateway vertex-networking-vpn-gw1 \
      --region us-central1\
      --ike-version 2 \
      --shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
      --router onprem-vpc-router1 \
      --vpn-gateway onprem-vpn-gw1 \
      --interface 0
    
  4. onprem-vpc 네트워크에서 onprem-vpc-tunnel1이라는 VPN 터널을 만듭니다.

    gcloud compute vpn-tunnels create onprem-vpc-tunnel1 \
      --peer-gcp-gateway vertex-networking-vpn-gw1 \
      --region us-central1\
      --ike-version 2 \
      --shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
      --router onprem-vpc-router1 \
      --vpn-gateway onprem-vpn-gw1 \
      --interface 1
    
  5. Google Cloud 콘솔에서 VPN 페이지로 이동합니다.

    VPN으로 이동

  6. VPN 터널 목록에서 VPN 터널 4개가 생성되었는지 확인합니다.

BGP 세션 설정

Cloud Router는 경계 게이트웨이 프로토콜(BGP)을 사용하여 VPC 네트워크(이 경우 vertex-networking-vpc)와 온프레미스 네트워크(onprem-vpc로 표시) 간에 경로를 교환합니다. Cloud Router에서 온프레미스 라우터의 인터페이스와 BGP 피어를 구성합니다. 인터페이스와 BGP 피어 구성은 함께 BGP 세션을 구성합니다. 이 섹션에서는 vertex-networking-vpc에 대한 2개의 BGP 세션과 onprem-vpc에 대한 2개의 BGP 세션을 만듭니다.

라우터 사이에 인터페이스와 BGP 피어를 구성하면 경로 교환이 자동으로 시작됩니다.

vertex-networking-vpc용 BGP 세션 설정

  1. Cloud Shell의 vertex-networking-vpc 네트워크에서 vertex-networking-vpc-tunnel0에 대한 BGP 인터페이스를 만듭니다.

    gcloud compute routers add-interface vertex-networking-vpc-router1 \
      --interface-name if-tunnel0-to-onprem \
      --ip-address 169.254.0.1 \
      --mask-length 30 \
      --vpn-tunnel vertex-networking-vpc-tunnel0 \
      --region us-central1
    
  2. vertex-networking-vpc 네트워크에서 bgp-onprem-tunnel0에 대한 BGP 피어를 만듭니다.

    gcloud compute routers add-bgp-peer vertex-networking-vpc-router1 \
      --peer-name bgp-onprem-tunnel0 \
      --interface if-tunnel0-to-onprem \
      --peer-ip-address 169.254.0.2 \
      --peer-asn 65002 \
      --region us-central1
    
  3. vertex-networking-vpc 네트워크에서 vertex-networking-vpc-tunnel1에 대한 BGP 인터페이스를 만듭니다.

    gcloud compute routers add-interface vertex-networking-vpc-router1 \
      --interface-name if-tunnel1-to-onprem \
      --ip-address 169.254.1.1 \
      --mask-length 30 \
      --vpn-tunnel vertex-networking-vpc-tunnel1 \
      --region us-central1
    
  4. vertex-networking-vpc 네트워크에서 bgp-onprem-tunnel1에 대한 BGP 피어를 만듭니다.

    gcloud compute routers add-bgp-peer vertex-networking-vpc-router1 \
      --peer-name bgp-onprem-tunnel1 \
      --interface if-tunnel1-to-onprem \
      --peer-ip-address 169.254.1.2 \
      --peer-asn 65002 \
      --region us-central1
    

onprem-vpc용 BGP 세션 설정

  1. onprem-vpc 네트워크에서 onprem-vpc-tunnel0에 대한 BGP 인터페이스를 만듭니다.

    gcloud compute routers add-interface onprem-vpc-router1 \
      --interface-name if-tunnel0-to-vertex-networking-vpc \
      --ip-address 169.254.0.2 \
      --mask-length 30 \
      --vpn-tunnel onprem-vpc-tunnel0 \
      --region us-central1
    
  2. onprem-vpc 네트워크에서 bgp-vertex-networking-vpc-tunnel0에 대한 BGP 피어를 만듭니다.

    gcloud compute routers add-bgp-peer onprem-vpc-router1 \
      --peer-name bgp-vertex-networking-vpc-tunnel0 \
      --interface if-tunnel0-to-vertex-networking-vpc \
      --peer-ip-address 169.254.0.1 \
      --peer-asn 65001 \
      --region us-central1
    
  3. onprem-vpc 네트워크에서 onprem-vpc-tunnel1에 대한 BGP 인터페이스를 만듭니다.

    gcloud compute routers add-interface   onprem-vpc-router1  \
      --interface-name if-tunnel1-to-vertex-networking-vpc \
      --ip-address 169.254.1.2 \
      --mask-length 30 \
      --vpn-tunnel onprem-vpc-tunnel1 \
      --region us-central1
    
  4. onprem-vpc 네트워크에서 bgp-vertex-networking-vpc-tunnel1에 대한 BGP 피어를 만듭니다.

    gcloud compute routers add-bgp-peer onprem-vpc-router1 \
      --peer-name bgp-vertex-networking-vpc-tunnel1 \
      --interface if-tunnel1-to-vertex-networking-vpc \
      --peer-ip-address 169.254.1.1 \
      --peer-asn 65001 \
      --region us-central1
    

BGP 세션 생성 검증

  1. Google Cloud 콘솔에서 VPN 페이지로 이동합니다.

    VPN으로 이동

  2. VPN 터널 목록에서 각 터널의 BGP 세션 상태 열 값이 BGP 세션 구성에서 BGP 설정됨으로 변경되었는지 확인합니다. 새 값을 보려면 Google Cloud 콘솔 브라우저 탭을 새로고침해야 할 수 있습니다.

vertex-networking-vpc로 학습된 경로 검증

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. VPC 네트워크 목록에서 vertex-networking-vpc를 클릭합니다.

  3. 경로 탭을 클릭합니다.

  4. 리전 목록에서 us-central1(아이오와)을 선택하고 보기를 클릭합니다.

  5. 대상 IP 범위 열에서 onprem-vpc-subnet1 서브넷의 IP 범위(172.16.10.0/29)가 두 번 표시되는지 확인합니다.

학습된 경로 onprem-vpc 검증

  1. 뒤로 화살표를 클릭하여 VPC 네트워크 페이지로 돌아갑니다.

  2. VPC 네트워크 목록에서 onprem-vpc를 클릭합니다.

  3. 경로 탭을 클릭합니다.

  4. 리전 목록에서 us-central1(아이오와)을 선택하고 보기를 클릭합니다.

  5. 대상 IP 범위 열에서 workbench-subnet 서브넷 IP 범위(10.0.1.0/28)가 두 번 표시되는지 확인합니다.

Private Service Connect 소비자 엔드포인트 만들기

  1. Cloud Shell에서 Google API에 액세스하는 데 사용될 소비자 엔드포인트 IP 주소를 예약합니다.

    gcloud compute addresses create psc-googleapi-ip \
      --global \
      --purpose=PRIVATE_SERVICE_CONNECT \
      --addresses=192.168.0.1 \
      --network=vertex-networking-vpc
    
  2. 엔드포인트를 Google API 및 서비스에 연결하는 전달 규칙을 만듭니다.

    gcloud compute forwarding-rules create pscvertex \
     --global \
     --network=vertex-networking-vpc\
     --address=psc-googleapi-ip \
     --target-google-apis-bundle=all-apis
    

vertex-networking-vpc의 커스텀 공지 경로 만들기

이 섹션에서는 Cloud Router 커스텀 공지 모드를 vertex-networking-vpc-router1(vertex-networking-vpc의 Cloud Router)의 커스텀 IP 범위 공지로 구성하여 PSC 엔드포인트의 IP 주소를 onprem-vpc 네트워크에 공지합니다.

  1. Google Cloud 콘솔에서 Cloud Router 페이지로 이동합니다.

    Cloud Router로 이동

  2. Cloud Router 목록에서 vertex-networking-vpc-router1을 클릭합니다.

  3. 라우터 세부정보 페이지에서 수정을 클릭합니다.

  4. 공지된 경로 섹션에서 경로에 대해 커스텀 경로 만들기를 선택합니다.

  5. Cloud Router에서 사용할 수 있는 서브넷을 계속 공지하려면 Cloud Router에 표시되는 모든 서브넷 공지 체크박스를 선택합니다. 이 옵션을 사용 설정하면 기본 공지 모드에서 Cloud Router 동작을 모방합니다.

  6. 커스텀 경로 추가를 클릭합니다.

  7. 소스커스텀 IP 범위를 선택합니다.

  8. IP 주소 범위에 다음 IP 주소를 입력합니다.

    192.168.0.1
    
  9. 설명에 다음 텍스트를 입력합니다.

    Custom route to advertise Private Service Connect endpoint IP address
    
  10. 완료를 클릭한 다음 저장을 클릭합니다.

onprem-vpc에서 공지된 경로를 학습했는지 검증

  1. Google Cloud 콘솔에서 경로 페이지로 이동합니다.

    경로로 이동

  2. 유효한 경로 탭에서 다음을 수행합니다.

    1. 네트워크onprem-vpc를 선택합니다.
    2. 리전us-central1 (Iowa)을 선택합니다.
    3. 보기를 클릭합니다.
    4. 경로 목록에서 이름이 .onprem-vpc-router1-bgp-vertex-networking-vpc-tunnel0onprem-vpc-router1-bgp-vfertex-networking-vpc-tunnel1로 시작하고 둘 다 대상 IP 범위 192.168.0.1가 있는 항목이 있는지 확인합니다.

      이러한 항목이 바로 표시되지 않으면 몇 분 정도 기다린 후 Google Cloud 콘솔 브라우저 탭을 새로고침합니다.

사용자 관리형 서비스 계정을 사용하는 onprem-vpc VM 만들기

이 섹션에서는 일괄 예측 요청을 보내는 온프레미스 클라이언트 애플리케이션을 시뮬레이션하는 VM 인스턴스를 만듭니다. Compute Engine 및 IAM 권장사항을 준수하는 이 VM은 Compute Engine 기본 서비스 계정 대신 사용자 관리 서비스 계정을 사용합니다.

사용자 관리형 서비스 계정 만들기

  1. Cloud Shell에서 다음 명령어를 실행하고 PROJECT_ID를 프로젝트 ID로 바꿉니다.

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. onprem-user-managed-sa라는 서비스 계정을 만듭니다.

    gcloud iam service-accounts create onprem-user-managed-sa \
      --display-name="onprem-user-managed-sa-onprem-client"
    
  3. 서비스 계정에 Vertex AI 사용자(roles/aiplatform.user) 역할을 할당합니다.

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/aiplatform.user"
    
  4. 서비스 계정에 스토리지 객체 뷰어(storage.objectViewer) 역할을 할당합니다.

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:onprem-user-managed-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/storage.objectViewer"
    

on-prem-client VM 인스턴스 만들기

만든 VM 인스턴스에는 외부 IP 주소가 없으며 인터넷을 통한 직접 액세스를 허용하지 않습니다. VM에 대한 관리 액세스를 사용 설정하려면 IAP(Identity-Aware Proxy) TCP 전달을 사용하세요.

  1. Cloud Shell에서 on-prem-client VM 인스턴스를 만듭니다.

    gcloud compute instances create on-prem-client \
      --zone=us-central1-a \
      --image-family=debian-11 \
      --image-project=debian-cloud \
      --subnet=onprem-vpc-subnet1 \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --no-address \
      --shielded-secure-boot \
      --service-account=onprem-user-managed-sa@$projectid.iam.gserviceaccount.com \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install tcpdump dnsutils -y"
    
  2. IAP가 VM 인스턴스에 연결하도록 허용하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create ssh-iap-on-prem-vpc \
      --network onprem-vpc \
      --allow tcp:22 \
      --source-ranges=35.235.240.0/20
    

Vertex AI API에 대한 공개 액세스 검증

이 섹션에서는 dig 유틸리티를 사용하여 on-prem-client VM 인스턴스에서 Vertex AI API(us-central1-aiplatform.googleapis.com)에 대해 DNS 조회를 수행합니다. dig 출력은 기본 액세스가 공개 VIP만 사용하여 Vertex AI API에 액세스함을 보여줍니다.

다음 섹션에서는 Vertex AI API에 대한 비공개 액세스를 구성합니다.

  1. Cloud Shell에서 IAP를 사용하여 on-prem-client VM 인스턴스에 로그인합니다.

    gcloud compute ssh on-prem-client \
      --zone=us-central1-a \
      --tunnel-through-iap
    
  2. on-prem-client VM 인스턴스에서 dig 명령어를 실행합니다.

    dig us-central1-aiplatform.googleapis.com
    

    다음과 비슷한 dig 출력이 표시됩니다. 여기서 응답 섹션의 IP 주소는 공개 IP 주소입니다.

    ; <<>> DiG 9.16.44-Debian <<>> us-central1.aiplatfom.googleapis.com
    ;; global options: +cmd
    ;; Got answer:
    ;; <>/span>->HEADER<<- opcode: QUERY, status: NOERROR, id: 42506
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 512
    ;; QUESTION SECTION:
    ;us-central1.aiplatfom.googleapis.com. IN A
    
    ;; ANSWER SECTION:
    us-central1.aiplatfom.googleapis.com. 300 IN A  173.194.192.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  142.250.152.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  172.217.219.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  209.85.146.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  209.85.147.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  142.250.125.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  142.250.136.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  142.250.148.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  209.85.200.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  209.85.234.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  142.251.171.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  108.177.112.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  142.250.128.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  142.251.6.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  172.217.212.95
    us-central1.aiplatfom.googleapis.com. 300 IN A  74.125.124.95
    
    ;; Query time: 8 msec
    ;; SERVER: 169.254.169.254#53(169.254.169.254)
    ;; WHEN: Wed Sep 27 04:10:16 UTC 2023
    ;; MSG SIZE  rcvd: 321
    

Vertex AI API에 대한 비공개 액세스 구성 및 검증

이 섹션에서는 일괄 예측 요청을 전송할 때 요청이 PSC 엔드포인트로 리디렉션되도록 Vertex AI API에 대한 비공개 액세스를 구성합니다. PSC 엔드포인트는 다시 이러한 비공개 요청을 Vertex AI 일괄 예측 REST API로 전달합니다.

PSC 엔드포인트를 가리키도록 /etc/hosts 파일을 업데이트합니다.

이 단계에서는 공개 서비스 엔드포인트(us-central1-aiplatform.googleapis.com)로 전송된 요청이 PSC 엔드포인트(192.168.0.1)로 리디렉션되는 /etc/hosts 파일에 줄을 추가합니다.

  1. on-prem-client VM 인스턴스에서 vim 또는 nano와 같은 텍스트 편집기를 사용하여 /etc/hosts 파일을 엽니다.

    sudo vim /etc/hosts
    
  2. 다음 줄을 파일에 추가합니다.

    192.168.0.1 us-central1-aiplatform.googleapis.com
    

    이 줄은 PSC 엔드포인트의 IP 주소(192.168.0.1)를 Vertex AI Google API(us-central1-aiplatform.googleapis.com)의 정규화된 도메인 이름에 할당합니다.

    수정된 파일은 다음과 같습니다.

    127.0.0.1       localhost
    ::1             localhost ip6-localhost ip6-loopback
    ff02::1         ip6-allnodes
    ff02::2         ip6-allrouters
    
    192.168.0.1 us-central1-aiplatform.googleapis.com  # Added by you
    172.16.10.6 on-prem-client.us-central1-a.c.vertex-genai-400103.internal on-prem-client  # Added by Google
    169.254.169.254 metadata.google.internal  # Added by Google
    
  3. 다음과 같이 파일을 저장합니다.

    • vim을 사용하는 경우 Esc 키를 누른 후 :wq를 입력하여 파일을 저장하고 종료합니다.
    • nano를 사용하는 경우 Control+O을 입력하고 Enter를 눌러 파일을 저장한 후 Control+X를 입력하여 종료합니다.
  4. 다음과 같이 Vertex AI 엔드포인트를 핑합니다.

    ping us-central1-aiplatform.googleapis.com
    

    ping 명령어에서 다음 출력을 반환합니다. 192.168.0.1은 PSC 엔드포인트 IP 주소입니다.

    PING us-central1-aiplatform.googleapis.com (192.168.0.1) 56(84) bytes of data.
    
  5. ping에서 종료하려면 Control+C를 입력합니다.

  6. exit를 입력하여 on-prem-client VM 인스턴스를 종료합니다.

vertex-networking-vpc에서 Vertex AI Workbench의 사용자 관리형 서비스 계정 만들기

이 섹션에서는 Vertex AI Workbench 인스턴스에 대한 액세스를 제어하기 위해 사용자 관리형 서비스 계정을 만든 후 IAM 역할을 서비스 계정에 할당합니다. 인스턴스를 만들 때 서비스 계정을 지정합니다.

  1. Cloud Shell에서 다음 명령어를 실행하고 PROJECT_ID를 프로젝트 ID로 바꿉니다.

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. workbench-sa라는 서비스 계정을 만듭니다.

    gcloud iam service-accounts create workbench-sa \
      --display-name="workbench-sa"
    
  3. 서비스 계정에 Vertex AI 사용자(roles/aiplatform.user) IAM 역할을 할당합니다.

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/aiplatform.user"
    
  4. 서비스 계정에 BigQuery 사용자(roles/bigquery.user) IAM 역할을 할당합니다.

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/bigquery.user"
    
  5. 서비스 계정에 스토리지 관리자(roles/storage.admin) IAM 역할을 할당합니다.

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/storage.admin"
    
  6. 서비스 계정에 로그 뷰어(roles/logging.viewer) IAM 역할을 할당합니다.

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/logging.viewer"
    

Vertex AI Workbench 인스턴스 만들기

  1. Cloud Shell에서 workbench-sa 서비스 계정을 지정하여 Vertex AI Workbench 인스턴스를 만듭니다.

    gcloud workbench instances create workbench-tutorial \
      --vm-image-project=deeplearning-platform-release \
      --vm-image-family=common-cpu-notebooks \
      --machine-type=n1-standard-4 \
      --location=us-central1-a \
      --subnet-region=us-central1 \
      --shielded-secure-boot=True \
      --subnet=workbench-subnet \
      --disable-public-ip \
      --service-account-email=workbench-sa@$projectid.iam.gserviceaccount.com
    
  2. Google Cloud 콘솔의 Vertex AI Workbench 페이지에서 인스턴스 탭으로 이동합니다.

    Vertex AI Workbench로 이동

  3. Vertex AI Workbench 인스턴스 이름(workbench-tutorial) 옆에 있는 JupyterLab 열기를 클릭합니다.

    Vertex AI Workbench 인스턴스가 JupyterLab을 엽니다.

  4. 파일 > 새로 만들기 > 노트북을 선택합니다.

  5. 커널 선택 메뉴에서 Python 3(로컬)를 선택하고 선택을 클릭합니다.

  6. 새 노트북이 열리면 코드를 입력할 수 있는 기본 코드 셀이 있습니다. 텍스트 필드 뒤에 [ ]:가 표시되어 있습니다. 텍스트 필드에 코드를 붙여넣을 수 있습니다.

    Vertex AI SDK for Python을 설치하려면 다음 코드를 셀에 붙여넣고  선택한 셀 실행 및 진행을 클릭합니다.

    !pip3 install --upgrade google-cloud-bigquery scikit-learn==1.2
    
  7. 이 단계와 이어지는 각 단계에서 필요한 경우 아래에 셀 삽입을 클릭하여 새 코드 셀을 추가하고 셀에 코드를 붙여넣은 후  선택한 셀 실행 및 진행을 클릭합니다.

    이 Jupyter 런타임에서 새로 설치된 패키지를 사용하려면 런타임을 다시 시작합니다.

    # Restart kernel after installs so that your environment can access the new packages
    import IPython
    
    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)
    
  8. JupyterLab 노트북에서 PROJECT_ID를 프로젝트 ID로 대체하여 다음 환경 변수를 설정합니다.

    # set project ID and location
    PROJECT_ID = "PROJECT_ID"
    REGION = "us-central1"
    
  9. 학습 작업을 스테이징할 Cloud Storage 버킷을 만듭니다.

    BUCKET_NAME = f"{PROJECT_ID}-ml-staging"
    BUCKET_URI = f"gs://{BUCKET_NAME}"
    !gcloud storage buckets create {BUCKET_URI} --location={REGION} --project={PROJECT_ID}
    

학습 데이터 준비

이 섹션에서는 예측 모델을 학습시키는 데 사용할 데이터를 준비합니다.

  1. JupyterLab 노트북에서 BigQuery 클라이언트를 만듭니다.

    from google.cloud import bigquery
    bq_client = bigquery.Client(project=PROJECT_ID)
    
  2. BigQuery ml_datasets 공개 데이터 세트에서 데이터를 가져옵니다.

    DATA_SOURCE = "bigquery-public-data.ml_datasets.census_adult_income"
    # Define the SQL query to fetch the dataset
    query = f"""
    SELECT * FROM `{DATA_SOURCE}` LIMIT 20000
    """
    # Download the dataset to a dataframe
    df = bq_client.query(query).to_dataframe()
    df.head()
    
  3. sklearn 라이브러리를 사용하여 학습 및 테스트용 데이터를 분할합니다.

    from sklearn.model_selection import train_test_split
    # Split the dataset
    X_train, X_test = train_test_split(df, test_size=0.3, random_state=43)
    # Print the shapes of train and test sets
    print(X_train.shape, X_test.shape)
    
  4. 학습 및 테스트 DataFrame을 스테이징 버킷의 CSV 파일로 내보냅니다.

    X_train.to_csv(f"{BUCKET_URI}/train.csv",index=False, quoting=1, quotechar='"')
    X_test[[i for i in X_test.columns if i != "income_bracket"]].iloc[:20].to_csv(f"{BUCKET_URI}/test.csv",index=False,quoting=1, quotechar='"')
    

학습 애플리케이션 준비

이 섹션에서는 Python 학습 애플리케이션을 만들고 빌드한 후 스테이징 버킷에 저장하는 방법을 포함합니다.

  1. JupyterLab 노트북에서 학습 애플리케이션 파일을 위한 새 폴더를 만듭니다.

    !mkdir -p training_package/trainer
    

    이제 JupyterLab 탐색 메뉴에 training_package라는 폴더가 표시됩니다.

  2. 모델을 학습시키고 파일로 내보내기 위한 특성, 대상, 라벨, 단계를 정의합니다.

    %%writefile training_package/trainer/task.py
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.feature_selection import SelectKBest
    from sklearn.pipeline import FeatureUnion, Pipeline
    from sklearn.preprocessing import LabelBinarizer
    import pandas as pd
    import argparse
    import joblib
    import os
    
    TARGET = "income_bracket"
    # Define the feature columns that you use from the dataset
    COLUMNS = (
      "age",
      "workclass",
      "functional_weight",
      "education",
      "education_num",
      "marital_status",
      "occupation",
      "relationship",
      "race",
      "sex",
      "capital_gain",
      "capital_loss",
      "hours_per_week",
      "native_country",
    )
    
    # Categorical columns are columns that have string values and
    # need to be turned into a numerical value to be used for training
    CATEGORICAL_COLUMNS = (
      "workclass",
      "education",
      "marital_status",
      "occupation",
      "relationship",
      "race",
      "sex",
      "native_country",
    )
    
    # load the arguments
    parser = argparse.ArgumentParser()
    parser.add_argument('--training-dir', dest='training_dir', default=os.getenv('AIP_MODEL_DIR'), type=str,help='get the staging directory')
    args = parser.parse_args()
    
    # Load the training data
    X_train = pd.read_csv(os.path.join(args.training_dir,"train.csv"))
    # Remove the column we are trying to predict ('income-level') from our features list
    # Convert the Dataframe to a lists of lists
    train_features = X_train.drop(TARGET, axis=1).to_numpy().tolist()
    # Create our training labels list, convert the Dataframe to a lists of lists
    train_labels = X_train[TARGET].to_numpy().tolist()
    
    # Since the census data set has categorical features, we need to convert
    # them to numerical values. We'll use a list of pipelines to convert each
    # categorical column and then use FeatureUnion to combine them before calling
    # the RandomForestClassifier.
    categorical_pipelines = []
    
    # Each categorical column needs to be extracted individually and converted to a numerical value.
    # To do this, each categorical column will use a pipeline that extracts one feature column via
    # SelectKBest(k=1) and a LabelBinarizer() to convert the categorical value to a numerical one.
    # A scores array (created below) will select and extract the feature column. The scores array is
    # created by iterating over the COLUMNS and checking if it is a CATEGORICAL_COLUMN.
    for i, col in enumerate(COLUMNS):
       if col in CATEGORICAL_COLUMNS:
          # Create a scores array to get the individual categorical column.
          # Example:
          #  data = [39, 'State-gov', 77516, 'Bachelors', 13, 'Never-married', 'Adm-clerical',
          #         'Not-in-family', 'White', 'Male', 2174, 0, 40, 'United-States']
          #  scores = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
          #
          # Returns: [['Sate-gov']]
          scores = []
          # Build the scores array
          for j in range(len(COLUMNS)):
             if i == j:  # This column is the categorical column we want to extract.
                scores.append(1)  # Set to 1 to select this column
             else:  # Every other column should be ignored.
                scores.append(0)
          skb = SelectKBest(k=1)
          skb.scores_ = scores
          # Convert the categorical column to a numerical value
          lbn = LabelBinarizer()
          r = skb.transform(train_features)
          lbn.fit(r)
          # Create the pipeline to extract the categorical feature
          categorical_pipelines.append(
             (
                "categorical-{}".format(i),
                Pipeline([("SKB-{}".format(i), skb), ("LBN-{}".format(i), lbn)]),
             )
          )
    
    # Create pipeline to extract the numerical features
    skb = SelectKBest(k=6)
    # From COLUMNS use the features that are numerical
    skb.scores_ = [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
    categorical_pipelines.append(("numerical", skb))
    
    # Combine all the features using FeatureUnion
    preprocess = FeatureUnion(categorical_pipelines)
    
    # Create the classifier
    classifier = RandomForestClassifier()
    
    # Transform the features and fit them to the classifier
    classifier.fit(preprocess.transform(train_features), train_labels)
    
    # Create the overall model as a single pipeline
    pipeline = Pipeline([("union", preprocess), ("classifier", classifier)])
    
    # Save the model pipeline
    joblib.dump(pipeline, os.path.join(args.training_dir,"model.joblib"))
    
  3. 각 하위 디렉터리에 __init__.py 파일을 만들어 패키지로 만듭니다.

    !touch training_package/__init__.py
    !touch training_package/trainer/__init__.py
    
  4. Python 패키지 설정 스크립트를 만듭니다.

    %%writefile training_package/setup.py
    from setuptools import find_packages
    from setuptools import setup
    
    setup(
       name='trainer',
       version='0.1',
       packages=find_packages(),
       include_package_data=True,
       description='Training application package for census income classification.'
    )
    
  5. sdist 명령어를 사용하여 학습 애플리케이션의 소스 배포를 만듭니다.

    !cd training_package && python setup.py sdist --formats=gztar
    
  6. Python 패키지를 스테이징 버킷에 복사합니다.

    !gcloud storage cp training_package/dist/trainer-0.1.tar.gz $BUCKET_URI/
    
  7. 스테이징 버킷에 파일 세 개가 포함되어 있는지 확인합니다.

    !gcloud storage ls $BUCKET_URI
    

    출력은 다음과 같이 표시됩니다.

    gs://$BUCKET_NAME/test.csv
    gs://$BUCKET_NAME/train.csv
    gs://$BUCKET_NAME/trainer-0.1.tar.gz
    

모델 학습

이 섹션에서는 커스텀 학습 작업을 만들고 실행하여 모델을 학습시킵니다.

  1. JupyterLab 노트북에서 다음 명령어를 실행하여 커스텀 학습 작업을 생성합니다.

    !gcloud ai custom-jobs create --display-name=income-classification-training-job \
       --project=$PROJECT_ID \
       --worker-pool-spec=replica-count=1,machine-type='e2-highmem-2',executor-image-uri='us-docker.pkg.dev/vertex-ai/training/sklearn-cpu.1-0:latest',python-module=trainer.task \
       --python-package-uris=$BUCKET_URI/trainer-0.1.tar.gz \
       --args="--training-dir","/gcs/$BUCKET_NAME" \
       --region=$REGION
    

    출력은 다음과 비슷하게 표시됩니다. 각 커스텀 작업 경로의 첫 번째 숫자는 프로젝트 번호입니다(PROJECT_NUMBER). 두 번째 숫자는 커스텀 작업 ID(CUSTOM_JOB_ID)입니다. 다음 단계에서 사용할 수 있도록 이 번호를 메모하세요.

    Using endpoint [https://us-central1-aiplatform.googleapis.com/]
    CustomJob [projects/721032480027/locations/us-central1/customJobs/1100328496195960832] is submitted successfully.
    
    Your job is still active. You may view the status of your job with the command
    
    $ gcloud ai custom-jobs describe projects/721032480027/locations/us-central1/customJobs/1100328496195960832
    
    or continue streaming the logs with the command
    
    $ gcloud ai custom-jobs stream-logs projects/721032480027/locations/us-central1/customJobs/1100328496195960832
    
  2. 커스텀 학습 작업을 실행하고 실행 시 작업에서 로그를 스트리밍하여 진행 상황을 표시합니다.

    !gcloud ai custom-jobs stream-logs projects/PROJECT_NUMBER/locations/us-central1/customJobs/CUSTOM_JOB_ID
    

    다음 값을 바꿉니다.

    • PROJECT_NUMBER: 이전 명령어 출력의 프로젝트 번호
    • CUSTOM_JOB_ID: 이전 명령어 출력의 커스텀 작업 ID

    이제 커스텀 학습 작업이 실행됩니다. 완료하려면 10분 정도 소요됩니다.

    작업이 완료되면 스테이징 버킷의 모델을 Vertex AI Model Registry로 가져올 수 있습니다.

모델 가져오기

커스텀 학습 작업은 학습된 모델을 스테이징 버킷에 업로드합니다. 작업이 완료되면 버킷의 모델을 Vertex AI Model Registry로 가져올 수 있습니다.

  1. JupyterLab 노트북에서 다음 명령어를 실행하여 모델을 가져옵니다.

    !gcloud ai models upload --container-image-uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-2:latest" \
       --display-name=income-classifier-model \
       --artifact-uri=$BUCKET_URI \
       --project=$PROJECT_ID \
       --region=$REGION
    
  2. 다음과 같이 프로젝트의 Vertex AI 모델을 나열합니다.

    !gcloud ai models list --region=us-central1
    

    다음과 유사하게 출력됩니다. 2개 이상의 모델이 나열될 경우 목록의 첫 번째 모델이 가장 최근에 가져온 모델입니다.

    MODEL_ID 열의 값을 기록해 둡니다. 일괄 예측 요청을 만들 때 필요합니다.

    Using endpoint [https://us-central1-aiplatform.googleapis.com/]
    MODEL_ID             DISPLAY_NAME
    1871528219660779520  income-classifier-model
    

    또는 다음과 같이 프로젝트에 있는 모델을 나열할 수 있습니다.

    Google Cloud 콘솔의 Vertex AI 섹션에서 Vertex AI Model Registry 페이지로 이동합니다.

    Vertex AI Model Registry 페이지로 이동합니다.

    모델의 모델 ID 및 기타 세부정보를 보려면 모델 이름을 클릭한 후 버전 세부정보 탭을 클릭합니다.

모델에서 일괄 예측 가져오기

이제 모델에서 일괄 예측을 요청할 수 있습니다. 일괄 예측 요청은 on-prem-client VM 인스턴스에서 이루어집니다.

일괄 예측 요청 만들기

이 단계에서는 ssh 를 사용하여 on-prem-client VM 인스턴스에 로그인합니다. VM 인스턴스에서 일괄 예측을 가져오기 위해 모델에 전송하는 샘플 curl 요청의 페이로드를 포함하는 request.json이라는 텍스트 파일을 만듭니다.

  1. Cloud Shell에서 다음 명령어를 실행하고 PROJECT_ID를 프로젝트 ID로 바꿉니다.

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. ssh를 사용하여 on-prem-client VM 인스턴스에 로그인합니다.

    gcloud compute ssh on-prem-client \
      --project=$projectid \
      --zone=us-central1-a
    
  3. on-prem-client VM 인스턴스에서 vim 또는 nano와 같은 텍스트 편집기를 사용하여 다음 텍스트를 포함하는 request.json이라는 새 파일을 만듭니다.

    {
      "displayName": "income-classification-batch-job",
      "model": "projects/PROJECT_ID/locations/us-central1/models/MODEL_ID",
      "inputConfig": {
        "instancesFormat": "csv",
        "gcsSource": {
          "uris": ["BUCKET_URI/test.csv"]
        }
      },
      "outputConfig": {
        "predictionsFormat": "jsonl",
        "gcsDestination": {
          "outputUriPrefix": "BUCKET_URI"
        }
      },
      "dedicatedResources": {
        "machineSpec": {
          "machineType": "n1-standard-4",
          "acceleratorCount": "0"
        },
        "startingReplicaCount": 1,
        "maxReplicaCount": 2
      }
    }
    

    다음 값을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID
    • MODEL_ID: 모델의 모델 ID
    • BUCKET_URI: 모델을 스테이징한 스토리지 버킷의 URI
  4. 다음 명령어를 실행하여 일괄 예측 요청을 전송합니다.

    curl -X POST \
       -H "Authorization: Bearer $(gcloud auth print-access-token)" \
       -H "Content-Type: application/json; charset=utf-8" \
       -d @request.json \
       "https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/batchPredictionJobs"
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

    응답에 다음 줄이 표시됩니다.

    "state": "JOB_STATE_PENDING"
    

    이제 일괄 예측 작업이 비동기식으로 실행됩니다. 실행하는 데 20분 정도 걸립니다.

  5. Google Cloud 콘솔의 Vertex AI 섹션에서 일괄 예측 페이지로 이동합니다.

    일괄 예측 페이지로 이동

    일괄 예측 작업이 실행되는 동안 상태는 Running입니다. 완료되면 상태가 Finished로 변경됩니다.

  6. 일괄 예측 작업의 이름(income-classification-batch-job)를 클릭한 후 세부정보 페이지의 내보내기 위치 링크를 클릭하여 Cloud Storage에서 일괄 작업의 출력 파일을 확인할 수 있습니다.

    또는, Cloud Storage에서 예측 출력 보기 아이콘( 최종 업데이트 열 및 액션 메뉴 사이에 있음)을 클릭합니다.

  7. prediction.results-00000-of-00002 또는 prediction.results-00001-of-00002 파일 링크를 클릭한 다음 인증된 URL 링크를 클릭하여 파일을 엽니다.

    일괄 예측 작업 출력은 다음 예시와 비슷하게 표시됩니다.

    {"instance": ["27", " Private", "391468", " 11th", "7", " Divorced", " Craft-repair", " Own-child", " White", " Male", "0", "0", "40", " United-States"], "prediction": " <=50K"}
    {"instance": ["47", " Self-emp-not-inc", "192755", " HS-grad", "9", " Married-civ-spouse", " Machine-op-inspct", " Wife", " White", " Female", "0", "0", "20", " United-States"], "prediction": " <=50K"}
    {"instance": ["32", " Self-emp-not-inc", "84119", " HS-grad", "9", " Married-civ-spouse", " Craft-repair", " Husband", " White", " Male", "0", "0", "45", " United-States"], "prediction": " <=50K"}
    {"instance": ["32", " Private", "236543", " 12th", "8", " Divorced", " Protective-serv", " Own-child", " White", " Male", "0", "0", "54", " Mexico"], "prediction": " <=50K"}
    {"instance": ["60", " Private", "160625", " HS-grad", "9", " Married-civ-spouse", " Prof-specialty", " Husband", " White", " Male", "5013", "0", "40", " United-States"], "prediction": " <=50K"}
    {"instance": ["34", " Local-gov", "22641", " HS-grad", "9", " Never-married", " Protective-serv", " Not-in-family", " Amer-Indian-Eskimo", " Male", "0", "0", "40", " United-States"], "prediction": " <=50K"}
    {"instance": ["32", " Private", "178623", " HS-grad", "9", " Never-married", " Other-service", " Not-in-family", " Black", " Female", "0", "0", "40", " ?"], "prediction": " <=50K"}
    {"instance": ["28", " Private", "54243", " HS-grad", "9", " Divorced", " Transport-moving", " Not-in-family", " White", " Male", "0", "0", "60", " United-States"], "prediction": " <=50K"}
    {"instance": ["29", " Local-gov", "214385", " 11th", "7", " Divorced", " Other-service", " Unmarried", " Black", " Female", "0", "0", "20", " United-States"], "prediction": " <=50K"}
    {"instance": ["49", " Self-emp-inc", "213140", " HS-grad", "9", " Married-civ-spouse", " Exec-managerial", " Husband", " White", " Male", "0", "1902", "60", " United-States"], "prediction": " >50K"}
    

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트는 유지하되 개별 리소스를 삭제하세요.

다음과 같이 Google Cloud 콘솔에서 개별 리소스를 삭제할 수 있습니다.

  1. 다음과 같이 일괄 예측 작업을 삭제합니다.

    1. Google Cloud 콘솔의 Vertex AI 섹션에서 일괄 예측 페이지로 이동합니다.

      일괄 예측 페이지로 이동

    2. 일괄 예측 작업(income-classification-batch-job)의 이름 옆에 있는 액션 메뉴를 클릭하고 일괄 예측 작업 삭제를 선택합니다.

  2. 다음과 같이 모델을 삭제합니다.

    1. Google Cloud 콘솔의 Vertex AI 섹션에서 Model Registry 페이지로 이동합니다.

      Model Registry 페이지로 이동

    2. 모델 이름(income-classifier-model) 옆에 있는 작업 메뉴를 클릭한 다음 모델 삭제를 선택합니다.

  3. 다음과 같이 Vertex AI Workbench 인스턴스를 삭제합니다.

    1. Google Cloud 콘솔의 Vertex AI 섹션에서 Workbench 페이지에 있는 인스턴스 탭으로 이동합니다.

      Vertex AI Workbench로 이동

    2. workbench-tutorial Vertex AI Workbench 인스턴스를 선택하고 삭제를 클릭합니다.

  4. 다음과 같이 Compute Engine VM 인스턴스를 삭제합니다.

    1. Google Cloud 콘솔에서 Compute Engine 페이지로 이동합니다.

      Compute Engine으로 이동

    2. on-prem-client VM 인스턴스를 선택하고 삭제를 클릭합니다.

  5. 다음과 같이 VPN 터널을 삭제합니다.

    1. Google Cloud 콘솔에서 VPN 페이지로 이동합니다.

      VPN으로 이동

    2. VPN 페이지에서 VPN 탭을 클릭합니다.

    3. VPN 터널 목록에서 이 튜토리얼에서 만든 4개의 VPN 터널을 선택하고 삭제를 클릭합니다.

  6. 다음과 같이 HA VPN 게이트웨이를 삭제합니다.

    1. VPN 페이지에서 VPN 탭을 클릭합니다.

      Cloud VPN 게이트웨이로 이동

    2. VPN 게이트웨이 목록에서 onprem-vpn-gw1을 클릭합니다.

    3. Cloud VPN 게이트웨이 세부정보 페이지에서 VPN 게이트웨이 삭제를 클릭합니다.

    4. 필요한 경우 뒤로 화살표를 클릭하여 VPN 게이트웨이 목록으로 돌아가서 vertex-networking-vpn-gw1을 클릭합니다.

    5. Cloud VPN 게이트웨이 세부정보 페이지에서 VPN 게이트웨이 삭제를 클릭합니다.

  7. 다음과 같이 Cloud Router를 삭제합니다.

    1. Cloud Router 페이지로 이동합니다.

      Cloud Router로 이동

    2. Cloud Router 목록에서 이 튜토리얼에서 만든 라우터 4개를 선택합니다.

    3. 라우터를 삭제하려면 삭제를 클릭합니다.

      Cloud Router에 연결된 2개의 Cloud NAT 게이트웨이도 삭제됩니다.

  8. 다음과 같이 vertex-networking-vpc VPC 네트워크의 pscvertex 전달 규칙을 삭제합니다.

    1. 부하 분산 페이지의 프런트엔드 탭으로 이동합니다.

      프런트엔드로 이동

    2. 전달 규칙 목록에서 pscvertex를 클릭합니다.

    3. 전달 규칙 세부정보 페이지에서 삭제를 클릭합니다.

  9. 다음과 같이 VPC 네트워크를 삭제합니다.

    1. VPC 네트워크 페이지로 이동합니다.

      VPC 네트워크로 이동

    2. VPC 네트워크 목록에서 onprem-vpc를 클릭합니다.

    3. VPC 네트워크 세부정보 페이지에서 VPC 네트워크 삭제를 클릭합니다.

      각 네트워크를 삭제하면 하위 네트워크, 경로 및 방화벽 규칙도 삭제됩니다.

    4. VPC 네트워크 목록에서 vertex-networking-vpc를 클릭합니다.

    5. VPC 네트워크 세부정보 페이지에서 VPC 네트워크 삭제를 클릭합니다.

  10. 다음과 같이 스토리지 버킷을 삭제합니다.

    1. Google Cloud 콘솔에서 Cloud Storage 페이지로 이동합니다.

      Cloud Storage로 이동

    2. 스토리지 버킷을 선택하고 삭제를 클릭합니다.

  11. 다음과 같이 workbench-saonprem-user-managed-sa 서비스 계정을 삭제합니다.

    1. 서비스 계정페이지로 이동합니다.

      서비스 계정으로 이동

    2. onprem-user-managed-saworkbench-sa 서비스 계정을 선택하고 삭제를 클릭합니다.

다음 단계