본문 바로가기
CS

주피터 노트북 문서(.ipynb) 커맨드로 실행하기 (nbconvert, nohup, &)

by judy@ 2023. 9. 1.

목차

    배경

    파이썬을 사용하여 데이터를 분석하거나 모델링을 할 때 주피터 노트북 문서인 ipynb 확장자의 파일을 흔하게 사용한다. 이 파일은 vscode나 jupyter server를 띄우면 파이썬 코드를 셀(cell) 단위로 실행하고, 실행 결과가 문서에 기록되어 데이터를 다룰 때에 매우 편리하다는 장점이 있다. 하지만, 네트워크가 끊기거나, 문서를 닫으면 문서의 실행이 중단된다는 단점이 있다. 나는 이 때문에 모델을 학습하다가 중단되어 눈물을 흘린 적이 한 두 번이 아니다....! 

    잘 작성해둔 주피터 노트북의 특정 파라미터만 변경하여 여러 실험을 할 때에 유용한 방법을 소개한다. 이 방법은 간단히 말하면 주피터 커맨드와 리눅스 커맨드 몇 가지를 조합하여, ipynb 파일을 CLI로 실행하면서도, 문서 내에 셀 단위의 실행 기록을 모두 남길 수 있는 방법이다.

     

    문서의 대상

    • 주피터 노트북 문서를 명령어로 실행하고 싶은 분
    • 주피터 노트북 문서를 백그라운드로 실행해두고 학습이 다 된 뒤 확인하고 싶은 분
    • 주피터 노트북 문서의 일부만 변경하여 여러 번 실행하고 그 결과를 확인하고 싶은 분

     

    필요한 것

    • 주피터 노트북 문서 (*.ipynb)
    • 파이썬 실행 환경 (터미널 등)

     

    이 문서의 실행 환경

    • MacOS m2 pro terminal
    • python 3.10

     

    0. jupyter 설치

    jupyter 커맨드를 사용하여 노트북 문서를 실행할 것이므로, jupyter 패키지를 설치한다.

    conda install jupyter

    내가 가지고 있는 파일의 이름은  lda2.ipynb 이다

     

     

    1. ipynb를 터미널에서 커맨드로 실행하는 방법

     

    파일명을 지정하기 않고 실행하면 아래와 같이 파일명과 확장자 사이에 nbconvert가 붙은 새로운 파일로 저장이 된다.

    $ jupyter nbconvert --execute --to notebook lda2.ipynb
    [NbConvertApp] Converting notebook lda2.ipynb to notebook
    [NbConvertApp] Writing 362174 bytes to lda2.nbconvert.ipynb

     

    원한다면 아래와 같이 파일명을 지정할 수도 있다

    $ jupyter nbconvert --execute --to notebook lda2.ipynb --output lda3.ipynb
    [NbConvertApp] Converting notebook lda2.ipynb to notebook
    [NbConvertApp] Writing 356471 bytes to lda3.ipynb

     

     

    2. ipynb를 커맨드 + 백그라운드로 실행하는 방법

     

    위 커맨드를 백그라운드로 실행하려면 커맨드 맨 끝에 &(앰퍼샌드)를 붙이면 된다.

    jupyter nbconvert --execute --to notebook lda2.ipynb --output lda3.ipynb &

     

    그런데 위와 같이 하면, 터미널에 자꾸 stout & stderr가 쌓여 정신 없으므로 아래와 같이 표준 출력과 에러를 특정 파일에 쓰도록 리다이렉션한다.

    jupyter nbconvert --execute --to notebook lda2.ipynb --output lda3.ipynb &>> log.txt

     

    하지만 위처럼 실행하여도, 위 프로세스를 실행한 셸(shell)을 종료하면, parent process가 종료되어 위 프로세스의 실행이 중단된다. 중단된 경우 로그 파일(위에서 log.txt)를 열어 맨 마지막 문장을 보면 아래와 같이 써져있는 것을 볼 수 있다. 이런 경우 nohup을 사용하면 된다.

    [IPKernelApp] WARNING | Parent appears to have exited, shutting down.

     

     

    3. ipynb를 커맨드 + 백그라운드 + 터미널을 종료하여도 정상적으로 실행하는 방법

     

    바로 위에서 언급한 것처럼, 부모 프로세스인 셸을 닫아도 프로세스가 정상 종료할 때까지 실행하게 하려면 앞에 nohup이라는 명령어를 붙여주면 된다.

    jupyter nbconvert --execute --to notebook lda2.ipynb --output lda3.ipynb &>> log.txt

     

    nohup이란 no + HUP(hangup) 으로, HUP 신호를 무시하도록 만드는 명령어임. HUP 신호는 터미널이 의존 프로세스들에게 로그아웃을 알리는 방식으로, 위에서 언급한 셸 종료시 백그라운드 프로세스도 종료되는 현상을 말한다. 이를 방지하는 명령어가 nohup이다.

    반응형