ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ ๋งŒ๋“ค๊ธฐ

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปค์Šคํ…€ ๋จธ์‹ ๋Ÿฌ๋‹(ML) ํ•™์Šต์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ•™์Šต ์ถœ๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Model ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค๊ธฐ ์ „์—

Vertex AI์—์„œ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค๊ธฐ ์ „์— Python ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด Vertex AI์—์„œ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ํ•™์Šต ์ฝ”๋“œ์™€ ์ข…์† ํ•ญ๋ชฉ์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. TensorFlow, scikit-learn ๋˜๋Š” XGBoost๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Python ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์˜ต์…˜์„ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ํ•™์Šต ์ฝ”๋“œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ์ถ”๊ฐ€ ๋‹จ๊ณ„๋กœ ํ•™์Šต ์ž‘์—…์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • CustomJob์„ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ ๋ชจ๋ธ์„ Vertex AI์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ๋ชจ๋ธ ๊ฒฐ๊ณผ๋ฅผ Vertex AI์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

CustomJob์— ํฌํ•จ๋œ ํ•ญ๋ชฉ

์ปค์Šคํ…€ ์ž‘์—…์„ ๋งŒ๋“ค ๋•Œ๋Š” Vertex AI๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•™์Šต ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„ค์ •์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์ž ํ’€ ๋‚ด์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Vertex AI Training ํŒŒ์ดํ”„๋ผ์ธ ์™ธ๋ถ€์—์„œ ๋…๋ฆฝํ˜• ์ปค์Šคํ…€ ์ž‘์—…์„ ๋งŒ๋“ค๋ ค๋ฉด ์ปค์Šคํ…€ ์ž‘์—… ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ปค์Šคํ…€ ํ•™์Šต ์ž‘์—… ๋˜๋Š” ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ์ • ์ž‘์—…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋ชจ๋ธ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Vertex AI๊ฐ€ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  3. ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ๋•Œ ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ inputDataConfig ์„น์…˜์—์„œ ๋ฐ์ดํ„ฐ ์„ธํŠธ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋งŒ๋“  ๋ฆฌ์ „๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์— ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ TrainingPipeline์˜ API ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ถ„์‚ฐ ํ•™์Šต ๊ตฌ์„ฑ

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์ž ํ’€์„ ์ง€์ •ํ•˜์—ฌ ๋ถ„์‚ฐํ˜• ํ•™์Šต์— ์ปค์Šคํ…€ ํ•™์Šต ์ž‘์—… ๋˜๋Š” ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ์ • ์ž‘์—…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ์˜ˆ์‹œ์—์„œ๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…์ž ํ’€์ด ์žˆ๋Š” ๋‹จ์ผ ๋ณต์ œ๋ณธ ํ•™์Šต ์ž‘์—…์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ถ„์‚ฐํ˜• ํ•™์Šต์„ ์œ„ํ•ด ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  • ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ž ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ณต์ œ๋ณธ์„ ๊ตฌ์„ฑํ•˜๊ณ  ๋ณต์ œ๋ณธ ์นด์šดํŠธ๋ฅผ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ถ„์‚ฐํ˜• ํ•™์Šต์— ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…์ž ๋ณต์ œ๋ณธ, ๋งค๊ฐœ๋ณ€์ˆ˜ ์„œ๋ฒ„ ๋ณต์ œ๋ณธ ๋˜๋Š” ํ‰๊ฐ€์ž ๋ณต์ œ๋ณธ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ž‘์—…์ž ํ’€์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์‚ฐํ˜• ํ•™์Šต ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

CustomJob ๋ฐ ๋ชจ๋ธ ์—…๋กœ๋“œ

์ด ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ํ•™์Šต ํ›„์— ๋ชจ๋ธ์„ Vertex AI์— ๋” ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŽธ๋ฆฌํ•œ ๋‹จ๊ณ„์™€ ํ•จ๊ป˜ ์ปค์Šคํ…€ ์ž‘์—…์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์—์„œ CustomJob ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์ž‘์—…์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ปค์Šคํ…€ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Cloud Storage ๋ฒ„ํ‚ท์— ์ง€์ •ํ•œ ์ถœ๋ ฅ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์ƒ์„ฑํ•œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ๋ฆฌ์†Œ์Šค๋Š” ๋ชจ๋ธ ๋ฐฐํฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•™์Šต ์ž‘์—…์— baseOutputDirectory๋ฅผ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ํ•™์Šต ์ฝ”๋“œ๊ฐ€ Vertex AI์—์„œ ์„ค์ •ํ•œ $AIP_MODEL_DIR ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์œ„์น˜์— ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ €์žฅํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ•™์Šต ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด Vertex AI๊ฐ€ gs://BASE_OUTPUT_DIRECTORY/model์—์„œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

  • modelToUpload.artifactUri ํ•„๋“œ๋ฅผ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ํ•ด๋‹น URI์—์„œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. baseOutputDirectory๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

baseOutputDirectory ๋ฐ modelToUpload.artifactUri๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ•˜๋ฉด Vertex AI์— modelToUpload.artifactUri๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์œ ํ˜•์˜ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์˜ Vertex AI ์„น์…˜์—์„œ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ด๋™

  2. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒˆ ๋ชจ๋ธ ํ•™์Šต ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค.

  3. ํ•™์Šต ๋ฐฉ๋ฒ• ๋‹จ๊ณ„์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ํ•™์Šต์— ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฐ ์ฃผ์„ ์„ธํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

      ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ ์„ธํŠธ ์—†์Œ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    2. ์ปค์Šคํ…€ ํ•™์Šต(๊ณ ๊ธ‰)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ๊ณ„์†์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ชจ๋ธ ์„ธ๋ถ€์ •๋ณด ๋‹จ๊ณ„์—์„œ ์ƒˆ ๋ชจ๋ธ ํ•™์Šต ๋˜๋Š” ์ƒˆ ๋ฒ„์ „ ํ•™์Šต์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ชจ๋ธ ํ•™์Šต์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ ๋ชจ๋ธ์— ์‚ฌ์šฉํ•  ์ด๋ฆ„(MODEL_NAME)์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. ํ•™์Šต ์ปจํ…Œ์ด๋„ˆ ๋‹จ๊ณ„์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ํ•™์Šต์— ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    2. ์„ ํƒ์— ๋”ฐ๋ผ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

      ์ด ๊ฐ’์€ baseOutputDirectory API ํ•„๋“œ์˜ Vertex AI๋กœ ์ „๋‹ฌ๋˜์–ด ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋ฉด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      ํ•™์Šต์ด ๋๋‚˜๋ฉด Vertex AI๋Š” Model์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด URI์˜ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ•™์Šต ์ฝ”๋“œ์— AIP_MODEL_DIR ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ Vertex AI๋Š” BASE_OUTPUT_DIRECTORY/model/์—์„œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ฐพ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

    4. ์„ ํƒ์‚ฌํ•ญ: ์ธ์ˆ˜ ํ•„๋“œ์—์„œ ํ•™์Šต ์ฝ”๋“œ ์‹คํ–‰์„ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•  Vertex AI์˜ ์ธ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ๋œ ๋ชจ๋“  ์ธ์ˆ˜์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 100,000์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜์˜ ๋™์ž‘์€ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

    ๊ณ„์†์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ๋‹จ๊ณ„์—์„œ ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์‚ฌ์šฉ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋œ ๊ฒƒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  7. ์ปดํ“จํŒ… ๋ฐ ๊ฐ€๊ฒฉ ์ฑ…์ • ๋‹จ๊ณ„์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ๋ฆฌ์ „ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ "์ปค์Šคํ…€ ํ•™์Šต์„ ์ง€์›ํ•˜๋Š” ๋ฆฌ์ „"์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    2. ์ž‘์—…์ž ํ’€ 0 ์„น์…˜์—์„œ ํ•™์Šต์— ์‚ฌ์šฉํ•  ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

      ๊ฐ€์†๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์„ ํƒํ•œ ๊ฐ€์†๊ธฐ๋ฅผ ์„ ํƒํ•œ ๋ฆฌ์ „์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      ๋ถ„์‚ฐํ˜• ํ•™์Šต์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ž‘์—…์ž ํ’€ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฐ ์ถ”๊ฐ€ ์ž‘์—…์ž ํ’€์— ๋Œ€ํ•ด ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๊ณ„์†์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  8. ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ ๋‹จ๊ณ„์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

    2. ์„ ํƒ์— ๋”ฐ๋ผ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. ๋ชจ๋ธ ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•„๋“œ์—๋Š” ์ด์ „์— ํ•™์Šต ์ปจํ…Œ์ด๋„ˆ ๋‹จ๊ณ„์˜ ๋ชจ๋ธ ์ถœ๋ ฅ ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•„๋“œ์—์„œ ์„ค์ •ํ•œ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋™์ผํ•œ ํšจ๊ณผ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด์ „ ์•ˆ๋‚ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    4. ์Šคํ‚ค๋งˆ ์˜ˆ์ธก ์„น์…˜์˜ ํ•„๋“œ๋Š” ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค.

  9. ํ•™์Šต ์‹œ์ž‘์„ ํด๋ฆญํ•˜์—ฌ ์ปค์Šคํ…€ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

REST

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ trainingPipeline ๋ฆฌ์†Œ์Šค์˜ create ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ƒˆ ๋ชจ๋ธ ๋ฒ„์ „์„ ๋งŒ๋“ค๋„๋ก ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ์„ ํƒ์ ์œผ๋กœ trainingPipeline ํ•„๋“œ์—์„œ PARENT_MODEL์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Vertex AI Model Registry๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ๋ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

  • LOCATION_ID: ํ•™์Šต ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  Model์ด ์ €์žฅ๋œ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
  • PROJECT_ID: ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
  • TRAINING_PIPELINE_NAME: ํ•„์ˆ˜. trainingPipeline์˜ ํ‘œ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Vertex AI ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • DATASET_ID: ๋ฐ์ดํ„ฐ ์„ธํŠธ ID์ž…๋‹ˆ๋‹ค.
    • ANNOTATIONS_FILTER: ์ง€์ •ํ•œ ์ฃผ์„์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ANNOTATION_SCHEMA_URI: ์ง€์ •๋œ ์ฃผ์„ ์Šคํ‚ค๋งˆ URI๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์ด ํ•™์Šต, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ๊ฐ ์„ธํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋น„์œจ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • TRAINING_FRACTION: ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • VALIDATION_FRACTION: ๋ชจ๋ธ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TEST_FRACTION: ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
      • ํ•„ํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • TRAINING_FILTER: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
        • VALIDATION_FILTER: ๋ชจ๋ธ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
        • TEST_FILTER: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
      • ์‚ฌ์ „ ์ •์˜๋œ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • PREDEFINED_SPLIT_KEY: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์—ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ์—ด์˜ ๊ฐ’์€ 'training`, `validation`, `test`์ž…๋‹ˆ๋‹ค.
      • ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • TIMESTAMP_TRAINING_FRACTION: ๋ชจ๋ธ ํ•™์Šต์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TIMESTAMP_VALIDATION_FRACTION: ๋ชจ๋ธ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TIMESTAMP_TEST_FRACTION: ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TIMESTAMP_SPLIT_KEY: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ํƒ€์ž„์Šคํƒฌํ”„ ์—ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • OUTPUT_URI_PREFIX: ํ•™์Šต, ๊ฒ€์ฆ, ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• ๋œ ๊ฒฝ์šฐ Vertex AI๊ฐ€ ํ•™์Šต ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” Cloud Storage ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  • ์ปค์Šคํ…€ ํ•™์Šต ์ž‘์—…์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • MACHINE_TYPE: ๋จธ์‹  ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ํ•™์Šต์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋จธ์‹  ์œ ํ˜•์„ ์ฐธ์กฐํ•˜์„ธ์š”.
    • ACCELERATOR_TYPE: (์„ ํƒ์‚ฌํ•ญ) ๊ฐ ์‹œ๋„์— ์—ฐ๊ฒฐํ•  ๊ฐ€์†๊ธฐ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
    • ACCELERATOR_COUNT: (์„ ํƒ์‚ฌํ•ญ) ๊ฐ ์‹œ๋„์— ์—ฐ๊ฒฐํ•  ๊ฐ€์†๊ธฐ ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • REPLICA_COUNT: ๊ฐ ์‹œ๋„์—์„œ ์‚ฌ์šฉํ•  ์ž‘์—…์ž ๋ณต์ œ๋ณธ ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • CUSTOM_CONTAINER_IMAGE_URI: ๊ฐ ์ž‘์—…์ž ๋ณต์ œ๋ณธ์—์„œ ์‹คํ–‰๋  Artifact Registry ๋˜๋Š” Docker Hub์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ URI์ž…๋‹ˆ๋‹ค.
      • CUSTOM_CONTAINER_COMMAND: (์„ ํƒ์‚ฌํ•ญ) ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ์ง„์ž…์ ์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
      • CUSTOM_CONTAINER_ARGS: (์„ ํƒ์‚ฌํ•ญ) ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ์ „๋‹ฌ๋  ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ๋œ ๋ชจ๋“  ์ธ์ˆ˜์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 100,000์ž์ž…๋‹ˆ๋‹ค.
    • ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” Python ํŒจํ‚ค์ง€์ธ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: ์ œ๊ณต๋œ Python ํŒจํ‚ค์ง€๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ URI์ž…๋‹ˆ๋‹ค. ํ•™์Šต์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
      • PYTHON_PACKAGE_URIS: ํ•™์Šต ํ”„๋กœ๊ทธ๋žจ ๋ฐ ์ข…์† ํŒจํ‚ค์ง€์ธ Python ํŒจํ‚ค์ง€ ํŒŒ์ผ์˜ Cloud Storage ์œ„์น˜์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ URI์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” 100๊ฐœ์ž…๋‹ˆ๋‹ค.
      • PYTHON_MODULE: ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์‹คํ–‰ํ•  Python ๋ชจ๋“ˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      • PYTHON_PACKAGE_ARGS: (์„ ํƒ์‚ฌํ•ญ) Python ๋ชจ๋“ˆ๋กœ ์ „๋‹ฌํ•  ๋ช…๋ น์ค„ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ๋œ ๋ชจ๋“  ์ธ์ˆ˜์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 100,000์ž์ž…๋‹ˆ๋‹ค.
    • TIMEOUT: (์„ ํƒ์‚ฌํ•ญ) ์ž‘์—…์˜ ์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
  • MODEL_NAME: TrainingPipeline์—์„œ ์—…๋กœ๋“œ(์ƒ์„ฑ)ํ•œ ๋ชจ๋ธ์˜ ํ‘œ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • MODEL_DESCRIPTION: ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
  • IMAGE_URI: ์˜ˆ์ธก ์‹คํ–‰์— ์‚ฌ์šฉํ•  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ URI์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-1:latest์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋‚˜ ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • modelToUpload.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/trainingPipelines

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

{
  "displayName": "TRAINING_PIPELINE_NAME",
  "inputDataConfig": {
    "datasetId": DATASET_ID,
    "annotationsFilter": ANNOTATIONS_FILTER,
    "annotationSchemaUri": ANNOTATION_SCHEMA_URI,

    // Union field split can be only one of the following:
    "fractionSplit": {
      "trainingFraction": TRAINING_FRACTION,
      "validationFraction": VALIDATION_FRACTION,
      "testFraction": TEST_FRACTION
    },
    "filterSplit": {
      "trainingFilter": TRAINING_FILTER,
      "validationFilter": VALIDATION_FILTER,
      "testFilter": TEST_FILTER
    },
    "predefinedSplit": {
      "key": PREDEFINED_SPLIT_KEY
    },
    "timestampSplit": {
      "trainingFraction": TIMESTAMP_TRAINING_FRACTION,
      "validationFraction": TIMESTAMP_VALIDATION_FRACTION,
      "testFraction": TIMESTAMP_TEST_FRACTION,
      "key": TIMESTAMP_SPLIT_KEY
    }
    // End of list of possible types for union field split.
    "gcsDestination": {
      "outputUriPrefix": OUTPUT_URI_PREFIX
    }
  },
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml",
  "trainingTaskInputs": {
    "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // Union field task can be only one of the following:
          "containerSpec": {
            "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
            "command": [
              CUSTOM_CONTAINER_COMMAND
            ],
            "args": [
              CUSTOM_CONTAINER_ARGS
            ]
          },
          "pythonPackageSpec": {
            "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
            "packageUris": [
              PYTHON_PACKAGE_URIS
            ],
            "pythonModule": PYTHON_MODULE,
            "args": [
              PYTHON_PACKAGE_ARGS
            ]
          }
          // End of list of possible types for union field task.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      }
    }
  },
  "modelToUpload": {
    "displayName": "MODEL_NAME",
    "predictSchemata": {},
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    }
  },
  "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/trainingPipelines"

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/trainingPipelines" | Select-Object -Expand Content

์‘๋‹ต์—๋Š” ์‚ฌ์–‘ ๋ฐ TRAININGPIPELINE_ID์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Java

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

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

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.PipelineServiceClient;
import com.google.cloud.aiplatform.v1.PipelineServiceSettings;
import com.google.cloud.aiplatform.v1.TrainingPipeline;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.protobuf.Value;
import com.google.protobuf.util.JsonFormat;
import java.io.IOException;

public class CreateTrainingPipelineCustomJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";
    String modelDisplayName = "MODEL_DISPLAY_NAME";
    String containerImageUri = "CONTAINER_IMAGE_URI";
    String baseOutputDirectoryPrefix = "BASE_OUTPUT_DIRECTORY_PREFIX";
    createTrainingPipelineCustomJobSample(
        project, displayName, modelDisplayName, containerImageUri, baseOutputDirectoryPrefix);
  }

  static void createTrainingPipelineCustomJobSample(
      String project,
      String displayName,
      String modelDisplayName,
      String containerImageUri,
      String baseOutputDirectoryPrefix)
      throws IOException {
    PipelineServiceSettings settings =
        PipelineServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // 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 (PipelineServiceClient client = PipelineServiceClient.create(settings)) {
      JsonObject jsonMachineSpec = new JsonObject();
      jsonMachineSpec.addProperty("machineType", "n1-standard-4");

      // A working docker image can be found at
      // gs://cloud-samples-data/ai-platform/mnist_tfrecord/custom_job
      // This sample image accepts a set of arguments including model_dir.
      JsonObject jsonContainerSpec = new JsonObject();
      jsonContainerSpec.addProperty("imageUri", containerImageUri);
      JsonArray jsonArgs = new JsonArray();
      jsonArgs.add("--model_dir=$(AIP_MODEL_DIR)");
      jsonContainerSpec.add("args", jsonArgs);

      JsonObject jsonJsonWorkerPoolSpec0 = new JsonObject();
      jsonJsonWorkerPoolSpec0.addProperty("replicaCount", 1);
      jsonJsonWorkerPoolSpec0.add("machineSpec", jsonMachineSpec);
      jsonJsonWorkerPoolSpec0.add("containerSpec", jsonContainerSpec);

      JsonArray jsonWorkerPoolSpecs = new JsonArray();
      jsonWorkerPoolSpecs.add(jsonJsonWorkerPoolSpec0);

      JsonObject jsonBaseOutputDirectory = new JsonObject();
      // The GCS location for outputs must be accessible by the project's AI Platform
      // service account.
      jsonBaseOutputDirectory.addProperty("output_uri_prefix", baseOutputDirectoryPrefix);

      JsonObject jsonTrainingTaskInputs = new JsonObject();
      jsonTrainingTaskInputs.add("workerPoolSpecs", jsonWorkerPoolSpecs);
      jsonTrainingTaskInputs.add("baseOutputDirectory", jsonBaseOutputDirectory);

      Value.Builder trainingTaskInputsBuilder = Value.newBuilder();
      JsonFormat.parser().merge(jsonTrainingTaskInputs.toString(), trainingTaskInputsBuilder);
      Value trainingTaskInputs = trainingTaskInputsBuilder.build();
      String trainingTaskDefinition =
          "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml";
      String imageUri = "gcr.io/cloud-aiplatform/prediction/tf-cpu.1-15:latest";
      ModelContainerSpec containerSpec =
          ModelContainerSpec.newBuilder().setImageUri(imageUri).build();
      Model modelToUpload =
          Model.newBuilder()
              .setDisplayName(modelDisplayName)
              .setContainerSpec(containerSpec)
              .build();
      TrainingPipeline trainingPipeline =
          TrainingPipeline.newBuilder()
              .setDisplayName(displayName)
              .setTrainingTaskDefinition(trainingTaskDefinition)
              .setTrainingTaskInputs(trainingTaskInputs)
              .setModelToUpload(modelToUpload)
              .build();
      LocationName parent = LocationName.of(project, location);
      TrainingPipeline response = client.createTrainingPipeline(parent, trainingPipeline);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }
}

Python

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

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” Python์šฉ Vertex AI SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•™์Šต์— ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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

Python์šฉ Vertex AI SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ์—์„œ Python ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค๋ฉด ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ํ•™์Šต ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Cloud Storage์— ์žˆ๋Š” Python ์†Œ์Šค ๋ฐฐํฌ ํŒจํ‚ค์ง€์˜ URI๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    Python์šฉ Vertex AI SDK๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ๋•Œ๋„ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋กœ์ปฌ ๋จธ์‹ ์—์„œ Python ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Python์šฉ Vertex AI SDK๋Š” ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์†Œ์Šค ๋ฐฐํฌ๋กœ ํŒจํ‚ค์ง•ํ•˜๊ณ  ์›ํ•˜๋Š” Cloud Storage ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    Python์šฉ Vertex AI SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฐ ์˜ต์…˜์˜ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ๋ณด๋ ค๋ฉด ํ•ด๋‹น ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€

๋‹ค์Œ ์ƒ˜ํ”Œ์—์„œ๋Š” CustomPythonPackageTrainingJob ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

def create_training_pipeline_custom_package_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    python_package_gcs_uri: str,
    python_module_name: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 1,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomPythonPackageTrainingJob(
        display_name=display_name,
        python_package_gcs_uri=python_package_gcs_uri,
        python_module_name=python_module_name,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

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

์Šคํฌ๋ฆฝํŠธ

๋‹ค์Œ ์ƒ˜ํ”Œ์—์„œ๋Š” CustomTrainingJob ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

def create_training_pipeline_custom_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    script_path: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 0,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomTrainingJob(
        display_name=display_name,
        script_path=script_path,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

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

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

๋‹ค์Œ ์ƒ˜ํ”Œ์—์„œ๋Š” CustomContainerTrainingJob ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

def create_training_pipeline_custom_container_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 1,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomContainerTrainingJob(
        display_name=display_name,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

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

์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์ž‘์—… ๋ฐ ๋ชจ๋ธ ์—…๋กœ๋“œ

์ด ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ํ•™์Šต ํ›„์— ๋ชจ๋ธ์„ Vertex AI์— ๋” ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŽธ๋ฆฌํ•œ ๋‹จ๊ณ„์™€ ํ•จ๊ป˜ ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์ž‘์—…์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์ž‘์—… ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์ž‘์—…์€ ์—ฌ๋Ÿฌ ์‹œ๋„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ ์‹œ๋„์—์„œ ์ปค์Šคํ…€ ์ž‘์—…์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค์™€ ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ Cloud Storage ๋ฒ„ํ‚ท์— ์ง€์ •ํ•œ ์ถœ๋ ฅ ๋””๋ ‰ํ„ฐ๋ฆฌ(baseOutputDirectory) ๋‚ด์—์„œ ์ตœ์ ์˜ ์‹œ๋„๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์€ ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ๋ฆฌ์†Œ์Šค๋Š” ๋ชจ๋ธ ๋ฐฐํฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ Vertex AI๊ฐ€ ์ตœ์ ์˜ ์‹œ๋„์—์„œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” baseOutputDirectory๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ์ • ์ž‘์—…์—๋Š” ๊ตฌ์„ฑํ•  ์ถ”๊ฐ€ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. HyperparameterTuningJob ์„ค์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

REST

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ trainingPipeline ๋ฆฌ์†Œ์Šค์˜ create ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

  • LOCATION_ID: ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
  • PROJECT_ID: ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
  • TRAINING_PIPELINE_NAME: ํ•„์ˆ˜. trainingPipeline์˜ ํ‘œ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Vertex AI ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • DATASET_ID: ๋ฐ์ดํ„ฐ ์„ธํŠธ ID์ž…๋‹ˆ๋‹ค.
    • ANNOTATIONS_FILTER: ์ง€์ •ํ•œ ์ฃผ์„์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ANNOTATION_SCHEMA_URI: ์ง€์ •๋œ ์ฃผ์„ ์Šคํ‚ค๋งˆ URI๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์ด ํ•™์Šต, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ๊ฐ ์„ธํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋น„์œจ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • TRAINING_FRACTION: ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • VALIDATION_FRACTION: ๋ชจ๋ธ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TEST_FRACTION: ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
      • ํ•„ํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • TRAINING_FILTER: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
        • VALIDATION_FILTER: ๋ชจ๋ธ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
        • TEST_FILTER: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
      • ์‚ฌ์ „ ์ •์˜๋œ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • PREDEFINED_SPLIT_KEY: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์—ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ์—ด์˜ ๊ฐ’์€ 'training`, `validation`, `test`์ž…๋‹ˆ๋‹ค.
      • ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • TIMESTAMP_TRAINING_FRACTION: ๋ชจ๋ธ ํ•™์Šต์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TIMESTAMP_VALIDATION_FRACTION: ๋ชจ๋ธ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TIMESTAMP_TEST_FRACTION: ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
        • TIMESTAMP_SPLIT_KEY: ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ํƒ€์ž„์Šคํƒฌํ”„ ์—ด์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • OUTPUT_URI_PREFIX: ํ•™์Šต, ๊ฒ€์ฆ, ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋ถ„ํ• ๋œ ๊ฒฝ์šฐ Vertex AI๊ฐ€ ํ•™์Šต ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” Cloud Storage ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • ์ž‘์—…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ธก์ •ํ•ญ๋ชฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • METRIC_ID: ์ธก์ •ํ•ญ๋ชฉ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      • METRIC_GOAL: ์ธก์ •ํ•ญ๋ชฉ์˜ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. MAXIMIZE ๋˜๋Š” MINIMIZE์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • PARAMETER_ID: ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      • PARAMETER_SCALE: (์„ ํƒ์‚ฌํ•ญ) ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ์ • ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฒ”์ฃผํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UNIT_LINEAR_SCALE, UNIT_LOG_SCALE, UNIT_REVERSE_LOG_SCALE, ๋˜๋Š” SCALE_TYPE_UNSPECIFIED์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•์ด DOUBLE์ด๋ฉด ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ตœ์†Œ๊ฐ’(DOUBLE_MIN_VALUE)๊ณผ ์ตœ๋Œ€๊ฐ’(DOUBLE_MAX_VALUE)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์ด INTEGER์ด๋ฉด ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ตœ์†Œ๊ฐ’(INTEGER_MIN_VALUE)๊ณผ ์ตœ๋Œ€๊ฐ’(INTEGER_MAX_VALUE)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์ด CATEGORICAL์ด๋ฉด ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’(CATEGORICAL_VALUES)์„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์ด DISCRETE์ด๋ฉด ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’(DISCRETE_VALUES)์„ ์ˆซ์ž ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ALGORITHM: (์„ ํƒ์‚ฌํ•ญ) ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ์ • ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•  ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ALGORITHM_UNSPECIFIED, GRID_SEARCH, ๋˜๋Š” RANDOM_SEARCH์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • MAX_TRIAL_COUNT: ์ž‘์—…์—์„œ ์‹คํ–‰ํ•  ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • PARALLEL_TRIAL_COUNT: ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • MAX_FAILED_TRIAL_COUNT: ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ์ • ์ž‘์—…์ด ์‹คํŒจํ•˜๊ธฐ ์ „์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ์‹œ๋„ ์ปค์Šคํ…€ ํ•™์Šต ์ž‘์—…์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
      • MACHINE_TYPE: ๋จธ์‹  ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ํ•™์Šต์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋จธ์‹  ์œ ํ˜•์„ ์ฐธ์กฐํ•˜์„ธ์š”.
      • ACCELERATOR_TYPE: (์„ ํƒ์‚ฌํ•ญ) ๊ฐ ์‹œ๋„์— ์—ฐ๊ฒฐํ•  ๊ฐ€์†๊ธฐ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
      • ACCELERATOR_COUNT: (์„ ํƒ์‚ฌํ•ญ) ๊ฐ ์‹œ๋„์— ์—ฐ๊ฒฐํ•  ๊ฐ€์†๊ธฐ ์ˆ˜์ž…๋‹ˆ๋‹ค.
      • REPLICA_COUNT: ๊ฐ ์‹œ๋„์—์„œ ์‚ฌ์šฉํ•  ์ž‘์—…์ž ๋ณต์ œ๋ณธ ์ˆ˜์ž…๋‹ˆ๋‹ค.
      • ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • CUSTOM_CONTAINER_IMAGE_URI: ๊ฐ ์ž‘์—…์ž ๋ณต์ œ๋ณธ์—์„œ ์‹คํ–‰๋  Artifact Registry ๋˜๋Š” Docker Hub์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ URI์ž…๋‹ˆ๋‹ค.
        • CUSTOM_CONTAINER_COMMAND: (์„ ํƒ์‚ฌํ•ญ) ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ์ง„์ž…์ ์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
        • CUSTOM_CONTAINER_ARGS: (์„ ํƒ์‚ฌํ•ญ) ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ์ „๋‹ฌ๋˜๋Š” ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.
      • ํ•™์Šต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” Python ํŒจํ‚ค์ง€์ธ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: ์ œ๊ณต๋œ Python ํŒจํ‚ค์ง€๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ URI์ž…๋‹ˆ๋‹ค. ํ•™์Šต์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
        • PYTHON_PACKAGE_URIS: ํ•™์Šต ํ”„๋กœ๊ทธ๋žจ ๋ฐ ์ข…์† ํŒจํ‚ค์ง€์ธ Python ํŒจํ‚ค์ง€ ํŒŒ์ผ์˜ Cloud Storage ์œ„์น˜์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ URI์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” 100๊ฐœ์ž…๋‹ˆ๋‹ค.
        • PYTHON_MODULE: ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์‹คํ–‰ํ•  Python ๋ชจ๋“ˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
        • PYTHON_PACKAGE_ARGS: (์„ ํƒ์‚ฌํ•ญ) Python ๋ชจ๋“ˆ๋กœ ์ „๋‹ฌํ•  ๋ช…๋ น์ค„ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ์ž‘์—… ์˜ˆ์•ฝ ์˜ต์…˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”.
    • TIMEOUT: (์„ ํƒ์‚ฌํ•ญ) ๊ฐ ์‹œ๋„์˜ ์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
    • ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜ ์กฐ์ • ์ž‘์—…์— ์ ์šฉํ•  ๋ชจ๋“  ๋ผ๋ฒจ์— LABEL_NAME ๋ฐ LABEL_VALUE๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • MODEL_NAME: TrainingPipeline์—์„œ ์—…๋กœ๋“œ(์ƒ์„ฑ)ํ•œ ๋ชจ๋ธ์˜ ํ‘œ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • MODEL_DESCRIPTION: ์„ ํƒ์‚ฌํ•ญ. ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
  • PREDICTION_IMAGE_URI: ํ•„์ˆ˜. ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • modelToUpload.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/trainingPipelines

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

{
  "displayName": "TRAINING_PIPELINE_NAME",
  "inputDataConfig": {
    "datasetId": DATASET_ID,
    "annotationsFilter": ANNOTATIONS_FILTER,
    "annotationSchemaUri": ANNOTATION_SCHEMA_URI,

    // Union field split can be only one of the following:
    "fractionSplit": {
      "trainingFraction": TRAINING_FRACTION,
      "validationFraction": VALIDATION_FRACTION,
      "testFraction": TEST_FRACTION
    },
    "filterSplit": {
      "trainingFilter": TRAINING_FILTER,
      "validationFilter": VALIDATION_FILTER,
      "testFilter": TEST_FILTER
    },
    "predefinedSplit": {
      "key": PREDEFINED_SPLIT_KEY
    },
    "timestampSplit": {
      "trainingFraction": TIMESTAMP_TRAINING_FRACTION,
      "validationFraction": TIMESTAMP_VALIDATION_FRACTION,
      "testFraction": TIMESTAMP_TEST_FRACTION,
      "key": TIMESTAMP_SPLIT_KEY
    }
    // End of list of possible types for union field split.
    "gcsDestination": {
      "outputUriPrefix": OUTPUT_URI_PREFIX
    }
  },
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/hyperparameter_tuning_task_1.0.0.yaml",
  "trainingTaskInputs": {
    "studySpec": {
    "metrics": [
      {
        "metricId": METRIC_ID,
        "goal": METRIC_GOAL
      }
    ],
    "parameters": [
      {
        "parameterId": PARAMETER_ID,
        "scaleType": PARAMETER_SCALE,

        // Union field parameter_value_spec can be only one of the following:
        "doubleValueSpec": {
            "minValue": DOUBLE_MIN_VALUE,
            "maxValue": DOUBLE_MAX_VALUE
        },
        "integerValueSpec": {
            "minValue": INTEGER_MIN_VALUE,
            "maxValue": INTEGER_MAX_VALUE
        },
        "categoricalValueSpec": {
            "values": [
              CATEGORICAL_VALUES
            ]
        },
        "discreteValueSpec": {
            "values": [
              DISCRETE_VALUES
            ]
        }
        // End of list of possible types for union field parameter_value_spec.
      }
    ],
    "ALGORITHM": ALGORITHM
  },
  "maxTrialCount": MAX_TRIAL_COUNT,
  "parallelTrialCount": PARALLEL_TRIAL_COUNT,
  "maxFailedTrialCount": MAX_FAILED_TRIAL_COUNT,
  "trialJobSpec": {
      "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // Union field task can be only one of the following:
          "containerSpec": {
            "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
            "command": [
              CUSTOM_CONTAINER_COMMAND
            ],
            "args": [
              CUSTOM_CONTAINER_ARGS
            ]
          },
          "pythonPackageSpec": {
            "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
            "packageUris": [
              PYTHON_PACKAGE_URIS
            ],
            "pythonModule": PYTHON_MODULE,
            "args": [
              PYTHON_PACKAGE_ARGS
            ]
          }
          // End of list of possible types for union field task.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      }
    },
    "labels": {
      LABEL_NAME_1": LABEL_VALUE_1,
      LABEL_NAME_2": LABEL_VALUE_2
    }
  },
  "modelToUpload": {
    "displayName": "MODEL_NAME",
    "description": "MODEL_DESCRIPTION",
    "predictSchemata": {},
    "containerSpec": {
      "imageUri": "PREDICTION_IMAGE_URI"
    }
  },
  "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/trainingPipelines"

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/trainingPipelines" | Select-Object -Expand Content

์‘๋‹ต์—๋Š” ์‚ฌ์–‘ ๋ฐ TRAININGPIPELINE_ID์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ๋ชจ๋‹ˆํ„ฐ๋ง

๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. Google Cloud Console์˜ Vertex AI ์„น์…˜์—์„œ ํ•™์Šต ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ํ•™์Šต ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. ์ž‘์—… ์ด๋ฆ„์„ ํด๋ฆญํ•˜์—ฌ ์ปค์Šคํ…€ ์ž‘์—… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋กœ๊ทธ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋Œ€ํ™”ํ˜• ์…ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šต ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šต๋œ ๋ชจ๋ธ ๋ณด๊ธฐ

์ปค์Šคํ…€ ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์ด ์™„๋ฃŒ๋˜๋ฉด Google Cloud Console์˜ Vertex AI ์„น์…˜์—์„œ ๋ชจ๋ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ ํ•™์Šต๋œ ๋ชจ๋ธ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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