현재 강화학습을 사용한 업무를 진행하고 있다.
하지만 강화학습 환경이 느리다.
훈련속도를 가속화하기 위해 다양한 python profiler를 적용하여 병목 지점을 찾아내었다.
먼저 다양한 종류의 python profiler가 있었다.
가장 기본이 되는 profile과 cProfile이 있었다. profile은 매우 느리고, cProfile은 빠르지만 function단위로 profiling을 하고, 결과를 binary로 저장해 한번더 풀어야하는 귀찮음이 있었다.
다음으로 사용한 것은 line-profiler이다.
line-profiler는 적당한 속도로 프로파일링이되고, line단위로 좀 더 자세한 통계정보를 알려준다.
하지만 line-profiler는 어느 method에서 프로파일링을 할 것인지 지정해줘야 하고, class에는 적용할 수 없다. 그리고, 실행할 때 kernprof -l -v {program name}.py
으로 실행해야 한다.
그 외에 다음의 profiler들을 이번에 사용해보았다.
- pyinstrument: function단위로 실행되고, html로 출력할 수 있다. 병목지점을 쉽게 찾을 수 있다.
- py-spy: 타겟을 지정할 수 없지만 line단위로 실행된다. flame graph나 speedtscope 형태로 출력하므로 병목지점 찾는데 유용하다
- pprofile: line-profiler에서 영감을 받아 만든 profiler로 line별로 통계정보를 출력한다.
- scalene: python time, cpu time, gpu, memory, copy volumne 등 다양한 정보를 출력한다. 타겟을 지정할 수 없고, 전체 프로그램 중에서 병목지점에 대한 정보만 출력된다.
나는 이러한 프로파일러들을 크게 두 단계로 나누어 사용했다.
- py-spy나 pyinstrument를 사용해 정확한 병목지점을 찾는다
- line-profiler를 사용해 해당 function에 어느 부분이 문제인지 통계정보를 확인한다 (e.g. call 수가 너무 많다, 실행시간이 너무 길다 등)
아무래도 line-profiler를 사용하면 전체적인 프로파일링 결과를 얻기 어렵고, 병목지점을 확인하기 위해서는 프로그램을 여러번 돌려야 한다.
그것보다는 다른 profiler를 사용해 병목지점을 찾고 디테일한 정보를 line-profiler로 찾는 것이 가장 편한 것 같다.