Pytorch: ๋ณต์žกํ•œ ํ…์„œ ํ†ตํ•ฉ

์— ๋งŒ๋“  2017๋…„ 02์›” 16์ผ  ยท  128์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pytorch/pytorch

@ezyang ์˜ ์ƒˆ๋กœ์šด ์„ค๋ช…:

์ž‘์—…์€ https://github.com/Roger-luo/pytorch-complex ์—์„œ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์กฐ์ง ์›์น™

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

    • PyTorch๋Š” ๋•Œ๋•Œ๋กœ C++ API์—์„œ ์ค‘๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ €ํฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ด์— ํ•„์š”ํ•œ ํ›„ํฌ๋Š” PyTorch 1.0๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š์ง€๋งŒ ๋ฉ€์ง€ ์•Š์€ ๋ฏธ๋ž˜์— PyTorch์˜ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์ปค๋„์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘์—…ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์•ˆ์ •์ ์ธ ์ƒํƒœ์—์„œ ์›Œํฌํ”Œ๋กœ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

PyTorch๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณต์žกํ•œ dtype์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PyTorch๋Š” ๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” torch.complex64 ๋ฐ torch.complex128์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ…์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ PyTorch์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

>>> torch.zeros({2,2}, dtype=torch.complex64)
RuntimeError: complex64 not supported by PyTorch

@ezyang ์€ ์ด๋Ÿฌํ•œ dtypes๋ฅผ PyTorch์— ์ถ”๊ฐ€ํ•˜๋Š” ํŒจ์น˜๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/pytorch/pytorch/pull/11173

์ค‘๊ฐ„์— PyTorch์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ(์˜ˆ: 0์˜ ํ…์„œ ํ• ๋‹น)์— ๋Œ€ํ•œ ์ง€์›์„ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ง€์›์ด "๊ธฐ๋ณธ"์ธ์ง€์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ํ”„๋ก์‹œ๋Š” CPU ํ•˜ํ”„ ํ…์„œ(๊ทน๋„๋กœ ๋นˆ๊ณคํ•œ)์— ๋Œ€ํ•œ PyTorch์˜ ๊ธฐ๋ณธ ์ง€์›์ž…๋‹ˆ๋‹ค.

PyTorch๋Š” ๋ณต์žกํ•œ ํ…์„œ ๊ตฌํ˜„์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ TypeDefault ํด๋ž˜์Šค(https://github.com/pytorch/pytorch/pull/11013)์—์„œ ์ƒ์†๋˜๋ฉฐ ์ด ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ๋ณต์žกํ•œ ๊ตฌํ˜„์ด ์žˆ๋Š” ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

struct CPUComplexFloatType final : public TypeDefault {
  virtual Tensor add(const Tensor & self, const Tensor & other, Scalar alpha=1) const override {
    // Your implementation of add for complex tensors
  }
  // ...
}

์ด ํด๋ž˜์Šค๋Š” ๋ณตํ•ฉ์— ๋Œ€ํ•ด ์ง€์›๋˜๋Š” ์œ ํ˜•์„ ์ •ํ™•ํžˆ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ตฌํ˜„์€ TypeDefault์—์„œ ์ œ๊ณต๋˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

PyTorch ์†Œ์Šค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ฒดํฌ์ธ๋˜๋Š” ์ž๋™ ์ƒ์„ฑ ํŒŒ์ผ๋กœ Type(์ „์ฒด ์ธํ„ฐํŽ˜์ด์Šค)์—์„œ ์ง€์›๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์ •์‹ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์— diff๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ๋Š” PyTorch ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ํ•ด๋‹น ์ด๋ฆ„๊ณผ ์ผ๋Œ€์ผ ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์•„์ง ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

๊ฒฝ๊ณ : ์ƒˆ๋กœ์šด ์ž‘์—…์˜ ๊ณต๊ฐœ ๋“ฑ๋ก๋„ ์ง€์›ํ•˜๋Š” ์ƒˆ ์‹œ์Šคํ…œ์œผ๋กœ Type์„ ๋ฆฌํŒฉํ† ๋งํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค(์ง€์›ํ•˜๋ ค๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋‹จ์ผ ์ˆ˜ํผํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ถ„๋ช…ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ Type์„ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ์ž‘์„ฑํ•˜๋Š” ํŠน์ • ๊ตฌํ˜„ ์ „๋žต์— ๋„ˆ๋ฌด ์–ฝ๋งค์ด์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ƒˆ๋กญ๊ณ  ๋ณต์žกํ•œ ์ „์šฉ ์ž‘์—…์„ ๊ฒŒ์‹œํ•˜๋ ค๋ฉด C++ ํ™•์žฅ API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. C++ ํ™•์žฅ API๋Š” https://pytorch.org/tutorials/advanced/cpp_extension.html ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ C++ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

at::Tensor imag(at::Tensor z) {
  ...
}

๊ทธ๋Ÿฐ ๋‹ค์Œ C++ ํ™•์žฅ API๋Š” Python ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ Python์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ž‘์—…์€ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” PyTorch์— "์‰ฝ๊ฒŒ" ํ†ตํ•ฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ง„ ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด BinaryOpsKernel.cpp์—์„œ add_kernel์„ ํ™•์žฅํ•˜์—ฌ ๋ณตํ•ฉ ์œ ํ˜•์— ๋Œ€ํ•ด ๋””์ŠคํŒจ์น˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒจ์น˜๊ฐ€ ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๊ฒฝ์šฐ ์ ์‹œ์— ๋ณ‘ํ•ฉํ•  ๊ฒƒ์„ ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  Type์— ์žฌ์ •์˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ž์œ ๋กญ๊ฒŒ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ•ญ์ƒ ์ฐจ๋‹จ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‰ฌ์šธ ๋•Œ ํ”ผํ•˜์ž!

์˜คํ† ๊ทธ๋ผ๋“œ. ์ด๋ฏธ ํŒŒ์ƒ ๊ณต์‹์ด ์ •์˜๋˜์–ด ์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๋Š” ํ•œ Derivatives.yaml์—์„œ ์—ญ๋ฐฉํ–ฅ ๊ตฌํ˜„์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•œ autograd ์ง€์›์„ "์ž๋™์œผ๋กœ" ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. .

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ณต์†Œ์ˆ˜์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋„๋ก autograd ๊ณต์‹์„ ์กฐ์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 'abs'์˜ ๊ธฐ์šธ๊ธฐ๋Š” 'grad'๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. self.sign()'. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ 'abs'์˜ autograd ๊ณต์‹์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ 'abs_backward'๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์—…์ŠคํŠธ๋ฆผ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ณต์†Œ์ˆ˜ ์—ญ์ „ํŒŒ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Akira์˜ "๋ณตํ•ฉ ๊ฐ€์น˜ ์‹ ๊ฒฝ๋ง".
  2. https://giggelliu.github.io/2018/02/01/complex_bp.html

์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ˆ˜ ํ•จ์ˆ˜(์†์‹ค)์˜ ๋„ํ•จ์ˆ˜๋งŒ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ autograd๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์—…๋ฌด ๊ณ„ํš

์˜ค๋Š˜๋‚  ํ•„์š”ํ•œ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ œ์ž๋ฆฌ์— ์žˆ์ง€๋งŒ ์ข…๋‹จ ๊ฐ„ ๋ฐฉ์‹์œผ๋กœ ์กฐ๋ฆฝ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค.

  • [X] ์‹ค์ œ ifdef๊ฐ€ ์•„๋‹Œ Codemod TH https://github.com/pytorch/pytorch/pull/11163
  • [X]torch.complex64 ๋ฐ torch.complex128 dtypes์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›. https://github.com/pytorch/pytorch/pull/11173
  • [X] dtype=torch.complex64๋กœ ๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ํ…์„œ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ด ๊ตฌํ˜„์ด ํ˜ธ์ถœ๋˜๋„๋ก CPUComplexType ๋“ฑ์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • [X] ํ† ์ง€ https://github.com/pytorch/pytorch/pull/11013
  • [X] libtorch์— ๋Œ€ํ•ด ๋งํฌ๋˜๊ณ  ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ํ…์„œ ํ• ๋‹น์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ณ„๋„๋กœ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅํ•œ C++ ํ”„๋กœ๊ทธ๋žจ์˜ ์ž‘๋™ ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ํฌํ•จํ•œ ์ข…๋‹จ ๊ฐ„ ์˜ˆ์ œ.

๋‹จ๊ธฐ ํ†ตํ•ฉ ๊ณ„ํš. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ "์‰ฝ๊ฒŒ" ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ PyTorch์—์„œ ๋ฉ”์ธ๋ผ์ธ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • [X] ๊ธฐ๋ณธ ํ…์„œ ํŒฉํ† ๋ฆฌ: torch.empty, torch.zeros, torch.ones
  • [ ] CPU ๋ฐ”์ด๋„ˆ๋ฆฌ ์—ฐ์‚ฐ: add, sub, mul, div #11641
  • [ ] FFT
  • [ ] ???

์ปค๋„ ๊ตฌํ˜„:

TODO: https://github.com/Roger-luo/TH/blob/master/ChangeLog.md ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชฉ๋ก ์ƒ์„ฑ

๊ธฐํƒ€ ๋ณต์žกํ•œ ๊ด€๋ จ ์ž‘์—…:

  • [ ] ๋ณต์žกํ•œ ํ…์„œ์— ๋Œ€ํ•œ ์œ ํ˜• ์Šน๊ฒฉ ๊ทœ์น™์„ ํŒŒ์•…ํ•˜๊ณ  ์ด๊ฒƒ์„ PromoteTypes #11641์— ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์—ญ์‚ฌ์  ์ด์Šˆ ์ฝ˜ํ…์ธ 

@PhilippPelz ์˜ ์›๋ž˜ ๋Œ“๊ธ€

๋ณต์žกํ•œ ํ…์„œ๋ฅผ pytorch์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
CPU ์ง€์›์„ ์œ„ํ•ด ztorch๊ฐ€ ์žˆ์œผ๋ฉฐ ์–ผ๋งˆ ์ „์— z-cutorch( https://github.com/PhilippPelz/z-cutorch )๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. CudaHalfTensor์— ๋Œ€ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ด์ „์˜ ํฌํฌ ์˜คํ”„ ์ปท์ž…๋‹ˆ๋‹ค(์•„์ง ํ•˜๋“œ์›จ์–ด๊ฐ€ ์—†์Œ).
์ผ์ด ๋งŽ์ง€ ์•Š๋‹ค๋ฉด ์ฒœ์ฒœํžˆ pytorch์™€ ํ†ตํ•ฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” fb.ptyhon์„ ํ†ตํ•ด ํ”Œ๋กœํŒ…ํ•˜๊ธฐ ์œ„ํ•ด matplotlib๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ์„ ๋‹ค์‹œ ์„ค์น˜ํ•  ๋•Œ๋งˆ๋‹ค(๋ชจ๋“  ์ข…์†์„ฑ ์ปดํŒŒ์ผ) ์—„์ฒญ๋‚œ ๊ณ ํ†ต์ด ๋”ฐ๋ฅด๋ฉฐ ๋‚ด ์‹คํ—˜์šฉ PC ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋˜๋Š” Windows์—์„œ pytorch๊ฐ€ ๊ณง ์ž‘๋™ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋ณต์žกํ•œ ๊ทธ๋ผ๋””์–ธํŠธ๋„ ํ•„์š”ํ•˜๋ฏ€๋กœ ์กฐ๋งŒ๊ฐ„ autograd๋„ ๋งŒ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
tf๋Š” ์ž์ฒด์ ์œผ๋กœ ๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ๋งŽ์€ ์ž‘์—…์—์„œ ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(https://github.com/tensorflow/tensorflow/issues/2255). ๊ฒŒ๋‹ค๊ฐ€ ์ œ ๋ชฉ์ ์—๋Š” ์•ฝ๊ฐ„ ๋ฌด๊ฑฐ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ™˜์˜ํ•  ๋งŒํ•œ ์•„์ด๋””์–ด๋ผ๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ„์น˜์— ๋Œ€ํ•ด ๋ช‡ ๋งˆ๋”” ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

feature complex triaged

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

@sunilkpai , @boeddeker , @Randl ,

๋ณต์žกํ•œ ํŒŒ์ƒ ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋”ฐ๋ฅด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๊ณ  ๋‚˜๋Š” ๋‹ค์Œ ์ฃผ์— ์ด๊ฒƒ์„ ๋‹ค์‹œ ํ•  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณต์†Œ์ˆ˜์˜ ์ƒํƒœ๋Š” ๋น„๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋ฉฐ PyTorch ํ™•์žฅ์„ ํ†ตํ•ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ํ™•์žฅ์—๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ํ•„์š”ํ•œ ์ˆ˜ํ•™ ์ปค๋„ ๋“ฑ๋ก์ด ํฌํ•จ๋œ .cpp .
  • pytorch ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์˜ ๋งค์šฐ ๋‹จ์ˆœํ™”๋œ ๋ฒ„์ „์ด ํฌํ•จ๋œ test/ ํด๋”.
    ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ง€์›๋˜๋Š” ์ปค๋„๊ณผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ปค๋„์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์ฝ˜์†”์— ์ธ์‡„ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • Tensor python ๊ฐ์ฒด์—๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋Š” ์˜ˆ์œ ์ธ์‡„ ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • tensor.py ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ธ์‡„ ํ˜•์‹์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋˜๋Š” ๊ฐ„๋‹จํžˆ Pytorch ํ…์„œ๋ฅผ Numpy ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ƒํƒœ:

  • CPU ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ์ƒ๋‹นํžˆ ์ข‹์Šต๋‹ˆ๋‹ค.

    • ์ปค๋„์€ 'aten/src/ATen/native/cpu/ </li> <li>Complex number specific code is under 'aten/src/ATen/native/cpu/zmath.h ์•„๋ž˜ PyTorch ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

    • Intel AVX256 ๊ฐ€์†์€ 'aten/src/ATen/cpu/vec256/' ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.



      • @sunilkpai : exp ์ตœ์ ํ™”๋ฅผ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•œ ํด๋”์ž…๋‹ˆ๋‹ค.


      • ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜์‹ ์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.



  • GPU ์ ์šฉ ๋ฒ”์œ„๋Š” ์ด์ง„ ๋ฐ ๋‹จํ•ญ ์—ฐ์‚ฐ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

    • ์ปค๋„์€ 'aten/src/ATen/native/cuda/* </li> <li>Complex number specific code is under 'aten/src/ATen/native/cuda/zmath.cuh ์•„๋ž˜ PyTorch ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

    • thrust::complex<T> ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์‚ฌ์šฉ๋˜๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ์ตœ์ ํ™”๋œ ์ปค๋„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ฐœ๋ฐœ:

  • C ๊ธฐ๋ฐ˜ TH ์ปค๋„์ด C++ Aten ํด๋”๋กœ ์ด์‹๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • rand() ํ•จ์ˆ˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ pytorch์˜ ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ๋กœ ์ด์‹ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ์ผ๋ถ€ ์ธ๋ฑ์‹ฑ ์ž‘์—…์€ ํ˜„์žฌ ์ด์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ํ˜„์žฌ TH์—์„œ ATen์œผ๋กœ ์ด์‹ํ•ด์•ผ ํ•˜๋Š” 168/1300 ์ˆ˜ํ•™ ์ปค๋„(10์›” 230์—์„œ ๊ฐ์†Œ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์ปค๋„์„ ATen์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ๋ณต์†Œ์ˆ˜ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

--

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

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

๋ณต์žกํ•œ ์œ ํ˜•์„ ์ปดํŒŒ์ผํ•˜๋Š” TH๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Python ํ†ตํ•ฉ์„ ์œ„ํ•ด ๋ฌด์—‡์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@PhilippPelz ๋Š” https://github.com/facebook/ztorch/tree/master/lib/THZ ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ณต์žกํ•œ ์œ ํ˜•์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ž์ฒด TH ํฌํฌ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๊นŒ?

@killeent ๋Š” TH๊ฐ€ Python์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฉ”๋ชจ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ Tensor๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ํ…Œ์ŠคํŠธ ๋“ฑ์ด ์žˆ์œผ๋ฏ€๋กœ THZ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋ณต์žกํ•œ Tensor๋ฅผ ์œ„ํ•œ CUDA ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ํž˜๋“  ์ผ์ด์ง€๋งŒ ์•„์ง ์‹œ์ž‘๋„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ผ๋งˆ ์ „์— z-cutorch( https://github.com/PhilippPelz/z-cutorch )๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. CudaHalfTensor์— ๋Œ€ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ด์ „์˜ ํฌํฌ ์˜คํ”„ ์ปท์ž…๋‹ˆ๋‹ค(์•„์ง ํ•˜๋“œ์›จ์–ด๊ฐ€ ์—†์Œ).

์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฏธ ๋งŽ์€ ๋…ธ๋ ฅ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :)

@soumith ๋‚˜๋Š” ๋ณต์žกํ•œ ์œ ํ˜•์œผ๋กœ TH๋ฅผ ํฌํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ THGenerateComplexTypes.h + ์ถ”๊ฐ€๋œ BLAS + LAPACK ๋ฃจํ‹ด ๋‚˜๋จธ์ง€๋Š” ๊ฑฐ์˜ ๋ฌด๋ฃŒ์˜€์Šต๋‹ˆ๋‹ค. THZ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ํ˜ธํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•œ ๋‹ค์Œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์ˆ˜์›”ํ•ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ง€๊ธˆ THPP๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

/home/philipp/projects/pytorch/torch/lib/tmp_install/include/TH/generic/THBlas.h:6:40: ์˜ค๋ฅ˜: '*' ํ† ํฐ ์•ž์— ',' ๋˜๋Š” '...'๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
TH_API ๋ฌดํšจ THBlas_(swap)(long n, real *, long incx, real *, long incy);

์กฐ๊ธˆ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ ํ†ตํ•ฉ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. CUDA ๋ฐฑ์—”๋“œ๋Š” ๋Œ€๋ถ€๋ถ„ z-cutorch์—์„œ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@PhilippPelz ๋Š” PyTorch ๋žฉ TH์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. https://gist.github.com/killeent/4675635b40b61a45cac2f95a285ce3c0

@killent ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋งค์šฐ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. lib/build_all.sh๊ฐ€ ์ด์ œ ์ปดํŒŒ์ผ ์ค‘์ž…๋‹ˆ๋‹ค. csrc ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‹ค์Œ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ† ์น˜๋ฅผ th๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ
numpy๋ฅผ np๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

a = np.array([1+1j,2+2j])
b = np.array([3+3j,4+4j])
ath = th.from_numpy(a)
bth = th.from_numpy(b)
ath_cuda = ath.cuda()
ath_cuda += bth.cuda()
ath = ath_cuda.cpu()
์ธ์‡„(ath.numpy())

์•„์›ƒ: [ 4.+4.j 6.+6.j]

๋Œ€๋ถ€๋ถ„์˜ ์ˆ˜ํ•™ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜
๋‚˜๋Š” ๋‹ค์Œ ์ฃผ์— ํŽธ์˜ ๊ธฐ๋Šฅ๊ณผ fft๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ…์„œ์— ๊ด€์‹ฌ์ด ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์— ๊ธฐ๊บผ์ด ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋…ผ๋ฌธ์ด ๋– ์˜ค๋ฆ…๋‹ˆ๋‹ค: Deep Complex Networks , ์•„๋งˆ๋„ ๊ทธ ์‚ฌ๋žŒ๋“ค์ด ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ˜ผ์ž์„œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค.

@PhilippPelz ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ตฌํ˜„์„ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋จผ์ € ger ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ ํ—ค๋”์—์„œ GER๋ฅผ zger_ ๋ฐ cger_ ๋กœ ์ •์˜ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ผ๋ถ€ ๋ณต์žกํ•œ blas ํ•จ์ˆ˜๋Š” THBlas.c์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ ์ผ๋ฐ˜/THBlas.c์—๋Š” cger_๊ฐ€ ์žˆ๋Š” blas ํ•จ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. . ํ•˜์ง€๋งŒ gemv ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  IMO๋Š” .gitignore์— .gch๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ• ๊นŒ์š”? ๋ชจ๋“  ํ™•์žฅ์„ ํฌํฌ๋กœ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๊นŒ? ๋จผ์ € ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋งˆ์Šคํ„ฐ์—๊ฒŒ ํ’€ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  DOT ์˜ ๊ฒฝ์šฐ ๋ณต์žกํ•œ ๋ฒกํ„ฐ์˜ ๊ฒฝ์šฐ ์ ์— ๋Œ€ํ•œ dotc ๋ฃจํ‹ด์ด ๋” ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ TH์— ๋Œ€ํ•œ ์ด์ „ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ…Œ์ŠคํŠธ๋Š” ์–ด๋””์— ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” ์šฐ๋ฆฌ๋Š” ์•ฝ๊ฐ„์˜ ํŒŒ์ด์ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํ‘ธ์‹œํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์›”์š”์ผ์— ๋‹ค์‹œ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์„ ์–ธ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. zger์™€ cger

DOT์˜ ๊ฒฝ์šฐ cdotc ๋ฐ zdotc๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฃผ์— ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์„ ํ˜ธํ•˜๋Š” ์ด๋ฆ„์„ pytorch ์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ฒ„์ „์„ ๋” ์ข‹์•„ํ•˜์ง€๋งŒ ์•„์ง ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ˆ, ํŒŒ์ด์ฌ์€ ์ˆ˜ํ•™ ๋ฌธ์ œ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. compelx ๋ฒˆํ˜ธ ๊ฒ€์‚ฌ๋„ ํฌํ•จํ•˜๋„๋ก ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ๋‹น์‹ ๋„ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. TH blas ๋ฃจํ‹ด์€ ์ด์ œ ๋ณต์žกํ•œ

@PhilippPelz ๋ฐฉ๊ธˆ ๊ท€ํ•˜์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— pull ์š”์ฒญ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์„ ํ˜• ๋ ˆ์ด์–ด ๋ฐ ๊ธฐํƒ€ ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ. ๋งŽ์€ hermitian ์—ฐ์‚ฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ณต์žกํ•œ ์„ ํ˜• ๋ ˆ์ด์–ด์˜ ๊ฒฝ์šฐ bp์™€ ๊ฐ™์€). ํ…์„œ์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ• ๊นŒ์š”? THNN ๋ถ€๋ถ„์€ ํ™•์ธํ•˜์…จ๋‚˜์š”?

์˜ˆ, hermitian์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. cuda fft๊ฐ€ ์ง€๊ธˆ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค. cpu fft๋Š” numpy์—์„œ ๋ž˜ํ•‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง THNN์ด๋‚˜ THCUNN์„ ๋งŒ์ง€์ง€ ์•Š์•˜๋‹ค.

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

๊ฒ€ํ†  ํ›„ ๋ชจ๋“  ์ปค๋ฐ‹์„ ๋ฆฌ๋ฒ ์ด์Šคํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@PhilippPelz ์•ˆ๋…•ํ•˜์„ธ์š”, ๊ตฌํ˜„ํ•œ THPP ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. Traits.hpp ์˜ ์ถ”๋ ฅ์— ์˜์กดํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? cuda ์—†์ด ์ปดํŒŒ์ผํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜๋Ÿผ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?๋˜๋Š”Traits.hpp ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋‹จ์„œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Roger-luo ์˜ˆ, ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ณตํ•ฉ ์œ ํ˜•์€ complex.h ๋˜๋Š” std::complex ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. THPP๋Š” C++ ๋ž˜ํผ์ด๋ฏ€๋กœ std::complex๊ฐ€ ๋” ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๊ฟ”์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

Thrust๋Š” cffi ํ™•์žฅ์„ ๊ตฌ์ถ•ํ•  ๋•Œ์™€ ๋˜‘๊ฐ™์€ ์ด์œ ๋กœ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ THC์—์„œ ๋ณตํ•ฉ ์œ ํ˜•์„ cuFloatComplex/cuDoubleComplex๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. cffi ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰ํ•˜์ง€ ์•Š๋„๋ก. ์ง€๊ธˆ ๋ฐ”๋กœ ์—ฐ๊ตฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์€๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์ด ๊ฑธ๋ฆฌ๋„ค์š” :( . ์‹œ๊ฐ„์ด ๋˜์‹œ๋ฉด ํ•ด์ฃผ์„ธ์š”.

๋˜ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ปค๋„ ํ˜ธ์ถœ๋กœ cffi ํ™•์žฅ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ญ์ƒ nvcc๋กœ ์ปดํŒŒ์ผ๋œ ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” cffi ๋ž˜ํผ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ABI ๋ชจ๋“œ์—์„œ cffi๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์›น ์‚ฌ์ดํŠธ์—๋Š” "๋Œ€์‹  API ๋ชจ๋“œ๋Š” ๋Œ€์ƒ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” CPython C ๋ž˜ํผ๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋Œ€์ ์œผ๋กœ ํ›จ์”ฌ ๋น ๋ฅด๋ฉฐ libffi๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

@PhilippPelz ์•„๋งˆ๋„ reinterpret_cast ์ด ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? cuComplex ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  THPP์—์„œ reinterpret_cast ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋จผ์ € ํ•ด๋ณผ๊ฒŒ...

์˜ˆ, cuda๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋„ THPP๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋ฉด reinterpret_cast ์™ธ์—๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@PhilippPelz ๋„์™€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•  ์ผ ๋ชฉ๋ก์ด ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณตํ•ฉ ์œ ํ˜•์— ๋Œ€ํ•ด THNN ๋ฐ THCUNN์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @roger-luo์™€ ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ๋งˆ์Šคํ„ฐ์™€์˜ ํ†ตํ•ฉ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๋ณต์žกํ•œ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@elbamos THNN ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ ์กด์žฌํ•˜๋Š” ๊ฐ ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด ์ƒˆ๋กญ๊ณ  ๋ณต์žกํ•œ ์—ญ์ „ํŒŒ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Philipp์˜ ํฌํฌ์— WIP PR์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฐธ์กฐ๋ฅผ ๋‚˜์—ดํ–ˆ์Šต๋‹ˆ๋‹ค.

@apaszke @sumith @PhilippPelz ๊ทธ๋ฆฌ๊ณ  ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • THS ์— ๋‹ค๋ฅธ GenerateXXXTypes.h ํŒŒ์ผ์ด ์žˆ๋Š” ์ด์œ ๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? TH ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

  • byte_order.cpp ์˜ ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

void THP_decodeFloatBuffer(float* dst, const uint8_t* src, THPByteOrder order, size_t len)
{
  for (size_t i = 0; i < len; i++) {
    union { uint32_t x; float f; };
    x = (order == THP_BIG_ENDIAN ? decodeUInt32BE(src) : decodeUInt32LE(src));
    dst[i] = f;
    src += sizeof(float);
  }
}

void THP_decodeDoubleBuffer(double* dst, const uint8_t* src, THPByteOrder order, size_t len)
{
  for (size_t i = 0; i < len; i++) {
    union { uint64_t x; double d; };
    x = (order == THP_BIG_ENDIAN ? decodeUInt64BE(src) : decodeUInt64LE(src));
    dst[i] = d;
    src += sizeof(double);
  }
}

๊ด€๋ จ ๋ณตํ•ฉ ๋ฒ„์ „ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ ๊ตฌํ˜„์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

void THP_decodeZFloatBuffer(std::complex<float>* dst, const uint8_t* src, THPByteOrder order, size_t len)
{
  for (size_t i = 0; i < len; i++) {
    union { uint64_t x; std::complex<float> cf;};
    x = (order == THP_BIG_ENDIAN ? decodeUInt64BE(src) : decodeUInt64LE(src));
    dst[i] = cf;
    src += sizeof(std::complex<float>);
  }
}

void THP_decodeDoubleBuffer(std::complex<double>* dst, const uint8_t* src, THPByteOrder order, size_t len)
{
  for (size_t i = 0; i < len; i++) {
    union { uint128_t x; std::complex<double> df;};
    x = (order == THP_BIG_ENDIAN ? decodeUInt128BE(src) : decodeUInt128LE(src));
    dst[i] = df;
    src += sizeof(std::complex<double>);
  }
}

์ด์ „ decodeUInt128XE ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

static inline uint128_t decodeUInt128LE(const uint8_t *data) {
  return (((uint128_t)data[ 0])<<  0) | (((uint128_t)data[ 1])<<  8)|
         (((uint128_t)data[ 2])<< 16) | (((uint128_t)data[ 3])<< 24)|
         (((uint128_t)data[ 4])<< 32) | (((uint128_t)data[ 5])<< 40)|
         (((uint128_t)data[ 6])<< 48) | (((uint128_t)data[ 7])<< 56)|
         (((uint128_t)data[ 8])<< 64) | (((uint128_t)data[ 9])<< 72)|
         (((uint128_t)data[10])<< 80) | (((uint128_t)data[11])<< 88)|
         (((uint128_t)data[12])<< 96) | (((uint128_t)data[13])<<104)|
         (((uint128_t)data[14])<<112) | (((uint128_t)data[15])<<120);
}

static inline uint128_t decodeUInt128BE(const uint8_t *data) {
  return (((uint128_t)data[15])<<  0) | (((uint128_t)data[14])<<  8)|
         (((uint128_t)data[13])<< 16) | (((uint128_t)data[12])<< 24)|
         (((uint128_t)data[11])<< 32) | (((uint128_t)data[10])<< 40)|
         (((uint128_t)data[ 9])<< 48) | (((uint128_t)data[ 8])<< 56)|
         (((uint128_t)data[ 7])<< 64) | (((uint128_t)data[ 6])<< 72)|
         (((uint128_t)data[ 5])<< 80) | (((uint128_t)data[ 4])<< 88)|
         (((uint128_t)data[ 3])<< 96) | (((uint128_t)data[ 2])<<104)|
         (((uint128_t)data[ 1])<<112) | (((uint128_t)data[ 0])<<120);
}

์ €๋Š” ํ˜„์žฌ THPP T _Complex std::complex<T> ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์•„์ง Python์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜๋Š” C ์œ ํ˜• T _Complex python์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ dst ์œ ํ˜•์€ std::complex<T> ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๊ตฌํ˜„์ด ๋งž๋‹ค๋ฉด ์•„๋งˆ๋„ https://github.com/calccrypto/uint128_t ์™€ ๊ฐ™์€ uint128_t ๊ตฌํ˜„์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 128๋น„ํŠธ ์ •์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—(gcc์—๋Š” int128_t ๋ฐ uint128_t๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค).

@PhilippPelz ๊ท€ํ•˜์˜ ํฌํฌ์— ๋ฌธ์ œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ”„๋กœ์ ํŠธ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋ณต์žกํ•œ ํ…์„œ๊ฐ€ pytorch์˜ ๋กœ๋“œ๋งต์— ์—†๋‹ค๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

@el3ment ๋‚˜๋Š” CPU์— ๋ณต์žกํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค https://github.com/pytorch/pytorch/pull/4899 ํ•˜์ง€๋งŒ ์•„์ง ๊ฒ€ํ† ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ๋‚ด PR์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋ฐ›์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. Julia ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์ตœ๊ทผ...

์ง€๋‚œ๋ฒˆ์— @PhilippPelz ์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ repo๋Š” ์•„์ง v0.1 ๋ฏธ๋งŒ์ด๊ณ  ๊ทธ๋Š” 9์›”๊นŒ์ง€ ๋…ผ๋ฌธ์„ ์œ„ํ•ด ๋ฐ”์ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  v0.3์˜ ์ƒˆ๋กœ์šด CUDA ๋ฐฑ์—”๋“œ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ด ๋ชจ๋“  ๋ฐ”์ธ๋”ฉ์„ ํ˜ผ์ž ์™„๋ฃŒํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. map/reduce ํ•จ์ˆ˜๋Š” ์ผ๋ถ€ ์ตœ์ ํ™”๊ฐ€ ์žˆ๋Š” v0.1๊ณผ ๋‹ค๋ฅด์ง€๋งŒ ๋ณต์†Œ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋„๋ก ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„์™€์ฃผ์‹ค ๋ถ„์ด ๊ณ„์‹œ๋‹ค๋ฉด ๊ธฐ์ ํ…๋ฐ...

๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

2018๋…„ 4์›” 10์ผ ์˜คํ›„ 10์‹œ 52๋ถ„์— Rogerluo [email protected] ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@el3ment CPU #4899์— ๋ณต์žกํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ๋ฒˆ์— @PhilippPelz ์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ repo๋Š” ์•„์ง v0.1 ๋ฏธ๋งŒ์ด๊ณ  ๊ทธ๋Š” 9์›”๊นŒ์ง€ ๋…ผ๋ฌธ์„ ์œ„ํ•ด ๋ฐ”์ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  v0.3์˜ ์ƒˆ๋กœ์šด CUDA ๋ฐฑ์—”๋“œ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ด ๋ชจ๋“  ๋ฐ”์ธ๋”ฉ์„ ํ˜ผ์ž ์™„๋ฃŒํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. map/reduce ํ•จ์ˆ˜๋Š” ์ผ๋ถ€ ์ตœ์ ํ™”๊ฐ€ ์žˆ๋Š” v0.1๊ณผ ๋‹ค๋ฅด์ง€๋งŒ ๋ณต์†Œ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋„๋ก ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„์™€์ฃผ์‹ค ๋ถ„์ด ๊ณ„์‹œ๋‹ค๋ฉด ๊ธฐ์ ํ…๋ฐ...

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

@elbamos ์ฟจ, pytorch ํŒ€์€ ๋ณ„๋„์˜ ๊ตฌํ˜„์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ํฌํฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ •๋ง๋กœ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์‹œ๊ฐ„์ด ์—†๊ณ , ์ด๊ฒƒ์ด pytorch์˜ ํฐ ํ™•์žฅ์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— pytorch ํŒ€์—์„œ ๊ณ„ํš์ด ์žˆ์„ ๋•Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ฝ”๋“œ๋Š” v0.2 ์ดํ›„์— ์ปค๋ฐ‹๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ํ…์„œ ์ฝ”๋“œ๋ฅผ Aten์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฝค ํฐ ๋ฆฌํŒฉํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ํฌํฌ๋ฅผ ํ˜„์žฌ ๋ฒ„์ „์— ์‰ฝ๊ฒŒ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋” ๋งŽ์€ ์ž‘์—…์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ๋ฐ•์‚ฌ ๊ณผ์ •์„ ์ž‘์„ฑ ์ค‘์ด์ง€๋งŒ Variable๊ณผ Tensor์˜ ๋ณ‘ํ•ฉ์ด ๋ฆด๋ฆฌ์Šค๋  ๋•Œ๊นŒ์ง€ ์–ด์จŒ๋“  0.4๋ฅผ ๊ธฐ๋‹ค๋ฆด ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ผ์ฐ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉด ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ๋ฆฌํŒฉํ† ๋ง์ด ์ง„ํ–‰๋˜์ง€ ์•Š์„๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

@elbamos ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚ด ํฌํฌ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ˆ˜ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. TH(CU)NN์€ ๊ฝค ํฐ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์—„์ฒญ๋‚œ ์›Œํฌ๋กœ๋“œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@el3ment ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ๊ธฐ์— ์—†๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ๋ชฉ์„ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณต์†Œ์ˆ˜๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•œ๋‹ค๋ฉด tensorflow๋ฅผ ์ ๊ทน ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋„์›€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํฌ์ŠคํŠธ๋‹ฅ์„ ๊ณ„์†ํ•˜๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ์„ ์–ด๋Š ์‹œ์ ์—์„œ ํ˜„์žฌ ๋ฒ„์ „์œผ๋กœ ์ด์‹ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์Šค๋ถ์ด ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์€ ์ •๋ง ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค. :((

@PhilippPelz ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์Šฌํ”„๊ณ  ์‹ค์ œ๋กœ tensorflow๊ฐ€ ์–‘์ž ๋ฌผ๋ฆฌํ•™์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... Julia๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ํŒŒ์ด์ฌ์„ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@Roger-luo ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ํŠน์ • julia ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋ชจ๋‘ ์ž์ฒด ์ž‘์„ฑ ์ฝ”๋“œ์ž…๋‹ˆ๊นŒ?

@PhilippPelz ์ €๋Š” Julia์—์„œ ์–‘์ž ๋‹ค์ฒด ํˆดํ‚ท์„ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค(PyTorch PR ์ดํ›„). ์—ฌ๊ธฐ์—๋Š” ๋ณต์žกํ•œ ์‹ ๊ฒฝ๋ง์— ๋Œ€ํ•œ ์ด์ „ ๋…ผ๋ฌธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ณต์žกํ•œ/์‹ค์ œ ์‹ ๊ฒฝ๋ง ๊ตฌํ˜„์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ Julia์˜ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ. ๋‚˜๋Š” ํ˜„์žฌ ๊ทธ๊ฒƒ์„ QMTK.jl ์— ๋„ฃ์—ˆ๊ณ , ์—ฌ์ „ํžˆ ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋๋‚ด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. PyTorch๋Š” ์ •๋ง ๋งŽ์€ ์˜๊ฐ์„ ์ฃผ์ง€๋งŒ ๋ณต์žกํ•œ ์ง€์›์— ๋Œ€ํ•ด ์ •๋ง ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค...

ํ•˜์ง€๋งŒ ์•ž์œผ๋กœ ์‹ ๊ฒฝ๋ง ๋‹จ์ผ ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ง€๊ธˆ์€ ์—ฌ๋Ÿฌ ์ €์žฅ์†Œ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  CAS(Institute of Physics, CAS)์˜ ๊ฐœ๋ฐœ์— ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ฐธ์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋ฒ„์ „(๋ช‡ ์ฃผ ๋‚ด) ์ดํ›„์— PR์„ ์ˆ˜๋ฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PyTorch ํŒ€์ด ๋ฏธ๋ž˜์— ๋ณต์žกํ•œ ์ง€์›์— ๋Œ€ํ•œ ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋„์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฟจ, ์ง€์ผœ๋ณผ๊ฒŒ!

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ด ๋ฌธ์ œ๊ฐ€ ์‹œ์ž‘๋œ ์ดํ›„๋กœ ์ด์— ๋Œ€ํ•ด ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ์ง€ ๋ชปํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‘ ๊ฐ€์ง€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” PyTorch๊ฐ€ ๋ณต์žกํ•œ ์ง€์›์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ๋ฐ ์ ˆ๋Œ€์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋“  ๋ณต์žกํ•œ ์ž‘์—…์— ํ•„์š”ํ•œ ๋กฑํ…Œ์ผ์„ ์ ์ ˆํ•˜๊ฒŒ ์ฑ„์šธ ์ธ๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. (์ด์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๋กœ ๋งˆ์Šคํ„ฐ์— ์žˆ๊ณ  ์ ˆ๋š๊ฑฐ๋ฆฌ๊ณ  ์žˆ๋Š” ํฌ์†Œ ์ง€์›์„ ์‚ดํŽด๋ณด์„ธ์š”.)

์ด ๋ฌธ์ œ๊ฐ€ 2017๋…„์— ์—ด๋ฆฐ ์ดํ›„๋กœ ๋ณต์žกํ•œ ์ง€์› ๊ตฌํ˜„์„ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์ด์ œ ํ…์„œ๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฒด๊ณตํ•™์  C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ATen์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ TH/THC ์ฝ”๋“œ์˜ ๊ฑฐ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์„ ํ•„์š” ๊ฐ€ ์—†๊ณ  ๋ชจ๋“  ์ˆ˜๋™ refcounting์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. C++ ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ Python์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์šฐ๋ฆฌ๊ฐ€ C10์ด๋ผ๊ณ  ํ•˜๋Š” ์ƒˆ ๋ฒ„์ „์˜ Aten์„ ๊ฐœ๋ฐœ ์ค‘์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์€ Aten(๋‹ซํžŒ ๊ฒƒ)๋ณด๋‹ค ๊ฐœ๋ฐฉํ˜• ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ์ง„์ง€ํ•ฉ๋‹ˆ๋‹ค. t๋Š” ์‹ค์ œ๋กœ PyTorch๋ฅผ ๋ถ„๊ธฐํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ƒˆ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @Roger-luo ๋ฐ @PhilippPelz , ์šฐ๋ฆฌ๋Š” ๋ณต์žกํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ํ˜„์‹ค๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€์„ ๋ฐ›๊ณ  ์‹ถ์ง€๋งŒ ๋ฏธ๋ž˜์—๋„ ์ด๋ฅผ ์ง€์† ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ƒ๊ฐ์„ ์•Œ๋ ค์ฃผ์„ธ์š”.

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

์ฒซ์งธ, ๋ณต์žกํ•œ ์ง€์›์— ๋Œ€ํ•œ ์ฃผ์š” ๋ฌธ์ œ๋Š” CUDA ๋ถ€๋ถ„์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Aten์ด๋‚˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ CPU ๋ถ€๋ถ„์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์œผ๋ฉด ๋ฉฐ์น  ๋งŒ์— CPU ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CUDA ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์šฐ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. float2 ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ CUDA ๋ถ€๋ถ„์—์„œ cuComplex ์™€ ๊ฐ™์€ ๋‹จ์ผ ๋ณตํ•ฉ ๊ฐ’์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ์กด FloatTensor ๋ฐ DoubleTensor ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Aten์˜ C++ ๋ถ€๋ถ„์—์„œ ๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ด์œ ๋Š” THC ์—์„œ pytorch๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งต/๋ฆฌ๋“€์Šค ์ž‘์—…์„ ๊ฐ€์†ํ™”ํ•˜๊ณ  cuComplex ๊ฐ€ ์‹ค์ œ๋กœ float2 ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์†Œํ•œ cuComplex ์— ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. float2 ํ•˜์ง€๋งŒ __shfl_xxx ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ float2 ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” float2 ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํšจ์œจ์ ์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๊ฒŒ๋‹ค๊ฐ€, ๋‚˜๋Š” ๋ณต์†Œ์ˆ˜๋ฅผ Aten์— ํ†ตํ•ฉํ•˜๋ ค๋ฉด ํ•˜๋“œ์›จ์–ด์—์„œ ์‹ค์ œ๋กœ ๋™์ผํ•œ ๋„ค ๊ฐ€์ง€ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. std::complex , thrust::complex , cuComplex , float2 ๋•Œ๋•Œ๋กœ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์‚ฌ์‹ค ์ €๋Š” ์ž‘๋…„์— ์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ๊ณ  reinterpreter_cast ๊ฐ€ ํ•ด๊ฒฐ์ฑ…์ด์—ˆ์Šต๋‹ˆ๋‹ค).

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๋” ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์“ฐ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

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

CPU ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ChangeLog ๊ฐ€ ์žˆ์—ˆ๊ณ  ๋กœ๊ทธ์˜ ๋ณต์†Œ์ˆ˜์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋กœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๋“œ๋งต์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ (ํ˜ธ์ฃผ์—์„œ) ๋‚ด ๋น„์ž๊ฐ€ ๋ฐฉ๊ธˆ ๊ฑฐ๋ถ€๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ฐญ ์ด์–ด๋ฅผ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์† ์ผํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•˜๋ฉด ์ธํ„ด์‰ฝ์„ ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๋‚œ ํ•˜๋ฃจ ๋™์•ˆ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. ๋กœ์ €์˜ ๋…ธ๋ ฅ์„ ๊ทธ๋Œ€๋กœ ๋‹ด์•„๋‚ด์ง€ ๋ชปํ•ด์„œ ์กฐ๊ธˆ ์•„์‰ฝ์ง€๋งŒ ์†์œผ๋กœ ์ƒ๊ฐํ–ˆ๋‹ค

"๋‚ฎ์€ ์œ ์ง€ ๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ ๋ณต์žกํ•œ Tensor ์ง€์›์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"

์ด๊ฒƒ์€ ์œ„์˜ ๋ชฉํ‘œ์—์„œ ํšจ๊ณผ์ ์ธ ๊ณ„ํš์œผ๋กœ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋ณต์žกํ•œ ํ…์„œ๋Š” sparse ํ…์„œ์™€ ๊ฐ™์€ ๊ทผ๋ณธ์ ์ด๊ณ  ์ƒˆ๋กœ์šด ํ…์„œ ์œ ํ˜•์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋งŽ์€ ์œ ์ง€ ๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๊ต์ฐจ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์œ ์ง€ ๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” "๋ณต์žกํ•œ ๋น„ํŠธ๋ฅผ ๋ˆ„๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๊นŒ?"์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "์ด์ œ ๋ชจ๋“  ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๋Š” ๊ทผ๋ณธ์ ์ธ ๋ณ€๊ฒฝ, Aten ๋ณ€๊ฒฝ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ด ๋ณต์žกํ•œ ์œ ํ˜•์„ ์ธ์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."

    • ๋Œ€์‹  ํ•ญ์ƒ [Tensor Shape x 2] ๋˜๋Š” [2 x TensorShape]์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Tensor์—๋Š” ํฌ๊ธฐ๊ฐ€ 2์ธ ์ถ”๊ฐ€ ์ฐจ์›์ด ํ•˜๋‚˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณต์žกํ•œ Tensor๋Š” Aten Tensor API ์œ„์— ๊ตฌ์ถ•๋œ ~2k ๋ผ์ธ์˜ ๊ฐ„๋‹จํ•œ C++๋กœ ๊ตฌ์„ฑ๋œ ์ž‘์€ ํŒŒ์ผ/ํด๋”์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ๋ฅผ ๋“ค์–ด https://github.com/pytorch/pytorch/issues/6514 ์—์„œ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ๊ณฑ์…ˆ์€ torch.stack([real1 * real2 - imag1 * imag2, real1 * imag2 + imag1 * real2], dim = -1) ๋กœ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ real1 = input1[:, :, :, ..., 0]

    • ์ด๊ฒƒ์€ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ต๋‹ˆ๋‹ค. ์˜ˆ, ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ธ๋ผ์ธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋งŽ์€ ์„ฑ๋Šฅ์„ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์งˆ๋ฌธ์€ "์–ผ๋งˆ๋‚˜?"์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ณ  ์™„์ „ํ•œ ๊ธฐ๋Šฅ๊ณผ ์œ ์ง€๋˜๋Š” ๋ณต์žกํ•œ ์ง€์›์— ๋Œ€ํ•œ ๋Œ€๊ฐ€๋กœ 20% ๋” ๋‚ฎ์€ ์„ฑ๋Šฅ์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์€ ์ „์šฉ ์ปค๋„์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์—์„œ ์„ฑ๋Šฅ์ด 20% ์ด์ƒ ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ์ž…ํ•ฉ๋‹ˆ๋‹ค.

BLAS, cublas ๋ฐ MAGMA๋Š” ๋ชจ๋‘ float2์™€ ๋ฐ”์ดํŠธ ํ˜ธํ™˜๋˜๋Š” ์ž์ฒด ๋ณตํ•ฉ ์œ ํ˜•์„ ๊ธฐ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— [Tensor Shape x 2]์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ blas, cublas ๋ฐ magma ํ˜ธ์ถœ์€ Python ์ˆ˜์ค€์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋ณต์žกํ•œ ๊ณฑ์…ˆ์˜ ๊ฒฝ์šฐ 20% ๋ฐ–์— ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ถ€๋ถ„๊ณผ ์ด๋ฏธ์ง€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ณ„์‚ฐ ์œ„์— 4๊ฐœ์˜ ์ „์ฒด ๋ณต์‚ฌ ์ž‘์—…์ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
์–ด์จŒ๋“  ๊ณ„์†ํ•ด์„œ ๋งˆ์Šคํ„ฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋ฉด ๋‹คํ–‰์ž…๋‹ˆ๋‹ค.

@PhilippPelz ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. BLAS, cublas ๋ฐ MAGMA์˜ ๋ณต์žกํ•œ ์ง€์›์„ ์žƒ๊ฒŒ ๋˜๋ฏ€๋กœ ๋งŽ์€ ์„ฑ๋Šฅ์„ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ๋ณต์žกํ•œ Tensor๋Š” ํฌ์†Œ ํ…์„œ์™€ ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค scipy.sparse ์™€ ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Julia์˜ SparseArrays ๋Š” ํฌ์†Œ ๋ฐฐ์—ด์„ ๊ธฐ๋ณธ์ ์ธ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์˜ ๊ตฌ์„ฑ์œผ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๋„ ๋‘ ๊ฐœ์˜ ์‹ค์ œ ๋ฐฐ์—ด์„ ํ•ฉ์„ฑํ•˜์—ฌ ๋ณตํ•ฉ ์œ ํ˜•์˜ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... (์—ฌ๊ธฐ์„œ ์•„๋ฌด๋„ tensorflow, arrayfire, numpy ๋ฐ Julia๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). MXNet์—์„œ FFT๋Š” ์‹ค์ œ๋กœ ๋‘ ๊ฐœ์˜ ์‹ค์ œ ํ…์„œ์˜ ๊ตฌ์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ง€๋งŒ ๋ณต์žกํ•œ ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... tensorflow๋Š” complex64 ๋ฐ complex128 ๋ฅผ ํฌํ•จํ•œ ๋‹ค๋ฅธ ๋„ท ์œ ํ˜•์— ๋Œ€ํ•œ ๋ž˜ํผ๋กœ DataType์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. types.proto ์ฐธ์กฐ

์„ฑ๋Šฅ ์†์‹ค์— ๋Œ€ํ•ด

์ฒซ์งธ, ์š”์†Œ๋ณ„ ํ•จ์ˆ˜(ํ•จ์ˆ˜๊ฐ€ map/reduce๋ฅผ ํ˜ธ์ถœํ•จ)๋Š” ์„ฑ๋Šฅ ์†์‹ค์ด ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ ์–ด๋„ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์—ฐ์†์ ์ž„). ํ•˜์ง€๋งŒ ๋จผ์ € ๋ช‡ ๊ฐ€์ง€ BLAS ๊ธฐ๋Šฅ์„ ๋ฒค์น˜๋งˆํ‚นํ•˜์—ฌ FloatTensor ์˜ ๊ตฌ์„ฑ์ด GPU์—์„œ Complex64Tensor ์™€ ์œ ์‚ฌํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š”์ง€, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ดˆ์•ˆ ๊ตฌํ˜„:

  • gemm
  • gemv

๋ณตํ•ฉ ๋ณตํ•ฉ ํ…์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋˜๋Š” shared_ptr ์‚ฌ์šฉ).

class ComplexTensor {
    FloatTensor *real;
    FloatTensor *imag;
};

๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋‹จ์ ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด __shfl_xxx ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋„ ์ด ์ž‘์—…์„ ๋” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์žฅ์• ๋ฌผ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ torch.fft ๋Š” [dim1, ..., dimN, 2] ๋ชจ์–‘์˜ ๋‹จ์ผ float ํ…์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

@ezyang C10 ์ถœ์‹œ ์ผ์ •์€ ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ ์ปดํ”Œ๋ ‰์Šค ์ง€์›์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ์‹œ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@PhilippPelz ํ™•์‹คํžˆ 0.4์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ 6์›”์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

6์›”์— ์–ธ๊ธ‰ํ•œ @ezyang , PyTorch์— ๋ณต์†Œ์ˆ˜ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‚˜์š”?

๋‚˜๋Š” ๊ทธ๊ฐ€ ๋ณต์žกํ•œ ์ง€์›์ด ์•„๋‹ˆ๋ผ C10์„ ์˜๋ฏธํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. C10์€ ๋ณต์žกํ•œ ์ถ”๊ฐ€๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, C10์€ Tensor ์œ ํ˜•๊ณผ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ณต๊ฐœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณต์žกํ•œ ์œ ํ˜•์„ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณต์†Œ์ˆ˜์— ETA๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? "ํ›จ์”ฌ ๋” ์‰ฝ๋‹ค"๋Š” ๊ฒƒ์€ "์•„๋งˆ๋„ ๋นจ๋ฆฌ ๋๋‚  ๊ฒƒ์ด๋‹ค"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@themightyoarfish ํ›จ์”ฌ ์‰ฝ๊ฒŒ, ์šฐ๋ฆฌ๊ฐ€ pytorch ๋งˆ์Šคํ„ฐ์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ฐจ๋‹จ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ETA๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. PyTorch์— ๊ณต๊ฐœ ๋“ฑ๋ก๋˜๋ฉด ์ž‘์—… ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@sumith ์—ฌ์ „ํžˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ(๋ณต์†Œ์ˆ˜)? PyTorch ํŒ€์ด ๋ณต์†Œ์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? QuCumber ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— 9์›”์— ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์ž‘์—…์— ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ณต์†Œ์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•จ)

@Roger-luo ๋„ค. PyTorch ๋ฐฑ์—”๋“œ์—์„œ ๊ณต๊ฐœ ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•ด์ง€๋ฉด ์—ฐ๋ฝ์„ ๋“œ๋ฆฌ๊ณ  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@ezyang 9์›”๊นŒ์ง€ ์˜คํ”ˆํ˜• ๋“ฑ๋ก ๋˜๋‚˜์š”?

@sumith Cool, ๊ท€ํ•˜์˜ ์„œ๋น„์Šค์—.

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” "์™„์ „ํ•œ" ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์„ ๊ฐ–์ถ”์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, ๋ฆฌํŒฉํ† ๋ง์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ํ•œ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒˆ๋กœ์šด ์˜คํ”ˆ์— ๋Œ€ํ•œ ์ข‹์€ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ezyang ์ง€๊ธˆ๊นŒ์ง€ ๋ฉ”๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ž‘์—…ํ•˜๊ธฐ ์ „์— ์ฝ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ๋ฒˆ๊ณผ ๋งŽ์ด ๋‹ฌ๋ผ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Roger-luo @PhilippPelz ๋˜ํ•œ ๋ณต์žกํ•œ ํ…์„œ์˜ ๊ตฌํ˜„์„ ๋„์™€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฐ•์‚ฌ๊ณผ์ • ์—ฐ๊ตฌ์—๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค..

@alexgomezalanis ์—ฌ์œ  ์‹œ๊ฐ„์— ๋Œ€ํ•ด ํ† ๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ„๋„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ #complex-numbers ์ฑ„๋„ ํ˜ธ์ถœ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 9์›”๊นŒ์ง€๋Š” ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์—ฌ์ „ํžˆ Julia ์ฝ”๋“œ ์ค‘ ์ผ๋ถ€๋ฅผ ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...)

BTW, ์ง€๋‚œ๋ฒˆ์— ๋น„ํ•ด ๋งŽ์ด ๋ณ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์†์— ๋‹ฟ๊ธฐ ์ „์— ์‹œ๊ฐ„์„ ๋‚ด์„œ ๋”ฐ๋ผ์žก๊ฒ ์Šต๋‹ˆ๋‹ค.

@alexgomezalanis ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € slack์—์„œ pytorch์˜ ์ž‘์—… ๊ณต๊ฐ„์— ๊ฐ€์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋„ˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์–ด. ์ดˆ๋Œ€์žฅ์„ ๋ฐ›์œผ๋ ค๋ฉด [email protected] ๋กœ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค.

@Roger-luo @alexgomezalanis ๋ณต์žกํ•œ ํ…์„œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‚ถ์„ ๋‹ค์‹œ ๋ณด๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ €๋„ ์ฐธ์—ฌํ•˜๊ฒ ๋‹ค๊ณ  ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์‹ค์ ์œผ๋กœ 9์›” ๋ง/10์›” ์ดˆ๊นŒ์ง€๋Š” ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฝค ๋งŽ์€ ๋…ผํ‰์ž๋“ค์€ ๋ณต์žกํ•œ ํ…์„œ ์ง€์›์ด ์ œ ๋ฐ•์‚ฌ ํ”„๋กœ์ ํŠธ์— ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ž‘๋…„์— ๋‚ด ์—ฐ๊ตฌ๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ ... ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ๋Š” ์ด์ „ 1w + loc ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋˜๋Œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๐Ÿคฃ ์Šฌ๋ž™์—์„œ ์ฑ„ํŒ…ํ•˜์ž!

:) ์˜ˆ, ์Šฌ๋ž™์—์„œ ์ฑ„ํŒ…ํ•ฉ์‹œ๋‹ค. ๋ฉ”์ผ ํด๋”์—์„œ ์ดˆ๋Œ€์žฅ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์ž‘์—… ์ง„ํ–‰ ์ค‘์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ(๋‹จ๊ธฐ CPU ์ „์šฉ)์€ https://github.com/Roger-luo/pytorch-complex ์ž…๋‹ˆ๋‹ค.

์ €์—๊ฒŒ ์ด์Šˆ์™€ PR์„ ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ๋งจ ์œ„์— ๋ณต์žกํ•œ ๊ตฌํ˜„์ด ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ตœ๊ทผ์— PyTorch๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. TensorFlow๋ณด๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ํ…์„œ ์ง€์›์€ ๋‚ด ์—ฐ๊ตฌ(๊ด‘ ์‹ ๊ฒฝ๋ง)์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ํ™œ๋ฐœํžˆ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‚˜์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ณต์žกํ•œ ํ…์„œ ์ง€์›์— ๋Œ€ํ•œ (๋Š์Šจํ•œ) ๊ธฐ๊ฐ„์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ ์ด ์ž‘์—…์„ ๋•๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” PyTorch๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์ด ์–ผ๋งˆ๋‚˜ ํฐ ์ผ์ธ์ง€ ์•„์ง ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋‚ด ์—ฐ๊ตฌ์‹ค ๋™๋ฃŒ ์ค‘ ์ผ๋ถ€๋Š” ๋ณต์žกํ•œ ํ…์„œ ์ง€์›์— ๊นŠ์€ ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ–ˆ์œผ๋ฉฐ(๋ฌผ๋ฆฌํ•™์—์„œ ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด Torch๊ฐ€ ๊ฑฐ์˜ NumPy์— ๋Œ€ํ•œ GPU ๊ฐ€์† ๋Œ€์ฒดํ’ˆ์ด ๋  ์ˆ˜ ์žˆ์Œ) ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜.

์•ˆ๋…•ํ•˜์„ธ์š” @bencbartlett

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

๋ณต์†Œ์ˆ˜๊ฐ€ ์ค‘์š”ํ•˜๊ณ  ํšƒ๋ถˆ์„ ์ผœ๋Š” ๊ฒƒ์ด ๊ธด๊ธ‰ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/PIQuIL/QuCumber/blob/master/qucumber/utils/cplx.py

๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋Š๋ฆฌ์ง€๋งŒ ... ์ ์–ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ด์ „ TH ์Šคํƒ€์ผ์˜ C ๋ฒ„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฉฐ์น  ๋งŒ์— ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ CPU ๋˜๋Š” CUDA์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ๊ฐ’์œผ๋กœ ์™„์ „ํ•œ ๊ธฐ๋Šฅ ์ง€์›์„ ์œ„ํ•œ ํŠน์ • ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๋ถˆํ–‰ํžˆ๋„ ์•„์ง PyTorch Slack์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์ดˆ๋Œ€๋ฅผ ์š”์ฒญํ•˜๋Š” ์ด๋ฉ”์ผ์„ ๋‘ ๋ฒˆ์ด๋‚˜ ๋ณด๋ƒˆ์ง€๋งŒ ๋‹ต์žฅ์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.) ๋ˆ„๊ตฐ๊ฐ€ ์ €๋ฅผ ์ดˆ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ([email protected])

@Roger-luo ํ™•์‹คํžˆ ๊ท€ํ•˜์˜ ํฌํฌ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์ง€๋งŒ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์žฅ๋‹ดํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ œ C++๊ฐ€ ๋…น์Šฌ๊ณ  ์ง€์ ํ•˜์‹  ๋Œ€๋กœ ํ•™์ƒ. QuCumber ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋‚˜์—๊ฒŒ๋Š” ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ…์„œ๊ฐ€ GPU ์ง€์›๋˜๊ฑฐ๋‚˜ autograd ๋ฐ torch.nn์—์„œ ์ง€์›๋  ๋•Œ๊นŒ์ง€๋Š” NumPy๊ฐ€ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@soumith @ezyang PyTorch ํŒ€์—์„œ ์ด์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค! ๋ณตํ•ฉ ์ง€์›์€ ์ผ๋ฐ˜ ํ…์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ–์ถ”์–ด์•ผ ํ•  ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌผ๋ฆฌํ•™์—์„œ ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜์ ์ด๋ฉฐ ํŠนํžˆ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ML ๋‚ด์—์„œ ๋ณต์†Œ์ˆ˜ ๊ฐ’ ๋ชจ๋ธ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

@bencbartlett QuCumber์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ AD๊ฐ€ ์žˆ๋Š” GPU์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค... ์ œ ๋ง์€ ๋‹น์‹ ์ด ๊ทธ AD๋ฅผ ์›ํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์†”์งํžˆ ๋งํ•ด์„œ https://github.com/FluxML/Flux.jl ์˜ ์•ฝ๊ฐ„ ์ˆ˜์ •๋œ ๋ฒ„์ „๊ณผ ์—ฐ๊ตฌ๋ฅผ ์œ„ํ•ด Julia์—์„œ ์ž์ฒด ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” ํ…์„œ๊ฐ€ ์žˆ๋Š” GPU์˜ ๋ณต์žกํ•œ AD๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ). source2source AD โ€‹โ€‹ํŒจํ‚ค์ง€ Zygote.jl์€ ๋ณต์žกํ•œ ํ…์„œ์—์„œ AD๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ธ๊ทธ๋จผํŠธ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„๋Š” ์•„์ง ํ† ์น˜์— ๋น„ํ•ด ์•ˆ์ •์ ์ด์ง€ ์•Š๊ณ  ์ž์ฒด ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์„ ์•ฝ๊ฐ„ ํ•ดํ‚นํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์–‘์ž ๋ฌผ๋ฆฌํ•™ ์—ฐ๊ตฌ์— ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. GPU์—์„œ๋„ ๋ณต์žกํ•œ ํ…์„œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

torch.nn ์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ๊ฐ’ ์ง€์›์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ…์„œ๊ฐ€ ์ž‘๋™ํ•˜๋ฉด autograd ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํ˜• ๋ ˆ์ด์–ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. . ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ ํ™œ์„ฑํ™” ๊ธฐ๋Šฅ์€ Hilbert ๊ณต๊ฐ„์—์„œ ํ‘œ์ค€ ํ™•์žฅ์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... (๋‚ด ํ˜‘๋ ฅ์ž @GiggleLiu ์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

pytorch-complex ํ™•์žฅ์˜ ๊ฒฝ์šฐ GPU์—์„œ AD์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ง€์›์„ ์–ธ์ œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚˜์—๊ฒŒ ๊ฝค ๋จผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. CPU ๊ตฌํ˜„์€ ๋ฉ”์ธ ํŠธ๋ฆฌ์—์„œ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•œ ์ผ์ • ๊ธฐ๊ฐ„(์˜ˆ: ์œ ํ˜• ์Šน๊ฒฉ, simd ์ง€์› ๋“ฑ)์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ C++์˜ ๋‹ค๊ฐ€์˜ค๋Š” Aten ๊ตฌํ˜„๊ณผ ๊ด€๋ จ์ด ์žˆ๊ณ  TH ๋“ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๊ณผ๋„ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ณต์žกํ•œ ํ…์„œ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ด„์— ์ธํ„ด์‰ฝ์„ ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฐฉ๊ธˆ @ezyang ์—๊ฒŒ ๋ฌผ์–ด๋ดค์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ๋ฐ•์‚ฌ ๊ณผ์ •์„ ์‹œ์ž‘ํ•˜๊ธฐ ๋ช‡ ๋‹ฌ ์ „์— ํ’€ํƒ€์ž„์œผ๋กœ ์ด ์ผ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋ด…์‹œ๋‹ค.

๊ทธ ๋™์•ˆ ๋‚˜๋Š” ๋ณต์žกํ•œ ๊ณฑ์…ˆ์˜ ๋‚ด ์ž์‹ ์˜ ๋ฒ„์ „์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœํŒŒ์ผ๋งํ•  ๋•Œ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. torch._C_._cuda_isDriverSufficient

image

์ด์œ ๊ฐ€ ๋ญ”์ง€ ์•„์„ธ์š”? ๋ณต์žกํ•œ ๊ณฑ์…ˆ์˜ ๋” ๋‚˜์€ ๊ตฌํ˜„์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์—ฌํ•˜ํŠผ, ๋‚ด ๋ฒ„์ „(๊ณฑ์…ˆ ์ˆ˜์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Œ: 4 ๋Œ€์‹  3)์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด out ํ…์„œ์˜ irfft๋Š” ์š”์†Œ๋ณ„ ๊ณฑ์…ˆ๋ณด๋‹ค 10๋ฐฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. PyTorch์˜ C++ ์ˆ˜์ค€์—์„œ ๋ณต์†Œ์ˆ˜ ๊ณฑ์…ˆ์ด ์ง€์›๋ฉ๋‹ˆ๊นŒ?

def complex_mul(x, y, out):
    uavc = x[..., 0] * (y[..., 0] + y[..., 1])
    out[..., 0] = uavc - (x[..., 0] + x[..., 1]) * y[..., 1]
    out[..., 1] = (x[..., 1] - x[..., 0]) * y[..., 0] + uavc
def test_complex_mul_out_tensor(self):
        N, C, H, W, I = 128, 3, 32, 32, 2
        K = 16  # number of filter banks
        repetitions = 1000
        dtype = torch.float
        if torch.cuda.is_available():
            device = torch.device("cuda")
        else:
            device = torch.device("cpu")
        x = torch.randn(N, 1, C, H, W, I, dtype=dtype, device=device)
        y = torch.randn(K, C, H, W, I, dtype=dtype, device=device)
        start_mul_time = time.time()
        out = torch.empty(N, K, C, H, W, I, dtype=dtype, device=device)
        for _ in range(repetitions):
            complex_mul(x, y, out)
        print("multiplication time: ", time.time() - start_mul_time)

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

๊ตฌํ˜„์€ QuCumber์— ์žˆ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ณต์†Œ์ˆ˜์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ cuda ์ปค๋„์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ๋” ๋งŽ์€ GPU ์Šค๋ ˆ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์—์„œ ์ง€์›ํ•˜๋Š” C++ ๋ฐฑ์—”๋“œ๊ฐ€ ์—†์œผ๋ฉด SIMD๋ฅผ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด nvprof ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@Roger-luo @apaszke @soumith ์ด ์Šค๋ ˆ๋“œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. btw. ๋‚˜๋Š” ํ† ์น˜.ํ…์„œ๋ฅผ ์„œ๋ธŒํด๋ž˜์‹ฑํ•˜์—ฌ ํ•จ๊ป˜ ํ•ดํ‚น๋œ ๊ธฐ๋ณธ ๋ณตํ•ฉ ํ…์„œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „๋ฐ˜๋ถ€๋ฅผ ์‹ค์ œ๋กœ, ํ›„๋ฐ˜๋ถ€๋ฅผ ํ—ˆ์ˆ˜์‚ฌ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ๋‚ด ์ž์‹ ์˜ ๊ธฐ๋ณธ ์‚ฐ์ˆ  ์—ฐ์‚ฐ๊ณผ ๋‚ด ์—ฐ๊ตฌ์— ํ•„์š”ํ•œ ์ผ๋ถ€ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Tensorflow ๋ฐ numpy์— ๋Œ€ํ•ด ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ทธ๋ผ๋””์–ธํŠธ์™€ ๋ชจ๋“  ์ž‘์—…์€ ์ถœ๋ ฅ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค!

PT๊ฐ€ ๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์™„์ „ํžˆ ์ง€์›ํ•  ๋•Œ๊นŒ์ง€ ๋ณด๋ฅ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠน์ง•:

  1. ํ…Œ์ŠคํŠธ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. Pypi ์ง€์›(์˜ˆ: pip ์„ค์น˜)
pip install pytorch-complex-tensor

https://github.com/williamFalcon/pytorch-complex-tensor

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

์—…๋ฐ์ดํŠธ ํ•˜๋‚˜? ๋ณต์žกํ•œ ์œ ํ˜• ์ง€์›์„ pytorch์— ํ†ตํ•ฉํ•  ๊ณ„ํš์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, @whmrtm

@ezyang ์€ https://github.com/Roger-luo/pytorch-complex/issues/4 ์—์„œ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ์ด์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ผ๋ถ€ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์†ก ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ํ›„ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). ์ž์œ ๋กญ๊ฒŒ PR์„ ํ•˜๊ฑฐ๋‚˜ ์ €์—๊ฒŒ ๋‹น์‹ ์„ ํ˜‘๋ ฅ์ž๋กœ ์ถ”๊ฐ€ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”, @whmrtm

@ezyang ์€ Roger-luo/pytorch-complex#4 ์— ๋Œ€ํ•ด ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ์ด์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ผ๋ถ€ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์†ก ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ํ›„ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). ์ž์œ ๋กญ๊ฒŒ PR์„ ํ•˜๊ฑฐ๋‚˜ ์ €์—๊ฒŒ ๋‹น์‹ ์„ ํ˜‘๋ ฅ์ž๋กœ ์ถ”๊ฐ€ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค.

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

์—…๋ฐ์ดํŠธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @Roger-luo

๋ณต์žกํ•œ ํ…์„œ ์ง€์› ์ฃผ์ œ([email protected])์™€ ๊ด€๋ จ๋œ slack ์ฑ„๋„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์ดˆ๋Œ€์žฅ์„ ์ด๋ฉ”์ผ๋กœ ๋ณด๋ƒˆ์ง€๋งŒ ์•„์ง ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ €๋Š” ์ด ๋ฌธ์ œ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ง€์ ์„ ํŒŒ์•…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/Roger-luo/pytorch-complex/issues/4 ๊ฐ€ ํ˜„์žฌ ์ง„์ž…์ ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

@beconstant ์˜ˆ, ๊ทธ๊ฒƒ์ด ์‹œ์ž‘์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ถ€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ์ž‘๋™ํ•˜๊ฒŒ ํ•ด์•ผ ํ•˜์ง€๋งŒ cuda์—์„œ ์œ ํ˜• ์Šน๊ฒฉ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. CPU์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (์ฒ˜์Œ๋ถ€ํ„ฐ cuda๋ฅผ ์ง€์›ํ•  ์ƒ๊ฐ์€ ์—†์ง€๋งŒ ๋นŒ๋“œ ์‹คํŒจ์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.)

์ดˆ๋Œ€ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค). slack์— ๊ฐ€์ž…ํ•˜๋ ค๋ฉด pytorch ๊ณต์‹ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์ด์Šˆ/PR์—์„œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Roger-luo ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. :)

๋„์›€์ด ํ•„์š”ํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ์ง€์ •๋œ pytorch ๋ฒ„์ „์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. pytorch-complex/issues/4 ์— ๋Œ€ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋„์›€์ด ํ•„์š”ํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ์ง€์ •๋œ pytorch ๋ฒ„์ „์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. pytorch-complex/issues/4 ์— ๋Œ€ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@dylanbespalko ์•ˆ๋…•ํ•˜์„ธ์š”, Complex-valued ๋ฒ„์ „์œผ๋กœ ๊ตฌํ˜„๋œ pytorch๊ฐ€ ์‹œ๊ธ‰ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์นœ์• ํ•˜๋Š”,
์ ค๋ผ๋ฅด209

์•ˆ๋…•ํ•˜์„ธ์š” @Zellar209 ,

@ezyang ์ด ๋” ํฐ ๋ฌธ์ œ( pytorch-complex/issues/4 ) ์ค‘ ํ•˜๋‚˜์—์„œ ์—ด์‹ฌํžˆ ์ผํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ AMD ์‹œ์Šคํ…œ์ด ์žˆ๊ณ  3์ฃผ ํ›„์— GPU ์ง€์›์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Nvidia ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์›๋ž˜ ์œ ํ˜• ์Šน๊ฒฉ ๋ณ€๊ฒฝ์ด CUDA๋ฅผ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ๋ฟ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น PR์ด ํ•ด๊ฒฐ๋˜๋Š” ํ•œ ์ตœ์†Œํ•œ ์ผ๋ถ€ ์šด์˜์ž๊ฐ€ CPU์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ณ  ์•„์ง CUDA๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

IMHO ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ CPU์— ์ง‘์ค‘ํ•˜๊ณ  ์ผ์„ ๋จผ์ € ๋งŒ๋“ค๊ณ  GPU๋ฅผ ๋‚˜์ค‘์— ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

CPU๋งŒ ์ง€์›ํ•˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜• ์Šน๊ฒฉ ๋ฌธ์ œ( pytorch-complex/issues/4 ๊ฐ€ fb์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ? ์™ธ๋ถ€์—์„œ ์ž‘์—…ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @dylanbespalko; ๋‚˜๋Š” @Roger-luo์—๊ฒŒ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์ง€๋งŒ(์™œ๋ƒํ•˜๋ฉด ๋‚ด๊ฐ€ ์•„๋งˆ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์œ„์น˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค), ์•„์ง ๊ทธ๊ฒƒ์„ ๋ณผ ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์กฐ์–ธํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @Zellar209 ,

@ezyang ์ด ๋” ํฐ ๋ฌธ์ œ( pytorch-complex/issues/4 ) ์ค‘ ํ•˜๋‚˜์—์„œ ์—ด์‹ฌํžˆ ์ผํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ AMD ์‹œ์Šคํ…œ์ด ์žˆ๊ณ  3์ฃผ ํ›„์— GPU ์ง€์›์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Nvidia ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ง€๊ธˆ์€ GPU๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” MAC ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @Zellar209๋‹˜ , pytorch-complex์˜ ๋ฌธ์ œ์—์„œ ์–ป์€ ๋‚ด์šฉ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Mac์˜ ์ƒˆ๋กœ์šด Xcode์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋นŒ๋“œํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ ์ด์œ ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

OS๋ž‘ ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ๋ฌผ์–ด๋ดค๋Š”๋ฐ ๋‹ต์ด์—†๋„ค...

์•ˆ๋…•ํ•˜์„ธ์š” @dylanbespalko; ๋‚˜๋Š” @Roger-luo์—๊ฒŒ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์ง€๋งŒ(์™œ๋ƒํ•˜๋ฉด ๋‚ด๊ฐ€ ์•„๋งˆ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์œ„์น˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค), ์•„์ง ๊ทธ๊ฒƒ์„ ๋ณผ ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์กฐ์–ธํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1. gcc(๊ธฐ๋ณธ๊ฐ’)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "python setup.py install"์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฑด๋ฌผ 'torch_complex.cpp' ํ™•์žฅ
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/anaconda3/include -arch x86_64 -I/anaconda3/include -arch x86_64 -I/ anaconda3/lib/python3.6/site-packages/torch/include -I/anaconda3/lib/python3.6/site-packages/torch/include/torch/csrc/api/include -I/anaconda3/lib/python3. 6/site-packages/torch/include/TH -I/anaconda3/lib/python3.6/site-packages/torch/include/THC -I/anaconda3/include/python3.6m -c src/module.cpp -o ๋นŒ๋“œ/temp.macosx-10.7-x86_64-3.6/src/module.o -g -stdlib=libc++ -std=c++11 -DTORCH_API_INCLUDE_EXTENSION_H -DTORCH_EXTENSION_NAME=cpp
gcc: ์˜ค๋ฅ˜: ์ธ์‹ํ•  ์ˆ˜ ์—†๋Š” ๋ช…๋ น์ค„ ์˜ต์…˜ '-stdlib=libc++'

์˜ค๋ฅ˜: 'gcc' ๋ช…๋ น์ด ์ข…๋ฃŒ ์ƒํƒœ 1๋กœ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

2. clang์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•  ๋•Œ ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

src/module์— ํฌํ•จ๋œ ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค. cpp:2 :
src/CPUComplexType.h:60์— ํฌํ•จ๋œ ํŒŒ์ผ:
src/CPUComplexTypeImpl.h:102:105: ๊ฒฝ๊ณ : 'IntList'๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. [-Wdeprecated-declarations]
Tensor & CPUComplexType::set_(Tensor & self, Storage ์†Œ์Šค, int64_t storage_offset, IntList ํฌ๊ธฐ, IntList strides) const {
^^
/anaconda3/lib/python3.6/site-packages/torch/include/c10/util/ArrayRef.h:273:7: ์ฐธ๊ณ : 'IntList'๋Š” ์—ฌ๊ธฐ์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
IntList ์‚ฌ์šฉ C10_DEPRECATED_USING = ArrayRef;
^^
src/module์— ํฌํ•จ๋œ ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค. cpp:2 :
src/CPUComplexType.h:60์— ํฌํ•จ๋œ ํŒŒ์ผ:
src/CPUComplexTypeImpl.h:105:76: ์˜ค๋ฅ˜: 'at' ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— 'scalarTypeToDataType'์ด๋ผ๋Š” ๋ฉค๋ฒ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ž๋™ ์†Œ์Šค_ = checked_storage(์†Œ์Šค,"์†Œ์Šค",2, DeviceType::CPU, at::scalarTypeToDataType(CPUComplexTypeInfo::scalar_type));
~~~~^
7๊ฐœ์˜ ๊ฒฝ๊ณ ์™€ 2๊ฐœ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜: 'clang' ๋ช…๋ น์ด ์ข…๋ฃŒ ์ƒํƒœ 1๊ณผ ํ•จ๊ป˜ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚˜๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ •๋ง๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์–˜๋“ค ์•„,

์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๋Š” ๋ฐ ์ผ์ฃผ์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด @Roger-luo์˜ pytorch-complex๋ฅผ ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

@Zellar209 : macOS 10.13์—์„œ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ์กด pytorch ๋ฐฐํฌ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
    ์ฝ˜๋‹ค ์ œ๊ฑฐ ํŒŒ์ดํ† ์น˜
    ํ• ์ œ๊ฑฐ ํ† ์น˜
    pip uninstall torch # ์ด ๋ช…๋ น์„ ๋‘ ๋ฒˆ ์‹คํ–‰
    ํŒŒ์ด์ฌ setup.py ์ฒญ์†Œ
    python site-packages ํด๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ† ์น˜ ํด๋”๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
    ์ด์ „ pytorch ์†Œ์Šค ํด๋”์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝ(๋˜๋Š” ์‚ญ์ œ)ํ•ฉ๋‹ˆ๋‹ค.

  2. PyTorch ๊ฐœ์ •ํŒ 6cb593b88cb0c411690b4957850058329526d87b๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    git clone [email protected]:pytorch/pytorch.git
    git checkout 6cb593b88cb0c411690b4957850058329526d87b
    git submodule update --init โ€”recursive
    export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../โ€œ}
    MACOSX_DEPLOYMENT_TARGET=10.13 CC=clang CXX=clang++ python setup.py develop
    python
>>> import torch
  1. pytorch-complex ์„ค์น˜
    python setup.py install
    python setup.py build
    python setup.py test
    # ERROR: test (unittest.loader._FailedTest)
    # ERROR: test_scalar_binary_op (tests.test_tensor.TestComplexTensor)
  1. ๋ณต์žกํ•œ ํ…์„œ ๋งŒ๋“ค๊ธฐ
   from torch_complex import torch
   a = torch.ones(3, dtype=torch.complex128)
   a*a  
   RuntimeError: promoteTypes with complex numbers is not handled yet; figure out what the correct rules should be

@ezyang , @Roger-luo:

ํ…์„œ ์ž‘์—…์„ ์œ„ํ•œ ์œ ํ˜• ์Šน๊ฒฉ์„ ์œ„ํ•œ ๋ชจ๋“  ๊ฒƒ์€ c10/core/ScalarType.h ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
AT_ERROR("promoteTypes with complex numbers is not handled yet; figure out what the correct rules should beโ€); ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
์ด ํ…Œ์ด๋ธ” ์•ˆ์— c8 ๋ฐ c16์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด 9515 ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์ด numpy ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์‹œ์ž‘ํ•˜๊ธฐ์— ์ข‹์€ ๊ณณ์ธ๊ฐ€์š”?

9515๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ScalarType.h์—์„œ ์ด ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ScalarType.h์—์„œ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
BinaryOps(add, sub, mul, div)๊ฐ€ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‘ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ Tensor์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์ด์ƒํ•œ ๋ฌธ์ œ๋„ ์žˆ์ง€๋งŒ ์ข€ ๋” ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@dylanbespalko ์—ฌ๊ธฐ์— ์œ ํ˜• ํ”„๋กœ๋ชจ์…˜์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/pytorch/pytorch/pull/11641

๊ทธ๋ƒฅ ๋ณต์‚ฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ๋“  CUDA๋ฅผ ์†์ƒ์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IIRC, gcc ๋ฒ„์ „์œผ๋กœ ์ธํ•ด ์™€์ด์–ด ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @Roger-luo. #11641 ์˜ ๋Œ“๊ธ€์„ ๋ณด๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์ผ ์ฝ”๋“œ ๋ณต์‚ฌ๋ฅผ ๋” ์ž˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

CUDA ์žฅ์น˜๊ฐ€ ์—†์„ ๋•Œ CUDA๊ฐ€ ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? CI๊ฐ€ ์•Œ๋ ค์ค„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, PR์„ ์ œ์ถœํ•˜๋ฉด ์–ด๋Š ๊ฒƒ์ด ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ํ†ต๊ณผํ•˜๋ฉด ์ด๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด PR ์ œ์ถœ์„ ์‹œ์ž‘ํ•˜์—ฌ ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dylanbespalko ์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ์ „ํžˆ ํ™˜๊ฒฝ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?
๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๊ณ ์นœ๋‹ค๋ฉด, ์šฐ๋ฆฌ์™€ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์–˜๋“ค ์•„,

@Roger-luo์˜ ์ปค๋ฐ‹ ๋ช‡ ๊ฐœ๋ฅผ ๋ณต์‚ฌํ•œ ํ›„ ์—ฌ๋Ÿฌ PR์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ง€๊ธˆ์€ CUDA GPU๊ฐ€ ์—†๊ณ  CUDA๊ฐ€ ์žˆ๋Š” CI ์‹œ์Šคํ…œ์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ CUDA ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ช‡ ์ฃผ ํ›„์— ํ•ด๋‹น GPU์—์„œ ๋กœ์ปฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

@ezyang , @Roger-luo

๋‚˜๋Š” Roger์˜ PR #11641 ์„ ์‚ดํŽด๋ณด์•˜๋‹ค.

  • ๋‚ด CUDA 9.0 ์‹œ์Šคํ…œ์—์„œ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • CUDA 9.0์„ ์‹คํ–‰ํ•˜๋Š” CI ์‹œ์Šคํ…œ์—์„œ ๋นŒ๋“œํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ตœ๊ทผ PyTorch ๊ฐœ๋ฐœ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด "out-of-tree" ํ™•์žฅ ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์–ด ๋‚˜๋จธ์ง€ pytorch๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ณต์†Œ์ˆ˜ ์ง€์›์„ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. AVX ์—†์ด ๋ณต์žกํ•œ CPU ์ง€์›์„ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.
  2. Thrust๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ CUDA ์ง€์›์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

@ezyang
๋‹น์‹ ์ด ์ œ์‹œํ•œ ์ด out-of-tree device/layout/dtype ํ™•์žฅ์— ๋Œ€ํ•œ ์˜ˆ์ƒ ํƒ€์ž„๋ผ์ธ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•ž์œผ๋กœ 3๊ฐœ์›” ์ด๋‚ด์— ์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@ezyang

AVX/SSE ์ง€์› ์—†์ด CPU์—์„œ ๋ณต์†Œ์ˆ˜ ์ง€์›์„ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณ„๋„์˜ ๋ณ‘ํ•ฉ ์š”์ฒญ์œผ๋กœ ๋‹ค์Œ์„ ์ œ์ถœํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • [ ] CPU BinaryOp ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU TensorFactories์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU FillKernels์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU ๋ฒ”์œ„ ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU ๋‹จํ•ญ ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU ๋น„๊ต ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU TensorCompare ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU ReduceOp ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU PointwiseOps ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU learpOps ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU LinearAlgebraOps ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€
  • [ ] CPU SpectralOps ์ปค๋„์˜ ๋ณต์žกํ•œ ์ง€์› ์ถ”๊ฐ€

์•ž์œผ๋กœ ๋ฉฐ์น  ์•ˆ์— Intel/arm CPU ์ „์ฒด์—์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

@ezyang ,

์ €๋Š” fft() ๋ฐ var() $ ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ณต์†Œ์ˆ˜ ๊ตฌํ˜„์€ ํ…์„œ ๋ฐ์ดํ„ฐ๋ฅผ (complex_shape, 2) ๋ชจ์–‘์˜ ์ด์ค‘ ํ…์„œ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ์กด ํ…์„œ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. 'tensor.to(torch.float64): ์‹ค์ˆ˜ ๋ถ€๋ถ„๋งŒ ์œ ์ง€ํ•˜๊ณ  ๋™์ผํ•œ ๋ชจ์–‘์˜ ํ…์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. 'tensor.view(new_shape): ์ƒˆ๋กœ์šด ๋ชจ์–‘์€ ๊ฐ™์€ ์ˆ˜์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋‚˜๋Š” โ€‹โ€‹๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋น„ํšจ์œจ์ ์ธ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

def to_float(tensor):
    return th.stack((tensor.real().type(th.float64), tensor.imag().type(th.float64)), -1)

def to_complex(tensor):
    tensor = tensor.type(th.complex128) 
    return tensor[..., 0] + 1j*tensor[..., 1]

๋ถ„๋ช…ํžˆ ๊ทธ๊ฒƒ์€ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ์€ static_cast<double> ์ด๊ณ  ํ…์„œ์˜ ๋ชจ์–‘์„ (old_shape, 2) ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ numpy์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ดํ‚น์ด ์žˆ์Šต๋‹ˆ๋‹ค.

a = np.array([1 + 1j], dtype=np.complex128)
a.dtype = np.float64  ## This works

a = torch.tensor([1 + 1j], dtype=torch.complex128)
a.dtype = torch.float64  ## This does not work

dtype์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์ด ์ƒํ™ฉ์—์„œ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ณต์†Œ์ˆ˜๋ฅผ ์‹ค์ˆ˜์˜ ๊ธธ์ด 2 ๋ฐฐ์—ด๋กœ ํ•ด์„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ C++11์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

๋ณต์†Œ์ˆ˜ p์˜ ๋ฐฐ์—ด ์š”์†Œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์™€ ์œ ํšจํ•œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค i์˜ ๊ฒฝ์šฐ reinterpret_cast(p)[2 i]๋Š” ๋ณต์†Œ์ˆ˜ p[i]์˜ ์‹ค์ˆ˜๋ถ€์ด๊ณ  reinterpret_cast(p)[2 i + 1]์€ ๋ณต์†Œ์ˆ˜ p[i]์˜ ํ—ˆ์ˆ˜๋ถ€์ž…๋‹ˆ๋‹ค. (C++11๋ถ€ํ„ฐ)

์ด๊ฒƒ์€ complex_tensor๋ฅผ ๋ชจ์–‘(complex_shape, 2)์„ ๊ฐ€์ง„ real_tensor๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ real() ๋ฐ imag() ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@dylanbespalko ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ฌผ์„ ๋•Œ๋ฅผ ๋‘๋ ค์›Œํ–ˆ์Šต๋‹ˆ๋‹ค :) std::complex ๋ณด์ฆ์€ ๋ฐ์ดํ„ฐ ํฌ์ธํ„ฐ std::complex<float>* ๊ฐ€ ์žˆ์œผ๋ฉด float* ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์บ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค (์—„๊ฒฉํ•œ ์•จ๋ฆฌ์–ด์‹ฑ ์ค‘์–ผ๊ฑฐ๋ฆผ) ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ ์ค‘์ธ fft ํ•ญ๋ชฉ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋‹ด๋‹น์ž๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” fft/var๋งŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ํ…์„œ๋ฅผ float ํ…์„œ๋กœ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์žฌ๊ฒ€ํ† ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ค๋Š˜๋‚  PyTorch์— ์ด์— ๋Œ€ํ•œ ์ „๋ก€๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ๋‚œ๊ด€์— ๋ด‰์ฐฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Storage dtype์€ ํ•ญ์ƒ Tensor dtype๊ณผ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณต์žกํ•œ ์ฐฝ๊ณ ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ํ”Œ๋กœํŠธ ์ฐฝ๊ณ ๋กœ ๊ฒ€ํ† ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ํ•œ ๊ฐ€์ง€ ์ƒ๊ฐ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ถˆ๋ณ€๋Ÿ‰์„ ์™„ํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋ฌธ์ œ์˜ "๋ฒกํ„ฐํ™”๋˜์ง€ ์•Š์€" ์œ ํ˜•์œผ๋กœ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝคํ”Œ๋ ‰์Šค์˜ ๊ฒฝ์šฐfloat ํ…์„œ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  2. Tensor dtype์€ ์Šคํ† ๋ฆฌ์ง€ dtype๊ณผ ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ ์œ ํ˜•์˜ ๋ฒกํ„ฐํ™”๋œ ๋ณ€ํ˜•์œผ๋กœ๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ถˆ๋ณ€์„ฑ์„ ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@ezyang ,

๊ทธ๋ž˜ ์ด๊ฑด ์–ด์ฉ” ์ˆ˜ ์—†์—ˆ๋‹ค...

์ด ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋‹ด๋‹น์ž๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” fft/var๋งŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋งŽ์€ ๊ฒฝ์šฐ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ…์„œ ๋ฐ์ดํ„ฐ๋ฅผ std::vector๋กœ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ํ…์„œ๋ฅผ ๋ง ๊ทธ๋Œ€๋กœ float ํ…์„œ๋กœ ๋‹ค์‹œ ๋ด์•ผ ํ•œ๋‹ค๋ฉด....

๋‹ค๋ฅธ dtype์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…์„œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ๋“œ๋ญ…๋‹ˆ๋‹ค. Tensor set_dtype() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ์–‘์˜ ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ณดํญ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. dtype ์„ค์ •์ด numpy์—์„œ ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ(์šฐ์—ฐ์ธ๊ฐ€์š”?) ๋ฐ์ดํ„ฐ๋ฅผ DAC(๋””์ง€ํ„ธ-์•„๋‚ ๋กœ๊ทธ ๋ณ€ํ™˜๊ธฐ)์— ์—…๋กœ๋“œํ•  ๋•Œ ์ข…์ข… ์‹ค์ œ/ํ—ˆ์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ธํ„ฐ๋ฆฌ๋ธŒ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์Šคํ† ๋ฆฌ์ง€ dtype์—์„œ ํ…์„œ dtype์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์— ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น๋ถ„๊ฐ„์€ ์ด ์ผ์„ ํ”ผํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋‹ค๋ฅธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋งŽ์€ ๊ฒฝ์šฐ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ…์„œ ๋ฐ์ดํ„ฐ๋ฅผ std::vector๋กœ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ •ํ™•ํžˆ std::vector๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Tensor complex_tensor;
assert(complex_tensor.is_contiguous());
std::complex<float>* cp = complex_tensor.data_ptr<std::complex<float>>();
float* fp = reinterpret_cast<float*>(cp);
auto num_floats = complex_tensor.numel() * 2;

Tensor์šฉ set_dtype() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ์–‘์˜ ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ณดํญ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋ณดํญ๋„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‚˜์œ ์ƒ๊ฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ €๋Š” ๋‹ค๋ฅธ dtype์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ…์„œ์˜ ์—ด๋ ฌํ•œ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์ œ์ž๋ฆฌ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :)

๊ทธ๋Ÿฌ๋‚˜ DAC(๋””์ง€ํ„ธ-์•„๋‚ ๋กœ๊ทธ ๋ณ€ํ™˜๊ธฐ)์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ ์ข…์ข… ์‹ค์ œ/ํ—ˆ์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ธํ„ฐ๋ฆฌ๋ธŒ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์Šคํ† ๋ฆฌ์ง€ dtype์—์„œ ํ…์„œ dtype์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์— ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๊ถ๊ทน์ ์œผ๋กœ ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ผ์ด์ง€๋งŒ ์ง€๊ธˆ์€ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@ezyang ,

๋ณต์†Œ์ˆ˜ CUDA ์ง€์›์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. cuComplex : ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ add, sub, mul, div, real, imag ์ง€์›.
  2. Thrust::complex : ํ˜ธ์ŠคํŠธ ๋ฐ ์žฅ์น˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ง€์›ํ•˜๋Š” std::complex ์— ๋Œ€ํ•œ ๊ต์ฒด๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ง„๋ ฅ::๋ณต์žกํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ€์•ผ ํ•  ๊ธธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Thrust::Complex API ๋Š” thrust::complex<T> ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ˜ธ์ŠคํŠธ ๋ฐ ์žฅ์น˜ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด std::complex<T> ๋Š” ํ˜ธ์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

__host__ __device__     thrust::complex< T >::complex (const complex< T > &z)  //thrust container
__host__    thrust::complex< T >::complex (const std::complex< T > &z) //stl container.
  1. ์ด๊ฒƒ์€ AT_DISPATCH_COMPLEX_TYPES๊ฐ€ using scalar_t = std::complex<double> using scalar_t = thrust::complex<double> ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

  2. Pytorch๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด std::log ์— ํ•ด๋‹นํ•˜๋Š” CUDA๋ฅผ ์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜ํ•™ ์ปค๋„์— ํ•ด๋‹นํ•˜๋Š” CUDA๊ฐ€ ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  1. CPU์™€ CUDA์— ๋Œ€ํ•ด ๋ณดํŽธ์ ์œผ๋กœ thrust::complex<double> ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์–ด๋ ค์›€์€ CPU ์ „์šฉ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ถ”๋ ฅ์— ๋Œ€ํ•ด ๋นŒ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์˜ต์…˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ž์‹ ์˜ ๋ณต์žกํ•œ ์œ ํ˜•์„ ๊ตด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๊ฐ€ ์šฐ๋ฆฌ ์ž์‹ ์˜ ํ•˜ํ”„ ์œ ํ˜•์„ ๊ตด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌ). ๋˜๋Š” std::complex<> ๊ฐ€ ํŠน์ • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ–๋„๋ก ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์บ์ŠคํŠธ๋ฅผ ์žฌํ•ด์„ํ•˜์—ฌ ์Šน๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ์œ ํ˜• ๊ฐ„์˜ ์บ์ŠคํŒ…์„ ์žฌํ•ด์„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.
  2. THCNumerics.cuh์— ์ˆ˜ํ•™ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๊นŒ?

@iotamudelta ๋Š” #29547์—์„œ C++11 ๊ทœ์ • ์ค€์ˆ˜ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

std::real์€ C++14์˜ constexpr์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด std::real() ๋Š” constexpr ์ด์–ด์•ผ hcc ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ __device__ ์— ๋Œ€ํ•œ ๋ช…๋ น์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…:

  1. complex<double> ๋ฅผ double ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.
  1. ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

    • std::real ์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ˜ธ์ถœ์€ aten/src/ATen/native/cpu/zmath.h ์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ: inline constexpr :

      inline VALUE_TYPE real_impl (SCALAR_TYPE z) ->
      constexpr VALUE_TYPE real_impl (SCALAR_TYPE z)

      inline std::complex<float> real_impl <std::complex<float>> (std::complex<float> z) -> constexpr std::complex<float> real_impl <std::complex<float>> (std::complex<float> z)

      inline std::complex<float> real_impl <std::complex<double>> (std::complex<float> z) -> constexpr std::complex<float> real_impl <std::complex<double>> (std::complex<float> z)

constexpr ๊ฐ€ ์•„๋‹Œ std::real() ์— ๋Œ€ํ•œ ์ค‘์ฒฉ ํ˜ธ์ถœ์ด ์—ฌ์ „ํžˆ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3. std::complex๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ::real() ๋Œ€์‹  std::real() ์ด๊ฒƒ์€ C++11๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“  C++14๊นŒ์ง€๋Š” ์ด ์ฝ”๋“œ๊ฐ€ UB๋ผ๋Š” ๋ง์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. std::complex<double> ๋ฅผ double ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@iotamudelta , @bddppq , @ezyang ,

CUDA thrust::complex API์— ๋ณต์žกํ•œ UnaryOps ๋ฐ BinaryOps์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์ œ์ถœํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณต์†Œ์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ thrust::complex ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
aten/src/ATen/native/cuda/zmath.cuh

#pragma once

#include <complex>
#include <thrust/complex.h>

namespace at { namespace native {
namespace {

template <typename TYPE>
struct ztype_cuda {
  using value_t = TYPE; // Complex template type
  using thrust_t = TYPE; // Equivalent thrust type
};

template <>
struct ztype_cuda<std::complex<float>> {
  using value_t = float;
  using thrust_t = thrust::complex<float>;
};

template <>
struct ztype_cuda<std::complex<double>> {
  using value_t = double;
  using thrust_t = thrust::complex<double>;
};

} // end namespace
}} //end at::native

๊ทธ๋Ÿฐ ๋‹ค์Œ aten/src/ATen/native/cuda/BinaryOpsKernel.cu ์—์„œ
๋ฐ”๊พธ๋‹ค:

void add_kernel_cuda(TensorIterator& iter, Scalar alpha_scalar) {
  AT_DISPATCH_ALL_TYPES_AND2(kHalf, kBool, iter.common_dtype(), "add_cuda/sub_cuda", [&]() {
    auto alpha = alpha_scalar.to<scalar_t>();
    gpu_kernel_with_scalars(iter, [alpha]GPU_LAMBDA(scalar_t a, scalar_t b) -> scalar_t {
      return a + alpha * b;
    });
  });
}

์™€ ํ•จ๊ป˜:

void add_kernel_cuda(TensorIterator& iter, Scalar alpha_scalar) {
  AT_DISPATCH_ALL_TYPES_AND_COMPLEX_AND2(kHalf, kBool, iter.dtype(), "add_cuda/sub_cuda", [&]() {
    using thrust_t = typename ztype_cuda<scalar_t>::thrust_t;
    auto alpha = thrust_t(alpha_scalar.to<scalar_t>());
    gpu_kernel_with_scalars(iter, [alpha]GPU_LAMBDA(thrust_t a, thrust_t b) -> thrust_t {
      return a + alpha * b;
    });
  });
}

์งˆ๋ฌธ

  1. @ezyang : ๋ณต์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ scalar_t ๋ฐ thrust_t๋Š” ๋™์ผํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„ thrust_t ๋ฅผ scalar_t_c ์™€ ๊ฐ™์ด ๋ณต์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆซ์ž์— ๋” ์นœ์ˆ™ํ•œ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  2. ์ถ”๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ฝ”๋“œ์—์„œ ๋„๋ฆฌ ์ฐธ์กฐ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
    a) @bddppq : thrust::complex cuComplex ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
    b) @iotamudelta : ROCm2.7์—์„œ ์—‰๋ฉ์ด ์ถ”๋ ฅ์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  hip_complex ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
    Thrust::complex๋Š” cuComplex ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

@iotamudelta

std::real()์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. std::complex๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?::real()์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @dylanbespalko ,

@iotamudelta ๊ฐ€ ๋ถˆํ‰ํ•˜๋Š” ๊ฒƒ์€ ๋ณต์žกํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ cast_and_store ์— C10_HOST_DEVICE ์ด ๋ˆ„๋ฝ๋˜์–ด ํ•ด๋‹น ์ฝ”๋“œ ๊ฒฝ๋กœ๊ฐ€ GPU์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ UB๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ด ๋™์  ์บ์ŠคํŒ… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” GPU TensorIterator์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ์œ ํ˜• ์Šน๊ฒฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ GPU์—์„œ complex๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ complex type์— ๋Œ€ํ•œ cast_and_store ์—๋Š” C10_HOST_DEVICE ํ•œ์ •์ž๊ฐ€ ์—†์œผ๋ฉฐ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๊ดœ์ฐฎ์€ std::real ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๊ธฐ๋Šฅ. ์—ฌ๊ธฐ์— UB๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ณต์žกํ•œ ์ง€์›์„ GPU์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— https://github.com/pytorch/pytorch/blob/master/c10/core/ScalarType.h#L398 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ณตํ•ฉ๋ฌผ์€ ์œ ํ˜• ์Šน๊ฒฉ์— ์˜ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. L420, ์ด ์ฝ”๋“œ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋งค์šฐ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋ฉฐ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ˆ˜์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  https://github.com/pytorch/pytorch/pull/29547 ์—์„œ @iotamudelta ๊ฐ€ ํ•˜๋Š” ๋Œ€๋กœ C10_HOST_DEVICE ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ C10_HOST_DEVICE ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @iotamudelta ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์œผ๋ฉด ์—ฌ์ „ํžˆ C++11์˜ UB์ž…๋‹ˆ๋‹ค. ์ข‹์€ ์†”๋ฃจ์…˜์€ ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. std::real std::complex::real() ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

ํ•˜์ง€๋งŒ ๊ทธ ์™ธ์—๋„ https://github.com/pytorch/pytorch/blob/master/c10/util/TypeCast.h ํŒŒ์ผ์„ ๋ณด๋ฉด fetch_and_cast ๋‚ด๋ถ€์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

#ifndef C10_HOST_DEVICE
    AT_FORALL_COMPLEX_TYPES(FETCH_AND_CAST_COMPLEX_CASE)
#endif

์ด ์ฝ”๋“œ ๊ฒฝ๋กœ๋Š” GPU์—์„œ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ž‘๋™ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ fetch_and_cast ๋ฐ cast_and_store $ ๋‚ด์—์„œ $ complex<float> ์™€ complex<double> ์‚ฌ์ด์˜ ๋ณ€ํ™˜์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  dtypes์˜ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ๋ฒ”์œ„๋ฅผ ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค.

์ฐธ์กฐ: @ezyang ๋ฐ @bddppq

๋˜ํ•œ @dylanbespalko , PR์—์„œ TypeCast.h ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ์ €๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ARM์—์„œ torch.real() ๋ฐ torch.imag() ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ž‘์€ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฏ€๋กœ TypeCast.h ๋ฐ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. PR์—์„œ ์ฐธ์กฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€๋กœ ๋“œ๋ผ์ด๋ธŒ: @smessmer ๋Š” ์šฐ๋ฆฌ๋ฅผ C++14๋กœ ์˜ฎ๊ธฐ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ์‹œ์ ์—์„œ๋Š” UB๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ณง ๋‚˜์˜ฌ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— UB๊ฐ€ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ezyang : ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. Eigen๊ณผ ๊ฐ™์€ ํƒ€์‚ฌ ์ œํ’ˆ์˜ ๋Œ€๋ถ€๋ถ„์€ ์—ฌ์ „ํžˆ std::real() ๋งค์šฐ ์ž์œ ๋กญ๊ฒŒ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ณต์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆซ์ž์˜ ๊ฒฝ์šฐ scalar_t ๋ฐ thrust_t๋Š” ๋™์ผํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋ณ€์ˆ˜ ์ด๋ฆ„ thrust_t๋ฅผ scalar_t_c์™€ ๊ฐ™์€ ๋น„๋ณต์†Œ์ˆ˜์— ๋” ์นœ์ˆ™ํ•œ ๊ฒƒ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ scalar_t_c ๋Š” thrust_t ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋œ ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค( c ๋Š” ์–ด์จŒ๋“  ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?) ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์˜ ์œ ํ˜•์€ ์ƒ๋‹นํžˆ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค ๊ทธ๋ž˜์„œ ์˜๋„๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋งํ•˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. thrust_t ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ztype_cuda<>() ์— ๋›ฐ์–ด๋“ค๋ฉด scalar_t ๊ฐ€ ๋ณต์žกํ•˜์ง€ ์•Š์€ ์œ ํ˜•์˜ ๊ฒฝ์šฐ thrust_t ์ž„์„ ์ฆ‰์‹œ ์•Œ์•„์ฐจ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/pytorch/pytorch/pull/29612 ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! pytorch์— ๋ณต์žกํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ข‹์€ ์ง„์ „์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ์ด์— ๋Œ€ํ•œ ์ฃผ๋„๊ถŒ์„ ์žก๊ณ  CUDA ์ง€์›๋„ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹  @dylanbespalko ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋†’์€ ์ˆ˜์ค€์—์„œ ๋ณต์žกํ•œ ์ง€์›์˜ ํ˜„์žฌ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ฃผ๋กœ ๋ณต์žกํ•œ ํ…์„œ(์ด์ง„ ์—ฐ์‚ฐ)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ณฑํ•˜๊ธฐ ์œ„ํ•œ CUDA ์ง€์›์„ ์œ„ํ•œ ๋Œ€๋žต์ ์ธ ํƒ€์ž„๋ผ์ธ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š” @sunilkpai ์ž…๋‹ˆ๋‹ค .

CUDA: #30295์—์„œ ์ด์ง„ ๋ฐ ๋‹จํ•ญ ์—ฐ์‚ฐ์„ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ณต๊ฐœ PR์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์—ญ์ „ํŒŒ์™€ ๊ด€๋ จ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณต์†Œ์ˆ˜ abs() ์˜ ๋„ํ•จ์ˆ˜๋Š” ์‹ค์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ์ •์˜๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํŒŒ์ƒ ์ƒํ’ˆ์€ tools/autograd/derivatives.yaml ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณต์†Œ์ˆ˜ /dz abs(z) = z/abs(z) ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ˆ˜์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ sgn(z) ๋ณด๋‹ค ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dylanbespalko ๋‚ด ๋ณด๊ณ ์„œ https://arxiv.org/pdf/1701.00392.pdf ์˜ ํ‘œ 4.1, 4.2 ๋ฐ 4.3์ด ํŒŒ์ƒ ์ƒํ’ˆ์„ ์ •์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ๋„ํ•จ์ˆ˜(wirtinger calculus)์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฏธ๋ถ„ wrt z ๋˜๋Š” z ์ผค๋ ˆ ๊ณ„์‚ฐ.
์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ wrt z conjugate ๋„ํ•จ์ˆ˜๋ฅผ ๋” ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
ํ–‰๋ ฌ ์—ฐ์‚ฐ์— ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง€๊ณ  ๊ทธ๋ผ๋””์–ธํŠธ ์—…๋ฐ์ดํŠธ์— ์ผค๋ ˆ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด๋“ค์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • z = x + jy #$์— ๋Œ€ํ•œ ํŒŒ์ƒ ์ƒํ’ˆ z $: dJ/dz = dJ/dx -j dJ/dy
  • z = x + jy์— ๋Œ€ํ•œ ํŒŒ์ƒ ์ƒํ’ˆ z.conj z = x + jy : dJ/dz.conj = dJ/dx + j dJ/dy

๊ท€ํ•˜์˜ ์˜๊ฒฌ์—์„œ ๋‚ด ๊ฐ€์ •์€ ํ˜„์žฌ z ํŒŒ์ƒ ์ƒํ’ˆ์„ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ ํŒŒ์ƒ ์ƒํ’ˆ์€ d abs(z) / d z = z.conj / abs(z) ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด @Randl ์ œ์•ˆ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์„ค๋ช…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์„ธ์š”. ๋ณต์žกํ•œ ํŒŒ์ƒ ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ numpy ๊ตฌํ˜„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์šฉํ•  ๋˜ ๋‹ค๋ฅธ ์—ฐ์‚ฐ(ํŠนํžˆ ๋ณต์†Œ์ˆ˜ ์ง€์›์ด ํ•„์š”ํ•œ ๋ฌผ๋ฆฌ ๊ณต๊ฐ„์˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด)์€ exp() ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ธฐ์ž…๋‹ˆ๋‹ค. tensorflow์—๋Š” tf.exp(x + iy) = tf.exp(x) * (tf.cos(y) + 1j * tf.sin(y)) ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. pytorch์—์„œ๋„ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๊นŒ?

@sunilkpai , @boeddeker , @Randl ,

๋ณต์žกํ•œ ํŒŒ์ƒ ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋”ฐ๋ฅด๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๊ณ  ๋‚˜๋Š” ๋‹ค์Œ ์ฃผ์— ์ด๊ฒƒ์„ ๋‹ค์‹œ ํ•  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณต์†Œ์ˆ˜์˜ ์ƒํƒœ๋Š” ๋น„๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋ฉฐ PyTorch ํ™•์žฅ์„ ํ†ตํ•ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ํ™•์žฅ์—๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ํ•„์š”ํ•œ ์ˆ˜ํ•™ ์ปค๋„ ๋“ฑ๋ก์ด ํฌํ•จ๋œ .cpp .
  • pytorch ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์˜ ๋งค์šฐ ๋‹จ์ˆœํ™”๋œ ๋ฒ„์ „์ด ํฌํ•จ๋œ test/ ํด๋”.
    ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ง€์›๋˜๋Š” ์ปค๋„๊ณผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ปค๋„์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์ฝ˜์†”์— ์ธ์‡„ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • Tensor python ๊ฐ์ฒด์—๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋Š” ์˜ˆ์œ ์ธ์‡„ ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • tensor.py ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ธ์‡„ ํ˜•์‹์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋˜๋Š” ๊ฐ„๋‹จํžˆ Pytorch ํ…์„œ๋ฅผ Numpy ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ƒํƒœ:

  • CPU ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ์ƒ๋‹นํžˆ ์ข‹์Šต๋‹ˆ๋‹ค.

    • ์ปค๋„์€ 'aten/src/ATen/native/cpu/ </li> <li>Complex number specific code is under 'aten/src/ATen/native/cpu/zmath.h ์•„๋ž˜ PyTorch ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

    • Intel AVX256 ๊ฐ€์†์€ 'aten/src/ATen/cpu/vec256/' ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.



      • @sunilkpai : exp ์ตœ์ ํ™”๋ฅผ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•œ ํด๋”์ž…๋‹ˆ๋‹ค.


      • ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜์‹ ์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.



  • GPU ์ ์šฉ ๋ฒ”์œ„๋Š” ์ด์ง„ ๋ฐ ๋‹จํ•ญ ์—ฐ์‚ฐ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

    • ์ปค๋„์€ 'aten/src/ATen/native/cuda/* </li> <li>Complex number specific code is under 'aten/src/ATen/native/cuda/zmath.cuh ์•„๋ž˜ PyTorch ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

    • thrust::complex<T> ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์‚ฌ์šฉ๋˜๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ์ตœ์ ํ™”๋œ ์ปค๋„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ฐœ๋ฐœ:

  • C ๊ธฐ๋ฐ˜ TH ์ปค๋„์ด C++ Aten ํด๋”๋กœ ์ด์‹๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • rand() ํ•จ์ˆ˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ pytorch์˜ ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ๋กœ ์ด์‹ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ์ผ๋ถ€ ์ธ๋ฑ์‹ฑ ์ž‘์—…์€ ํ˜„์žฌ ์ด์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ํ˜„์žฌ TH์—์„œ ATen์œผ๋กœ ์ด์‹ํ•ด์•ผ ํ•˜๋Š” 168/1300 ์ˆ˜ํ•™ ์ปค๋„(10์›” 230์—์„œ ๊ฐ์†Œ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์ปค๋„์„ ATen์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ๋ณต์†Œ์ˆ˜ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

--

์ฐธ๊ณ ๋กœ ๋ณต์žกํ•œ ํŒŒ์ƒ ์ƒํ’ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ Julia์—์„œ ๊ธด ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๊ณ  ์ด์ œ ChainRules ( http://www.juliadiff.org/ChainRules.jl/dev/api.html#ChainRulesCore.Wirtinger ์ฐธ์กฐ) ๋ฐ Zygote ์—์„œ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. . ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€
\partial L/\partial adjoint(z) ๊ทธ๋ผ๋””์–ธํŠธ(์ •์˜์ƒ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฐ์†Œ ๋ฐฉํ–ฅ)๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋„ํ•จ์ˆ˜๋Š” \partial L/\partial z ์™€ ๋‹ค๋ฅด๋ฉฐ ๋ณต์†Œ์ˆ˜ AD๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. . ์ž์„ธํ•œ ๊ทœ์น™์€ ChainRules ๋˜๋Š” Zygote/lib ์— ๊ตฌํ˜„๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ฐ˜ ๊ทœ์น™๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ๋ณต์†Œ์ˆ˜์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๊ทœ์น™์ด ์—†์Šต๋‹ˆ๋‹ค. matmul ๋Š” ์ผ๋ฐ˜ ์ •์˜๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: adjoint(A) * B ).

๋ณต์žกํ•œ ํ…์„œ๋ฅผ ์ฝ˜์†”์— ์ธ์‡„ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
Tensor python ๊ฐ์ฒด์—๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๋Š” ์˜ˆ์œ ์ธ์‡„ ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.
tensor.py์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ธ์‡„ ํ˜•์‹์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜๋Š” ๊ฐ„๋‹จํžˆ Pytorch ํ…์„œ๋ฅผ Numpy ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋””๋ฒ„๊น… ๋“ฑ์„ ์œ„ํ•ด https://github.com/Roger-luo/pytorch-complex ์—์„œ ์ธ์‡„์˜ ์ ์–ด๋„ ์ผ๋ถ€๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋งˆ์Šคํ„ฐ๊ฐ€ ๊ณผ๊ฑฐ์— ๋งŽ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋„์›€์ด ๋ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…„๋„. ๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

@dylanbespalko ์ €๋Š” ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ pytorch ๋‚ด๋ถ€์— ์ƒ๋Œ€์ ์œผ๋กœ ๊ฒฝํ—˜์ด ์—†์Šต๋‹ˆ๋‹ค! aten/src/ATen/cpu/vec256/* ์—์„œ ๋ณธ ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉด ์ด ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ std::exp(std::complex) ์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์ด์ „ ์˜๊ฒฌ์—์„œ : https://en.cppreference.com/w/cpp/numeric/complex/exp ์˜ ๋ฉ”๋ชจ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ์ด๊ฒƒ์ด CUDA์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(ํ˜„์žฌ ์‹ค์ œ, imag, conj ๋ฐ ๊ฐ๋„๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ?).

@sunilkpai ,

์ œ๊ณต๋œ ๋ฐฉ์ •์‹์„ ์‚ฌ์šฉํ•˜์—ฌ exp() ์— ๋Œ€ํ•œ AVX ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ PyTorch์˜ ์ตœ๊ทผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. #30871์—์„œ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@dylanbespalko

TH์—์„œ ATen์œผ๋กœ ์ด์‹ํ•˜๋Š” ์ผ์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚ด๊ฐ€ pytorch์˜ ๋‚ด๋ถ€ ์ž‘๋™์— ์ •ํ†ตํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” arxiv ์—์„œ ๋ณต์žกํ•œ svd์˜ ์—ญ์ „ํŒŒ๋ฅผ ์œ„ํ•œ ๊ณต์‹์„ ์ฐพ์•˜๊ณ  ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@์•ผ์ฝฅ-์–ธํ”„๋ฆฌ๋“œ

https://github.com/pytorch/pytorch/wiki/TH-to-ATen-porting-guide

TH ์ปค๋„์€ C๋กœ ๊ตฌํ˜„๋˜๋ฉฐ ๊ณ ์œ ํ•œ ์ฐธ์กฐ ์นด์šดํŒ… ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ณต์žกํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๊ฑฐ์˜ ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ์ปค๋„์ด ๋“ฑ๋ก๋œ aten/src/ATen/native/native_functions.yaml ์—์„œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

legacy::cpu::_th ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ•ด๋‹น ์ˆซ์ž๋ฅผ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ด์ „ TH ์ปค๋„ ์ˆ˜๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
legacy::cpu::_thnn ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ด์ „ TH ์‹ ๊ฒฝ๋ง ์ปค๋„์˜ ์ˆ˜๋กœ ํ•ด๋‹น ์ˆซ์ž๋ฅผ 3์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

๊ฐ ์ปค๋„์€ ์ผ๋ฐ˜์ ์œผ๋กœ 3๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
1. ์ผ๋ฐ˜ ์ปค๋„ y = add(a, b)
2. ์ธํ”Œ๋ ˆ์ด์Šค ์ปค๋„ a = add_(a, b)
3. ์ถœ๋ ฅ ์ปค๋„ add_out(a, b, out=y)
์‹ค์ œ ๊ตฌํ˜„์€ ํ•ญ์ƒ ์ถœ๋ ฅ ์ปค๋„์— ์žˆ๊ณ  ๋‹ค๋ฅธ 2๊ฐœ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

nn ์ปค๋„์€ ์ข…์† ์ปค๋„์ด ๋” ์ ๊ธฐ ๋•Œ๋ฌธ์— ์ด์‹ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋„์„ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•์˜ ์—ญ์ˆœ์œผ๋กœ ์ปค๋„์„ ์ด์‹ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ „์ฒด ์ž‘์—…์„ ๋œ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํฌํŒ… ์ถ”์  ๋ฌธ์ œ ํ™•์ธ https://github.com/pytorch/pytorch/issues/24507 , @VitalyFedyunin ๋„ ์ฐธ์กฐ

๋‹ค์Œ์€ #32437์—์„œ ์š”์ฒญํ•œ ๋ณต์†Œ์ˆ˜ ์ง€์›์— ๋Œ€ํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์˜ค๋Š˜ CPU ๊ด€๋ จ ์ง€์›์„ ์œ„ํ•ด ๋‹ค์‹œ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜คํ† ๊ทธ๋ผ๋“œ ์ง€์›

  • ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•  ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์•˜๋‹ค.
  • angle() , real() , imag() , conj() ๋ชจ๋‘ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • abs() ๋Š” ๋ณต์†Œ์ˆ˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (์œ„์˜ @boeddeker ๋ฐ @Randl ์˜ ๋ฉ”๋ชจ ์ฐธ์กฐ)

ํ•˜๋“œ์›จ์–ด ์ง€์›

๋ณต์†Œ์ˆ˜ ์ง€์›์€ ํ˜„์žฌ ํŠธ๋ฆฌ ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ธํŠธ๋ฆฌ ์ฝ”๋“œ

  • ์ˆ˜ํ•™ ์—ฐ์‚ฐ์€ ์‹ค์ œ๋กœ ํŠธ๋ฆฌ ๋‚ด(PyTorch ์†Œ์Šค ์ฝ”๋“œ ๋‚ด)์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค .
  • ํŠธ๋ฆฌ ๋‚ด Pytorch ํ…Œ์ŠคํŠธ ์ค‘ ์–ด๋–ค ๊ฒƒ๋„ ๋ณต์†Œ์ˆ˜ ์ง€์›์„ ๊ฒ€์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ทธ๋ž˜์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ).
  • PyTorch๊ฐ€ TH์—์„œ ATen์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์ž…๋‹ˆ๋‹ค(#24507).
    - TH์—์„œ ๊ตฌํ˜„๋œ ์ˆ˜ํ•™ ์ปค๋„์€ ๋ณต์†Œ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    - ATen์—์„œ ๊ตฌํ˜„๋œ ์ปค๋„๋งŒ ๋ณต์†Œ์ˆ˜๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ dtype์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด PyTorch ํ™•์žฅ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ ์™ธ๋ถ€ ์ฝ”๋“œ

  • ์—ฌ๋Ÿฌ PyTorch ํ™•์žฅ์ด ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ ํ–ฅํ›„ ์‰ฝ๊ฒŒ ๋‚ด๋ถ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ ํ™•์žฅ์—๋Š” 4๊ฐœ์˜ ์ค‘์š”ํ•œ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • setup.py: pytorch ํ™•์žฅ์„ ๋นŒ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    • [CPU/CUDA/FPGA]ComplexType.cpp: CPUType.cpp ๋˜๋Š” CUDAType.cpp์™€ ์œ ์‚ฌํ•œ ์ˆ˜ํ•™ ์ปค๋„ ๋“ฑ๋ก

    • test/test_torch.py: Aten ์ง€์›์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” ์ž‘๋™ ์ค‘์ธ ์ปค๋„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋งค์šฐ ๋ณด๊ธฐ ํ‰ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค.

    • test/test_autograd.py: autograd ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ.

ํŠธ๋ฆฌ ์™ธ๋ถ€ PyTorch ํ™•์žฅ

  1. cpu_strided_complex
    - [x] ์นดํ”ผ ์ปค๋„
    - [ ] ํ…์„œํŒฉํ† ๋ฆฌ(th_random, th_uniform, th_normal)
    - [x] RangeFactories
    - [x] BinaryOpKernal
    - [x] UnaryOpKernels
    - [x]CompareOpKernels
    - [x] PowerKernels
    - [x] ReduceOpKernels(th_min, th_max, ์ผ๋ถ€ ๊ทœ๋ฒ”์€ ๋ณต์†Œ์ˆ˜ ์ผค๋ ˆ๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Œ)
    - [ ] IndexOpKernels(th_masked_select_bool, th_set, th_gather, th_cat)
    - [x] PointwiseOps
    - [x] Lerp Ops
    - [ ] BlasOps(th_mv, th_mm, th_fmod, th_eig)
    - [ ] LinpackOps(Blas ์‚ฌ์šฉ)
    - [ ] SpectralOps(์ง€์›๋˜์ง€๋งŒ ์ž‘์—…์ด ํ•„์š”ํ•จ)

    1. cuda_strided_complex



      • [x] ์นดํ”ผ ์ปค๋„


      • [ ] TensorFactories(cpu ๋ฌธ์ œ ์ฐธ์กฐ)


      • [x] BinaryOpKernal


      • [x] UnaryOpKernels(Todo: ๊ฐ๋„, ์‹ค์ˆ˜, ์ด๋ฏธ์ง€, ๊ฒฐํ•ฉ ์ถ”๊ฐ€)


      • [ ] OpKernel ๋น„๊ต(Todo)


      • [ ] ReduceOpKernels(WARP_SIZE ๊ด€๋ จ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€)


      • GPU๋Š” point-wise ๊ณ„์‚ฐ ์ด์ƒ์œผ๋กœ ์–ด๋ ค์›Œ์ง€์ง€๋งŒ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์ง€์›๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



  2. vitis_strided_complex

    • Xilinx Vitis๋Š” ์„œ๋ฒ„ ๋ฐ ์ž„๋ฒ ๋””๋“œ ์žฅ์น˜๋ฅผ ์ง€์›ํ•˜๋Š” FPGA ๊ณ ์ˆ˜์ค€ ํ•ฉ์„ฑ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

    • 2019๋…„ 10์›”์— ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๊ธฐ์— ๋Œ€ํ•œ ์ง€์›์ด ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์Œ).

    • SDAccel(์„œ๋ฒ„)๊ณผ VIvado HLS(์ž„๋ฒ ๋””๋“œ)๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

    • [ ] BinaryOpKernals(1์›” ๋ง)

    • [ ] UnaryOpKernels(1์›” ๋ง)

    • [ ] ReduceOpKernels(2์›” ๋ง).

    • FPGA๋Š” ์ตœ๊ทผ Vec256 PyTorch ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ ๋ฒกํ„ฐํ™”๋œ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

    • Vec256์€ CPU์— ๋ณต์žกํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ  $C$ ๋˜๋Š” $R^N$ ํ…์„œ ๊ณต๊ฐ„์„ ๊ตฌํ˜„ํ•˜๋Š” ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์—…๋ฐ์ดํŠธ: https://github.com/pytorch/pytorch/issues/33152

์ด๊ฒƒ์€ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ˜„์žฌ ๋ฌธ์„œ์— 'ํ˜„์žฌ pytorch๊ฐ€ ๋ณต์†Œ์ˆ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹'์„ ์„ค๋ช…ํ•˜๋Š” ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์‹ค์งˆ์ ์œผ๋กœ ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ช… ๋ง์…ˆ, ๊ณฑ์…ˆ, ์ผ์ข…์˜ ๊ทœ๋ฒ”์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณต์žกํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์˜๋„ํ•œ ํ˜„์žฌ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ์ค„์˜ ๋ฌธ์„œ๋กœ ์š”์•ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ˜„์žฌ ๋ฌธ์„œ์— 'ํ˜„์žฌ pytorch๊ฐ€ ๋ณต์†Œ์ˆ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹'์„ ์„ค๋ช…ํ•˜๋Š” ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์‹ค์งˆ์ ์œผ๋กœ ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ช… ๋ง์…ˆ, ๊ณฑ์…ˆ, ์ผ์ข…์˜ ๊ทœ๋ฒ”์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณต์žกํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์˜๋„ํ•œ ํ˜„์žฌ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ์ค„์˜ ๋ฌธ์„œ๋กœ ์š”์•ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @redwrasse ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์˜ ๋ณต์žกํ•œ ํ…์„œ์— ๋Œ€ํ•ด ์ง€์›๋˜๋Š” ์ผ๋ถ€ ํ† ์น˜ ๊ธฐ๋ณธ ๋ฐ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๋ณต์†Œ์ˆ˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
(๋Œ€๋ถ€๋ถ„์€ 1.6 ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋จ) https://pytorch.org/docs/master/complex_numbers.html?highlight=complex. ๋‹ค๋ฅธ ์–ด๋–ค ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ์ง€์› ๋ฐ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ๊ณ„ํš์— ๋Œ€ํ•ด ๋” ์ด์•ผ๊ธฐํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ˜„์žฌ ๋ฌธ์„œ์— 'ํ˜„์žฌ pytorch๊ฐ€ ๋ณต์†Œ์ˆ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹'์„ ์„ค๋ช…ํ•˜๋Š” ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์‹ค์งˆ์ ์œผ๋กœ ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ช… ๋ง์…ˆ, ๊ณฑ์…ˆ, ์ผ์ข…์˜ ๊ทœ๋ฒ”์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณต์žกํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์˜๋„ํ•œ ํ˜„์žฌ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ์ค„์˜ ๋ฌธ์„œ๋กœ ์š”์•ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @redwrasse ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์˜ ๋ณต์žกํ•œ ํ…์„œ์— ๋Œ€ํ•ด ์ง€์›๋˜๋Š” ์ผ๋ถ€ ํ† ์น˜ ๊ธฐ๋ณธ ๋ฐ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๋ณต์†Œ์ˆ˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
(๋Œ€๋ถ€๋ถ„์€ 1.6 ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋จ) https://pytorch.org/docs/master/complex_numbers.html?highlight=complex. ๋‹ค๋ฅธ ์–ด๋–ค ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ์ง€์› ๋ฐ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ๊ณ„ํš์— ๋Œ€ํ•ด ๋” ์ด์•ผ๊ธฐํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@anjali411 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋ฅผ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ์€ '๋ณต์žกํ•œ ์‹ ๊ฒฝ๋ง์— ๋Œ€ํ•œ ํ˜„์žฌ ์ง€์› ์ƒํƒœ'์˜ ๋ช‡ ์ค„ ์•ž๊ณผ ์ค‘์•™์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ...

๋ณต์žกํ•œ autograd์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ https://github.com/pytorch/pytorch/issues/41857 ์—์„œ PyTorch๊ฐ€ ๋”ฐ๋ฅผ ๊ทœ์น™(JAX ๋˜๋Š” TF)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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