Master | Release |
---|---|
Pytorch - Py + Nim
A Nim frontend for pytorch, aiming to be mostly auto-generated and internally using ATen.
Because Nim compiles to C++, this is not a wrapper or binding library. It generates 1-to-1 native ATen code.
The only requirement from pytorch is ATen's core tensor library. Because of this, nimtorch is extremely versatile and can compile on any kind of device.
Early stage
- Automatically generated, from
Declarations.yaml
, the full ATen API - Cuda support ( add -d:cuda when compiling with nim )
- WASM support ( add -d:wasm when compiling with nim )
- Automatically generated, from
derivatives.yaml
, gradient procs - Autograd
- Add missing derivatives
- More high level pytorch API (Module, Models etc)
- ...
The final aim is to be as compatible as possible with the pytorch API.
Ease of use of the python language while keeping fully bare metal native C++ performance
# GRUCell
gi = x.matmul(w_input.t()) + b_input
gh = hidden.matmul(w_recur.t()) + b_recur
i_r, i_i, i_n = gi.chunk(3, 1)
h_r, h_i, h_n = gh.chunk(3, 1)
resetgate = (i_r + h_r).sigmoid()
inputgate = torch.sigmoid(i_i + h_i)
newgate = (i_n + resetgate * h_n).tanh()
hy = newgate + inputgate * (hidden - newgate)
# GRUCell
let
gi = x.matmul(w_input.t()) + b_input
gh = hidden.matmul(w_recur.t()) + b_recur
(i_r, i_i, i_nn) = gi.chunk(3, 1)
(h_r, h_i, h_n) = gh.chunk(3, 1)
resetgate = (i_r + h_r).sigmoid()
inputgate = torch.sigmoid(i_i + h_i)
newgate = (i_nn + resetgate * h_n).tanh()
hy = newgate + inputgate * (hidden - newgate)
Linux: A recent distribution on par with ubuntu 18.04 in terms of libc and basic libraries, gcc compiler
macOS: We compile with 10.13 min version flags but might work even on lower versions, XCode for the compilers
Windows: Windows 10, Visual Studio Runtime 2017 and Visual Studio 2017 (any edition)
WASM: Latest Emscripten compiler and tools
Linux, macOS and Windows
conda create -n nimtorch -c fragcolor nimtorch
(add cuda10.0
for cuda 10 linux only or add wasm
for wasm version)
source activate nimtorch
or on windows: conda activate nimtorch
This will install: nim and ATen binaries, fragments and nimtorch all in one command, nothing else needed.
Make sure you use a recent version of conda and have a compiler installed in your system, on windows you have to add --cc:vcc
and be on a developer prompt.
Make sure your system is recent (ubuntu 18.04 reference / macOS High Sierra / Windows 10) and you have cuda 9.2 installed (if you need cuda, linux only, more cuda versions coming, please open a issue if you need a specific version).
Test with with something like:
nim cpp -o:test -r $ATEN/dist/pkgs/nimtorch-\#head/tests/test_xor.nim
or on windows... (because dlls need to be side by side)
nim cpp -o:%ATEN%/lib/test.exe -r %ATEN%/dist/pkgs/nimtorch-#head/tests/test_xor.nim
Linux, macOS and Windows
Check what version of ATen/PyTorch we need in conda/nimtorch/meta.yaml
- should be something like aten ==2018.10.10.1089
Note the version as you will need it in the next step
conda create -n aten -c fragcolor aten={version}
or
WASM
conda create -n aten -c fragcolor aten={version} wasm
or Cuda 10.0 (linux only)
conda create -n aten -c fragcolor aten={version} cuda10.0
activate aten environment
source activate aten
or on windows: conda activate aten
- Make sure you have a recent Nim and Nimble version in your path
- Easy option: install nim with choosenim
choosenim devel
- clone the release branch
git clone -b release https://github.com/fragcolor-xyz/nimtorch.git
cd nimtorch
nimble develop
finally
run self test nim cpp -o:test -r torch.nim
(use -o:%ATEN%/lib/test.exe
instead on windows because of dll location)
in the case of WASM:
run self test nim cpp -d:wasm -o:test.js torch.nim && node test.js
(needs node.js)
Build ATEN
pip2 install pyyaml typing
git clone -b fragcolor-devel https://github.com/fragcolor-xyz/pytorch.git
cd pytorch
git reset --hard <commit hash> # from torch/commit.txt
git submodule update --init
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DUSE_CUDA=OFF -DBUILD_ATEN_ONLY=ON -DCMAKE_INSTALL_PREFIX=`pwd`/output ../
make -j4
make install
# also copy derivatives if we want to run generator.nim or nimble test
# notice generator.nim might need python3 and pyyaml
cp ../tools/autograd/derivatives.yaml `pwd`/output/share/
Test the build
cd <nimtorch repo>
ATEN=<installation path of ATEN> nim cpp -r -f -o:/tmp/z01 torch.nim # for eg: ATEN=pathto/pytorch/build/output/
- We suggest setting
OMP_WAIT_POLICY
environment variable toPASSIVE
when running on CPU.