Python GIL해제가 곧 다가올지도...?!

손기훈·2024년 10월 17일

🐍 Python Devs Shocked! Multithreading Ahead!

요약

C++ 개발자나 JAVA 개발자 분들과 얘기를 하다가 병렬처리를 해야할 때, python의 경우 멀티프로세싱으로 처리하는게 좀 더 파이썬에게는 유리하다고 얘기를 하면 이해를 못하는 경우가 있다. 파이썬의 GIL이라는 속성 때문에, 그렇다는 말을 하면 그런 언어(?)가 어디 있느냐는 얘기까지 듣게 된다.

하지만, 이제 그런 오해(?)로부터 자유로워 질 수 있을 것 같다. 조만간, GIL을 해제하는 옵션이 탑재된 파이썬 버전이 나올 수도 있기 때문이다. 위의 기사는 GIL을 해제하려는 움직임과 멀티스레딩을 둘러싼 파이썬 개발자들 간의 논쟁의 역사등을 소개하고 있다.

간단하게 위의 기사를 요약하자면 다음과 같다.

왜 멀티 프로세싱이 쓰였는가?

  1. 이미 많은 파이썬의 익스텐션과 코드들이 GIL을 상정하고 개발되었다.
  2. 이미 한 번 해제해 봤는데 싱글 스레드보다 느리더라

예에에엣날에 2번의 경우 강제로 파이썬을 여러개로 쓰레드로 사용하게 되는 경우, 싱글 스레드로 연산을 수행할 때보다 연산단계각 많아져 최대 30% 까지 속도가 저하되었다고 한다.

그렇다면 왜 다시 멀티쓰레딩에 대한 요구 사항이 생겼는가?

PEP 703 – Making the Global Interpreter Lock Optional in CPython | peps.python.org

파이썬은 생각보다 오래된 언어고, 개발 될 당시의 CPU의 구조는 싱글 코어 싱글 스레드였다. 하드웨어의 발전과 함계 언어의 발전에 대한 요구이기도 하지만, 근래에 가장 강력하게 푸싱 받는 이유는 인공지능 소프트웨어의 발전에도 상당한 이유가 있다.

위의 기사에도 소개된 PEP-703에 해당 이슈가 자세하게 소개되어 있다. 이를 간단하게 설명하자면 다음의 이유로 파이썬의 멀티 쓰레딩에 대한 요구사항이 늘어나고 있다.

  1. GIL로 인해 여러 형태의 병렬처리가 제한받고 있다.
  2. 파이썬 라이브러리의 사용성이 제한된다.
  3. GPU가 많이 사용되는 경우 멀티-코어 프로세싱을 요구한다.
  4. 파이썬의 AI 모델을 배포하는데에 있어 어려움을 겪게 한다.

위의 링크에 각 부분에 대한 내용이 자세하게 기술되어 있다. 각 이유 대부분 파이썬의 인공지능 프레임워크와 관련된 문제가 예시로 드러나며 해당 문제의 원인으로 GIL을 가리키고 있다.

엥 그럼 threading 모듈이나 파이썬으로 멀티쓰레딩하던 건 뭐야?

What's the point of multithreading in Python if the GIL exists?

그렇다면, 우리가 그동안 사용하고 있던 파이썬의 스레딩은 무엇인가? 라는 물음이 자연적으로 들 수 밖에 없다. 해당에 대한 물음에 대한 질문과 답변에 대한 스택오버플로우 링크이고 이를 간단하게 줄여서 설명하자면 다음과 같다.

먼저, threading 모듈에서 사용되는 스레드는 실제의 스레드들이다. GIL은 순수하게 파이썬으로 작성된 상황에서만 동작한다. 그리고, 여러 가지 경우에 GIL가 적용되지 않는 경우들이 있는데 다음과 같다.

  1. I/O 동작 - 네트워크에서 데이터를 받는다건가, 파일의 읽고 쓰기 처리라던가
  2. CPU와 강력하게 바인딩 된 동작 - 압축, 해슁
  3. C 기반 익스텐션 - numpy

이 중에서 numpy의 경우는 알고 있었는데, 1번과 2번의 경우는 알고 있지 못 했다.

threading 모듈의 동작 방식

  1. 먼저 스레드를 생성한다.
  2. GIL로 인해 하나의 쓰레드만이 파이썬의 바이트 코드를 처리할 수 있다.
  3. 새로 생성된 스레드는 GIL을 확보해야한다.
  4. 파이썬 인터프리터가 주기적으로 GIL을 해제하고 다른 스레드가 실행될 수 있도록하는 컨텍스트 스위칭이 일어난다.
profile
파이썬과 함께라면 두렵지 않아

0개의 댓글