Docker Container와 Flask를 활용하여 간단한 딥러닝 모델 추론 API 서버를 만들고자 한다. 추론서버 환경은 ubuntu를 적극 권장하며, 본 포스트에서 주요하게 다루고자 하는 부분은 다음 두 가지이다. 추론 API 서버 띄우기(Docker + Flask) request 라이브러리를 사용한 파일 전송 0. 간단한 Flask tutorial 가장 minimal한 Falsk application은 아래와 같으며, 해당 코드를 flask_test.py로 저장하자. from flask import Flask app = Flask(__name__) @app.route('/hello') def hello(): return 'Hello World!' Flask 공식문서에 따르면 위 코드에 대한 설명은..
DataFrame에서 다중 입력을 받아 다중 출력을 계산하는 경우가 있으며, condition이 복잡한 경우 custom function을 만드는게 좋다. 다음과 같은 상황을 가정해보자. DataFrame의 multiple column을 활용하여 multiple output 계산 새로운 column을 만들어 해당 column을 원래 DataFrame 오른쪽에 append 이때 apply 함수에 result_type='expand' arguement을 사용하면 된다. 0. pandas apply + custom function 다중입출력 아래와 같은 DataFrame이 있을 때, 여러 개의 column을 입력으로 받아 여러개의 새로운 column을 만드는 함수를 적용하려고 한다. df = pd.DataFr..
string 형태의 날짜를 datetime 데이터로 바꾸거나 vice-versa로 작업하는 경우를 위해 정리하고자 한다. (1) string → datetime string 데이터를 날짜 형식으로 바꾸기 위해서는 datetime 모듈의 strptime을 사용하면 편하다. 이때 중요한 것은 parsing하는 데이터 포맷을 알맞게 입력해줘야 한다(!) import datetime ## 올바른 포맷 string_data = '21/06/06' datetime.datetime.strptime(string_data, '%y/%d/%m') >>>> datetime.datetime(2021, 6, 6, 0, 0) ## 잘못된 포맷 string_data = '20210606' datetime.datetime.strpt..
Decorator를 사용하기 위해 공부했던 내용을 정리해두고자 한다. Decorator를 사용하기 위해 이해해야 할 개념은 다음과 같다. 일급함수(first-class function) 클로저(Closure) 데코레이터(Decorator) 1. 일급 함수 (1) 일급 함수의 개념 일급 함수는 컴퓨터 프로그래밍 언어 디자인에서 일급 객체(first-class object)의 함수 버전 개념이다. 위키피디아에 따르면 일급 객체는 '일반적으로 적용 가능한 연산을 모두 지원하는 객채'를 의미하며, 객체에 대한 구체적인 정의는 다음과 같다. 모든 요소는 함수의 실제 매개변수가 될 수 있다. 모든 요소는 함수의 반환 값이 될 수 있다. 모든 요소는 할당 명령문(assignments statements)의 대상(su..
실험 돌릴 때 GPU 사용량을 보기 위해 nividia-smi + enter를 무한히 반복했었다.. 다른 분이 알려준 방법을 적어두려고 한다 Watch를 사용한 GPU 사용 모니터링 watch -n 1 nividia-smi를 사용하면 GPU 사용량을 화면에 1초마다 찍어주며, 아주 편리하다. 5초마다 사용량을 찍고 싶으면 -n 5를 해주면 된다. watch -n 1 nvidia-smi
본 연구는 수 많은 딥러닝 모델들이 결과로 주는 confidence score를 조정하는 연구이다. Confidence score는 모델의 최종 layer에서의 sigmoid 또는 softmax 값을 의미하며, $[0,1]$ 값을 가진다. 논문의 주요 contribution은 다음과 같다. 딥러닝 모델이 커지면서 over-confident하게 되는 현상을 발견 perfect calibration을 정의하고, 이를 근사하기 위한 metric 정의 calibration 방법 비교 실험 논문의 주요 내용은 다음과 같다. 1. Introduction 모델의 예측값에 대한 confidence를 같이 제공하는 것은 모델의 성능 뿐만 아니라 신뢰도에 많은 영향을 준다. 현대의 neural network는 과거에 비해..
문서분류 task와 관련해서 진행한 내용을 정리하고자 한다. 0. Task 정의 Task는 다음과 같았다. Long Document: 길이가 긴 문서 상황에서 효과적인 모델 찾기 Class Imbalance: class 분포가 극도로 불균형한 상황에서의 성능향상 기법 1) Long Document PoC에서 다루었던 문서의 길이는 매우 긴편이었다. mecab 기준 평균 2,500 token이 넘었으며 길면 20,000 token도 넘는 문서가 있었다. 2) Class Imbalance 다루었던 문서는 총 4개의 label이 있었으며 label별 class들의 분포가 매우 불균형한 데이터였다. 1. Long Document에 대한 효과적인 모델 찾기 첫번째 task를 위해서 총 3가지 모델을 비교하였다. ..
matplotlib.pyplot을 활용하여 여러개의 subplot을 사용하는 방법은 간단하다. 다음과 같은 데이터가 있고 각 label별 class의 분포를 하나의 figure에서 표현하고자 한다. plt.subplot은 각 subplot을 그릴 때 호출하면 되며 (nrow, ncolumns, index) 값을 넣어주면 된다. nrows: 총 row 개수 ncolumns: 총 column 개수 index: 해당 subplot이 몇 번째 subplot인지 plt.figure(figsize=(16,12)) for plot_idx, col in enumerate(nd.columns): d = nd[col] c_val = d.value_counts().to_dict() n_dict = dict() for i, ..
Jupyter는 원격 서버에서 사용하기 굉장히 편리하다. 원격으로 접속할 수 있는 Container 기반 Jupyter 서버 띄우는 방법을 정리하고자 한다. 기본 이미지 중 하나인 python:3.7.3 이미지를 사용하여 서버를 띄울 것이다. 1. Container 띄우기 먼저 python 환경의 Container를 띄울것이다. 세팅은 다음과 같으며 Jupyter는 기본적으로 8888포트를 사용하기 때문에 Container의 8888 port를 host port에 연결시켜주어야 한다. Host에 마운트 할 폴더: /home/user/Documents Container의 폴더가 /root port: (host port):8888 실행 코드는 다음과 같이 host의 886 포트를 container의 8888..
regexr.com의 regex cheatsheet은 여기가 유용하다. 1) re.split() 특정 기호 그룹으로 문자열을 나눌 때 사용한다 # input: '100,200,300.400' # output: '100 200 300 400' import re regex_pattern = r"[,.]" s = '100,200,300.400' ' '.join(re.split(regex_patter, s)) 2) re.group() regex pattern에 매치되는 문자열 리스트를 얻고 싶을 때 사용한다. import re s = 'useful@python.codes' m = re.match(r'(\w+)@(\w+)\.(\w+)', s) print(m) >>> m.groups() >>> ('useful', ..
1) any() any()는 입력으로 받은 iterable 중 적어도 하나의 원소가 True이면 True를, 모두 False면 False를 출력한다. any([1,2,3]) >>>> True any([1>0, 1==0, 1>>> True any([1>> False 2) all() all()은 입력으로 받은 iterable의 모든 원소가 True이면 True를, 적어도 하나가 False라며 False를 출력한다. all([1,2,3]) >>>> True all([1,2,False]) >>>> False all([1,2,0]) >>>> False all(['a'>> True
이전 글에서 Heap Sort를 위해 필요한 Heap, Heapify 개념을 다루었다. Heap Sort는 배열이 주어졌을 때 다음과 같은 과정을 통해 정렬한다. ① 주어진 배열로 Max Heap을 만든다. ② Max Heapl에서 최대값(루트)를 가장 마지막 값과 바꾼다. (이때 가장 마지막 값은 정렬이 된 것이므로 힙의 일부가 아닌 것으로 간주함) ③ 루트노드에 대해서 Max-Heapify한다 ④ 남은 노드가 1개가 될 때 까지 ②,③을 반복한다 크게 생각한다면 Max Heap을 만들고(초기화), iterative하게 Max-Heapify하는 과정을 통해 배열을 정렬하는 것이다. 1. Heap Sort 과정 (1) Max Heap 만들기 정렬되지 않는 배열을 추상적으로 complete binary t..
dataframe을 이미지가 아닌 string으로 print하고 싶을 때 아래 코드로 출력 가능하다. 다음과 같은 데이터가 있다고 하자. jupyter notebook 등에서 print하는 방법은 다음과 같다. with pd.option_context('display.max_rows', None, 'display.max_columns', None): print(df) >>> col 0 a 1 a 2 b 3 a 4 a 5 a 6 b 7 a 8 a 9 b 10 b 11 c ...