전체 글

전체 글

    [Utilities] 학습 프로세스 종료 시 알림 받기

    [Utilities] 학습 프로세스 종료 시 알림 받기

    Introduction 이런 적이 있다. 며칠이 걸리는 학습 프로세스를 급하게 켜 놓고 금요일에 퇴근했는데, 월요일에 와서 보니 시작 직후 사소한 버그로 인해 학습 프로세스가 중단된 것이다. 월요일에 모델 학습을 완료하고 다른 작업을 진행하려 했지만, 금요일에 학습 프로세스가 중단된 것을 알지 못해 다시 며칠 동안 학습을 진행시켜야 했다. 크나큰 자원의 낭비라 할 수 있다. 물론 주말 동안 한 번이라도 터미널에 접속해 봤어도 이를 알 수 있었을 테지만 주말동안 '굳이' VPN을 켜고 원격 접속을 해 터미널을 열어 학습 진행 상황을 확인해 보는 것은 적지 않은 의지를 필요로 한다. 가만.. 그러고 보니 학습 프로세스에 문제가 생겼을 때에 이메일이나 슬랙, 팀즈 등을 통해 알림을 받을 수 있다면 좋지 않을까..

    [생산성] 뽀모도로 기법 (Pomodoro Technique)

    [생산성] 뽀모도로 기법 (Pomodoro Technique)

    Introduction 최근에 책을 읽던 중 굉장히 유용한 생산성 관리 / 작업 계획법 을 알게 되었다. 처음에는 이게 실제로 현실성이 있는 기법인가.. 긴가민가 했던지라 새해가 밝은 김에 딱 몇 주 동안만 회사 업무에 시도해 보고, 어떤지 판단하기로 했다. 오늘이 딱 연초로부터 3주째가 되는 날인데, 3주동안 체험해 본 결과 확실히 괜찮은 방법이라고 느꼈고, 앞으로도 계속 사용할 의향이 있냐고 물으면 확실하게 그렇다고 대답할 수 있다. 오늘 소개할 내용은 뽀모도로 기법 (Pomodoro Technique) 이다. 뽀모도로 기법에 대한 간략한 소개로 시작해 이를 응용한 칸반 보드 이용법을 공유하고, 그리고 직접 제작한 칸반 보드 템플릿을 소개하는 것으로 글을 마칠 예정이다. Pomodoro Techniq..

    [Python] Multi-line string Cheet Sheet

    [Python] Multi-line string Cheet Sheet

    Introduction 가끔 그럴 때가 있다. 95자나 105자 같이 PEP 8 규약 (참고) 혹은 팀에서 정해놓은 한 줄 길이 제한에 맞추어 코드를 작성해야 하는데, 어떻게 작성하려 해도 explainability를 유지한 채로 한 줄에 다 못 넣겠는 경우가 있다. 특히 베이스로 들어가 있는 인덴트 (하나당 네 칸을 잡아먹는다) 갯수가 많을 수록 문제는 심각해진다. 일반적인 코드야 새 변수를 선언하고 괄호로 예쁘게 묶고 하는 식으로 무조건 해결할 수 있는 편인데, 뭔가 에러를 raise 하면서 같이 출력해야 하는 에러 메시지 처럼 긴 스트링을 작성해야 하는 경우엔 도통 어떻게 잘라서 줄나눔을 해야 하는지 굉장히 헷갈리는 경우가 많다. assert isinstance(dataset, ConcatDatas..

    [OpenCV] TypeError: Expected cv::UMat for argument

    [OpenCV] TypeError: Expected cv::UMat for argument

    Introduction Python에서 OpenCV를 이용하다 보면 아래와 같은 에러 메시지를 분명히 본 적이 있을 것이다. TypeError: Expected cv::UMat for argument [...] TypeError: Expected Ptr for argument [...] 벌써부터 화가 난다... 말해주는 바는 명확하다. argument 뒤에 오는 인자의 타입으로 cv::UMat을 기대했지만 실제로는 아니라는 것이다. 하지만 우리가 일반적으로 파이썬 버전의 OpenCV에서 사용하는 데이터 타입은 numpy.ndarray 이다. 이 시점부터 혼란이 시작된다. numpy.ndarray에 어떤 조건이 더 걸려야 cv::UMat으로 타입 인식이 되는 걸까? 조건을 잘 만족시킨 것 같은데 왜 계속 ..

    [Python] importlib과 모듈 리로드

    [Python] importlib과 모듈 리로드

    Introduction Jupyter notebook과 같은 대화형 개발 도구를 이용해 프로토타이핑을 하다 보면, 이미 임포트 해둔 모듈의 내용을 수정하고 싶을 때가 많다. 단순히 해당 임포트 구문을 다시 실행시키면 되지 않을까? >>> import foo_module >>> # foo_module.py의 코드 내용 변경... >>> import foo_module >>> # 변경 사항은 여전히 적용되지 않는다 아쉽게도 이미 한번 임포트 된 모듈은 다시 임포트 구문을 실행시킨다 해도 변경된 내용이 인터프리터 상에 적용되지는 않는다. 물론 노트북 커널이나 인터프리터를 재시작한 후 다시 임포트를 하면 변경 내용을 반영시킬 수 있다. 하지만 다시 실행시켰을 때 코드 테스트 환경을 똑같이 재현하기가 어려운 상황..

    [Git] HTTPS 인증정보(Credential) 저장하기

    [Git] HTTPS 인증정보(Credential) 저장하기

    Introduction Git에서는 클라이언트~서버 사이에서 전송되는 데이터를 암호화 시키기 위해 (특히 private 저장소인 경우), 여러가지 통신 규약 (Communication protocol)을 사용하고 있다. 이 중 가장 대표적이고 많이 쓰이고 있는 것이 바로 HTTPS와 SSH 프로토콜이다. HTTPS & SSH protocol with Git 일반적으로는, HTTPS 프로토콜을 이용하는 편이 훨씬 편리하기 때문에 대부분의 독자들은 HTTPS 프로토콜을 이용해 원격 저장소를 클론하고 작업 내용을 공유할 것이다. 로컬 작업 환경 (클라이언트)에 private key를 저장해 두어야 하는 SSH 프로토콜과 달리, HTTPS 프로토콜을 이용할 때에는 오직 Username과 Password만을 제공..

    [Python] TypeError: exceptions must derive from BaseException

    [Python] TypeError: exceptions must derive from BaseException

    Introduction 파이썬 개발 중 아주 가끔씩, 다음과 같은 TypeError 메시지를 만나볼 수 있다. TypeError: exceptions must derive from BaseException 뭐가 문제였을까? Solution 정답은 바로 이전 포스트에서도 언급했듯이, 파이썬3 에서는 BaseException 내장 클래스를 상속받는 클래스만이 예외 클래스로 인식되기 때문이다. 따라서 만약 예외 클래스를 인자로 받아야 하는 자리에 예외 클래스로 인식되지 않는 (BaseExeption을 상속받지 않는) 클래스를 적어놓는 경우 위와 같은 에러 메시지를 보게 된다. class FooClass: pass try: raise FooClass() except FooClass: print("Catch!")..

    Introduction to Machine Learning in Production (1) - The Machine Learning Project Lifecycle

    Introduction to Machine Learning in Production (1) - The Machine Learning Project Lifecycle

    본 글은 Coursera의 Machine Learning Engineering for Production (MLOps) 특화 과정의 일부인 Introduction to Machine Learning in Production 강좌의 내용을 개인적인 의견과 함께 정리한 글이다. 원 강좌 내용에 관심이 생긴다면 한번 수강해 보도록 하자! Introduction 당신은 실제 세계의 문제를 풀기 위해 어떤 ML 모델을 개발했다. 그런데 이렇게 개발한 모델을 어떻게 배포하고 운영해야 할까? 또한 배포한 모델의 성능을 어떻게 모니터링하고, 어떻게 다시 개선시켜 배포할 수 있을까? ML 모델의 실제 배포와 운영은 모델 개발 단계에서와는 다른 직관과 스킬을 요구하며, 모델 개발 단계에서는 전혀 생각하지 못 했던 새로운 ..