')">

인공지능 모형 만들기 II

모형의 학습과 모니터링

Posted by Jong-June Jeon on June 29, 2024

모형의 백그라운드 실행

간단한 백그라운드 실행을 알아봅니다. 먼저 실행하는 환경에 파이썬 파일 위치를 확인합니다. 여기서는 test.py 파일을 만들었습니다. interactive (쥬피터) 환경에서 코드가 이상없이 작동하는지 먼저 확인해야 합니다. 여기서는 우선 아래 간단한 코드로 test.py 파일을 작성하겠습니다.

# 코드작성
print("백그라운드 실행")

다음 터미널에서 다음과 같이 입력해봅시다.

# 실행
python text.py

터미널에서 "백그라운드 실행" 이 프린트 된 것을 확인할 수 있습니다.

# 실행
jeon@T7610-J:~/work/play$ python test.py

백그라운드 실행

다음으로 이름이 다음과 같이 aaa 함수를 만들고 조건문을 만들어 함수 aaa를 실행해보겠습니다. 파이썬 실행 환경이 메인인 경우, 다시 말해 __name__ 변수의 이름이 'main' 인 경우 실행하는 코드입니다. 아래 파일을 run_code.py 로 저장하고 실행해보겠습니다.

# run_code.py
def aaa():
    print("정의한 aaa 함수가 실행되었습니다.")

if __name__ == '__main__':
    aaa()
# bash 에서 실행
python run_code.py

터미널 화면에서 "정의한 aaa 함수가 실행되었습니다." 를 확인할 수 있습니다. aaa() 가 실행되면서 문자열이 프린트 된 것입니다.

다음은 조금 더 복잡한 예를 보겠습니다. 우리는 두 개의 파일을 만들 것 입니다. 파일 하나는 우리가 사용할 함수를 저장해둔 파일이고 다른 하나는 저장해 둔 함수를 불러서 실행하는 파일입니다. 우리가 사용해야할 함수들이 많다면 코드를 따로 저장해두어 필요할 때만 불러서 사용하는 것이 좋겠지요? 흔히 코딩에서 사용하는 import 명령이 다른 파일을 불러오는 것입니다.

libtext.py 는 aaa 함수를 가지고 있습니다. 다른 파일인 run.py 는 aaa.py 를 import 하여 사용합니다.

그럼 코드를 작성하기에 앞서 개발자가 되어 이 두 개의 파일을 작성한다고 생각해봅니다. 그러면 우리는 먼저 aaa 함수를 libtext.py 파일로 작성할 것 입니다. 여기서 libtext.py 파일을 직접 실행하여 함수 값을 확인하고 함수에서 틀린 곳이 없는지 오류를 찾고 수정하겠지요. 그 때, if __name__ == '__main__' 를 이용하여 libtext.py 이 직접 실행될 때 함수 값을 확인면서 코드를 수정할 수 있습니다. 터미널에서 libtext.py 를 직접 실행하여 결과를 확인해봅시다.

여기서 우리는 자연스러운 의문을 가질 수 있습니다. "왜 if __name__ == '__main__' 이 필요할까? 단순희 print 로 해결될 문제로 보이는데.." 라는 의문이죠. if __name__ == '__main__' 구문은 libtext.py 를 다른 파일에서 호출할 때 대단히 유용합니다. 많은 함수를 저장해놓은 파일이 libtext.py 라 생각해봅시다. libtext.py 를 작성할때는 함수를 실행해보고 값을 확인하는 것이 필요하겠지만, 함수를 다른 곳에서 호출 할때는 함수를 확인하는 과정이 필요가 없을테지요. 하지만 이 조건문으로 인해 우리는 함수값을 확인하는 과정을 따로 지울 필요가 없습니다. 왜냐하면 다른 파일을 통해 libtext.py 파일이 import 될 때는 __name__ == '__main__' 의 조건이 거짓이기 때문에 libtext.py 내에 함수값을 확인하는 코드가 실해되지 않습니다. 아래 예를 살펴봅시다.

# libtext.py
def aaa():
  return "정의한 aaa 함수가 실행되었습니다."

if __name__ == '__main__':
  print(aaa() + "\n이 함수는 libtext를 직접 실행하였습니다. ")
# run.py
import libtext

def main():
  return aaa()

if __name__ == '__main__':
  main() + "\n여기는 run.py 가 실행된 결과입니다. "
python run.py

이 예제를 통해서 run.py 파일이 실행되면서 main()함수가 실행되어 결국 aaa 함수가 실행됨을 알 수 있습니다. 다시 말해 libtext.py print(aaa() + "\n이 함수는 libtext를 직접 실행하였습니다. ") 는 import libtext 과정에서 실행되지 않았음을 알 수 있습니다. 왜냐하면 run.py 를 실행함으로써 import libtext 되는 과정, 즉 libtext.py 실행되는 과정에서 libtext의 __name__ 은 libtext 이기 때문에 ibtext.py 냐의 __name__ == '__main__' 가 false 입니다. 그래서 조건문 아래 함수실행이 이루이지지 않습니다.

우리는 libtext 가 import 될 때, libtext의 정보를 print 하는 코드로 만들어 보겠습니다. 흥미로운 것은 libtext 가 import 되는 것을 확인하는 것을 run.py 파일이 아니라 libtext.py 코드 위에서 작성할 수 있습니다. 바로 __name__ 을 이용하는 것 이지요. 다른 파일을 통해 libtext.py 가 import 될 때 __name__ 은 __main__ 이 아니라 파일이름인 libtext가 됩니다. 그래서 libtext.py 에 조건문을 아래와 같이 추가할 것입니다.

# libtext.py
def aaa():
  return "정의한 aaa 함수가 실행되었습니다."

if __name__ == '__main__':
  print(aaa() + "\n이 함수는 libtext를 직접 실행하였습니다. ")

if __name__ == 'libtext':
  print("libtext 패키지가 import 됩니다.")
  print("이 코드는 2024년 6월 30일에 작성되었습니다.")
  print("\n")
  
# run.py
  import libtext
  
  def main():
    return aaa()
  
  if __name__ == '__main__':
    main() + "\n여기는 run.py 가 실행된 결과입니다. "
  

모형의 백그라운드 실행

다음은 파이썬을 실행하는 프로세스가 멈추지 않고 백그라운드에서 돌아갈 수 있도록 하는 코드입니다. 여기서 nohup은 no hangup 줄임말로 멈추지 말라는 뜻입니다. 마지막 & 는 백그라운드 실행을 하라는 뜻입니다. 이 때 파이썬 실행과 함께 확인해야하는 print() 를 통한 메세지는 nohub.out 에 저장됩니다.

#shell
nohup python run.py & 

아래 명령어로 실행되고 있는 프로세스 식별자와 부모프로세스 식별자를 확인할 수 있습니다.

#shell 
ps -ef | grep run.py

ID 프로세스식별자1 부모프로세스식별자 0 19:25 pts/5 00:00:00 python mnist_gan.py

다음으로 아래 명령어를 입력합니다.

#shell 
ps -ef --forest | grep 부모프로세스식별자 

그러면 ID 프로세스식별자2 부모프로세스식별자 99 19:08 pts/5 00:35:31 | \_ python run.py 를 확이할 수 있습니다.

다음 코드를 통해 프로세스 식별자를 이용해서 해당 프로세스를 강제로 종료할 수 있습니다.

kill 프로세스식별자2