Commit 5089052d authored by anton's avatar anton
Browse files

refactor into a python package

attempt to load dependent cpu/cuda submodules before resorting to JIT
add pyproject.toml to facilitate package install-time dependency on pytorch and ninja
add setup.py
parent d171584b
[build-system]
requires = ['setuptools>=38.2.5', 'wheel', 'torch>=1.5', 'ninja']
build-backend = "setuptools.build_meta"
\ No newline at end of file
torch>=1.5 torch>=1.5
ninja
\ No newline at end of file
from setuptools import setup #!/usr/bin/env python
import os
from setuptools import setup, find_packages
from torch.utils.cpp_extension import BuildExtension, CppExtension, CUDAExtension from torch.utils.cpp_extension import BuildExtension, CppExtension, CUDAExtension
with open('requirements.txt') as f:
requirements = f.read().splitlines()
setup( setup(
name='torch_discounted_cumsum', name='torch_discounted_cumsum',
version=0.1,
description='Fast differentiable discounted cumulative sum',
install_requires=requirements,
python_requires='>=3.6',
packages=find_packages(),
author='Anton Obukhov',
license='BSD',
url='https://www.github.com/toshas/torch-discounted-cumsum',
ext_modules=[ ext_modules=[
CppExtension('torch_discounted_cumsum_cpu', [ CppExtension(
'discounted_cumsum_cpu.cpp' 'torch_discounted_cumsum_cpu',
]), [
CUDAExtension('torch_discounted_cumsum_cuda', [ os.path.join('torch_discounted_cumsum', 'discounted_cumsum_cpu.cpp'),
'discounted_cumsum_cuda.cpp', ],
'discounted_cumsum_cuda_kernel.cu', ),
]) CUDAExtension(
'torch_discounted_cumsum_cuda',
[
os.path.join('torch_discounted_cumsum', 'discounted_cumsum_cuda.cpp'),
os.path.join('torch_discounted_cumsum', 'discounted_cumsum_cuda_kernel.cu'),
],
)
], ],
cmdclass={ cmdclass={
'build_ext': BuildExtension 'build_ext': BuildExtension
}) },
keywords=[
'pytorch', 'discounted', 'cumsum', 'cumulative', 'sum', 'scan', 'differentiable',
'reinforcement', 'learning', 'rewards', 'time', 'series'
],
)
import time import time
import torch import torch
from discounted_cumsum import discounted_cumsum_left, discounted_cumsum_right from torch_discounted_cumsum import discounted_cumsum_left, discounted_cumsum_right
def discounted_cumsum_left_gold(input, gamma): def discounted_cumsum_left_gold(input, gamma):
......
from .discounted_cumsum import discounted_cumsum_left, discounted_cumsum_right
import os
import torch import torch
from torch.utils.cpp_extension import load from torch.utils.cpp_extension import load
VERBOSE = False
def _resolve(name):
return os.path.join(os.path.dirname(os.path.realpath(__file__)), name)
torch_discounted_cumsum_cpu = load(
name='torch_discounted_cumsum_cpu',
sources=['discounted_cumsum_cpu.cpp'],
# verbose=True,
)
torch_discounted_cumsum_cuda = None try:
if torch.cuda.is_available(): import torch_discounted_cumsum_cpu
torch_discounted_cumsum_cuda = load( except ImportError:
name='torch_discounted_cumsum_cuda', if VERBOSE:
sources=['discounted_cumsum_cuda.cpp', 'discounted_cumsum_cuda_kernel.cu'], print('Falling back to JIT compiling torch_discounted_cumsum_cpu')
verbose=True, torch_discounted_cumsum_cpu = load(
name='torch_discounted_cumsum_cpu',
sources=[
_resolve('discounted_cumsum_cpu.cpp'),
],
verbose=VERBOSE,
) )
try:
import torch_discounted_cumsum_cuda
except ImportError:
if VERBOSE:
print('Falling back to JIT compiling torch_discounted_cumsum_cuda')
torch_discounted_cumsum_cuda = None
if torch.cuda.is_available():
torch_discounted_cumsum_cuda = load(
name='torch_discounted_cumsum_cuda',
sources=[
_resolve('discounted_cumsum_cuda.cpp'),
_resolve('discounted_cumsum_cuda_kernel.cu'),
],
verbose=VERBOSE,
)
def _discounted_cumsum_left_dispatcher(input, gamma): def _discounted_cumsum_left_dispatcher(input, gamma):
if not torch.is_tensor(input): if not torch.is_tensor(input):
raise ValueError('Input must be a torch.Tensor') raise ValueError('Input must be a torch.Tensor')
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment