듀얼 부팅 [Windows10/Ubuntu] ML/DL 환경세팅 : Part 5 - 서버에서 학습시 shell 파일과 nohup을 사용하는법!

3 minute read

신년 맞이 프로젝트로 서버 구축하고 이제 밖에서도 접속하면서 학습도 실행할 수 있게 되었다!

그러나 매번 학습을 위해서 명령어를 입력해 주는것도 귀찮은 일 중 하나이다.. 그래서 활용하는게 바로 shell 파일! 그 동안 다른 사람들 github을 보면 종종 확장자가 .sh 인 파일들이 있는데 윈도우만 사용하던 저는 그게 뭔지 잘 몰랐다.

내용을 보면 대충 아래와 같이 써있는거보니 학습 명령어를 저장하는 용도로만 생각했다.

model_train.sh 파일

python main.py

그러나 이번에 우분투를 사용하면서 생각난것이 바로 저 파일에 대한 활용법이다. 윈도우에서는 명령어를 매번 입력하기 귀찮을땐 batch 파일로 만들어서 썼으면 됐지만 이제 우분투로 운영체제를 바꾸면서 shell 파일을 써보고자 사용법을 공부하게 되었다.

shell 파일에 대한 모든 것을 알필요없고 단순히 학습할때 필요한 정도만 알면 됐기에 아래와 처음에는 평소와 같이 명령어를 작성했다.

RAN_KAR_cifar10_0.1.sh 파일

python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.1 
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.2
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.3
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.4 
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.5 
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.6 
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.7 
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.8
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.9

실행!

$ bash RAN_KAR_cifar10_0.1.sh

이렇게 했더니 문제가 생겼는데, 바로 모든 명령문이 동시에 실행된다는 점이였다….

9개의 명령문이 다 실행되다보니 그래픽카드가 순식간에 차고 에러로 난무하는 상황이 생겨서 황급히 프로세스를 모두 죽이고 다시 방법을 찾았다.

바로 여러개의 명령문을 작성할때 쓰는 방법이다. 사용법은 ; 도 있고 && 도 있다. 두 가지의 차이점은 ;은 성공여부와 관계없이 앞에 있는 명령문이 끝나면 뒤의 명령문을 실행해 주는 식이다. 그러나 이런경우 문제가 생길 수 있기에 && 은 앞선 명령문이 성공해야 뒤의 명령문이 실행되도록 한다.

그렇다면 이제 && 을 사용해서 앞서 작성한 shell 파일을 수정해보았다. multi line으로 작성할 때는 \ 을 마지막에 적어서 라인을 나눌 수 있다.

RAN_KAR_cifar10_0.1.sh 파일

python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.1 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.2 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.3 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.4 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.5 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.6 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.7 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.8 && \
python ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.9

실행!

$ bash RAN_KAR_cifar10_0.1.sh

이제 각 명령문을 하나씩 실행하는건 다되었지만 한가지 걱정되는 점이 있다. 노트북을 끄게되면 서버와 연결도 끊기게되고 학습도 종료된다는점! 이럴때 어떻게 해야할까?

바로 nohup을 사용하면 된다. nohup이란 서버와 연결이 종료되어도 백그라운드 환경에서 계속해서 동작하도록 도와주는 역할을 한다.


nohup 만세

작성방법은 간단하다. 쉘 파일을 실행할때 앞에 nohub을 작성해주면 된다는점!

실행!

$ nohup bash RAN_KAR_cifar10_0.1.sh

nobup으로 실행되게되면 코드로 작성했던 print문은 bash창에 나오지 않는다. 모든 결과물은 실행 경로에 nohup.out 이라는 파일이 함께 생기게된다.

그러나 또 한가지 불편한 점은 nohup.out은 바로바로 결과물이 쌓이는것이 아니라 일정수준이 되어야 쌓이는 식이라서 로그를 실시간으로 확인하기가 여간 불편한게 아니다.

이럴때 또 사용할 수 있는 방법이 python에 기본적으로 있는 -u 기능이다. 방법은 아래와 같이 작성해 주면 된다.

RAN_KAR_cifar10_0.1.sh 파일

python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.1 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.2 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.3 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.4 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.5 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.6 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.7 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.8 && \
python -u ../code/main.py --eval=KAR --target=cifar10 --attention=RAN --method=GC --ratio=0.9

실행!

$ nohup bash RAN_KAR_cifar10_0.1.sh

쉘 파일을 실행한 경로를 보면 nohup.out이 생성된것을 볼 수 있다.

$ ls -al


그렇다면 이제 서버를 세션을 종료했다가 다시 접속해서 확인해 보도록 한다. 실시간으로 로그를 확인하기 위해서는 아래 명령문을 입력해주시면 된다.

$ tail -f nohup.out


Glances로도 사용량 확인! 이번에 우분투로 옮기면서 glances를 다시 사용하게 되었다. 역시나 편한 것.


nvidia-smi 로도 gpu를 잘 쓰고 있는지 확인해본다.


1. 맺음말

이번 계기로 알게된 놀라운점은 우분투로 학습하면 윈도우보다 더 빠르다는 것을 체감했다. 알고는 있었지만 그동안 귀찬아서 윈도우로 쓰고있었는데 epoch당 30초정도 빨라진걸보면 쉽게 넘어갈 문제는 아니다. 알면서 안쓰는것 잘못인듯했다. 반성.

컴퓨터를 몇 번 재부팅했는지 모르겠지만 감기때문에 밖에 나가지 못한겸 집에서 하루만에 작업을 끝낼 수 있어서 다행이다. 펭-바!



Categories:

Updated:

Leave a comment