Vertex AI๋กœ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Vertex AI Model Registry๋กœ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋ฉด Model Registry์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Model Registry์—์„œ ๊ฐ€์ ธ์˜จ ๋ชจ๋ธ์„ ์—”๋“œํฌ์ธํŠธ์— ๋ฐฐํฌํ•˜๊ณ  ์ถ”๋ก ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์—ญํ• 

๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ Vertex AI ์‚ฌ์šฉ์ž(roles/aiplatform.user) IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”. ์—ญํ•  ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ปค์Šคํ…€ ์—ญํ• ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ๋นŒ๋“œ ๋˜๋Š” ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ

๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ Vertex AI์˜ ์ปจํ…Œ์ด๋„ˆ์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ์ถ”๋ก  ์š”์ฒญ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Vertex AI์—์„œ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋นŒ๋“œํ•˜์—ฌ Artifact Registry๋กœ ํ‘ธ์‹œํ•˜๋Š” ์ž์ฒด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ์ด ๋‹ค์Œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „์— ๋‚ด๋ณด๋‚ธ ํ…Œ์ด๋ธ” ํ˜•์‹ AutoML ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ Vertex AI์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠน์ • ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ Artifact Registry์— ์žˆ๋Š” ๊ธฐ์กด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Cloud Storage์— ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ์—…๋กœ๋“œ

๋ฒ„ํ‚ท์˜ ๋ฆฌ์ „์ด ์‚ฌ์šฉ ์ค‘์ธ ๋ฆฌ์ „ ์—”๋“œํฌ์ธํŠธ์™€ ์ผ์น˜ํ•˜๋Š” Cloud Storage ๋ฒ„ํ‚ท์— ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cloud Storage ๋ฒ„ํ‚ท์ด ๋‹ค๋ฅธ Google Cloudํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” Vertex AI ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ์˜ ํŒŒ์ผ ์ด๋ฆ„์ด ๋‹ค์Œ ์˜ˆ์‹œ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • TensorFlow SavedModel: saved_model.pb
  • PyTorch: model.mar
  • scikit-learn: model.joblib
  • XGBoost: model.bst ๋˜๋Š” model.joblib

์ถ”๋ก ์šฉ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ๋‚ด๋ณด๋‚ด๊ธฐ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. Google Cloud ์ฝ˜์†”์—์„œ Vertex AI ๋ชจ๋ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ๋ชจ๋ธ ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ƒˆ ๋ชจ๋ธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ƒˆ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  4. ๊ธฐ์กด ๋ฒ„์ „์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ชจ๋ธ์„ ๊ธฐ์กด ๋ชจ๋ธ์˜ ๋ฒ„์ „์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ชจ๋ธ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ชจ๋ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  5. ์ด๋ฆ„ ๋ฐ ๋ฆฌ์ „: ๋ชจ๋ธ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท ๋ฆฌ์ „ ๋ฐ ์‚ฌ์šฉ ์ค‘์ธ Vertex AI ๋ฆฌ์ „ ์—”๋“œํฌ์ธํŠธ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฆฌ์ „์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. ๊ณ ๊ธ‰ ์˜ต์…˜์„ ํŽผ์น˜๋ฉด ์„ ํƒ์ ์œผ๋กœ ๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค์Œ์—์„œ ์ ์ ˆํ•œ ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ

  1. ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๋ชจ๋ธ ํ•™์Šต์— ์‚ฌ์šฉ๋œ ๋ชจ๋ธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ชจ๋ธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฒ„์ „์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ์ถ”๋ก  ์ œ๊ณต์— GPU๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ฐ€์†๊ธฐ ์œ ํ˜•์„ GPU๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋‚˜์ค‘์— ๋ชจ๋ธ์„ ์—”๋“œํฌ์ธํŠธ์— ๋ฐฐํฌํ•  ๋•Œ GPU ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Cloud Storage ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด gs://BUCKET_NAME/models/์ž…๋‹ˆ๋‹ค.

  5. schemata ์˜ˆ์ธก์€ ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค.

  6. Vertex Explainable AI ์„ค์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋ธ ํŽ˜์ด์ง€์— ๋ชจ๋ธ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ค๋ช… ๊ธฐ๋Šฅ ํƒญ์— ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ •์„ ์ž…๋ ฅํ•˜์—ฌ ๋ชจ๋ธ์„ ๊ณ„์† ๊ตฌ์„ฑํ•˜์„ธ์š”. ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ

  1. ๊ธฐ์กด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ URI๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์™ธ์— ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ ค๋ฉด ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Cloud Storage ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด gs://BUCKET_NAME/models/์ž…๋‹ˆ๋‹ค.

  4. ๋‹ค๋ฅธ ํ•„๋“œ์˜ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋Ÿฌํ•œ ์„ ํƒ์  ํ•„๋“œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

  5. Vertex Explainable AI ์„ค์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋ธ ํŽ˜์ด์ง€์— ๋ชจ๋ธ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ค๋ช… ๊ธฐ๋Šฅ ํƒญ์— ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ •์„ ์ž…๋ ฅํ•˜์—ฌ ๋ชจ๋ธ์„ ๊ณ„์† ๊ตฌ์„ฑํ•˜์„ธ์š”. ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

AutoML ํ…Œ์ด๋ธ” ํ˜•์‹ ์ปจํ…Œ์ด๋„ˆ

  1. ๊ธฐ์กด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ํ•„๋“œ์— MULTI_REGION-docker.pkg.dev/vertex-ai/automl-tabular/prediction-server-v1:latest๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    MULTI_REGION์„ us, europe ๋˜๋Š” asia๋กœ ๋ฐ”๊ฟ” Docker ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ Docker ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ €์žฅ์†Œ์—์„œ ๋™์ผํ•œ Docker ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ Docker๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋จธ์‹ ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Artifact Registry ๋ฉ€ํ‹ฐ ๋ฆฌ์ „์„ ์„ ํƒํ•˜๋ฉด ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํŒจํ‚ค์ง€ ์œ„์น˜ ํ•„๋“œ์—์„œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Cloud Storage ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    gs://BUCKET_NAME/models-MODEL_ID/tf-saved-model/TIMESTAMP/

  4. ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋น„์›Œ๋‘ก๋‹ˆ๋‹ค.

  5. ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋ธ ํŽ˜์ด์ง€์— ๋ชจ๋ธ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์„ ๋‹ค๋ฅธ AutoML ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ๊ฐ€์ ธ์˜จ AutoML ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ชจ๋ธ์—์„œ๋Š” Vertex Explainable AI๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

gcloud

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” gcloud ai models upload ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud ai models upload \
  --region=LOCATION \
  --display-name=MODEL_NAME \
  --container-image-uri=IMAGE_URI \
  --artifact-uri=PATH_TO_MODEL_ARTIFACT_DIRECTORY

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • LOCATION_ID: Vertex AI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
  • MODEL_NAME: Model์˜ ํ‘œ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • IMAGE_URI: ์ถ”๋ก  ์ œ๊ณต์— ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ URI์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-1:latest์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • PATH_TO_MODEL_ARTIFACT_DIRECTORY: ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํฌํ•จ๋œ Cloud Storage์— ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Cloud Storage URI(gs://๋กœ ์‹œ์ž‘)์ž…๋‹ˆ๋‹ค.

์•ž์˜ ์˜ˆ์‹œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ถ”๋ก ์„ ์œ„ํ•ด ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Vertex AI๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. --container-๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋Š” Model์˜ containerSpec ํ•„๋“œ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

REST

model ๋ฆฌ์†Œ์Šค์˜ upload ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • LOCATION_ID: Vertex AI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
  • PROJECT_ID: ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
  • MODEL_NAME: Model์˜ ํ‘œ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • MODEL_DESCRIPTION: ์„ ํƒ์‚ฌํ•ญ. ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
  • IMAGE_URI: ์ถ”๋ก  ์ œ๊ณต์— ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ URI์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-1:latest์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • PATH_TO_MODEL_ARTIFACT_DIRECTORY: ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํฌํ•จ๋œ Cloud Storage์— ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Cloud Storage URI(gs://๋กœ ์‹œ์ž‘)์ž…๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ณ€์ˆ˜ ๋ฐ artifactUri ํ•„๋“œ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • labels: ์„ ํƒ์‚ฌํ•ญ. ๋ชจ๋ธ์„ ๊ตฌ์„ฑํ•  ๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • "env": "prod"
    • "tier": "backend"
  • ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์— ์ ์šฉํ•  ๋ผ๋ฒจ์˜ LABEL_NAME ๋ฐ LABEL_VALUE๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/models:upload

JSON ์š”์ฒญ ๋ณธ๋ฌธ:

{
  "model": {
    "displayName": "MODEL_NAME",
    "predictSchemata": {},
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    },
    "artifactUri": "PATH_TO_MODEL_ARTIFACT_DIRECTORY",
    "labels": {
      "LABEL_NAME_1": "LABEL_VALUE_1",
      "LABEL_NAME_2": "LABEL_VALUE_2"
    }
  }
}

์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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/models:upload"

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/models:upload" | Select-Object -Expand Content

Java

์ด ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ ์ „์— Vertex AI ๋น ๋ฅธ ์‹œ์ž‘: ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์˜ Java ์„ค์ • ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Vertex AI Java API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Vertex AI์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.Model;
import com.google.cloud.aiplatform.v1.ModelContainerSpec;
import com.google.cloud.aiplatform.v1.ModelServiceClient;
import com.google.cloud.aiplatform.v1.ModelServiceSettings;
import com.google.cloud.aiplatform.v1.UploadModelOperationMetadata;
import com.google.cloud.aiplatform.v1.UploadModelResponse;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class UploadModelSample {
  public static void main(String[] args)
      throws InterruptedException, ExecutionException, TimeoutException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String modelDisplayName = "YOUR_MODEL_DISPLAY_NAME";
    String metadataSchemaUri =
        "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml";
    String imageUri = "YOUR_IMAGE_URI";
    String artifactUri = "gs://your-gcs-bucket/artifact_path";
    uploadModel(project, modelDisplayName, metadataSchemaUri, imageUri, artifactUri);
  }

  static void uploadModel(
      String project,
      String modelDisplayName,
      String metadataSchemaUri,
      String imageUri,
      String artifactUri)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    ModelServiceSettings modelServiceSettings =
        ModelServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (ModelServiceClient modelServiceClient = ModelServiceClient.create(modelServiceSettings)) {
      String location = "us-central1";
      LocationName locationName = LocationName.of(project, location);

      ModelContainerSpec modelContainerSpec =
          ModelContainerSpec.newBuilder().setImageUri(imageUri).build();

      Model model =
          Model.newBuilder()
              .setDisplayName(modelDisplayName)
              .setMetadataSchemaUri(metadataSchemaUri)
              .setArtifactUri(artifactUri)
              .setContainerSpec(modelContainerSpec)
              .build();

      OperationFuture<UploadModelResponse, UploadModelOperationMetadata> uploadModelResponseFuture =
          modelServiceClient.uploadModelAsync(locationName, model);
      System.out.format(
          "Operation name: %s\n", uploadModelResponseFuture.getInitialFuture().get().getName());
      System.out.println("Waiting for operation to finish...");
      UploadModelResponse uploadModelResponse = uploadModelResponseFuture.get(5, TimeUnit.MINUTES);

      System.out.println("Upload Model Response");
      System.out.format("Model: %s\n", uploadModelResponse.getModel());
    }
  }
}

Node.js

์ด ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ ์ „์— Vertex AI ๋น ๋ฅธ ์‹œ์ž‘: ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์˜ Node.js ์„ค์ • ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Vertex AI Node.js API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Vertex AI์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 */

// const modelDisplayName = 'YOUR_MODEL_DISPLAY_NAME';
// const metadataSchemaUri = 'YOUR_METADATA_SCHEMA_URI';
// const imageUri = 'YOUR_IMAGE_URI';
// const artifactUri = 'YOUR_ARTIFACT_URI';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

// Imports the Google Cloud Model Service Client library
const {ModelServiceClient} = require('@google-cloud/aiplatform');

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};

// Instantiates a client
const modelServiceClient = new ModelServiceClient(clientOptions);

async function uploadModel() {
  // Configure the parent resources
  const parent = `projects/${project}/locations/${location}`;
  // Configure the model resources
  const model = {
    displayName: modelDisplayName,
    metadataSchemaUri: '',
    artifactUri: artifactUri,
    containerSpec: {
      imageUri: imageUri,
      command: [],
      args: [],
      env: [],
      ports: [],
      predictRoute: '',
      healthRoute: '',
    },
  };
  const request = {
    parent,
    model,
  };

  console.log('PARENT AND MODEL');
  console.log(parent, model);
  // Upload Model request
  const [response] = await modelServiceClient.uploadModel(request);
  console.log(`Long running operation : ${response.name}`);

  // Wait for operation to complete
  await response.promise();
  const result = response.result;

  console.log('Upload model response ');
  console.log(`\tModel : ${result.model}`);
}
uploadModel();

Python

Vertex AI SDK for Python์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Vertex AI SDK for Python ์„ค์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Python API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

from typing import Dict, Optional, Sequence

from google.cloud import aiplatform
from google.cloud.aiplatform import explain


def upload_model_sample(
    project: str,
    location: str,
    display_name: str,
    serving_container_image_uri: str,
    artifact_uri: Optional[str] = None,
    serving_container_predict_route: Optional[str] = None,
    serving_container_health_route: Optional[str] = None,
    description: Optional[str] = None,
    serving_container_command: Optional[Sequence[str]] = None,
    serving_container_args: Optional[Sequence[str]] = None,
    serving_container_environment_variables: Optional[Dict[str, str]] = None,
    serving_container_ports: Optional[Sequence[int]] = None,
    instance_schema_uri: Optional[str] = None,
    parameters_schema_uri: Optional[str] = None,
    prediction_schema_uri: Optional[str] = None,
    explanation_metadata: Optional[explain.ExplanationMetadata] = None,
    explanation_parameters: Optional[explain.ExplanationParameters] = None,
    sync: bool = True,
):

    aiplatform.init(project=project, location=location)

    model = aiplatform.Model.upload(
        display_name=display_name,
        artifact_uri=artifact_uri,
        serving_container_image_uri=serving_container_image_uri,
        serving_container_predict_route=serving_container_predict_route,
        serving_container_health_route=serving_container_health_route,
        instance_schema_uri=instance_schema_uri,
        parameters_schema_uri=parameters_schema_uri,
        prediction_schema_uri=prediction_schema_uri,
        description=description,
        serving_container_command=serving_container_command,
        serving_container_args=serving_container_args,
        serving_container_environment_variables=serving_container_environment_variables,
        serving_container_ports=serving_container_ports,
        explanation_metadata=explanation_metadata,
        explanation_parameters=explanation_parameters,
        sync=sync,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    return model

Vertex Explainable AI ์„ค์ •์ด ์‚ฌ์šฉ ์„ค์ •๋œ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด Vertex Explainable AI ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž‘์—… ์ƒํƒœ ๊ฐ€์ ธ์˜ค๊ธฐ

์ผ๋ถ€ ์š”์ฒญ์€ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์ฒญ์€ ์ž‘์—… ์ƒํƒœ๋ฅผ ๋ณด๊ฑฐ๋‚˜ ์ž‘์—…์„ ์ทจ์†Œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Vertex AI๋Š” ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์„ ํ˜ธ์ถœํ•˜๋Š” ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—… ๋‹ค๋ฃจ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • Model Registry์—์„œ ์ง€์›ํ•˜๋Š” ์ตœ๋Œ€ ๋ชจ๋ธ ํฌ๊ธฐ๋Š” 1TB์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„