목차
대상 독자
1. 책 소개
2. 책을 읽게 된 이유
3. 책에서 좋았던 점
4. 정리
대상 독자
대용량/대량의 데이터 처리와 AI/ML모델 성능 최적화를 고민하는 파이썬 개발자들에게 추천합니다.
책 소개
<고성능 파이썬>은 다양한 라이브러리와 파이썬 구현체를 사용하여 최적화를 달성할 수 있게 도와주는 실용서입니다. 부제가 “파이썬 성능 잠재력을 끌어내는 실용적인 개발 전략서”인 만큼 책의 서문에서 대상 독자를 중고급 파이썬 프로그래머로 설정하고 있습니다. 스터디를 진행해 본 결과 비동기, 병렬처리, GIL에 대한 개념이 익숙하지 않더라도 책을 읽으면서 배워나가면서 얻는 효익이 더 큰 것 같습니다. 또한 실습 코드가 Github에 올라와 있어 따라하면서 학습하기 용이합니다.
책을 읽게 된 이유
저는 데이터 분야의 파이썬 개발자로서 파이썬을 잘 알고 쓰고 싶다는 생각에 아래의 책들로 읽어보려고 고민하고 있었습니다.
- 고성능 파이썬
- 단단한 파이썬
- 이펙티브 파이썬
특히 고성능 파이썬 같은 경우는 ML/AI에 특화된 내용이 많아서 우선순위가 높았습니다. 세부 목차만 읽어봐도 Numpy, Pandas, Pytorch 등 데이터 분야의 개발자들에게 도움이 될 만한 내용이 많아 보였습니다.
그러던 중 저희 팀에서 구매한 책 중에 고성능 파이썬이 있었고, 다 같이 읽자는 이야기가 나와서 스터디를 진행했습니다. 스터디는 4개월 간 4명이 번갈아 가면서 해당 분량을 읽고 실습한 후에 발표하는 방식으로 이루어졌습니다.
이 책의 내용
책의 목차는 다음과 같습니다.
- CHAPTER 1 고성능 파이썬 이해하기
- CHAPTER 2 프로파일링으로 병목 지점 찾기
- CHAPTER 3 리스트와 튜플
- CHAPTER 4 사전과 셋
- CHAPTER 5 이터레이터와 제너레이터
- CHAPTER 6 행렬과 벡터 계산
- CHAPTER 7 C 언어로 컴파일하기
- CHAPTER 8 비동기 I/O
- CHAPTER 9 multiprocessing 모듈
- CHAPTER 10 클러스터와 작업 큐
- CHAPTER 11 RAM 덜 사용하기
- CHAPTER 12 현장에서 얻은 교훈
책을 전체적으로 프로파일링, 자료구조, 메모리나 실행 시간 줄이기, 현장에서 얻은 교훈 이렇게 4파트로 개념화해서 읽을 수 있습니다. 먼저 프로파일링은 프로그램에서 어디가 병목인지를 확인한 후 최적화를 하기 위해 사용합니다. 자료구조는 파이썬에서 자주 사용하는 리스트, 튜플, 사전, 셋, 이터레이터, 제너레이터의 내부 작동 원리를 자세히 설명합니다. 메모리나 실행 시간 줄이기는 행렬과 벡터 계산, 비동기 IO, multiprocessing 등의 기술을 소개하는데 메모리 vs. 스피드의 관점에서 어떤 트레이드 오프가 있는지 생각하면서 읽으면 좋습니다. 현장에서 얻은 교훈 챕터에서는 여러 저자들이 자신의 프로젝트/회사에서 직면했던 문제 상황과 어떤 방법과 툴을 사용해서 문제를 해결했는지 설명합니다.
책에서 좋았던 점
1. 구성상의 매끄러움
어느 훌륭한 실용서가 그러하듯 책의 구성이 자연스럽게 이어집니다. 책의 저자가 제안하는 작업 순서에 따라서 목차 구성이 되어있습니다. 최적화를 하기 위해서는 먼저 어느 부분이 병목인지 파악해야 하므로 프로파일링 챕터가 먼저 나오고, 싱글 코어로 먼저 해결을 시도하는 Numba나 사이썬 같은 컴파일러 사용, 멀티 프로세싱으로 다중 코어 사용, 여러 컴퓨터를 사용하는 클러스터 사용으로 흐름이 이어집니다.
2. 실무적인 도움
전체적으로 모든 챕터가 좋았지만, 개인적으로 크게 도움을 받았던 챕터들을 소개하겠습니다.
프로파일링으로 병목 지점 찾기
모듈이 무겁고 느릴 때 측정을 많이 안 하고 ‘이 부분이 느리겠지?’라고 생각하고 그 부분을 개선하려고 하는데, 성능 개선 이전에 프로파일링이 선행되어야 한다는 (당연하지만 지키기 어려울 때가 많은) 원칙을 제시하고 프로파일링할 수 있는 여러 툴을 소개합니다.
책에서는 가설 세우는 것과 프로파일링의 중요성을 계속 강조하는데, 모듈 레벨에서 어떤 “함수”가 병목 지점인지, 함수 내에서 어떤 “문장”이 병목인지 가설을 세우고 실제로 가설이 맞는지 검증할 수 있게 다양한 방법을 소개합니다.
책에서 timeit
,
/usr/bin/time
같이 간단하게 전체 실행 시간을 측정하는 도구와 cProfile
처럼 전체 모듈에서 어떤 함수들을 몇 번이나 호출하고, 소요된 시간은 얼마인지 알려주는 모듈도 소개합니다.
이처럼 기본 라이브러리 외에도 line_profiler
, memory_profiler
, py-spy
등 자세한 분석을 해주는 프로파일링 툴들도 실습과 함께 소개하고 있습니다.
실습 - Cython, PyPy
잘 사용해보지 않은 라이브러리/언어를 실습을 통해서 경험해 본 것이 좋았습니다. Numba로 기존 파이썬 코드에 큰 수정 없이 성능 개선까지는 시도해 봐도 컴파일이 되는 Cython이나 다른 언어인 PyPy는 시도해보지 않았는데, 나중에 필요하게 되면 유용하게 참고할 레퍼런스를 제공합니다.
동시성 프로그래밍
비동기 I/O 챕터에서는 동시성과 병렬성의 차이와 이벤트 루프를 사용하는 패러다임인 콜백과 퓨처도 예시와 함께 설명하기 때문에 동시성 프로그래밍에 대한 개념적인 이해를 하기 좋습니다. 또한 비동기 라이브러리 중 gevent, tornado, aiohttp를 사용한 예시를 제공하여 많이 쓰이는 라이브러리를 비교하며 살펴볼 수 있습니다. 마지막으로는 무조건 빠른 것이 좋은 것이 아니라 유지보수 가능성도 고려해야 한다는 조언도 잊지 않습니다.
3. 코드 제공
코드가 제공되고 책에 나와있는 그래프를 그리는 코드까지 나와있어서 실습하면서 따라가기 쉽습니다. 파이썬 3.6 버전을 사용한다면 책의 결과와 비슷하게 재현할 수 있습니다.
4. 번역 퀄리티
마지막 장점으로는 번역 퀄리티가 좋습니다. 이 책의 번역은 자연스럽고 한영 병기를 적절히 사용하여 추후 검색할 때 검색이 편리합니다.
정리
ML 엔지니어로서 프로덕션 환경에서 AI/ML 모델을 제공할 때는 모델의 성능을 올리는 것 외에서 고려해야 할 사항들이 많이 있습니다. 가지고 있는 자원 내에서 모델에게 요구되는 추론 시간, RAM 사용량 등의 제약을 늘 생각하면서 모델들을 선정 후 최적화하게 됩니다.
온프레미스 서버에 배포할 때와 클라우드에 배포할 때의 제약 사항도 많이 다릅니다. 클라우드 같은 경우는 비용을 더 지불하면 코드 상의 수정 없이 문제 해결이 가능한 경우도 있고, 온프레미스 서버의 할당된 자원 내에서 코드를 돌려야 하는 경우도 있을 것입니다. 반대로 클라우드에서 비용을 줄이기 위해서 더 가벼운 모델로 바꾸거나 최적화가 요구되는 경우가 있을 수도 있습니다.
이처럼 AI/ML 모델을 개발하고 배포할 때 모델 성능, 추론 속도, 메모리 사용량 대한 의사 결정이 필요한 순간이 많을 것입니다. 이때 ‘추론 속도’, ‘메모리 사용량’의 프로파일링을 통해서 어떤 부분을 최적화해야 할지 판단할 때 도움을 받을 수 있습니다. 모델 성능을 “얼마나” 희생하고 추론 속도를 “얼마나” 빠르게 만들 것인가를 알고 이때 정확한 근거로 설득한다면, 프로파일링하는 데에 시간이 다소 소요되더라도 의사 결정이 쉬워지게 만듭니다.
이런 과정에 대해서 한번이라도 고민해 본 적이 있는 대용량/대량의 데이터 처리 및 파이썬 코드 최적화를 하시는 분들께 추천합니다.