Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 이진탐색
- 릿코드
- 연결 리스트
- 타입스크립트
- C
- 자료구조
- 스택
- 프론트엔드
- 프로세스
- alexnet
- RxJS
- APOLLO
- 알고리즘
- RT scheduling
- GraphQL
- pytorch
- 배열
- 웹팩
- vue3
- 코딩테스트
- cors
- Machine Learning
- 해시테이블
- 큐
- 연결리스트
- 프로그래머스
- 브라우저
- 포인터
- 컨테이너
- 자바스크립트
Archives
- Today
- Total
프린세스 다이어리
PyTorch DataParallel 코드구현 및 성능 비교 본문
728x90
PyTorch DataParallel 모듈을 사용하여 병렬컴퓨팅을 구현할 수 있다. 참고로 구현에 사용한 모델은 규모가 작은 AlexNet이다.
1. DataParallel 적용 전
def main():
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 데이터셋 불러오기
transform = transforms.Compose([
transforms.Resize(size=(227, 227)),
transforms.ToTensor(), #이미지를 pytorch tensors 타입으로 변형, 0.0~1.0 으로 변환
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # rgb, -1~1로 변환
])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False) # TODO: fix
# 모델 초기화 및 하이퍼파라미터 설정
model = AlexNet().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# train, test
num_epochs = 5
for epoch in range(num_epochs):
train_loss, train_acc = train(model, trainloader, criterion, optimizer, device)
test_acc = test(model, testloader, device)
print(f'epoch {epoch+1:02d}, train loss: {train_loss:.5f}, train acc: {train_acc:.5f}, test accuracy: {test_acc:.5f}')
2. DataParallel 적용 후
def main():
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 데이터셋 불러오기
transform = transforms.Compose([
transforms.Resize(size=(227, 227)),
transforms.ToTensor(), #이미지를 pytorch tensors 타입으로 변형, 0.0~1.0 으로 변환
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # rgb, -1~1로 변환
])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False) # TODO: fix
# 모델 초기화 및 하이퍼파라미터 설정
model = AlexNet().to(device)
if torch.cuda.device_count() > 1:
model = nn.DataParallel(model)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# train, test
num_epochs = 5
for epoch in range(num_epochs):
train_loss, train_acc = train(model, trainloader, criterion, optimizer, device)
test_acc = test(model, testloader, device)
print(f'epoch {epoch+1:02d}, train loss: {train_loss:.5f}, train acc: {train_acc:.5f}, test accuracy: {test_acc:.5f}')
3. 적용 전, 후의 성능 비교
Training Accuracy Avg(Baseline): 0.51755
Training Accuracy Avg(DP): 0.54058
Training Time Avg(Baseline): 12.302(sec / epoch)
Training Time Avg(DP): 6.546(sec / epoch)
DP를 적용한 결과 Epoch 당 Training Time은 Baseline 대비 -5.756 변동
DP를 적용한 결과 Training Accuracy는 Baseline 대비 +0.023 변동
4. GPU 사용량 확인
$ nvidia-smi
728x90
'AI, ML' 카테고리의 다른 글
Comments