Visual studio code, pipenv를 활용한 강화학습 개발 환경 꾸리기(7)
Step Into
이전 포스트에서 F10 키는 Step Over 키로 해당 라인 한줄을 실행하는 단축키라 말씀드렸습니다. 이번엔 F11 키, Step Into에대해 알아보겠습니다.
다시 action을 select하는 함수 앞에 중단점을 걸고 위쪽 셀은 실행하고 해당 셀을 디버깅 모드로 실행합니다. 코드가 해당 중단점에서 실행을 잠시 멈추면 F11 키를 누르겠습니다.
바로 함수 안으로 Step Into하는 것을 볼 수 있습니다. 이처럼 F10과 F11은 다른 동작을 보여줍니다. 상황에 따라서 적절한 키를 눌러서 디버깅하시면 됩니다.
F11 키를 계속 눌러볼까요? 함수 마지막 줄을 실행하면 어떻게 될까요? 해보시면 아시겠지만 코드 순서대로 함수 밖으로 나가서 계속 이어지는 것을 볼 수 있습니다.
Step Out
디버깅을 하다 보면 F10 키와 F11 키는 헷갈리기 마련입니다. 혹은 함수 안에서 보고싶은 부분을 다 봤을 수도 있습니다. 이런 경우 함수를 바로 빠져가는 동작이 Step Out입니다.
다시 한번 코드를 실행해서 F11을 이용해서 함수 안으로 들어가 볼까요? 그 안에서 Shift + F11을 눌러보세요. 바로 한번에 함수를 빠져나가는 것을 보실 수 있습니다.
Debug All Code
하지만 지금 상황에서는 F11 키가 다른 패키지의 함수 안으로 들어가지는 않습니다. 예를 들어 env.reset() 함수 앞에 중단점을 걸어보겠습니다.
그리고 F11을 눌러보겠습니다. 분명 reset()도 하나의 함수임에도 불구하고 step into하지 않네요. 함수 안으로 들어가보기 위해선 세팅이 필요합니다. 메뉴에서 Extentions 아이콘을 누르고 Manage -> Extention Settings를 누르겠습니다.
여러 항목 중 Jupyter: Debug Just My Code 항목이 보이시나요? Debug Just My Code 체크박스를 해제하겠습니다. 다시 한번 reset()에서 step into해볼까요?
보시는 것 처럼 우리는 gymnasium 패키지 안까지 살펴볼 준비가 완료되었습니다!
Debug Console
디버그 콘솔에 대해 알아보겠습니다. 디버그 콘솔은 하단에 터미널과 Jupyter 탭과 함께 나란히 있습니다. 이 디버그 콘솔에서는 바로 여러 파이썬 커널과 상호작용할 수 있습니다.
예를 들어 디버깅 중 random.random() 함수를 봤는데 이 함수가 정확하게 어떻게 동작하는지 궁금한 경우라 해보겠습니다. 그럼 바로 디버그 콘솔에 이 함수를 사용해 볼 수 있습니다.
디버그 콘솔에 해당 함수를 여러번 쳐 볼까요? 랜덤한 값을 잘 출력해 주는 걸 볼 수 있습니다.
혹은 현재 변수의 값도 조정할 수 있습니다. 물론 데이터 뷰어를 통해서도 가능하지만 키보드 커맨드가 편할 때가 종종있습니다.
위 그림처럼 직접 에피소드 수를 조절해보면 코드에 바로 적용되어 데이터 뷰어에도 적용되고 학습이 진행될 에피소드가 정말로 300번만 수행되는 것을 보실 수 있습니다.
이처럼 디버그 콘솔도 디버깅 작업중 유용하게 사용될 수 있습니다. 위의 방법들은 우리의 파이썬 생산성을 높이는데 크게 도움을 줄 것입니다.
.py Debugging
지금까지 우리는 Jupyter Notebook 환경에서 디버깅하는 여러 방법들을 살펴보았습니다. 한편 VS code에서는 Jypyter Notebook, Ipykernel, .ipynb 파일을 사용하지 않고 바로 .py 파일 즉 그냥 파이썬 스크립트에서 디버깅 할 수 있습니다.
대부분의 디버깅 기능이 이미 설명한 내용과 비슷합니다. 더 자세한 내용은 공식 메뉴얼을 확인해 주세요.
여기에서는 간단히 언급만 하도록 하겠습니다. 먼저 justMyCode 세팅을 여기에서도 할 수 있습니다. 디버깅 json 설정 파일에 true/false 세팅하는 필드가있습니다.
다음으로 함수의 call stack을 볼 수 있습니다. 이 부분을 통해 지금 함수가 불려진 순서를 확인할 수 있습니다.
또한 객체의 상세한 정보를 볼 수 있습니다. 데이터 뷰어는 말 그대로 데이터를 확인 조작하기에 편한 툴인데 그 외 객체의 여러 정보, 멤버 함수 등을 표현해주지는 않습니다.
반대로 .py 스크립트를 직접 디버깅 할 때 불편한 점도 있습니다. 데이터 뷰어를 사용할 수 없어 큰 데이터 조작이 조금 불편합니다.
이렇게 두가지 환경에서 디버깅 하는 방법을 알아보았습니다. 보시는 것과 같이 여러 장단점이 있습니다. 필요에 따라 적절히 섞어 사용하시면 디버깅에 큰 도움이 될 것입니다.
이 포스트를 마지막으로 이번 시리즈를 마치겠습니다. 이제 내가 원하는 혹은 만든 환경에서 강화학습으로 최적의 솔루션을 찾아보고 싶지 않으신가요? 이를 위해서 다음 시리즈에서는 gymnasium 패키지를 좀 더 자세히 알아볼 예정입니다.