Numpy: numpy 1.14.5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์‹œ์Šคํ…œ์—์„œ np.dot ์ถฉ๋Œ

์— ๋งŒ๋“  2018๋…„ 07์›” 06์ผ  ยท  61์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

์‹œ์Šคํ…œ ์ค‘ ํ•˜๋‚˜์—์„œ ๋‹ค์Œ ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ์œผ๋กœ ์ธํ•ด Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

import numpy as np
A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
np.dot(A, B)

์„ธ๋ถ€ ์‚ฌํ•ญ :

  • ์œˆ๋„์šฐ 10
  • ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ Python 3.5.2
  • numpy 1.14.5

๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋Š”์ด ๋ช…๋ น์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

00 - Bug

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

๋‹น์‹ ์€ ๋‹น์‹ ์˜ numpy๋ฅผ ์–ด๋””์—์„œ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์”จ? ์•„๋‚˜์ฝ˜๋‹ค? np.show_config() ์€ ๋ฌด์—‡์„ ๋งํ•ฉ๋‹ˆ๊นŒ?

์‘๋‹ต ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. pip๋ฅผ ํ†ตํ•ด numpy๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

>>> import numpy as np
>>> np.show_config()
blas_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
    library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
    libraries = ['openblas']
    define_macros = [('HAVE_CBLAS', None)]
    language = f77
blis_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
openblas_info:
    library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
    libraries = ['openblas']
    define_macros = [('HAVE_CBLAS', None)]
    language = f77
lapack_opt_info:
    library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
    libraries = ['openblas']
    define_macros = [('HAVE_CBLAS', None)]
    language = f77
blas_opt_info:
    library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
    libraries = ['openblas']
    define_macros = [('HAVE_CBLAS', None)]
    language = f77

์ปดํ“จํ„ฐ์—์„œ ์ตœ์‹  Microsoft Visual C ๋Ÿฐํƒ€์ž„์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๊นŒ?
๋„์›€? Windows ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

@pv ํžŒํŠธ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•˜์ง€๋งŒ ์ตœ์‹  2017 ๋Ÿฐํƒ€์ž„์„ ์„ค์น˜ํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„์—๋„ ์˜ค๋ฅ˜๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์˜ํ–ฅ์„๋ฐ›๋Š” ์‹œ์Šคํ…œ์€ KVM์—์„œ ์‹คํ–‰๋˜๋Š” Windows 10์ž…๋‹ˆ๋‹ค.

์œ„์˜ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ t.py ๋กœ ์‹คํ–‰ํ•˜๋ฉด python -u -m trace -t t.py , ์ถฉ๋Œ ์ „์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

t.py(4): A = np.matrix([[1.], [3.]])
 --- modulename: defmatrix, funcname: __new__
defmatrix.py(213):         if isinstance(data, matrix):
defmatrix.py(221):         if isinstance(data, N.ndarray):
defmatrix.py(232):         if isinstance(data, str):
defmatrix.py(236):         arr = N.array(data, dtype=dtype, copy=copy)
defmatrix.py(237):         ndim = arr.ndim
defmatrix.py(238):         shape = arr.shape
defmatrix.py(239):         if (ndim > 2):
defmatrix.py(241):         elif ndim == 0:
defmatrix.py(243):         elif ndim == 1:
defmatrix.py(246):         order = 'C'
defmatrix.py(247):         if (ndim == 2) and arr.flags.fortran:
defmatrix.py(248):             order = 'F'
defmatrix.py(250):         if not (order or arr.flags.contiguous):
defmatrix.py(253):         ret = N.ndarray.__new__(subtype, shape, arr.dtype,
defmatrix.py(254):                                 buffer=arr,
defmatrix.py(255):                                 order=order)
 --- modulename: defmatrix, funcname: __array_finalize__
defmatrix.py(259):         self._getitem = False
defmatrix.py(260):         if (isinstance(obj, matrix) and obj._getitem): return
defmatrix.py(261):         ndim = self.ndim
defmatrix.py(262):         if (ndim == 2):
defmatrix.py(263):             return
defmatrix.py(256):         return ret
t.py(5): B = np.matrix([[2., 3.]])
 --- modulename: defmatrix, funcname: __new__
defmatrix.py(213):         if isinstance(data, matrix):
defmatrix.py(221):         if isinstance(data, N.ndarray):
defmatrix.py(232):         if isinstance(data, str):
defmatrix.py(236):         arr = N.array(data, dtype=dtype, copy=copy)
defmatrix.py(237):         ndim = arr.ndim
defmatrix.py(238):         shape = arr.shape
defmatrix.py(239):         if (ndim > 2):
defmatrix.py(241):         elif ndim == 0:
defmatrix.py(243):         elif ndim == 1:
defmatrix.py(246):         order = 'C'
defmatrix.py(247):         if (ndim == 2) and arr.flags.fortran:
defmatrix.py(248):             order = 'F'
defmatrix.py(250):         if not (order or arr.flags.contiguous):
defmatrix.py(253):         ret = N.ndarray.__new__(subtype, shape, arr.dtype,
defmatrix.py(254):                                 buffer=arr,
defmatrix.py(255):                                 order=order)
 --- modulename: defmatrix, funcname: __array_finalize__
defmatrix.py(259):         self._getitem = False
defmatrix.py(260):         if (isinstance(obj, matrix) and obj._getitem): return
defmatrix.py(261):         ndim = self.ndim
defmatrix.py(262):         if (ndim == 2):
defmatrix.py(263):             return
defmatrix.py(256):         return ret
t.py(6): print(np.dot(A, B))
 --- modulename: defmatrix, funcname: __array_finalize__
defmatrix.py(259):         self._getitem = False
defmatrix.py(260):         if (isinstance(obj, matrix) and obj._getitem): return
defmatrix.py(261):         ndim = self.ndim
defmatrix.py(262):         if (ndim == 2):
defmatrix.py(263):             return

ํ ,

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
print(np.dot(A.astype(np.float16), B.astype(np.float16)))

์ด๊ฑด ์ถฉ๋Œ

A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
print(np.dot(A.astype(np.float32), B.astype(np.float32)))

์–ด๋–ค ์ƒ๊ฐ?

๋‹ค๋ฅธ numpy ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ๋†€์•„ ๋ณธ ํ›„์—๋Š”

  • numpy <= 1.13.1์€ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์ง€๋งŒ
  • numpy> = 1.13.3์ด์ด ๋ฌธ์ œ์˜ ์˜ํ–ฅ์„๋ฐ›์Šต๋‹ˆ๋‹ค.
  • pypi์— ๋นŒ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— numpy 1.13.2๋Š” ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

์–ด๋–ค ์ •๋ณด์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

OS Name Microsoft Windows 10 Pro
Version 10.0.16299 Build 16299
Other OS Description    Not Available
OS Manufacturer Microsoft Corporation
System Name <REMOVED>
System Manufacturer QEMU
System Model    Standard PC (i440FX + PIIX, 1996)
System Type x64-based PC
System SKU  
Processor   Common KVM processor, 1996 Mhz, 4 Core(s), 4 Logical Processor(s)
BIOS Version/Date   SeaBIOS rel-1.11.0-0-g63451fca13-prebuilt.qemu-project.org, 4/1/2014
SMBIOS Version  2.8
Embedded Controller Version 255.255
BIOS Mode   Legacy
Platform Role   Desktop
Secure Boot State   Unsupported
PCR7 Configuration  Binding Not Possible
Windows Directory   C:\WINDOWS
System Directory    C:\WINDOWS\system32
Boot Device \Device\HarddiskVolume1
Locale  Austria
Hardware Abstraction Layer  Version = "10.0.16299.371"
User Name   Not Available
Time Zone   W. Europe Daylight Time
Installed Physical Memory (RAM) 4.00 GB
Total Physical Memory   4.00 GB
Available Physical Memory   1.94 GB
Total Virtual Memory    8.00 GB
Available Virtual Memory    5.27 GB
Page File Space 4.00 GB
Page File   C:\pagefile.sys
Virtualization-based security   Not enabled
Device Encryption Support   Reasons for failed automatic device encryption: TPM is not usable, PCR7 binding is not supported, Hardware Security Test Interface failed and device is not InstantGo, Un-allowed DMA capable bus/device(s) detected, Disabled by policy, TPM is not usable
A hypervisor has been detected. Features required for Hyper-V will not be displayed.    

์ž‘์—…์ค‘์ธ ์„ค์น˜์™€์˜ ์ฐจ์ด์ ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์‹œ์Šคํ…œ์ด Linux ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋ฌผ๋ฆฌ์  Windows 10 ์„ค์น˜
  • Windows 10 ํ˜ธ์ŠคํŠธ๊ฐ€์žˆ๋Š” Windows 10 Hyper-V VM์—์„œ

๋‹ค๋ฅธ ์œ ์‚ฌํ•œ Windows 10 ์„ค์ •์ด ์—†์œผ๋ฏ€๋กœ ์˜ํ–ฅ์„๋ฐ›๋Š” ์‹œ์Šคํ…œ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‹œ์Šคํ…œ์ด Linux ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

์ •ํ™•ํ•จ : Debian GNU / Linux 9 (stretch)

์ด๋ฅผ ์œ ๋ฐœ ํ•œ NumPy ๋ณ€๊ฒฝ์€ Windows์—์„œ 1.13.3 ์šฉ OpenBLAS ๋กœ์˜ ์ „ํ™˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. KVM ์ˆซ์ž ํ™˜๊ฒฝ์—์„œ ์กฐ์ •์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‹€๋ผ์Šค dll์ด ๋–  ๋‹ค๋‹ˆ๋Š”์ง€๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„ํ‹€๋ผ์Šค dll์ด ๋–  ๋‹ค๋‹ˆ๋Š”์ง€๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์žฅ์—์„œ ์ •ํ™•ํžˆ ๋ฌด์Šจ ๋œป์ž…๋‹ˆ๊นŒ?

์ดํ›„ ๋ฒ„์ „์—๋Š” openblas dll์ด ์žˆ์–ด์•ผํ•˜๋ฏ€๋กœ ์ด์ „ ์•„ํ‹€๋ผ์Šค dll๊ณผ ํ˜ผ๋™์ด์žˆ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋งˆ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IIUC, numpy ์‹คํ–‰, ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Numpy๋Š” ์‹คํ–‰๋˜์ง€๋งŒ ์œ„์˜ ์˜ˆ์—์„œ๋Š” ์‹ค์ œ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋˜ ๋Œ๋ฆฌ์ง€ ์•Š๊ณ  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์€ OpenBLAS๊ฐ€ KVM ํ™˜๊ฒฝ์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ž˜๋ชป๋œ ๋ช…๋ น (SSE *)์„ ๋ฐœํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ OpenBlas๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. set OPENBLAS_VERBOSE=2 ๋Š” ์‚ฌ์šฉ ๋œ ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์„œ ๋ชจ๋ธ์„ ์ธ์‡„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ŠคํŠธ๋Š” ์‹ค์ œ ํ˜ธ์ŠคํŠธ ํ•˜๋“œ์›จ์–ด์™€ ๋™์ผํ•œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์— ๋งž๋Š” ๊ฒฝ์šฐ ์˜ˆ๋ฅผ ๋“ค์–ด set OPENBLAS_CORETYPE=nehalem ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. NumPy๊ฐ€ ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ž์„ธํ•œ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜์ง€๋งŒ ์•„์ง @mattip ๊ณผ ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ๊ฒƒ๋“ค์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ 2 ์ฃผ ๋‚ด์—๋Š”์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋‚˜์ค‘์— ์ˆ˜ํ–‰ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•Œ์•˜์–ด ๊ณ ๋งˆ์›Œ.

@ m55c55 ์ด ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

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

๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค (์ƒˆ Linux ์„ค์น˜).

Linux 4.15.0-42-generic #45-Ubuntu SMP Thu Nov 15 19:32:57 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu 18.04.1 LTS

numpy (1.15.4)

>>> np.show_config()
blas_mkl_info:
  NOT AVAILABLE
blis_info:
  NOT AVAILABLE
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]

๋‚ด ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ :

import numpy as np
A = np.random.randn(100, 3000)
B = np.random.randn(3000, 100)
np.dot(B, A)

์Šคํฌ๋ฆฝํŠธ๋Š” ๋งค์šฐ ์ž‘์€ ํ–‰๋ ฌ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ถฉ๋Œ์€ ์‹ค์ œ๋กœ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ฆ‰์‹œ ์žฌ๋ถ€ํŒ…๋˜๊ณ  ๋งŽ์€ ํŒŒ์ผ์ด ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (์กฐ์‚ฌ ์ค‘์— bash ๋ฐ numpy ๋ชจ๋“ˆ์ด ์†์ƒ๋จ).

np.dot(B, A.T) ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? NumPy๋Š” ์–ด๋–ป๊ฒŒ ์–ป์—ˆ์Šต๋‹ˆ๊นŒ? ์ง์ ‘ ๋งŒ๋“  ๊ฒฝ์šฐ OpenBLAS์˜ ๋ฒ„์ „์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์น˜์ˆ˜๋ฅผ ์ •๋ ฌํ•˜๋ ค๋ฉด np.dot(B, A) ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” pip (1.15.4)์—์„œ numpy๋ฅผ ์–ป์œผ๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

โžœ  ~ pip3 install numpy
Collecting numpy
  Using cached https://files.pythonhosted.org/packages/ff/7f/9d804d2348471c67a7d8b5f84f9bc59fd1cefa148986f2b74552f8573555/numpy-1.15.4-cp36-cp36m-manylinux1_x86_64.whl

๋˜ํ•œ ์šฐ๋ถ„ํˆฌ ์ €์žฅ์†Œ (1.13.3)์—์„œ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

โžœ  ~ apt-cache show python3-numpy
Package: python3-numpy
Architecture: amd64
Version: 1:1.13.3-2ubuntu1
Priority: optional
Section: python
Source: python-numpy
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Sandro Tosi <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 10670
Provides: python3-f2py, python3-numpy-abi9, python3-numpy-api11, python3-numpy-dev, python3.6-numpy
Depends: python3 (<< 3.7), python3 (>= 3.6~), python3.6:any, python3:any (>= 3.4~), libblas3 | libblas.so.3, libc6 (>= 2.14), liblapack3 | liblapack.so.3
Suggests: gcc (>= 4:4.6.1-5), gfortran, python-numpy-doc, python3-dev, python3-nose (>= 1.0), python3-numpy-dbg
Filename: pool/main/p/python-numpy/python3-numpy_1.13.3-2ubuntu1_amd64.deb
Size: 1942804
MD5sum: 7b84ea9967f987a292b64f5bc5b6d65f
SHA1: 73fd8354b7106ac81b8add37947173aad515a9d5
SHA256: 3098ad88b8404cbeee66cc6eef96b13ea87eda848900d7cb754fd0bf280741bf

์šฐ๋ถ„ํˆฌ 18์„ ์‹คํ–‰ํ•˜๊ณ  pip๊ฐ€ numpy๋ฅผ ์„ค์น˜ ํ•œ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ถฉ๋Œ์„ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š”, corrcoef ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ฆด ๋‹ค์šด ํ•œ ๊ฒฐ๊ณผ np.dot(np.array([[0], [0]]), np.array([0, 0]).conj()) ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ถฉ๋Œ์„ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„๋‚˜์ฝ˜๋‹ค ํ™˜๊ฒฝ์—์„œ Windows 10์„ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

np.__version__

1.14.2

np.show_config ()

mkl_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
blas_mkl_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
blas_opt_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
lapack_mkl_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
lapack_opt_info:
    libraries = ['mkl_rt']
    library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']

@Tommassino ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‹คํŒจํ•œ ๋ชจ์–‘์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ?
์ด ๋ฌธ์ œ๋Š” VM ๋‚ด๋ถ€ ์‹คํ–‰์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค์ •์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์ƒˆ ๋ฌธ์ œ๋ฅผ์—ฌ์‹ญ์‹œ์˜ค.

>>> import sys
>>> print(sys.version)
3.6.6 (default, Sep 12 2018, 18:26:19) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
>>> import numpy as np
>>> np.__version__
'1.14.2'
>>> np.dot(np.array([[0], [0]]), np.array([0, 0]).conj())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shapes (2,1) and (2,) not aligned: 1 (dim 1) != 2 (dim 0)

@mattip ์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ์—์„œ๋งŒ ์–ธ๊ธ‰

>>> import sys
>>> import numpy as np
>>> print(sys.version)
3.6.6 | packaged by conda-forge | (default, Jul 26 2018, 11:48:23) [MSC v.1900 64 bit (AMD64)]
>>> print(np.__version__)
1.14.2
>>> X = np.array([0., 0.])
>>> X_T = np.array([0., 0.])
>>> print(X)
[0. 0.]
>>> print(X_T)
[0. 0.]
>>> print(np.dot(X, X_T.conj()))
Process finished with exit code 2

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ๋กœ๋“œ๋˜์ง€ ์•Š์€ mkl ๋„ค์ดํ‹ฐ๋ธŒ์™€ ๊ด€๋ จ์ด์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Tommassino ๋‹น์‹ ์€ ๋˜ํ•œ conda์—์„œ numpy๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๊นŒ?

@ oleksandr-pavlyk : ์–ด๋–ค ์ƒ๊ฐ?

@Tommassino ๋‹น์‹ ์€ ๋˜ํ•œ conda์—์„œ numpy๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๊นŒ?

๋‹ต์žฅ์ด ๋Šฆ์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ๊ณตํœด์ผ ... ๋„ค, ์ €๋Š” conda numpy๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

> conda list --no-pip | grep numpy
numpy                     1.14.2           py36h5c71026_1

๊ทธ๋Ÿฌ๋‚˜ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด mkl ( conda update mkl )์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฑธ ๋‹ซ์•„๋„ ๋ ๊นŒ์š”? @Khemal ์€ ๋ฆฌ๋ˆ…์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ์ƒ์ž์— https://gist.github.com/seberg/ce4563f3cb00e33997e4f80675b80953 ์˜ ์ถœ๋ ฅ์„ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ํ™•์‹คํžˆ blas์™€ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ฐธ์กฐ ํšŸ์ˆ˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€ ์•Š๋Š” ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ๋ฌด์ž‘์œ„๋กœ ์น˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋†€๋ž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

๋ฌธ์ œ์— ๋Œ€ํ•œ ์ถ”์ ์„ ์ˆ˜์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ 3.6.7
numpy (1.15.4)

(.kfr-test-env) root<strong i="9">@whatever</strong>:/app# gdb python3
(gdb) run testcode.py 
Starting program: /app/.kfr-test-env/bin/python3 testcode.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff3c1b700 (LWP 29704)]

Thread 1 "python3" received signal SIGILL, Illegal instruction.
0x00007ffff4a5c204 in dgemm_oncopy_OPTERON_SSE3 () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
(gdb) bt
#0  0x00007ffff4a5c204 in dgemm_oncopy_OPTERON_SSE3 () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#1  0x00007ffff6520630 in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#2  0x00000000000000e0 in ?? ()
#3  0x00007ffff41275db in dgemm_tt () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#4  0x00007ffff4052088 in cblas_dgemm () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#5  0x00007ffff676d28f in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
#6  0x00007ffff6732c36 in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
#7  0x00007ffff673400a in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
#8  0x00000000005030d5 in _PyCFunction_FastCallDict (kwargs=<optimized out>, nargs=<optimized out>, args=<optimized out>, 
    func_obj=<built-in method dot of module object at remote 0x7ffff6a535e8>) at ../Objects/methodobject.c:231
#9  _PyCFunction_FastCallKeywords (kwnames=<optimized out>, nargs=<optimized out>, stack=<optimized out>, func=<optimized out>) at ../Objects/methodobject.c:294
#10 call_function.lto_priv () at ../Python/ceval.c:4837
#11 0x0000000000506859 in _PyEval_EvalFrameDefault () at ../Python/ceval.c:3335
#12 0x0000000000504c28 in PyEval_EvalFrameEx (throwflag=0, f=Frame 0xadeb18, for file testcode.py, line 10, in <module> ()) at ../Python/ceval.c:4166
#13 _PyEval_EvalCodeWithName.lto_priv.1761 () at ../Python/ceval.c:4166
#14 0x0000000000506393 in PyEval_EvalCodeEx (closure=0x0, kwdefs=0x0, defcount=0, defs=0x0, kwcount=0, kws=0x0, argcount=0, args=0x0, locals=<optimized out>, 
    globals=<optimized out>, _co=<optimized out>) at ../Python/ceval.c:4187
#15 PyEval_EvalCode (co=<optimized out>, globals=<optimized out>, locals=<optimized out>) at ../Python/ceval.c:731
#16 0x0000000000634d52 in run_mod () at ../Python/pythonrun.c:1025
#17 0x0000000000634e0a in PyRun_FileExFlags () at ../Python/pythonrun.c:978
#18 0x00000000006385c8 in PyRun_SimpleFileExFlags () at ../Python/pythonrun.c:419
#19 0x00000000006387a5 in PyRun_AnyFileExFlags () at ../Python/pythonrun.c:81
#20 0x000000000063915a in run_file (p_cf=0x7fffffffe2fc, filename=<optimized out>, fp=<optimized out>) at ../Modules/main.c:340
#21 Py_Main () at ../Modules/main.c:810
#22 0x00000000004a6f10 in main (argc=2, argv=0x7fffffffe4f8) at ../Programs/python.c:69

@seberg ์ด๊ฒƒ์€ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.

Probing Multiarray
------------------
OpenBLAS:
    num threads: 2
    version info: DYNAMIC_ARCH NO_AFFINITY Opteron MAX_THREADS=64

Probing Linalg
--------------
OpenBLAS:
    num threads: 2
    version info: DYNAMIC_ARCH NO_AFFINITY Opteron MAX_THREADS=64

LDD information:
----------------
running: ldd /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
    linux-vdso.so.1 (0x00007ffe941ef000)
    libopenblasp-r0-8dca6697.3.0.dev.so => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so (0x00007f9319cea000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f931994c000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f931972d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f931933c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f931c800000)
    libgfortran-ed201abd.so.3.0.0 => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libgfortran-ed201abd.so.3.0.0 (0x00007f9319042000)
running: ldd /app/.kfr-test-env/lib/python3.6/site-packages/numpy/linalg/_umath_linalg.cpython-36m-x86_64-linux-gnu.so
    linux-vdso.so.1 (0x00007ffda69d5000)
    libopenblasp-r0-8dca6697.3.0.dev.so => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/linalg/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so (0x00007f12097c1000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f12095a2000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f12091b1000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1208e13000)
    libgfortran-ed201abd.so.3.0.0 => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/linalg/../.libs/libgfortran-ed201abd.so.3.0.0 (0x00007f1208b19000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f120c0ee000)

@mattip ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

os.environ["OPENBLAS_CORETYPE"] = "nehalem" ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์—†์ด๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import os
os.environ["OPENBLAS_VERBOSE"] = "2"
os.environ["OPENBLAS_CORETYPE"] = "nehalem"
import numpy as np

A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
ret = np.dot(A, B)
print(ret)

@kfrendrich ๋‚˜๋Š” ๋‹น์‹ ๋„ ๊ฐ€์ƒ ๋จธ์‹ ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด OpenBLAS์˜ CPU ๊ฐ์ง€์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๊ฐ€์ƒ ๋จธ์‹ ์ด๋ผ๋ฉด ํ•ด๋‹น ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@seberg ์˜ˆ, ๊ฐ€์ƒ ๋จธ์‹ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ OpenBLAS๊ฐ€ CPU๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ์‹์— ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋“ค์—๊ฒŒ๋ณด๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ง„ํ–‰์ค‘์ธ kvm ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๋‹ซํžŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๊ณง ์‹ ๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ฒˆ์‹ํ•ฉ๋‹ˆ๊นŒ?

numpy 1.17.3๊ณผ ๋™์ผํ•œ ์ถฉ๋Œ.

$ python
>>> import numpy as np
>>> A = np.matrix([[1.0], [3.0]])
>>> B = np.matrix([[2.0, 3.0]])
>>> ret = np.dot(A, B)
Illegal instruction (core dumped)

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์žก์€ ์˜ค๋ฅ˜์˜ ์›์ธ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ Python์ด "Illegal instruction (core dumped)"์™€ ํ•จ๊ป˜ ์ฃฝ์Šต๋‹ˆ๋‹ค.

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,10))

์ œ์•ˆ ๋œ ํ•ด๊ฒฐ์ฑ… :

import os
os.environ["OPENBLAS_VERBOSE"] = "2"
os.environ["OPENBLAS_CORETYPE"] = "nehalem"
import numpy as np

์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :(

์ „์ฒด ๋‚ด์šฉ๊ณผ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ python
Python 3.6.8 (default, Oct  9 2019, 14:04:01)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import numpy as np
>>> print(sys.version)
3.6.8 (default, Oct  9 2019, 14:04:01)
[GCC 8.3.0]
>>> print(np.__version__)
1.17.3
>>> np.show_config()
blas_mkl_info:
  NOT AVAILABLE
blis_info:
  NOT AVAILABLE
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]

CPU ์ •๋ณด (๊ฐ€์ƒ ๋จธ์‹ ) :

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel Xeon Processor (Skylake)
stepping        : 4
microcode       : 0x1
cpu MHz         : 2199.998
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips        : 4399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel Xeon Processor (Skylake)
stepping        : 4
microcode       : 0x1
cpu MHz         : 2199.998
cache size      : 4096 KB
physical id     : 1
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips        : 4399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel Xeon Processor (Skylake)
stepping        : 4
microcode       : 0x1
cpu MHz         : 2199.998
cache size      : 4096 KB
physical id     : 2
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips        : 4399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel Xeon Processor (Skylake)
stepping        : 4
microcode       : 0x1
cpu MHz         : 2199.998
cache size      : 4096 KB
physical id     : 3
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 3
initial apicid  : 3
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips        : 4399.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

@prokulski openblas๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์น˜ ํ–ˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์‹ญ๋‹ˆ๊นŒ? github ์ €์žฅ์†Œ๋ฅผ ํ™•์ธํ•  ๋•Œ ์–ด๋–ค ๋ฒ„์ „์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

openblas๋Š” ์ž๋™์œผ๋กœ ์„ค์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค (์ ์ ˆํ•œ ์„ค์น˜๋ฅผ ํ†ตํ•ด)-๋„์›€์ด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ์ถฉ๋Œํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค ( np.matrix ๋Œ€์‹ )? ๋””๋ฒ„๊น…์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

>>> import numpy as np
>>> A = np.array([[1.0], [3.0]])
>>> B = np.array([[2.0, 3.0]])
>>> ret = np.dot(A, B)

์–ด๋•Œ

>>> import numpy as np
>>> A = np.array([[1.0], [3.0]])
>>> B = np.array([[2.0, 3.0]])
>>> ret = np.matmul(A, B)

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ์ถฉ๋Œํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค ( np.matrix ๋Œ€์‹ )? ๋””๋ฒ„๊น…์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

>>> import numpy as np
>>> A = np.array([[1.0], [3.0]])
>>> B = np.array([[2.0, 3.0]])
>>> ret = np.dot(A, B)

"์ž˜๋ชป๋œ ๋ช…๋ น (์ฝ”์–ด ๋คํ”„)"์ด์žˆ๋Š” Crachesh

>>> import numpy as np
>>> A = np.array([[1.0], [3.0]])
>>> B = np.array([[2.0, 3.0]])
>>> ret = np.matmul(A, B)

์ œ๊ณต :

>>> ret
array([[2., 3.],
       [6., 9.]])

@prokulski openblas๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์น˜ ํ–ˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์‹ญ๋‹ˆ๊นŒ? github ์ €์žฅ์†Œ๋ฅผ ํ™•์ธํ•  ๋•Œ ์–ด๋–ค ๋ฒ„์ „์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

openblas๋Š” ์ž๋™์œผ๋กœ ์„ค์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค (์ ์ ˆํ•œ ์„ค์น˜๋ฅผ ํ†ตํ•ด)-๋„์›€์ด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฒ„์ „ ๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ CPU ์œ ํ˜•์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‹œ์Šคํ…œ์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. numpy๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ง์ ‘ ๋ฌธ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ๋ฌธ์ œ https://github.com/xianyi/OpenBLAS/issues/2067 ์„ ์ฐธ์กฐ๋กœ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

$ apt list *blas* | grep installed
libblas-dev/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libblas3/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libgslcblas0/bionic,now 2.4+dfsg-6 amd64 [installed,automatic]

libopenblas-dev๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋ฉฐ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ apt list *blas* | grep installed
libblas-dev/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libblas3/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libgslcblas0/bionic,now 2.4+dfsg-6 amd64 [installed,automatic]
libopenblas-base/bionic,now 0.2.20+ds-4 amd64 [installed,automatic]
libopenblas-dev/bionic,now 0.2.20+ds-4 amd64 [installed]

ํŒŒ์ด์ฌ :

$ python
Python 3.6.8 (default, Oct  9 2019, 14:04:01)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> A = np.matrix([[1.0], [3.0]])
>>> B = np.matrix([[2.0, 3.0]])
>>> ret = np.dot(A, B)
Illegal instruction (core dumped)

OPENBLAS_CORETYPE ๋ฅผ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ CPU๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PyPI์—์„œ pip install ์–ป์€ numpy์—๋Š” OpenBLAS 0.3.7์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. pip install ์‚ฌ์šฉ์„ ์„ ํƒํ•˜๊ณ  virtualenv๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์˜ Python๊ณผ์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด pip install --upgrade --user numpy ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

OpenBLAS ๋ฒ„์ „์„ ํ™•์ธํ•˜๋ ค๋ฉด OpenBLAS 0.3.5 ์ด์ƒ์˜ ๋ฒ„์ „์„๋ณด๊ณ ํ•˜๋Š”์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    import numpy
    import ctypes

    dll = ctypes.CDLL(numpy.core._multiarray_umath.__file__)
    get_config = dll.openblas_get_config
    get_config.restype=ctypes.c_char_p
    res = get_config()
    print('OpenBLAS get_config returned', str(res))

@mattip ์ฝ”๋“œ์—์„œ "OpenBLAS get_config๊ฐ€ b'OpenBLAS 0.3.7 DYNAMIC_ARCH NO_AFFINITY Haswell MAX_THREADS = 64 '๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค."

OPENBLAS_CORETYPE์„ Haswell (์†Œ๋ฌธ์ž, ๋Œ€๋ฌธ์ž, whateher)๋กœ ์„ค์ •ํ•ด๋„ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” KVM ๊ฐ€์ƒ ๋จธ์‹ ๊ณผ blas์˜ ์ž˜๋ชป๋œ CPU ๊ฐ์ง€์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•ฉ๋‹ˆ๋‹ค, ๋ฉฐ์น  ์ „์— ๋ชจ๋“  ์ƒ๊ฐ์ด ๊ดœ์ฐฎ ์•˜์Šต๋‹ˆ๋‹ค ...

Haswell์ด ์ž˜๋ชป๋œ ๊ฐ€์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋น ๋ฅธ Google ๊ฒ€์ƒ‰์€ ๊ฐ€์ƒ ๋จธ์‹  ๋‚ด๋ถ€์—์„œ ํ•œ ๋ฒˆ ํ˜ธ์ŠคํŠธ CPU๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์ข‹์€ ๋‹ต๋ณ€์„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

Haswell์ด ์ž˜๋ชป๋œ ๊ฐ€์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋น ๋ฅธ Google ๊ฒ€์ƒ‰์€ ๊ฐ€์ƒ ๋จธ์‹  ๋‚ด๋ถ€์—์„œ ํ•œ ๋ฒˆ ํ˜ธ์ŠคํŠธ CPU๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์ข‹์€ ๋‹ต๋ณ€์„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋„ค. Skylake๊ฐ€ ๋” ์ข‹์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ (cpuinfo๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด) ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ง‰ํ˜”์–ด์š”.
https://github.com/numpy/numpy/milestone/69๋Š” ํฌ๋ง์„์ค๋‹ˆ๋‹ค;)

OpenBLAS ์ปค๋„ ์ง€์ •์ž๋กœ ์‹œ๋„ํ•ด๋ณด์‹ญ์‹œ์˜ค. ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

export OPENBLAS_CORETYPE=prescott

๋ฐ dunnington, penryn, core2, nehalem, sandybridge

๋ชจ๋‘ ์ฃฝ์Šต๋‹ˆ๋‹ค.

KVM์ด CPU ์œ ํ˜• ์„ค์ •์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ตœ๊ทผ์— ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์ฝ”์–ด ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

export OPENBLAS_VERBOSE=2
export OPENBLAS_CORETYPE=prescott
python -c 'import numpy as np; A = np.array([[1.0], [3.0]]); B = np.array([[2.0, 3.0]]); print(np.dot(A, B))'

๋‚˜๋Š” ์–ป๋‹ค:

Core: Prescott
[[2. 3.]
 [6. 9.]]

์ง€์›ํŒ€์€ ์ง€๋‚œ ๋ฒˆ์— ํ”„๋กœ์„ธ์„œ์™€ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด ์—†๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ์ด ์ปดํ“จํ„ฐ์—์„œ ๋„์ปค ์ด๋ฏธ์ง€ jupyter / tensorflow-notebook์„ ๊ฐ€์ ธ์™€ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ Jupyter์—์„œ ์‹คํ–‰ ๋œ np.dot () ์˜ˆ์ œ๋Š” ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์ด ํ•˜๋“œ์›จ์–ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

@prokulski ์œ„ ์ฃผ์„ ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๋ฒ• ๋ช…๋ น ์ „์— Core: Prescott ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๊ท€ํ•˜์˜ ํ•˜๋“œ์›จ์–ด์™€ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ 1.18 ๋งˆ์ผ์Šคํ†ค์—์„œ ์ œ๊ฑฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” "Core : Presscot"๊ณผ ๋งคํŠธ๋ฆญ์Šค 2x2๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋ถˆ๋ฒ•์  ์ธ ์ง€์‹œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

"export OPENBLAS_CORETYPE = prescott"์ค„์ด ์—†์œผ๋ฉด ์ž˜๋ชป๋œ ๋ช…๋ น์ด ์žˆ๊ณ  ํ–‰๋ ฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

OpenBLAS ๋‚ด๋ถ€์—์„œ CPU๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฃจํ‹ด์ด KVM์— ์˜ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. OpenBLAS ์ด์Šˆ ํŠธ๋ž˜์ปค ์—๋ณด๊ณ ํ•˜์—ฌ ๊ทธ๋“ค์ด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์œ„์— ๋‚˜์—ด๋œ ๋ชจ๋“  ํ•ต์‹ฌ ์œ ํ˜•์„ ์ˆœํ™˜ํ•˜๊ณ  ์–ด๋–ค ์œ ํ˜•์ด ์ถฉ๋Œํ•˜๋Š”์ง€ ์ฐพ์•„์„œ OpenBLAS๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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