
Inference Engineering Zero to Hero란?
Inference Engineering Zero to Hero는 대규모 언어 모델 서빙을 뒷받침하는 런타임 시스템을 이해하기 위한 실습 중심의 과정 저장소입니다. 모델 학습이나 품질 개선에 집중하는 대신, 요청이 LLM에 도달한 이후 어떤 일이 일어나는지 살펴봅니다.
이 프로젝트는 가장 작은 단위의 유용한 추론 작업에서 시작해 점차 소형 추론 런타임으로 발전합니다. 진행 순서는 다음과 같습니다.
토큰화 → 프리필 → 디코드 → KV 캐시 → 샘플링 → 요청 상태 → 스케줄링 → 연속 배칭 → 메모리 관리 → 서빙 엔진 내부 구조
구현 우선 접근 방식은 텐서, 생성 결과, 캐시 상태, 메모리 사용량을 직접 확인하는 데 중점을 둡니다. 이를 통해 모델 연산을 지연 시간, 처리량, GPU 활용률, 메모리 소비량과 같은 실제 서빙 문제와 연결할 수 있습니다.
배우게 될 내용
이 과정은 LLM 추론을 시스템 관점에서 이해하는 사고 모델을 기르도록 설계되었습니다. 주요 주제는 다음과 같습니다.
- 토큰화: 프롬프트가 모델이 처리하는 토큰 ID로 변환되는 방식
- 프리필: 모델이 초기 프롬프트를 처리하고 생성을 위해 필요한 상태를 만드는 방식
- 디코드: 이후 토큰이 한 번에 하나씩 생성되는 방식
- KV 캐싱: 어텐션 상태가 증가하고 불필요한 재계산을 방지하는 방식
- 샘플링: 모델 출력 점수에서 토큰을 선택하는 방식
- 요청 상태: 런타임이 프롬프트, 생성된 토큰, 완료 상태를 추적하는 방식
- 스케줄링: 엔진이 처리할 요청을 결정하는 방식
- 연속 배칭: 활성 요청이 시스템에 들어오고 나갈 때 이를 효율적으로 결합하는 방식
- 메모리 관리: GPU 메모리가 사용되는 위치와 캐시 구성이 용량에 미치는 영향
- 서빙 엔진 내부 구조: 효율성을 높이는 시스템이 모델 실행을 둘러싸는 방식
과정 상태 및 구성
저장소는 Beginner, Intermediate, Advanced 레벨로 나뉩니다. 현재는 Beginner 트랙이 진행 중이며, Intermediate와 Advanced 자료는 아직 제공되지 않습니다.
제공되는 챕터
- Chapter 01: 처음부터 이해하는 수동 LLM 추론 —
beginner/01_manual_llm_inference/에서 제공됩니다.
예정된 Beginner 챕터
- 샘플링
- 요청 상태
- 간단한 스케줄러
- 연속 배칭
- KV 캐시 관리
- 페이지드 또는 블록 KV 캐시
- 프리픽스 캐싱
- 추론 벤치마킹
로드맵은 의도적으로 유연하게 구성되어 있습니다. 구현 과정에서 새로운 문제가 발견되면 챕터가 추가, 삭제, 분리 또는 순서 변경될 수 있습니다.
설치 및 설정
저장소 README에는 고정된 의존성 설치 명령이나 환경 사양이 제공되지 않습니다. 먼저 저장소를 다운로드하거나 클론한 다음, 설치 또는 실행에 앞서 Chapter 1에 포함된 파일과 지침을 확인하세요.
- GitHub 저장소의 로컬 사본을 준비합니다.
- 터미널, 에디터 또는 노트북 환경에서 저장소 디렉터리를 엽니다.
beginner/01_manual_llm_inference/로 이동합니다.- 챕터별 지침을 읽고 해당 디렉터리의 노트북을 확인합니다.
- 챕터 자료에서 요청하는 의존성만 설치합니다.
- 노트북을 열고 셀을 순서대로 실행합니다.
beginner/01_manual_llm_inference/README에는 정확한 패키지 버전, 하드웨어 요구 사항 또는 설치 명령이 명시되어 있지 않으므로, 런타임 설정에 대해서는 챕터 노트북을 권위 있는 기준으로 사용하세요.
기본 사용법: 수동 추론 따라 하기
Chapter 1부터 시작하는 것을 권장합니다. 이 챕터의 목적은 완성된 서빙 API 뒤에 생성을 숨기는 대신, 처음부터 수동 LLM 추론을 살펴보는 것입니다.
1단계: 노트북을 순서대로 진행하기
노트북을 처음부터 끝까지 실행합니다. 설정 또는 검사 셀을 건너뛰지 마세요. 이후 작업이 앞에서 생성된 모델 객체, 토큰화된 입력 또는 캐시된 상태에 의존할 수 있기 때문입니다.
2단계: 프롬프트 추적하기
입력 프롬프트가 추론 과정을 거치며 어떻게 변하는지 관찰합니다. 개념적으로 다음과 같이 추적할 수 있습니다.
프롬프트 텍스트
→ 토큰 ID
→ 프롬프트 처리 또는 프리필
→ 다음 토큰 점수
→ 선택된 토큰
→ 업데이트된 시퀀스
→ 디코드 반복노트북에서 텐서 형태와 토큰 수를 표시하는 경우 이를 기록하세요. 전체 프롬프트를 처리하는 것과 토큰 하나를 추가로 생성하는 것의 차이를 더 쉽게 이해할 수 있습니다.
3단계: 프리필과 디코드 분리하기
프리필은 프롬프트를 처리하고 생성에 필요한 상태를 설정합니다. 디코드는 토큰을 추가로 점진적으로 생성합니다. 이 둘을 별도의 단계로 다루는 것은 서로 다른 계산 및 메모리 특성을 가지므로 중요합니다.
노트북을 실행하면서 다음 질문을 살펴보세요.
- 프리필 중 처리되는 입력 토큰은 몇 개인가?
- 각 디코드 단계에서 전달되는 입력은 무엇인가?
- 새 토큰이 생성된 후 어떤 텐서가 변경되는가?
- 다시 계산하지 않고 재사용할 수 있는 상태는 무엇인가?
4단계: 출력 직접 확인하기
토큰 ID를 디코드된 텍스트와 비교하고, 노트북에서 허용하는 경우 중간 출력도 확인합니다. 목표는 단순히 텍스트를 생성하는 것이 아니라, 해당 텍스트를 만들어 내는 연산 순서를 이해하는 것입니다.
런타임 모델 이해하기
이 저장소를 이해하는 유용한 방법은 생성을 단일 모델 호출이 아니라 상태를 유지하는 반복 과정으로 보는 것입니다.
요청 준비
프롬프트 처리
재사용 가능한 상태 저장
다음 토큰 선택
요청 상태 업데이트
완료될 때까지 반복이러한 관점은 이후 장을 학습할 준비를 하게 해 줍니다. 샘플링은 선택할 토큰을 결정하고, 요청 상태는 각 생성을 추적하며, 스케줄링은 작업을 선택하고, 연속 배칭은 여러 활성 요청의 작업을 결합합니다.
고급 학습 팁
셰이프, 상태, 메모리를 함께 추적하기
텐서를 개별적으로만 살펴보지 마세요. 중요한 연산마다 입력 셰이프, 출력 셰이프, 시퀀스 길이, 캐시 상태, 예상 메모리 증가량을 기록하세요. 이렇게 하면 수학적 모델 실행과 시스템 동작을 연결할 수 있습니다.
프롬프트 길이와 디코딩 길이 비교하기
이 장에서 입력을 변경할 수 있다면 짧고 긴 프롬프트와 짧고 긴 생성을 비교하세요. 프리필 중에 발생하는 비용과 디코딩 중 누적되는 비용이 무엇인지 관찰하세요. 측정 결과가 보여 주는 범위를 넘어 벤치마크 결론을 일반화하지 마세요.
요청 상태 표 만들기
전용 요청 상태 장을 학습할 수 있게 되기 전에도 다음과 같은 필드로 관찰 내용을 정리할 수 있습니다.
- 입력 토큰 ID
- 생성된 토큰 ID
- 현재 시퀀스 길이
- 캐시 상태
- 생성 상태
이는 현재 저장소가 약속하는 기능이 아니라 학습 기법입니다. 이 방법을 사용하면 추론 엔진에 모델 자체를 둘러싼 시스템이 필요한 이유를 파악하는 데 도움이 됩니다.
최적화하기 전에 측정하기
로드맵에는 추론 벤치마킹에 관한 장이 추가될 예정입니다. 해당 장을 학습할 수 있을 때까지는 실험을 통제된 방식으로 진행하세요. 한 번에 하나의 입력 또는 생성 조건만 변경하고, 관찰 결과를 기록하며, 측정된 동작과 가정을 구분하세요.
이전 장 다시 살펴보기
샘플링, 스케줄링, 배칭, 캐시 관리 장이 추가되면 수동 추론을 다시 살펴보세요. 각각의 새로운 추상화를 원래의 토큰 생성 루프와 연결해 보면 최적화가 실제 모델 실행에 기반을 두도록 할 수 있습니다.
현재 제한 사항
현재 이용 가능한 항목으로는 첫 번째 Beginner 장만 등록되어 있습니다. 샘플링, 스케줄러, 연속 배칭, 캐시 관리 전략, 벤치마킹, Intermediate 및 Advanced 트랙은 아직 계획 단계입니다. 따라서 이 저장소는 완성된 추론 엔진 프레임워크가 아니라 계속 발전하는 강좌로 간주해야 합니다.
결론
Inference Engineering Zero to Hero는 LLM의 런타임 측면을 학습할 수 있는 실용적인 경로를 제공합니다. beginner/01_manual_llm_inference/에서 시작해 노트북을 순서대로 실행하고, 프롬프트, 토큰, 텐서, 재사용 가능한 상태가 생성 과정에서 어떻게 이동하는지에 집중하세요. 이 기반을 갖추면 스케줄링, 배칭, 메모리, 서빙 엔진 내부 구조에 관한 예정된 학습 내용을 더 쉽게 이해할 수 있습니다.
