레이블이 pytorch인 게시물을 표시합니다. 모든 게시물 표시
레이블이 pytorch인 게시물을 표시합니다. 모든 게시물 표시

2024년 7월 29일 월요일

PyTorch vs Tensorflow 코드 비교

목표는 파이토치로 모델을 구현하고 안드로이드용 모바일 버전 포팅 시에만 TFLite로 변환
공부하다 보니 근본적인 구조는 비슷한 것 같다.

간단한 모델 비교: PyTorch 버전

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# 데이터셋 생성
x_data = torch.randn(100, 10)
y_data = torch.randint(0, 2, (100, 1)).float()
dataset = TensorDataset(x_data, y_data)
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)

# 모델 정의
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.layer = nn.Linear(10, 1)
    
    def forward(self, x):
        return torch.sigmoid(self.layer(x))

model = SimpleNN()

# 손실 함수 및 최적화
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 학습 루프
for epoch in range(100):
    for batch_x, batch_y in dataloader:
        # 순전파
        outputs = model(batch_x)
        loss = criterion(outputs, batch_y)
        
        # 역전파 및 최적화
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
    if (epoch + 1) % 10 == 0:
        print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')

# 추론
with torch.no_grad():
    new_data = torch.randn(5, 10)
    predictions = model(new_data)
    print(predictions)


같은 모델의 Tensorflow 구현버전

import tensorflow as tf

# 데이터셋 생성
x_data = tf.random.normal([100, 10])
y_data = tf.random.uniform([100, 1], minval=0, maxval=2, dtype=tf.int32)

dataset = tf.data.Dataset.from_tensor_slices((x_data, y_data))
dataset = dataset.batch(10).shuffle(100)

# 모델 정의
class SimpleNN(tf.keras.Model):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.layer = tf.keras.layers.Dense(1, activation='sigmoid')
    
    def call(self, x):
        return self.layer(x)

model = SimpleNN()

# 손실 함수 및 최적화
criterion = tf.keras.losses.BinaryCrossentropy()
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)

# 학습 루프
for epoch in range(100):
    for batch_x, batch_y in dataset:
        with tf.GradientTape() as tape:
            outputs = model(batch_x)
            loss = criterion(batch_y, outputs)
        
        grads = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(grads, model.trainable_variables))
    
    if (epoch + 1) % 10 == 0:
        print(f'Epoch [{epoch+1}/100], Loss: {loss.numpy():.4f}')

# 추론
new_data = tf.random.normal([5, 10])
predictions = model(new_data)
print(predictions)

2024년 7월 23일 화요일

Transformer Model 직접 구현해보기 튜토리얼

Build your own Transformer from scratch using Pytorch


Building a Transformer model step by step in Pytorch


Pytorch를 이용해서 트랜스포머 모델을 밑바닥부터 구현해보는 예제

medium 블로그에 해외 저자가 쓴 튜토리얼인데 번역기 돌려도 읽을만 하고 천천히 공부하기에 좋아 보인다.

“Attention is All You Need” 논문이 나온지 오래 지났지만 어쨌든 아직도 많이 사용되고 언어모델 외에도 광범위하게 활용되고 있기 때문에 코드까지 공부하고 지나가면 도움이 많이 될 것 같다.


2024년 4월 5일 금요일

VITS2 코드 Windows에서 실행해보기

VITS2 논문 구현 코드 실행기


소스코드는 다른 분이 구현한 코드도 있지만 아래 github 링크의 코드로 실행함

https://github.com/p0p4k/vits2_pytorch

- Dataset: LJSpeech

- Windows에서 특정 디렉토리로 심볼릭 링크는 mklink /d 명령어를 이용한다. cmd에서 되고 powershell에서는 없는 명령어라 나옴.

- Monotonic Alignment 툴 빌드중 에러가 난다면 MS Visual Studio의 build tool을 설치해주면 된다.


1. Windows에서 espeak 설치

여기에서 x64용 msi파일을 다운로드받음.

https://github.com/espeak-ng/espeak-ng/releases

(espeak-ng-X64.msi)

참고로 sourceforage에 있는 espeak 설치본은 깔아봐도(SAPI5 어쩌고 있는 패키지) 해결 불가

msi 패키지를 설치했으나 이런 에러가 나온다. 설치만 하면 끝이 아니고 환경변수 설정이 필요함.


환경변수 설정(msi패키지에서 시스템에 설치해서 나도 그냥 시스템 환경변수에다 함)

시작메뉴의 찾기 입력란(돋보기 아이콘 있는 칸)에 path를 타이핑하면 설정 메뉴가 바로 뜸






x64버전으로 설치했으므로 Program Files (x86) 이 아닌 그냥 Program Files 경로로 설정

PHONEMIZER_ESPEAK_LIBRARY=”C:\Program Files\eSpeak NG\libespeak-ng.dll” (default path)


“파일 찾아보기” 버튼을 클릭해서 .dll파일명까지 포함한 전체경로를 값으로 설정

PHONEMIZER_ESPEAK_PATH=”C:\Program Files\eSpeak NG”


“디렉터리 찾아보기” 버튼을 클릭해서 폴더 경로까지만 값으로 설정

환경변수 설정 후 다시 실행했더니 넘어간다. (안되면 재부팅 후 시도)


2. NVidia CUDA 관련

그다음은 NVidia cuda 관련 에러들이다

torch.cuda.is_available() == false로 나옴

torch 패키지를 지우고 cuda 버전에 맞춰 다시 설치

아래는 pytorch 홈페이지에서 내 환경에 맞춰 만들어준 명령어

(https://pytorch.org/get-started/locally/)

Windows + pycharm pip + cuda 12.1

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121


그다음은 NCCL 관련 에러

RuntimeError: Distributed package doesn't have NCCL built in

아래 코드와 관련된 에러였음

dist.init_process_group(backend="nccl", init_method="env://", world_size=n_gpus, rank=rank)


NCCL 다운로드 페이지에 가서 로그인 후(NVIDIA 계정 가입 필요) 설문양식 제출까지 해야 다운로드 시켜줌

찾아보니 Windows에서 NCCL 분산GPU 설정은 아직 pytorch에서 지원하지 않는다고 한다. 우분투 등은 지원함. 다음번엔 Docker로 도전

일단 “nccl”을 “gloo”로 바꾸고 시작

(gloo는 분산 cpu 사용, backend설정과 CPU/GPU 사용여부 테이블은 https://pytorch.org/docs/stable/distributed.html 참조)

json파일에 "use_duration_discriminator": true, 라고 해놓고 type이 기재가 안되어있었음

바로 아래 줄에 type 추가

"duration_discriminator_type": "dur_disc_1",


다시 실행했더니 성공했다.

돌다가 메모리 부족으로 튕기면 batch size를 낮춰주면 된다.


2023년 10월 20일 금요일

구글 Colab에서 구글드라이브 내부 경로 접근하기

1. 드라이브 임포트 및 마운트

from google.colab import drive
drive.mount('/content/gdrive')


2. 내가 만든 폴더로 경로 이동하기

보통 '내 드라이브'가 구글 드라이브의 최상위 경로일 것이다.
그 아래 'data'라는 폴더를 생성했다고 가정할 경우

내 드라이브 > data


cd /content/gdrive/My Drive/data

코드창에서 위와 같이 입력하고 실행한다.
프롬프트는 아니지만 프롬프트에서 입력한 것처럼 작동함.

2023년 10월 19일 목요일

파이토치 공부중 next() 함수 에러

데이터셋에서 미니배치를 불러올 때 예제코드대로 했더니 .next()함수에서 에러가 발생

dataiter1 = iter(train_loader1)
images1, labels1 = dataiter1.next()
print(images1.size())   # 배치 사이즈 확인


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-53a15405132b> in <cell line: 2>()
      1 dataiter1 = iter(train_loader1)
----> 2 images1, labels1 = dataiter1.next()
      3 print(images1.size())   # 배치 사이즈 확인

AttributeError: '_SingleProcessDataLoaderIter' object has no attribute 'next'


최신 버전에서는 객체의 next() 함수로 쓰는 게 아니라 그냥 next() 안에 인자로 넣어줘야 했음


dataiter1.next() 를 아래 코드처럼 next(dataiter1) 로 수정했더니 해결

dataiter1 = iter(train_loader1)
images1, labels1 = next(dataiter1)
print(images1.size())   # 배치 사이즈 확인

2023년 9월 22일 금요일

1d convolution 설명 잘 된 블로그(PyTorch 기반)

https://sanghyu.tistory.com/24

꼭 PyTorch를 쓰지 않더라도 설명이 친절하게 잘 되어 있어서 참고용으로 좋음.