프루닝은 모델에서 거의 쓰이지 않는 가중치, 뉴런, 레이어를 잘라내 더 작고 빠르게 만드는 기법으로, 메모리나 속도 제약이 있는 환경에 모델을 올려야 할 때 쓴다. 숫자 정밀도를 낮추는 양자화와 달리 모델의 일부를 아예 없앤다.
| 방식 | 무엇을 자르나 | 속도 효과 |
|---|---|---|
| 비구조적 (가중치) | 개별 가중치를 0으로 | 전용 커널이 없으면 거의 없음 |
| 반구조적 (2:4) | 가중치 4개 중 2개씩 규칙적으로 | 지원하는 GPU에서 빨라짐 |
| 구조적 | 뉴런, 어텐션 헤드, 레이어 | 일반 하드웨어에서도 빨라짐 |
파라미터는 많아도 성능에 크게 기여하는 것은 일부뿐이라는 관찰에서 출발한다.
가중치를 0으로 바꾸기만 하면 행렬 모양은 그대로여서 일반 GPU에서는 계산량이 줄지 않는다. 희소 형식으로 저장하지 않으면 파일 크기도 그대로다. 실제로 빨라지길 원한다면 구조적 프루닝이나 하드웨어가 지원하는 2:4 패턴을 고른다.
대신 비구조적 방식은 자를 위치를 자유롭게 고를 수 있어서, 같은 비율을 잘라도 성능이 덜 떨어진다. 정확도가 우선이면 비구조적 방식을, 속도가 우선이면 구조적 방식을 고른다.
LLM은 다시 학습시키는 비용이 너무 커서, 학습 없이 한 번에 자르는 방법을 주로 쓴다. SparseGPT는 레이어마다 가중치를 잘라낸 뒤 남은 가중치를 보정한다. Wanda는 가중치 크기에 입력 활성값의 크기를 곱한 점수로 중요도를 매기는데, 계산이 단순해서 빠르게 적용할 수 있다.
작업 순서는 대체로 같다. 먼저 중요도 계산에 쓸 소량의 텍스트(calibration data)를 준비한다. 다음으로 자를 비율과 패턴(비구조적, 2:4 등)을 정해 자르고, 내가 맡길 작업으로 품질을 확인한다. 품질이 많이 떨어졌다면 LoRA 같은 가벼운 파인튜닝으로 되살린다. Llama 계열을 구조적으로 프루닝할 때는 LLM-Pruner, llm-shearing 같은 도구를 쓸 수 있다.
| 기법 | 하는 일 | 추가 학습 | 특징 |
|---|---|---|---|
| 프루닝 | 덜 중요한 부분을 제거 | 필요할 때가 많음 | 구조적이면 속도 향상 |
| 양자화 | 숫자 정밀도를 낮춤 | 대개 불필요 | 가장 손쉬운 압축 |
| 증류 | 작은 모델이 큰 모델을 따라 배움 | 필수 | 비용이 크지만 효과도 큼 |
보통은 양자화부터 시도한다. 그래도 부족하면 프루닝을 더하는데, 두 기법을 함께 쓰면 하나만 쓸 때보다 더 크게 줄일 수 있다.
자르는 비율이 높아질수록 성능이 급격히 떨어지고, 작은 모델일수록 손실이 크다. 평균 점수는 비슷해 보여도 추론이나 긴 글 생성 같은 특정 능력이 먼저 무너질 수 있다. 낮은 비율부터 조금씩 올려 가며, 내가 맡길 작업으로 품질과 속도를 함께 확인하는 것이 안전하다.
가장 흔한 건 이미 학습된 모델을 배포하기 전에 줄이는 방식이다. 목표 기기와 하드웨어에 맞춰 자르는 방식을 고르고, 양자화와 함께 적용하는 경우가 많다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 스마트폰·엣지 기기 | 구조적 프루닝으로 레이어나 헤드를 줄이고 양자화까지 더해 메모리 안에 맞춘다 |
| GPU 추론 서버 | 2:4 희소성을 지원하는 GPU에서 2:4 패턴으로 잘라 처리량을 늘린다 |
| 작은 모델 만들기 | 큰 모델을 구조적으로 잘라 뼈대를 만든 뒤, 추가 학습이나 증류로 성능을 되살린다 |