Pytorch: RFC: ๊ฒฐ์ •์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด torch.deterministic ํ”Œ๋ž˜๊ทธ ์ถ”๊ฐ€

์— ๋งŒ๋“  2018๋…„ 12์›” 18์ผ  ยท  67์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pytorch/pytorch

๐Ÿš€ ๊ธฐ๋Šฅ

PyTorch๊ฐ€ ๋น„ํŠธ ๊ฒฐ์ •์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Soumith๋Š” ์ผ๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— torch.experimental ํ•˜์œ„ ํŒจํ‚ค์ง€์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐ ๋ถ€์—ฌ

์‹คํ–‰ ๊ฐ„์˜ ๋น„ํŠธ ๋‹จ์œ„ ๊ฒฐ์ •์„ฑ์€ ๋””๋ฒ„๊น…์— ์œ ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ์ž‘์—…์— ๋Œ€ํ•ด ํšจ์œจ์ ์ธ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ •์ 

torch.experimental.deterministic ๊ฐ€ False (๊ธฐ๋ณธ๊ฐ’)์ธ ๊ฒฝ์šฐ PyTorch๋Š” ์ฃผ์–ด์ง„ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. torch.experimental.deterministic ๊ฐ€ True ์ด๋ฉด PyTorch๋Š” ๊ฒฐ์ •์  ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PyTorch๋Š” ์ฃผ์–ด์ง„ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ์ •์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์—†๊ณ  torch.experimental.deterministic ๊ฐ€ True ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

cuDNN

cuDNN ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ torch.backends.cudnn.deterministic ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  torch.backends.cudnn.deterministic ๋˜๋Š” torch.experimental.deterministic ๊ฐ€ True์ธ ๊ฒฝ์šฐ cuDNN์„ ๊ฒฐ์ •์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋ชฉํ‘œ

์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ ์•„ํ‚คํ…์ฒ˜์™€ ๊ตฌ์„ฑ์„ ๊ฐ€์ง„ ๋จธ์‹ ์—์„œ ์‹คํ–‰๋˜๋Š” ๋น„ํŠธ ๋‹จ์œ„ ๊ฒฐ์ •๋ก ๋งŒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, torch.experimental.deterministic ๊ฐ€ True์ธ ๊ฒฝ์šฐ์—๋„ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅผ ๋•Œ ๋น„ํŠธ ๊ฒฐ์ •๋ก ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

  • ํŒŒ์ดํ† ์น˜ ๋ฒ„์ „
  • CPU ์•„ํ‚คํ…์ฒ˜(์˜ˆ: AVX์™€ ARM์ด ์žˆ๋Š” x86)
  • GPU ์•„ํ‚คํ…์ฒ˜(์˜ˆ: AMD ๋Œ€ NVIDIA ๋˜๋Š” P100 ๋Œ€ V100)
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ(์˜ˆ: OpenBLAS ๋Œ€ MKL)
  • OpenMP ์Šค๋ ˆ๋“œ ์ˆ˜

๊ตฌํ˜„ ์ œ์•ˆ

์ด ๊ธฐ๋Šฅ์„ ๋‘ ๋‹จ๊ณ„๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” torch.backends.cudnn.deterministic ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋น„๊ฒฐ์ •์  ์ž‘์—…์— ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๋น„๊ฒฐ์ •์  ์ž‘์—…์— ๋Œ€ํ•œ ๊ฒฐ์ •์  ๊ตฌํ˜„์„ โ€‹โ€‹์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

PyTorch ๋ฌธ์„œ ์— ๋น„๊ฒฐ์ •์  ์ž‘์—…์˜ ์ผ๋ถ€ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๋ฆฐ ์งˆ๋ฌธ

torch.experimental.deterministic ๋Š” RNG ์‹œ๋“œ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜๋™ ์‹œ๋“œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์‹œ๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜๋™ ์‹œ๋“œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

cc @ezyang @gchanan @zou3519

feature high priority determinism internals triaged

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š”, ์•ž์œผ๋กœ torch.deterministic ์— ๋Œ€ํ•œ ๊ณ„ํš์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋Œ€๋‹ตํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋†’์€ ์ˆ˜์ค€์˜ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. torch.deterministic ์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๋Š” ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๊นŒ? ์ตœ์„ ์˜ ๋…ธ๋ ฅ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ ์šฉํ•œ๊ฐ€? ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ torch.deterministic ๋ฅผ ์ œ์–ด ํ•˜๋Š” ์ž‘์—…์˜ ๊ด€์ ์—์„œ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?
  2. ์ด์ œ torch.deterministic ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ณต๊ฐœ API( bmm , ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)์—์„œ deterministic= ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ?
  3. ์ด ์ž‘ํ’ˆ์˜ ์—”๋“œ๊ฒŒ์ž„์€? ์ผ๋ฐ˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋น„ํ•ด ์ด ์ค‘ ๋‹น์‹ (@kurtamohler)์€ ์–ผ๋งˆ๋‚˜ ์ž‘์—…ํ•  ์˜ˆ์ •์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ ๋‹น์‹ ์˜ ์ œํ•œ์ด ๋๋‚˜๋ฉด ํ•ฉ๋ฆฌ์ ์ธ ์ƒํƒœ๋Š” ์–ด๋–ค ๋ชจ์Šต์ž…๋‹ˆ๊นŒ?

(1)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ torch.deterministic์— ๋Œ€ํ•œ ํ˜„์žฌ ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

     r"""Sets a global flag to force all operations to use a deterministic
    implementation if available. If an operation that does not have a
    deterministic implementation is called while this setting is True, the
    operation will throw a RuntimeError.

    Note that deterministic operations tend to have worse performance than
    non-deterministic operations.

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

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด torch.deterministic์˜ ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • torch.deterministic ์€ ์ตœ์„ ์˜ ๋…ธ๋ ฅ ์ด์ง€๋งŒ, ์ผ๋ถ€ ๋น„๊ฒฐ์ •์„ฑ์„ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  • torch.deterministic์€ ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž์˜ ๋™์ž‘์„ ํ† ๊ธ€ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ ๋‹ค์Œ ํ† ๊ธ€ํ•˜๋Š” ์—ฐ์‚ฐ์ž์˜ ์ „์ฒด ๋ชฉ๋ก์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค).

๋‘ ๋ฒˆ์งธ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๋Š” (2)๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ด์ œ torch.deterministic์ด ๊ฒฐ์ •๋ก ์„ ํ† ๊ธ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์กด์žฌํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž API์—์„œ ์ง์ ‘ ๊ฒฐ์ •๋ก ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ bmm์— deterministic ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๋ฅผ ์ง์ ‘ ํ† ๊ธ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์ง€๋งŒ deterministic ๋Š” ํ•จ์ˆ˜ ์ž์ฒด์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ง€์† ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋กœ ๊ฐ€๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์˜๋ฏธ ์ฒด๊ณ„๋Š” ์‹ค์ œ๋กœ๋Š” ์‚ฌ์‹ค์ด ์•„๋‹Œ "์ด์ƒ์ ์ธ" ์˜๋ฏธ ์ฒด๊ณ„๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cc @gchanan @mruberry

๋ชจ๋“  67 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ์„œ ์œ„๋กœ ์—„์ง€์†๊ฐ€๋ฝ์ด๋‹ค. ๋ฌธ์ œ๋Š” ์ฃผ๋กœ ์ด๊ฒƒ์„ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋ชจ๋“  ๊ณณ์—์„œ ์‹ค์ œ๋กœ ๋กค์•„์›ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์œ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ์ •๋ก ์ ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„๋ฐ€๋ฆฌ์— ๊ทธ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค :)

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์ฐฌ์„ฑํ•˜๊ณ  ๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฒฐ์ •๋ก ์ด ์ผœ์ ธ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ ์ž‘์—… ๋ฐ ์˜ค๋ฅ˜์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„๊ฒฐ์ •์  ์—ฐ์‚ฐ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๊ฐ€ํ˜นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๋Š” ๋” ๋ถ€๋“œ๋Ÿฌ์šด ๊ฒฝํ—˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ throw๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹ค์ค‘ ๊ฐ’ ์†์„ฑ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋น„๊ฒฐ์ •์ ์€ ๊ดœ์ฐฎ์Œ, ๊ฒฝ๊ณ , throw).

๋‚˜๋Š” ๊ฒฝ๊ณ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‹ค์ œ๋กœ ๋ณด์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์ผค ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ฒฐ์ •์ ์ธ ๊ฒƒ์— ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๋•Œ ๊ทธ๋“ค์€ ์•„๋งˆ๋„ ์˜ค๋ฅ˜๋ฅผ ์˜ˆ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋น„๊ฒฐ์ •๋ก ์ด ์žˆ์–ด๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ๋งํ•˜๋Š” ํŠน์ • ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ๋Š” ํ•ญ์ƒ ์ด ๊ธฐ๋Šฅ์„ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜, ๊ฒฝ๊ณ , ์ ์ ˆํ•œ ๋ฌธ์„œ...
ํ›„์ž๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
๊ฒฝ๊ณ  ๋˜๋Š” ์˜ค๋ฅ˜? ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜์ง€๋Š” ๊ฒƒ์€ ๋Œ€๋‹จํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋˜์ง€๋Š” ๋Œ€์‹  ๊ฒฝ๊ณ ํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ธ๋‹ค๋Š” Adam์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์‚ผํ•ญ ํ”Œ๋ž˜๊ทธ๋ฅผ ์œ„ํ•œ ์ฃผ์š” ๋…ธ๋ ฅ์€ ํ”Œ๋ž˜๊ทธ ์ž์ฒด์ด๋ฉฐ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Context.h์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  (์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด) AT_ERROR ๋ฐ AT_CHECK๋ฅผ ๋ฟŒ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
์ด ๊นƒ๋ฐœ์— ์–ด๋–ค ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฒฐ์ •๋ก ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ํ˜„์žฌ ๋ฒ„์ „์€ ๊ณ ์ • ์‹œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ ์ •๋ฐ€๋„ 1e-16 ๊นŒ์ง€ ํ•˜๋‚˜์˜ GPU์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทน๋ฏธํ•œ ์ฐจ์ด๊ฐ€ ์ฆํญ๋˜์–ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐœ์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

multigpu์˜ ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค(์ ์–ด๋„ ๊ณ ์ •๋œ K GPU์˜ ๊ฒฝ์šฐ ๋™์ž‘์€ ๊ฒฐ์ •์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋•Œ๋•Œ๋กœ ๋ถ„ํ•ด๋˜๋Š” ์ผ์ข…์˜ ๊ฒฐ์ •๋ก ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค(nightly build 1.2.0.dev20190616 ). ๋‚˜๋Š” ์ง€๊ธˆ ๊ทธ๊ฒƒ ๋•Œ๋ฌธ์— ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ์žˆ๋‹ค( 1 , 2 ).

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@t-vi ์ด ์ผ์„ ํ™œ๋ฐœํžˆ ํ•˜๊ณ  ์žˆ๋‚˜์š”?

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@t-vi ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…ํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค. :) . ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ ๊ทน์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ์˜ 1๋…„์ด ์ง€๋‚œ ํ›„์—๋„ ๋น„๊ฒฐ์ •์  ๋ณด๊ฐ„ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)

๊ฒฐ์ •๋ก ์  ๋ณด๊ฐ„์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

~์•„์ง ๊ด‘๊ณ ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ํ• ๋‹น๋œ ๊ฐœ๋ฐœ์ž ๋ฆฌ์†Œ์Šค๋ณด๋‹ค ์‚ฌ์šฉ์ž ๊ด€์‹ฌ์ด ๋” ๋งŽ์€ ๊ฒƒ ๊ฐ™์•„์„œ ์„ค์ •ํ•  ๋•Œ ๋‚ด github ํ›„์› ํŽ˜์ด์ง€ ์—์„œ ํˆฌํ‘œํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜์—ดํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜ฌํ•ด ๋ง๊นŒ์ง€ ์ข‹์€ ์ง„์ „์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜๊ณ  ๋ณด๊ฐ„๋ฒ•์€ ํ™•์‹คํžˆ ์ˆ˜์ • ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ๋ฌธ์ œ์˜ ์–ด๋”˜๊ฐ€์— ์žˆ๋Š” fold์— ๋Œ€ํ•œ ์˜์‚ฌ ์ฝ”๋“œ์™€ ์œ ์‚ฌ). ๋‚ด ์ž์‹ ์˜ ์šฐ์„  ์ˆœ์œ„ ๋ชฉ๋ก์— ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค.~
ํฅ๋ฏธ๋กญ์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๊ฒฐ์ •๋ก ์  ๋ณด๊ฐ„์€ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งํฌ

๋ฒ”ํ•‘ ์šฐ์„  ์ˆœ์œ„, ํŠนํžˆ CUDA์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์ณ์ง€๊ณ  ์žˆ์–ด์„œ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@t-vi๋Š” ๊ณต์ •ํ•˜๊ธฐ ์œ„ํ•ด "์šฐ์„  ์ˆœ์œ„ ์ถฉ๋Œ"์ด "๊ณ ์ • ์ค‘"๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :).

์†”๋ฃจ์…˜์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!

colesbury๋Š” ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ‚ฌ๋Ÿฌ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๊ฒฐ์ •๋ก ์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ด ๊ธฐ๋Šฅ์„ ์ผค ๋•Œ ์ด๋ฅผ ๋ฐฐ์ œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ;)

torch.experimental.deterministic ๋Š” RNG ์‹œ๋“œ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜๋™ ์‹œ๋“œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์‹œ๋“œ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜๋™ ์‹œ๋“œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๋“œ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‹œ๋“œ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋‘ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ฒฐ์ •๋ก ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” RNG๋ฅผ ๋งค์šฐ ์ž˜ ์ดํ•ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค). ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด ์ž‘์—…์„ ์•ˆ์ •์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ RNG๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ torch.Generator ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ , numpy.random ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ์œ„์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฒฝ๊ณ ์— ๋Œ€ํ•ด ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: RNG๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋™์ผํ•œ ๋ชจ๋“ˆ/ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ determinism=True ์ด์ „์— ๊ฐ•์ œ๋กœ ์‹œ๋“œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?).

torch.backends.cudnn.deterministic=True ์„ค์ •ํ•  ๋•Œ ๋ณด๊ฐ„ ์—ฐ์‚ฐ์ž๊ฐ€ ์—ฌ์ „ํžˆ ๊ฒฐ์ •์ ์ผ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. pytorch ๋ณด๊ฐ„์€ cudnn์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ฐ„ ์‹คํ–‰์„ nvprofํ•˜์—ฌ ํ™•์‹คํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

torch.experimental.deterministic ๊ฐ€ ๊ตฌํ˜„๋˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ deterministic ์ธ์ˆ˜๋ฅผ ๊ณ„์† ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ผ๋ถ€ ์ž‘์—…์—๋Š” ๊ฒฐ์ •์„ฑ์„ ์„ ํ˜ธํ•˜๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์—๋Š” ์†๋„๋ฅผ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด torch.experimental.deterministic ์™€ ํ•จ์ˆ˜์˜ deterministic ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„œ๋กœ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? torch.experimental.deterministic = True ๊ฐ€ "๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๊ฒฐ์ •๋ก ์„ ์‚ฌ์šฉ"์„ ์˜๋ฏธํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ "๊ฒฐ์ •๋ก ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ deterministic ์ธ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ํŠน์ • ๊ธฐ๋Šฅ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค." ์ฆ‰, ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ์š”? ๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ torch.backends.cudnn.deterministic ํ”Œ๋ž˜๊ทธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

torch.experimental.deterministic = True
torch.some_operation(deterministic=False)

@kurtamohler ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ์ˆ˜์ •์€ bool? deterministic=None ๋กœ ๋งŒ๋“  ๋‹ค์Œ None ๋ฅผ " torch.experimental.deterministic ์กด์ค‘"์„ ์˜๋ฏธํ•˜๋„๋ก ํ•ด์„ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๊ฒƒ์„ ์ •ํ™•ํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ข…๋ฅ˜์˜ ํšŒ์„ ๊ณผ ๋น„์Šทํ•œ ์ƒํ™ฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ ๋œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„์ด์ด์—ˆ๋‹ค convolution ์•„๋‹ˆ์˜ค benchmark ๋‹ค์Œ ์ธ์ˆ˜ ๋ฐ _convolution ๋ช…์‹œ ์ ์œผ๋กœ ๊ธฐ์ค€.

์ด ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ—ˆ์šฉ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปจ๋ณผ๋ฃจ์…˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‚ด๋ถ€ deterministic ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” API๋กœ ๋ˆ„์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋‚ด๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ).

"๋‚˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ๊ฒฐ์ •๋ก ์ ์ด ๋˜๊ณ  ์‹ถ์ง€๋งŒ _์ด ํŠน์ • ์—ฐ์‚ฐ์ž์—์„œ๋Š” _ ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค."์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ๋งŽ์€ ์—ฐ์‚ฐ์ž(๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์ž)์— ์ถ”๊ฐ€ ์ž…๋ ฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์ฆํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ผ๊ณ  ํ•ด์•ผ ํ• ๊นŒ์š”? IMO์—์„œ๋Š” ๊ฒฐ์ •์„ฑ์„ ํ† ๊ธ€ํ•˜๊ธฐ ์œ„ํ•œ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@apaszke , ๋„ค, ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ •๋ก ์„ ํ† ๊ธ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์—ฐ์‚ฐ์ž์—๋„ deterministic ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ผ๋ถ€ ์—ฐ์‚ฐ์ž์—๋Š” ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  BC๋ฅผ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ณ„์† ์œ ์ง€ํ•˜๊ณ  torch.experimental.deterministic ๋ฅผ ์žฌ์ •์˜ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๋น„๊ณต๊ฐœ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์ฆ‰, ๋ฐ‘์ค„ ์ ‘๋‘์‚ฌ ๋˜๋Š” sth).

๋ณด๊ฐ„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒฐ์ •์  ๊ธฐ๋Šฅ์ด ๋‹ซํ˜€ ์žˆ๊ณ  ๊ตฌํ˜„๋˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์šฐ๋ฆฌ๋Š” PyTorch์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒฐ์ •๋ก ์  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ezyang ์–ด๋–ค pytorch ๋ฒ„์ „์— ๊ฒฐ์ •์  F.interpolate ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ? pytorch 1.6๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ตœ์‹  ์•ˆ์ • ๋ฒ„์ „(1.5)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์†Œ์Šค์—์„œ Pytorch๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ปค๋ฐ‹์€ ํ”Œ๋ž˜๊ทธ๋งŒ ์ถ”๊ฐ€ํ•  ๋ฟ ์•„์ง ์ž‘์—…์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์‹œ๊ฐ„์„ ๋‚ด์–ด ์‚ดํŽด๋ณด๊ณ  ๋‚ด๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒƒ์ด ์žˆ๊ฑฐ๋‚˜ ์ง€๊ธˆ๊นŒ์ง€ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. torch.backends.cudnn.deterministic ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ๋‚ด๋ถ€ ์ด๋ฆ„ ์ง€์ •์—๋Š” ์‹คํ—˜์  ํ•ญ๋ชฉ์ด ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ezyang , ๋„ค ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฒ ์Šต๋‹ˆ๋‹ค.

@t-vi๊ฐ€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ด์ „ ์ž‘์—…์—์„œ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ torch.experimental.deterministic_error_level ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. deterministic_error_level ๋Š” deterministic == True ์ด๊ณ  ์ฃผ์–ด์ง„ ํ•จ์ˆ˜์— ๊ฒฐ์ •์  ๊ตฌํ˜„์ด ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜/๊ฒฝ๊ณ  ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. 2(์˜ค๋ฅ˜), 1(๊ฒฝ๊ณ ) ๋˜๋Š” 0(๋ฌด์Œ)์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์žก์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ด์ฌ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋™์ž‘์— TORCH_CHECK() ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์—†๊ณ  ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. TORCH_CHECK() ํ˜ธ์ถœ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งํฌ

๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

>>> import torch
>>> try:
...     torch.experimental.deterministic_error_level=50
... except:
...     print('exception caught')
... 
terminate called after throwing an instance of 'c10::Error'
  what():  error level 50 is invalid, must be one of 0: None, 1: Warn, or 2: Error
Exception raised from longToErrorLevel at ../aten/src/ATen/Context.cpp:85 (most recent call first):
frame #0: c10::Error::Error(c10::SourceLocation, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) + 0x58 (0x7f53e2cc0878 in /work/kurtamohler/development/pytorch-deterministic-flag/torch/lib/libc10.so)
frame #1: at::Context::longToErrorLevel(long) + 0x122 (0x7f53f6d61a82 in /work/kurtamohler/development/pytorch-deterministic-flag/torch/lib/libtorch_cpu.so)
frame #2: THPModule_setDeterministicErrorLevel(_object*, _object*) + 0x31 (0x7f53fb5625d1 in /work/kurtamohler/development/pytorch-deterministic-flag/torch/lib/libtorch_python.so)
<omitting python frames>
frame #23: __libc_start_main + 0xe7 (0x7f5432d62b97 in /lib/x86_64-linux-gnu/libc.so.6)

Aborted (core dumped)

๋ˆ„๊ตฌ๋“ ์ง€ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@kurtamohler ์— THPModule_setDeterministicErrorLevel HANDLE_TH_ERRORS / END_ HANDLE_TH_ERRORS ๋งคํฌ๋กœ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? C++ ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ํŒŒ์ด์ฌ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์•„ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค, @colesbury์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

atomicAdd ์˜ ๋ชจ๋“  ํ˜ธ์ถœ์ž์—๊ฒŒ ๋น„๊ฒฐ์ •์  ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ฐœ์‹ ์ž๋Š” ํŠน์ • ๊ฒฝ์šฐ์—๋งŒ atomicAdd ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด adaptive_avg_pool3d_backward ๋Š” (isizeW%osizeW != 0) || (isizeH%osizeH != 0) || (isizeT%osizeT != 0) ๊ฐ€ true์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ฒฝ๊ณ ํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด atomicAdd ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

๋ฌด์กฐ๊ฑด ๊ฒฝ๊ณ ํ•˜๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ngimel , ์ €๋Š” CUBLAS_WORKSPACE_CONFIG ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ์ •์ ์ธ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ์™”์œผ๋ฉฐ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š” CUDA ๋ฒ„์ „(ํ˜„์žฌ 10.2 ์ด์ƒ) ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  torch.set_deterministic(True) ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด std::getenv ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CUBLAS_WORKSPACE_CONFIG ๊ฐ€ :16:8 ๋˜๋Š” :4096:8 . ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ (1) ๋˜๋Š” (2)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ€์ˆ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ผ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. putenv (Windows์˜ ๊ฒฝ์šฐ _putenv )๋กœ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์„ค๊ณ„ ๊ฒฐ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. :16:8 (์„ฑ๋Šฅ์€ ๋‚ฎ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์ ์Œ) ๋˜๋Š” :4096:8 (์„ฑ๋Šฅ์€ ๋†’์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๋งŽ์Œ)๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋น„๊ฒฐ์ •์  ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด torch.set_deterministic(False) ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์›๋ž˜ ๊ฐ’์„ ์ถ”์ ํ•˜๊ณ  ๋ณต์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•Œ๋ฆฌ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑํ‘œ๋ฅผ ์„ค์ • ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์–ด๋–ค ์˜ต์…˜์ด ๋” ์ข‹์„์ง€์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ต์…˜ (2)๋Š” ์•„๋งˆ๋„ ๋” ์‚ฌ์šฉ์ž ์นœํ™”์ ์ด์ง€๋งŒ ์˜ต์…˜ (1)๋ณด๋‹ค ๋œ ํˆฌ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๋™์•ˆ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜๋กœ pytorch ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด๋„ CUDA ์ŠคํŠธ๋ฆผ์˜ ๊ฒฐ์ •์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/pytorch/pytorch/issues/39849 ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ํ›ˆ๋ จ ํ†ต๊ณ„๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋น„๊ฒฐ์ •์  ๋™์ž‘์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ •์  ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด CUBLAS_WORKSPACE_CONFIG=:4096:8 ์„ค์ •์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. https://github.com/kurtamohler/pytorch-perf-test-scripts/blob/master/nondeterministic_alert/cuda_stream_nondeterminism.py

๊ทธ๊ฒƒ์„ ์‹คํ–‰ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฐ์ •์ ์ธ ๋™์ž‘์„ ์–ป์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ python cuda_stream_nondeterminism.py 
Before setting var: not deterministic
After setting var: not deterministic
After restoring old var: not deterministic

๊ทธ๋Ÿฌ๋‚˜ ์Šคํฌ๋ฆฝํŠธ ์™ธ๋ถ€์— ์„ค์ •๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‹คํ–‰ํ•˜๋ฉด ๊ฒฐ์ •์ ์ž…๋‹ˆ๋‹ค.

$ CUBLAS_WORKSPACE_CONFIG=:4096:8 python cuda_stream_nondeterminism.py 
Before setting var: possibly deterministic
After setting var: possibly deterministic
After restoring old var: possibly deterministic

ํ›ˆ๋ จ ๊ธฐ๋Šฅ์„ 5๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "possably deterministic"์ด ์ธ์‡„๋˜๋ฉฐ ๋™์ž‘์ด ์‹ค์ œ๋กœ ๊ฒฐ์ •์ ์ด์ง€ ์•Š๋”๋ผ๋„ ์šด์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ cuda ์ŠคํŠธ๋ฆผ์„ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ๋œ CUBLAS_WORKSPACE_CONFIG ๋ณ€์ˆ˜๋ฅผ ์ ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๋˜๋Š” ๊ทธ๊ฒƒ์ด ๋Ÿฐํƒ€์ž„์— ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์‹œ๋Š” ๋ถ„ ๊ณ„์‹œ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

with  torch.cuda.stream(torch.cuda.Stream()):

๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ ์ŠคํŠธ๋ฆผ์€ ๋ณ€๊ฒฝ๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. torch.cuda.init() ๋„ ์ฐพ์•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ cuda๊ฐ€ ์ด๋ฏธ ์ดˆ๊ธฐํ™”๋œ ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹œ๋„ํ•  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์œผ๋ฉด ์ž‘์—… ๊ณต๊ฐ„ ๊ตฌ์„ฑ์„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„ค์ •ํ•˜๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ˜„์žฌ nvcc๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์—์„œ CUDA ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ aten/src/ATen/cuda/detail/CUDAHooks.h ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(cuDNN ๋ฒ„์ „ ํ™•์ธ์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€์ž„) . ๋” ์ž˜ ์•„์‹œ๋Š” ๋ถ„ ๊ณ„์‹œ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

์œ„์˜ ์ปค๋ฐ‹์€ ์˜ค๋ฅ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด(cuda >= 10.2์ด๊ณ  CUBLAS_WORKSPACE_CONFIG ๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์ •๋˜์ง€ ์•Š์Œ) ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด torch.set_deterministic ํ…Œ์ŠคํŠธ๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด CUBLAS_WORKSPACE_CONFIG ๋ฅผ ์ž๋™์œผ๋กœ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. cuda >= 10.2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  CI ์ž‘์—…์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์ƒˆ ๊ฐ’์„ ์กด์ค‘ํ•˜๋„๋ก ํ† ์น˜ ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

>>> import torch
>>> torch.set_deterministic(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/work/kurtamohler/development/pytorch-deterministic-flag-cuda-env-var/torch/__init__.py", line 306, in set_deterministic
    _C._set_deterministic(d)
RuntimeError: To enable deterministic behavior with CUDA >= 10.2, you must set environment variable CUBLAS_WORKSPACE_CONFIG=:4096:8 or CUBLAS_WORKSPACE_CONFIG=:16:8. For more information, go to https://docs.nvidia.com/cuda/cublas/index.html#cublasApi_reproducibility
>>> import os
>>> os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
>>> from importlib import reload
>>> torch = reload(torch)
>>> torch.set_deterministic(True)

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

ํŽธ์ง‘: ๋ณ€๊ฒฝ๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด ํ† ์น˜๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ๋‹ค์‹œ ๋กœ๋“œํ•ด๋„ CUDA ๋Ÿฐํƒ€์ž„์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์ปค๋ฐ‹์€ ์ด์ „ ์˜๊ฒฌ์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. torch.set_deterministic() ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” API ํ…Œ์ŠคํŠธ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ  ํ•„์š”ํ•  ๋•Œ๋งŒ ์ž„์‹œ๋กœ CUBLAS_WORKSPACE_CONFIG=:4096:8 ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฒฐ์ •์  ํ”Œ๋ž˜๊ทธ์™€ CUBLAS_WORKSPACE_CONFIG ์„ค์ •์„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์˜ ์ƒํƒœ๋กœ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

์žฌํ˜„์„ฑ ๋ฌธ์„œ์—์„œ ๊ฒฐ์ •์  CuDNN ๋™์ž‘์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์–ธ๊ธ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ benchmark ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ torch.backends.cudnn.deterministic = True ์ž์ฒด๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

torch.is_deterministic() == True ์ด๋ฉด benchmark ๋ฅผ ๊ฐ•์ œ๋กœ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ctx.benchmarkCuDNN() ๋ฅผ at::_convolution() ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  https://github.com/pytorch/pytorch/blob/ ๋ผ์ธ์—์„œ ctx.benchmarkCuDNN() && !ctx.deterministic() ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. master/aten/src/ATen/native/Convolution.cpp#L602

์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด set_deterministic ๋ฐ CuDNN์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

torch.set_deterministic(True)
torch.backends.cudnn.benchmark = False

set_deterministic() ๋งŒ์œผ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃจ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ œ ์ƒ๊ฐ์—๋Š” ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

cc @ezyang @colesbury @t-vi @ngimel

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

๋‚ด๊ฐ€ ์ฐธ์กฐ. ๋”ฐ๋ผ์„œ ์•„๋งˆ๋„ ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ฒฐ์ •๋ก ์ด ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค ๋‚ด ๊ฒฐ์ •๋ก ๋งŒ ์ค‘์š”ํ•˜๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด torch.set_deterministic(True) ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฒค์น˜๋งˆํ‚น์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ˜„์žฌ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

PyTorch ๊ธฐ๊ณ ์ž๊ฐ€ torch.set_deterministic() ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ„ํ‚ค ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/pytorch/pytorch/wiki/How-to-support-%60torch.set_deterministic ()%60-in- PyTorch ์šด์˜์ž

๋ชจ๋“  ๊ฐœ์„  ์‚ฌํ•ญ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ "ํ˜„์žฌ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ" ์„น์…˜์ด ์ด ์œ„ํ‚ค์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ์šด github ๋ฌธ์ œ๋กœ ๋” ์ข‹์„์ง€(์œ„ํ‚ค ํŽ˜์ด์ง€์—์„œ ๋งํฌํ•  ์ˆ˜ ์žˆ์Œ) ํ™•์‹คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ์•ž์œผ๋กœ torch.deterministic ์— ๋Œ€ํ•œ ๊ณ„ํš์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋Œ€๋‹ตํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋†’์€ ์ˆ˜์ค€์˜ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. torch.deterministic ์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๋Š” ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๊นŒ? ์ตœ์„ ์˜ ๋…ธ๋ ฅ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ ์šฉํ•œ๊ฐ€? ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ torch.deterministic ๋ฅผ ์ œ์–ด ํ•˜๋Š” ์ž‘์—…์˜ ๊ด€์ ์—์„œ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ?
  2. ์ด์ œ torch.deterministic ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ณต๊ฐœ API( bmm , ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)์—์„œ deterministic= ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ?
  3. ์ด ์ž‘ํ’ˆ์˜ ์—”๋“œ๊ฒŒ์ž„์€? ์ผ๋ฐ˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋น„ํ•ด ์ด ์ค‘ ๋‹น์‹ (@kurtamohler)์€ ์–ผ๋งˆ๋‚˜ ์ž‘์—…ํ•  ์˜ˆ์ •์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ ๋‹น์‹ ์˜ ์ œํ•œ์ด ๋๋‚˜๋ฉด ํ•ฉ๋ฆฌ์ ์ธ ์ƒํƒœ๋Š” ์–ด๋–ค ๋ชจ์Šต์ž…๋‹ˆ๊นŒ?

(1)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ torch.deterministic์— ๋Œ€ํ•œ ํ˜„์žฌ ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

     r"""Sets a global flag to force all operations to use a deterministic
    implementation if available. If an operation that does not have a
    deterministic implementation is called while this setting is True, the
    operation will throw a RuntimeError.

    Note that deterministic operations tend to have worse performance than
    non-deterministic operations.

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

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด torch.deterministic์˜ ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • torch.deterministic ์€ ์ตœ์„ ์˜ ๋…ธ๋ ฅ ์ด์ง€๋งŒ, ์ผ๋ถ€ ๋น„๊ฒฐ์ •์„ฑ์„ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  • torch.deterministic์€ ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž์˜ ๋™์ž‘์„ ํ† ๊ธ€ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ ๋‹ค์Œ ํ† ๊ธ€ํ•˜๋Š” ์—ฐ์‚ฐ์ž์˜ ์ „์ฒด ๋ชฉ๋ก์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค).

๋‘ ๋ฒˆ์งธ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๋Š” (2)๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ด์ œ torch.deterministic์ด ๊ฒฐ์ •๋ก ์„ ํ† ๊ธ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์กด์žฌํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž API์—์„œ ์ง์ ‘ ๊ฒฐ์ •๋ก ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ bmm์— deterministic ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๋ฅผ ์ง์ ‘ ํ† ๊ธ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์ง€๋งŒ deterministic ๋Š” ํ•จ์ˆ˜ ์ž์ฒด์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ง€์† ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋กœ ๊ฐ€๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์˜๋ฏธ ์ฒด๊ณ„๋Š” ์‹ค์ œ๋กœ๋Š” ์‚ฌ์‹ค์ด ์•„๋‹Œ "์ด์ƒ์ ์ธ" ์˜๋ฏธ ์ฒด๊ณ„๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cc @gchanan @mruberry

@zou3519 ๋Š” https://github.com/pytorch/pytorch/pull/38683#issuecomment -662590937์—์„œ๋„ Q์™€ ๊ต์ฐจํ–ˆ์Šต๋‹ˆ๋‹ค.

@ezyang , @zou3519 , ํ•ด์ฃผ์…”์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ฌธ์„œ๊ฐ€ ํ˜„์žฌ ์ƒํƒœ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ํ‘œํ˜„์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” torch.set_deterministic() ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ฒ ์ €ํ•˜๊ฒŒ ๋‚˜์—ดํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฑฐ์ง“๋ง์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. @zou3519, 1.6.0์— ์ถ”๊ฐ€ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

deterministic ์„ค์ •์„ ์ง์ ‘ ํ•จ์ˆ˜ ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

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

์žฅ๊ธฐ์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ธฐ๋Šฅ์˜ ์ „์ฒด ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์œ ํšจํ•œ ๊ฒฐ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ „๋žต๋งŒ์œผ๋กœ๋Š” ๊ฒฐ์ •์  ํ”Œ๋ž˜๊ทธ์˜ ์œ ์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด (ํ•˜๋‚˜์˜ ํŠน์ • ํ™˜๊ฒฝ์—์„œ) ๊ธฐ๋Šฅ์„ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฒฐ์ •๋ก ์ 
  2. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๊ฒฐ์ •์ ์ด์ง€๋งŒ ๊ฒฐ์ •์  ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(์˜ค๋ฅ˜ ๋˜๋Š” ๋Œ€์ฒด ๊ตฌํ˜„).
  3. ๋น„๊ฒฐ์ •์ ์ด๋ฉฐ ๊ฒฐ์ •์  ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ๋Š” ๋ฒ”์ฃผ 3์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ๋ฒ”์ฃผ 2 ๊ธฐ๋Šฅ ๋ชฉ๋ก์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์นดํ…Œ๊ณ ๋ฆฌ 3 ๊ธฐ๋Šฅ์€ ์ƒ๋‹นํ•œ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ณ„์† ์กด์žฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ๋ชจ๋“  ๊ธฐ์—ฌ์ž๊ฐ€ ๊ฒฐ์ •๋ก ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์ปค๋ฐ‹์ด ์‹ค์ˆ˜๋กœ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฐ์ •๋ก ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ). ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋ฒ”์ฃผ 2 ๊ธฐ๋Šฅ์˜ ์™„์ „ํ•œ ๋ชฉ๋ก์ด ์žˆ๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋Š” ๋ชฉ๋ก์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ๊ฒฐ์ •์ ์ธ์ง€ ์—ฌ๋ถ€(๋ฒ”์ฃผ 1 ๋˜๋Š” 3์ผ ์ˆ˜ ์žˆ์Œ)๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, torch.add ๋Š” ๋ชฉ๋ก์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์ด ๊ฒฐ์ •์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋˜ํ•œ ๊ฐ ๊ธฐ๋Šฅ๊ณผ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋ชจ๋ฅด๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์งˆ๋ฌธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ”Œ๋žซํผ์—์„œ ๋ชจ๋“  ๋ฒ”์ฃผ 2 ๋ฐ 3 ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ •์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด ํ…Œ์ด๋ธ”์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์ž๋™์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ์„ ํ•ด๋ณด๋ฉด ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๊ฐ€ ๊ฐ€์น˜๋ณด๋‹ค ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์‹ค์šฉ์ ์ธ ๊ณ„ํš์€ ๋น„๋ก ๋œ ์ด์ƒ์ ์ด๋”๋ผ๋„ ํ›จ์”ฌ ๋” ์ง€์† ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

torch.add ๊ฒฐ์ •์ ์ž…๋‹ˆ๊นŒ?

import torch
n = 512
device = 'cuda'
a = torch.arange(n**3, device=device, dtype=torch.float32)
a = a.reshape((n, n, n))
b = torch.arange(n**3, device=device, dtype=torch.float32)
b = b.reshape((n, n, n))
out_zero = torch.zeros((n, n, n), device=device)
out_zero = out_zero.set_(out_zero.storage(), storage_offset=0, size=a.size(), stride=(1,1,1))
out_one = torch.zeros((n, n, n), device=device)
out_one = out_one.set_(out_one.storage(), storage_offset=0, size=a.size(), stride=(1,1,1))

torch.add(a, b, out=out_zero)
torch.add(a, b, out=out_one)
(out_zero == out_one).all()
: tensor(False, device='cuda:0')

๊ฒน์นœ ํ…์„œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” ๊ฒฐ์ •๋ก  ๊ณ„์•ฝ์„ ์œ„๋ฐ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ฒฐ์ •์ ์ธ ๋ฒ„์ „์˜ ์ž‘์—… ์š”์ฒญ( use_deterministic ?)
  • ์ž‘์—…์ด ๋น„๊ฒฐ์ •์ ์ผ ๊ฒฝ์šฐ ๊ฒฝ๊ณ 

๋จผ์ € ํ”Œ๋ž˜๊ทธ๋Š” ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ๋Š” ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. oneDNN, cuDNN ๋ฐ MAGMA์™€ ๊ฐ™์€ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ž‘์—…์ด ํŠนํžˆ ๋ฒ„์ „ ๋ฐ ํ•˜๋“œ์›จ์–ด ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ฒฐ์ •์ ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋งํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ์ ์ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. @kurtamohler, ์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€์žฅ ์ž˜ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋„ค์ดํ‹ฐ๋ธŒ ๋น„๊ฒฐ์ •์  ์—ฐ์‚ฐ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๊ณ  ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋„ ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ํ”„๋กœ์„ธ์Šค๋‹น ํ•œ ๋ฒˆ ๊ฒฝ๊ณ ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋ฐฉํ•ด๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ณ ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฒ€ํ† ํ•˜๊ณ  ์‚ฌ์ดํŠธ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜์ง€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ฒฐ์ •์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฐจ๋‹จํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

(์„ธ ๋ฒˆ์งธ ๋…ผ์˜ ์ค‘์ธ ๊ฒƒ์€ ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ์„ ์ œ์‹œํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ(๊ธ€๋กœ๋ฒŒ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ๋˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ kwargs๋กœ) ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ๊ณ„ํš์„ ๊ฒฐ์ •ํ•  ๋•Œ๊นŒ์ง€ ๋…ผ์˜๋ฅผ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ์™„์ „ํ•œ ๊ฒƒ์„ ์„ ์˜ ์ ์œผ๋กœ ๋‘์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. PyTorch์—์„œ self-overlapping tensor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ธ์ œ 100% ์•ˆ์ „ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ ์ธ์ƒ์€ ๋ณดํ†ต ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํฌ๋Ÿผ์—์„œ ๋‚ด๊ฐ€ ๋ฐ›์€ ์ธ์ƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ๋‹ค๋ฅธ ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์–ป๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ์ด์œ ๋Š” PyTorch์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ atomicAdd๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ด์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ถ๊ธˆํ•ดํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ ˆ๋ฐ˜์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ๋Š” ๋’ค๋กœ ์—…์Šค์ผ€์ผ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ด€ํ•œ ํ•œ ์ตœ์„ ์˜ ๋…ธ๋ ฅ์ด๋ฉฐ ๋ฌธ์ œ๋ฅผ ์•Œ๊ฒŒ ๋˜๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋ถ„๋ช…ํžˆ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์ธ์ƒ์€ ์šฐ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ปค๋„์ด ์‹ค์ œ๋กœ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

PyTorch์—์„œ self-overlapping tensor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ธ์ œ 100% ์•ˆ์ „ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ ์ธ์ƒ์€ ๋ณดํ†ต ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๊ทธ๋ฆฌ๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ถ„๋ฅ˜๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ. ๋‚˜๋Š” ๋‹จ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์ด ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•ด ์ œ์‹œํ•œ ๊ณ„์•ฝ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜€์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ด€ํ•œ ํ•œ ์ด๊ฒƒ์ด ์ตœ์„ ์˜ ๋…ธ๋ ฅ์ด๋ฉฐ ๋ฌธ์ œ๋ฅผ ์•Œ๊ฒŒ ๋˜๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ๋ฐํ˜€์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

๋ฌธ์„œ๋Š” "๋น„๊ฒฐ์ •์ ์ด๋ผ๊ณ  ์•Œ๋ ค์ง„ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ถœ..."๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@t-vi์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(๋ณด๊ณ ๋œ ๋น„๊ฒฐ์ •๋ก ์˜ ์ ˆ๋ฐ˜์ด ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์—…์Šค์ผ€์ผ๋ง๋œ๋‹ค๋Š” ๊ด€์ฐฐ์ด ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค). ํŠนํžˆ, ๋น„๊ฒฐ์ •์ ์ด๋ผ๊ณ  ์•Œ๋ ค์ง„ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ฌธ์„œํ™”ํ•œ ์ƒํƒœ(๋˜๋Š” ์ผ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋ก ์ ์ด๋ผ๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ ๋ฌธ์„œํ™”ํ•œ ์ƒํƒœ)๊ฐ€ ์•„๋ฌด๋Ÿฐ ํ‘œ์‹œ๋„ ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ณด๋‹ค ์—„๊ฒฉํ•˜๊ฒŒ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ง€์›ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ฒฐ์ •๋ก ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ํ™œ๋™์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋น„๊ฒฐ์ •์  API์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ์ง๊ต ํ™œ๋™์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์•„์ด๋””์–ด๊ฐ€ ๋– ๋Œ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ƒ๊ฐ์„ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. "์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ 3 ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค." ์ด๊ฒƒ์€ ๋งŽ์€ ์ž‘์—…์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฒฐ์ •๋ก ์— ๋Œ€ํ•œ ์กฐ์ •์„ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“  ํ•จ์ˆ˜์—๋งŒ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„ ๊ฒฐ์ •๋ก ์  ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜).
  2. "์šฐ๋ฆฌ๋Š” ์ž ์žฌ์ ์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” CI ์ž‘์—…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค." ์ด์™€ ๊ฐ™์€ ์ž‘์—…์€ ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋น„๊ฒฐ์ •์  ํ…Œ์ŠคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ์ •๋ก  ํ…Œ์ŠคํŠธ ์ž์ฒด๊ฐ€ "๋น„์ •์ƒ์ "์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋•Œ๋กœ๋Š” ํ†ต๊ณผํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ ์‹คํŒจํ•จ) . ๋‹น์‚ฌ์˜ CI ๋ณด๊ณ  ๋„๊ตฌ๋Š” ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  3. "๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ๋Š” ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. oneDNN, cuDNN ๋ฐ MAGMA์™€ ๊ฐ™์€ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ž‘์—…์ด ํŠนํžˆ ๋ฒ„์ „๊ณผ ํ•˜๋“œ์›จ์–ด ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ฒฐ์ •๋ก ์ ์ธ์ง€ ๋งํ•˜๊ธฐ ์–ด๋ ค์šด์ง€ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค." ์šฐ๋ฆฌ๋Š” ์ตœ์„ ์„ ๋‹คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒฝ์šฐ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฌธ์„œ์—์„œ ๊ฒฐ์ •๋ก ์ ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ๋ฌธ์„œ์—์„œ ๋งํ•˜๋Š” ๋‚ด์šฉ์„ ์ถฉ์‹คํ•˜๊ฒŒ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. "์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋„ค์ดํ‹ฐ๋ธŒ ๋น„๊ฒฐ์ •์  ์—ฐ์‚ฐ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๊ณ  ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ถœ์ด ์žˆ์„ ๋•Œ ๊ฒฝ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?" ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋น„๊ฒฐ์ •๋ก ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•  ๋•Œ, ๊ทธ๊ฒƒ์€ ๋น„๊ฒฐ์ •๋ก ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ง€๋‚˜์น˜๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ต์ฐจ ๋ฒ„์ „/ํ•˜๋“œ์›จ์–ด ๊ฒฐ์ •๋ก ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋น„๊ฒฐ์ •๋ก ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•  ๋•Œ, ๊ทธ๊ฒƒ์€ ๋น„๊ฒฐ์ •๋ก ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ง€๋‚˜์น˜๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋‚ด ๋น„๊ฒฐ์ •๋ก ์˜ ๊ทผ์›์ด๋ผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ๋ฅผ ๊ทธ๋“ค์˜ ๋น„๊ฒฐ์ •์  ์†์ž„์ˆ˜์— ์—ฐ๋ฃจ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด ๋‹น์—ฐํžˆ ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€๋„ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ;)

ํ”Œ๋ž˜๊ทธ API๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@kurtamohler ๋ฉ‹์ง„ ์ž‘ํ’ˆ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

torch.manual_seed(111) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ interpolation ์ž‘์—…์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์„ ๊ฒฐ์ •์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๊นŒ?

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

ํŠนํžˆ ๋ณด๊ฐ„์€ ์—ญ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ๋ณต์žกํ•˜์ง€ ์•Š์€ ์ปค๋„์„ ์ž‘์„ฑํ•˜์—ฌ ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

@t-vi ์•ˆ๋…•ํ•˜์„ธ์š”, ์ด์ œ pytorch 1.7์ด ์ถœ์‹œ๋˜๊ณ  ๋ณด๊ฐ„ ์—ญ๋ฐฉํ–ฅ ์ปค๋„์ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ CUDA ์—…์ƒ˜ํ”Œ๋ง ์ปค๋„๊ณผ ์—ญ๋ฐฉํ–ฅ์€ aten/src/ATen/native/cuda/UpSample* ์žˆ์Šต๋‹ˆ๋‹ค. grep์€ ์„ ํ˜•, ์Œ์„ ํ˜•, 3์ฐจํ˜•์ด ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๋น„๊ฒฐ์ •์ (๊ฒฝ๊ณ  ํ‘œ์‹œ๊ฐ€ ์žˆ์Œ)์„ ๊ฐ–์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์€ ๊ทธ๋ ‡์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
@kurtamohler ๊ฐ€ ํ›จ์”ฌ ๋” ๋‚˜์€ ์‚ฌ๋žŒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰