개발 노트

문제 해결과 성장의 여정을 담은 개발 노트입니다

Quantization: PTQ and QAT

양자화(Quantization)는 딥러닝 모델의 weights와 activations 값 표현 정밀도를 낮추는 기법입니다. 일반적으로는 부동소수점(예: 32-bit float, FP32)에서 더 낮은 비트의 정수(예: 8-bit integer, INT8)로 변환하는 과정을 말합니다. 이를 통해 모델 크기를 줄이고, 추론 속도를 높이며, 전력 소모를 감소시킬 수 있어 특히 엣지 디바이스나 모바일 환경에 모델을 배포할 때 유용합니다. 또한 inference에는 고 정밀도가 필요하지 않은 경우가 많아 모델 정확도를 유지할 수 있습니다. PTQ (Post-Training Quantization, 학습 후 양자화) PTQ는 이미 학습된 부동소수점 모델을 가져와 양자화하는 방식입니다. 학습 과정은 건드리지 않고, 학습이 완료된 모델에 대해 양자화 변환만 수행합니다. 기존 학습된 모델을 그대로 사용하므로 적용이 추가적인 학습이나 학습 파이프라인 수정이 필요 없습니다. 하지만 양자화 과정에서 정보 손실이 발생하여 모델의 정확도가 떨어질 수 있고, 레이어의 오차 전파로 오차 누적 현상이 심해질 수 있습니다. ...

2025-06-09 · 5 min · 1007 words · Huijeong Kim

Transformer Model Workload Analysis

‘Full Stack Optimization of Transformer Inference: a Survey’ 리뷰 시리즈 2편 논문의 2.2장에서는 모델 워크로드를 분석합니다. Idle한 상황을 가정하고, 각 트랜스포머 모델의 이론적 최대 성능(upper bound)을 분석합니다. 그 과정에서 각 모델의 특성을 이해해 볼 수 있습니다. 논문 링크: https://arxiv.org/abs/2302.14017 Models 논문은 BERT-Base, BERT-Large, GPT-2 모델로 워크로드를 분석했습니다. 모두 트랜스포머 기반입니다. 주요 특징과 parameter configuration은 아래와 같습니다. 모델 구조 방향성 목적 주요 용도 12-layer BERT-Base 인코더-only 양방향 마스킹된 단어 예측 (MLM) 문장 이해 (분류, 질의응답 등) 24-layer BERT-Large 인코더-only 양방향 BERT-Base 확장 고성능 문장 이해 12-layer GPT-2 디코더-only 단방향 (왼→오) 다음 단어 예측 (causal LM) 텍스트 생성 (요약, 번역, 대화 등) ...

2025-05-26 · 3 min · 595 words · Huijeong Kim

Transformer Architecture - 구조와 연산 소개

‘Full Stack Optimization of Transformer Inference: a Survey’ 리뷰 시리즈 1편 Transformer Inference의 성능 병목을 이해하기 위해 ‘Full Stack Optimization of Transformer Inference: a Survey’ 논문을 읽고 있습니다. 이번 글은 본격적인 분석에 앞서 Transformer의 기본 구조와 이를 구성하는 주요 연산들을 간략히 소개합니다. 논문 링크: https://arxiv.org/abs/2302.14017 Transformer Architecture Transformer는 입력을 인코딩하는 Encoder와 출력을 생성하는 Decoder로 구성됩니다. 두 모듈 모두 Multi-Head Attention (MHA) 과 Feed-Forward Network (FFN) 으로 이루어진 Transformer Block을 반복적으로 쌓아 구현됩니다. ...

2025-05-10 · 4 min · 783 words · Huijeong Kim

빌드 스크립트 build.rs

Rust 프로젝트에서 third-party non-Rust 코드를 함께 컴파일해야 할 때 빌드 스크립트를 이용할 수 있다. 별도의 스크립트를 실행하지 않고 프로젝트에 통합할수 있다는 점이 굉장히 유용한 편! 이 스크립트를 사용하는 예제로는 bindgen, cc 등을 이용하여 non-Rust 코드를 컴파일, Rust 코드와 연결해야 할 때 gRPC, jsonschema 등을 사용해 정의된 타입을 변환할 때 등이 있다. 이 스크립트를 사용할 때 주의해야 하는 소소한 점들을 정리했다. build.rs 예제 Cargo는 컴파일 과정에서 build script를 빌드, 실행한다. 따라서 다음과 같은 빌드 스크립트는 패키지 컴파일 과정에서 hello.rs 파일을 만들게 된다. 패키지의 코드는 hello.rs 내 함수를 사용할 수 있다. ...

2024-02-02 · 4 min · 720 words · Huijeong Kim

ML Strategy 2

지난번에 이어, Andrew Ng 교수님의 “ML Strategy” 강의 이어서 정리합니다. 이번에는 ML 시스템 디버깅과 프로젝트 디자인 팁들이 소개됩니다. Error Analysis 사람이 할 수 있는 일에 대한 learning algorithm이 아직 human performance에 미치지 못한다면, machine의 mistake를 수동으로(manually) 분석하여 인사이트를 얻고 추가 개선을 해 볼 수 있습니다. 이 과정을 Error Analysis라고 합니다. Carrying Out Error Analysis Error analysis를 통해 시스템의 “어떤” 성능을 높이는 게 좋을지 찾아볼 수 있습니다. Cat classifier의 예를 들면, 전체적인 성능을 높이는 것이 아니라 “dog picture가 cat으로 분류되는 경우 줄이기(false positive 줄이기)“와 같은 구체적인 목표를 세울 수 있습니다. ...

2023-11-17 · 9 min · 1743 words · Huijeong Kim

ML Strategy 1

최근 Andrew Ng 교수님의 Deep Learning Specialization(DLS) 과정을 들었습니다. Machine Learning이라는 완전히 다른 패러다임에 적응하지 어렵고 오랫만에 보는 수식들에 정신이 없지만, 그래도 나름 재미있게 공부하고 있어요. DLS 강의 중 “ML Strategy” 강의가 특히 흥미로웠습니다. 이 강의를 통해 “ML engineering"을 어떻게 하는지 엿볼 수 있었기 때문입니다. 처음에는 ML System의 general 성능(실행속도 아닌 정확도를 의미)을 측정하는 게 불가능해 보였지만, 이 강의를 통해 ML System을 체계적으로, 전략적으로 분석, 개선하는 방법을 (조금이나마) 배울 수 있었습니다. 개인적으로 기억에 남는 강의여서 이 부분만 따로 정리해 올려봅니다. 총 2편으로 나눠집니다. ...

2023-11-09 · 9 min · 1745 words · Huijeong Kim

Jekyll to Hugo

이 블로그는 정적 사이트 생성기를 사용하여 웹페이지를 생성하고, 이를 GitHub에 올려서 hosting하고 있습니다. 그 동안은 Jekyll 을 사용하여 페이지를 생성했는데, 이번에 Hugo로 바꿔봤습니다. 어떻게 바꿨는지, 무엇이 좋았는지를 정리해 봤습니다. Why? Jekyll을 사용한 건 가장 유명한 정적 사이트 생성기이고 GitHub 에서 빌드를 해 주기 때문이었습니다. 적당한 theme 을 찾아 받고 그 위에 글을 올리고, 가끔 약간의 customize를 했습니다. 근데 사용하기가 조금 불편했습니다. 웹 지식이 부족해서인 것 같긴 하지만, 어떤 것이 생성 결과물인지, 내가 customize 하고자 하는 부분과 관련된 코드는 어디에 있는지 등을 찾기 어려웠습니다. ...

2023-06-15 · 8 min · 1628 words · Huijeong Kim

Exploring Rust Strings

안녕하세요. 오늘은 Rust의 문자열 개념을 간단하게 알아보고, 코드 작성 시 문자열 관련 혼란스러웠던 포인트들을 정리해 보고자 합니다. 1. String vs. str String 과 str 는 모두 valid UTF-8 문자열을 나타냅니다. Invalid UTF-8 데이터로 String 타입을 생성할 수 없습니다. UTF-8, Unicode 등에 대한 설명은 생략합니다. Rust에서는 C와 같이 null-terminating string 개념을 사용하지 않습니다. 대신 String 타입은 문자열과 그 길이를 갖고 있는 “fat pointer” 입니다. “fat pointer"는 raw pointer과 additional metadata (e.g., length)를 갖고 있는 포인터를 의미합니다. ...

2023-05-07 · 8 min · 1587 words · Huijeong Kim

as operator in Rust

안녕하세요. 오늘은 Rust의 as 를 사용한 type casting에 대해 알아보고자 합니다. C++ 프로그램에서는 잘못된 type 사용 으로 인한 오류를 종종 볼 수 있습니다. uint64_t 값을 uint32_t 값에 대입하여 잘못된 값으로 동작하는 경우가 그 예입니다. 조금은 어이 없는 실수이긴 한데, 생각보다 자주 발견됩니다. 이런 류의 버그는 처음 봤을 때 원인을 가늠하기 힘들기도 하지만, 고치기 귀찮거나 어렵기도 합니다. Type 재정의를 사용하지 않는 경우도 많고, 가끔씩은 통일할 필요가 크게 없는 경우도 있고, 의미 상 같은 변수를 모두 찾아내기 힘든 코드들도 종종 있습니다. 테스트를 더 잘 하면 된다고 하지만, 모든 변수에 대해 boundary test를 하는 건 현실적으로 조금 어렵습니다. ...

2023-05-02 · 8 min · 1558 words · Huijeong Kim

Polymorphism in Rust

안녕하세요. 오늘은 rust에서 polymorphism을 활용하는 방법을 정리해 보고자 합니다. cpp 코드를 작성하던 습관 대로 Rust 코드를 작성하다 보면 막히는 부분 중 하나가 interface 클래스(pure virtual class)와 이를 통한 객체 전달 부분입니다. 단순히 trait으로 변환하여 코드를 작성하다 보면 쉽게 컴파일 에러 지옥에 빠지곤 하는데요.. 아주 간단한 composite design pattern 예제를 구현해 보면서 rust의 polymorphism 에 대해 알아보도록 하겠습니다. Composite pattern 예제로 많이 사용되는 File, Directory 구조를 표현해 보고자 합니다. File은 이름과 크기를 갖고 있는 객체로, Directory는 이름과 하위 파일 및 디렉토리를 갖는 객체로, 그리고 File, Directory 는 모두 Node 라는 interface를 구현하게 만들고자 합니다. ...

2023-01-29 · 9 min · 1707 words · Huijeong Kim