ํŠน์„ฑ ๊ธฐ๋ฐ˜ ์„ค๋ช… ๊ตฌ์„ฑ

์ปค์Šคํ…€ ํ•™์Šต ๋ชจ๋ธ์—์„œ Vertex Explainable AI๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ค๋ช…์„ ์š”์ฒญํ•˜๋ ค๋Š” Model ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, ๋ชจ๋ธ์„ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜, ๋ฐฐ์น˜ ์„ค๋ช… ์ž‘์—…์„ ์ œ์ถœํ•  ๋•Œ ํŠน์ • ์˜ต์…˜์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

์„ค๋ช… ๊ตฌ์„ฑ ์‹œ์  ๋ฐ ์œ„์น˜

๋ชจ๋ธ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์„ค๋ช…์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์„ค๋ช…์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์•˜๋”๋ผ๋„ ์ด๋ฏธ ๋งŒ๋“  ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์„ค๋ช… ๊ตฌ์„ฑ

Model์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ๋•Œ Model์˜ explanationSpec ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์„ค๋ช…์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ Vertex AI์—์„œ ์ปค์Šคํ…€ ํ•™์Šต Model์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ Vertex Explainable AI๋ฅผ ์ง€์›ํ•˜๋„๋ก Model์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์˜ ์˜ˆ์‹œ์—์„œ๋Š” Model์„ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. TrainingPipeline์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ํ•™์Šต Model์„ ๋งŒ๋“ค ๋•Œ Vertex Explainable AI๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์ด ๋ฌธ์„œ์˜ TrainingPipeline์˜ modelToUpload ํ•„๋“œ์— ์„ค๋ช…๋œ ๊ตฌ์„ฑ ์„ค์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ๋ฐฐํฌ ๋˜๋Š” ์ผ๊ด„ ์˜ˆ์ธก ์ˆ˜ํ–‰ ์‹œ ์„ค๋ช… ๊ตฌ์„ฑ

Model์„ Endpoint ๋ฆฌ์†Œ์Šค์— ๋ฐฐํฌํ•˜๋ฉด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋ธ์ด ์ด์ „์— ์„ค๋ช…์„ ์œ„ํ•ด ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์„ค๋ช…์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์„ค๋ช…์„ ๊ฐ€์ ธ์˜ฌ ์˜๋„๊ฐ€ ์—†์—ˆ์ง€๋งŒ(๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ explanationSpec ํ•„๋“œ ์ƒ๋žต) ๋‚˜์ค‘์— ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์›ํ•˜๊ฑฐ๋‚˜ ์„ค๋ช… ์„ค์ • ์ผ๋ถ€๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช… ์ค‘์ง€ ๋ชจ๋ธ์ด ์„ค๋ช…์„ ์œ„ํ•ด ๊ตฌ์„ฑ๋˜์—ˆ์ง€๋งŒ ์—”๋“œํฌ์ธํŠธ์—์„œ ์„ค๋ช…์„ ๊ฐ€์ ธ์˜ฌ ๊ณ„ํš์ด ์—†๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—”๋“œํฌ์ธํŠธ์— ๋ชจ๋ธ์„ ๋ฐฐํฌํ•  ๋•Œ ์„ค๋ช…์„ ์ค‘์ง€ํ•˜๋ ค๋ฉด Cloud ์ฝ˜์†”์˜ ์„ค๋ช… ๊ธฐ๋Šฅ ์˜ต์…˜์„ ์„ ํƒ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ DeployedModel.disableExplanations๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, Model์—์„œ ์ผ๊ด„ ์˜ˆ์ธก์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ BatchPredictionJob.explanationSpec ํ•„๋“œ๋ฅผ ์ฑ„์›Œ ์„ค๋ช…์„ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ BatchPredictionJob.generateExplanation์„ false๋กœ ์„ค์ •ํ•˜์—ฌ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜จ๋ผ์ธ ์„ค๋ช…์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ตฌ์„ฑ ์žฌ์ •์˜

์„ค๋ช… ์„ค์ •์ด ์žˆ๋Š” Model์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜จ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด, ๊ทธ๋ฆฌ๊ณ  ๋ฐฐํฌ ์ค‘์— ์„ค๋ช… ์„ค์ •์„ ๊ตฌ์„ฑํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์˜จ๋ผ์ธ ์„ค๋ช…์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ Model์˜ ์ตœ์ดˆ ์„ค๋ช… ์„ค์ •์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Vertex AI์— explain ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์ด์ „์— Model ๋˜๋Š” DeployedModel์— ์„ค์ •ํ•œ ์ผ๋ถ€ ์„ค๋ช… ๊ตฌ์„ฑ์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

explain ์š”์ฒญ ์‹œ ๋‹ค์Œ ํ•„๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์ปค์Šคํ…€ ํ•™์Šต ๋ชจ๋ธ์˜ ์ž…๋ ฅ ๊ธฐ์ค€
  • ์ด๋ฏธ์ง€ ๋ชจ๋ธ์˜ ์‹œ๊ฐํ™” ๊ตฌ์„ฑ
  • method๋ฅผ ์ œ์™ธํ•œ ExplanationParameters

์„ค๋ช… ์š”์ฒญ์˜ explanationSpecOverride ํ•„๋“œ์—์„œ ์ด๋Ÿฌํ•œ ์„ค์ •์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

explanationSpec ํ•„๋“œ๋กœ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ

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

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

Vertex Explainable AI์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์—ฌ ๋ถ„์„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ๋ฐฉ๋ฒ• ๋น„๊ต๋ฅผ ์ฝ๊ณ  Model์— ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ๋ง๋œ Shapley

Model์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋„๊ตฌ์— ๋”ฐ๋ผ ๋‹ค์Œ ํƒญ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์„ค๋ช… ๊ฐ€๋Šฅ์„ฑ ๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ƒ˜ํ”Œ๋ง๋œ ๋ชจ์–‘(ํ‘œ ํ˜•์‹ ๋ชจ๋ธ)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ฒฝ๋กœ ์ˆ˜๋ฅผ ์ƒ˜ํ”Œ๋ง๋œ Shapley ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•  ํŠน์„ฑ ์ˆœ์—ด ์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” [1, 50] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 25๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ชจ๋ธ์˜ ๊ฐ ์ž…๋ ฅ ํŠน์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์ž…๋ ฅ ํŠน์„ฑ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vertex Explainable AI์—์„œ ๋ชจ๋“  ๊ฐ’์ด 0์ธ ๊ธฐ๋ณธ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•˜๋ฉฐ ์ด ๊ธฐ์ค€์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์€์ƒ‰ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

    3. TensorFlow ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž…๋ ฅ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

      1. ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

      2. ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ์ƒ‰์ธ ํ…์„œ ์ด๋ฆ„ ๋˜๋Š” ๋ฐ€๋„ ํ˜•ํƒœ ํ…์„œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

      3. ์—ฌ๊ธฐ์—์„œ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ NUMERIC, ์ด๋ฏธ์ง€ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ IMAGE๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

      4. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ฝ”๋”ฉ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ IDENTITY์ž…๋‹ˆ๋‹ค.

      5. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฃน ์ด๋ฆ„ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. TensorFlow ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ถœ๋ ฅ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    3. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ‰์ธ ํ‘œ์‹œ ์ด๋ฆ„ ๋งคํ•‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    4. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ํ‘œ์‹œ ์ด๋ฆ„ ๋งคํ•‘ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ • ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. TensorFlow 2์˜ ๊ฒฝ์šฐ ExplanationMetadata๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

    ๋‹ค์Œ ExplanationMetadata๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ JSON ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์˜ˆ์‹œ์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ explanation-metadata.json์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    explanation-metadata.json

    {
      "inputs": {
        "FEATURE_NAME": {
          "inputTensorName": "INPUT_TENSOR_NAME",
        }
      },
      "outputs": {
        "OUTPUT_NAME": {
          "outputTensorName": "OUTPUT_TENSOR_NAME"
        }
      }
    }
    

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

    • FEATURE_NAME: ์ž…๋ ฅ ํŠน์„ฑ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • INPUT_TENSOR_NAME: TensorFlow์˜ ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
    • OUTPUT_NAME: ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • OUTPUT_TENSOR_NAME: TensorFlow์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Vertex Explainable AI๋ฅผ ์ง€์›ํ•˜๋Š” Model ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Vertex Explainable AI์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฐ•์กฐํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    gcloud ai models upload \
      --region=LOCATION \
      --display-name=MODEL_NAME \
      --container-image-uri=IMAGE_URI \
      --artifact-uri=PATH_TO_MODEL_ARTIFACT_DIRECTORY \
      --explanation-method=sampled-shapley \
      --explanation-path-count=PATH_COUNT \
      --explanation-metadata-file=explanation-metadata.json
    

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

    ๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

REST

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

๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

TensorFlow 2 ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ metadata ํ•„๋“œ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด Vertex AI๊ฐ€ ๋ชจ๋ธ์—์„œ inputs ๋ฐ outputs๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

{
  "model": {
    "displayName": "MODEL_NAME",
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    },
    "artifactUri": "PATH_TO_MODEL_ARTIFACT_DIRECTORY",
    "explanationSpec": {
      "parameters": {
        "sampledShapleyAttribution": {
          "pathCount": PATH_COUNT
        }
      },
      "metadata": {
        "inputs": {
          "FEATURE_NAME": {
            "inputTensorName": "INPUT_TENSOR_NAME",
          }
        },
        "outputs": {
          "OUTPUT_NAME": {
            "outputTensorName": "OUTPUT_TENSOR_NAME"
          }
        }
      }
    }
  }
}

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

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-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload"

PowerShell

์š”์ฒญ ๋ณธ๋ฌธ์„ request.json ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload" | Select-Object -Expand Content

์ ๋ถ„ ๊ฒฝ์‚ฌ

Model์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋„๊ตฌ์— ๋”ฐ๋ผ ๋‹ค์Œ ํƒญ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์„ค๋ช… ๊ฐ€๋Šฅ์„ฑ ๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ํ†ตํ•ฉ ๊ทธ๋ž˜๋””์–ธํŠธ(ํ‘œ ํ˜•์‹ ๋ชจ๋ธ์šฉ) ๋˜๋Š” ํ†ตํ•ฉ ๊ทธ๋ž˜๋””์–ธํŠธ(์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์šฉ) ์ค‘์—์„œ ๋ชจ๋ธ์— ์ ์ ˆํ•œ ๊ฒƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. ์‹œ๊ฐํ™” ์œ ํ˜• ๋ฐ ์ƒ‰์ƒ ์ฒ™๋„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ์•„๋ž˜ ํด๋ฆฝ, ์œ„ ํด๋ฆฝ, ์˜ค๋ฒ„๋ ˆ์ด ์œ ํ˜•, ์ ๋ถ„ ๋‹จ๊ณ„ ์ˆ˜๋Š” ๊ธฐ๋ณธ ์„ค์ • ๊ทธ๋Œ€๋กœ ๋‘์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.

    ์‹œ๊ฐํ™” ์„ค์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

  3. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ์‹œ ๊ฒฝ๋กœ ์ ๋ถ„์˜ ๊ทผ์‚ฌ์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋‹จ๊ณ„ ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” [1, 100] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 50๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ชจ๋ธ์˜ ๊ฐ ์ž…๋ ฅ ํŠน์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์ž…๋ ฅ ํŠน์„ฑ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vertex Explainable AI์—์„œ ๋ชจ๋“  ๊ฐ’์ด 0์ธ ๊ธฐ๋ณธ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•˜๋ฉฐ ์ด ๊ธฐ์ค€์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์€์ƒ‰ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

    3. TensorFlow ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž…๋ ฅ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

      1. ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

      2. ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ์ƒ‰์ธ ํ…์„œ ์ด๋ฆ„ ๋˜๋Š” ๋ฐ€๋„ ํ˜•ํƒœ ํ…์„œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

      3. ์—ฌ๊ธฐ์—์„œ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ NUMERIC, ์ด๋ฏธ์ง€ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ IMAGE๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

      4. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ฝ”๋”ฉ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ IDENTITY์ž…๋‹ˆ๋‹ค.

      5. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฃน ์ด๋ฆ„ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. TensorFlow ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ถœ๋ ฅ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    3. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ‰์ธ ํ‘œ์‹œ ์ด๋ฆ„ ๋งคํ•‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    4. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ํ‘œ์‹œ ์ด๋ฆ„ ๋งคํ•‘ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ • ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. TensorFlow 2์˜ ๊ฒฝ์šฐ ExplanationMetadata๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

    ๋‹ค์Œ ExplanationMetadata๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ JSON ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์˜ˆ์‹œ์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ explanation-metadata.json์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    explanation-metadata.json

    {
      "inputs": {
        "FEATURE_NAME": {
          "inputTensorName": "INPUT_TENSOR_NAME",
          "modality": "MODALITY",
          "visualization": VISUALIZATION_SETTINGS
        }
      },
      "outputs": {
        "OUTPUT_NAME": {
          "outputTensorName": "OUTPUT_TENSOR_NAME"
        }
      }
    }
    

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

    • FEATURE_NAME: ์ž…๋ ฅ ํŠน์„ฑ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • INPUT_TENSOR_NAME: TensorFlow์˜ ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
    • MODALITY: Model์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ image, Model์—์„œ ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ numeric์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ numeric์ž…๋‹ˆ๋‹ค.
    • VIZUALIZATION_OPTIONS: ์„ค๋ช…์„ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™” ์„ค์ • ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

      modality ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ modality ํ•„๋“œ๋ฅผ numeric์œผ๋กœ ์„ค์ •ํ•˜๊ณ  visualization ํ•„๋“œ๋ฅผ ์™„์ „ํžˆ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

    • OUTPUT_NAME: ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • OUTPUT_TENSOR_NAME: TensorFlow์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Vertex Explainable AI๋ฅผ ์ง€์›ํ•˜๋Š” Model ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Vertex Explainable AI์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฐ•์กฐํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    gcloud ai models upload \
      --region=LOCATION \
      --display-name=MODEL_NAME \
      --container-image-uri=IMAGE_URI \
      --artifact-uri=PATH_TO_MODEL_ARTIFACT_DIRECTORY \
      --explanation-method=integrated-gradients \
      --explanation-step-count=STEP_COUNT \
      --explanation-metadata-file=explanation-metadata.json
    

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

    ๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ํ•„์š”์— ๋”ฐ๋ผ ๊ฒฝ์‚ฌ์˜ SmoothGrad ๊ทผ์‚ฌ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REST

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

  • IMAGE_URI: ์˜ˆ์ธก ์ œ๊ณต์„ ์œ„ํ•œ TensorFlow ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ URI์ž…๋‹ˆ๋‹ค.
  • STEP_COUNT: ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ์‹œ ๊ฒฝ๋กœ ์ ๋ถ„์˜ ๊ทผ์‚ฌ์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋‹จ๊ณ„ ์ˆ˜์ž…๋‹ˆ๋‹ค. [1, 100] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 50๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • FEATURE_NAME: ์ž…๋ ฅ ํŠน์„ฑ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • INPUT_TENSOR_NAME: TensorFlow์˜ ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • MODALITY: Model์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ image, Model์—์„œ ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ numeric์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ numeric์ž…๋‹ˆ๋‹ค.
  • VIZUALIZATION_OPTIONS: ์„ค๋ช…์„ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™” ์„ค์ • ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    modality ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ modality ํ•„๋“œ๋ฅผ numeric์œผ๋กœ ์„ค์ •ํ•˜๊ณ  visualization ํ•„๋“œ๋ฅผ ์™„์ „ํžˆ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

  • OUTPUT_NAME: ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • OUTPUT_TENSOR_NAME: TensorFlow์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ ExplanationParameters์— ๊ฒฝ์‚ฌ์˜ SmoothGrad ๊ทผ์‚ฌ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow 2 ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ metadata ํ•„๋“œ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด Vertex AI๊ฐ€ ๋ชจ๋ธ์—์„œ inputs ๋ฐ outputs๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

{
  "model": {
    "displayName": "MODEL_NAME",
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    },
    "artifactUri": "PATH_TO_MODEL_ARTIFACT_DIRECTORY",
    "explanationSpec": {
      "parameters": {
        "integratedGradientsAttribution": {
          "stepCount": STEP_COUNT
        }
      },
      "metadata": {
        "inputs": {
          "FEATURE_NAME": {
            "inputTensorName": "INPUT_TENSOR_NAME",
            "modality": "MODALITY",
            "visualization": VISUALIZATION_SETTINGS
          }
        },
        "outputs": {
          "OUTPUT_NAME": {
            "outputTensorName": "OUTPUT_TENSOR_NAME"
          }
        }
      }
    }
  }
}

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

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-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload"

PowerShell

์š”์ฒญ ๋ณธ๋ฌธ์„ request.json ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload" | Select-Object -Expand Content

XRAI

Model์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋„๊ตฌ์— ๋”ฐ๋ผ ๋‹ค์Œ ํƒญ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์„ค๋ช… ๊ฐ€๋Šฅ์„ฑ ๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ XRAI(์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์šฉ)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ์‹œ๊ฐํ™” ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ์ƒ‰์ƒ ์ฒ™๋„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ์•„๋ž˜ ํด๋ฆฝ, ์œ„ ํด๋ฆฝ, ์˜ค๋ฒ„๋ ˆ์ด ์œ ํ˜•, ์ ๋ถ„ ๋‹จ๊ณ„ ์ˆ˜๋Š” ๊ธฐ๋ณธ ์„ค์ • ๊ทธ๋Œ€๋กœ ๋‘์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.

      ์‹œ๊ฐํ™” ์„ค์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

  3. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ์‹œ ๊ฒฝ๋กœ ์ ๋ถ„์˜ ๊ทผ์‚ฌ์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋‹จ๊ณ„ ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” [1, 100] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 50๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ชจ๋ธ์˜ ๊ฐ ์ž…๋ ฅ ํŠน์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์ž…๋ ฅ ํŠน์„ฑ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vertex Explainable AI์—์„œ ๋ชจ๋“  ๊ฐ’์ด 0์ธ ๊ธฐ๋ณธ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•˜๋ฉฐ ์ด ๊ธฐ์ค€์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์€์ƒ‰ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

    3. TensorFlow ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ž…๋ ฅ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

      1. ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

      2. ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ์ƒ‰์ธ ํ…์„œ ์ด๋ฆ„ ๋˜๋Š” ๋ฐ€๋„ ํ˜•ํƒœ ํ…์„œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

      3. ์—ฌ๊ธฐ์—์„œ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ NUMERIC, ์ด๋ฏธ์ง€ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ IMAGE๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

      4. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ฝ”๋”ฉ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ IDENTITY์ž…๋‹ˆ๋‹ค.

      5. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฃน ์ด๋ฆ„ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. TensorFlow ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ถœ๋ ฅ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    3. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ‰์ธ ํ‘œ์‹œ ์ด๋ฆ„ ๋งคํ•‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    4. ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ํ‘œ์‹œ ์ด๋ฆ„ ๋งคํ•‘ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ • ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. TensorFlow 2์˜ ๊ฒฝ์šฐ ExplanationMetadata๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

    ๋‹ค์Œ ExplanationMetadata๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ JSON ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์˜ˆ์‹œ์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ explanation-metadata.json์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    explanation-metadata.json

    {
      "inputs": {
        "FEATURE_NAME": {
          "inputTensorName": "INPUT_TENSOR_NAME",
          "modality": "image",
          "visualization": VISUALIZATION_SETTINGS
        }
      },
      "outputs": {
        "OUTPUT_NAME": {
          "outputTensorName": "OUTPUT_TENSOR_NAME"
        }
      }
    }
    

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

    • FEATURE_NAME: ์ž…๋ ฅ ํŠน์„ฑ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • INPUT_TENSOR_NAME: TensorFlow์˜ ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
    • VIZUALIZATION_OPTIONS: ์„ค๋ช…์„ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™” ์„ค์ • ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
    • OUTPUT_NAME: ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • OUTPUT_TENSOR_NAME: TensorFlow์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Vertex Explainable AI๋ฅผ ์ง€์›ํ•˜๋Š” Model ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Vertex Explainable AI์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฐ•์กฐํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    gcloud ai models upload \
      --region=LOCATION \
      --display-name=MODEL_NAME \
      --container-image-uri=IMAGE_URI \
      --artifact-uri=PATH_TO_MODEL_ARTIFACT_DIRECTORY \
      --explanation-method=xrai \
      --explanation-step-count=STEP_COUNT \
      --explanation-metadata-file=explanation-metadata.json
    

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

    ๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ํ•„์š”์— ๋”ฐ๋ผ ๊ฒฝ์‚ฌ์˜ SmoothGrad ๊ทผ์‚ฌ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REST

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

  • IMAGE_URI: ์˜ˆ์ธก ์ œ๊ณต์„ ์œ„ํ•œ TensorFlow ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ URI์ž…๋‹ˆ๋‹ค.
  • STEP_COUNT: ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ์‹œ ๊ฒฝ๋กœ ์ ๋ถ„์˜ ๊ทผ์‚ฌ์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋‹จ๊ณ„ ์ˆ˜์ž…๋‹ˆ๋‹ค. [1, 100] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 50๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • FEATURE_NAME: ์ž…๋ ฅ ํŠน์„ฑ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • INPUT_TENSOR_NAME: TensorFlow์˜ ์ž…๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • VIZUALIZATION_OPTIONS: ์„ค๋ช…์„ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐํ™” ์„ค์ • ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • OUTPUT_NAME: ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • OUTPUT_TENSOR_NAME: TensorFlow์˜ ์ถœ๋ ฅ ํ…์„œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด Vertex Explainable AI์—์„œ TensorFlow ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒฝ์šฐ ExplanationParameters์— ๊ฒฝ์‚ฌ์˜ SmoothGrad ๊ทผ์‚ฌ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow 2 ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ metadata ํ•„๋“œ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๋ฉด Vertex AI๊ฐ€ ๋ชจ๋ธ์—์„œ inputs ๋ฐ outputs๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

{
  "model": {
    "displayName": "MODEL_NAME",
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    },
    "artifactUri": "PATH_TO_MODEL_ARTIFACT_DIRECTORY",
    "explanationSpec": {
      "parameters": {
        "xraiAttribution": {
          "stepCount": STEP_COUNT
        }
      },
      "metadata": {
        "inputs": {
          "FEATURE_NAME": {
            "inputTensorName": "INPUT_TENSOR_NAME",
            "modality": "image",
            "visualization": VISUALIZATION_SETTINGS
          }
        },
        "outputs": {
          "OUTPUT_NAME": {
            "outputTensorName": "OUTPUT_TENSOR_NAME"
          }
        }
      }
    }
  }
}

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

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-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload"

PowerShell

์š”์ฒญ ๋ณธ๋ฌธ์„ request.json ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload" | Select-Object -Expand Content

scikit-learn ๋ฐ XGBoost์˜ ์‚ฌ์ „ ๋นŒ๋“œ๋œ ์ปจํ…Œ์ด๋„ˆ

Model์ด ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์ „ ๋นŒ๋“œ๋œ scikit-learn ๋˜๋Š” XGBoost์˜ ์ปจํ…Œ์ด๋„ˆ ์˜ˆ์ธก์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์„ค๋ช…์— ์ƒ˜ํ”Œ๋ง๋œ Shapley ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Model์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋„๊ตฌ์— ๋”ฐ๋ผ ๋‹ค์Œ ํƒญ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์„ค๋ช… ๊ฐ€๋Šฅ์„ฑ ๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ƒ˜ํ”Œ๋ง๋œ ๋ชจ์–‘(ํ‘œ ํ˜•์‹ ๋ชจ๋ธ)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ฒฝ๋กœ ์ˆ˜๋ฅผ ์ƒ˜ํ”Œ๋ง๋œ Shapley ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•  ํŠน์„ฑ ์ˆœ์—ด ์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” [1, 50] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 25๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ชจ๋ธ์˜ ๊ฐ ์ž…๋ ฅ ํŠน์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์ž…๋ ฅ ํŠน์„ฑ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

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

    2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vertex Explainable AI์—์„œ ๋ชจ๋“  ๊ฐ’์ด 0์ธ ๊ธฐ๋ณธ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•˜๋ฉฐ ์ด ๊ธฐ์ค€์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์€์ƒ‰ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

  4. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ • ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. ๋‹ค์Œ ExplanationMetadata๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ JSON ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์˜ˆ์‹œ์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ explanation-metadata.json์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    explanation-metadata.json

    {
      "inputs": {
        "FEATURE_NAME": {
        }
      },
      "outputs": {
        "OUTPUT_NAME": {
        }
      }
    }
    

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

    • FEATURE_NAME: ์ž…๋ ฅ ํŠน์„ฑ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • OUTPUT_NAME: ๋ชจ๋ธ ์ถœ๋ ฅ์˜ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์ž…๋ ฅ ๊ธฐ์ค€์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ์˜ ์ž…๋ ฅ(์ผ๋ฐ˜์ ์œผ๋กœ 2-D ํ–‰๋ ฌ ๋ชฉ๋ก)๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž…๋ ฅ ๊ธฐ์ค€์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์ž…๋ ฅ ํ˜•ํƒœ์˜ 0 ๊ฐ’ 2-D ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Vertex Explainable AI๋ฅผ ์ง€์›ํ•˜๋Š” Model ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Vertex Explainable AI์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฐ•์กฐํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    gcloud ai models upload \
      --region=LOCATION \
      --display-name=MODEL_NAME \
      --container-image-uri=IMAGE_URI \
      --artifact-uri=PATH_TO_MODEL_ARTIFACT_DIRECTORY \
      --explanation-method=sampled-shapley \
      --explanation-path-count=PATH_COUNT \
      --explanation-metadata-file=explanation-metadata.json
    

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

    ๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

REST

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

๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž…๋ ฅ ๊ธฐ์ค€์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ์˜ ์ž…๋ ฅ(์ผ๋ฐ˜์ ์œผ๋กœ 2-D ํ–‰๋ ฌ ๋ชฉ๋ก)๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž…๋ ฅ ๊ธฐ์ค€์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์ž…๋ ฅ ํ˜•ํƒœ์˜ 0 ๊ฐ’ 2-D ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.

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

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

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

{
  "model": {
    "displayName": "MODEL_NAME",
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    },
  "artifactUri": "PATH_TO_MODEL_ARTIFACT_DIRECTORY",
  "explanationSpec": {
    "parameters": {
      "sampledShapleyAttribution": {
        "pathCount": PATH_COUNT
      }
    },
    "metadata": {
       "inputs": {
         "FEATURE_NAME": {
         }
       },
       "outputs": {
         "OUTPUT_NAME": {
         }
       }
    }
  }
}

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

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-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload"

PowerShell

์š”์ฒญ ๋ณธ๋ฌธ์„ request.json ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload" | Select-Object -Expand Content

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

Model์ด ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜๊ณ  ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ, ์„ค๋ช…์— ์ƒ˜ํ”Œ๋ง๋œ Shapley ๊ธฐ์—ฌ ๋ถ„์„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๋ฐ ์ถœ๋ ฅ ์ด๋ฆ„ ํ™•์ธ

๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” Model์ด ์ž…๋ ฅ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ํŠน์„ฑ ์ด๋ฆ„์„ Vertex AI์— ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Model์˜ ์˜ˆ์ธก์—์„œ ์ถœ๋ ฅ์— ์‚ฌ์šฉ๋˜๋Š” ํ‚ค๋„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์„ฑ ์ด๋ฆ„ ๊ฒฐ์ •

Model์ด ๊ฐ ์ž…๋ ฅ ์ธ์Šคํ„ด์Šค์— ํŠน์ •ํ•œ ์ตœ์ƒ์œ„ ํ‚ค๊ฐ€ ์žˆ์„ ๊ฒƒ์„ ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ํ‚ค๋Š” ํŠน์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Model์ด ๊ฐ ์ž…๋ ฅ ์ธ์Šคํ„ด์Šค์˜ ํ˜•์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

{
  "length": <value>,
  "width": <value>
}

์ด ๊ฒฝ์šฐ ํŠน์„ฑ ์ด๋ฆ„์€ length ๋ฐ width์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์˜ ๊ฐ’์— ์ค‘์ฒฉ๋œ ๋ชฉ๋ก์ด๋‚˜ ๊ฐ์ฒด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ length ๋ฐ width๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„์— ํ•„์š”ํ•œ ์œ ์ผํ•œ ํ‚ค์ž…๋‹ˆ๋‹ค. ์„ค๋ช…์„ ์š”์ฒญํ•˜๋ฉด Vertex Explainable AI๋Š” ํŠน์„ฑ์˜ ๊ฐ ์ค‘์ฒฉ๋œ ์š”์†Œ์— ๋Œ€ํ•œ ๊ธฐ์—ฌ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Model์— ํ‚ค๊ฐ€ ์—†๋Š” ์ž…๋ ฅ์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ Vertex Explainable AI๋Š” Model์— ๋‹จ์ผ ํŠน์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ํŠน์„ฑ ์ด๋ฆ„์œผ๋กœ ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Model์ด ๊ฐ ์ž…๋ ฅ ์ธ์Šคํ„ด์Šค์˜ ํ˜•์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

[
  <value>,
  <value>
]

์ด ๊ฒฝ์šฐ Vertex Explainable AI์— dimensions์™€ ๊ฐ™์ด ์›ํ•˜๋Š” ๋‹จ์ผ ํŠน์„ฑ ์ด๋ฆ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ ์ด๋ฆ„ ๊ฒฐ์ •

Model์ด ํ‚ค๊ฐ€ ์ง€์ •๋œ ์ถœ๋ ฅ์ด ์žˆ๋Š” ๊ฐ ์˜จ๋ผ์ธ ์˜ˆ์ธก ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ํ‚ค๋Š” ์ถœ๋ ฅ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Model์ด ๊ฐ ์˜ˆ์ธก์„ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

{
  "scores": <value>
}

์ด ๊ฒฝ์šฐ ์ถœ๋ ฅ ์ด๋ฆ„์€ scores์ž…๋‹ˆ๋‹ค. scores ํ•„๋“œ ๊ฐ’์ด ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์„ค๋ช…์„ ๊ฐ€์ ธ์˜ค๋ฉด Vertex Explainable AI๊ฐ€ ๊ฐ ์˜ˆ์ธก์—์„œ ๊ฐ€์žฅ ๋†’์€ ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ์˜ ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ํ•„๋“œ์˜ ์ถ”๊ฐ€ ์š”์†Œ์— ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„์„ ์ œ๊ณตํ•˜๋„๋ก Vertex Explainable AI๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ExplanationParameters์˜ topK ๋˜๋Š”outputIndices ํ•„๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์„œ์˜ ์˜ˆ์‹œ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Model์ด ํ‚ค๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์˜ˆ์ธก์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ถœ๋ ฅ ์ด๋ฆ„์— ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Š” Model์ด ๊ฐ ์˜ˆ์ธก์— ๋Œ€ํ•ด ๋ฐฐ์—ด ๋˜๋Š” ์Šค์นผ๋ผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Model ๋งŒ๋“ค๊ธฐ

Model์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋„๊ตฌ์— ๋”ฐ๋ผ ๋‹ค์Œ ํƒญ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์„ค๋ช… ๊ฐ€๋Šฅ์„ฑ ๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํŠน์„ฑ ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ƒ˜ํ”Œ๋ง๋œ ๋ชจ์–‘(ํ‘œ ํ˜•์‹ ๋ชจ๋ธ)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ฒฝ๋กœ ์ˆ˜๋ฅผ ์ƒ˜ํ”Œ๋ง๋œ Shapley ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•  ํŠน์„ฑ ์ˆœ์—ด ์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” [1, 50] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 25๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ชจ๋ธ์˜ ๊ฐ ์ž…๋ ฅ ํŠน์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. ์ž…๋ ฅ ํŠน์„ฑ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

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

    2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vertex Explainable AI์—์„œ ๋ชจ๋“  ๊ฐ’์ด 0์ธ ๊ธฐ๋ณธ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•˜๋ฉฐ ์ด ๊ธฐ์ค€์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์€์ƒ‰ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

  4. ํŠน์„ฑ์˜ ์ถœ๋ ฅ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์„ค๋ช… ๊ธฐ๋Šฅ ์„ค์ • ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ–ˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. ๋‹ค์Œ ExplanationMetadata๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ JSON ํŒŒ์ผ์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์˜ˆ์‹œ์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ explanation-metadata.json์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    explanation-metadata.json

    {
      "inputs": {
        "FEATURE_NAME": {}
      },
      "outputs": {
        "OUTPUT_NAME": {}
      }
    }
    

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

    • FEATURE_NAME: ์ด ๋ฌธ์„œ์˜ 'ํŠน์„ฑ ์ด๋ฆ„ ๊ฒฐ์ •' ์„น์…˜์— ์„ค๋ช…๋œ ํŠน์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • OUTPUT_NAME: ์ด ๋ฌธ์„œ์˜ '์ถœ๋ ฅ ์ด๋ฆ„ ๊ฒฐ์ •' ์„น์…˜์— ์„ค๋ช…๋œ ์ถœ๋ ฅ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ์ž…๋ ฅ ๊ธฐ์ค€์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ์˜ ์ž…๋ ฅ(์ผ๋ฐ˜์ ์œผ๋กœ 2-D ํ–‰๋ ฌ ๋ชฉ๋ก)๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž…๋ ฅ ๊ธฐ์ค€์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์ž…๋ ฅ ํ˜•ํƒœ์˜ 0 ๊ฐ’ 2-D ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Vertex Explainable AI๋ฅผ ์ง€์›ํ•˜๋Š” Model ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Vertex Explainable AI์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฐ•์กฐํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    gcloud ai models upload \
      --region=LOCATION \
      --display-name=MODEL_NAME \
      --container-image-uri=IMAGE_URI \
      --artifact-uri=PATH_TO_MODEL_ARTIFACT_DIRECTORY \
      --explanation-method=sampled-shapley \
      --explanation-path-count=PATH_COUNT \
      --explanation-metadata-file=explanation-metadata.json
    

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

    • PATH_COUNT: ์ƒ˜ํ”Œ๋ง๋œ Shapley ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•  ํŠน์„ฑ ์น˜ํ™˜ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. [1, 50] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 25๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

REST

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

  • PATH_COUNT: ์ƒ˜ํ”Œ๋ง๋œ Shapley ๊ธฐ์—ฌ ๋ถ„์„ ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•  ํŠน์„ฑ ์น˜ํ™˜ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. [1, 50] ๋ฒ”์œ„์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ทผ์‚ฌ์น˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ 25๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • FEATURE_NAME: ์ด ๋ฌธ์„œ์˜ 'ํŠน์„ฑ ์ด๋ฆ„ ๊ฒฐ์ •' ์„น์…˜์— ์„ค๋ช…๋œ ํŠน์„ฑ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • OUTPUT_NAME: ์ด ๋ฌธ์„œ์˜ '์ถœ๋ ฅ ์ด๋ฆ„ ๊ฒฐ์ •' ์„น์…˜์— ์„ค๋ช…๋œ ์ถœ๋ ฅ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ž๋ฆฌํ‘œ์‹œ์ž์— ์ ํ•ฉํ•œ ๊ฐ’์„ ์•Œ์•„๋ณด๋ ค๋ฉด upload ๋ฐ ๋ชจ๋ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ž…๋ ฅ ๊ธฐ์ค€์„ ExplanationMetadata์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI๊ฐ€ Model์˜ ์ž…๋ ฅ ๊ธฐ์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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

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

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

{
  "model": {
    "displayName": "MODEL_NAME",
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    },
  "artifactUri": "PATH_TO_MODEL_ARTIFACT_DIRECTORY",
  "explanationSpec": {
    "parameters": {
      "sampledShapleyAttribution": {
        "pathCount": PATH_COUNT
      }
    },
    "metadata": {
       "inputs": {
         "FEATURE_NAME": {}
       },
       "outputs": {
         "OUTPUT_NAME": {}
       }
    }
  }
}

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

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-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload"

PowerShell

์š”์ฒญ ๋ณธ๋ฌธ์„ request.json ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/models:upload" | Select-Object -Expand Content

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