From a846d3aa3e6d89c44d386ea8ea02053409bd7f17 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Sat, 11 May 2024 01:45:59 -0300 Subject: [PATCH] Small fix for PiPy --- build/Makefile | 2 +- build/cpu.o | Bin 7752 -> 0 bytes build/cuda.cu.o | Bin 100448 -> 0 bytes build/tensor.o | Bin 39280 -> 0 bytes install.sh | 4 --- norch/__init__.py | 7 ++++- norch/__pycache__/__init__.cpython-38.pyc | Bin 234 -> 342 bytes norch/__pycache__/tensor.cpython-38.pyc | Bin 13809 -> 13831 bytes norch/autograd/__init__.py | 1 + {build => norch}/libtensor.so | Bin norch/norch.egg-info/PKG-INFO | 30 ---------------------- norch/norch.egg-info/SOURCES.txt | 24 ----------------- norch/norch.egg-info/dependency_links.txt | 1 - norch/norch.egg-info/top_level.txt | 3 --- norch/tensor.py | 4 +-- setup.py | 23 ++++++++++++++--- 16 files changed, 30 insertions(+), 69 deletions(-) delete mode 100644 build/cpu.o delete mode 100644 build/cuda.cu.o delete mode 100644 build/tensor.o delete mode 100755 install.sh create mode 100644 norch/autograd/__init__.py rename {build => norch}/libtensor.so (100%) delete mode 100644 norch/norch.egg-info/PKG-INFO delete mode 100644 norch/norch.egg-info/SOURCES.txt delete mode 100644 norch/norch.egg-info/dependency_links.txt delete mode 100644 norch/norch.egg-info/top_level.txt diff --git a/build/Makefile b/build/Makefile index ebc69a7..615abf7 100644 --- a/build/Makefile +++ b/build/Makefile @@ -9,7 +9,7 @@ NVCCFLAGS = -std=c++11 # Directories SRCDIR = ../norch/csrc BUILDDIR = ../build -TARGET = ../build/libtensor.so +TARGET = ../norch/libtensor.so # Files SRCS = $(wildcard $(SRCDIR)/*.cpp) diff --git a/build/cpu.o b/build/cpu.o deleted file mode 100644 index 4f63638f3a8e25f3daf19c5a114543e7cfb25859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7752 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 diff --git a/build/cuda.cu.o b/build/cuda.cu.o deleted file mode 100644 index 43c68ba59b31f398680c084e95aaf40cb8efff68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100448 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 delta 124 zcmcb{^oo%;l$V!_0SG>IS*5v6$@&r`uE}_dEhIIsIKSv6BZSMS z<)_IK#gms`l$@bg0+uRb0!rOt%FByl%`Yg)%w5S)#0C@r6Thq{{!n91%g>*z%BaY} L0u<(9D$QVOL|=z~I`1xkUI@=#hpc@&CDG!bJ!i5H=^{4S9RW%RdkYLbYlI`-QoVO|wEAn5b8T%gBQz zD^xr3Va+OPF$z#fE`be2WC!dhCYPcF4ssc;pcG}4aKZ^!R@qivaKl4WZj{4I_Mifl zMfRc^esTo@s3BLP7IkDFf~Y4~A%q5UH5$=G_9Ki4Ie=zF$u(#}E4dbJXeZa< zJT8!f=s+y1Dr!CA=%hvnUFaq^;36)O8_|PaaufQ{PYxr20dhoZ#vqbe<)u)g82Wp7 z)2I@@dSV&VmR6VbEq7~cn=xvBYZa>T)8;h`RTh=Biyqlm@>?W~4#y6+K0CX`xcudO z=NP3I(8m}~#vS?I1uid062$q-R&yCV285V@f*Q<;I{_749Lf zCmAtDK7%vUV#;t;b_iRBJJXD_)T}RQvYe&lQS}yW5cQ9Vlzid;XrHBJVUr%>)hXUX z-VEHZUE^|&k&qt((;^}FLS7?Svtg$2n_x_&jN{w>DI#x$uG7|gAuBgtM|*pV1{g`k zFeCR2Dv$0n(hM*(2H%oC&sbzEF&;8j8EcFU#v{gK#wKHn@r3bIDOQvd>x#a-qUmd! Z`ZM_@UM^#ChuI}uayULBp37J9i9eeU>p}nk delta 937 zcmY+B%TH556o>D$Qc6pqP@pgRfYO#0MU++$EAmd%NB~hn5vAoZ26Upuf_L^Ny(p=63TjfG6fzj=r)-Ihq2(1#)z)jnx_oY_P*Yu7VRTay8tj zCD*_MFWC+s{A35}P)~LufCjP)L4?R|gwaT@MFdf@2TeFg_Tmtl$vzxL3)zn&I7+TV zD`MnA(9f&kjkPHw<)bdZBMfdn~(ljtOeaSC1J#!Lj==vh}DiewbM*lS*QUWp9k z4WpU)#jLtqsg3Ag7)4(DX?EyEUYg5WL_#LYcSW}xHrcd(YmU=jZ0#Z`f7xDIFVd5! zV+Na8Tr*Xb$W-gn`sWF}_W(>#=POtW?=CLqe=J6Fqs!-MC zNQ!E%Ql}XI*GvmqM7@Mueqqk={0t+d4ZFv6hP^8J(X%WDWRrJPq~)6Tt!0juM09G9 zSEhLnIp{lQKFh-!jKcBcXW!8NK|TI^diufhKun~y?ZB82Q*x&&HM4e|WFm5t(jN6Pm(i*qB)%zT;Fjfh9Y8kghxKK`D<|WF;(>e@ GpZEiAE9yJ| diff --git a/norch/autograd/__init__.py b/norch/autograd/__init__.py new file mode 100644 index 0000000..e7d4dc0 --- /dev/null +++ b/norch/autograd/__init__.py @@ -0,0 +1 @@ +from .functions import * \ No newline at end of file diff --git a/build/libtensor.so b/norch/libtensor.so similarity index 100% rename from build/libtensor.so rename to norch/libtensor.so diff --git a/norch/norch.egg-info/PKG-INFO b/norch/norch.egg-info/PKG-INFO deleted file mode 100644 index 6adfe74..0000000 --- a/norch/norch.egg-info/PKG-INFO +++ /dev/null @@ -1,30 +0,0 @@ -Metadata-Version: 2.1 -Name: norch -Version: 0.0.1 -Summary: A deep learning framework -Home-page: https://github.com/lucasdelimanogueira/PyNorch -Author: Lucas de Lima -Author-email: nogueiralucasdelima@gmail.com -Project-URL: Bug Tracker, https://github.com/lucasdelimanogueira/PyNorch/issues -Project-URL: Repository, https://github.com/lucasdelimanogueira/PyNorch -Classifier: Programming Language :: Python :: 3 -Classifier: Operating System :: OS Independent -Requires-Python: >=3.6 -Description-Content-Type: text/markdown - -# PyNorch -Recreating PyTorch from scratch (C/C++, CUDA and Python, with GPU support and automatic differentiation!) - -# 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 -```css -$ sudo apt install nvidia-cuda-toolkit -$ git clone https://github.com/lucasdelimanogueira/PyNorch.git -$ cd build -$ make -$ cd .. -``` - -# 3 - Get started diff --git a/norch/norch.egg-info/SOURCES.txt b/norch/norch.egg-info/SOURCES.txt deleted file mode 100644 index d918a1f..0000000 --- a/norch/norch.egg-info/SOURCES.txt +++ /dev/null @@ -1,24 +0,0 @@ -README.md -install.sh -setup.py -norch/nn/__init__.py -norch/nn/activation.py -norch/nn/loss.py -norch/nn/module.py -norch/nn/parameter.py -norch/nn/modules/__init__.py -norch/nn/modules/linear.py -norch/norch.egg-info/PKG-INFO -norch/norch.egg-info/SOURCES.txt -norch/norch.egg-info/dependency_links.txt -norch/norch.egg-info/top_level.txt -norch/optim/__init__.py -norch/optim/optimizer.py -norch/optim/optimizers/__init__.py -norch/optim/optimizers/sgd.py -norch/utils/__init__.py -norch/utils/utils.py -norch/utils/utils_unittests.py -tests/test_autograd.py -tests/test_nn.py -tests/test_operations.py \ No newline at end of file diff --git a/norch/norch.egg-info/dependency_links.txt b/norch/norch.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/norch/norch.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/norch/norch.egg-info/top_level.txt b/norch/norch.egg-info/top_level.txt deleted file mode 100644 index 793c63f..0000000 --- a/norch/norch.egg-info/top_level.txt +++ /dev/null @@ -1,3 +0,0 @@ -nn -optim -utils diff --git a/norch/tensor.py b/norch/tensor.py index fc5d0de..53b8416 100644 --- a/norch/tensor.py +++ b/norch/tensor.py @@ -13,8 +13,8 @@ class CTensor(ctypes.Structure): ] class Tensor: - os.path.abspath(os.curdir) - _C = ctypes.CDLL(os.path.join(os.path.abspath(os.curdir), "build/libtensor.so")) + module_dir = os.path.dirname(os.path.abspath(__file__)) + _C = ctypes.CDLL(os.path.join(module_dir, "libtensor.so")) def __init__(self, data=None, device="cpu", requires_grad=False): diff --git a/setup.py b/setup.py index b38e402..6ebc8dd 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,26 @@ import setuptools +from setuptools.command.install import install +import subprocess with open("README.md", "r", encoding = "utf-8") as fh: long_description = fh.read() +apt_dependencies = [ + 'nvidia-cuda-toolkit' +] + +for package in apt_dependencies: + subprocess.check_call(['sudo', 'apt', 'install', package]) + +class CustomInstall(install): + def run(self): + subprocess.call(['make', '-C', 'build']) + install.run(self) + + setuptools.setup( name = "norch", version = "0.0.1", - scripts=['install.sh'], author = "Lucas de Lima", author_email = "nogueiralucasdelima@gmail.com", description = "A deep learning framework", @@ -21,7 +35,10 @@ setuptools.setup( "Programming Language :: Python :: 3", "Operating System :: OS Independent", ], - package_dir = {"": "norch"}, - packages = setuptools.find_packages(where="norch"), + packages = setuptools.find_packages(), + package_data={'norch': ['csrc/*', 'libtensor.so']}, + cmdclass={ + 'install': CustomInstall, + }, python_requires = ">=3.6" )