분류 전체보기 250

컨테이너 이미지

컨테이너 이미지는 컨테이너 기술을 다루는 거의 모든 사람이 처음 접하게 되는 기술이다. 컨테이너 이미지는 OS 컨테이너 내부에서 프로그램을 실행하는데 필요한 모든 파일을 캡슐화하는 바이너리 패키지다. 컨테이너를 처음 접하는 방식에 따라 로컬 파일 시스템에서 컨테이너 이미지를 빌드하거나 이미 구축돼 있는 컨테이너 레지스트리(container registry)로부터 이미지를 다운로드하기도 한다. 두 경우 모두 컴퓨터에 컨테이너 이미지가 있으면 해당 이미지를 실행해 OS 컨테이너 내부에서 실행되는 애플리케이션을 생성할 수 있다. 가장 유명하고 널리 사용되는 컨테이너 이미지 포맷을 도커 이미지 포맷이며, 이를 사용할 경우 도커 명령으로 컨테이너를 패키징, 배포, 실행할 수 있다. 도커 이미지 포맷은 도커 오픈소..

Container 2023.10.25

NGINX 설정을 통해 브라우저 캐싱 방지하기

웹 어플리케이션을 개발하다보면 JS, CSS, HTML 등과 같은 정적 파일들이 변경되게 되는데, 웹브라우저 등에 의해 캐싱이 되는 등의 이유로 인해 변경사항이 바로 적용이 안되는 등의 애환이 있다. 물론, "ctrl + shift + r"을 통해 매번 브라우저 캐시를 무시하는 완전 refresh를 시키는 방법도 있지만, 개발을 하면서 매번 이러한 작업을 하는 것 자체가 매우 번거로운 일이다. 이러한 제약사항을 극복할 수 있는 방법을 찾던 중, 캐시 만료 설정인 "expires"에 -1을 넣으면 브라우저 캐싱을 막을 수 있다는 사실을 알게 되었다. upstream api_server { server 127.0.0.1:8080; keepalive 100; } server { listen 80; listen..

DevOps/NGINX 2023.10.24

sqlalchemy에서 joinedload와 Query.join()의 차이점

tl;dr joinedload를 사용하면 JOIN된 전체 attribute들을 select하나, Query.join()은 query의 대상이 되는 table의 항목들만 select의 대상이 된다. 이 글은 SQLAlchemy의 공식 문서를 번역한 것입니다. 원문: https://docs.sqlalchemy.org/en/14/orm/loading_relationships.html#sqlalchemy.orm.joinedload Joinedload는 Query.join()의 사용과 많은 유사점이 있기 때문에, 언제 어떻게 사용해야 하는지에 대해 혼동을 일으키는 경우가 많습니다. Query.join()은 쿼리 결과를 변경하는 데 사용되는 반면, joinedload()는 쿼리 결과를 변경하지 않고 렌더링된 조인의..

Python/sqlalchemy 2023.10.22

OpenTelemetry의 역사

2019년 초 OpenTelemetry 프로젝트는 OpenTracing과 OpenCensus라는 두 프로젝트의 병합으로 탄생했다. 프로젝트의 초기 목표는 두 개의 프로젝트를 하나로 합치는 것이었지만 클라우드 네이티브 소프트웨어에 대한 관찰 가능성 프레임워크를 제공하겠다는 야심이 프로젝트를 큰 과제로 만들었다. OpenTelemetry는 기본적으로 OpenTracing과 OpenCensus의 개념을 결합한 것이기 때문에 우선은 이 둘을 잘 살펴볼 필요가 있다. OpenTracing 2016년에 시작된 OpenTracing 프로젝트는 사용자가 시스템을 더 잘 이해하기 위한 수단으로 분산 추적을 채택하는 비율이 증가하는 것에 따른 문제를 해결하는 데 집중했다. 사용자들은 분산 추적 도입으로 인해 발생하는 비용..

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