전체 글 78

[fastapi] Middleware

오늘은 fastapi의 middleware에 대해서 알아보려고 합니다. https://fastapi.tiangolo.com/tutorial/middleware/ Middleware - FastAPI FastAPI framework, high performance, easy to learn, fast to code, ready for production fastapi.tiangolo.com fastapi의 middleware를 활용하면, 모든 request에 대해서 전/후 처리를 추가해줄 수 있습니다. 바로 예시 코드를 보도록 하겠습니다. import time from fastapi import FastAPI, Request app = FastAPI() @app.middleware("http") async..

python/fastapi 2023.07.02

[fastapi] fastapi utils를 활용한 주기적인 작업(periodic task) 실행하기

백엔드 서버를 띄운 상황에서, 주기적인 작업(periodict task, repeated task)을 실행하고 싶은 경우가 생길 수 있습니다. 예를 들면, DB에 주기적으로 polling을 해서 어떤 데이터를 가져와서 서버에서 들고 있게 하는 등의 작업이 필요할 수 있는데요. fastapi 자체적으로 제공하는 것은 없지만, fastapi-utils(https://fastapi-utils.davidmontague.xyz/)를 활용하면 이런 작업을 수행할 수 있습니다. 설치는 pip로 간단하게 하시면 됩니다. pip install fastapi-utils fastapi-utils를 활용하여 주기적인 작업을 실행하는 방법은 아래와 같습니다. from fastapi import FastAPI from sqlal..

python/fastapi 2023.06.18

[fastapi] background task

개요 background task를 처리하는 방식은 다양한데, fastapi의 framework 내에서도 충분히 처리를 할 수 있어서 그 방식에 대해서 정리를 해보려고 합니다. background task는 API 요청을 받아서 실시간으로 응답을 바로 주는 것이 아닌 API 요청에 대해서 별도로 천천히 처리해도 되는 작업들에 사용하게 됩니다. 예를 들면 회원가입을 할 때, 회원가입을 완료했을 때 성공했다는 응답을 반환하고 email로 환영 메세지를 발송하는 것과 같은 경우가 있을 수 있습니다. 사용방법 사용 방법은 공식 홈페이지에 잘 나와있습니다. (https://fastapi.tiangolo.com/tutorial/background-tasks/) 문서의 예시 코드를 한 번 보도록 하겠습니다. fr..

python/fastapi 2023.06.04

python asyncio gather vs wait

개요 파이썬에서 fastapi가 점점 많이 사용되고 있다보니 자연스럽게 async를 사용해서 코딩을 하게 되는 것 같습니다. async에서 제일 착각하기 쉬운게, async 함수를 연속으로 사용하면 비동기로 동시에 처리될 것이라고 생각할 수 있는데요. 아래 코드를 실행해보면, 총 2초가 걸리는 것을 확인할 수 있습니다. import time import asyncio async def method1(): await asyncio.sleep(1) async def method2(): await asyncio.sleep(1) async def main(): await method1() await method2() if __name__ == "__main__": start = time.time() asynci..

python 2023.05.21

[mysql] fulltext index ngram parser

개요 fulltext index에 대해서 정리를 한 번 했었는데(https://seokhyun2.tistory.com/92), fulltext index에서 토큰을 나누는 기본 방식은 띄어쓰기를 기준으로 분리를 합니다. 띄어쓰기를 기준으로만 분리를 하게 되면, 한국어에서는 조사가 다 붙어있어서 검색이 어렵습니다. 예를 들면 '한국'이란 명사에 대해서 '한국은', '한국에서', '한국의' 와 같이 조사가 붙어서 띄어쓰기로만 토큰을 나누게 되면 다 별도의 토큰으로 인식이 되어, '한국'이라는 명사가 있는 문장만 찾고 싶은데 찾을 수 없게 됩니다. 그래서 추가적으로 제공되는 기능이 바로 ngram parser입니다. 원리 ngram parser가 무엇인지, 원리를 알아볼텐데요. ngram에서 n은 숫자이고, ..

ETC/MySQL 2023.04.23

[mysql] fulltext index

개요 mysql 데이터베이스를 사용하다보면, 조회 속도 개선을 위한 작업을 많이 하게 됩니다. 그래서 index를 많이 사용하게 되는데, 기본적인 index는 column값이 정확하게 일치하는 기준으로 사용할 수 있습니다. column값이 텍스트를 활용하고, 값이 일부만 일치하는 경우 조회를 하기 위해서는 like 쿼리를 사용하는데, 그 속도가 매우 느립니다. 완전 동일한 조회가 아니라서 기본적인 index를 사용할 수도 없구요. 이럴 때, fulltext를 사용하면 조회 속도를 개선할 수 있습니다. 원리 fulltext index를 사용하는 방법을 알아보기 전에, 원리를 우선 간단하게 알아보겠습니다. column의 값이 영어 이름이라고 가정하고, '마이클 잭슨'과 '마이클 조던' 이라는 2개의 값이 존..

ETC/MySQL 2023.04.09

[MLOps] BentoML - Adaptive Batching

오늘은 Adaptive Batching에 대해서 알아보려고 합니다. 왜 필요한 지 먼저 알아볼건데, infernce의 경우 하나의 input을 inference 하는 것 보다, batch로 inference하면 훨씬 빠르고 효율적으로 추론을 할 수 있습니다. 하지만 api를 서빙을 하는 경우에는 batch로 inference가 매우 어렵습니다. 예시를 들어보면 챗봇이라고 생각을 하면 intent(의도)를 분류하는 모델을 api로 서빙을 할 텐데, 하나의 질문에 대한 intent만 분류하면 되기 때문에 api에 batch로 inference를 요청할 수 없습니다. api server 입장에서는 한 문장씩 입력이 들어오더라도, 비슷한 시간에 들어오는 문장들을 묶어서 infernce를 해서 결과를 반환해주면 ..

SQLAlchemy ORM & async 활용 (2.0.X)

SQLAlchemy에서 2.0 버전이 나와서 문법이 꽤 많이 변경되었습니다. 그래서 오늘은 변경된 ORM 문법과 함께 async로 접근하는 방법을 알아보았습니다. 변경된 ORM 문법을 바로 보도록 하겠습니다. from datetime import datetime from sqlalchemy import String, BIGINT from sqlalchemy.dialects.mysql import DATETIME from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): type_annotation_map = { int: BIGINT, datetime: DATETIME } class User(Ba..

python/SQLAlchemy 2023.02.26

글또 8기 다짐

글또 8기를 또 신청하여 다짐글을 남기게 되었습니다. 글또 덕분에 2022년도 조금 돌아보고, 2023년 계획도 세워보는 것 같습니다. 2022년은 이직을 하면서 MLOps라는 직군으로 전환하며 새해를 맞았었는데 벌써 1년이 조금 넘었네요. NLP개발자, 서버개발자를 거쳐서 MLOps로 일을 하고 있고 이제 전체 일한 기간도 만으로 5년도 훌쩍 넘어가게 되었습니다. 이제는 주니어라고 하긴 힘든 경력이 되었네요ㅎㅎ 5년을 넘게 일을 했다는 건 나이도 그만큼 들었단 건데, 그러다보니 사회초년생 때랑 커리어에 대한 고민이 많이 달라졌습니다. 처음에는 기술을 많이 공부하고 경험치를 빨리 쌓는 것에 대해 고민이 많았다면, 지금은 '내가 팀에 기여를 어떻게 해야할까?' 혹은 '어떻게 시스템을 디자인해야 서비스를 잘..

나의 이야기 2023.02.12

글또 7기 회고

벌써 글또 7기가 끝날 시점이 되어, 글또 7기 회고를 해보게 되었습니다. 7기에서 썼던 글 리스트를 확인해보니 다짐글을 시작으로, 아래와 같이 여러 주제로 글을 작성했네요. - 글또 7기 다짐글 - huggingface/transformers에 컨트리뷰트 해보기 - [ML OPS] mlflow 로컬에서 사용해보기 - [ML OPS] transformers inference (ft. colab, onnx, gpu) - [ML OPS] quantization을 활용한 인퍼런스 최적화 (ft. ONNX, TensorRT) - SQLAlchemy 소개 및 활용법 - SQLAlchemy에서 ORM 활용하기 - argo workflow 구성해보기 - argo workflow - cron workflow MLOPS..

나의 이야기 2022.10.14