No description
Find a file
lucasdelimanogueira 6b450a87bf fix readme
2024-05-27 15:13:03 -03:00
.github/workflows Create python-publish.yml 2024-05-10 20:21:23 -03:00
build add argument src to broadcast distributed 2024-05-25 09:38:42 -03:00
examples unit test dataloader and distributedsampler 2024-05-25 11:55:59 -03:00
norch fix distributed dataloader 2024-05-27 15:08:27 -03:00
tests fix distributed dataloader 2024-05-27 15:09:07 -03:00
.gitmodules broadcast allreduce nccl 2024-05-24 18:19:39 -03:00
README.md fix readme 2024-05-27 15:13:03 -03:00
setup.py fix setup.py installing 2024-05-24 20:31:31 -03:00
train.py fix distributed dataloader 2024-05-27 15:08:27 -03:00

PyNorch

Recreating PyTorch from scratch (C/C++, CUDA and Python, with GPU support and automatic differentiation!)

Project details explanations can also be found on medium.

1 - About

PyNorch is a deep learning framework constructed using C/C++, CUDA and Python. This is a personal project with educational purpose only! Norch means NOT PyTorch, and we have NO claims to rivaling the already established PyTorch. The main objective of PyNorch was to give a brief understanding of how a deep learning framework works internally. It implements the Tensor object, GPU support and an automatic differentiation system.

2 - Installation

Install this package from PyPi (you can test on Colab!)

$ pip install norch

or from cloning this repository

$ sudo apt install nvidia-cuda-toolkit
$ git clone https://github.com/lucasdelimanogueira/PyNorch.git
$ cd build
$ make
$ cd ..

3 - Get started

3.1 - Tensor operations

import norch

x1 = norch.Tensor([[1, 2], 
                  [3, 4]], requires_grad=True).to("cuda")

x2 = norch.Tensor([[4, 3], 
                  [2, 1]], requires_grad=True).to("cuda)

x3 = x1 @ x2
result = x3.sum()
result.backward

print(x1.grad)

3.2 - Create a model

import norch
import norch.nn as nn
import norch.optim as optim

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(1, 10)
        self.sigmoid = nn.Sigmoid()
        self.fc2 = nn.Linear(10, 1)

    def forward(self, x):
        out = self.fc1(x)
        out = self.sigmoid(out)
        out = self.fc2(out)
        
        return out

3.3 - Example training

import norch
from norch.utils.data.dataloader import DataLoader
from norch.norchvision import transforms
import norch
import norch.nn as nn
import norch.optim as optim
import random
random.seed(1)

BATCH_SIZE = 32
device = "cuda" #cpu
epochs = 10

transform = transforms.Compose(
    [
        transforms.ToTensor(),
        transforms.Reshape([-1, 784, 1])
    ]
)

target_transform = transforms.Compose(
    [
        transforms.ToTensor()
    ]
)

train_data, test_data = norch.norchvision.datasets.MNIST.splits(transform=transform, target_transform=target_transform)
train_loader = DataLoader(train_data, batch_size = BATCH_SIZE)

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(784, 30)
        self.sigmoid1 = nn.Sigmoid()
        self.fc2 = nn.Linear(30, 10)
        self.sigmoid2 = nn.Sigmoid()

    def forward(self, x):
        out = self.fc1(x)
        out = self.sigmoid1(out)
        out = self.fc2(out)
        out = self.sigmoid2(out)
        
        return out

model = MyModel().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
loss_list = []

for epoch in range(epochs):    
    for idx, batch in enumerate(train_loader):

        inputs, target = batch

        inputs = inputs.to(device)
        target = target.to(device)

        outputs = model(inputs)
        
        loss = criterion(outputs, target)
        
        optimizer.zero_grad()
        
        loss.backward()

        optimizer.step()

    print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss[0]:.4f}')
    loss_list.append(loss[0])

4 - Progress

Development Status Feature
Operations in progress
  • [X] GPU Support
  • [X] Autograd
  • [X] Broadcasting
  • [ ] Memory Management
Loss in progress
  • [x] MSE
  • [X] Cross Entropy
Data in progress
  • [X] Dataset
  • [X] Batch
  • [X] Iterator
Convolutional Neural Network in progress
  • [ ] Conv2d
  • [ ] MaxPool2d
  • [ ] Dropout
Distributed in progress
  • [ ] All-reduce
  • [X] DistributedSampler
  • [ ] DistributedDataParallel