Numpy: ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์— ๋Œ€ํ•ด`np.vdot`์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 08์›” 10์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

numpy.vdot ๋Š” ๋น„ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ __array__ ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด segfault๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

segfault๋Š” ๋‹ค์Œ ์ฝ”๋“œ ์ค„์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2245
PyArray_DescrFromType ๊ฐ€ ์‹คํŒจํ•˜๋ฉด type ๊ฐ€ NULL type ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์žฌํ˜„ ์ฝ”๋“œ ์˜ˆ :

import numpy as np

class Foo(object):
     def __array__(self, a):
         return self

np.vdot(Foo(), Foo())

์—๋Ÿฌ ๋ฉ”์‹œ์ง€:

์—ญ ์ถ”์  :

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x0000000100cef88e _multiarray_umath.cpython-37m-darwin.so`array_vdot + 126
    frame #1: 0x00000001005e0994 python`PyCFunction_Call + 148
    frame #2: 0x0000000100c48dc1 _multiarray_umath.cpython-37m-darwin.so`array_implement_array_function + 305
    frame #3: 0x00000001005e11b3 python`_PyMethodDef_RawFastCallKeywords + 227
    frame #4: 0x00000001005e071c python`_PyCFunction_FastCallKeywords + 44
    frame #5: 0x00000001006b6048 python`call_function + 664
    frame #6: 0x00000001006b2a18 python`_PyEval_EvalFrameDefault + 27080
    frame #7: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
    frame #8: 0x00000001005e06d6 python`_PyFunction_FastCallKeywords + 230
    frame #9: 0x00000001006b60d9 python`call_function + 809
    frame #10: 0x00000001006b2987 python`_PyEval_EvalFrameDefault + 26935
    frame #11: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
    frame #12: 0x00000001006abfb0 python`PyEval_EvalCode + 48
    frame #13: 0x00000001006ee677 python`PyRun_InteractiveOneObjectEx + 615
    frame #14: 0x00000001006ede4e python`PyRun_InteractiveLoopFlags + 190
    frame #15: 0x00000001006edd5c python`PyRun_AnyFileExFlags + 60
    frame #16: 0x0000000100710c51 python`pymain_main + 7873
    frame #17: 0x000000010071127f python`_Py_UnixMain + 111
    frame #18: 0x00007fff5f6e63d5 libdyld.dylib`start + 1

Numpy / Python ๋ฒ„์ „ ์ •๋ณด :

๋‚˜๋Š” ์ด๊ฒƒ์„ Mac OS X์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

1.17.0 3.7.2 (default, Jan 16 2019, 11:36:28)
[Clang 10.0.0 (clang-1000.11.45.2)]

๋‚ด๋ถ€ Linux ๋นŒ๋“œ์—์„œ.

์ด ๋ฌธ์ œ๋Š” ์›๋ž˜ https://github.com/google/jax/issues/1162 ๋กœ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

00 - Bug

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

ํ , vdot ๋Š” ์ถœ๋ ฅ dtype์ด ๋ฏธ๋ฆฌ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜์ด ํ•จ์ˆ˜๋Š” ์‹คํŒจํ•˜๊ณ  NPY_NOTYPE ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ NPY_NOTYPE ์ด ๋ฐ˜ํ™˜ ๋  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2241 (๋ฐ ๋‹ค์Œ ์ค„)์— ์žˆ์œผ๋ฉฐ, ํ‘œ์‹œ๋˜๋Š” ์˜ค๋ฅ˜๋Š” ๋‚˜์ค‘์— ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋„ ์ถ”๊ฐ€ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค).

ํ™๋ณดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

(์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ๋ˆ„๋ฝ ๋œ ์œ ์‚ฌํ•œ ์šฉ๋„๊ฐ€ ๋” ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.)

์•ˆ๋…•ํ•˜์„ธ์š”,
์ €๋Š” ์‹ ๊ทœ ์ด๋ฏผ์ž์ด๋ฉฐ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ•˜๋‚˜์š”?
๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์›Œํฌ ํ”Œ๋กœ์šฐ ์— ๋Œ€ํ•ด ์ฝ์–ด๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ master ์ง€์  ( git checkout master; git clean -xfd; python runtests.py )์—์„œ python runtests.py ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ์ง€์ ์— ๋„๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด ํ•ดํ‚น์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ( numpy/core/tests/teste_multiarray.py ์˜ TestVDot ๊ฐ€ ์ข‹์€ ๊ณณ), ์œ„์˜ ํžŒํŠธ์—์„œ C ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • ํ•ด๋ณด์„ธ์š”. . ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ๋„์›€์„ ์š”์ฒญํ•˜๋ฉด ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ฅด๊ณ  ํžŒํŠธ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด ์ง„์ •์œผ๋กœ ๋…ธ๋ ฅํ–ˆ์Œ์„ ๋” ๋งŽ์ด ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ Soniyanayak51 ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

@mattip์˜ ๋ง์—

@rgommers @mattip PyArray_DescrFromType ()์—์„œ ์–ป์€ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. PyArray_DESCR ()์— ๋Œ€ํ•ด์„œ๋„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ test_multiarray.py์— ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ test_PyArrayType์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์œ ํ˜•์ด NULL ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@rgommers @mattip PyArray_DescrFromType ()์—์„œ ์–ป์€ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. PyArray_DESCR ()์— ๋Œ€ํ•ด์„œ๋„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ test_multiarray.py์— ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ test_PyArrayType์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์œ ํ˜•์ด NULL ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@mattip ์ด PR์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ ๋Œ€๋‹ต ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”๋ฅผ ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

test_PyArrayType์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์œ ํ˜•์ด NULL ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์•ฝ๊ฐ„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์›์น™์€ ๊ณต์šฉ API ๋งŒ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€

...
np.vdot(Foo(), Foo())

์œ„์˜ ๋ฌธ์ œ ์„ค๋ช…์—์„œ ํ…Œ์ŠคํŠธ๋กœ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. C API๋ฅผ ๋ณ„๋„๋กœ ํ…Œ์ŠคํŠธ ํ•  ํ•„์š”๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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