ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 휴대폰으로 인공지능 학습 현황을 간단하게 확인하는 법(feat. 라인 API)
    컴퓨터 공학/딥러닝, 머신러닝 2023. 2. 13. 21:14

    들어가며

     머신러닝 공부를 꾸준히 해 오던 물개 한마리가 이제 자기도 자신만의 프로젝트를 해보겠다고 나섰습니다. 프로젝트 계획도 세우고 인공지능 학습에 필요한 데이터도 모두 구했습니다! 인터넷을 뒤져가며 자신의 프로젝트에 가장 적합한 머신러닝 알고리즘도 다 구상을 해 두었으니 이제 물개한테 남은건 그 알고리즘을 토대로 데이터를 전처리하고 인공지능을 학습시키면 되는 일 뿐~! 물개는 학생이었기에 강력한 컴퓨팅 환경을 보유하고 있지 않았어요. 그래서 구글 Colab 무료 버전을 이용하여 자신의 모델을 학습시키고자 했어요! 물개는 열심히 코랩 환경에다 코드를 짰고 한 줄 한 줄 실행 시키고 있었어요. 그런데 데이터가 너무 많아 전처리 과정만 1시간 30분 가까이 걸리는거에요! 학습은 또 얼마나 오래 걸릴지 막막했어요. 긴장한 마음으로 학습 시작을 명령하는 코드를 실행했어요. 아니나 다를까 전체 20 epoch 중 1 epoch 학습하는데도 상당한 시간이 소요 되었어요. 막상 가만히 앉아서 기다리기도 애매해서 학습이 끝날 동안 친구랑 카페에 가서 놀다오기로 했어요. 그렇게 물개는 코랩에다 학습을 돌려놓은 채 친구와 카페에 가서 놀고 있었어요. 그러다 문득 물개는 지금 학습이 어느정도 완료 되었는지 궁금해졌어요. 그렇다고 가지고 나온 휴대전화로 코랩에 접속하면 학습 돌리고 있던게 날라가고 세션이 종료될게 뻔하기에 그렇게 하진 못했어요. 물개는 걱정이 되기 시작했어요. '만약 벌써 학습이 다 끝났으면 어쩌지?' 학습이 종료되고 아무런 활동 없이 코랩을 켜두면 세션은 종료 될거고 학습한 모델은 날라갈것이 분명했어요. 물개는 서둘러 친구와 헤어지고 자신의 방으로 뛰어와 노트북을 확인했어요.

     

    '11/20 epoch [======> ------- ] 80%'  


     위 이야기는 제가 예전에 겪었던 에피소드를 조금 각색을 해 본 것인데요! 인공지능을 학습시키다 보면 학습에 걸리는 시간은 많은데 정작 그 시간에 딴 일을 하기 애매하더라구요. 학습이 어느정도 되었는지도 수시로 확인해 줘야 하고 혹시나 도중에 에러라도 나면 안되니까 어디 나가기도 그렇구요. 특히 저같이 코랩을 주로 사용해서 학습 시키는 분들은 학습 시켜놓고 다른데 가기가 부담스러운거 같아요. 그래서 오늘은 제가 휴대전화로 학습 상황을 일정 간격으로 체크 할 수 있는 저만의 소소한 팁을 소개하려고 해요! 해당 팁은 굳이 코랩을 사용하지 않으시거나 인공지능을 학습하는 경우가 아니더라도 코드 실행이 오래걸리는 작업에서 간단하게 자신만의 모니터링 시스템을 만들고 적용 할 수 있으니 끝까지 읽어주시길 바래요~

     

    휴대전화 메신저 API를 활용한 모니터링!

     코드를 돌려놓고 밖에 나가도 휴대전화로 간단하게 상황을 모니터링 할 수 있는 방법을 모색하다가 찾은 해법은 바로 휴대전화 메신저 API를 활용하는 것이에요! 시중에 다양한 메신저 업체에서 python, js 등을 이용해 자신의 휴대전화에 sms나 메신저를 보낼 수 있는 API를 제공하고 있어요. 우리는 이러한 API를 활용해서 우리의 휴대전화에 메세지를 보내느 함수를 작성, 자신이 모니터링 하고 싶은 시점에 메세지를 보낼 수 있도록 설정하면 끝! 참 쉽죠?

     

    for i in range(100):
    	# 특정 프로세스 실행
        Process()
        
        # 폰으로 i번째 프로세스 끝났다고 문자 보내기
        Send_Message_To_My_Phone("보낼 내용")

     바로 위의 코드처럼 전체 프로세스를 100 등분하면 1번 끝날 때마다 우리의 휴대전화로 문자를 보내는 함수를 실행시키는 원리입니다. 

     

    어떤 API가 좋은가?

     저희는 문자, 카카오톡, 페이스북 메신저, 인스타그램 디렉트 메시지, 디스코드, 텔레그램 등등 다양한 메신저 프로그램을 사용하고 있습니다. 그리고 거기서 제공하는 메신저 API도 매우 다양하죠. 

    다양한 SMS들

    그중에서도 저희는 오늘 LINELINE NOTIFY API를 사용해보려고 합니다. 그런데 왜 자주 사용하는 카카오톡 대신 라인을 사용하는지 궁금하실 겁니다. 물론 카카오톡도 메신저를 보낼 수 있는 API를 제공합니다. 하지만 카카오톡 API는 사용하기 위한 설정이 매우 번거롭고 API 토큰도 주기적으로 만료되어서 계속 갱신을 해 주어야 하더라고요. 그것 때문에 예전에 한번 삽질한 적이 있어서.. 반면에 LINE의 경우 API 사용 방법이 상당히 간단하고 토큰 갱신을 해주어야 하는지는 모르겠지만 아직은 잘 쓰고 있어서 크게 신경 쓸 거 없이 한번 설정해 두면 계속 사용할 수 있더라고요! 게다가 오히려 한국에서는 라인을 거의 쓰지 않기에 코드 모니터링 알람만 오는 것도 좋았어요. 카톡은 다른 대화들 알림도 같이 오니까 헷갈리는데 라인 알람이 뜨는 건 코드 모니터링 관련 메시지 하나만 오는 거라 편리하더라고요. 물론 카카오톡 API가 편하신 분들은 카카오톡을 사용하셔도 전혀 무방합니다! 아래에 링크 걸어둘게요!

     

     

    Kakao Developers

    카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

    developers.kakao.com

     

     

    라인 API 사용법

    라인 Notify 사용법은 아래 링크에 자세히 나와있더라고요! 라인 설치부터 토큰 발급 방법까지 나와있으니 읽어보고 오세요!

     

    파이썬으로 라인 메신저에 알림(메시지) 보내기 - Python to LINE Notify

    파이썬으로 모니터링을 돌리고 있을 때 그 결과를 스마트폰으로 간편하게 받을 때 유용한 방법입니다. 라인 메신저에서 제공하는 "LINE Notify"를 이용하면 간단히 해결할 수 있습니다. LINE 설치,

    kwonkyo.tistory.com

    (위에 글에서는 라인 라이트를 설치하라고 되어있던데 현재 라인 라이트는 서비스 종료 상태로 그냥 라인을 설치하시면 됩니다.)

     

    발급받은 토큰은 잘 보관하고 타인에게 노출되면 안 된다는 점 주의해 주세요!

     

    메시지 보내는 함수 만들기

    위에 첨부드린 링크에 있던 api 호출 코드를 함수 형태로 변환한 코드입니다. 인자로 휴대전화에 전송할 문자열을 넣어주면 됩니다!

    def send_message(msg):
      try:
          TARGET_URL = 'https://notify-api.line.me/api/notify'
          TOKEN = '여기에 발급받은 토큰을 입력하세요'
          headers={'Authorization': 'Bearer ' + TOKEN}
          data={'message': msg}
          response = requests.post(TARGET_URL, headers=headers, data=data)
      except Exception as ex:
          print(ex)

     

    AI 학습 모니터링 예제

    위의 함수를 이용해 AI 학습 시 모니터링하는 예제를 보겠습니다.

     

    1. 데이터 전처리

    아래 코드는 이미지 전처리를 위해 작성한 코드입니다. 10만 개 이상의 이미지 데이터를 전처리해야 했기 때문에 아래와 같이 5000개를 전처리 할 때마다 완료되었다고 메신저가 오도록 만들었습니다. 

    def convert(func, dir):
            img = func(dir)
            im_pil = Image.fromarray(img).convert('RGB')
            return im_pil
     
    path_dir = '/content/test'
    
    def denoise(img_dir,num = 3):
      img = preprocessing(img_dir)
      # 글자 대비 코드
      img = img_Contrast(img)
      # 노이즈 제거 코드
      img = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
      # 글자 대비 코드
      img = img_Contrast(img)
      img = cv2.fastNlMeansDenoisingColored(img,None,20,10,7,21)
      img = img_Contrast(img)
      img = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
      for i in range(num):
          img = img_Contrast(img)
      #cv2_imshow(img)
      return img
    
    num = 0
    
    print(len(os.listdir(path_dir)))
    for file in os.listdir(path_dir):
        img = denoise('/content/test/'+file)
        img = Image.fromarray(img).convert('RGB')
        img.save('/content/test2/'+file, 'png')
        num+=1
        if num%100==0:
          print(num)
        if num%5000==0:
          send_message("사전 전처리"+str(num)+"개 완료")

    코드를 보면 여러 가지 전처리와 관련된 함수들이 있고 이를 for문을 통해 지정된 경로에 있는 모든 이미지 파일에 적용하고 있습니다. 그리고 여기서 주목할 부분은 바로 맨 마지막 줄의 send_message("사전 전처리"+str(num)+"개 완료")입니다. 위 코드의 실행 결과 다음과 같이 5000개씩 처리가 완료될 때마다 라인으로 문자가 옵니다. 

    전처리 완료 때 마다 라인으로 메세지가 전송되는 모습

     

    2. 모델 학습

    학습이 시작되고 난 뒤에도 학습 상황을 모니터링할 수 있어야 할 것입니다. 다음 코드는 전체 20 epoch의 학습 단계에 대해서 학습이 시작 될 때, 매 epoch 학습이 끝났을때, 전체 학습이 완료 되었을때 각각 현재 시각과 학습 결과 (현재 모델 accuracy(정확도)와 loss(손실) 등등을 함께 전송하도록 작성되었습니다.

    def train(model, optimizer, train_loader, val_loader, scheduler, device):
        start = time.time()
        send_message(f'Training start!\n Runtime : [{runtime(start, time.time())}]')
        math.factorial(1234567)
        model.to(device)
        best_loss = 999999
        best_model = None
        for epoch in range(1, CFG['EPOCHS']+1):
            model.train()
            train_loss = []
            for image_batch, text_batch in tqdm(iter(train_loader)):
                image_batch = image_batch.to(device)
                optimizer.zero_grad()
                text_batch_logits = model(image_batch)
                loss = compute_loss(text_batch, text_batch_logits)
                loss.backward()
                optimizer.step()
                train_loss.append(loss.item())
            _train_loss = np.mean(train_loss)
            _val_loss = validation(model, val_loader, device)
            torch.save(model, '/content/drive/MyDrive/model/model_no'+str(epoch)+'.pth')
            send_message(f'서브 테스크 종료 알림\n Epoch : [{epoch}] Train CTC Loss : [{_train_loss:.5f}] Val CTC Loss : [{_val_loss:.5f}]\n Runtime : [{runtime(start, time.time())}]')
            print(f'Epoch : [{epoch}] Train CTC Loss : [{_train_loss:.5f}] Val CTC Loss : [{_val_loss:.5f}]')
            if scheduler is not None:
                scheduler.step(_val_loss)
            if best_loss > _val_loss:
                best_loss = _val_loss
                best_model = model
        send_message('Training Complete!\n Runtime : [{runtime(start, time.time())}]')
        return best_model

    모델 학습 상황을 매 에포크 마다 라인으로 전송한 모습


    마무리하

     오늘은 라인 notify api를 이용해서 인공지능 학습 현황을 휴대전화로 쉽게 모니터링 할 수 있는 방법에 대해 소개해보았는데요, 이 방법을 통해 오래 걸리는 인공지능 학습이나 다른 작업 들에 대해서 부담 없이 돌려놓고 다른 일에 시간을 투자할 수 있을 거라 생각합니다! 긴 글 읽어주셔서 감사드리며 모두 스트레스 없는 코딩 생활 하길 기원하겠습니다! (뭐지 이 급마무리하는 흐름과 멘트는..)

    댓글

Designed by Tistory.