Research/Programming

GIL. python

shhyun 2020. 4. 28. 12:00

파이썬으로 고성능의? 아니 병렬화된 어떤 코드를 개발할 때, 항상 걸림돌이 되는 요소가 GIL(Global Interpreter Lock) 이다. ML 관련된 다양한 일들을 하면서, 파이썬이 상당히 각광받고 있는 것도 사실이지만, 반대로 이걸로 서비스를 개발하려고하면, 당면할 수 밖에 없는 문제가 바로 GIL 이다. 

어? 근데 파이썬도 스레드를 지원하잖아요? 라고 묻는다면, 그 스레드가 여러개가 동시에 동작하더라도, 결국엔 하나의 스레드만 파이썬 오브젝트에 접근할 수 밖에 없기 때문에, 사실상 Single-threaded 프로그램과 다를 바 없으며, 그래서 원한만큼 효율을 높이는 데에는 한계가 있음을 알 수 있다. 이러한 특징으로 파이썬에서는 병렬화된 프로그래밍을 한다고 하면, 프로세스를 늘리는 형태로 만드는 것이 일반적이라 할 수 있고, 특히나 Django 나 Flask 같은 웹서버는 ASGI 같은 미들웨어와 함께 운용되는 것을 볼 수 있다.

참 아쉬운건 그래서 왜 GIL 이 적용되냐 라는 건데, 이 부분이 일반적으로는 파이썬의 구현체인 CPython 에서 내부적으로 Thread-safety 하지 않기 때문이라고 알려져 있다. 이게 결국엔 메모리 관리 방식에 있어서 Reference Counting 으로 인한 것이 같은데, 내부적으로 언젠간 이에 대한 변수들의 관리를 mutex 와 같은 것들을 atomic 이나 다른 것들로 바꾼다면 좋아질 것 같다는 생각도 든다.

문제라면, 파이썬의 개발 주체들이 이야기 하듯, 변수 관리에 대한 다른 방법들을 적용했을 때, 다중 스레드가 아닌 싱글 스레드의 성능 저하가 발생하지 않는 방법이 있다면, 그 개선안을 받아들이고 진행할 거라고 했었던 것 같다. 정확한 레퍼런스는 찾아봐야겠는데, 하도 오래된 기억들이라... 이게 아마 2007년? 8년? 이었던 것 같은데... 아마도 누구나 예상하듯, 그런 방안은 아직은 없다. 거의 저하가 없어 보이는 그런 방법들은 일부 있지만, 구현 복잡도나 관리 복잡도 측면에서 범용화시키기 어려운 부분이 있다. 그로 인하여 사실 파이썬은 여전히 그 넓은 사용성과 편의성에도 불구하고, 고성능에는 어울리지 않는다는 생각이 많이 든다.

Pytorch 도 TF-serving 도 그런 측면에서 serving 툴은 c++, java 같은 언어들을 활용하는 것이겠지만, 한편으로는 아쉬운 생각이 든다.