๐Ÿง  ๋”ฅ๋Ÿฌ๋‹์—์„œ FP32์™€ FP64: ์ •๋ฐ€๋„๋ณด๋‹ค ์ค‘์š”ํ•œ ํ˜„์‹ค์ ์ธ ์„ ํƒ

์ตœ๊ทผ ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๊ฑฐ๋‚˜ ๋ฐฐํฌํ•  ๋•Œ, float32(FP32) ๋Œ€์‹  float16, bfloat16, ์‹ฌ์ง€์–ด float64(FP64)๋ฅผ ๊ณ ๋ คํ•˜๋Š” ์‚ฌ๋ก€๊ฐ€ ๋Š˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์„ ํƒ์€ ๋‹จ์ˆœํžˆ ์ •๋ฐ€๋„์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ, ํ•™์Šต ์•ˆ์ •์„ฑ, ์—ฐ์‚ฐ ์„ฑ๋Šฅ๊นŒ์ง€ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํŠนํžˆ FP32์—์„œ FP64๋กœ ๋ณ€ํ™˜ํ•  ๊ฒฝ์šฐ ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ๋Œ€๋ถ€๋ถ„์˜ ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—ฌ์ „ํžˆ FP32๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ฑ„ํƒํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์‹ค์ œ์ ์ธ ๊ด€์ ์—์„œ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ๋ถ€๋™์†Œ์ˆ˜์ (Floating Point)์˜ ๊ธฐ๋ณธ: FP16, FP32, FP64

ํ˜•์‹๋น„ํŠธ ์ˆ˜๋ฉ”๋ชจ๋ฆฌ์œ ํšจ ์ž๋ฆฟ์ˆ˜ํ‘œํ˜„ ๋ฒ”์œ„์ฃผ ์‚ฌ์šฉ์ฒ˜
FP1616bit2B์•ฝ 3~4์ž๋ฆฌยฑ6.5e4๋ชจ๋ฐ”์ผ, ๊ทธ๋ž˜ํ”ฝ, ์ผ๋ถ€ CNN
FP3232bit4B์•ฝ 7์ž๋ฆฌยฑ3.4e38๋Œ€๋ถ€๋ถ„์˜ ๋”ฅ๋Ÿฌ๋‹ ์—ฐ์‚ฐ
FP6464bit8B์•ฝ 16์ž๋ฆฌยฑ1.8e308๊ณผํ•™ ๊ณ„์‚ฐ, ๊ธˆ์œต, ์‹œ๋ฎฌ๋ ˆ์ด์…˜

โš™๏ธ FP64๋กœ ๋ฐ”๊พธ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์–ผ๋งˆ๋‚˜ ๋Š˜์–ด๋‚ ๊นŒ?

๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค:

FP32 โ†’ FP64 ์ „ํ™˜ ์‹œ, ๊ฐ€์ค‘์น˜ ํ•˜๋‚˜๋‹น ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์ •ํ™•ํžˆ 2๋ฐฐ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 10M๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋ธ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด:

  • FP32์ผ ๊ฒฝ์šฐ: 10M x 4B = 40MB
  • FP64์ผ ๊ฒฝ์šฐ: 10M x 8B = 80MB

์—ฌ๊ธฐ์— ์˜ตํ‹ฐ๋งˆ์ด์ € ์ƒํƒœ(์˜ˆ: Adam์˜ m, v)๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ์‹ค์ œ ํ•™์Šต ์‹œ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” 2๋ฐฐ ์ด์ƒ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿšซ FP64๊ฐ€ ์˜คํžˆ๋ ค ๋”ฅ๋Ÿฌ๋‹ ํ•™์Šต์— ๋ถˆ๋ฆฌํ•œ ์ด์œ 

  1. ์ •๋ฐ€๋„๊ฐ€ ๋†’๋‹ค๊ณ  ๊ผญ ์ข‹์€ ๊ฑด ์•„๋‹ˆ๋‹ค
    • ๋Œ€๋ถ€๋ถ„์˜ ๋”ฅ๋Ÿฌ๋‹ ์—ฐ์‚ฐ์€ ๊ทธ๋ ‡๊ฒŒ ๋†’์€ ์ •๋ฐ€๋„๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š์Œ.
    • ์˜คํžˆ๋ ค ํ•™์Šต ์ค‘ ๋ฐœ์ƒํ•˜๋Š” gradient noise๋‚˜ dropout ๋“ฑ์˜ regularization์œผ๋กœ ์ธํ•ด FP64๋Š” ๊ณผ๋„ํ•œ ์—ฐ์‚ฐ ๋‚ญ๋น„๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ.
  2. ํ•˜๋“œ์›จ์–ด ์ง€์›์ด ๋–จ์–ด์ง
    • ๋Œ€๋ถ€๋ถ„์˜ GPU(NVIDIA RTX ์‹œ๋ฆฌ์ฆˆ, A100 ๋“ฑ)๋Š” FP32, FP16์—๋Š” Tensor Core๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, FP64๋Š” ๋А๋ฆฐ ์—ฐ์‚ฐ ์žฅ์น˜์— ๋งคํ•‘๋จ.
    • ์˜ˆ: A100์˜ ๊ฒฝ์šฐ FP32๋Š” 19.5 TFLOPS, FP64๋Š” 9.7 TFLOPS (์ ˆ๋ฐ˜ ์ˆ˜์ค€)
  3. ๋ชจ๋ธ ์ €์žฅ ๋ฐ ์ „์†ก ๋น„์šฉ ์ฆ๊ฐ€
    • ๋ชจ๋ธ ํฌ๊ธฐ๊ฐ€ 2๋ฐฐ๊ฐ€ ๋˜๋ฉด ์ €์žฅ ๊ณต๊ฐ„, ๋„คํŠธ์›Œํฌ ์ „์†ก ๋น„์šฉ๋„ 2๋ฐฐ

โœ… FP32๊ฐ€ ์—ฌ์ „ํžˆ ํ‘œ์ค€์ธ ์ด์œ 

  • ์ถฉ๋ถ„ํ•œ ์ •๋ฐ€๋„: ๋Œ€๋ถ€๋ถ„์˜ CNN, Transformer ๊ณ„์—ด ๋ชจ๋ธ์—์„œ 32bit ์ •๋ฐ€๋„๋ฉด ํ•™์Šต ์•ˆ์ •์„ฑ๊ณผ ์ •ํ™•๋„ ๋ชจ๋‘ ํ™•๋ณด ๊ฐ€๋Šฅ
  • ์ตœ์ ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์—ฐ์‚ฐ ์„ฑ๋Šฅ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ, ์ •๋ฐ€๋„ ์‚ฌ์ด์—์„œ ๊ท ํ˜• ์žกํžŒ ์„ ํƒ
  • ํ”„๋ ˆ์ž„์›Œํฌ ์ตœ์ ํ™”: TensorFlow, PyTorch ๋ชจ๋‘ FP32์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ pre-trained ๋ชจ๋ธ๋„ FP32๋กœ ์ œ๊ณต

๐Ÿ’ก Mixed Precision์ด ๋– ์˜ค๋ฅด๋Š” ์ด์œ 

ํ˜„๋Œ€ ๋”ฅ๋Ÿฌ๋‹์—์„œ๋Š” ์˜คํžˆ๋ ค mixed precision(์˜ˆ: float16 ์—ฐ์‚ฐ + float32 ์ €์žฅ)์ด ๋” ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—ฐ์‚ฐ์€ ๋น ๋ฅธ FP16,
  • ๊ฐ€์ค‘์น˜ ์ €์žฅ์€ ์•ˆ์ •์ ์ธ FP32
  • ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ๋ชจ๋‘ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

pythonCopyEditfrom tensorflow.keras import mixed_precision
mixed_precision.set_global_policy('mixed_float16')

๐Ÿงพ ๋งˆ๋ฌด๋ฆฌ: ์‹ค๋ฌด์—์„œ์˜ ์ถ”์ฒœ

์ƒํ™ฉ์ถ”์ฒœ Precision
์ผ๋ฐ˜์ ์ธ CNN, TransformerFP32 ๋˜๋Š” Mixed Precision
๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ, ๋น ๋ฅธ ์‹คํ—˜ ํ•„์š”Mixed Precision (float16 + float32)
๊ณผํ•™ ๊ณ„์‚ฐ, ์ˆ˜์น˜ ํ•ด์„FP64
ํšŒ๊ท€ ๋ฌธ์ œ์—์„œ ์†Œ์ˆ˜์  ์ •๋ฐ€๋„๊ฐ€ ํ•ต์‹ฌ์ผ ๋•ŒFP32 (ํ˜น์€ FP64, ์ƒํ™ฉ์— ๋”ฐ๋ผ)

๐Ÿ” ์š”์•ฝ

๋”ฅ๋Ÿฌ๋‹์—์„œ FP64๋Š” ์ •๋ฐ€๋„๋Š” ๋†’์ง€๋งŒ ์‹ค์ „์—์„œ ์ด๋“์€ ํฌ์ง€ ์•Š๋‹ค.
์˜คํžˆ๋ ค ํ•™์Šต ์†๋„ ์ €ํ•˜, ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€, ํ•˜๋“œ์›จ์–ด ๋น„ํ˜ธํ™˜์„ฑ ๊ฐ™์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, FP32 ๋˜๋Š” mixed precision์ด ํ˜„์‹ค์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋ฉ˜ํŠธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค