์ด ํ์ด์ง์์๋ Google Cloud ์ฝ์ ๋๋ Vertex AI API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต๋ ๋ถ๋ฅ ๋๋ ํ๊ท ๋ชจ๋ธ์ ์ผ๊ด ์์ธก ์์ฒญ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ผ๊ด ์์ธก ์์ฒญ์ ๋น๋๊ธฐ์ ์์ฒญ์ ๋๋ค(๋๊ธฐ์ ์์ฒญ์ธ ์จ๋ผ์ธ ์์ธก๊ณผ ๋ฐ๋). ๋ชจ๋ธ์ ์๋ํฌ์ธํธ์ ๋ฐฐํฌํ ํ์ ์์ด ๋ชจ๋ธ ๋ฆฌ์์ค์์ ์ง์ ์ผ๊ด ์์ธก์ ์์ฒญํฉ๋๋ค. ํ ํ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ฆ๊ฐ์ ์ธ ์๋ต์ด ํ์ํ์ง ์๊ณ ๋จ์ผ ์์ฒญ์ ์ฌ์ฉํ์ฌ ๋์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ผ๊ด ์์ธก์ ์ฌ์ฉํ์ธ์.
์ผ๊ด ์์ธก ์์ฒญ์ ์ํํ๋ ค๋ฉด Vertex AI๊ฐ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ์ ๋ ฅ ์์ค์ ์ถ๋ ฅ ํ์์ ์ง์ ํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
์ผ๊ด ์์ธก ์์ฒญ์ ์ํํ๊ธฐ ์ ์ ๋จผ์ ๋ชจ๋ธ์ ํ์ต์์ผ์ผ ํฉ๋๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ
์ผ๊ด ์์ธก ์์ฒญ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ ๋ชจ๋ธ์ด ์์ธก์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์ ๋๋ค. ๋ถ๋ฅ ๋๋ ํ๊ท ๋ชจ๋ธ์ ๊ฒฝ์ฐ ๋ค์ ๋ ๊ฐ์ง ํ์ ์ค ํ๋๋ก ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- BigQuery ํ ์ด๋ธ
- Cloud Storage์ CSV ๊ฐ์ฒด
๋ชจ๋ธ ํ์ต์ ์ฌ์ฉํ ํ์๊ณผ ๋์ผํ ํ์์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด BigQuery์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ์ต์์ผฐ์ผ๋ฉด BigQuery ํ ์ด๋ธ์ ์ผ๊ด ์์ธก์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. Vertex AI๋ ๋ชจ๋ CSV ์ ๋ ฅ ํ๋๋ฅผ ๋ฌธ์์ด๋ก ์ทจ๊ธํ๋ฏ๋ก ํ์ต ๋ฐ์ดํฐ์ ์ ๋ ฅ ๋ฐ์ดํฐ ํ์์ ํผํฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ์์ค์๋ ๋ชจ๋ธ ํ์ต์ ์ฌ์ฉ๋ ๋ชจ๋ ์ด์ ์ด๋ค ์์๋๋ก๋ ํฌํจํ๋ ํ ์ด๋ธ ํ์ ๋ฐ์ดํฐ๊ฐ ์์ด์ผ ํฉ๋๋ค. ํ์ต ๋ฐ์ดํฐ์ ์๊ฑฐ๋, ํ์ต ๋ฐ์ดํฐ์๋ ์์ง๋ง ํ์ต์ ์ฌ์ฉํ ์ ์๋ ์ด์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ถ๊ฐ ์ด์ ์ถ๋ ฅ์ ํฌํจ๋์ง๋ง ์์ธก ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ
BigQuery ํ ์ด๋ธ
BigQuery ํ ์ด๋ธ์ ์ ๋ ฅ์ผ๋ก ์ ํํ๋ ๊ฒฝ์ฐ ๋ค์์ ํ์ธํด์ผ ํฉ๋๋ค.
- BigQuery ๋ฐ์ดํฐ ์์ค ํ ์ด๋ธ์ 100GB๋ฅผ ๋์ง ์์์ผ ํฉ๋๋ค.
- ํ
์ด๋ธ์ด ๋ค๋ฅธ ํ๋ก์ ํธ์ ์์ผ๋ฉด ํด๋น ํ๋ก์ ํธ์ Vertex AI ์๋น์ค ๊ณ์ ์
BigQuery Data Editor
์ญํ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
CSV ํ์ผ
Cloud Storage์์ ์ ๋ ฅ์ผ๋ก CSV ๊ฐ์ฒด๋ฅผ ์ ํํ ๊ฒฝ์ฐ ๋ค์ ์ฌํญ์ ํ์ธํด์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ค๋ ์ด ์ด๋ฆ์ด ์๋ ํค๋ ํ์ผ๋ก ์์ํด์ผ ํฉ๋๋ค.
- ๊ฐ ๋ฐ์ดํฐ ์์ค ๊ฐ์ฒด๋ 10GB๋ฅผ ๋์ง ์์์ผ ํฉ๋๋ค. ์ฌ๋ฌ ํ์ผ์ ํฌํจํ ์๋ ์์ง๋ง ์ต๋ ์ฉ๋์ 100GB๋ก ์ ํ๋ฉ๋๋ค.
- Cloud Storage ๋ฒํท์ด ๋ค๋ฅธ ํ๋ก์ ํธ์ ์์ผ๋ฉด ํด๋น ํ๋ก์ ํธ์
Storage Object Creator
์ญํ ์ Vertex AI ์๋น์ค ๊ณ์ ์ ๋ถ์ฌํด์ผ ํฉ๋๋ค. - ๋ชจ๋ ๋ฌธ์์ด์ ํฐ๋ฐ์ดํ(")๋ก ๋ฌถ์ด์ผ ํฉ๋๋ค.
์ถ๋ ฅ ํ์
์ผ๊ด ์์ธก ์์ฒญ์ ์ถ๋ ฅ ํ์์ ์ ๋ ฅ์ ์ฌ์ฉํ ํ์๊ณผ ๋์ผํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด BigQuery ํ ์ด๋ธ์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ Cloud Storage์ CSV ๊ฐ์ฒด๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
๋ชจ๋ธ์ ์ผ๊ด ์์ธก ์์ฒญ ๋ณด๋ด๊ธฐ
์ผ๊ด ์์ธก ์์ฒญ์ ์ํํ๋ ค๋ฉด Google Cloud ์ฝ์ ๋๋ Vertex AI API๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์ ๋ ฅ ๋ฐ์ดํฐ ์์ค๋ Cloud Storage ๋ฒํท์ด๋ BigQuery ํ ์ด๋ธ์ ์ ์ฅ๋ CSV ๊ฐ์ฒด์ผ ์ ์์ต๋๋ค. ์ ๋ ฅ์ผ๋ก ์ ์ถํ๋ ๋ฐ์ดํฐ ์์ ๋ฐ๋ผ ์ผ๊ด ์์ธก ํ์คํฌ๊ฐ ์๋ฃ๋๋ ๋ฐ ๋ค์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
Google Cloud ์ฝ์
Google Cloud ์ฝ์์ ์ฌ์ฉํ์ฌ ์ผ๊ด ์์ธก์ ์์ฒญํฉ๋๋ค.
- Google Cloud ์ฝ์์ Vertex AI ์น์ ์์ ์ผ๊ด ์์ธก ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
- ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํ์ฌ ์ ์ผ๊ด ์์ธก ์ฐฝ์ ์ฝ๋๋ค.
- ์ผ๊ด ์์ธก ์ ์์์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
- ์ผ๊ด ์์ธก์ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค.
- ๋ชจ๋ธ ์ด๋ฆ์ ์ด ์ผ๊ด ์์ธก์ ์ฌ์ฉํ ๋ชจ๋ธ์ ์ด๋ฆ์ ์ ํํฉ๋๋ค.
- ๋ฒ์ ์ ์ด ์ผ๊ด ์์ธก์ ์ฌ์ฉํ ๋ชจ๋ธ ๋ฒ์ ์ ์ ํํฉ๋๋ค.
- ์์ค ์ ํ์์ ์์ค ์
๋ ฅ ๋ฐ์ดํฐ๊ฐ Cloud Storage์ CSV ํ์ผ์ธ์ง ๋๋ BigQuery์ ํ
์ด๋ธ์ธ์ง ์ฌ๋ถ๋ฅผ ์ ํํฉ๋๋ค.
- CSV ํ์ผ์ ๊ฒฝ์ฐ CSV ์ ๋ ฅ ํ์ผ์ด ์๋ Cloud Storage ์์น๋ฅผ ์ง์ ํฉ๋๋ค.
- BigQuery ํ ์ด๋ธ์ ๊ฒฝ์ฐ ํ ์ด๋ธ์ด ์๋ ํ๋ก์ ํธ ID, BigQuery ๋ฐ์ดํฐ ์ธํธ ID, BigQuery ํ ์ด๋ธ ๋๋ ๋ทฐ ID๋ฅผ ์ง์ ํฉ๋๋ค.
- ์ถ๋ ฅ์์ CSV ๋๋ BigQuery๋ฅผ ์ ํํฉ๋๋ค.
- CSV์ ๊ฒฝ์ฐ Vertex AI์์ ์ถ๋ ฅ์ ์ ์ฅํ๋ Cloud Storage ๋ฒํท์ ์ง์ ํฉ๋๋ค.
- BigQuery์ ๊ฒฝ์ฐ ํ๋ก์ ํธ ID ๋๋ ๊ธฐ์กด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ ID๋ฅผ ์ง์ ํ๋ ค๋ฉด Google Cloud ํ๋ก์ ํธ ID ํ๋์ ํ๋ก์ ํธ ID๋ฅผ ์ ๋ ฅํฉ๋๋ค. Vertex AI์์ ์๋ก์ด ์ถ๋ ฅ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์๋์ผ๋ก ๋ง๋ญ๋๋ค.
- ๊ธฐ์กด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ง์ ํ๋ ค๋ฉด Google Cloud ํ๋ก์ ํธ ID ํ๋์ BigQuery ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํฉ๋๋ค(์:
bq://projectid.datasetid
).
- (์ ํ์ฌํญ) ์ผ๊ด ์์ธก์ ์ํ ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง ๋ถ์์ ํ๋ฆฌ๋ทฐ๋ก ์ ๊ณต๋ฉ๋๋ค. ์ผ๊ด ์์ธก ์์
์ ํธํฅ ๊ฐ์ง ๊ตฌ์ฑ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ ์๊ฑด์ ์ฐธ์กฐํ์ธ์.
- ์ด ์ผ๊ด ์์ธก์ ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง ์ฌ์ฉ ์ค์ ์ ํด๋ฆญํ์ฌ ์ผ๊ฑฐ๋ ๋๋๋ค.
- ํ์ต ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ํํฉ๋๋ค. ์ ํํ ํ์ต ๋ฐ์ดํฐ ์์ค์ ๋ฐ์ดํฐ ๊ฒฝ๋ก ๋๋ ์์น๋ฅผ ์ ๋ ฅํฉ๋๋ค.
- (์ ํ์ฌํญ) ์๋ฆผ ๊ธฐ์ค ์๋์์ ์๋ฆผ์ ํธ๋ฆฌ๊ฑฐํ ์๊ณ๊ฐ์ ์ง์ ํฉ๋๋ค.
- ์๋ฆผ ์ด๋ฉ์ผ์ ๊ฒฝ์ฐ ๋ชจ๋ธ์ด ์๋ฆผ ๊ธฐ์ค์ ์ด๊ณผํ๋ฉด ์๋ฆผ์ ๋ฐ์ ์ด๋ฉ์ผ ์ฃผ์ ํ๋ ์ด์์ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ ฅํฉ๋๋ค.
- (์ ํ์ฌํญ) ์๋ฆผ ์ฑ๋์ ๊ฒฝ์ฐ ๋ชจ๋ธ์ด ์๋ฆผ ๊ธฐ์ค์ ์ด๊ณผํ๋ฉด ์๋ฆผ์ ๋ฐ์ Cloud Monitoring ์ฑ๋์ ์ถ๊ฐํฉ๋๋ค. ๊ธฐ์กด Cloud Monitoring ์ฑ๋์ ์ ํํ๊ฑฐ๋ ์๋ฆผ ์ฑ๋ ๊ด๋ฆฌ๋ฅผ ํด๋ฆญํ์ฌ ์ ์ฑ๋์ ๋ง๋ค ์ ์์ต๋๋ค. ์ฝ์์์๋ PagerDuty, Slack, Pub/Sub ์๋ฆผ ์ฑ๋์ ์ง์ํฉ๋๋ค.
- ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
API: BigQuery
REST
batchPredictionJobs.create ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๊ด ์์ธก์ ์์ฒญํฉ๋๋ค.
์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ค์์ ๋ฐ๊ฟ๋๋ค.
- LOCATION_ID: ๋ชจ๋ธ์ด ์ ์ฅ๋๊ณ ์ผ๊ด ์์ธก ์์
์ด ์คํ๋๋ ๋ฆฌ์ ์
๋๋ค. ์๋ฅผ ๋ค๋ฉด
us-central1
์ ๋๋ค. - PROJECT_ID: ํ๋ก์ ํธ ID์ ๋๋ค.
- BATCH_JOB_NAME: ์ผ๊ด ์์ ์ ํ์ ์ด๋ฆ์ ๋๋ค.
- MODEL_ID: ์์ธก์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ๋ชจ๋ธ์ ID์ ๋๋ค.
-
INPUT_URI: BigQuery ๋ฐ์ดํฐ ์์ค์ ๋ํ ์ฐธ์กฐ์
๋๋ค. ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ผ ์์์ ์์ฑํ์ธ์.
bq://bqprojectId.bqDatasetId.bqTableId
-
OUTPUT_URI: ์์ธก์ด ๊ธฐ๋ก๋๋ BigQuery ๋์์ ๋ํ ์ฐธ์กฐ์
๋๋ค. ํ๋ก์ ํธ ID๋ฅผ ์ง์ ํ๊ณ ์ ํ์ ์ผ๋ก ๊ธฐ์กด ๋ฐ์ดํฐ ์ธํธ ID๋ฅผ ์ง์ ํฉ๋๋ค. ํ๋ก์ ํธ ID๋ง ์ง์ ํ๋ฉด Vertex AI๊ฐ ์๋ก์ด ์ถ๋ ฅ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋ญ๋๋ค. ๋ค์ ํ์์ ์ฌ์ฉํฉ๋๋ค.
bq://bqprojectId.bqDatasetId
- MACHINE_TYPE: ์ด ์ผ๊ด ์์ธก ์์ ์ ์ฌ์ฉํ ๋จธ์ ๋ฆฌ์์ค์ ๋๋ค. ์์ธํ ์์๋ณด๊ธฐ
- STARTING_REPLICA_COUNT: ์ด ์ผ๊ด ์์ธก ์์ ์ ์์ ๋ ธ๋ ์์ ๋๋ค. ๋ก๋ ์ ํ์์ ๋ฐ๋ผ ์ต๋ ๋ ธ๋ ์๊น์ง ๋ ธ๋ ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์์ง๋ง ์ ๋ ์ด ์ ๋ฏธ๋ง์ด ๋์ง ์์ต๋๋ค.
- MAX_REPLICA_COUNT: ์ด ์ผ๊ด ์์ธก ์์ ์ ์ต๋ ๋ ธ๋ ์์ ๋๋ค. ๋ก๋ ์ ํ์์ ๋ฐ๋ผ ๋ ธ๋ ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์์ง๋ง ์ต๋๊ฐ์ ์ ๋ ์ด๊ณผํ์ง ์์ต๋๋ค. ์ ํ์ฌํญ์ผ๋ก, ๊ธฐ๋ณธ๊ฐ์ 10์ ๋๋ค.
HTTP ๋ฉ์๋ ๋ฐ URL:
POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs
JSON ์์ฒญ ๋ณธ๋ฌธ:
{ "displayName": "BATCH_JOB_NAME", "model": "MODEL_ID", "inputConfig": { "instancesFormat": "bigquery", "bigquerySource": { "inputUri": "INPUT_URI" } }, "outputConfig": { "predictionsFormat": "bigquery", "bigqueryDestination": { "outputUri": "OUTPUT_URI" } }, "dedicatedResources": { "machineSpec": { "machineType": "MACHINE_TYPE", "acceleratorCount": "0" }, "startingReplicaCount": STARTING_REPLICA_COUNT, "maxReplicaCount": MAX_REPLICA_COUNT }, }
์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด ๋ค์ ์ต์ ์ค ํ๋๋ฅผ ์ ํํฉ๋๋ค.
curl
์์ฒญ ๋ณธ๋ฌธ์ request.json
ํ์ผ์ ์ ์ฅํ๊ณ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"
PowerShell
์์ฒญ ๋ณธ๋ฌธ์ request.json
ํ์ผ์ ์ ์ฅํ๊ณ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content
๋ค์๊ณผ ๋น์ทํ JSON ์๋ต์ด ํ์๋ฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs/67890", "displayName": "batch_job_1 202005291958", "model": "projects/12345/locations/us-central1/models/5678", "state": "JOB_STATE_PENDING", "inputConfig": { "instancesFormat": "bigquery", "bigquerySource": { "inputUri": "INPUT_URI" } }, "outputConfig": { "predictionsFormat": "bigquery", "bigqueryDestination": { "outputUri": bq://12345 } }, "dedicatedResources": { "machineSpec": { "machineType": "n1-standard-32", "acceleratorCount": "0" }, "startingReplicaCount": 2, "maxReplicaCount": 6 }, "manualBatchTuningParameters": { "batchSize": 4 }, "generateExplanation": false, "outputInfo": { "bigqueryOutputDataset": "bq://12345.reg_model_2020_10_02_06_04 } "state": "JOB_STATE_PENDING", "createTime": "2020-09-30T02:58:44.341643Z", "updateTime": "2020-09-30T02:58:44.341643Z", }
Java
์ด ์ํ์ ์ฌ์ฉํด ๋ณด๊ธฐ ์ ์ Vertex AI ๋น ๋ฅธ ์์: ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ Java ์ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์. ์์ธํ ๋ด์ฉ์ Vertex AI Java API ์ฐธ๊ณ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
Vertex AI์ ์ธ์ฆํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ค์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ธ์ฆ ์ค์ ์ ์ฐธ์กฐํ์ธ์.
๋ค์ ์ํ์์ INSTANCES_FORMAT ๋ฐ PREDICTIONS_FORMAT์ `bigquery`๋ก ๋ฐ๊ฟ๋๋ค. ๋ค๋ฅธ ์๋ฆฌํ์์๋ฅผ ๊ต์ฒดํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด ์ด ์น์ ์ `REST & CMD LINE` ํญ์ ์ฐธ์กฐํ์ธ์.Vertex AI SDK for Python
Vertex AI SDK for Python์ ์ค์นํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ Vertex AI SDK for Python ์ค์น๋ฅผ ์ฐธ์กฐํ์ธ์. ์์ธํ ๋ด์ฉ์ Vertex AI SDK for Python API ์ฐธ์กฐ ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
๋ค์ ์ํ์์๋ `instances_format` ๋ฐ `predictions_format` ํ๋ผ๋ฏธํฐ๋ฅผ `'bigquery'`๋ก ์ค์ ํฉ๋๋ค. ๋ค๋ฅธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ด ์น์ ์ `REST & CMD LINE` ํญ์ ์ฐธ์กฐํ์ธ์.API: Cloud Storage
REST
batchPredictionJobs.create ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ผ๊ด ์์ธก์ ์์ฒญํฉ๋๋ค.
์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ค์์ ๋ฐ๊ฟ๋๋ค.
- LOCATION_ID: ๋ชจ๋ธ์ด ์ ์ฅ๋๊ณ ์ผ๊ด ์์ธก ์์
์ด ์คํ๋๋ ๋ฆฌ์ ์
๋๋ค. ์๋ฅผ ๋ค๋ฉด
us-central1
์ ๋๋ค. - PROJECT_ID: ํ๋ก์ ํธ ID์ ๋๋ค.
- BATCH_JOB_NAME: ์ผ๊ด ์์ ์ ํ์ ์ด๋ฆ์ ๋๋ค.
- MODEL_ID: ์์ธก์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ๋ชจ๋ธ์ ID์ ๋๋ค.
-
URI: ํ์ต ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ Cloud Storage ๋ฒํท์ ๊ฒฝ๋ก(URI)์
๋๋ค.
๋ ๊ฐ ์ด์ ์์ ์ ์์ต๋๋ค. ๊ฐ URI์ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
gs://bucketName/pathToFileName
-
OUTPUT_URI_PREFIX: ์์ธก์ด ๊ธฐ๋ก๋๋ Cloud Storage ๋์์ ๊ฒฝ๋ก์
๋๋ค. Vertex AI์์ ์ด ๊ฒฝ๋ก์ ํ์์คํฌํ๊ฐ ์ ์ฉ๋ ํ์ ๋๋ ํฐ๋ฆฌ์ ์ผ๊ด ์์ธก์ ๊ธฐ๋กํฉ๋๋ค. ์ด ๊ฐ์ ๋ค์ ํ์์ ๋ฌธ์์ด์ ์ค์ ํฉ๋๋ค.
gs://bucketName/pathToOutputDirectory
- MACHINE_TYPE: ์ด ์ผ๊ด ์์ธก ์์ ์ ์ฌ์ฉํ ๋จธ์ ๋ฆฌ์์ค์ ๋๋ค. ์์ธํ ์์๋ณด๊ธฐ
- STARTING_REPLICA_COUNT: ์ด ์ผ๊ด ์์ธก ์์ ์ ์์ ๋ ธ๋ ์์ ๋๋ค. ๋ก๋ ์ ํ์์ ๋ฐ๋ผ ์ต๋ ๋ ธ๋ ์๊น์ง ๋ ธ๋ ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์์ง๋ง ์ ๋ ์ด ์ ๋ฏธ๋ง์ด ๋์ง ์์ต๋๋ค.
- MAX_REPLICA_COUNT: ์ด ์ผ๊ด ์์ธก ์์ ์ ์ต๋ ๋ ธ๋ ์์ ๋๋ค. ๋ก๋ ์ ํ์์ ๋ฐ๋ผ ๋ ธ๋ ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์์ง๋ง ์ต๋๊ฐ์ ์ ๋ ์ด๊ณผํ์ง ์์ต๋๋ค. ์ ํ์ฌํญ์ผ๋ก, ๊ธฐ๋ณธ๊ฐ์ 10์ ๋๋ค.
HTTP ๋ฉ์๋ ๋ฐ URL:
POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs
JSON ์์ฒญ ๋ณธ๋ฌธ:
{ "displayName": "BATCH_JOB_NAME", "model": "MODEL_ID", "inputConfig": { "instancesFormat": "csv", "gcsSource": { "uris": [ URI1,... ] }, }, "outputConfig": { "predictionsFormat": "csv", "gcsDestination": { "outputUriPrefix": "OUTPUT_URI_PREFIX" } }, "dedicatedResources": { "machineSpec": { "machineType": "MACHINE_TYPE", "acceleratorCount": "0" }, "startingReplicaCount": STARTING_REPLICA_COUNT, "maxReplicaCount": MAX_REPLICA_COUNT }, }
์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด ๋ค์ ์ต์ ์ค ํ๋๋ฅผ ์ ํํฉ๋๋ค.
curl
์์ฒญ ๋ณธ๋ฌธ์ request.json
ํ์ผ์ ์ ์ฅํ๊ณ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"
PowerShell
์์ฒญ ๋ณธ๋ฌธ์ request.json
ํ์ผ์ ์ ์ฅํ๊ณ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content
๋ค์๊ณผ ๋น์ทํ JSON ์๋ต์ด ํ์๋ฉ๋๋ค.
{ "name": "projects/PROJECT__ID/locations/LOCATION_ID/batchPredictionJobs/67890", "displayName": "batch_job_1 202005291958", "model": "projects/12345/locations/us-central1/models/5678", "state": "JOB_STATE_PENDING", "inputConfig": { "instancesFormat": "csv", "gcsSource": { "uris": [ "gs://bp_bucket/reg_mode_test" ] } }, "outputConfig": { "predictionsFormat": "csv", "gcsDestination": { "outputUriPrefix": "OUTPUT_URI_PREFIX" } }, "dedicatedResources": { "machineSpec": { "machineType": "n1-standard-32", "acceleratorCount": "0" }, "startingReplicaCount": 2, "maxReplicaCount": 6 }, "manualBatchTuningParameters": { "batchSize": 4 } "outputInfo": { "gcsOutputDataset": "OUTPUT_URI_PREFIX/prediction-batch_job_1 202005291958-2020-09-30T02:58:44.341643Z" } "state": "JOB_STATE_PENDING", "createTime": "2020-09-30T02:58:44.341643Z", "updateTime": "2020-09-30T02:58:44.341643Z", }
์ผ๊ด ์์ธก ๊ฒฐ๊ณผ ๊ฒ์
Vertex AI๋ ์ผ๊ด ์์ธก ์ถ๋ ฅ์ ์ง์ ๋ ๋์(BigQuery ๋๋ Cloud Storage)์ผ๋ก ์ ์กํฉ๋๋ค.
BigQuery
์ถ๋ ฅ ๋ฐ์ดํฐ ์ธํธ
BigQuery๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ผ๊ด ์์ธก์ ์ถ๋ ฅ์ ์ถ๋ ฅ ๋ฐ์ดํฐ ์ธํธ์ ์ ์ฅ๋ฉ๋๋ค. Vertex AI์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ธํธ ์ด๋ฆ(BQ_DATASET_NAME)์ ์ด์ ์ ์ ๊ณตํ ์ด๋ฆ์ ๋๋ค. ์ถ๋ ฅ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ Vertex AI๊ฐ ์๋์ผ๋ก ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ฑํฉ๋๋ค. ๋ค์ ๋จ๊ณ์ ๋ฐ๋ผ ์ด๋ฆ(BQ_DATASET_NAME)์ ์ฐพ์ ์ ์์ต๋๋ค.
- Google Cloud ์ฝ์์์ Vertex AI ์ผ๊ด ์์ธก ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
- ์์ฑํ ์์ธก์ ์ ํํฉ๋๋ค.
-
์ถ๋ ฅ ๋ฐ์ดํฐ ์ธํธ๋ ๋ด๋ณด๋ด๊ธฐ ์์น์ ์ง์ ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์ธํธ ์ด๋ฆ์
prediction_MODEL_NAME_TIMESTAMP
ํ์์ ๋๋ค.
์ถ๋ ฅ ๋ฐ์ดํฐ ์ธํธ์๋ ๋ค์ ์ธ ๊ฐ์ง ์ถ๋ ฅ ํ ์ด๋ธ ์ค ํ๋ ์ด์์ด ํฌํจ๋ฉ๋๋ค.
-
์์ธก ํ
์ด๋ธ
์ด ํ ์ด๋ธ์๋ ์์ธก์ด ์์ฒญ๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ชจ๋ ํ์ ๋ํ ํ์ด ํฌํจ๋ฉ๋๋ค(์ฆ, TARGET_COLUMN_NAME = null).
-
์ค๋ฅ ํ
์ด๋ธ
์ด ํ ์ด๋ธ์๋ ์ผ๊ด ์์ธก ์ค์ ๋ฐ์ํ๋ ์ค์ํ์ง ์์ ์ค๋ฅ์ ๋ํ ํ์ด ํฌํจ๋ฉ๋๋ค. ์ค์ํ์ง ์์ ๊ฐ ์ค๋ฅ๋ Vertex AI๊ฐ ์์ธก์ ๋ฐํํ ์ ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ํ์ ํด๋นํฉ๋๋ค.
์์ธก ํ ์ด๋ธ
ํ
์ด๋ธ์ ์ด๋ฆ(BQ_PREDICTIONS_TABLE_NAME)์ ์ผ๊ด ์์ธก ์์
์ด ์์๋ ํ์์คํฌํ์ ํจ๊ป 'predictions_'์ ์ถ๊ฐํ์ฌ ํ์ฑ๋ฉ๋๋ค. predictions_TIMESTAMP
์์ธก์ ๊ฒ์ํ๋ ค๋ฉด BigQuery ํ์ด์ง๋ก ์ด๋ํ์ธ์.
์ฟผ๋ฆฌ ํ์์ ๋ชจ๋ธ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.๋ถ๋ฅ:
SELECT predicted_TARGET_COLUMN_NAME.classes AS classes, predicted_TARGET_COLUMN_NAME.scores AS scores FROM BQ_DATASET_NAME.BQ_PREDICTIONS_TABLE_NAME
classes
๋ ์ ์ฌ์ ํด๋์ค์ ๋ชฉ๋ก์ด๋ฉฐ scores
๋ ํด๋นํ๋ ์ ๋ขฐ๋ ์ ์์
๋๋ค.
ํ๊ท:
SELECT predicted_TARGET_COLUMN_NAME.value FROM BQ_DATASET_NAME.BQ_PREDICTIONS_TABLE_NAME
๋ชจ๋ธ์์ ํ๋ฅ ์ ์ถ๋ก ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ predicted_TARGET_COLUMN_NAME.value
์๋ ์ต์ ํ ๋ชฉํ์ ์ต์ํ ๋๊ตฌ๊ฐ ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ต์ ํ ๋ชฉํ๊ฐ minimize-rmse
๋ฉด predicted_TARGET_COLUMN_NAME.value
์๋ ํ๊ท ๊ฐ์ด ํฌํจ๋ฉ๋๋ค. minimize-mae
๋ฉด predicted_TARGET_COLUMN_NAME.value
์ ์ค์๊ฐ์ด ํฌํจ๋ฉ๋๋ค.
๋ชจ๋ธ์์ ๋ถ์์๋ก ํ๋ฅ ์ ์ถ๋ก ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Vertex AI๋ ์ต์ ํ ๋ชฉํ์ ์ต์ํ ๋๊ตฌ ์ธ์ ๋ถ์์ ๊ฐ๊ณผ ์์ธก์ ์ ๊ณตํฉ๋๋ค. ๋ถ์์ ๊ฐ์ ๋ชจ๋ธ ํ์ต ์ค์ ์ค์ ๋ฉ๋๋ค. ๋ถ์์ ์์ธก์ ๋ถ์์ ๊ฐ๊ณผ ์ฐ๊ฒฐ๋ ์์ธก ๊ฐ์ ๋๋ค.
์ค๋ฅ ํ ์ด๋ธ
ํ ์ด๋ธ์ ์ด๋ฆ(BQ_ERRORS_TABLE_NAME)์ ์ผ๊ด ์์ธก ์์ ์ด ์์๋ ํ์์คํฌํ์ ํจ๊ปerrors_
๋ฅผ ์ถ๊ฐํ์ฌ ํ์ฑ๋ฉ๋๋ค. errors_TIMESTAMP
์ค๋ฅ ๊ฒ์ฆ ํ
์ด๋ธ์ ๊ฒ์ํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํํฉ๋๋ค.
-
์ฝ์์์ BigQuery ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
-
๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
SELECT * FROM BQ_DATASET_NAME.BQ_ERRORS_TABLE_NAME
- error_TARGET_COLUMN_NAME.code
- errors_TARGET_COLUMN_NAME.message
Cloud Storage
Cloud Storage๋ฅผ ์ถ๋ ฅ ๋์์ผ๋ก ์ง์ ํ๋ฉด ์ผ๊ด ์์ธก ์์ฒญ์ ๊ฒฐ๊ณผ๊ฐ ์ง์ ํ ๋ฒํท์ ์ ํด๋์ CSV ๊ฐ์ฒด๋ก ๋ฐํ๋ฉ๋๋ค. ํด๋ ์ด๋ฆ์ ๋ชจ๋ธ ์ด๋ฆ ์์ 'prediction_'๊ณผ ์ผ๊ด ์์ธก ์์ ์ด ์์๋ ์์ ์ ํ์์คํฌํ๋ฅผ ์ถ๊ฐํด ์ง์ ํด์ผ ํฉ๋๋ค. ๋ชจ๋ธ์ ์ผ๊ด ์์ธก ํญ์์ Cloud Storage ํด๋ ์ด๋ฆ์ ํ์ธํ ์ ์์ต๋๋ค.
Cloud Storage ํด๋์๋ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์์ต๋๋ค.-
์์ธก ๊ฐ์ฒด
์์ธก ๊ฐ์ฒด์ ์ด๋ฆ์ 'predictions_1.csv', 'predictions_2.csv' ๋ฑ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ด๋ฌํ ์์ธก ํ์ผ์๋ ์ด ์ด๋ฆ์ด ์ง์ ๋ ํค๋ ํ๊ณผ ๋ฐํ๋ ๋ชจ๋ ์์ธก์ ๋ํ ํ๋์ ํ์ด ํฌํจ๋ฉ๋๋ค. ์์ธก ๊ฐ์ฒด์์ Vertex AI๋ ์์ธก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ณ ๋ชจ๋ธ ์ ํ์ ๋ฐ๋ผ ์์ธก ๊ฒฐ๊ณผ์ ๋ํ ํ๋ ์ด์์ ์ ์ด์ ๋ง๋ญ๋๋ค.
-
๋ถ๋ฅ: ํ๊ฒ ์ด์ ๊ฐ ์์ ๊ฐ์ ๋ํด ์ด๋ฆ์ด
TARGET_COLUMN_NAME_VALUE_score
์ธ ์ด์ด ๊ฒฐ๊ณผ์ ์ถ๊ฐ๋ฉ๋๋ค. ์ด ์ด์๋ ํด๋น ๊ฐ์ ๋ํ ์ ์ ๋๋ ์ ๋ขฐ๋ ์ถ์ ์น๊ฐ ํฌํจ๋ฉ๋๋ค. -
ํ๊ท: ํด๋น ํ์ ์์ธก ๊ฐ์
predicted_TARGET_COLUMN_NAME
๋ผ๋ ์ด์ ๋ฐํ๋ฉ๋๋ค. CSV ์ถ๋ ฅ์ ๋ํ ์์ธก ๊ฐ๊ฒฉ์ ๋ฐํ๋์ง ์์ต๋๋ค.
-
๋ถ๋ฅ: ํ๊ฒ ์ด์ ๊ฐ ์์ ๊ฐ์ ๋ํด ์ด๋ฆ์ด
-
์ค๋ฅ ๊ฐ์ฒด
์ค๋ฅ ๊ฐ์ฒด์ ์ด๋ฆ์ `errors_1.csv`, `errors_2.csv` ๋ฑ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ํค๋ ํ๊ณผ Vertex AI๊ฐ ์์ธก์ ๋ฐํํ์ง ๋ชปํ๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ชจ๋ ํ์ ๋ํ ํ๋์ ํ์ด ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด null ๋นํ์ฉ ํน์ฑ์ด null์ธ ๊ฒฝ์ฐ์ ๋๋ค
์ฐธ๊ณ : ๊ฒฐ๊ณผ๊ฐ ํฌ๋ฉด ์ฌ๋ฌ ๊ฐ์ฒด๋ก ๋ถํ ๋ฉ๋๋ค.
์์ธก ๊ฒฐ๊ณผ ํด์
๋ถ๋ฅ
๋ถ๋ฅ ๋ชจ๋ธ์ ์ ๋ขฐ๋ ์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
์ ๋ขฐ๋ ์ ์๋ ๋ชจ๋ธ์ด ๊ฐ ํด๋์ค ๋๋ ๋ผ๋ฒจ์ ํ ์คํธ ํญ๋ชฉ๊ณผ ์ผ๋ง๋ ๋ฐ์ ํ๊ฒ ์ฐ๊ด์ํค๋์ง๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ซ์๊ฐ ๋์์๋ก ํด๋น ํญ๋ชฉ์ ๋ผ๋ฒจ์ด ์ ์ฉ๋์ด์ผ ํ๋ ๋ชจ๋ธ์ ์ ๋ขฐ๋๊ฐ ๋์์ง๋๋ค. ๋ชจ๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ฝํ ์ ๋ขฐ๋ ์ ์๋ฅผ ์ผ๋ง๋ ๋๊ฒ ์ฑ ์ ํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
ํ๊ท
ํ๊ท ๋ชจ๋ธ์ ์์ธก ๊ฐ์ ๋ฐํํฉ๋๋ค.
๋ชจ๋ธ์์ ํ๋ฅ ์ ์ถ๋ก ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ value
ํ๋์ ์ต์ ํ ๋ชฉํ์ ์ต์ํ ๋๊ตฌ๊ฐ ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ต์ ํ ๋ชฉํ๊ฐ minimize-rmse
๋ฉด value
ํ๋์ ํ๊ท ๊ฐ์ด ํฌํจ๋ฉ๋๋ค.
minimize-mae
๋ฉด value
ํ๋์ ์ค์๊ฐ์ด ํฌํจ๋ฉ๋๋ค.
๋ชจ๋ธ์์ ๋ถ์์๋ก ํ๋ฅ ์ ์ถ๋ก ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Vertex AI๋ ์ต์ ํ ๋ชฉํ์ ์ต์ํ ๋๊ตฌ ์ธ์ ๋ถ์์ ๊ฐ๊ณผ ์์ธก์ ์ ๊ณตํฉ๋๋ค. ๋ถ์์ ๊ฐ์ ๋ชจ๋ธ ํ์ต ์ค์ ์ค์ ๋ฉ๋๋ค. ๋ถ์์ ์์ธก์ ๋ถ์์ ๊ฐ๊ณผ ์ฐ๊ฒฐ๋ ์์ธก ๊ฐ์ ๋๋ค.
๋ค์ ๋จ๊ณ
- ๋ชจ๋ธ ๋ด๋ณด๋ด๊ธฐ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
- ์ผ๊ด ์์ธก ๊ฐ๊ฒฉ ์ฑ ์ ์์๋ณด๊ธฐ