์ถ”๋ก ์šฉ ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ์š”๊ตฌ์‚ฌํ•ญ

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

์ถ”๋ก  ์ œ๊ณต์„ ์œ„ํ•ด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์š”๊ตฌ์‚ฌํ•ญ

Docker ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ HTTP ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ™œ์„ฑ ํ™•์ธ, ์ƒํƒœ ์ ๊ฒ€, ์ถ”๋ก  ์š”์ฒญ์„ ๋ฆฌ์Šจํ•˜๊ณ  ์—ฌ๊ธฐ์— ์‘๋‹ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ•˜์œ„ ์„น์…˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ํ•œ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ๋“  ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Flask์™€ ๊ฐ™์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ HTTP ์„œ๋ฒ„๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, TensorFlow Serving, TorchServe, KServe Python Server์™€ ๊ฐ™์€ HTTP ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋จธ์‹ ๋Ÿฌ๋‹(ML) ์ œ๊ณต ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTTP ์„œ๋ฒ„ ์‹คํ–‰

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  Dockerfile์—์„œ ENTRYPOINT ์•ˆ๋‚ด๋‚˜ CMD ์•ˆ๋‚ด ๋˜๋Š” ๋‘ ์•ˆ๋‚ด๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CMD์™€ ENTRYPOINT ์‚ฌ์ด์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋˜๋Š” Model ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ containerSpec.command ํ•„๋“œ์™€ containerSpec.args ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ENTRYPOINT์™€ CMD๋ฅผ ๊ฐ๊ฐ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”(๋˜๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”) ENTRYPOINT ๋˜๋Š” CMD๋กœ ์ธํ•ด ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹œ์ž‘ ์‹œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ ์ด ENTRYPOINT ๋ช…๋ น์–ด๊ฐ€ ๋ฌด๊ธฐํ•œ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•œ ํ›„ ์ข…๋ฃŒ๋˜๋Š” ๋ช…๋ น์–ด๋Š” ์‹คํ–‰ํ•˜์ง€ ๋งˆ์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰ ์‹œ์ž‘ ํ›„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

HTTP ์„œ๋ฒ„๋Š” 0.0.0.0์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ํฌํŠธ๋กœ ์š”์ฒญ์„ ๋ฆฌ์Šจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Model์„ ๋งŒ๋“ค ๋•Œ containerSpec.ports ํ•„๋“œ์—์„œ ์ด ํฌํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ๋ฌธ์„œ์˜ AIP_HTTP_PORT ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ™œ์„ฑ ํ™•์ธ

Vertex AI๋Š” ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ™œ์„ฑ ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ํ•™์Šต ๋ชจ๋ธ์„ Endpoint ๋ฆฌ์†Œ์Šค์— ๋ฐฐํฌํ•˜๋ฉด Vertex AI๋Š” TCP ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋œ ํฌํŠธ์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ TCP ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ธŒ๋Š” ์—ฐ๊ฒฐ ์„ค์ •์„ ์œ„ํ•ด ์ตœ๋Œ€ 4๋ฒˆ ์‹œ๋„ํ•˜๊ณ , ๊ฐ ์‹คํŒจ ํ›„ 10์ดˆ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ”„๋กœ๋ธŒ๋กœ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜์ง€ ์•Š์•˜์œผ๋ฉด Vertex AI์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

HTTP ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ํ™•์ธ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ํŠน๋ณ„ํ•œ ๋™์ž‘๋„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ๋œ ํฌํŠธ์—์„œ ์š”์ฒญ์„ ๋ฆฌ์Šจํ•˜๋Š” ํ•œ ํ™œ์„ฑ ํ”„๋กœ๋ธŒ๊ฐ€ ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ํ™•์ธ

์„ ํƒ์ ์œผ๋กœ startup_probe ๋˜๋Š” health_probe๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

ํ”„๋กœ๋ธŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Vertex AI๋Š” ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ง€์ •๋œ exec ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด 0์ด ๋ฐ˜ํ™˜๋˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ™œ์„ฑ ๋ฐ ์ •์ƒ ์ƒํƒœ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ƒํƒœ ์ ๊ฒ€

๊ธฐ๋ณธ์ ์œผ๋กœ Vertex AI๋Š” ์ถ”๋ก  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ์ค‘์ธ HTTP ์„œ๋ฒ„์˜ ์ƒํƒœ ์ ๊ฒ€์„ ๊ฐ„ํ—์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” ์ƒํƒœ ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์˜ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ ๊ฒ€ ๊ฒฝ๋กœ๋กœ HTTP GET ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. Model์„ ๋งŒ๋“ค ๋•Œ containerSpec.healthRoute ํ•„๋“œ์— ์ด ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ๋ฌธ์„œ์˜ AIP_HEALTH_ROUTE ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฐ ์ƒํƒœ ํ™•์ธ ์š”์ฒญ์— ์‘๋‹ตํ•˜๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด HTTP ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„๊ฐ€ ์ถ”๋ก  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ƒํƒœ ์ฝ”๋“œ 200 OK๋กœ ์ƒํƒœ ํ™•์ธ ์š”์ฒญ์— 10์ดˆ ์ด๋‚ด์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Vertex AI๋Š” ์ด๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์‘๋‹ต์€ ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„๊ฐ€ ์ถ”๋ก  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 10์ดˆ ์ด๋‚ด์— ์ƒํƒœ ์ ๊ฒ€ ์š”์ฒญ์— ์‘๋‹ตํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ 200 OK๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 503 Service Unavailable ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์‘๋‹ต(๋˜๋Š” ์‘๋‹ต ์—†์Œ)์€ ์„œ๋ฒ„๊ฐ€ ๋น„์ •์ƒ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ƒํƒœ ํ”„๋กœ๋ธŒ๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋น„์ •์ƒ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋ฉด(10์ดˆ ๋‚ด ์‘๋‹ต ์‹คํŒจ ํฌํ•จ) 10์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ตœ๋Œ€ 3ํšŒ ์ถ”๊ฐ€ ์ƒํƒœ ํ™•์ธ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ Vertex AI๋Š” ์•„์ง ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ด๋ผ๊ณ  ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ธŒ๊ฐ€ ์ด๋Ÿฌํ•œ ํ™•์ธ์— ๋Œ€ํ•ด ์ •์ƒ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋ฉด ํ”„๋กœ๋ธŒ๊ฐ€ ์ฆ‰์‹œ ์ƒํƒœ ํ™•์ธ์˜ ๊ฐ„ํ—์  ์ผ์ •์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ๋ธŒ๊ฐ€ 4ํšŒ ์—ฐ์† ๋น„์ •์ƒ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋ฉด Vertex AI์ด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ถ”๋ก  ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. (DeployedModel ๋ฆฌ์†Œ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ถ”๋ก  ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ™•์žฅ๋œ ๊ฒฝ์šฐ Vertex AI๋Š” ์ถ”๋ก  ์š”์ฒญ์„ ๋‹ค๋ฅธ ์ •์ƒ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.)

Vertex AI๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ƒํƒœ ํ”„๋กœ๋ธŒ๊ฐ€ ๋น„์ •์ƒ ์„œ๋ฒ„๋กœ ๊ฐ„ํ—์  ์ƒํƒœ ์ ๊ฒ€ ์š”์ฒญ์„ ๊ณ„์† ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋ฉด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์ƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์ด ์ปจํ…Œ์ด๋„ˆ๋กœ ๋‹ค์‹œ ์ถ”๋ก  ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์šฉ ๊ฐ€์ด๋“œ

์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ HTTP ์„œ๋ฒ„๊ฐ€ ์ƒํƒœ ํ™•์ธ์— ํ•ญ์ƒ 200 OK ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋ฒ„ ์‹œ์ž‘ ์ „ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹œ์ž‘ ๊ธฐ๊ฐ„ ์ค‘ ๊ทธ๋ฆฌ๊ณ  HTTP ์„œ๋ฒ„๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๊ฐ„ ์ค‘์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋น„์ •์ƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ–์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์—๋Š” ์ •์ƒ์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋‹ค ์ •๊ตํ•œ ๊ตฌ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ํŠน์ • ์‹œ๊ฐ„์— ๋น„์ •์ƒ ์ƒํƒœ๋กœ ์ƒํƒœ ํ™•์ธ์— ์‘๋‹ตํ•˜๋„๋ก HTTP ์„œ๋ฒ„๋ฅผ ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ถ”๋ก  ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๋ก  ์š”์ฒญ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ projects.locations.endpoints.predict ์š”์ฒญ์„ Vertex AI API๋กœ ์ „์†กํ•˜๋ฉด Vertex AI๋Š” ์ด ์š”์ฒญ์„ ์„œ๋ฒ„์˜ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ถ”๋ก  ๊ฒฝ๋กœ์— HTTP POST ์š”์ฒญ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Model์„ ๋งŒ๋“ค ๋•Œ containerSpec.predictRoute ํ•„๋“œ์— ์ด ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ๋ฌธ์„œ์˜ AIP_PREDICT_ROUTE ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์š”์ฒญ ์š”๊ตฌ์‚ฌํ•ญ

๋ชจ๋ธ์ด ๊ณต๊ฐœ ์—”๋“œํฌ์ธํŠธ์— ๋ฐฐํฌ๋œ ๊ฒฝ์šฐ ๊ฐ ์ถ”๋ก  ์š”์ฒญ์€ 1.5MB ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. HTTP ์„œ๋ฒ„๋Š” ๋‹ค์Œ ํ˜•์‹์˜ Content-Type: application/json HTTP ํ—ค๋”์™€ JSON ๋ณธ๋ฌธ์ด ์žˆ๋Š” ์ถ”๋ก  ์š”์ฒญ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "instances": INSTANCES,
  "parameters": PARAMETERS
}

์ด๋Ÿฌํ•œ ์š”์ฒญ์—์„œ,

  • INSTANCES๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ํ•˜๋‚˜ ์ด์ƒ JSON ๊ฐ’์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ฐ’์€ ์ถ”๋ก ์„ ์ œ๊ณตํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  • PARAMETERS๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ธ์Šคํ„ด์Šค์— ์ถ”๋ก ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ JSON ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. Vertex AI๋Š” parameters ํ•„๋“œ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ธ์‹ํ•˜๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์š”๊ตฌํ•œ ๋’ค ์ œ๊ณต๋œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ ์™ธ์—๋Š” ๋ฌด์‹œํ•˜๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ ๋ณธ๋ฌธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์‘๋‹ต ์š”๊ตฌ์‚ฌํ•ญ

๋ชจ๋ธ์ด ๊ณต๊ฐœ ์—”๋“œํฌ์ธํŠธ์— ๋ฐฐํฌ๋œ ๊ฒฝ์šฐ ๊ฐ ์ถ”๋ก  ์‘๋‹ต์€ 1.5MB ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. HTTP ์„œ๋ฒ„๋Š” ๋‹ค์Œ ํ˜•์‹์„ ์ถฉ์กฑํ•˜๋Š” JSON ๋ณธ๋ฌธ์ด ํฌํ•จ๋œ ์‘๋‹ต์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "predictions": INFERENCES
}

์ด ์‘๋‹ต์—์„œ INFERENCES๋ฅผ ํ•ด๋‹น ์š”์ฒญ์˜ ๊ฐ INSTANCES์— ๋Œ€ํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•œ ์ถ”๋ก ์„ ๋‚˜ํƒ€๋‚ด๋Š” JSON ๊ฐ’์˜ ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

HTTP ์„œ๋ฒ„๊ฐ€ ์ด ์‘๋‹ต์„ ๋ณด๋‚ด๋ฉด Vertex AI๋Š” ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ์‘๋‹ต์— deployedModelId ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” ์‘๋‹ต์„ ๋ณด๋‚ผ Endpoint์˜ DeployedModel์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๋ณธ๋ฌธ ํ˜•์‹์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๊ฒŒ์‹œ ์š”๊ตฌ์‚ฌํ•ญ

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ Vertex AI์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Artifact Registry์— ํ‘ธ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Artifact Registry์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

ํŠนํžˆ ๋‹ค์Œ ์œ„์น˜ ๋ฐ ๊ถŒํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์ €์žฅ์†Œ์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์น˜

Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ €์žฅ์†Œ๋Š” Model์„ ๋งŒ๋“ค๋ ค๋Š” ๋ฆฌ์ „ ์—”๋“œํฌ์ธํŠธ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฆฌ์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด us-central1-aiplatform.googleapis.com ์—”๋“œํฌ์ธํŠธ์—์„œ Model์„ ๋งŒ๋“ค๋ ค๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ์ „์ฒด ์ด๋ฆ„์€ us-central1-docker.pkg.dev/๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

๊ถŒํ•œ

Vertex AI๋Š” Model์„ ๋งŒ๋“ค ๋•Œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ”„๋กœ์ ํŠธ์˜ Vertex AI ์„œ๋น„์Šค ์—์ด์ „ํŠธ์—๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ Artifact Registry ๋ฆฌ๋” ์—ญํ• (roles/artifactregistry.reader) ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Vertex AI๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค๋ฅธ Google Cloud ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Vertex AI ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” service-PROJECT_NUMBER@gcp-sa-aiplatform.iam.gserviceaccount.com์ด๋ฉฐ ์—ฌ๊ธฐ์„œ PROJECT_NUMBER๋Š” Vertex AI ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

Vertex AI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์ผํ•œ Google Cloud ํ”„๋กœ์ ํŠธ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•œ ๊ฒฝ์šฐ ๊ถŒํ•œ์„ ๊ตฌ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Vertex AI ์„œ๋น„์Šค ์—์ด์ „ํŠธ์— ๋ถ€์—ฌ๋˜๋Š” ๊ธฐ๋ณธ ๊ถŒํ•œ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— Vertex AI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์™€ ๋‹ค๋ฅธGoogle Cloud ํ”„๋กœ์ ํŠธ์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•œ ๊ฒฝ์šฐ์—๋Š” Artifact Registry ์ €์žฅ์†Œ์— ๋Œ€ํ•œ Artifact Registry ๋ฆฌ๋” ์—ญํ• ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ์— ์•ก์„ธ์Šค

์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ์—†์ด ์ปค์Šคํ…€ ํ•™์Šต Model์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์žˆ๋Š” Cloud Storage ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ URI๋ฅผ artifactUri ํ•„๋“œ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋กœ Model์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ Cloud Storage์—์„œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ์ถ”๋ก  ์ œ๊ณต์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ Cloud Storage์—์„œ ํŒŒ์ผ์„ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ artifactUri ํ•„๋“œ๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ œ๊ณตํ•  ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰ ์‹œ์ž‘ ์‹œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Vertex AI๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด gs://๋กœ ์‹œ์ž‘ํ•˜๋Š” AIP_STORAGE_URI ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ Cloud Storage URI๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ENTRYPOINT ์š”์ฒญ ์‚ฌํ•ญ์€ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์ด URI๋กœ ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AIP_STORAGE_URI ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ Model ์ƒ์„ฑ ์‹œ artifactUri ํ•„๋“œ์— ์ง€์ •ํ•˜๋Š” Cloud Storage URI์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋Œ€์‹  AIP_STORAGE_URI๋Š” Vertex AI๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋‹ค๋ฅธ Cloud Storage ๋ฒ„ํ‚ท์— ์žˆ๋Š” ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์‚ฌ๋ณธ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. Model์„ ๋งŒ๋“ค๋ฉด Vertex AI๊ฐ€ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค. ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ฝ˜ํ…์ธ ๋Š” ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ƒˆ Model์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์—๋Š” ์ด URI์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Endpoint์— Model์„ ๋ฐฐํฌํ•  ๋•Œ ์ปค์Šคํ…€ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” Vertex AI๊ฐ€ ์ง€์ •๋œ ์„œ๋น„์Šค ๊ณ„์ •์— URI์˜ Cloud Storage ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด ๋ทฐ์–ด(roles/storage.objectViewer) ์—ญํ• ์„ ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด(ADC)๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜

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

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ์„ค์ •๋œ ๋ณ€์ˆ˜

๋นŒ๋“œํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด Docker์˜ ENV ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. AIP_ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์„ค์ •ํ•˜์ง€ ๋งˆ์„ธ์š”.

์ปจํ…Œ์ด๋„ˆ์˜ ENTRYPOINT ์š”์ฒญ ์‚ฌํ•ญ์€ ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Model์˜ ์–ด๋–ค API ํ•„๋“œ์—์„œ๋„ ์ด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Vertex AI์—์„œ ์„ค์ •๋œ ๋ณ€์ˆ˜

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

์ปจํ…Œ์ด๋„ˆ์˜ ENTRYPOINT ์š”์ฒญ ์‚ฌํ•ญ์€ ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” Vertex AI API ํ•„๋“œ๋ฅผ ์•Œ์•„๋ณด๋ ค๋ฉด ModelContainerSpec API ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ธฐ๋ณธ๊ฐ’ ๊ฐ’ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ• ์„ธ๋ถ€์ •๋ณด
AIP_ACCELERATOR_TYPE ์„ค์ •๋˜์ง€ ์•Š์Œ Endpoint ๋ฆฌ์†Œ์Šค์— DeployedModel๋กœ Model์„ ๋ฐฐํฌํ•  ๋•Œ dedicatedResources.machineSpec.acceleratorType ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ณ€์ˆ˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ (VM) ์ธ์Šคํ„ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€์†๊ธฐ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
AIP_DEPLOYED_MODEL_ID ์ด ์ปจํ…Œ์ด๋„ˆ์˜ Model์ด ๋ฐฐํฌ๋œ DeployedModel์„ ์‹๋ณ„ํ•˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ ์ด ๊ฐ’์€ DeployedModel์˜ id ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
AIP_ENDPOINT_ID ์ปจํ…Œ์ด๋„ˆ์˜ Model์ด ๋ฐฐํฌ๋œ Endpoint๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ ์ด ๊ฐ’์€ Endpoint์˜ name ํ•„๋“œ(endpoints/ ์ดํ›„)์˜ ๋งˆ์ง€๋ง‰ ์„ธ๊ทธ๋จผํŠธ์ž…๋‹ˆ๋‹ค.
AIP_FRAMEWORK CUSTOM_CONTAINER ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ
AIP_HEALTH_ROUTE /v1/endpoints/ENDPOINT/deployedModels/DEPLOYED_MODEL

์ด ๋ฌธ์ž์—ด์—์„œ ENDPOINT๋ฅผ AIP_ENDPOINT_ID ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ณ  DEPLOYED_MODEL์„ AIP_DEPLOYED_MODEL_ID ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
Model์„ ๋งŒ๋“ค ๋•Œ containerSpec.healthRoute ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” Vertex AI๊ฐ€ ์ƒํƒœ ํ™•์ธ์„ ์ „์†กํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ HTTP ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
AIP_HTTP_PORT 8080 Model์„ ๋งŒ๋“ค ๋•Œ containerSpec.ports ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ AIP_HTTP_PORT์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. Vertex AI๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ํ•ด๋‹น ํฌํŠธ์— ํ™œ์„ฑ ํ™•์ธ, ์ƒํƒœ ํ™•์ธ, ์ถ”๋ก  ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ HTTP ์„œ๋ฒ„๋Š” ์ด ํฌํŠธ์—์„œ ์š”์ฒญ์„ ๋ฆฌ์Šจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
AIP_MACHINE_TYPE ๊ธฐ๋ณธ๊ฐ’ ์—†์Œ, ๊ตฌ์„ฑํ•ด์•ผ ํ•จ Endpoint ๋ฆฌ์†Œ์Šค์— DeployedModel๋กœ Model์„ ๋ฐฐํฌํ•  ๋•Œ dedicatedResources.machineSpec.machineType ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” VM ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
AIP_MODE PREDICTION ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ ์ด ๋ณ€์ˆ˜๋Š” ์˜จ๋ผ์ธ ์ถ”๋ก  ์ œ๊ณต์„ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Vertex AI์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— ์ปค์Šคํ…€ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ Vertex AI์—์„œ ์‹คํ–‰๋  ๋•Œ ํŠน์ • ์ฝ”๋“œ ๊ฒฝ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
AIP_MODE_VERSION 1.0.0 ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ ์ด ๋ณ€์ˆ˜๋Š” Vertex AI์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถฉ์กฑํ•˜๋„๋ก ์š”๊ตฌ๋˜๋Š” ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ ์š”๊ตฌ์‚ฌํ•ญ(์ด ๋ฌธ์„œ)์˜ ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์‹œ๋งจํ‹ฑ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
AIP_MODEL_NAME AIP_ENDPOINT_ID ๋ณ€์ˆ˜๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ AIP_ENDPOINT_ID ํ–‰์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ด ๋ณ€์ˆ˜๋Š” ํ˜ธํ™˜์„ฑ์„ ์ด์œ ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
AIP_PREDICT_ROUTE /v1/endpoints/ENDPOINT/deployedModels/DEPLOYED_MODEL:predict

์ด ๋ฌธ์ž์—ด์—์„œ ENDPOINT๋ฅผ AIP_ENDPOINT_ID ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ณ  DEPLOYED_MODEL์„ AIP_DEPLOYED_MODEL_ID ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
Model์„ ๋งŒ๋“ค ๋•Œ containerSpec.predictRoute ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” Vertex AI๊ฐ€ ์ถ”๋ก  ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ HTTP ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
AIP_PROJECT_NUMBER Vertex AI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Google Cloud ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ
AIP_STORAGE_URI
  • Model์„ ๋งŒ๋“ค ๋•Œ artifactUri ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ: ๋นˆ ๋ฌธ์ž์—ด
  • Model์„ ๋งŒ๋“ค ๋•Œ artifactUri ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ: Vertex AI์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฒ„ํ‚ท์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋Š” Cloud Storage URI(gs://๋กœ ์‹œ์ž‘)
๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ ์ด ๋ณ€์ˆ˜๋Š” ๋ชจ๋ธ ์•„ํ‹ฐํŒฉํŠธ์˜ ๋ณต์‚ฌ๋ณธ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ(ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
AIP_VERSION_NAME AIP_DEPLOYED_MODEL_ID ๋ณ€์ˆ˜๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ AIP_DEPLOYED_MODEL_ID ํ–‰์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ด ๋ณ€์ˆ˜๋Š” ํ˜ธํ™˜์„ฑ์„ ์ด์œ ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

Model ๋ฆฌ์†Œ์Šค์—์„œ ์„ค์ •๋œ ๋ณ€์ˆ˜

Model์„ ๋งŒ๋“ค ๋•Œ containerSpec.env ํ•„๋“œ์—์„œ ์ถ”๊ฐ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ์˜ ENTRYPOINT ์š”์ฒญ ์‚ฌํ•ญ์€ ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” Vertex AI API ํ•„๋“œ๋ฅผ ์•Œ์•„๋ณด๋ ค๋ฉด ModelContainerSpec API ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

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