본문으로 바로가기

1. 문제 상황

Deeplearing from scratch 3 step 52 를 진행하고 있던 중 책에서 나온 코드 그대로 입력한 것 같은데 다음과 같은 TypeError: operand type(s) all returned NotImplemented from __array_ufunc__(<ufunc 'add'>, 'at', array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], ... 에러가 발생하더라구요. 이번 포스팅에서는 해당 원인을 알아보고 해결 방법을 탐색해보도록 하겠습니다.

 

 

 

2. 원인 및 해결

인터넷에서 원인을 검색한 결과 다음과 같은 자료를 얻을 수 있었습니다. 즉, numpy 는 __array_function__ protocol 과 __array_ufunc__ 를 이용하는데 __array_ufunc__ protocol 을 이용하는 메서드 ( 여기선 np.add.att 이 __array_ufunc__ protocol에 속합니다.) 는 cupy 에서 지원을 안한다는 글이 있네요.

 

 

 

 

저자가 책을 저술할 때도 이런 문제와 부딪혔을 것 같은데 이상해서 deep learning from scratch 3 github 코드를 보니까 xp 가 cupy 인 경우 다른 메서드를 통해 계산하도록 하고있습니다. 위의 설명과 일치하는 문맥에서 작성한 코드 같습니다.

 

 

 

 

 

github 와 같이 코드를 수정하니까 이제는 다음과 같은 에러가 발생했습니다 ㅠ 찾아보니까 cuda.scatter_add 함수는 삭제되어서 해당 에러가 발생한 것 같군요.

 

 

 

 

찾아보니 import cupyx 의 scatter_add() 가 예전 cupy.scatter_add() 의 기능을 한다고 하네요! gpu 버전 때 다음과 같은 코드로 수정을 하면 정상적으로 학습이 되는 것을 확인할 수 있었습니다.

 

 

 

3. 마무리

해당 책이 단계적으로 진행되다보니 GPU가 안되면 이후 단계는 진행하지 못하는 것 아닐까.. 라고 걱정을 했었는데 Step 60까지 공부해본 결과 GPU는 이용하지 않아도 괜찮더라구요 ㅎㅎ CPU 버전으로도 step 60까지 진행할 수 있습니다. 끝까지 화이팅입니다!