Published on

๐Ÿ› PROJECT | HELLO SKATING 1์ฐจ ๊ฐœ๋ฐœ ํ›„๊ธฐ

HELLO SKATING ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์ผ์ง€ - 1์ฐจ ์˜คํ”ˆ

ํ”ผ๊ฒจ์Šค์ผ€์ดํŒ…, ํ•œ ์ธต ๋” ์ฆ๊ฒ๊ฒŒ ์ฆ๊ธฐ๊ธฐ

Background

์ง€๋‚œ 2์›”, 2022 ๋ฒ ์ด์ง• ์˜ฌ๋ฆผํ”ฝ์—์„œ ํŠน์ • ๊ตญ๊ฐ€ ์ œ์™ธ ์ƒ๋‹นํžˆ ๋ฐ•ํ•œ ์ ์ˆ˜๋กœ ์„์—ฐ์น˜ ์•Š์€ ํŒ์ •์œผ๋กœ Motion estimation ๋ชจ๋ธ๋กœ prediction์„ ํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค. ์ƒ๋‹นํžˆ ๋งŽ์€ ๊ตญ๋‚ด ํŒฌ๋ถ„๋“ค์ด ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํฌ๋งํ•˜์…จ๊ณ , ํ˜„์žฌ ์„์‚ฌ ๊ณผ์ •์œผ๋กœ ๋ฐ”์œ ์‹œ๊ฐ„์„ ์ชผ๊ฐœ์„œ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค.

์‚ฌ์‹ค ๋Œ€ํ•™์› ์ž…ํ•™ํ•˜๊ธฐ ์ „์— ๋ณ„๋‹ค๋ฅธ ์ทจ์ง์ด ์•ˆ๋˜๋ฉด ํ”ผ๊ฒจ์ธ๋“ค์„ ์œ„ํ•œ ์•ฑ ๊ฐœ๋ฐœ๋กœ ์ฐฝ์—…์„ ํฌ๋งํ•˜์˜€์œผ๋‚˜, ์ธ์ƒ์€ ์–ด์ฐŒ๋ ์ง€ ๋ชจ๋ฅด๊ธฐ์— ๋Œ€ํ•™์›์— ์ž…์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค(?). ๋‹ค๋ฅธ ์Šคํฌ์ธ ์— ๋น„ํ•ด ์ผ์ • ๊ด€๋ จํ•ด์„œ ์ •๋ฆฌ๋œ๊ฒƒ๋„ ์—†๊ณ  KSU์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋‚œ์žฅํŒ์ด ์—†๋‹ค.. ํ•˜ใ…ใ…Ž

์—ฌํ•˜ํŠผ ๋Œ€ํšŒ ์ผ์ •์— ๊ด€ํ•ด์„œ๋Š” 2์ฐจ ์˜คํ”ˆ ๋•Œ ์• ๊ธฐํ•˜๊ณ  1์ฐจ ์˜คํ”ˆ ๋•Œ๋Š” 2์›”์— jupyter notebook์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋˜ ๊ธฐ๋Šฅ๋“ค์„ ์„œ๋น„์Šคํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์‚ฌ์‹ค ์š”์ฆ˜ ๋„ˆ๋ฌด.. ๋ฒˆ์•„์›ƒ ์™”๊ณ  ๋‚ด ๋ถ„์•ผ์— ๋Œ€ํ•ด ํ˜„ํƒ€๊ฐ€ ์กฐ๊ธˆ ์™€์„œ ์ข€ ๋” ๊ฐœ๋ฐœ์ž์Šค๋Ÿฝ๊ฒŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

Preliminary

์›๋ž˜๋Š” ๊ท€์ฐฎ์•„์„œ ๊ทธ๋ƒฅ jupyter notebook ๊ทธ๋Œ€๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑธ๋กœ ํ•˜๋ ค๋‹ค๊ฐ€ ๋ญ”๊ฐ€.. ๋‚˜๋งŒ์˜ ์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•˜๊ณ  ์‹ถ์–ด์„œ ๋…ธ์„ ์„ ๋ฐ”๊ฟจ๋‹ค.

์‚ฌ์‹ค ๋‚˜๋Š” ์ž‘๋…„ ์ดˆ๋งŒํ•ด๋„ html์„ 1๋„ ๋ชจ๋ฅด๋Š” ์ธ๊ฐ„์ด์—ˆ๋Š”๋ฐ ์–ด์ฉŒ๋‹ค๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ ํฌ๋กค๋งํ•˜๋ฉด์„œ ๋Œ€์ถฉ ๋ฌธ๋ฒ•์ด ์ตํ˜€์ง€๊ณ  2021๋…„ ๋ชจ์ข…์˜ ์‚ฌ๊ฑด๋“ค๋กœ react๋ฅผ 2๋‹ฌ ์•ˆ์— ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์“ฐ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ํ˜„์žฌ 1๋…„ ์งˆ์งˆ ๋„๋Š” ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋„ react native๋ฅผ ์จ์„œ ๊ทธ๋Ÿฐ์ง€ react ํ”„๋ ˆ์ž„์›Œํฌ ์“ฐ๋Š”๋ฐ ํฌ๊ฒŒ ๋ฌธ์ œ๋Š” ์—†์–ด์„œ React framework๋ฅผ ์“ฐ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ฐฑ์—”๋“œ์ธ๋ฐ.. ๋ฐฑ์—”๋“œ๋Š” ์ž˜๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋Œ€์ถฉ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

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

๋ฌผ๋ก  ๋‚˜๋Š” ์›Œํฌ์Šคํ…Œ์ด์…˜ ์‚ด ๋ˆ์ด ์—†๋Š” ๊ฒŒ ๋‹น์—ฐํ•˜๊ณ .. 1์ธ ๊ธฐ์—…์„ ์šด์˜ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ํ•„์š” ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ ํ”„๋ฆฌํ‹ฐ์–ด๋กœ AWS ์„œ๋ฒ„๋ฆฌ์Šค๋กœ ํ•ด๋ณด์ž๋ผ๊ณ  ํ•ด์„œ ์„ ํƒํ–ˆ๋‹ค.

์‚ฌ์‹ค tensorflow ๊ฐ™์ด ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์จ๋ณด์ง€ ์•Š์•„์„œ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ, ์ผ๋‹จ์€ ๊ทธ๋‚˜๋งˆ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์จ๋ณธ Aws๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์—ฌํŠผ.. ์“ฐ๊ฒŒ ๋œ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์€:

  • Front-end: React framework v6
  • Back-end: Python3.8, Docker, AWS as serverless - lambda, s3,

Front End

ํ™•์‹คํžˆ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๊พธ์ค€ํžˆ ๊ณต๋ถ€ํ•ด์•ผํ•˜๋Š” ๋ถ„์•ผ๊ฐ€ ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ถ„๋ช… ์ฃผ์†Œ ๋ผ์šฐํ„ฐ ์ž˜ ์„ค์ •ํ–ˆ๋Š”๋ฐ.. ์•Œ๊ณ ๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์ž์ฃผ ์“ฐ๋˜ 2๋…„์ „ ๋ฐฉ์‹์€ ๋” ์ด์ƒ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ๊ณ (HashRouter) ์š”์ฆ˜ ๋™์  ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•ด BrowserRouter์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด๊ฑธ ์ตํžˆ๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. ๋ผ๊ณ ๋Š” ํ•˜์ง€๋งŒ ๋‚˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ์ง์œผ๋กœ ๊ฐˆ ์ƒ๊ฐ์€ ์—†๋‹ค..ใ…‹ใ…‹

๊ทธ๊ฒƒ ๋นผ๊ณ ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๊ธˆ๋ฐฉ ๋งŒ๋“ค์—ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋„ฃ์–ด ์„œ ํ•œ 2์ผ ์•ˆ์— ๋ฐ”์ง ๋งŒ๋“ค์—ˆ๋‹ค.

์›๋ž˜๋Š” ํ˜‘์—… ์˜์‚ฌ๊ฐ€ ์žˆ์—ˆ๋˜ UI ๋””์ž์ด๋„ˆ ๋ถ„์—๊ฒŒ ๋””์ž์ธ ๋งก๊ธฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์„ฑ์งˆ ๊ธ‰ํ•ด์„œ ๋‚ด๋ฉ‹๋Œ€๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

Back End

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

๋ฐฑ์—”๋“œ๋Š” ํฌ๊ฒŒ container image๋ฅผ ํ†ตํ•ด์„œ lambda function์„ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ serverless ๋ฅผ ํ†ตํ•ด์„œ function์„ ๋งŒ๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ตํ˜”๋‹ค. ๋‹ค๋งŒ container image๋Š” docker ์‚ฌ์ „ ์ง€์‹๊ณผ ์ฝ”๋“œ๋ฅผ aws ์ƒ์—์„œ๋Š” ์•ˆ ๋ณด์ธ๋‹ค๋Š” ์ ์ด ๋‹จ์  ์•„๋‹Œ ๋‹จ์ ์ด์ง€๋งŒ, serverless์— ๋น„ํ•ด์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œ ? ๋‚˜๋Š” ํŽธ์ด๋ผ container image๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ด์ œ ์ด ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€๋ฅผ ์–ด๋–ป๊ฒŒ ๋นผ๋ƒ๊ฐ€ ๋ฌธ์ œ์ธ๋ฐ..

์—ฌํ•˜ํŠผ ์ƒ๋Œ€์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋ณด๋‹ค ์‚ฝ์งˆ์ด ๋งŽ์•„์„œ ์‚ฝ์งˆ ์—ฐ๋Œ€๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด์•˜๋‹ค.

์‚ฝ์งˆ ์—ฐ๋Œ€๊ธฐ

  1. AWS lambda์™€ layer

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

์ˆ˜์ž‘์—…์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ๋งํฌ ์ฐธ๊ณ .

  1. ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ layer

์œ„์—์„œ ์„œ์ˆ ํ–ˆ๋“ฏ lambda๋Š” 250MB์˜ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. /tmp๋ผ๊ณ  ์ž„์‹œ ์ €์žฅํ•˜๋Š” ๊ณณ์„๋”ฐ๋กœ ํŒŒ์„œ 500MB๊นŒ์ง€ ์“ธ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ (๋Œ€์ถฉ ์•„๋ž˜ lambda function์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.)

sys.path.append("/tmp")

BUT.. tensorflow 2.0์™€ ๊ฐ™์ด ์Œ‰ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” lambda layer์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.. ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋Š” ์ž…์žฅ์ด๋ผ๋ฉด sagemaker๋ผ๊ณ  ํ•ด์„œ ๋”ฐ๋กœ ๊ตฌ๋…๋ฃŒ ๋‚ด๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งž์ง€๋งŒ ๋‚˜๋Š” prediction ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ์„œ ๋‚˜์™€๊ฐ™์€ ์‚ฌ๋žŒ์ด ์—†์„๊นŒ ์‹ถ์–ด์„œ ํ•˜๋ฃจ ์ข…์ผ ๊ฒ€์ƒ‰ํ–ˆ๋‹ค ใ… ใ… 

์ฐพ์•„๋ณธ ๋ฐ”๋กœ๋Š” npm์„ ์ด์šฉํ•œ serverless์™€ docker๋ฅผ ์ด์šฉํ•˜์—ฌ AWS์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ serverless์—๋Š” template์œผ๋กœ aws-python-docker๋กœ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

  • ๊ด€๋ จ ๋งํฌ - Stack overflow
  • ๊ด€๋ จ ๋งํฌ - github @aws-samples: ๋„์ปค ํŒŒ์ผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์ฐธ๊ณ 

์œˆ๋„์šฐ์—์„œ๋Š” docker ๊ด€๋ จ ์—๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐ์ด ์•ˆ๋˜์–ด์„œ ์šฐ๋ถ„ํˆฌ ํ™˜๊ฒฝ์œผ๋กœ ์˜ฎ๊ฒผ๋‹ค. tflite์ด ๊ทธ๋ ‡๊ฒŒ๋‚˜ ๋ฌธ์ œ์—ฌ์„œ ์ฐธ.. ๊ณ ์ƒ๋„ ๋งŽ์ด ํ–ˆ๋‹ค. ๊ฒฐ๋ก ์€ tensorflow๋Š” ๋ฌด๊ฑฐ์›Œ์„œ lite๋ฅผ ์“ฐ๋Š” ๊ฑธ ๊ถŒํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋‚˜์•ผ prediction๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ผ๋‹จ์€ ์˜ฌ๋ ค๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ๋‹ค์Œ ๋„์ปค๋ฅผ ์ด์šฉํ•ด์„œ ์ปจํ…Œ์ด์ง€ ์ด๋ฏธ์ง€๋ฅผ ํ† ๋Œ€๋กœ lambda ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด ๋ฆฌํฌ ์ฐธ๊ณ ํ•ด์„œ ๋งŒ๋“ค์–ด๋ณด๊ณ  ML bookcamp ์š” ์ •๋ณด์™€ ์ถ”ํ•ฉํ•ด์„œ container image๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๋Œ๋ ค๋ณด์•˜๋‹ค.. ๊ฒฐ๊ตญ Dockerfile ๋งž๊ฒŒ ์„ค์ •ํ•˜๋Š”๋ฐ ๊ฑฐ์˜ ์‚ฝ์งˆํ•œ ๊ฒƒ ๊ฐ™๋‹ค

FROM public.ecr.aws/lambda/python:3.8
WORKDIR ${LAMBDA_TASK_ROOT}
COPY app.py app.py
COPY requirements.txt requirements.txt
RUN python3.8 -m pip install --upgrade pip
RUN python3.8 -m pip install -r requirements.txt
CMD ["app.handler"]

์•„ ๊ทผ๋ฐ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์€ tflite๊ฐ€ ์•ˆ๋œ๋‹ค๊ณ  ํ•ด์„œ tensorflow๋กœ ์˜ฌ๋ ธ๋Š”๋ฐ ํ•ด๋‹น ๋„์ปค ํŒŒ์ผ๋กœ ์ž˜ ์˜ฌ๋ ธ๋‹ค. ๋„์ปค๋กœ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์™ธ์—๋Š” ์—†๋Š” ๋“ฏ ์‹ถ๋‹ค.

sudo $(aws ecr get-login --no-include-email)

  1. API Gateway

์•ˆํƒ€๊น๊ฒŒ๋„ ๋‚ด ๊ธฐ๋Šฅ์€ 1๋ถ„ 30์ดˆ์—์„œ ๋‚ด์ง€๋Š” 2๋ถ„์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ๋ฐ, API gateway๋Š” ๊ธฐ๋‹ค๋ ค์ฃผ์ง€ ์•Š์•„.. ใ… ใ…  30์ดˆ๊ฐ€ ์ตœ๋Œ€์ด๊ณ  2022๋…„ ํ˜„์žฌ๊นŒ์ง€ 29์ดˆ๊ฐ€ ๊ณ ์ •์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๋‚˜ ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ ๋ญ”๊ฐ€ ์ฐพ๊ธดํ–ˆ๋Š”๋ฐ.. ๊ณผ๊ธˆ ํญํƒ„์ด ๋  ๊ฒƒ ๊ฐ™์•„ ์˜ˆ์˜์ฃผ์‹œํ•˜๊ณ  ์žˆ๋‹ค..

์ธํ„ฐ๋„ท์— ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ SQS ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋Œ€๊ธฐ ํ๋ฅผ ๋งŒ๋“ค์–ด ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ (ALB, ELB)๋ฅผ ๋งŒ๋“ค๋ฉด ์ œํ•œ์—†์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ ๋Š” ํ•˜๋Š”๋ฐ, single function url๋กœ๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฌผ๋ก  sqs๋‚˜ gateway, load balencer ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ๋ณ„๋„๋กœ ๋น„์šฉ์ด ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ํ•˜๋‹ˆ ์ฃผ์˜ํ•  ๊ฒƒ..

์—ฌํ•˜ํŠผ single function url ๋กœ ํ˜ธ์ถœํ•˜๋ฉด์„œ invoke ํ˜•์‹๋„ ๋‹ค๋ฅด๋‹ค๊ณ  ํ•ด์„œ ๊ทธ์— ๋งž๊ฒŒ๋” container image๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์„œ ์—…๋ฐ์ดํŠธํ–ˆ๋‹ค. base64๊ฐ€ ๊ผฌ์ด๋Š”๊ฒŒ ์ฐธ ๊ณ ์—ญ์ด์—ˆ๋Š”๋ฐ 5์ผ๋‚ด๋‚ด ๊ณ ์ƒํ•œ ๋ณด๋žŒ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค ใ…Žใ…Ž

  1. Frontend-Backend ๋ฟŒ๋ฆฌ๊ธฐ

์ฒ˜์Œ ํŒŒ์ด์ฌ์œผ๋กœ request test ํ•œ๊ฒƒ๊ณผ javascript๋กœ request testํ•˜๋Š” ์™€์ค‘ ๋ถ€๋ฅด๋Š” ํ˜•์‹์ด ์ข€ ๋‹ฌ๋ผ์„œ ์ข€ ๊ณ ์ƒํ–ˆ๋‹ค. ๊ณ ์ƒ์„ ๊ฑฐ์˜ Backend์—์„œ ํ•˜๋Š” ๊ตฌ๋งŒ..

  • python ์€ event["body"]๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ string์œผ๋กœ ๋ฐ›์•„๋ฒ„๋ฆฌ๊ณ  ์•„์ฃผ ์ด์ƒํ•œ ํ˜•ํƒœ๋กœ ๋ฐ›๊ฒŒ ๋œ๋‹ค. data ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๋ฉด์„œ ์ด์ƒํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.
  • javascript๋กœ ๋„˜๊ฒจ๋ฐ›์„ ๋•Œ๋Š” json์œผ๋กœ ์ž˜ ๋„˜๊ฒจ๋ฐ›๋Š” ๊ฑธ ํ™•์ธ

function url๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ถˆ๋ €๋‹ค. ์™œ๋ƒํ•˜๋ฉด.. ์‹œ๊ฐ„ ๊ฐ๋‹น ๋ชปํ•˜๊ณ  api gateway cors ์–ด์ฉŒ๊ตฌ๋ž‘ ํƒ€์ž„์•„์›ƒ ๊ฒช๊ธฐ ์‹ซ์–ด์„œ ใ…‡ใ…‡. ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๊ฑฑ์ •๋˜๋Š”๋ฐ, ์ฐจ์ฐจ beta ํ…Œ์ŠคํŠธ ํ•˜๋ฉด์„œ ๋ณด์™„ํ•ด์•ผ๊ฒ ๋‹ค.

  1. Sports DB ์ถ”๊ฐ€

๋ฌด๋ฃŒ ๋ฒ„์ „์˜ Sportds DB api๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตญ์ œ ํ”ผ๊ฒจ์Šค์ผ€์ดํŒ… ๋Œ€ํšŒ ์บ˜๋ฆฐ๋”๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค. ๋‹ค๋งŒ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ€๊ฒฉ์ด ์ฑ…์ •์ด ๋˜์–ด์„œ ์•„์˜ˆ local์—์„œ ํ˜ธ์ถœํ•ด์„œ DB๋ฅผ jsonํ™” ์‹œ์ผœ์„œ ์˜ฌ๋ฆฌ๋Š” ์ข€.. ๊ตฌ๋‹ฅ๋‹ค๋ฆฌ ๋ฐฉ์‹์„ ์ด์šฉํ•˜์˜€๋‹ค. ๊ฒฐ๊ตญ ๋‚ด์ชฝ์—์„œ ์—…๋ฐ์ดํŠธ ํ•˜์ง€ ์•Š์œผ๋ฉด ์†Œ์šฉ์—†์–ด์„œ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

  1. ๋˜ ํ•˜๋‚˜์˜ ๋‚œ๊ด€, lambda ์ž์ฒด๋ก  ์ด๋ฏธ์ง€ ๋„ฃ๊ธฐ์—” ๋ถ€์กฑํ•˜๋‹ค. ๊ฒฐ๊ตญ API Gateway..

lambda๋กœ ์ด๋ฏธ์ง€๋ฅผ base64๋ฅผ ํ˜ธํ™˜ํ•ด์„œ ๋ณด๋‚ผ ๋•Œ 502 ๋ฉ”์„ธ์ง€๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋œจ๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” lambda๋ฅผ ํ†ตํ•ด์„œ ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ, 100kb ๋‚ด ์ด๋ฏธ์ง€๋งŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.. ๋ ์šฉ.. ๊ฒฐ๊ตญ์—๋Š” gif ์ด๋ฏธ์ง€๋Š” ์ƒ๋žตํ•ด๋ฒ„๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋งŒ์ด๋ผ๋„ ์ถœ๋ ฅํ•˜๊ธธ ๋ฐ”๋žฌ์Œ..

๊ทธ๋Ÿฐ๋ฐ ํ•˜๋‹ค๋ณด๋‹ˆ API gateway๋Š” timeout ์ œํ•œ์œผ๋กœ ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ timeout ๋•Œ๋ฌธ์— api gateway๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š”๊ฒŒ ์ƒ๊ฐ์ด ๋‚ฌ๋‹ค..

๋Œ€๋ถ€๋ถ„ 503 error๋กœ Service unavailable์€ ์ด์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ ๋‹ค์‹œ lambda์—์„œ ๋‹ค์‹œ ํ˜ธ์ถœ๋ฐ›๊ณ  ์ž…๋ ฅ์‹œ 100kb ๋ฏธ๋งŒ์œผ๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํƒํ–ˆ๋‹ค.

Wrap up & Conclusion

๊ฒฐ๋ก ์ ์œผ๋กœ tensorflow 1.4์™€ ํŒŒ์ด์ฌ 3.8์„ ์„ฑ๊ณต์ ์œผ๋กœ AWS์— ์˜ฌ๋ ค ๋ชจ๋ธ๋กœ ํ•˜์—ฌ๊ธˆ estimationํ•˜๋Š”๋ฐ ์„ฑ๊ณตํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ, cost๋ฉด์—์„œ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ๋А๊ผˆ๊ณ , ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค. ๋˜ํ•œ ์ž˜๋ชป๋œ ์ด๋ฏธ์ง€ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค๋‹ค๋ณด๋‹ˆ, aws์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์„๊นŒ๋ผ๋Š” ๊ฑฑ์ •๋„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ํ˜„์žฌ Beta๋กœ ๋‚ด๋†“์€ ์‚ฌ์ดํŠธ๋Š” 10์›” ์ดํ›„์—๋Š” ํ์‡„ํ•˜์˜€๊ณ , ์‚ฌ๋žŒ๋งˆ๋‹ค ์ฐฉ์ง€ ์ง€์ ์ด ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋กœ ์ด์šฉํ•œ estimation์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ์„ ๊ณ ๋ คํ•˜์—ฌ ์ƒˆ๋กœ์šด AI ๊ฐœ๋ฐœ์— ํฌ์ปค์‹ฑ์„ ๋งž์ถ”์—ˆ๋‹ค. Beta ๋ฒ„์ „์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์ด์šฉํ•œ ์ด์œ ๋Š” ํ˜„์žฌ monocular video๋ฅผ ์ด์šฉํ•œ estimation์ด frame rate๊ฐ€ ๋”ฐ๋ผ์ฃผ์ง€ ์•Š์•„์„œ ์˜€๋Š”๋ฐ, ์ตœ๊ทผ ์—ฐ๊ตฌ๋กœ ์†๋„๊ฐ€ ๋น ๋ฅธ ์˜์ƒ์„ ์บก์ณํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ตฌ๊ฐ€ ๋‚˜์™€์„œ ์•„๋งˆ.. ์˜์ƒ์„ ์ด์šฉํ•œ judge ai๊ณผ ์ฐฉ์ง€ ์ง€์ ์„ supervised learning์œผ๋กœ ํ›ˆ๋ จํ•˜๋ฉด ์–ด๋А ์ •๋„ ์„ฑ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„๊นŒ ์˜ˆ์ธกํ•œ๋‹ค.. ์—ฌํŠผ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด ๊ฒƒ๊ณผ ๊ฒฐ๋ก ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค!

  • tensorflow๋ฅผ AWS์— ์˜ฌ๋ ค์„œ model estimation์„ ํ•  ์ˆ˜ ์žˆ์Œ!
  • React๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค!
  • Judge AI์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ๊ฒƒ์€ ์•„๋ฌด๋ž˜๋„ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์˜์ƒ์„ ์ž…๋ ฅ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์‹œ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •ํ•˜์˜€๋‹ค. (๊ทธ๊ฒŒ ์–ธ์ œ์ผ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ..)
Authors