Master | Freigeben |
---|---|
Pytorch - Py + Nim
Ein Nim-Frontend für Pytorch, das größtenteils automatisch generiert werden soll und intern ATen verwendet.
Da Nim nach C++ kompiliert, handelt es sich hierbei nicht um eine Wrapper- oder Bindungsbibliothek. Es generiert 1-zu-1 nativen ATen-Code.
Die einzige Anforderung von Pytorch ist die Tensor-Kernbibliothek von ATen. Aus diesem Grund ist Nimtorch äußerst vielseitig und kann auf jedem Gerät kompiliert werden.
Frühes Stadium
Declarations.yaml
die vollständige ATen-API derivatives.yaml
Das Endziel besteht darin, so kompatibel wie möglich mit der Pytorch-API zu sein.
Benutzerfreundlichkeit der Python-Sprache unter Beibehaltung der nativen Bare-Metal-C++-Leistung
# 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 : Eine aktuelle Distribution, die Ubuntu 18.04 in Bezug auf libc und Basisbibliotheken sowie den GCC-Compiler ebenbürtig ist
macOS : Wir kompilieren mit 10,13-Minuten-Versionsflags, funktionieren aber möglicherweise auch mit niedrigeren Versionen, XCode für die Compiler
Windows : Windows 10, Visual Studio Runtime 2017 und Visual Studio 2017 (beliebige Edition)
WASM : Neuester Emscripten-Compiler und -Tools
Linux, macOS und Windows
conda create -n nimtorch -c fragcolor nimtorch
(fügen Sie cuda10.0
nur für cuda 10 Linux hinzu oder fügen Sie wasm
für die wasm-Version hinzu)
source activate nimtorch
oder unter Windows: conda activate nimtorch
Dadurch werden Folgendes installiert: nim- und ATen-Binärdateien, Fragmente und nimtorch, alles in einem Befehl, es ist nichts anderes erforderlich.
Stellen Sie sicher, dass Sie eine aktuelle Version von Conda verwenden und einen Compiler auf Ihrem System installiert haben. Unter Windows müssen Sie --cc:vcc
hinzufügen und sich an einer Entwickleraufforderung befinden.
Stellen Sie sicher, dass Ihr System aktuell ist (Ubuntu 18.04-Referenz / macOS High Sierra / Windows 10) und Sie Cuda 9.2 installiert haben (wenn Sie Cuda benötigen, nur Linux, weitere Cuda-Versionen folgen, öffnen Sie bitte eine Ausgabe, wenn Sie eine bestimmte Version benötigen).
Testen Sie mit etwas wie:
nim cpp -o:test -r $ATEN/dist/pkgs/nimtorch-#head/tests/test_xor.nim
oder unter Windows ... (weil DLLs nebeneinander sein müssen)
nim cpp -o:%ATEN%/lib/test.exe -r %ATEN%/dist/pkgs/nimtorch-#head/tests/test_xor.nim
Linux, macOS und Windows
Überprüfen Sie, welche Version von ATen/PyTorch wir in conda/nimtorch/meta.yaml
benötigen – sollte etwa aten ==2018.10.10.1089
lauten
Notieren Sie sich die Version, da Sie diese im nächsten Schritt benötigen
conda create -n aten -c fragcolor aten={version}
oder
WASM
conda create -n aten -c fragcolor aten={version} wasm
oder Cuda 10.0 (nur Linux)
conda create -n aten -c fragcolor aten={version} cuda10.0
Aten-Umgebung aktivieren
source activate aten
oder unter Windows: conda activate aten
choosenim devel
git clone -b release https://github.com/fragcolor-xyz/nimtorch.git
cd nimtorch
nimble develop
Endlich
Führen Sie den Selbsttest nim cpp -o:test -r torch.nim
aus (verwenden Sie aufgrund des DLL-Speicherorts stattdessen -o:%ATEN%/lib/test.exe
unter Windows)
im Fall von WASM:
Selbsttest ausführen nim cpp -d:wasm -o:test.js torch.nim && node test.js
(benötigt node.js)
Baue 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/
Testen Sie den 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/
OMP_WAIT_POLICY
auf PASSIVE
zu setzen, wenn sie auf der CPU ausgeführt wird.