์๋
ํ์ธ์,
์ต๊ทผ Windows ์ธ์คํด์ค ( vmImage: 'windows-2019'
)๋ฅผ ์ฌ์ฉํ์ฌ Azure Pipelines์์ ๋ด ํ๋ก์ ํธ์ ๋ํ ํ
์คํธ๋ฅผ ์คํํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ข ๋ ์์ธํ ์ดํด๋ณด๋ฉด (https://developercommunity.visualstudio.com/content/problem/1102472/azure-pipeline-error-with-windows-vm.html?childToView=1119179#comment-1119179 ๋ํ ์ฐธ์กฐ) ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ค์นํ ๋ ์ ๋ numpy 1.19.0
๋์ numpy 1.8.5
- ๋๋ ๊ฒ์ ๋ณผ ์ numpy 1.19.0
๋
6 ์ 20 ์ผ์ PyPI์ ๋ฃ์ด ์ด๊ฒ์ ์ฐ๋ฆฌ์ ํ
์คํธ๊ฐ ์คํจํ๊ธฐ ์์ ๋ฌด๋ ต์
๋๋ค . ์ด์ ์ ์ฑ๊ณตํ ๋น๋์์์ ๊ฐ์ด ํ๊ฒฝ์ numpy 1.8.5
๋ฅผ ์ค์นํ๋๋ก ๊ฐ์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ด์ฐฐํ๊ธฐ ์์ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์๋ณด๊ณ ํ๊ณ ์ถ์์ต๋๋ค (๊ทธ๋ฌ๋ numpy๊ฐ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ ํํ ์ง์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค ...
์ฌ๋ฌ๋ถ์ ์๊ฒฌ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์์๋ ๊ฒฝ์ฐ ๋ด azure ํ์ดํ ๋ผ์ธ ์ค์ ์ ๋ณ๊ฒฝํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค.
์ด ๋น๋๋ numpy 1.18.5์์ ์ ์๋ํฉ๋๋ค. https://dev.azure.com/matteoravasi/PyLops/_build/results?buildId=46&view=logs&j=011e1ec8-6569-5e69-4f06-baf193d1351e
numpy 1.19.0์ ์ฌ์ฉํ๋ ๋์ผํ ์ปค๋ฐ์์ ๋น๋๊ฐ ์คํจํฉ๋๋ค : https://dev.azure.com/matteoravasi/PyLops/_build/results?buildId=43&view=results
์ค๋ฅ๋ ๋งค์ฐ ๋ชจํธํ๋ฉฐ ์์์ ์ค๋ช ํ ๋ด์ฉ์ด ๋ ๊ด๋ จ์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์จ๋ ์ฌ๊ธฐ ์์ต๋๋ค.
2020-07-06T13:56:01.6879900Z Windows fatal exception: Current thread 0xaccess violation00001798
2020-07-06T13:56:01.6880280Z
2020-07-06T13:56:01.6880589Z (most recent call first):
2020-07-06T13:56:01.6880973Z File "<__array_function__ internals>", line 6 in vdot
2020-07-06T13:56:05.3412520Z ##[debug]Exit code: -1073741819
์ง์์ ์ผ๋ก ์คํจํฉ๋๊น ์๋๋ฉด ๊ฐ๋์ฉ ๋ง ์คํจํฉ๋๊น? ๋ก์ปฌ ์ปดํจํฐ์์ ํ๋ก์ ํธ๋ฅผ ๋น๋ ํ ์์๋ Windows ๊ฐ๋ฐ์๊ฐ ์์ต๋๊น?
์๋
ํ์ธ์,
๊ฐ์ฌ!
์ผ๊ด๋๊ฒ ์ฌ๋ฌ ๋ฒ ์คํจํ์ต๋๋ค. ๊ทธ ์์ ์์ ์ ๋ Azure ๊ฐ๋ฐ์์๊ฒ ๋ฌผ์ด๋ณผ ์๊ฐ์ํ์ต๋๋ค (์ด๊ธฐ ์ถ์ธก์ VM ์ค์ ์์ ๋ฌด์ธ๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฐ๋ฅ์ฑ์ด ์์).
์ด ๋งํฌ์๋ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌ ํ Microsoft ๊ฐ๋ฐ์์ ๋ ผ์ํ ๋ด์ฉ์ด ๋๋ฌด ๋ง์ ์ ์์ต๋๋ค. https://developercommunity.visualstudio.com/content/problem/1102472/azure-pipeline-error-with-windows-vm.html? childToView = 1119179 # comment -1119179
๋ถํํ๋ ๋ก์ปฌ Windows ์์คํ ์์ ํ๋ก์ ํธ๋ฅผ ๋น๋ ํ ์์๋ ์ฌ๋์ด ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ฌํ์์ํ ๋ช ํํ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
azure-pipelines.yml์ด ์๋ํฉ๋๊น?
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๊ฒ (https://github.com/equinor/pylops/blob/master/azure-pipelines.yml)์ด ํ์ฌ ์ฃผ์ ์ฒ๋ฆฌ๋์ด ์์ต๋๋ค .Python 3.7์ ์ฌ์ฉํ์ฌ ๊ฝค ํ์ค์ ์ธ ์ค์ ์์ ์ ์ ์์ต๋๋ค. , requirements-dev.txt ํ์ผ (https://github.com/equinor/pylops/blob/master/requirements-dev.txt)์ ์ข ์์ฑ์ ์ค์น ํ ๋ค์ ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ์ด๊ฒ์ ์ฃผ์ ์ฒ๋ฆฌํ๊ณ 1.18.5 ๋ชจ๋ ๊ฒ์ด ์คํ๋๋๋ก ๊ฐ์ ํ๋ฉด ์๋ก์ด 1.19๊ฐ ์ค๋จ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
Azure์์ ์คํ๋๋ ์ด๋ฏธ์ง์ Windows ๋ฒ์ ์ฃผ ๋ฒ์ ๊ณผ ๋ถ ๋ฒ์ ์ ๋ฌด์์ธ๊ฐ์? ์ฆ, systeminfo
๋ OS Version
๋ฌด์์ ์ธ์ํฉ๋๊น?
Azure Pipelines์์ ์ฌ์ฉ๋๋ Azure VM์ ์ธ๋ถ ์ ๋ณด๋ https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml ๋ฐ ๋ค์ ๋งํฌ์์ ์ฐพ์ ์ ์์ต๋๋ค. ์ค์น๋ ์ํํธ์จ์ด https://github.com/actions/virtual-environments/blob/master/images/win/Windows2019-Readme.md
Azure ํ์ดํ ๋ผ์ธ์์ systeminfo
๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ์ ์ฌํญ์ด ์๋์?
๋ช ๋ น ์ค์์ ์คํ๋๊ณ ์ถ๋ ฅ์ ํฐ๋ฏธ๋์ ๋คํํ๋ฏ๋ก ์คํ์ ๋ช ๋ น์ผ๋ก ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
CI์์ ์คํ๋๋ PR์์์ด๋ฅผ ์ํํ์ฌ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค. 19041 ๋น๋์ Windows ๋ฐ pip NumPy์ ๋ฌธ์ ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋ฌป์ต๋๋ค.
๋๋ต์ ๋ ๋ฒ์งธ ๋งํฌ์ ์์ต๋๋ค.
OS ๋ฒ์ : 10.0.17763 Build 1282
๊ทธ๋์ ๋ด ์๊ฐ์ ๊ฒฐ์ค์ด ์์ต๋๋ค.
Windows ์ฉ ์ต์ ํ ํ ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๊ณ ๋ง์ ํ์ จ๋๋ฐ, ์๋ง๋ ๊ทธ์ ๊ด๋ จ์ด ์์ต๋๊น?
์ค์ ๋ก๋ (์๋ง๋) 19041 ๋ ์ ๋์ ๋ Windows ๋ฒ๊ทธ์ ๋๋ค.ํ์ง๋ง ํจ์ฌ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
Conda NumPy์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ Windows ๋ฐ OpenBlas์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก pip NumPy์๋ง ์ํฅ์์ค๋๋ค.
:) 1.9.1์ด ์ถ์๋์๋ค๋ ์ด๋ฉ์ผ์ ๋ฐ์์ต๋๋ค. ์ด์ ์ต์ ๋ฒ์ ์ ์ค์นํ๊ณ ์๋ํ๋์ง ํ์ธํ๋ Azure ํ์ดํ ๋ผ์ธ์ ๋ค์ ํธ๋ฆฌ๊ฑฐํ๋ ค๊ณ ํฉ๋๋ค.
OpenBlas์ ๋ฒ๊ทธ.
๋ค์์ ์ฌํ ์์ ๋๋ค.
import numpy as np
nr = 12000
v = np.random.randn(nr) + 1j * np.random.randn(nr)
np.vdot(v, v)
# also access violations
v @ v
# also access violations
๊ธฐํธ๊ฐ์๋ ๋๋ฒ๊น ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Exception thrown at 0x0000000068DBB8F0 (libopenblas.NOIJJG62EMASZI6NYURL6JBKM4EVBGM7.gfortran-win_amd64.dll)
in python.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
๋ฒ๊ทธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ค๋ฉด ์ด๋ ์ด๊ฐ ๊ฝค ์ปค์ผํฉ๋๋ค (10k ํจ์ค, 12k๋ ๊ทธ๋ ์ง ์์).
๋น ๋ฅธ ํ์ธ:
$env:OPENBLAS_VERBOSE=2
$env:OPENBLAS_CORETYPE=Prescott
ํต๊ณผํ์ง๋ง ๊ธฐ๋ณธ ์ปค๋ ( Zen
)๊ณผ Haswell
๋ฐ Sandybridge
๋ชจ๋ ์ก์ธ์ค ์๋ฐ์ด ์์ต๋๋ค.
์ต์ OpenBLAS 0.3.10์ ์ฌ์ฉํ๋ numpy HEAD๋ ์คํจํ๋์ง ํ์ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์๋๋ฉด ์ด๋ฏธ ํ์ต๋๊น?
@mattip no ์์ง ์๋ํ์ง ์์์ต๋๋ค. pip install git+https://github.com/numpy/numpy
๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์คํฐ์์ ์ง์ bumpy๋ฅผ ์ค์นํ๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? ๋๋ ๊ทธ๊ฒ์ ์๋ ํ ์ ์์ต๋๋ค :)
๊ทธ๋ฆฌ๊ณ ๊ทํ์ ์ง๋ฌธ์ @bashtage (์คํจํ ํ
์คํธ์์ numba๋ฅผ ์ฌ์ฉํฉ๋๊น? ์ด๋ฉ์ผ์ด์ง๋ง์ด ์ค๋ ๋์์ ๋ณผ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค ... ์ถฉ๋ํ๋ ํ
์คํธ๋ numpy
๋ฐ pyfftw
์์
์ ๋ชจ๋ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ฐ์์ค๋ฐ ๋ฉ์์ง์ ํจ๊ป ์ถฉ๋ํ๋ฏ๋ก ์ด๋ค ๋ผ์ธ์์ ์ค์ ๋ก ์ถฉ๋ํ๋์ง ์๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ํ์ง๋ง pyfftw
๋ numba๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ด๋ ์ข
์์ฑ ์ค ํ๋๋ ์๋๋๋ค.
๋ ๊ทธ๋ฅ GitHub์ ์ ์ฅ์์์ ์ง์ NumPy์์ HEAD ์ค์น์ ์๋ํ์งํ๊ณ ์ฐฝ์ ์๋ฃ๊น์ง ์คํ์ ๊ตฌ์ถ - ๊ฐ์์ค๋ฐ ์ถฉ๋ : https://dev.azure.com/matteoravasi/PyLops/_build/results?buildId=54&view=logs&j= 011e1ec8-6569-5e69-4f06-baf193d1351e & t = bf6cf4cf-6432-59cf-d384-6b3bcf32ede2
ํฅ๋ฏธ๋กญ๊ฒ๋ NumPy๋ฅผ ์ข ์์ฑ์ผ๋ก ์ฌ์ฉํ๋ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ๋๋ก ์ค์น๋์ง ์๋ ๊ฒ ๊ฐ๊ณ (์ด์ ๋ ํ์คํ์ง ์์) ์ผ๋ถ ํ ์คํธ๋ ๋ชจ๋ OS์ ๋ํด ์คํจํ์ง๋ง ์ ์ด๋ ์ด์ ๊ณผ ๊ฐ์ด ์์ ํ ์ถฉ๋์ ์๋๋๋ค.
์ผ๊ฐ ์ฌ์ฉ ์ค๋ฅ ์์ :
pip install -i https://pypi.anaconda.org/scipy-wheels-nightly/simple numpy
๋ฐฉ๊ธ GitHub ์ ์ฅ์์์ ์ง์ NumPy์ HEAD ์ค์น๋ฅผ ์๋ํ์ต๋๋ค.
๋ช
์ ์ ์ผ๋ก ๋น๋ํ์ง ์๋ ํ ์ฌ๊ธฐ์๋ OpenBLAS๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก pip install git+https://github.com/numpy/numpy.git
์ ํจ๊ป ๋๋ฆฌ๊ณ ์ผ๋ฐ์ ์ธ BLAS๊ฐ ์ ๊ณต๋ฉ๋๋ค.
1.19.2 ์ฉ OpenBLAS๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๋ ค๋ ๊ฒ ๊ฐ์ต๋๋ค.
Azure์ ์ต์ --pre
๋น๋ (numpy-1.20.0.dev0 + a0028bc) ์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Current thread 0x000003d0 (most recent call first):
File "<__array_function__ internals>", line 5 in dot
File "D:\a\1\s\mne\minimum_norm\inverse.py", line 732 in _assemble_kernel
๋ฌธ์ ์ ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
K = np.dot(eigen_leads, trans)
๋์์ด๋๋ค๋ฉด ๋ฐฐ์ด์ ๋์คํฌ์ ์ ์ฅํ๊ณ Azure ์ํฐํฉํธ๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ๊ฒ๊ณผ ๋์ผํ ์ฌ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ถ๊ฐํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
$env:OPENBLAS_VERBOSE=2
๋๋
set OPENBLAS_VERBOSE=2
์ด๋ค ์ปค๋์ด ์ฌ์ฉ๋๊ณ ์๋์ง ์๊ธฐ ์ํด ํ ํ๋ฆฟ์ ์ถ๊ฐํฉ๋๋ค.
๋์์ด๋๋ค๋ฉด ๋ฐฐ์ด์ ๋์คํฌ์ ์ ์ฅํ๊ณ Azure ์ํฐํฉํธ๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
dtypes์ ์ฐจ์์ ์๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ ๊ฒ์ ๋๋ค.
์ข์์, ๊ณฑํ๋ ํ๋ ฌ์ ์์ฑํ ๋ค์ ์ํฐํฉํธ๋ฅผ ์ ๋ก๋ํ๋ numpy + scipy + matplotlib + pytest (๋ฐ deps)๋ง์ผ๋ก ์คํจํ ํ ์คํธ์ ๋จ์ผ ์คํ์์ ์ฌํ๋์์ต๋๋ค. ์ฌ๊ธฐ ์ํฐํฉํธ ํญ์ด ์์ต๋๋ค.
๋ง์ง๋ง .npz
๊ฐ ์คํจํ ๊ฒ์ด์ด์ผํฉ๋๋ค (27MB). Linux์์๋ ๋ก์ปฌ๋ก ๊ด์ฐฎ์ต๋๋ค.
>>> import numpy as np
>>> data = np.load('1595525222.9485037.npz')
>>> np.dot(data['a'], data['b']).shape
(23784, 305)
>>> data['a'].shape, data['a'].dtype, data['b'].shape, data['b'].dtype
((23784, 305), dtype('>f4'), (305, 305), dtype('float64'))
>>> data['a'].flags, data['b'].flags
( C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
, C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
)
OPENBLAS_VERBOSE
์์
์ ์ํํ๊ณ ์์ง๋ง pytest -s
๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ์ค์ ๋ก ์ ๋ฌ๋๋ ์ถ๋ ฅ์ ์บก์ฒํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ด๊ฒ์ ๋จ์ง ์ฐ์ฐ์ผ์ง๋ ๋ชจ๋ฅด์ง๋ง, ์ฐ๋ฆฌ๋ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค ...
์๊ธฐ์ง ๋ง ์ง๊ธ ์์ ์ฌ์๊ธฐ๋ก๋ ๋ด ๋๋ค.
OPENBLAS_CORETYPE
์ Prescott ๋๋ Nehalem์ผ๋ก ์ค์ ํ๋ฉด ํ์๋์ง ์์ต๋๋ค. Zen, Sandybridge ๋ฐ Haswell๊ณผ ํจ๊ป ๋ด
๋๋ค.
Windows์์ npz์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ๋ก ์ฌํ ํ ์ ์์ต๋๋ค.
Windows์์ npz์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ๋ก ์ฌํ ํ ์ ์์ต๋๋ค.
Azure์ FWIW ์ด์ ์ฌ๊ธฐ์์ ์คํ ๋ ์ฝ๋์ ๋ง์ง๋ง์์ ๋ ๋ฒ์งธ ์ค์์ ์คํจํ๋ฏ๋ก ์ ์ฅ-๋ก๋-๋ผ์ด๋ ํธ๋ฆฝ ๋ฐ์ดํฐ๋ก ์ฌํ ํ ์ ์์ต๋๋ค.
import mne, os.path as op, time
fname = op.join(op.dirname(mne.__file__), '..', 'bad', f'{time.time()}.npz')
np.savez_compressed(fname, a=eigen_leads, b=trans)
print(eigen_leads.flags)
print(trans.flags)
data = np.load(fname)
np.dot(data['a'], data['b']) # <-- fails here
K = np.dot(eigen_leads, trans) # <-- used to fail here before I added the above lines
๋ฐ๋ผ์ np.savez
/ np.load
๋จ๊ณ๋ก ์ธํด Azure ๋์์ ์์ค๋๋ ๊ฒ์ ์์ต๋๋ค.
๊ทธ๋๋ ๋์์ด๋๋์ง ํ์ธํ๊ธฐ ์ํด OPENBLAS_CORETYPE: 'nehalem'
๋ก ์คํํ๋ ค๊ณ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ค์ ๋ก ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฒ๊ทธ๊ฐ์์ ์ ์์ต๋๊น?
๋ํ OPENBLAS_VERBOSE: 2
์ด ํจ๊ณผ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
์์ธ ์ค์ ํ ๋ช ๋ น ์ถ๊ฐ
python -c "numpy ๊ฐ์ ธ ์ค๊ธฐ"
Pytest๋ ์๋ง๋ ์ด๊ฒ์ ๋จน๊ณ ์์ ๊ฒ์ ๋๋ค.
Thu, Jul 23, 2020, 19:04 Eric Larson [email protected] ์์ฑ :
๋ํ OPENBLAS_VERBOSE : 2 ์ค์ ์ ํจ๊ณผ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์คํ ์โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/numpy/numpy/issues/16913#issuecomment-663151960 ๋๋
๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/ABKTSRNS5QRT6CC3ZQ6DQYDR5B3TTANCNFSM4PCRVE6A
.
์ด ๋ช ๋ น์ ๋ก์ปฌ๋ก๋ ์์ธํ ์ถ๋ ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
OPENBLAS_VERBOSE=2 python -c "import numpy as np, glob; data = np.load(glob.glob('bad/*.npz')[0]); a, b = data['a'], data['b']; print(np.dot(a, b).shape)"
ํ์ง๋ง ๋ด ์์คํ OpenBLAS๊ฐ ๋๋ฌด ์ค๋๋์์ ์ ์์ต๋๋ค. ์คํจํ ํ ์์ฒด์ ์ผ๋ก ์คํ๋๋๋ก Azure์ ์ปค๋ฐ์ ํธ์ํฉ๋๋ค.
Azure์ OPENBLAS_VERBOSE๋ "Core : Haswell"์ด๋ผ๊ณ ๋งํฉ๋๋ค. ๊ทธ๋๋ ๊ทธ๊ฒ ๋ง๋์ง ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
https://github.com/xianyi/OpenBLAS/issues/2732 ์์ ์ค๋ฅ๋ฅผ๋ณด๊ณ ํ์ผ๋ฉฐ ๋ง์คํฐ์์ ์์ ๋ ์ ์๋ค๊ณ ์ ์ํ์ต๋๋ค. https://github.com/xianyi/OpenBLAS/issues/2728์ ์ฐธ์กฐ
@mattip ์ด๊ฒ์ด MacPython / openblas-libs # 35์ ์ํด ๋ซํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๊น? ๋ค์ ์ฃผ๊ฐ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์๋์?
@charris ์ด ๋ฌธ์ ๋ ์์ง ์ด๋ ค ์๊ณ ๋ฐฑ ํฌํธ๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌํ์๋ฅผ ๊ฐ์ง ๋๊ตฐ๊ฐ ๊ฐ์ด ์ปค๋ฐ ์ผ๋ก numpy๋ฅผ ๋น๋ํ์ฌ ์ต์ OpenBLAS ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ป์ ์ ์์ต๋๊น? ๊ทธ๋์ (์คํ๊ฐ์๋ mabe)
git add remote mattip https://github.com/mattip/numpy.git
git fetch mattip issue-16913
git checkout issue-16913
python tools/openblas_support.py
# copy the output openblas.a to a local directory and make sure numpy uses it
mkdir openblas
copy /path/to/openblas.a openblas
set OPENBLAS=openblas
python -c "from tools import openblas_support; openblas_support.make_init('numpy')"
pip install --no-build-isolation --no-use-pep517 .
์์ง ์ค์นํ์ง ์์๋ค๋ฉด choco install -y mingw
์ฌ์ฉํ์ฌ gfortran์ ์ค์นํด์ผํฉ๋๋ค.
... ์ด๊ฒ์ Windows ์ฉ์ ๋๋ค.
์์ง ์ค์นํ์ง ์์๋ค๋ฉด choco install -y mingw๋ก gfortran์ ์ค์นํด์ผํฉ๋๋ค.
32 ๋นํธ์๋ง ํ์ํฉ๋๊น?
https://github.com/numpy/numpy/blob/master/azure-steps-windows.yml#L29 -L31
๋ ๋น์ ์ด ์์์ ์ ์ ๋ฌด์์ํ๋ ค๊ณ ํฉ๋๋ค choco install -y mingw
I๊ฐ ๋ฌด์์ธ์ง ํ์
ํ๋ฉด /path/to/openblas.a
์
๋๋ค - ์๋ง๋ ์คํ tools/openblas_support.py
(?).
์, python tools/openblas_support.py
๋ openblas.a
์ ์ฐพ์ ์์น๋ฅผ ์ธ์ํฉ๋๋ค.
gfortran์ด ํ์ํฉ๋๋ค. Azure ๋จธ์ ์๋ mingw 64 ๋นํธ๊ฐ ์ค์น๋์ด ์์ต๋๋ค. 32 ๋นํธ ์ธ ๊ฒฝ์ฐ ํธ์ถ์ด ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค. -m32
๋ ์ค์ ํด์ผํฉ๋๋ค (32 ๋นํธ์๋ง ํด๋น).
๋๋ ๋ฐฉ๊ธ NumPy์ master
๋ถ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ https://github.com/numpy/numpy/blob/master/azure-steps-windows.yml์ ๋๋ถ๋ถ์ ๊ทธ๋๋ก ๋ณต์ฌํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ์์ผ๋ก ์ฌํํ์ผ๋ฉฐ ์ฑ๊ณต์ ์ผ๋ก ๊ทธ๊ฒ์ segfault .
๊ทธ๋ฐ ๋ค์ mattip/issue-16913
๋ก ์ ํํ๋๋ฐ ๋ค์ URL ๋ค์ด๋ก๋ ์ค๋ฅ์ ํจ๊ป ์คํจ ํฉ๋๋ค.
... 64 ๋นํธ Windows ์ฉ 32 ๋นํธ OpenBLAS๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://anaconda.org/multibuild-wheels-staging/openblas-libs/files
64 ๋นํธ OpenBLAS๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ทธ๋ฅผ ์ถ๊ฐ ํ ์ ์์๊น์?
2 ๊ฐ๊ฐ ์๊ณ 1 ๊ฐ๋ ์์ง ๊ฑด์ค ์ค์ ๋๋ค. ํ ์๊ฐ ๋ด์ ์๋ํด์ผํฉ๋๋ค.
๊ทธ ๋์ ๋๋ ๋ค์์ ์ถ๊ฐํ์ต๋๋ค.
NPY_USE_BLAS_ILP64: '1'
OPENBLAS_SUFFIX: '64_'
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ๋ง๋ค์ด์ก์ต๋๋ค. ๋ ์ด์ segfaults๊ฐ ์๋๋๋ค ! ํ์ธํ๊ธฐ ์ํด ๋ช ๋ฒ ๋ค์ ์คํํ๊ฒ ์ต๋๋ค. 32 ๋นํธ OpenBLAS Win64 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์คํ๋๋ฉด ์ธ์ ๋ ์ง ์ ์๊ฒ ํ์ ๋ณด๋ด์ฃผ์ธ์.์ด ์ค์ ์ฝ๊ฒ ์ ๊ฑฐํ๊ณ ๋ค์ ํ ์คํธ ํ ์ ์์ต๋๋ค.
์ ์ฒด ํ ์คํธ ์ค์ํธ๋ฅผ ์คํํ๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ :-)
python -c "import numpy; numpy.test('full')"
32 ๋นํธ๊ฐ ์ฌ๋ผ๊ฐ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์๋ํฉ๋๋ค .
์ด์ ์ ์ฒด ํ ์คํธ ์ค์ํธ๋ฅผ ์คํํ๊ฒ ์ต๋๋ค.
f2py
๊ด๋ จ ์ด์ํ ํ
์คํธ ์์ง ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๋ค๋ฅธ ๋ฌธ์ ์ ๋ ์ด์ ์๊ฐ์ ๋ญ๋นํด์๋ ์๋ฉ๋๋ค. ๋ค์ ์ฃผ๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ BLAS๊ฐ์๋ ์ฃผ๊ฐ์ ํ ์คํธ ํ ์ ์์ต๋๋ค.
๋ง์คํฐ ๋ธ๋์น์ ์ปค๋ฐ์ ํธ์ํ์ฌ ์ธ์ ๋ ์ง ์ผ๊ฐ ๋น๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ข์ต๋๋ค. Windows 10 2004์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์ ํญ๋ชฉ์ด ํ์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
@bashtage ์ด๊ฒ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
OpenBLAS๋ Windows์ ์ต์ ๋ฆด๋ฆฌ์ค์์ ์ฌ์ ํ ์์๋์์ต๋๋ค. ์ ์ด๋ ๋์๊ฒ๋ ๋๊ตฌ ์ฒด์ธ๊ณผ ํผํฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ข์ ๋๋ฒ๊น ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ๋ ๋งค์ฐ ๋นํ์ค์ ๋๋ค.