์ปค์Šคํ…€ ํ•™์Šต ๋ชจ๋ธ์—์„œ ์ผ๊ด„ ์˜ˆ์ธก ๊ฐ€์ ธ์˜ค๊ธฐ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” Google Cloud ์ฝ˜์†” ๋˜๋Š” Vertex AI API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ปค์Šคํ…€ ํ•™์Šต ๋ชจ๋ธ์—์„œ ์ผ๊ด„ ์˜ˆ์ธก์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ผ๊ด„ ์˜ˆ์ธก์„ ์š”์ฒญํ•˜๋ ค๋ฉด ์ž…๋ ฅ ์†Œ์Šค์™€ ์ถœ๋ ฅ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, Vertex AI๊ฐ€ ์ผ๊ด„ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” Cloud Storage ๋˜๋Š” BigQuery๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ ๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

์ผ๊ด„ ์˜ˆ์ธก์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ๋‹ค์Œ ์ œํ•œ์‚ฌํ•ญ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

  • ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์œ„์น˜๊ฐ€ ๋™์ผํ•œ ๋ฆฌ์ „ ๋˜๋Š” ๋ฉ€ํ‹ฐ ๋ฆฌ์ „์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ์ด us-central1์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ถœ๋ ฅ์€ us-central1 ๋˜๋Š” US์— ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ europe-west4์— ์žˆ์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด Cloud Storage ์œ„์น˜ ๋ฐ BigQuery ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ๋„ ๋ชจ๋ธ๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์ด๋‚˜ ๋ฉ€ํ‹ฐ ๋ฆฌ์ „์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Model Garden ๋ชจ๋ธ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • BigQuery ML ๋ชจ๋ธ์€ ์ปค์Šคํ…€ ํ•™์Šต ๋ชจ๋ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์กฐ๊ฑด์—์„œ BigQuery ML ๋ชจ๋ธ์˜ ์ผ๊ด„ ์˜ˆ์ธก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • BigQuery ML ๋ชจ๋ธ์€ Vertex AI Model Registry์— ๋“ฑ๋ก๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • BigQuery ํ…Œ์ด๋ธ”์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Vertex AI API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ InstanceConfig.instanceType์„ "object"๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๊ด„ ์˜ˆ์ธก ๋ชจ๋ธ์„ ๋กœ๋“œํ•˜๋ฉด ์•ฝ 40๋ถ„ ํ›„์— ํƒ€์ž„์•„์›ƒ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์ผ๊ด„ ์˜ˆ์ธก์— ๋” ์ž‘์€ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. Error: model server never became ready. Please validate that your model file or container configuration are valid.

์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์š”๊ตฌ์‚ฌํ•ญ

์ผ๊ด„ ์š”์ฒญ์˜ ์ž…๋ ฅ์€ ์˜ˆ์ธก์„ ์œ„ํ•ด ๋ชจ๋ธ์— ๋ณด๋‚ผ ํ•ญ๋ชฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž…๋ ฅ ํ˜•์‹์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

JSON Lines

JSON Lines ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธกํ•  ์ž…๋ ฅ ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Cloud Storage ๋ฒ„ํ‚ท์— ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ 1

๋‹ค์Œ ์˜ˆ๋Š” ๊ฐ ์ค„์— ๋ฐฐ์—ด์ด ํฌํ•จ๋œ JSON Lines ํŒŒ์ผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

[1, 2, 3, 4]
[5, 6, 7, 8]

๋‹ค์Œ์€ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ

{"instances": [ [1, 2, 3, 4], [5, 6, 7, 8] ]}

PyTorch ์ปจํ…Œ์ด๋„ˆ

{"instances": [
{ "data": [1, 2, 3, 4] },
{ "data": [5, 6, 7, 8] } ]}

์˜ˆ์‹œ 2

๋‹ค์Œ ์˜ˆ๋Š” ๊ฐ ์ค„์— ๊ฐ์ฒด๊ฐ€ ํฌํ•จ๋œ JSON Lines ํŒŒ์ผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

{ "values": [1, 2, 3, 4], "key": 1 }
{ "values": [5, 6, 7, 8], "key": 2 }

๋‹ค์Œ์€ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ์š”์ฒญ ๋ณธ๋ฌธ์ด ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

{"instances": [
  { "values": [1, 2, 3, 4], "key": 1 },
  { "values": [5, 6, 7, 8], "key": 2 }
]}

์˜ˆ์‹œ 3

PyTorch์˜ ์‚ฌ์ „ ๋นŒ๋“œ๋œ TorchServe์˜ ๊ธฐ๋ณธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์š”์ฒญํ•˜๋Š” ๋Œ€๋กœ ๊ฐ ์ธ์Šคํ„ด์Šค๋ฅผ data ํ•„๋“œ๋กœ ๋ž˜ํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Vertex AI๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{ "data": { "values": [1, 2, 3, 4], "key": 1 } }
{ "data": { "values": [5, 6, 7, 8], "key": 2 } }

๋‹ค์Œ์€ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

{"instances": [
  { "data": { "values": [1, 2, 3, 4], "key": 1 } },
  { "data": { "values": [5, 6, 7, 8], "key": 2 } }
]}

TFRecord

์ž…๋ ฅ ์ธ์Šคํ„ด์Šค๋ฅผ TFRecord ํ˜•์‹์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ Gzip์œผ๋กœ TFRecord ํŒŒ์ผ์„ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TFRecord ํŒŒ์ผ์„ Cloud Storage ๋ฒ„ํ‚ท์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Vertex AI๋Š” TFRecord ํŒŒ์ผ์˜ ๊ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ฝ์€ ํ›„ b64๋ผ๋Š” ๋‹จ์ผ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ JSON ๊ฐ์ฒด๋กœ base64๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ

{"instances": [
{ "b64": "b64EncodedASCIIString" },
{ "b64": "b64EncodedASCIIString" } ]}

PyTorch ์ปจํ…Œ์ด๋„ˆ

{"instances": [ { "data": {"b64": "b64EncodedASCIIString" } }, { "data": {"b64": "b64EncodedASCIIString" } }
]}

์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

CSV

CSV ํŒŒ์ผ์—์„œ ํ–‰๋งˆ๋‹ค ์ž…๋ ฅ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•œ ๊ฐœ ์ง€์ •ํ•˜์„ธ์š”. ์ฒซ ๋ฒˆ์งธ ํ–‰์€ ํ—ค๋” ํ–‰์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ํฐ๋”ฐ์˜ดํ‘œ(")๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Vertex AI๋Š” ์ค„๋ฐ”๊ฟˆ์ด ํฌํ•จ๋œ ์…€ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๊ฐ€ ์—†๋Š” ๊ฐ’์€ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž๋กœ ์ฝํž™๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š” CSV ํŒŒ์ผ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

"input1","input2","input3"
0.1,1.2,"cat1"
4.0,5.0,"cat2"

๋‹ค์Œ์€ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ

{"instances": [ [0.1,1.2,"cat1"], [4.0,5.0,"cat2"] ]}

PyTorch ์ปจํ…Œ์ด๋„ˆ

{"instances": [
{ "data": [0.1,1.2,"cat1"] },
{ "data": [4.0,5.0,"cat2"] } ]}

ํŒŒ์ผ ๋ชฉ๋ก

๊ฐ ํ–‰์ด ํŒŒ์ผ์˜ Cloud Storage URI์ธ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Vertex AI๋Š” ๊ฐ ํŒŒ์ผ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ฝ์€ ํ›„ b64๋ผ๋Š” ๋‹จ์ผ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ JSON ๊ฐ์ฒด๋กœ base64๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด„ ์˜ˆ์ธก์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋จผ์ € Google Cloud ์ฝ˜์†”์— ์ง์ ‘ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชฉ๋ก์„ Cloud Storage ๋ฒ„ํ‚ท์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

gs://path/to/image/image1.jpg
gs://path/to/image/image2.jpg

๋‹ค์Œ์€ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ

{ "instances": [
{ "b64": "b64EncodedASCIIString" },
{ "b64": "b64EncodedASCIIString" } ]}

PyTorch ์ปจํ…Œ์ด๋„ˆ

{ "instances": [ { "data": { "b64": "b64EncodedASCIIString" } }, { "data": { "b64": "b64EncodedASCIIString" } }
]}

์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

BigQuery

BigQuery ํ…Œ์ด๋ธ”์„ projectId.datasetId.tableId๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Vertex AI๋Š” ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์„ JSON ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ด๋ธ”์— ๋‹ค์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์—ด 1 ์—ด 2 ์—ด 3
1.0 3.0 "Cat1"
2.0 4.0 "Cat2"

๋‹ค์Œ์€ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋˜๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ

{"instances": [ [1.0,3.0,"cat1"], [2.0,4.0,"cat2"] ]}

PyTorch ์ปจํ…Œ์ด๋„ˆ

{"instances": [
{ "data": [1.0,3.0,"cat1"] },
{ "data": [2.0,4.0,"cat2"] } ]}

BigQuery ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด JSON์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

BigQuery ์œ ํ˜• JSON ์œ ํ˜• ์˜ˆ์‹œ ๊ฐ’
๋ฌธ์ž์—ด ๋ฌธ์ž์—ด "abc"
์ •์ˆ˜ ์ •์ˆ˜ 1
๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜ 1.2
์ˆซ์ž ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜ 4925.000000000
๋ถˆ๋ฆฌ์–ธ ๋ถˆ๋ฆฌ์–ธ ์ฐธ
TimeStamp ๋ฌธ์ž์—ด "2019-01-01 23:59:59.999999+00:00"
๋‚ ์งœ ๋ฌธ์ž์—ด "2018-12-31"
์‹œ๊ฐ„ ๋ฌธ์ž์—ด "23:59:59.999999"
DateTime ๋ฌธ์ž์—ด "2019-01-01T00:00:00"
๋…นํ™” ๊ฐ์ฒด { "A": 1,"B": 2}
๋ฐ˜๋ณต ์œ ํ˜• Array[Type] [1, 2]
์ค‘์ฒฉ ๋ ˆ์ฝ”๋“œ ๊ฐ์ฒด {"A": {"a": 0}, "B": 1}

๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…˜ ๋‚˜๋ˆ„๊ธฐ

์ผ๊ด„ ์˜ˆ์ธก์€ ๋งต๋ฆฌ๋“€์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ์„ ๊ฐ ๋ณต์ œ๋ณธ์œผ๋กœ ์ƒค๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋งต๋ฆฌ๋“€์Šค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ž…๋ ฅ์„ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Vertex AI๋Š” BigQuery, ํŒŒ์ผ ๋ชฉ๋ก, JSON lines ์ž…๋ ฅ์„ ์ž๋™์œผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

CSV ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒํ‹ฐ์…˜ ๋‚˜๋ˆ„๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Vertex AI๋Š” ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ๋‚˜๋ˆ„์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CSV ํŒŒ์ผ์˜ ํ–‰์€ ์ž๊ธฐ ์„œ์ˆ ์ ์ด์ง€ ์•Š์œผ๋ฉฐ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š๊ณ  ์ค„๋ฐ”๊ฟˆ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋ฏผ๊ฐํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” CSV ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

TFRecord ์ž…๋ ฅ์˜ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋” ์ž‘์€ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์™€์ผ๋“œ ์นด๋“œ(์˜ˆ: gs://my-bucket/*.tfrecord)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์— ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ํŒŒํ‹ฐ์…˜์„ ์ˆ˜๋™์œผ๋กœ ๋‚˜๋ˆ ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ˆ˜๋Š” ์ง€์ •๋œ ๋ณต์ œ๋ณธ ์ˆ˜ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ๋ฐ ๋ณ€ํ™˜

BatchPredictionJob ์š”์ฒญ์—์„œ instanceConfig๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ผ๊ด„ ์ž…๋ ฅ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๋ฉด JSON array ๋˜๋Š” object ํ˜•์‹์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ instanceType์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ ํ…Œ์ด๋ธ”์— ๋‹ค์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

customerId col1 col2
1001 1 2
1002 5 6

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ instanceConfig์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

{
  "name": "batchJob1",
  ...
  "instanceConfig": {
    "excludedFields":["customerId"]
    "instanceType":"object"
  }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ˆ์ธก ์š”์ฒญ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ JSON ๊ฐ์ฒด๋กœ ์ „์†ก๋˜๊ณ  customerId ์—ด์ด ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

{"col1":1,"col2":2}
{"col1":5,"col2":6}

๋‹ค์Œ instanceConfig๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

{
  "name": "batchJob1",
  ...
  "instanceConfig": {
    "includedFields": ["col1","col2"]
    "instanceType":"object"
  }
}

ํŠน์„ฑ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ๋ชจ๋Š” ํŠน์„ฑ ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•œ ์ปค์Šคํ…€ ๋ชจ๋ธ ์ผ๊ด„ ์˜ˆ์ธก ๋…ธํŠธ๋ถ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ผ๊ด„ ์˜ˆ์ธก ์š”์ฒญ

์ผ๊ด„ ์˜ˆ์ธก ์š”์ฒญ์˜ ๊ฒฝ์šฐ Google Cloud ์ฝ˜์†” ๋˜๋Š” Vertex AI API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์ถœํ•œ ์ž…๋ ฅ ํ•ญ๋ชฉ ์ˆ˜์— ๋”ฐ๋ผ ์ผ๊ด„ ์˜ˆ์ธก ํƒœ์Šคํฌ๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๋‹ค์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๊ด„ ์˜ˆ์ธก์„ ์š”์ฒญํ•˜๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ปค์Šคํ…€ ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ์˜ˆ์ธก ์ธ์Šคํ„ด์Šค๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ์“ฐ๋Š” ๋“ฑ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ž‘์—…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ BigQuery ๋ฐ Cloud Storage์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” Vertex AI ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

Google Cloud ์ฝ˜์†”

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด„ ์˜ˆ์ธก์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

์ผ๊ด„ ์˜ˆ์ธก ํŽ˜์ด์ง€๋กœ ์ด๋™

  1. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒˆ ์ผ๊ด„ ์˜ˆ์ธก ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค.

  2. ์ผ๊ด„ ์˜ˆ์ธก ์ •์˜์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

    1. ์ผ๊ด„ ์˜ˆ์ธก์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    2. ๋ชจ๋ธ ์ด๋ฆ„์—์„œ ์ด ์ผ๊ด„ ์˜ˆ์ธก์— ์‚ฌ์šฉํ•  ๋ชจ๋ธ์˜ ์ด๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    3. ์†Œ์Šค ์„ ํƒ์— ๋Œ€ํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ์ ์šฉ๋˜๋Š” ์†Œ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

      • ์ž…๋ ฅ ํ˜•์‹์„ JSON Lines, CSV ๋˜๋Š” TFRecord๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ Cloud Storage์˜ ํŒŒ์ผ(JSON Lines, CSV, TFRecord, TFRecord Gzip)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์†Œ์Šค ๊ฒฝ๋กœ ํ•„๋“œ์— ์ž…๋ ฅ ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ํŒŒ์ผ ๋ชฉ๋ก์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Cloud Storage์˜ ํŒŒ์ผ(๊ธฐํƒ€)์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ ํ•„๋“œ์— ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
      • BigQuery ์ž…๋ ฅ์— BigQuery ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. BigQuery๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์„ ํƒํ•˜๋ฉด BigQuery๋ฅผ ์ถœ๋ ฅ ๋ฐ Google ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค๋กœ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค(CMEK)๋Š” BigQuery์—์„œ ์ž…๋ ฅ/์ถœ๋ ฅ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    4. ๋Œ€์ƒ ๊ฒฝ๋กœ ํ•„๋“œ์— Vertex AI์—์„œ ์ผ๊ด„ ์˜ˆ์ธก ์ถœ๋ ฅ์„ ์ €์žฅํ•  Cloud Storage ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

    5. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๊ด„ ์˜ˆ์ธก ์‘๋‹ต์˜ ์ผ๋ถ€๋กœ ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ด ๋ชจ๋ธ์— ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ์‚ฌ์šฉ ์„ค์ •์„ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ˆ˜์ •์„ ํด๋ฆญํ•˜์—ฌ ์„ค๋ช… ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช… ์„ค์ •์„ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ์„ค๋ช… ์„ค์ • ์ˆ˜์ •์€ ์„ ํƒ์‚ฌํ•ญ์ด๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    6. ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์˜ ์ปดํ“จํŒ… ์˜ต์…˜์ธ ์ปดํ“จํŒ… ๋…ธ๋“œ ์ˆ˜, ๋จธ์‹  ์œ ํ˜•, ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์†๊ธฐ ์œ ํ˜• ๋ฐ ๊ฐ€์†๊ธฐ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ์„ ํƒ์‚ฌํ•ญ: ์ผ๊ด„ ์˜ˆ์ธก์„ ์œ„ํ•œ ๋ชจ๋ธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ถ„์„์€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์— ํŽธํ–ฅ ๊ฐ์ง€ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ ์š”๊ฑด์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    1. ์ด ์ผ๊ด„ ์˜ˆ์ธก์— ๋ชจ๋ธ ๋ชจ๋‹ˆํ„ฐ๋ง ์‚ฌ์šฉ ์„ค์ •์„ ํด๋ฆญํ•˜์—ฌ ์ผœ๊ฑฐ๋‚˜ ๋•๋‹ˆ๋‹ค.

    2. ํ•™์Šต ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ํ•™์Šต ๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ ๋˜๋Š” ์œ„์น˜๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    3. ์„ ํƒ์‚ฌํ•ญ: ์•Œ๋ฆผ ๊ธฐ์ค€ ์•„๋ž˜์—์„œ ์•Œ๋ฆผ์„ ํŠธ๋ฆฌ๊ฑฐํ•  ์ž„๊ณ—๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. ์•Œ๋ฆผ ์ด๋ฉ”์ผ์˜ ๊ฒฝ์šฐ ๋ชจ๋ธ์ด ์•Œ๋ฆผ ๊ธฐ์ค€์„ ์ดˆ๊ณผํ•˜๋ฉด ์•Œ๋ฆผ์„ ๋ฐ›์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    5. ์„ ํƒ์‚ฌํ•ญ: ์•Œ๋ฆผ ์ฑ„๋„์˜ ๊ฒฝ์šฐ ๋ชจ๋ธ์ด ์•Œ๋ฆผ ๊ธฐ์ค€์„ ์ดˆ๊ณผํ•  ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›์„ Cloud Monitoring ์ฑ„๋„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Cloud Monitoring ์ฑ„๋„์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์•Œ๋ฆผ ์ฑ„๋„ ๊ด€๋ฆฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒˆ ํ•ญ๋ชฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Google Cloud ์ฝ˜์†”์€ PagerDuty, Slack, Pub/Sub ์•Œ๋ฆผ ์ฑ„๋„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

API

Vertex AI API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด„ ์˜ˆ์ธก ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด„ ์˜ˆ์ธก์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋„๊ตฌ์— ๋”ฐ๋ผ ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

REST

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

  • LOCATION_ID: ๋ชจ๋ธ์ด ์ €์žฅ๋˜๊ณ  ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด us-central1์ž…๋‹ˆ๋‹ค.

  • PROJECT_ID: ํ”„๋กœ์ ํŠธ ID

  • BATCH_JOB_NAME: ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์˜ ํ‘œ์‹œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

  • MODEL_ID: ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ชจ๋ธ์˜ ID์ž…๋‹ˆ๋‹ค.

  • INPUT_FORMAT: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹(jsonl, csv, tf-record, tf-record-gzip ๋˜๋Š” file-list)์ž…๋‹ˆ๋‹ค.

  • INPUT_URI: ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ Cloud Storage URI์ž…๋‹ˆ๋‹ค. ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • OUTPUT_DIRECTORY: Vertex AI์—์„œ ์ถœ๋ ฅ์„ ์ €์žฅํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ Cloud Storage URI์ž…๋‹ˆ๋‹ค.

  • MACHINE_TYPE: ์ด ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์— ์‚ฌ์šฉํ•  ๋จธ์‹  ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

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

  • BATCH_SIZE: ๊ฐ ์˜ˆ์ธก ์š”์ฒญ์—์„œ ์ „์†กํ•  ์ธ์Šคํ„ด์Šค ์ˆ˜๋กœ, ๊ธฐ๋ณธ๊ฐ’์€ 64์ž…๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • STARTING_REPLICA_COUNT: ์ด ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์˜ ๋…ธ๋“œ ์ˆ˜์ž…๋‹ˆ๋‹ค.

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

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

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

{
  "displayName": "BATCH_JOB_NAME",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "INPUT_FORMAT",
    "gcsSource": {
      "uris": ["INPUT_URI"],
    },
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY",
    },
  },
  "dedicatedResources" : {
    "machineSpec" : {
      "machineType": MACHINE_TYPE
    },
    "startingReplicaCount": STARTING_REPLICA_COUNT
  },
  "manualBatchTuningParameters": {
    "batch_size": BATCH_SIZE,
  }
}

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

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_NUMBER/locations/LOCATION_ID/batchPredictionJobs/BATCH_JOB_ID",
  "displayName": "BATCH_JOB_NAME 202005291958",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "gcsSource": {
      "uris": [
        "INPUT_URI"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
}

Java

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

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

๋‹ค์Œ ์ƒ˜ํ”Œ์—์„œ PREDICTIONS_FORMAT์„ jsonl๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ์„น์…˜์˜ REST & CMD LINE ํƒญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

import com.google.cloud.aiplatform.util.ValueConverter;
import com.google.cloud.aiplatform.v1.AcceleratorType;
import com.google.cloud.aiplatform.v1.BatchDedicatedResources;
import com.google.cloud.aiplatform.v1.BatchPredictionJob;
import com.google.cloud.aiplatform.v1.GcsDestination;
import com.google.cloud.aiplatform.v1.GcsSource;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.ModelName;
import com.google.protobuf.Value;
import java.io.IOException;

public class CreateBatchPredictionJobSample {

  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 modelName = "MODEL_NAME";
    String instancesFormat = "INSTANCES_FORMAT";
    String gcsSourceUri = "GCS_SOURCE_URI";
    String predictionsFormat = "PREDICTIONS_FORMAT";
    String gcsDestinationOutputUriPrefix = "GCS_DESTINATION_OUTPUT_URI_PREFIX";
    createBatchPredictionJobSample(
        project,
        displayName,
        modelName,
        instancesFormat,
        gcsSourceUri,
        predictionsFormat,
        gcsDestinationOutputUriPrefix);
  }

  static void createBatchPredictionJobSample(
      String project,
      String displayName,
      String model,
      String instancesFormat,
      String gcsSourceUri,
      String predictionsFormat,
      String gcsDestinationOutputUriPrefix)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.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 (JobServiceClient client = JobServiceClient.create(settings)) {

      // Passing in an empty Value object for model parameters
      Value modelParameters = ValueConverter.EMPTY_VALUE;

      GcsSource gcsSource = GcsSource.newBuilder().addUris(gcsSourceUri).build();
      BatchPredictionJob.InputConfig inputConfig =
          BatchPredictionJob.InputConfig.newBuilder()
              .setInstancesFormat(instancesFormat)
              .setGcsSource(gcsSource)
              .build();
      GcsDestination gcsDestination =
          GcsDestination.newBuilder().setOutputUriPrefix(gcsDestinationOutputUriPrefix).build();
      BatchPredictionJob.OutputConfig outputConfig =
          BatchPredictionJob.OutputConfig.newBuilder()
              .setPredictionsFormat(predictionsFormat)
              .setGcsDestination(gcsDestination)
              .build();
      MachineSpec machineSpec =
          MachineSpec.newBuilder()
              .setMachineType("n1-standard-2")
              .setAcceleratorType(AcceleratorType.NVIDIA_TESLA_T4)
              .setAcceleratorCount(1)
              .build();
      BatchDedicatedResources dedicatedResources =
          BatchDedicatedResources.newBuilder()
              .setMachineSpec(machineSpec)
              .setStartingReplicaCount(1)
              .setMaxReplicaCount(1)
              .build();
      String modelName = ModelName.of(project, location, model).toString();
      BatchPredictionJob batchPredictionJob =
          BatchPredictionJob.newBuilder()
              .setDisplayName(displayName)
              .setModel(modelName)
              .setModelParameters(modelParameters)
              .setInputConfig(inputConfig)
              .setOutputConfig(outputConfig)
              .setDedicatedResources(dedicatedResources)
              .build();
      LocationName parent = LocationName.of(project, location);
      BatchPredictionJob response = client.createBatchPredictionJob(parent, batchPredictionJob);
      System.out.format("response: %s\n", response);
      System.out.format("\tName: %s\n", response.getName());
    }
  }
}

Python์šฉ Vertex AI SDK

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

def create_batch_prediction_job_dedicated_resources_sample(
    project: str,
    location: str,
    model_resource_name: str,
    job_display_name: str,
    gcs_source: Union[str, Sequence[str]],
    gcs_destination: str,
    instances_format: str = "jsonl",
    machine_type: str = "n1-standard-2",
    accelerator_count: int = 1,
    accelerator_type: Union[str, aiplatform_v1.AcceleratorType] = "NVIDIA_TESLA_K80",
    starting_replica_count: int = 1,
    max_replica_count: int = 1,
    sync: bool = True,
):
    aiplatform.init(project=project, location=location)

    my_model = aiplatform.Model(model_resource_name)

    batch_prediction_job = my_model.batch_predict(
        job_display_name=job_display_name,
        gcs_source=gcs_source,
        gcs_destination_prefix=gcs_destination,
        instances_format=instances_format,
        machine_type=machine_type,
        accelerator_count=accelerator_count,
        accelerator_type=accelerator_type,
        starting_replica_count=starting_replica_count,
        max_replica_count=max_replica_count,
        sync=sync,
    )

    batch_prediction_job.wait()

    print(batch_prediction_job.display_name)
    print(batch_prediction_job.resource_name)
    print(batch_prediction_job.state)
    return batch_prediction_job

BigQuery

์œ„์˜ REST ์˜ˆ์—์„œ๋Š” ์†Œ์Šค์™€ ๋Œ€์ƒ์— Cloud Storage๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  BigQuery๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์„ธ์š”.

  • inputConfig ํ•„๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    "inputConfig": {
       "instancesFormat": "bigquery",
       "bigquerySource": {
          "inputUri": "bq://SOURCE_PROJECT_ID.SOURCE_DATASET_NAME.SOURCE_TABLE_NAME"
       }
    }
    
  • outputConfig ํ•„๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    "outputConfig": {
       "predictionsFormat":"bigquery",
       "bigqueryDestination":{
          "outputUri": "bq://DESTINATION_PROJECT_ID.DESTINATION_DATASET_NAME.DESTINATION_TABLE_NAME"
       }
     }
    
  • ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SOURCE_PROJECT_ID: ์†Œ์Šค Google Cloud ํ”„๋กœ์ ํŠธ์˜ ID
    • SOURCE_DATASET_NAME: ์†Œ์Šค BigQuery ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„
    • SOURCE_TABLE_NAME: BigQuery ์†Œ์Šค ํ…Œ์ด๋ธ” ์ด๋ฆ„
    • DESTINATION_PROJECT_ID: ๋Œ€์ƒ Google Cloud ํ”„๋กœ์ ํŠธ์˜ ID
    • DESTINATION_DATASET_NAME: BigQuery ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„
    • DESTINATION_TABLE_NAME: BigQuery ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ด๋ฆ„

ํŠน์„ฑ ์ค‘์š”๋„

์˜ˆ์ธก์— ํŠน์„ฑ ์ค‘์š”๋„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด generateExplanation ์†์„ฑ์„ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ธก ๋ชจ๋ธ์€ ํŠน์„ฑ ์ค‘์š”๋„๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ผ๊ด„ ์˜ˆ์ธก ์š”์ฒญ์— ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ํŠน์„ฑ ์ค‘์š”๋„๋Š” Vertex Explainable AI์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์„ค๋ช…์„ ์œ„ํ•ด Model์„ ๊ตฌ์„ฑํ–ˆ๊ฑฐ๋‚˜ BatchPredictionJob์˜ explanationSpec ํ•„๋“œ๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ generateExplanation์„ true๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จธ์‹  ์œ ํ˜• ๋ฐ ๋ณต์ œ๋ณธ ์ˆ˜ ์„ ํƒ

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

์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์—…์— ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ๋จธ์‹  ์œ ํ˜•์„ ์ง€์ •ํ•˜๊ณ  ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋น„์šฉ ํšจ์œจ์„ ์œ„ํ•ด ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์ด 10๋ถ„ ์ด์ƒ ์‹คํ–‰๋˜๋„๋ก ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ณต์ œ๋ณธ์ด ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ์†Œ์š”๋˜๋Š” ์•ฝ 5๋ถ„์„ ํฌํ•จํ•˜์—ฌ ๋ณต์ œ๋ณธ ๋…ธ๋“œ ์‹œ๊ฐ„๋‹น ์š”๊ธˆ์ด ๋ถ€๊ณผ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ช‡ ์ดˆ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ์‹์€ ๋น„์šฉ ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜์ฒœ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค์˜ ๊ฒฝ์šฐ ์ˆ˜์‹ญ ๊ฐœ ๋‹จ์œ„์˜ starting_replica_count๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๊ฐ€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ๋ผ๋ฉด ์ˆ˜๋ฐฑ ๊ฐœ ๋‹จ์œ„์˜ starting_replica_count๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

N / (T * (60 / Tb))

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • N: ์ž‘์—…์˜ ๋ฐฐ์น˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 100๋งŒ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค/100๊ฐœ์˜ ๋ฐฐ์น˜ ํฌ๊ธฐ = 10,000๊ฐœ์˜ ๋ฐฐ์น˜์ž…๋‹ˆ๋‹ค.
  • T: ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์˜ ์˜ˆ์ƒ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด 10๋ถ„์ž…๋‹ˆ๋‹ค.
  • Tb: ๋ณต์ œ๋ณธ์ด ๋‹จ์ผ ๋ฐฐ์น˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ)์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2์ฝ”์–ด ๋จธ์‹  ์œ ํ˜•์—์„œ๋Š” ๋ฐฐ์น˜๋‹น 1์ดˆ์ž…๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋ฐฐ์น˜ 10,000๊ฐœ/(10๋ถ„ * (60/1์ดˆ))๊ฐ€ ๋ณต์ œ๋ณธ 17๊ฐœ๋กœ ์˜ฌ๋ฆผ๋ฉ๋‹ˆ๋‹ค.

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

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

GPU ๋˜๋Š” TPU ๊ฐ€์† ๋จธ์‹ 

์ถ”๊ฐ€ ๊ณ ๋ ค ์‚ฌํ•ญ๊ณผ ๋”๋ถˆ์–ด ์ด์ „ ๊ฐ€์ด๋“œ๋ผ์ธ(CPU ์ „์šฉ ๋ชจ๋ธ์—๋„ ์ ์šฉ๋จ)์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

  • CPU์™€ GPU๊ฐ€ ๋” ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ).
  • GPU ๋จธ์‹  ์œ ํ˜•์€ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ(10๋ถ„) ์ผ๊ด„ ์˜ˆ์ธก ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋” ๊ธด ์‹œ๊ฐ„(์˜ˆ: 10๋ถ„ ๋Œ€์‹  20๋ถ„ ์ด์ƒ)์„ ๋ชฉํ‘œ๋กœ ํ•˜์—ฌ ์˜ˆ์ธก ์ˆ˜ํ–‰์— ์ ์ ˆํ•œ ๋น„์œจ์˜ ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์ด ์†Œ์š”๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ผ๊ด„ ์˜ˆ์ธก ๊ฒฐ๊ณผ ๊ฒ€์ƒ‰

์ผ๊ด„ ์˜ˆ์ธก ํƒœ์Šคํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์˜ˆ์ธก ์ถœ๋ ฅ์€ ์š”์ฒญ์—์„œ ์ง€์ •ํ•œ Cloud Storage ๋ฒ„ํ‚ท ๋˜๋Š” BigQuery ์œ„์น˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ผ๊ด„ ์˜ˆ์ธก ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์ถœ๋ ฅ ํด๋”์—๋Š” JSON Line ํŒŒ์ผ ์ง‘ํ•ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ด๋ฆ„์€ {gcs_path}/prediction.results-{file_number}-of-{number_of_files_generated}์ž…๋‹ˆ๋‹ค. ์ผ๊ด„ ์˜ˆ์ธก์˜ ๋ถ„์‚ฐ๋œ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ํŒŒ์ผ ์ˆ˜๋Š” ๋น„๊ฒฐ์ •์ ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ์˜ ๊ฐ ์ค„์€ ์ž…๋ ฅ์˜ ์ธ์Šคํ„ด์Šค์— ํ•ด๋‹นํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‚ค-๊ฐ’ ์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • prediction: ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • instance: ํŒŒ์ผ ๋ชฉ๋ก์˜ ๊ฒฝ์šฐ Cloud Storage URI๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์ž…๋ ฅ ํ˜•์‹์˜ ๊ฒฝ์šฐ HTTP ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†ก๋œ ๊ฐ’์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ 1

HTTP ์š”์ฒญ์— ๋‹ค์Œ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

{
  "instances": [
    [1, 2, 3, 4],
    [5, 6, 7, 8]
]}

์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

{
  "predictions": [
    [0.1,0.9],
    [0.7,0.3]
  ],
}

JSON Lines ์ถœ๋ ฅ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{ "instance": [1, 2, 3, 4], "prediction": [0.1,0.9]}
{ "instance": [5, 6, 7, 8], "prediction": [0.7,0.3]}

์˜ˆ์‹œ 2

HTTP ์š”์ฒญ์— ๋‹ค์Œ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

{
  "instances": [
    {"values": [1, 2, 3, 4], "key": 1},
    {"values": [5, 6, 7, 8], "key": 2}
]}

์˜ˆ์ธก ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

{
  "predictions": [
    {"result":1},
    {"result":0}
  ],
}

JSON Lines ์ถœ๋ ฅ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{ "instance": {"values": [1, 2, 3, 4], "key": 1}, "prediction": {"result":1}}
{ "instance": {"values": [5, 6, 7, 8], "key": 2}, "prediction": {"result":0}}

Explainable AI ์‚ฌ์šฉ

๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ์—๋Š” ํŠน์„ฑ ๊ธฐ๋ฐ˜ ์„ค๋ช…์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•œ ํŠน์„ฑ ๊ฐ’ ์„ธํŠธ์— ๋”ฐ๋ผ ์ˆ˜์ฒœ ๊ฐœ์˜ ์š”์ฒญ์œผ๋กœ ํŒฌ์•„์›ƒ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์€ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ๋„ ํŠน์„ฑ ์ค‘์š”๋„๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๊ด„ ์˜ˆ์ธก์—์„œ๋Š” ์˜ˆ์‹œ ๊ธฐ๋ฐ˜ ์„ค๋ช…์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Notebooks

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