Introduction
이런 적이 있다.
며칠이 걸리는 학습 프로세스를 급하게 켜 놓고 금요일에 퇴근했는데, 월요일에 와서 보니 시작 직후 사소한 버그로 인해 학습 프로세스가 중단된 것이다.
월요일에 모델 학습을 완료하고 다른 작업을 진행하려 했지만, 금요일에 학습 프로세스가 중단된 것을 알지 못해 다시 며칠 동안 학습을 진행시켜야 했다. 크나큰 자원의 낭비라 할 수 있다.
물론 주말 동안 한 번이라도 터미널에 접속해 봤어도 이를 알 수 있었을 테지만 주말동안 '굳이' VPN을 켜고 원격 접속을 해 터미널을 열어 학습 진행 상황을 확인해 보는 것은 적지 않은 의지를 필요로 한다.
가만.. 그러고 보니 학습 프로세스에 문제가 생겼을 때에 이메일이나 슬랙, 팀즈 등을 통해 알림을 받을 수 있다면 좋지 않을까?
이번 포스팅에서는 파이썬을 이용한 딥러닝 모델 학습 중 예기치 못 한 에러가 발생했을 경우, 다양한 경로로 알림을 받는 방법을 소개하고자 한다.
The Knock Knock Library
knockknock 라이브러리는 학습의 시작, 종료, 그리고 처리되지 않은 에러 발생 시 다양한 경로로 알림 (notification) 을 보낼 수 있도록 도와주는 라이브러리다. 이 라이브러리는 작고 사용법도 간단하지만, 굉장히 강력한 유용함을 자랑한다. 한번 자세히 살펴보도록 하자.
Installation
pip install knockknock
간단하게 pip을 이용해 설치할 수 있다.
Available channels
이 라이브러리는 무려 12개의 알림 송신 채널을 지원하고 있다. 대표적인 것만 추리자면 아래와 같다.
- 이메일
- 슬랙
- 텔레그램
- 마이크로소프트 팀즈
- 데스크탑 알림
사실상 알림을 받고 싶은 웬만한 경로는 거의 다 커버하고 있는 것 같다.
The Knock Knock Library - Usage
라이브러리 설치 이후, 기존에 사용하던 학습 코드에 단 두 줄만 추가하면 알림을 받을 수 있다. 몇 가지의 예시를 통해 자세히 알아보자.
기본적으로 모든 알림 방식은 메인으로 실행할 학습 함수에 데코레이터를 추가하는 식으로 설정할 수 있다.
from knockknock import email_sender
@email_sender(recipient_emails=["<your_email@address.com>", "<your_second_email@address.com>"], sender_email="<grandma's_email@gmail.com>")
def train(train_parameters):
...
return {'loss': loss.item()} # Optional return value
이메일을 통한 알림 기능은 yagmail 라이브러리를 사용하고 있다. g-mail 계정과 패스워드를 yagmail에 설정해 두고, 위와 같이 recipient_emails 과 sender_email을 email_sender 데코레이터 인풋으로 지정해 주면 끝이다.
import yagmail
yagmail.register('mygmailusername', 'mygmailpassword')
yagmail을 이용해 메일 주소, 패스워드를 설정하는 방법은 위와 같다. 다만 유의할 점은 이 링크 를 통해 지메일 세팅으로 들어가 보안 수준이 낮은 앱의 액세스 설정을 허용으로 바꿔 주어야 하기 때문에, 웬만하면 알림을 받을 용도로 새로 메일 계정을 파거나, 다른 방식의 알림을 이용하는 편을 권장한다.
만약 제대로 설정하고 train 함수를 호출하면 아래와 같이 메일을 통해 학습 현황 알림이 온다.
Microsoft Teams
팀즈 또한 비슷한 방식으로 설정이 가능하다. 다만 다른 데코레이터를 임포트 해 붙여 주어야 한다.
from knockknock import teams_sender
@teams_sender(webhook_url="<webhook_url_to_your_teams_channel>")
def train(train_parameters):
...
return {'loss': loss.item()} # Optional return value
여기서 알림을 보낼 팀즈 채널의 webhook URL을 정해 주어야 하는데, 아래와 같이 만들어 줄 수 있다.
1. 팀즈 채널 메뉴 -> 커넥터 클릭
2. Incoming Webhook 커넥터 구성 클릭
3. 알림 봇 이름, 프로필 사진 설정
4. URL 복사 후 webhook_url 파라미터로 넣어주기
이렇게 다 설정해 주었으면, 위와 같이 해당 채널의 알림 봇을 통해서 알림을 수신할 수 있게 된다.
Windows 알림
from knockknock import desktop_sender
@desktop_sender(title="Knockknock Desktop Notifier")
def train(train_parameters):
...
return {'loss': loss.item()} # Optional return value
이쪽의 경우에도 사용법은 간단하지만, 뭔가 requirement쪽에서 꼬인건지 아래와 같이 추가 모듈을 설치해 주어야 제대로 돌아간다.
conda install -c anaconda pywin32
그리고 마지막으로 윈도우즈 설정에서 `앱 및 다른 보낸 사람의 알림 받기` 를 켜 주면 된다.
Wrap-up
몇 가지 예시를 통해 사용법을 보여주었는데, 나머지 알림 채널의 구현 방식도 크게 다르진 않다. 필요하다면 라이브러리의 도큐멘테이션을 찾아보길 바란다. 다만 위의 사례들처럼 추가적인 삽질이 필요한 경우도 많으니 주의하길 바란다... 그리고 유의할 점은, 에러 시그널 없이 아예 터미널이 종료되어 버리거나 머신의 전원이 나가 버리는 등 (...) 의 상황에서는 따로 시작 이후에 후속 알림이 날아오지 않는다는 것이다. (사실 이런 케이스에서 알림을 받을 수 있는 툴을 찾는 중인데, 나중에 찾으면 공유하도록 하겠다)
이 라이브러리는 단 두 줄의 코드 추가를 통해 생각보다 정말 다양한 경로로 학습 시작 / 종료 / 예기치 못한 종료에 대한 알림을 받을 수 있다는 점에서 굉장히 편리하다고 할 수 있다. 주기적으로 학습 상황을 파악하고 바로바로 그 다음의 프로세스를 돌려야 하는 경우에 유용하게 쓰일 듯 하다.
아래는 참고할 만한 사이트이다.
References
knockknock 0.1.8.1
https://pypi.org/project/knockknock
yagmail -- Yet Another GMAIL/SMTP client
https://github.com/kootenpv/yagmail
importError: DLL load failed while importing win32api: 지정된 모듈을 찾을 수 없습니다. 에러 해결 하기
https://gentlesark.tistory.com/112