본문 바로가기
MLOps

MLOps - 16.Logging

by cocacola0 2022. 5. 31.

출처 : 변성윤님 블로그.
출처 : 부스트캠프 AI Tech.

1. Logging Basics

1.1 로그란?

  • 로그의 어원
    • 통나무
    • 과거 선박의 속도를 측정하기 위해 칩 로그라는 것을 사용
    • 배의 앞에서 통나무를 띄워서 배의 선미까지 도달하는 시간을 재는 방식에 로그를 사용
    • 요즘엔 컴퓨터에 접속한 기록, 특정 행동을 한 경우 남는 것을 로그라고 부름
  • 데이터는 이제 우리의 삶 어디에서나 존재
    • 앱을 사용할 때마다 우리가 어떤 행동을 하는지 데이터가 남음
    • 이런 데이터를 사용자 로그 데이터, 이벤트 로그 데이터 등으로 부름
    • 위처럼 머신러닝 인퍼런스 요청 로그, 인퍼런스 결과를 저장해야 함

1.2 데이터의 종류

  • 데이터베이스 데이터(서비스 로그, Database에 저장)
    • 서비스가 운영되기 위해 필요한 데이터
    • 예) 고객이 언제 가입했는지, 어떤 물건을 구입했는지 등
  • 사용자 행동 데이터(유저 행동 로그, 주로 Object Storage, 데이터 웨어하우스에 저장)
    • 유저 로그라고 지칭하면 사용자 행동 데이터를 의미
    • 서비스에 반드시 필요한 내용은 아니고, 더 좋은 제품을 만들기 위해 또는 데이터 분석시 필요한 데이터 - 앱이나 웹에서 유저가 어떤 행동을 하는지를 나타내는 데이터
    • UX와 관련해서 인터랙션이 이루어지는 관점에서 발생하는 데이터
      • 예) Click, View, 스와이프 등
  • 인프라 데이터(Metric)
    • 백엔드 웹 서버가 제대로 동작하고 있는지 확인하는 데이터 - Request 수, Response 수
    • DB 부하 등
  • Metric
    • 값을 측정할 때 사용
    • CPU, Memory 등
  • Log
    • 운영 관점에서 알아야 하는 데이터를 남길 때 사용
    • 함수가 호출되었다. 예외 처리가 되었다 등
  • Trace
    • 개발 관점에서 알아야하는 것 - 예외 Trace

1.3 저장된 데이터 활용 방식

  • “image.jpg”로 마스크 분류 모델로 요청했다
    • image.jpg를 중간에 Object Storage에 저장하면 실제로 우리가 볼 때의 실제 Label과 예측 Label을 파악할 수 있음
  • “image.jpg” 같은 이름의 이미지로 10번 요청했다
    • 같은 이미지로 예측한다고 하면 중간에 저장해서 기존에 예측한 결과를 바로 Return할 수 있겠다(Redis 등을 사용해 캐싱)
  • Feature = [[2, 5, 10, 4]] 으로 수요 예측 모델로 요청했다
    • 어떤 Feature가 들어오는지 알 수 있고, Feature를 사용할 때 모델이 어떻게 예측하는지 알 수 있음
  • 궁극적으로 현재 시스템이 잘 동작하는지 알 수 있음
  • 데이터가 저장되어 있지 않다면
    • 과거에 어떤 예측을 했는지 알 수 없음
    • print 문의 로그를 저장한 곳을 찾아서 확인해야 함(Linux 서버에 접속하거나)
    • 모델이 더 발전하기 위한 개선점을 찾기 어려움
    • 현재 시스템이 잘 동작하고 있는지 알기 어려움

1.4 데이터 적재 방식

1.4.1 Database(RDB)에 저장하는 방식

  • 다시 웹, 앱 서비스에서 사용되는 경우 활용
  • 실제 서비스용 Database
  • 관계형 데이터베이스(Relational Database)
    • 행과 열로 구성
    • 데이터의 관계를 정의하고, 데이터 모델링 진행
    • 비즈니스와 연관된 중요한 정보
      • 예) 고객 정보, 주문 요청
    • 영구적으로 저장해야 하는 것은 데이터베이스에 저장 - 데이터 추출시 SQL 사용
    • MySQL, PostgreSQL 등

1.4.2 Database(NoSQL)에 저장하는 방식

  • Elasticsearch, Logstash or Fluent, Kibana에서 활용하려는 경우
  • 스키마가 Strict한 RDBMS와 다르게 스키마가 없거나 느슨한 스키마만 적용
  • Not Only SQL
  • 데이터가 많아지며 RDBMS로 트래픽을 감당하기 어려워서 개발됨
  • 일반적으로 RDBMS에 비해 쓰기와 읽기 성능이 빠름
  • Key Value Store, Document, Column Family, Graph 등
  • JSON 형태와 비슷하며 XML 등도 활용됨
  • { key : value, key2 : {key2-1:value21, key2-2:value22} }
  • MongoDB

1.4.3 Object Storage에 저장하는 방식

  • S3, Cloud Storage에 파일 형태로 저장
  • csv, parquet, json 등
  • 별도로 Database나 Data Warehouse로 옮기는 작업이 필요
  • 어떤 형태의 파일이여도 저장할 수 있는 저장소
  • AWS S3, GCP Cloud Storage 등
  • 특정 시스템에서 발생하는 로그를 xxx.log에 저장한 후, Object Storage에 저장하는 형태
  • 비즈니스에서 사용되지 않는 분석을 위한 데이터
  • 이미지, 음성 등을 저장

1.4.4 Data Warehouse에 저장하는 방식

  • 데이터 분석시 활용하는 데이터 웨어하우스로 바로 저장
  • 여러 공간에 저장된 데이터를 한 곳으로 저장
  • 데이터 창고
  • RDBMS, NoSQL, Object Storage 등에 저장된 데이터를 한 곳으로 옮겨서 처리
  • RDBMS와 같은 SQL을 사용하지만 성능이 더 좋은 편
  • AWS Redshift, GCP BigQuery, Snowflake 등

1.5 데이터 적재 요약

  • 정말 다양한 방법으로 데이터를 저장할 수 있음
  • 상황에 따라 다르지만, 여기선 Serving 과정에서 데이터를 기록하기 위함
  • 상황
    • 데이터 분석은 BigQuery에서 진행
    • 해당 로그는 애플리케이션과 상관없음
  • 사용 가능 대안
    • 파이썬 로깅 모듈을 사용해 CSV로 저장해서 Cloud Storage에 업로드
    • BigQuery로 바로 데이터 추가

2. Logging in Python

2.1 Python Logging Module

  • 파이썬 기본 모듈, logging
  • 웹서버, 머신러닝, CLI 등 여러 파이썬 코드에서 사용할 수 있음
  • 심각도에 따라 info, debug, error, warning 등 다양한 카테고리로 데이터를 저장할 수 있음
  • Log Level
  • 기본 Logging Level은 WARNING
  • 설정하지 않으면 WARNING보다 심각한 레벨의 로그만 보여줌
  • logging vs print
    • console에만 output을 출력하는 print
    • logging은 file, websocket 등 파이썬이 다룰 수 있는 모든 포맷으로 output을 출력할 수 있음
    • 언제 어디서(파일 이름과 코드 상의 몇번째 줄인지) 해당 output이 발생했는지 알 수 있음
    • output을 심각도에 따라 분류할 수 있음
      • 예) Dev 환경에서는 debug 로그까지, Prod(운영) 환경에서는 info 로그만 보기 등)
      • 다만 print보다 알아야 하는 지식이 존재

2.2 Python Logging Component

2.2.1. Loggers

  • 로그를 생성하는 Method 제공(logger.info() 등)
  • 로그 Level과 Logger에 적용된 Filter를 기반으로 처리해야 하는 로그인지 판단
  • Handler에게 LogRecord 인스턴스 전달
  • logging.getLogger(name)으로 Logger Object 사용
    • name이 주어지면 해당 name의 logger 사용하고, name이 없으면 root logger 사용
    • 마침표로 구분되는 계층 구조
      • logging.getLogger(‘foo.bar’) => logging.getLogger(‘foo’)의 자식 logger 반환
  • logging.setLevel() : Logger에서 사용할 Level 지정

2.2.2 Handlers

  • Logger에서 만들어진 Log를 적절한 위치로 전송(파일 저장 또는 Console 출력 등)
  • Level과 Formatter를 각각 설정해서 필터링 할 수 있음
  • StreamHandler, FileHandler, HTTPHandler 등

2.2.3 Filters

2.2.4 Formatters

  • 최종적으로 Log에 출력될 Formatting 설정
  • 시간, Logger 이름, 심각도, Output, 함수 이름, Line 정보, 메시지 등 다양한 정보 제공

2.5 Logging Flow

3. Online Serving Logging(BigQuery)

  • BigQuery에 Online Serving Input과 Output 로그 적재
      1. 빅쿼리 테이블을 세팅합니다
      1. 빅쿼리에 적재하기 쉽게 JSON 형태로 로그를 정제 -> pythonjsonlogger를 사용
      1. python logging 모듈을 사용해서 빅쿼리에(실시간) 로그 적재(file과 console에도 남을 수 있도록 handler를 지정)
  • BigQuery
    • Google Cloud Platform의 데이터 웨어하우스
    • 데이터 분석을 위한 도구로 Apache Spark의 대용으로 활용 가능
    • Firebase, Google Analytics 4와 연동되어 많은 회사에서 사용 중

3.1 BigQuery 데이터 구조

  • GCP의 Project 내부에 BigQuery의 리소스가 존재
    • Dataset, Table, View 등

3.2 BigQuery 데이터세트 만들기

  • [Product Serving] 3-3. Logging.pdf

3.3 BigQuery 테이블 만들기

  • [Product Serving] 3-3. Logging.pdf

3.4 BigQuery로 실시간 로그 데이터 수집하기

  • [Product Serving] 3-3. Logging.pdf

IAM Error Fix 참고하여 설정

  • [Product Serving] 3-2. Docker.pdf

'MLOps' 카테고리의 다른 글

MLOps - 18. BentoML  (0) 2022.06.02
MLOps - 17. MLFlow  (0) 2022.06.01
MLOps - 15. Docker  (0) 2022.05.30
MLOps - 14. FastAPI  (0) 2022.05.29
MLOps - 13. FastAPI  (0) 2022.05.28

댓글