문제

수 N개 $A_1$, $A_2$, …, $A_N$이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 5,000,000)과 K (1 ≤ K ≤ N)이 주어진다.
둘째에는 $A_1$, $A_2$, …, $A_N$이 주어진다. ($-10^9$ ≤ $A_i$ ≤ $10^9$)

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.

Read more »

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.

Read more »

문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.
예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

Read more »

문제

다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
예를 들어 S=0001100 일 때,

  1. 전체를 뒤집으면 1110011이 된다.
  2. 4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.

하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.
문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100만보다 작다.

출력

첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.

Read more »

Templating tasks using the Airflow context

Wikimedia에서 제공하는 API를 통해 데이터를 .gz 확장자로 받아오고 schedule에 따른 증분 데이터를 적재하여 DAG와 operator가 Airflow에서 어떻게 작동하는지, 그리고 workflow를 어떻게 schedule하는지 이해해보자.
우선 API를 통해 아래와 같이 원하는 기간의 데이터를 받을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
$ wget https://dumps.wikimedia.org/other/pageviews/2023/2023-07/pageviews-20230726-010000.gz
--2023-07-27 21:16:24-- https://dumps.wikimedia.org/other/pageviews/2023/2023-07/pageviews-20230726-010000.gz
dumps.wikimedia.org (dumps.wikimedia.org) 해석 중... 208.80.154.142
다음으로 연결 중: dumps.wikimedia.org (dumps.wikimedia.org)|208.80.154.142|:443... 연결했습니다.
HTTP 요청을 보냈습니다. 응답 기다리는 중... 200 OK
길이: 44600005 (43M) [application/octet-stream]
저장 위치: `pageviews-20230726-010000.gz'

pageviews-20230726-010000.gz 100%[=================================================>] 42.53M 4.56MB/s / 9.9s

2023-07-27 21:16:36 (4.28 MB/s) - `pageviews-20230726-010000.gz' 저장함 [44600005/44600005]
Read more »

Introduction

Apache Airflow

  • Definition
    • 오픈 소스로 개발된 데이터 파이프라인 관리 도구
    • Workflow 자동화와 데이터 처리를 위한 플랫폼
  • Features
    • 유연한 파이썬 프레임워크를 통한 쉬운 데이터 파이프라인 구축
    • 다양한 빌딩 블록을 통한 최신 기술 연결
    • 복잡한 데이터 처리 작업 scheduling 및 monitoring
    • Data engineering, ETL (Extract, Transform, Load), data migration, data analysis 등 다양한 작업에서 활용
      Read more »

시작에 앞선 꿀팁

빌드와 실행을 동시에?

1
$ go run main.go

이렇게 실행하면 go build main.go./main을 합쳐서 실행할 수 있다.

Read more »

Introduction

YOLOv5 모델을 ONNX로 변환하여 Triton Inference Server로 배포한 경험은 있지만, Amazon EC2 Inf1을 통해 모델을 배포하고 REST API를 직접 구성해본 경험은 없어 직접 inference server와 API server를 구성해보려고한다.
공식 문서참고 자료들도 존재하지만 실질적 개발을 하는데 있어 막히는 부분이 꽤 많아 기록으로 남긴다.


Local 내 구현

local

Read more »

Introduction

저번에 이어서 python code들의 formatting을 조금 더 간편하게 Git Hooks를 통해 도전한다.

Git Hooks

Git Hooks는 Git 작업의 특정 지점에서 실행되는 스크립트다.
사용자 정의 작업을 수행하거나 작업의 유효성을 검사하기 위해 사용되며 git repository 내부에 설정되어 해당 이벤트가 발생할 때마다 실행된다.

pre-commit

pre-commit은 Git Hooks을 활용하여 코드 commit 전에 자동으로 실행되는 도구다.
코드의 품질을 유지하고 일관성을 강제하기 위해 사용되며 일반적으로 코드 스타일 체크, 정적 분석, 테스트 실행 등의 작업을 수행한다.
또한 commit 하기 전에 코드에 대한 일련의 검사를 수행하여 품질을 향상시키고, 잠재적인 오류나 스타일 가이드 위반을 방지한다.

1
$ pip install pre-commit

pre-commit은 위와 같이 설치할 수 있으며, .pre-commit-config.yaml 파일을 사용하여 구성한다.
이 파일에는 사용할 Git Hooks 스크립트, 훅을 실행할 리포지토리 경로, 특정 파일에 대한 훅의 적용 여부 등의 설정이 포함된다.

pre-commit은 다양한 Git Hooks (코드 포맷팅, 정적 분석, 린팅, 테스트 실행 등)를 지원하며을 수행할 수 있다.
.pre-commit-config.yaml 파일에서 필요한 훅을 구성하고 해당 훅이 실행될 때 어떤 작업을 수행할지 결정할 수 있다.

Read more »

Introduction

Algorithm 문제를 풀고 GitHub에서 관리하고 있었는데, 문제를 해결할 때 replit을 초기에 많이 사용했었다.
하지만 현재 사용하고 있는 Visual Studio Code와 indentation의 규칙이 달라서 GitHub Actions로 모두 동일한 format을 가지도록 자동화하겠다.

GitHub Actions는 구동 조건 (CronJob, 특정 branch에 push, …)을 만족하면 준비된 스크립트를 자동적으로 실행해준다.
따라서 CI/CD를 포함하여 다양한 작업에 사용되고 있다. (로또 자동화도 가능,,,)

I_WANNA_BE_RICH
Read more »

Introduction

Go는 구글에서 개발한 프로그래밍 언어로, 간결하고 효율적인 코드 작성을 위해 설계된 언어입니다. Go는 정적 타입 언어로, C와 유닉스 환경에서 사용되는 도구들의 장점을 결합한 언어로 개발되었습니다.

Features of Go

  1. 간결하고 가독성이 좋은 문법
    • C 스타일의 문법을 가지고 있으며, 불필요한 기능을 제거하여 코드를 간결하게 작성 가능
    • 문법이 간단하고 가독성이 좋아 새로운 개발자들의 빠른 숙달
  2. 효율적인 동시성 지원
    • 동시성을 위한 기능 내장 $\rightarrow$ 병렬 프로그래밍의 쉬운 구현
    • Goroutine은 경량 스레드로, 작은 메모리 오버헤드로 수많은 고루틴을 동시에 실행 가능 $\rightarrow$ 대규모 시스템에서 효율적인 동시성 처리 구현 가능
  3. 빠른 컴파일과 실행 속도
    • 정적 타입 언어지만 빠른 컴파일 속도
    • Garbage collection을 통한 편한 메모리 관리 $\rightarrow$ 대규모 시스템에서도 빠른 실행 속도를 제공합니다.
  4. 강력한 표준 라이브러리
    • 풍부한 표준 라이브러리를 제공 (네트워킹, 암호화, 웹 개발, 데이터베이스 액세스 등 다양한 작업)
  5. 크로스 플랫폼 지원
    • 다양한 운영 체제와 아키텍처에서 사용할 수 있도록 크로스 플랫폼 지원 제공
    • 하나의 코드베이스로 여러 플랫폼에서 실행할 수 있는 이식성 높은 프로그램 개발 가능

Go는 웹 서버, 분산 시스템, 클라우드 서비스, 네트워크 프로그래밍 등 다양한 분야에서 사용된다.
특히, 동시성 처리에 강점을 가지고 있어 대규모 시스템의 성능을 향상시킬 수 있다.
또한, Go는 개발자들의 생산성을 높이기 위해 설계된 언어로, 간결한 문법과 강력한 도구들을 제공하여 개발자들이 효율적으로 코드를 작성할 수 있도록 도와준다.

Read more »

Introduction

  • Kubernetes$_{^{\ [1]}}$: Container화된 application을 자동화하고 관리하기 위한 open source container orchestration 플랫폼$_{^{\ [2,3]}}$
    • MLOps에서 왜 Kubernetes가 필요할까?$_{^{\ [4]}}$
      • 수많은 머신러닝 모델의 학습 요청을 차례대로 실행하는 것
      • 다른 작업 공간에서도 같은 실행 환경을 보장해야 하는 것
      • 배포된 서비스에 장애가 생겼을 때 빠르게 대응해야 하는 것
      • Etc.
    • Cluster: Container화된 application을 실행하는 node라고 하는 worker machine의 집합
      • 모든 cluster는 최소 한 개의 worker node를 가짐
    • Kubectl: Kubernetes의 cluster와 통신하여 다양한 object들의 상태 확인 또는 CRUD 작업 등을 위해 사용되는 CLI 도구$_{^{\ [5]}}$
      • CRUD: Create (생성), Read (읽기), Update (갱신), Delete (삭제)
    • Node: Cluster 내에서 workload를 실행할 수 있는 하드웨어 또는 가상 머신 인스턴스$_{^{\ [6]}}$
      • Cluster에 따라 가상 또는 물리적 머신일 수 있음
      • Control plane에 의해 관리되며 pod를 실행하는 데 필요한 서비스를 포함
    • Pod: Cluster의 가장 작은 배포 단위
      • 한 개 이상의 container로 구성
      • Storage 및 network를 공유하고 함께 batch 및 scheduling (공유 context)
    • etcd: Cluster의 데이터를 저장하는 key-value 기반 DB
    • Namespace: Cluster 내의 논리적 분리 단위
      • Resource를 논리적으로 나누기 위한 방법
      • 사용자별 접근 권한 부여 가능
  • Minikube$_{^{\ [7]}}$: 로컬 개발 환경에서 단일 node Kubernetes cluster를 실행하기 위한 도구
Read more »

본 후기는 2023.05.25 ~ 2023.06.15에 25연대에서 진행된 보충역 훈련소 3주과정를 토대로 작성되었습니다.

후기를 시작하기 앞서 훈련소는 연대에 따라, 중대에 따라 큰 차이가 존재할 수 있는 것 같습니다.
따라서 다양한 후기 글들을 참고하시는 것을 추천드립니다.

Read more »

DEER: Detection-agnostic End-to-End Recognizer for Scene Text Spotting

Introduction

이 논문은 NAVER Clova 팀에서 개발한 end-to-end text spotting 모델을 제안한다.
End-to-end text spotting 모델은 text detector와 recognizer로 구성되어있다.
해당 논문의 저자들은 기존 text spotting 모델들은 detector와 recognizer 사이에 다소 밀접하게 결합되어있다고 아래와 같이 주장한다.

  1. Detector에서 잘라낸 이미지는 recognizer에 입력되기 때문에 필연적으로 detector의 성능에 따라 recognizer의 성능이 결정된다.
  2. Detctor에서 crop된 영역의 localized features를 recognzier에 전달하여 detector의 종속성을 감소시킬 수 있지만 여전히 존재하는 detector의 오류 누적으로 인해 recognition 실패가 발생할 수 있다.
  3. Feature pooling과 masking은 end-to-end text spotting 모델을 학습하기 위해 bounding boxes 데이터가 여전히 필요하다.

이에 대한 자세한 설명은 발표자료의 6, 7, 8페이지에서 확인할 수 있다.

Object detection 분야에서는 end-to-end Transformer 기반 접근 방식이 발전함에 따라 이미지의 개별 객체를 엄격하게 recognize하기 위해 정확한 영역 정보, 정교한 ground truth 할당 및 feature pooling이 필요하지 않다는 것이 분명해지고 있다.
그렇기에 저자들은 detection 결과의 정확성에 대한 의존성을 완화할 수 있는 DEER (Detection-agnostic end-to-end Recognizer)를 제안한다.
DEER는 정확한 text 영역을 추출하기 위해 detector에 의존하지 않고 detector가 각 text instance에 대한 single reference point를 localize하도록 한다.
Reference point 주위의 text를 포괄적으로 recognize하는 text decoder는 text sequence를 decoding하는 동안 특정 text instance의 attending region을 결정하는 방법을 학습한다.
DEER는 기존 모델들과 다르게 detecotr의 역할이 single reference point를 localize하는 것 뿐이기 때문에 훨씬 더 다양한 검출 알고리즘과 주석을 사용할 수 있다.
이러한 접근 방식을 통해 pooling operations와 polygon-type 주석 없이 회전 및 곡선 text instance를 자연스럽게 처리할 수 있다.

Read more »

Introduction

Model serving 시 모델의 입력에 대해 출력을 산출하는 과정인 순전파 (forward propagation)는 model 내부의 layer들을 거치는데, 각 layer에는 수많은 단순 연산들이 존재한다.
이를 병렬로 수행하기 위해 CPU (Central Processing Unit)보다 병렬 계산에 이점이 있는 GPU (Grphic Processing Unit)을 많이 활용하고 있다.
하지만 아래와 같은 한계점이 존재한다.

  • 비싸다. (물리적 GPU 비용, 전력 소모, 클라우드 서비스 등 모든 측면에서)
  • 물리 코어를 가상 코어로 나눠 사용할 수 없어 자원을 낭비하기 쉽다.
  • 연산량이 적은 모델에 대해 추론할 때 CPU와 GPU 간 메모리 통신 오버헤드가 큰 경우 CPU에서 자체적 처리가 더 효율적일 수 있다.

이러한 이유들로 다양한 회사에서 GPU에 비해 저렴하지만 효율적인 ML 연산을 할 수 있는 AI 가속기들을 아래와 같이 개발하고 있다.

  • AWS Trainium, Inferentia
  • Google TPU (Tensor Processing Unit)
  • Apple ANE (Apple Neural Engine)
Read more »