iDev

윈도 10 버전 2004 업데이트 후 numpy 에러 발생 및 해결

KraZYeom 2020. 8. 30. 18:41
반응형

프롤로그

회사에서 진행하고 있는 오픈소스 데이터 분석 플랫폼 Brightics Studio에서 6월 초에 One Way ANOVA 시 에러 가 이슈로 등록이 되었고, 그냥 함수 버그겠지라며 대수롭지 않게 생각하고 있었다.

 

갑자기 8월 19일~20일 사이에 사내 게시판과 메일로 엄청나게 위와 동일한 이슈가 쏟아졌다. 메신저, 전화로까지 연락이 온다. 하하.

그러는 순간 마션의 첫 대사가 떠올랐다. 

 

 

“I'm pretty much fucked. That's my considered opinion. Fucked.”

아. 뿔. 싸. 씨. 발. 좆. 됐. 다.

 

그제야 이슈의 원인을 파악하기 시작했다. 

 

원인을 찾기 위해 에러 로그인 numpy.linalg.linalg.LinAlgError: SVD did not converge로 구글링을 해서 찾고 numpy 소스코드를 찾았지만 정확한 원인을 찾기 힘들었다.

 

왜... 소스코드를 제대로 파악을 못하니라고 잔소리를 들었지만... 아무리 찾아도 나오지 않았습니다... 팀장님? ㅠㅠ 

 

처음에는 사내 특정 솔루션을 설치하면서 윈도 업데이트를 해서 그것과 관련된 사이드 이펙트라고 파악했었는데, 그것도 문제가 아니었다. 어떤 사람은 발생하고 어떤 사람에게서는 나타나지 않았다. 

 

다행하게도 내 자리의 윈도 10 PC에서도 동일한 버그가 발생하였다. 그리고 마찬가지로 집에 있는 PC에서도 동일한 버그가 발생했다. 휴... 동일한 이슈가 발생한다는 건 얼마나 즐거운 건지 모르겠다. 재현이 된다는 거이기 때문이다.

 

윈도키+R => winver를 확인하니, 윈도 10, 버전 2004. 공통된 부분이었다. 이로서 버그의 힌트는 얻었고 다음날 돌아와서 발생한 사람에게서도 확인을 하니 모두 동일한 윈도 버전을 사용하고 있었다. 

 

... 그럼 원인이 윈도 10의 문제라고?
ㅇㅇ
그것도 딱 버전 2004에서만 발생을 한다.

 

윈도 10 이슈이니 아무리 구글링을 해도 코드를 뒤져도 원인이 당연히 나올 수 없었다. 

그래서 다시 제대로 된 검색어로 구글링을 하니 이제야 결과가 조금 보이기 시작했다. 

 

polyfit and eig regression tests fail after latest Windows 10 update #16744 
LinAlgError using scipy.signal.savgol_filter since windows 10 (2004) update #12747

 

공통된 의견은 윈도 10을 업데이트 한 뒤로 numpy와 scipy가 동작하지 않는다는 거였다. 최초 우리 쪽 이슈만 더 빨리 받아들였어도 더 빨리 해결책을 찾을 수 있었고 더 빨리 공유할 수 있었을 텐데 좀 아쉽긴 하다. 아래 삼천포에 설명한 pyarrow & jvm도 공유를 하지 못해서 아쉬웠다. 

 

삼천포

예전에도 비슷한 이슈 경험이 있었다. 그땐 numpy가 아니었지만 pyarrow에서 사용하는 jvm이 리눅스 커널 특정 버전 3개? 에서만 발생을 했다. JVM crashes after updating to kernel with patch for Stack Guard flaw CVE-2017-1000364 그 때도 버그 원인 찾고 해결책 찾느라 죽는 줄 알았다(아무도 안 알아주지만 ㅋㅋ). 지금이야 구글링해도 몇 건이라도 나오는데, 그때는 발견된 초창기라 나오지 않아서 정말 엄청 삽질을 하고 linux kernel을 업데이트했었다.

 

원인

  • 윈도 10, 버전 2004 업데이트

  • Windows 10, Version 2004 Update

 

해결방법

  • anaconda의 numpy와 디펜던시 라이브러리 사용

  • numpy+mkl(Intel® Math Kernel Library)와 디펜던시 라이브러리 사용

  • 기타 

anaconda를 사용하면 문제가 발생하지 않는다. 대다수 python 프로젝트는 anaconda를 사용해서 위 문제점이 빨리 발견되지 않은 것 같다. Brightics Studio에서는 특정 이슈때문에 https://www.python.org에서 제공하는 python을 사용하고 있었고 그냥 pip로 기타 라이브러리를 관리하고 있었다. 그래서 anaconda로 라이브러리를 변경했지만, 또 다른 버그?로 인해서 다시 원복을 했다. 그래서 2번째 방법으로 조치하기로 마음먹었다. 

삽질 목록

  1. anaconda로 이전 

    => sqlite에서 rank와 같은 windows 함수에서 또 다른 이슈 발생

  2. 원복

  3. numpy‑1.18.5+mkl‑cp36‑cp36m‑win_amd64.whl 만 설치

    => scipy를 사용하는 함수에서 값이 틀리게 나오는 이슈 발생

  4. scipy‑1.5.2‑cp36‑cp36m‑win_amd64.whl를 추가 설치

    => statsmodels를 사용하는 함수에서 에러 발생

  5. statsmodels‑0.11.1‑cp36‑cp36m‑win_amd64.whl를 추가 설치

    => numexpr 이슈 발생과 gensim을 사용하는 함수에서 에러 발생

  6. numexpr‑2.7.2‑cp36‑cp36m‑win_amd64.whl patsy‑0.5.1‑py2.py3‑none‑any.whl를 추가 설치 및 gensim에서 사용하고 있는 scipy 라이브러리 소스코드 변경

numpy와 연관된 라이브러리를 다 변경해주면 된다. 

Brightics Studio에서는 아래 5개 + 소스 코드 수정으로 눈에 보이는 버그는 다 잡은 것 같다. 

그러고 나서 One Way ANOVA 시 에러 이 이슈는 closed 시킬 수 있었고, 사내 게시판을 통해 조만간 패치된 버전을 릴리스 한다고 공지했다.

 

교훈

이번에도 느꼈다. 아무도 믿지 말자. 윈도도 MS도 사람도. 

반응형