Introduction

직장인 3개월 차…
대학원생 생활보다 훨씬 여유롭고 괜찮다 생각했지만 노화가 시작됐는지 체력이 약화됨을 느껴서 영양제를 섭취하기로 결정했습니다…
적절한 조합을 찾기 위해 앱 필라멘토와 지인의 자문을 활용했습니다.

Read more »

Introduction

Definition of Triton Inference Server

Triton Inference Server는 NVIDIA에서 개발한 딥 러닝 모델 인퍼런스를 위한 고성능 인퍼런스 서버입니다. Triton Inference Server는 다중 모델을 지원하며, TensorFlow, PyTorch, ONNX 등의 주요 딥 러닝 프레임워크를 모두 지원합니다.
이를 통해 사용자는 다양한 모델을 효율적으로 서빙할 수 있습니다.
Triton Inference Server는 NVIDIA TensorRT 엔진을 기반으로하며, GPU 가속을 통해 모델 추론을 빠르게 수행할 수 있습니다.
또한 Triton Inference Server는 TensorFlow Serving과 호환되는 gRPC 인터페이스를 제공하며 Triton Inference Server는 TensorFlow Serving, TorchServe와 같은 기존 인퍼런스 서버와 비교하여 성능 및 유연성 면에서 우수한 성능을 발휘합니다.
Triton Inference Server는 Kubernetes, Docker 및 NVIDIA DeepOps와 같은 오케스트레이션 툴과 통합되어 쉽게 배포할 수 있습니다.
Triton Inference Server는 성능, 확장성 및 유연성 면에서 우수한 기능을 제공하므로, 대규모 딥 러닝 모델 인퍼런스를 위한 선택적이고 강력한 도구로 자리 잡고 있습니다.

Docker Image: triton-server

Triton Inference Server 이미지는 NVIDIA에서 제공하는 Docker 이미지입니다. 이 이미지는 NVIDIA GPU 드라이버와 CUDA 라이브러리를 포함하며, 딥 러닝 인퍼런스를 실행하는 데 필요한 모든 라이브러리와 의존성을 포함합니다.
Triton Inference Server 이미지는 NGC(NVIDIA GPU Cloud)와 Docker Hub에서 제공됩니다. NGC에서는 최신 버전의 Triton Inference Server 이미지를 제공하며, TensorFlow, PyTorch, ONNX와 같은 다양한 프레임워크에서 학습된 모델을 지원합니다. 또한, TensorRT와 같은 최적화 라이브러리를 사용하여 높은 성능을 발휘합니다.
Docker Hub에서도 NVIDIA에서 공식적으로 제공하는 Triton Inference Server 이미지를 찾을 수 있습니다. Docker Hub에서는 다양한 버전의 Triton Inference Server 이미지를 제공하며, TensorFlow, PyTorch, ONNX와 같은 다양한 프레임워크를 지원합니다.
이러한 Triton Inference Server 이미지는 Kubernetes, Docker Compose와 같은 오케스트레이션 툴과 통합되어 배포 및 관리할 수 있으며, 쉽게 다양한 환경에서 실행할 수 있습니다.

이러한 Triton Inference Server를 통해 YOLOv5 모델을 Serving하고, 간략한 Client를 개발하여 Server가 잘 구동되는지 확인하는 방법을 설명하겠다.

Read more »

Introduction

Label Studio

Label Studio는 오픈 소스 데이터 라벨링 툴로, 기계 학습 및 데이터 분석 작업을 위해 데이터에 레이블을 부착하는 데 사용되는 도구입니다. Label Studio를 사용하면 이미지, 텍스트, 오디오, 비디오 등 다양한 유형의 데이터에 대해 레이블을 지정하고, 데이터를 분류, 개체 감지, 개체 분류, 개체 추출, 텍스트 분석 등의 작업을 수행할 수 있습니다.
Label Studio는 다양한 데이터 형식 및 레이블링 작업에 대한 다양한 템플릿을 제공하며, 커스텀 레이블링 작업을 설정할 수 있습니다. 또한, 데이터 라벨링 작업을 위해 다양한 작업자를 관리하고, 작업 상태를 추적하며, 결과를 검토하고 승인할 수 있는 기능들을 제공합니다.
Label Studio는 웹 기반 인터페이스를 제공하여 다양한 사용자가 쉽게 접근하고 사용할 수 있습니다. 또한, API를 통해 레이블링 작업을 자동화하고, 다양한 형식의 데이터를 가져와 레이블링을 수행할 수 있습니다.
Label Studio는 머신러닝, 딥러닝, 자연어 처리, 컴퓨터 비전 등 다양한 분야에서 데이터 라벨링 작업을 수행하는 데 유용하게 사용될 수 있습니다. 오픈 소스로 제공되기 때문에, 사용자들은 커스터마이징이 가능하고 개발자들은 소스 코드를 수정하여 자신의 요구에 맞게 확장할 수 있습니다.

Read more »

Introduction

Mask R-CNN?

Mask R-CNN은 Faster R-CNN에 Segmentation 네트워크를 추가한 딥러닝 알고리즘으로, 객체 검출 (Object detection)과 분할을 모두 수행할 수 있습니다.
기존 Faster R-CNN은 RPN (Region Proposal Network)을 사용하여 객체의 경계 상자 (Bounding box)를 추출하고, 추출된 경계 상자를 입력으로 사용하여 객체 인식을 수행합니다. 이러한 방식은 객체의 위치와 클래스 정보를 검출할 수 있지만, 객체 내부의 픽셀-레벨 Segmentation 정보는 제공하지 않습니다.
Mask R-CNN은 Faster R-CNN의 RPN 뿐만 아니라, RoIAlign (Rectangle of Interest Alignment)을 사용하여 추출된 경계 상자 내부의 픽셀-레벨 Segmentation 정보를 추출할 수 있는 분할 네트워크를 추가합니다. 이를 통해, 객체 검출과 동시에 객체 내부의 픽셀-레벨 Segmentation 정보를 추출할 수 있습니다.
또한, Mask R-CNN은 이를 위해 Faster R-CNN과 함께 사용되는 합성곱 신경망 (Convolutional Neural Network)을 미세 조정 (Fine-tuning)하여 분할 네트워크의 성능을 최적화합니다.
Mask R-CNN은 객체 검출과 분할 작업에서 매우 강력한 성능을 보여주며, COCO (Common Objects in Context) 데이터셋에서 현재 가장 높은 정확도를 보이고 있습니다. 따라서, 객체 검출과 분할이 모두 필요한 다양한 응용 분야에서 활용되고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
├── makeGT.py
├── model
│ ├── __init__.py
│ ├── load_data.py
│ ├── model.py
│ ├── README.md
│ ├── test.py
│ └── train.py
├── README.md
├── requirements.txt
├── test.py
├── train.py
└── utils
├── coco_eval.py
├── coco_utils.py
├── engine.py
├── __init__.py
├── README.md
├── transforms.py
└── utils.py

Mask R-CNN의 training, test, visualization, evaluation을 진행할 수 있게 PyTorch를 사용하여 위와 같은 구조로 개발하는 과정을 기록한다.

사용될 데이터는 ISIC 2016 Challenge - Task 3B: Segmented Lesion Classification이며 예시는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
├── ISBI2016_ISIC_Part3B_Test_Data
│ ├── ISIC_0000003.jpg
│ ├── ISIC_0000003_Segmentation.png
│ └── ...
├── ISBI2016_ISIC_Part3B_Training_Data
│ ├── ISIC_0000000.jpg
│ ├── ISIC_0000000_Segmentation.png
│ └── ...
├── ISBI2016_ISIC_Part3B_Test_GroundTruth.csv
└── ISBI2016_ISIC_Part3B_Training_GroundTruth.csv
Read more »

Introduction

TensorRT

  • Features
    • 학습된 Deep Learning 모델을 최적화하여 NVIDIA GPU 상에서 Inference 속도를 향상시켜 Deep Learning 서비스 TCO (Total Cost of Ownership)를 개선하는데 도움을 줄 수 있는 모델 최적화 엔진
    • NVIDIA GPU 연산에 적합한 최적화 기법들을 이용해 모델을 최적화하는 Optimizer와 다양한 GPU에서 모델 연산을 수행하는 Runtime Engine을 포함
    • 대부분의 Deep Learning Frameworks (TensorFlow, PyTorch, Etc.)에서 학습된 모델 지원
    • C++ 및 Python의 API 레벨 지원을 통해 GPU programming language인 CUDA 지식이 별도로 없더라도 사용 가능
  • TensorRT Optimizations
    • Quantization & Precision Calibration
    • Graph Optimization
    • Kernel Auto-tuning
    • Dynamic Tensor Memory & Multi-stream Execution
Read more »

Stream Serving

Data Subscriber

data_subscriber.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import os
from dotenv import load_dotenv

from json import loads

import psycopg2
import requests
from kafka import KafkaConsumer


def create_table(db_connect):
create_table_query = """
CREATE TABLE IF NOT EXISTS breast_cancer_prediction (
id SERIAL PRIMARY KEY,
timestamp timestamp,
breast_cancer_class int
);"""
print(create_table_query)
with db_connect.cursor() as cur:
cur.execute(create_table_query)
db_connect.commit()


def insert_data(db_connect, data):
insert_row_query = f"""
INSERT INTO breast_cancer_prediction
(timestamp, breast_cancer_class)
VALUES (
'{data["timestamp"]}',
{data["target"]}
);"""
print(insert_row_query)
with db_connect.cursor() as cur:
cur.execute(insert_row_query)
db_connect.commit()


def subscribe_data(db_connect, consumer):
for msg in consumer:
print(
f"Topic : {msg.topic}\n"
f"Partition : {msg.partition}\n"
f"Offset : {msg.offset}\n"
f"Key : {msg.key}\n"
f"Value : {msg.value}\n",
)

msg.value["payload"].pop("id")
msg.value["payload"].pop("target")
ts = msg.value["payload"].pop("timestamp")

response = requests.post(
url="http://api-with-model:8000/predict",
json=msg.value["payload"],
headers={"Content-Type": "application/json"},
).json()
response["timestamp"] = ts
insert_data(db_connect, response)


if __name__ == "__main__":
load_dotenv()
db_connect = psycopg2.connect(
user=os.environ.get("POSTGRES_USER"),
password=os.environ.get("POSTGRES_PASSWORD"),
host=os.environ.get("POSTGRES_HOST"),
port=5432,
database=os.environ.get("POSTGRES_DB"),
)
create_table(db_connect)

consumer = KafkaConsumer(
"postgres-source-breast_cancer_data",
bootstrap_servers="broker:29092",
auto_offset_reset="earliest",
group_id="breast_cancer_data-consumer-group",
value_deserializer=lambda x: loads(x),
)
subscribe_data(db_connect, consumer)
Read more »

Introduction

논문의 저자가 제공하거나 논문을 참고하여 개발된 모델은 보통 config 파일 (e.g. config.yaml, config.py)이 존재하고, 해당 파일을 통해 이렇게 모델 구조를 변경할 수 있다.
하지만 기존의 소스에 본인이 원하는 모델 구조가 없다면 어떻게 개발하는지, 그리고 기존에 없던 레이어를 어떻게 훈련하면 좋을지 알아보자.
이 글에서는 이 논문을 기반으로 개발된 모델인 whai362/pan_pp.pytorch를 기준으로 개발하겠다.
간단한 목표 설정을 해보기 위해 대략적인 모델의 설명을 진행하겠다.

PAN++

PAN++는 STR (Scene Text Recognition)을 위해 개발되었지만, 본 글에서는 STD (Scene Text Detection) 부분까지만 사용하며 해당 부분은 아래와 같이 진행된다.

  1. Feature Extraction
    • Layer: Backbone (ResNet)
    • Output: Feature map
  2. Feature Fusion
    • Layer: FPEM (Feature Pyramid Enhancement Module)
    • Output: Enhanced feature map
  3. Detection
    • Layer: Detection Head
    • Output: Text region, text kernel, instance vector
  4. Post-processing (Pixel Aggregation, PA)
    • Output: Axis of bbox (bounding box)

Goal

  • FPEM의 stack 수 편집
    • 원문 코드: 2 stacked FPEMs 사용
    • 목표: 4 stacked FPEMs
  • Fine-tuning
    • 목표: 추가된 2 stacked FPEMs 계층만을 훈련
Read more »

킹받는 호돌이

Received King

Introduction

안녕하세요, 저는 2023년 2월 22일에 건국대학교 기계설계학과에서 석사학위를 취득했고 2023년 2월 1일에 전문연구요원으로 편입하기 위해 AgileSoDA에 입사하였습니다.
학위과정을 거친 모든 연구자 분들이 공식 문서나 복잡한 서류들을 자주 읽어서 헤메는 분들이 많진 않겠지만, 제 블로그를 통해 전문연구요원을 준비하시는 석, 박사과정 분들과 현재 재직 중이신 전문연구요원 분들에게 작은 도움이 됐으면 합니다.
먼저 본격적인 전문연구요원 편입 과정에 앞서 학위 수여 전 유의해야할 사항에 대해 알려드리겠습니다.

Read more »

Kafka System

connect.Dockerfile
1
2
3
4
5
6
7
FROM confluentinc/cp-kafka-connect:7.3.0

ENV CONNECT_PLUGIN_PATH="/usr/share/java,/usr/share/confluent-hub-components"

RUN confluent-hub install --no-prompt snowflakeinc/snowflake-kafka-connector:1.5.5 &&\
confluent-hub install --no-prompt confluentinc/kafka-connect-jdbc:10.2.2 &&\
confluent-hub install --no-prompt confluentinc/kafka-connect-json-schema-converter:7.3.0
Read more »

Model API

모델 다운로드

download_model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os
from dotenv import load_dotenv
from argparse import ArgumentParser

import mlflow

load_dotenv()

os.environ["MLFLOW_S3_ENDPOINT_URL"] = os.environ.get("MLFLOW_S3_ENDPOINT_URL")
os.environ["MLFLOW_TRACKING_URI"] = os.environ.get("MLFLOW_TRACKING_URI")
os.environ["AWS_ACCESS_KEY_ID"] = os.environ.get("MINIO_ROOT_USER")
os.environ["AWS_SECRET_ACCESS_KEY"] = os.environ.get("MINIO_ROOT_PASSWORD")

def download_model(args):
mlflow.artifacts.download_artifacts(artifact_uri=f"runs:/{args.run_id}/{args.model_name}", dst_path=".")

if __name__ == "__main__":
parser = ArgumentParser()
parser.add_argument("--model-name", dest="model_name", type=str, default="sk_model")
parser.add_argument("--run-id", dest="run_id", type=str)
args = parser.parse_args()
download_model(args)
Read more »

Introduction

1
2
$ conda activate MLOps
$ pip install "fastapi[all]"
Example.py
1
2
3
4
5
6
7
8
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "World"}
...
  • app = FastAPI(): FastAPI 클래스의 인스턴스 생성
  • Path Operation Decorator: API 작업의 endpoint를 HTTP method를 통해 지정
    • Operation: POST, GET, PUT, DELETE 등의 HTTP method
    • Ex. @app.get("/"): FastAPI가 path /에서 GET operation 수행
  • Path Operation Function: Path operation 수행 시 실행될 Python 함수
    • Return: dict, list, str, int, Pydantic Model, etc…
Read more »

MLflow Setup

  • MLflow: A machine learning lifecycle platform
    • MLflow Tracking: 학습 과정에서의 매개 변수, 코드, 결과를 기록하고 대화형 UI로 비교할 수 있는 API
    • MLflow project: ML 코드 공유를 위한 Conda 및 Docker 기반 패키지 형식 지원
    • MLflow Models: Docker, Apache Spark, Azure ML, AWS SageMaker 등의 플랫폼에 ML 코드를 배포할 수 있는 패키징 형식 및 도구
    • MLflow Model Registry: MLflow 모델의 전체 수명 주기를 공동으로 관리하기 위한 중앙 집중식 모델 저장소, API, UI의 집합
  • Backend Store: 수치 데이터와 MLflow 서버의 정보들을 체계적으로 관리하기 위한 DB
    • 모델 데이터
      • 학습 결과
        • Accuracy
        • F1-score
      • 학습 과정의 loss
      • 모델 자체 정보 (hyperparameters)
    • MLflow의 메타 데이터
      • run_id
      • run_name
      • experiment_name
Read more »

풀이

Programmers 60059: 자물쇠와 열쇠

새로운 key를 만들어서 이동하고 회전하면 시간 복잡도가 너무 커질 것 같아서 key의 좌표를 회전된 것처럼 맵핑해줄 수 있는 convert_func 함수를 개발했다. 는 행렬 다시 만들고 이동 및 회전해도 풀 수 있음;
keylock이 겹쳐지는 순간 겹쳐지지 않은 key의 부분을 쉽게 고려하기 위해 for문을 M (len(key))에 대해 개발하였고, 해당 부분을 위해 key를 회전하는 것은 lock을 회전하는 것과 같은 성질을 이용해 lock을 회전했다.
또한 lock의 모든 부분에 일일히 key를 넣어보며 확인하면 시간 복잡도가 커질 것 같아서 key의 삽입이 필요한 구간을 idx_i_1, idx_j_1, idx_i_2, idx_j_2로 정의했다. 는 이것도 그냥 풀 수 있음;
최종적으로 꼭 key의 삽입이 필요한 구간에 대해서만 완벽히 일치하는지에 대한 여부 확인을 위한 함수 match를 수행했다.

Read more »

풀이

Programmers 92344: 파괴되지 않은 건물

Brute-force 알고리즘을 적용하면 250,000 * 1,000 * 1,000의 시간 복잡도를 가지기 때문에 효율성 테스트를 통과할 수 없다.
따라서 skill의 행 길이가 최대 250,000이므로 해당 부분을 해결하는 것이 문제의 포인트다. (board의 각 원소를 필연적으로 수정 및 조회해야하기 때문)
아마도 시간 복잡도를 250,000 + 1,000 * 1,000으로 감쇠시킬 수 있는 알고리즘을 개발해야할 것이다.
최종적으로 구간 합을 이용해 풀 수 있었다.

Read more »