전체 글 236

Python gc 튜닝을 통한 성능 개선 (Flask 기반 예시 코드)

일반적으로 파이썬 환경은 CPython을 의미하기 때문에, 이 문서에서 다루는 내용 역시 CPython 인터프리터에 대한 실험을 포함하고 있습니다. PyPy나 RustPython과 같은 환경에서는 또 다른 상황이 발생할 수 있다는 점을 미리 고지드립니다. CPython에서 gc의 동작 원리 기본적으로 파이썬의 gc는 reference count를 기반으로 작동을 하게 된다. CPython에서 class 등을 통해 만들어진 인스턴스나 기본형 데이터 등이 생성되게 되면 내부적으로 PyObject 타입의 struct에 대해 memory allocation이 발생하게 된다. 그리고 CPython은 할당된 메모리의 관리를 위해 reference list에 생성된 PyObject에 대한 reference를 추가함으..

Python 2023.10.14

cuDNN benchmark 활성화를 통한 최적의 알고리즘 선택

PyTorch 프레임워크 내에는 다양한 CUDA 커널들이 있다. 이로 인해 다양한 환경에서도 최적의 성능을 낼 수 있게 하지만, 어떤 의미로 보면 너무 복잡하게 느껴질 수도 있다. 실제로, CNN에서 Conv2D 레이어의 forward pass에 대한 cuDNN 알고리즘만 하더라도 하나가 아니다. 물론, 모두 충분히 빠르다고 할 수 있지만, 그럼에도 현재 실행되는 환경에 더 최적화된 커널이 존재하는 법이다. 파이토치의 백엔드 cudnn API에는 benchmark라는 플래그가 있는데, 이 플래그를 활성화시키면 파이토치에 내장된 auto-tuner가 활성화되면서 가장 최적화된 cudnn 알고리즘을 자동으로 선택해주게 된다. import torch.backends.cudnn as cudnn # type: i..

AI/PyTorch 2023.10.14

미디어 업로드 서버의 성능 튜닝 - 디스크 I/O 튜닝

최근 회사 업무로 인해 영상 Flask를 사용해서 "영상 분할 업로드" 및 영상 처리 API 등의 기능을 가지는 서버를 구현하게 되었다. 이 중, 영상 업로드 관련해서 디스크 I/O에 대한 많은 실험을 하게 되었고, 이에 대한 내용을 정리해 놓고자 이렇게 글을 쓰게 되었다. Disk I/O 성능 측정하기 이 프로젝트의 주요 기능 중 하나인 영상 업로드의 경우 높은 disk I/O 기능을 사용해야 하기 때문에 Disk 입출력의 성능을 파악하는 것이 주요할 것으로 생각이 되어졌다. 사실 디스크 I/O의 성능의 경우, 기본적으로 Linux에서는 디스크 입출력 성능 체크를 위한 툴로써 dd라는 명령어를 제공한다. dd 커멘드는 파일을 복사하고 변환하는데 사용하는 CLI로, 입출력에 대한 성능 측정을 가능하게 해..

DevOps 2023.10.14

LLM 연구의 주요 과제들

본 글은 https://huyenchip.com/2023/08/16/llm-research-open-challenges.html라는 포스트를 해석 및 요약한 글입니다. 환각(Hallucination) 감소 및 측정 - 회사에서 LLM을 채택하는데 가장 큰 장애물은 환각 - 환각을 완화하고 측정하기 위한 지표를 개발하는 것은 인기 있는 연구 주제로 많은 스타트업들이 집중하고 있음 - 환각을 줄이기 위한 임시 팁으로 프롬프트에 컨텍스트 추가하기, Chain-Of-Thought, Self-Consistency, 모델에게 간결한 답을 요청하기 등이 있음 컨텍스트 길이 및 컨텍스트 구성 최적화 - 대부분의 질문에는 컨텍스트가 필요함 - SituatedQA 논문에 의하면 정보 검색 질문의 상당부분이 컨텍스트에 따라..

AI/LLM 2023.10.14

Kaggle Writeup: NBME - Score Clinical Patient Notes

주요 과제 2022년 2/1 ~ 5/3까지 진행되었던 대회로, 자연어 처리 기반의 대회였다. 해당 대회는 기본적으로 의료 진단 노트에 대한 피드백의 자동화를 위한 AI 모델의 학습이 주요 목적이었다. 기본적으로, 의사를 방문할 때 의사가 증상을 어떻게 해석하는지에 따라 진단이 정확한지 여부가 결정될 수 있다. 의사들은 면허를 취득할 때까지 환자의 증상, 신체 검사 결과, 가능한 진단 및 후속 치료를 기록하는 환자 메모를 작성하는 연습을 많이 해왔다. 환자 기록 작성 기술을 학습하고 평가하려면 다른 의사로부터 피드백을 받아야 하는데, 이는 시간이 많이 걸리는 과정이다. 이러한 현실적 어려움을 극복하기 위해서 자동화된 AI 기반 솔루션을 구축하기 위해서 NBME(National Board of Medical..

AI/Kaggle Writeups 2023.10.09

Dropzone.js를 사용해 대용량 파일 업로드 API 성능 개선

파일 업로드 일반적으로 파일 업로드를 할 때에는 multipart/form-data 형식으로 업로드를 진행하도록 API를 디자인하게 된다. 이때, 일반적인 파일들은 파일 크기가 그렇게 크지 않겠지만, 영상 파일과 같이 용량이 GB 단위가 되는 경우에는 단순히 한번의 요청으로 전체 파일을 올리는 것이 매우 어려워지게 된다. 다음 코드는 multipart/form-data 형식으로 데이터를 업로드하기 위한 API를 Flask와 flask-restx로 구현한 간단한 예제이다: import uuid from flask import request, make_response from flask_restx import Resource, Namespace from werkzeug.utils import secure_f..

Python/Flask 2023.10.09

pip-audit과 GitHub Actions를 활용한 취약 라이브러리 탐지 파이프라인 구축하기

흔히 파이썬을 사용해서 개발을 하다보면 `pip install`을 사용해서 다양한 라이브러리들을 설치하게 된다. 그리고 이렇게 설치한 라이브러리들에서 취약점이 발견되고, 이에 대해서 신규 패치가 나왔을 때, 이를 자동으로 탐지하고 취약점이 있는 라이브러리가 현재 프로젝트 내에서 사용 중인지 여부를 자동적으로 알려주는 기능의 필요성을 개발을 진행하면서 여러차례 느끼게 되었다. 물론, 비슷한 기능을 가진 GitHub DependencyBot이 있으나, dependency bot를 사용해서 의존성 업데이트를 진행할 때에는 가끔씩 의존성 충돌 문제로 인해 업데이트가 실패하는 등의 문제가 발생할 수 있다. 또한, 취약점 패키지를 발견했을때 즉시 알림을 주는 기능 역시 활성화를 시켜도 가끔씩 제대로 작동을 안하는 ..

Python 2023.10.09

소스코드 레벨에서 비교하는 Python List와 Set의 차이

Python에서 Set과 List List는 순서가 있고 mutable한 객체 집합이며, Set은 순서가 없고 mutable한 고유한 객체 집합이다. 두 자료구조 사이의 가장 큰 차이는 1) 객체의 중복 허용 여부와 2) 순서를 가지고 있는가 이다. 순서가 중요할 때에는 List를 사용하며, 객체의 중복을 배제하고 싶을 때에는 Set을 사용하는 것이 좋다. 그런데, 만약 중복이 없는 배열이 필요한 상황에서는 list와 set 중 어느 것을 사용하는 것이 좋을까? 둘 중 하나를 고르는 것이 실질적으로 어플리케이션의 성능에 큰 차이를 가져올 수 있을까? CPython 소스코드 레벨로 이해하는 List CPython 소스코드를 보게되면 List는 PyObject의 array의 포인터를 가지는 형태의 구조체로 ..

Python 2023.10.09

Python Dictionary 구조 CPython 소스 코드 레벨부터 파악하기

Python Dictionary는 어떻게 구현되었을까? 딕셔너리는 파이썬 프로그래밍에서 자주 사용되는 자료구조로, key-value pair 구조로 이루어져 있다. 그 구조는 마치 자바의 HashMap이나 Javascript의 JSON과 비슷한데, 그렇다면 저레벨 수준에서 구현은 어떠할까? 기본적으로 dict 타입은 저레벨 구현까지 내려가보면 해시 테이블로 구현되어 있다. 해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠르게 데이터를 검색할 수 있는 자료구조이다. 해시 테이블이 빠른 검색속도를 제공하는 이유는 내부적으로 배열(버킷)을 사용하여 데이터를 저장하기 때문이다. 해시 테이블은 각각의 Key값에 해시 함수를 적용해 배열의 고유한 index를 생성하고, 이 index를..

Python 2023.10.09

Flask에서 async 기반 API 구현하기

Flask에서 async API 만들기? 일반적으로 Flask는 wsgi와 연동되도록 synchronous하게 동작하는 것을 기대하고 구현되었기 때문에 async 함수 없이 구현하는 것이 일반적인 패턴이다. 그러나 경우에 따라 필요에 의해 Flask 서버에 비동기 non-blocking I/O 기반 기능을 추가해야 할 경우가 발생하게 된다. 애초에 async 함수로 구현되는 FastAPI에서는 그다지 할 필요가 없는 고민이긴 하다. 어찌되었든, Flask에서 비동기를 사용하고 싶다면 어떤 방법으로 문제를 해결할 수 있을까? 가장 간단한 방법으로는 `asyncio`를 사용해서 비동기적인 I/O 기능을 할 수 있도록 만들고, 이를 Flask 코드와 연결시키면 된다. 눈치 챈 사람들도 있겠지만, 파이썬에서 함..

Python/Flask 2023.10.09