무슨 말인지 하나도 모르겠다 ㅠㅠ...
학습시간 09:00~01:00(당일16H/1860H)

A. 개념
B. 핵심 원리: Soft Label
[0, 1, 0])[0.1, 0.8, 0.1]), 정답이 아닌 클래스와의 관계(e.g., '고양이'가 '개'와 '자동차'보다 유사하다는 정보)까지 학습 가능C. 프로세스

A. 개념
B. Pruning 기준 (Criteria)
C. 종류 및 특징
| 구분 | Unstructured Pruning | Structured Pruning |
|---|---|---|
| 제거 단위 | 개별 가중치 | 필터, 채널 등 구조 단위 |
| 장점 | 압축률이 높고 유연함 | 일반 하드웨어에서 속도 향상 |
| 단점 | 특수 라이브러리/하드웨어 필요 가능성 | 압축률이 상대적으로 낮을 수 있음 |
D. 관련 개념: 복권 가설 (Lottery Ticket Hypothesis)

A. 개념
B. 양자화 종류
C. PyTorch 데이터 타입과 양자화
torch.float32로 표현되는 파라미터를 torch.int8과 같은 저정밀도 타입으로 변환하는 핵심 과정| 데이터 타입 | 설명 | 범위 (예시) |
|---|---|---|
torch.float32 | 32비트 부동소수점 (기본) | -3.4e38 ~ 3.4e38 |
torch.float16 | 16비트 부동소수점 | -65504 ~ 65504 |
torch.int8 | 8비트 부호 있는 정수 | -128 ~ 127 |
torch.uint8 | 8비트 부호 없는 정수 | 0 ~ 255 |

A. 목적
A. 일반적인 과정
A. 종류 및 특징
| 프레임워크 | 주요 용도 | 개발사 | 특징 |
|---|---|---|---|
| ONNX | 프레임워크 간 모델 교환 | Microsoft, Meta 등 | 다양한 프레임워크 지원, 중간 다리 역할 |
| TFLite | 모바일/임베디드 기기 | 경량화, Android/iOS 및 엣지 디바이스 | |
| TensorRT | NVIDIA GPU 추론 가속 | NVIDIA | 저지연, 고성능 추론에 최적화 |
| CoreML | Apple 기기 | Apple | iOS, macOS 등 애플 생태계에 통합 |
A. 기본 개념
B. 비트(Bit)와 바이트(Byte)
A. 부호 없는 정수 (Unsigned Integer)
00001101B. 부호 있는 정수 (Signed Integer)
000011011111001011110011A. 부동소수점 (Floating-Point)
부호(Sign), 지수(Exponent), 가수(Mantissa) 세 부분으로 나누어 저장float32는 부호 1비트, 지수 8비트, 가수 23비트로 구성됨A. 데이터 타입과 정밀도
float32 (32비트 부동소수점)로 저장됨int8 (8비트 정수) 등 더 적은 비트를 사용하는 데이터 타입으로 변환하는 과정| 데이터 타입 | 총 비트 수 | 표현 방식 | 주요 범위 | 딥러닝에서의 용도 |
|---|---|---|---|---|
uint8 | 8 | 부호 없는 정수 | 0 ~ 255 | 이미지 픽셀 값, 양자화 |
int8 | 8 | 2의 보수 정수 | -128 ~ 127 | 양자화된 가중치/활성화 |
float16 | 16 | 부동소수점 | 약 -6.5e4 ~ 6.5e4 | 혼합 정밀도 학습, 모델 경량화 |
float32 | 32 | 부동소수점 | 약 -3.4e38 ~ 3.4e38 | 일반적인 모델 가중치 (기본) |
A. MNIST 분류 모델
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 1. CNN 모델 만들기
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1)
self.relu1 = nn.ReLU()
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1)
self.relu2 = nn.ReLU()
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(in_features=64 * 7 * 7, out_features=10)
def forward(self, x):
x = self.pool1(self.relu1(self.conv1(x)))
x = self.pool2(self.relu2(self.conv2(x)))
x = x.view(-1, 64 * 7 * 7)
x = self.fc1(x)
return x
# 2. MNIST 데이터셋 학습
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
def train(model, train_loader, optimizer, criterion):
model.train()
for data, target in train_loader:
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
train(model, train_loader, optimizer, criterion)
print("MNIST 데이터셋 학습 완료!")
A. torch.nn.utils.prune 사용법
module: Pruning을 적용할 레이어 지정 (e.g., model.conv1)name: 해당 레이어에서 Pruning할 파라미터 이름 지정 (보통 'weight')amount: 제거할 파라미터의 비율 (e.g., 0.3은 30%를 의미)l1_unstructured 함수는 L1-norm 기준의 비정형 Pruning을 수행B. 영구적 제거
weight_mask가 생성되어 연산에서 제외시키는 방식prune.remove를 호출해야 마스크가 실제 가중치에 적용되어 0으로 바뀌고, 마스크 버퍼가 사라져 모델 구조가 영구적으로 변경됨import torch.nn.utils.prune as prune
module = model.conv1
prune.l1_unstructured(module, name="weight", amount=0.3)
print("프루닝 마스크 적용 후 버퍼:", list(module.named_buffers()))
prune.remove(module, 'weight')
print("Pruning 완료! 마스크 제거 후 버퍼:", list(module.named_buffers()))
A. 일반적인 순서