๋จธ์‹ ๋Ÿฌ๋‹ ์‹œ์Šคํ…œ TensorFlow 2.0 ์ถœ์‹œ

๋„์ž… ๋จธ์‹ ๋Ÿฌ๋‹ ํ”Œ๋žซํผ์˜ ๋Œ€ํญ ์ถœ์‹œ ํ…์„œ ํ”Œ๋กœ์šฐ 2.0์ด๋Š” ๋‹ค์–‘ํ•œ ๋”ฅ ๋จธ์‹  ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ์„ฑ ๊ตฌํ˜„, Python์—์„œ ๋ชจ๋ธ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค, ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„์˜ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” C++ ์–ธ์–ด์šฉ ํ•˜์œ„ ์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์ฝ”๋“œ๋Š” C++์™€ Python์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋ฐฐํฌ์ž Apache ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ.

์ด ํ”Œ๋žซํผ์€ ์›๋ž˜ Google Brain ํŒ€์— ์˜ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ ์Œ์„ฑ ์ธ์‹, ์‚ฌ์ง„ ์† ์–ผ๊ตด ์‹๋ณ„, ์ด๋ฏธ์ง€ ์œ ์‚ฌ์„ฑ ํŒ๋‹จ, Gmail์—์„œ ์ŠคํŒธ ํ•„ํ„ฐ๋ง, ์„ ํƒ Google ๋‰ด์Šค์˜ ๋‰ด์Šค์™€ ์˜๋ฏธ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋ฒˆ์—ญ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ CPU ๋˜๋Š” GPU์— ๊ณ„์‚ฐ์„ ๋ถ„์‚ฐ์‹œํ‚ค๊ธฐ ์œ„ํ•œ TensorFlow์˜ ๋‚ด์žฅ ์ง€์› ๋•๋ถ„์— ๋ถ„์‚ฐ ๋จธ์‹ ๋Ÿฌ๋‹ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ ํ•˜๋“œ์›จ์–ด์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ƒˆ ๋ฒ„์ „์„ ์ค€๋น„ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ค‘์ ์„ ๋‘” ์ ์€ ๋‹จ์ˆœํ™”์™€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ ํ˜์‹ :

  • ๋ชจ๋ธ ๊ตฌ์ถ• ๋ฐ ํ•™์Šต์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ณ ๊ธ‰ API๊ฐ€ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ€ ๋ผ์Šค, ๋ชจ๋ธ ๊ตฌ์ถ•์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค ์˜ต์…˜(์ˆœ์ฐจ์ , ๊ธฐ๋Šฅ์ , ํ•˜์œ„ ํด๋ž˜์Šคํ™”)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ๊ตฌํ˜„ (์‚ฌ์ „ ์ปดํŒŒ์ผ ์—†์ด) ๊ฐ„๋‹จํ•œ ๋””๋ฒ„๊น… ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • API ์ถ”๊ฐ€ tf.distribute.์ „๋žต ์กฐ์ง์„ ์œ„ํ•ด ๋ถ„์‚ฐ ํ•™์Šต ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๋ชจ๋ธ. ๊ณ„์‚ฐ์„ ์—ฌ๋Ÿฌ ๊ณณ์œผ๋กœ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ ์™ธ์—๋„ ๋‹ค์ค‘ GPU, ํ•™์Šต ๊ณผ์ •์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์„œ๋กœ ๋‚˜๋ˆ„๊ณ  ํด๋ผ์šฐ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์‹คํ—˜์ ์œผ๋กœ ์ง€์› ๊ฐ€๋Šฅ TPU (ํ…์„œ ์ฒ˜๋ฆฌ ์žฅ์น˜);
  • tf.Session์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์„ ์–ธ์  ๋ชจ๋ธ ๋Œ€์‹  Python์—์„œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” tf.function ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์›๊ฒฉ์œผ๋กœ ์‹คํ–‰, ์ง๋ ฌํ™” ๋˜๋Š” ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด;
  • ๋ฒˆ์—ญ๊ธฐ ์ถ”๊ฐ€ ์žํ•„, Python ๋ช…๋ น ์ŠคํŠธ๋ฆผ์„ TensorFlow ํ‘œํ˜„์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Python ์ฝ”๋“œ๋ฅผ tf.function-designated, tf.data, tf.distribute ๋ฐ tf.keras ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • SavedModel์€ ๋ชจ๋ธ ๊ตํ™˜ ํ˜•์‹์„ ํ†ตํ•ฉํ•˜๊ณ  ๋ชจ๋ธ ์ƒํƒœ ์ €์žฅ ๋ฐ ๋ณต์›์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. TensorFlow์šฉ์œผ๋กœ ์ปดํŒŒ์ผ๋œ ๋ชจ๋ธ์€ ์ด์ œ ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TensorFlow Lite (๋ชจ๋ฐ”์ผ ์žฅ์น˜์—์„œ), ํ…์„œํ”Œ๋กœ์šฐ JS (๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js์—์„œ), ํ…์„œ ํ”Œ๋กœ์šฐ ์„œ๋น™ ะธ ํ…์„œํ”Œ๋กœ์šฐ ํ—ˆ๋ธŒ;
  • tf.train.Optimizers ๋ฐ tf.keras.Optimizers API๊ฐ€ ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค; Compute_gradients ๋Œ€์‹  ๊ฒฝ์‚ฌ ๊ณ„์‚ฐ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๊ฐ€ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ผ๋ฐ์ด์…˜ ํ…Œ์ดํ”„;
  • GPU๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    NVIDIA Volta ๋ฐ Turing GPU๊ฐ€ ํƒ‘์žฌ๋œ ์‹œ์Šคํ…œ์˜ ๋ชจ๋ธ ํ›ˆ๋ จ ์†๋„๋Š” ์ตœ๋Œ€ XNUMX๋ฐฐ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์‹ค์‹œ ์ฃผ์š” API ์ •๋ฆฌ, ๋งŽ์€ ํ˜ธ์ถœ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋˜๋Š” ์ œ๊ฑฐ, ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ์˜ ์ „์—ญ ๋ณ€์ˆ˜ ์ง€์›์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. tf.app, tf.flags, tf.logging ๋Œ€์‹  ์ƒˆ๋กœ์šด absl-py API๊ฐ€ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ API๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด compat.v1 ๋ชจ๋“ˆ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€