Mestre | Liberar |
---|---|
Pytorch - Py + Nim
Um frontend Nim para pytorch, com o objetivo de ser gerado principalmente automaticamente e internamente usando ATen.
Como o Nim compila para C++, este não é um wrapper ou uma biblioteca de ligação. Ele gera código Aten nativo 1 para 1.
O único requisito do pytorch é a biblioteca principal de tensores da ATen. Por isso, o nimtorch é extremamente versátil e pode compilar em qualquer tipo de dispositivo.
Estágio inicial
Declarations.yaml
, a API ATen completa derivatives.yaml
, gradiente procs O objetivo final é ser o mais compatível possível com a API pytorch.
Facilidade de uso da linguagem python, mantendo o desempenho C++ nativo totalmente bare metal
# 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 : Uma distribuição recente no mesmo nível do Ubuntu 18.04 em termos de libc e bibliotecas básicas, compilador gcc
macOS : compilamos com sinalizadores de versão de 10,13 min, mas podemos funcionar mesmo em versões inferiores, XCode para os compiladores
Windows : Windows 10, Visual Studio Runtime 2017 e Visual Studio 2017 (qualquer edição)
WASM : compilador e ferramentas Emscripten mais recentes
Linux, macOS e Windows
conda create -n nimtorch -c fragcolor nimtorch
(adicione cuda10.0
apenas para cuda 10 linux ou adicione wasm
para versão wasm)
source activate nimtorch
ou no Windows: conda activate nimtorch
Isto irá instalar: binários nim e ATen, fragmentos e nimtorch, tudo em um comando, nada mais é necessário.
Certifique-se de usar uma versão recente do conda e ter um compilador instalado em seu sistema, no Windows você deve adicionar --cc:vcc
e estar no prompt do desenvolvedor.
Certifique-se de que seu sistema seja recente (referência do Ubuntu 18.04 / macOS High Sierra / Windows 10) e que você tenha o cuda 9.2 instalado (se precisar do cuda, apenas linux, mais versões do cuda chegando, abra um problema se precisar de uma versão específica).
Teste com algo como:
nim cpp -o:test -r $ATEN/dist/pkgs/nimtorch-#head/tests/test_xor.nim
ou no windows... (porque as dlls precisam estar lado a lado)
nim cpp -o:%ATEN%/lib/test.exe -r %ATEN%/dist/pkgs/nimtorch-#head/tests/test_xor.nim
Linux, macOS e Windows
Verifique qual versão do ATen/PyTorch precisamos em conda/nimtorch/meta.yaml
- deve ser algo como aten ==2018.10.10.1089
Anote a versão, pois você precisará dela na próxima etapa
conda create -n aten -c fragcolor aten={version}
ou
WASM
conda create -n aten -c fragcolor aten={version} wasm
ou Cuda 10.0 (somente Linux)
conda create -n aten -c fragcolor aten={version} cuda10.0
ativar o ambiente aten
source activate aten
ou no Windows: conda activate aten
choosenim devel
git clone -b release https://github.com/fragcolor-xyz/nimtorch.git
cd nimtorch
nimble develop
finalmente
execute o autoteste nim cpp -o:test -r torch.nim
(use -o:%ATEN%/lib/test.exe
no Windows devido à localização da dll)
no caso do WASM:
execute o autoteste nim cpp -d:wasm -o:test.js torch.nim && node test.js
(precisa de node.js)
Construir 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/
Teste a compilação
cd <nimtorch repo>
ATEN=<installation path of ATEN> nim cpp -r -f -o:/tmp/z01 torch.nim # for eg: ATEN=pathto/pytorch/build/output/
OMP_WAIT_POLICY
como PASSIVE
ao executar na CPU.