Dieses Paket besteht aus einer kleinen Erweiterungsbibliothek mit optimierten spärlichen Matrixoperationen mit Autograd -Unterstützung. Dieses Paket besteht derzeit aus den folgenden Methoden:
Alle enthaltenen Operationen arbeiten zu unterschiedlichen Datentypen und werden sowohl für CPU als auch für GPU implementiert. Um die Absaugung des Erstellens von torch.sparse_coo_tensor zu vermeiden, definiert dieses Paket Operationen auf spärlichen Tensoren, indem sie einfach index und value -Tensoren als Argumente übergeben (mit denselben Formen, wie in Pytorch definiert). Beachten Sie, dass nur value mit autodradem Unterstützung enthält, da index diskret ist und daher nicht differenzierbar ist.
UPDATE: Sie können jetzt pytorch-sparse über Anaconda für alle wichtigen OS/Pytorch/CUDA-Kombinationen installieren? Da Sie pytorch >= 1.8.0 installiert haben, fahren Sie einfach aus.
conda install pytorch-sparse -c pyg
Wir stellen alternativ PIP -Räder für alle großen OS/Pytorch/CUDA -Kombinationen zur Verfügung, siehe hier.
Um die Binärdateien für Pytorch 2.5.0 zu installieren, laufen Sie einfach aus
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.5.0+${CUDA}.html
wobei ${CUDA} je nach cpu , cu118 , cu121 oder cu124 abhängig von Ihrer Pytorch -Installation ersetzt werden sollte.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Fenster | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
Um die Binärdateien für Pytorch 2.4.0 zu installieren, laufen Sie einfach aus
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html
wobei ${CUDA} je nach cpu , cu118 , cu121 oder cu124 abhängig von Ihrer Pytorch -Installation ersetzt werden sollte.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Fenster | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
HINWEIS: Binaries älterer Versionen werden auch für Pytorch 1.4.0, Pytorch 1.5.0, Pytorch 1.6.0, Pytorch 1.7.0/1.7.1, Pytorch 1.8.0/1.8.1, Pytorch 1.9.0, Pytorch 1.10/1.10/1.10, 1,10/1.10, 1,10/1.10/1.10.2, Pytorch 1.10/1.10/1.10.2, Pytorch 1.10/1.10/1.10.2, bereitgestellt. 1.12.0/1.12.1, Pytorch 1.13.0/1.13.1, Pytorch 2.0.0/2.0.1, Pytorch 2.1.0/2.1.1/2.1.2, Pytorch 2.2.0/2.2.1/2.2.2 und Pytorch 2.3.0/2.3.1 (nach dem gleichen Verfahren). Für ältere Versionen müssen Sie explizit die neueste unterstützte Versionsnummer oder die Installation über pip install --no-index angeben, um eine manuelle Installation aus der Quelle zu verhindern. Hier können Sie die neueste unterstützte Versionsnummer nachschlagen.
Stellen Sie sicher, dass mindestens Pytorch 1.7.0 installiert ist, und überprüfen Sie, ob sich cuda/bin und cuda/include in Ihrem $PATH bzw. $CPATH befinden, z. B .:
$ python -c "import torch; print(torch.__version__)"
>>> 1.7.0
$ echo $PATH
>>> /usr/local/cuda/bin:...
$ echo $CPATH
>>> /usr/local/cuda/include:...
Wenn Sie zusätzlich torch-sparse mit METIS-Support erstellen möchten, z. B. für die Parionierung, laden Sie die Metis-Bibliothek herunter und installieren Sie die Anweisungen in der Datei Install.txt . Beachten Sie, dass Metis mit 64 -Bit IDXTYPEWIDTH durch Ändern include/metis.h installiert werden muss. Setzen Sie danach die Umgebungsvariable WITH_METIS=1 .
Dann rennen:
pip install torch-scatter torch-sparse
Wenn Pytorch in einem Docker -Container ohne NVIDIA -Treiber ausgeführt wird, muss er die Berechnungsfunktionen bewerten und möglicherweise fehlschlagen. Stellen Sie in diesem Fall sicher, dass die Rechenfunktionen über TORCH_CUDA_ARCH_LIST , z . B.:
export TORCH_CUDA_ARCH_LIST="6.0 6.1 7.2+PTX 7.5+PTX"
torch_sparse.coalesce(index, value, m, n, op="add") -> (torch.LongTensor, torch.Tensor)
Zeilenwise sortiert index und beseitigt doppelte Einträge. Doppelte Einträge werden entfernt, indem sie zusammen verstreut werden. Für die Streuung kann jeder Betrieb von torch_scatter verwendet werden.
"add" ) import torch
from torch_sparse import coalesce
index = torch . tensor ([[ 1 , 0 , 1 , 0 , 2 , 1 ],
[ 0 , 1 , 1 , 1 , 0 , 0 ]])
value = torch . Tensor ([[ 1 , 2 ], [ 2 , 3 ], [ 3 , 4 ], [ 4 , 5 ], [ 5 , 6 ], [ 6 , 7 ]])
index , value = coalesce ( index , value , m = 3 , n = 2 ) print(index)
tensor([[0, 1, 1, 2],
[1, 0, 1, 0]])
print(value)
tensor([[6.0, 8.0],
[7.0, 9.0],
[3.0, 4.0],
[5.0, 6.0]])
torch_sparse.transpose(index, value, m, n) -> (torch.LongTensor, torch.Tensor)
Transponiert die Abmessungen 0 und 1 einer spärlichen Matrix.
False eingestellt ist, vereint die Ausgabe nicht. (Standard: True ) import torch
from torch_sparse import transpose
index = torch . tensor ([[ 1 , 0 , 1 , 0 , 2 , 1 ],
[ 0 , 1 , 1 , 1 , 0 , 0 ]])
value = torch . Tensor ([[ 1 , 2 ], [ 2 , 3 ], [ 3 , 4 ], [ 4 , 5 ], [ 5 , 6 ], [ 6 , 7 ]])
index , value = transpose ( index , value , 3 , 2 ) print(index)
tensor([[0, 0, 1, 1],
[1, 2, 0, 1]])
print(value)
tensor([[7.0, 9.0],
[5.0, 6.0],
[6.0, 8.0],
[3.0, 4.0]])
torch_sparse.spmm(index, value, m, n, matrix) -> torch.Tensor
Matrixprodukt einer spärlichen Matrix mit einer dichten Matrix.
import torch
from torch_sparse import spmm
index = torch . tensor ([[ 0 , 0 , 1 , 2 , 2 ],
[ 0 , 2 , 1 , 0 , 1 ]])
value = torch . Tensor ([ 1 , 2 , 4 , 1 , 3 ])
matrix = torch . Tensor ([[ 1 , 4 ], [ 2 , 5 ], [ 3 , 6 ]])
out = spmm ( index , value , 3 , 3 , matrix ) print(out)
tensor([[7.0, 16.0],
[8.0, 20.0],
[7.0, 19.0]])
torch_sparse.spspmm(indexA, valueA, indexB, valueB, m, k, n) -> (torch.LongTensor, torch.Tensor)
Matrixprodukt von zwei spärlichen Tensoren. Beide Eingangsdarsteller müssen zusammengearbeitet werden (verwenden Sie das coalesced Attribut zur Kraft).
True eingestellt ist, vereint sie beide Eingangsdarstellermatrizen. (Standard: False ) import torch
from torch_sparse import spspmm
indexA = torch . tensor ([[ 0 , 0 , 1 , 2 , 2 ], [ 1 , 2 , 0 , 0 , 1 ]])
valueA = torch . Tensor ([ 1 , 2 , 3 , 4 , 5 ])
indexB = torch . tensor ([[ 0 , 2 ], [ 1 , 0 ]])
valueB = torch . Tensor ([ 2 , 4 ])
indexC , valueC = spspmm ( indexA , valueA , indexB , valueB , 3 , 3 , 2 ) print(indexC)
tensor([[0, 1, 2],
[0, 1, 1]])
print(valueC)
tensor([8.0, 6.0, 8.0])
pytest
torch-sparse bietet auch eine C ++-API, die C ++-Äquivalent von Python-Modellen enthält. Dafür müssen wir dem -DCMAKE_PREFIX_PATH TorchLib hinzufügen ( z . B. kann es in {CONDA}/lib/python{XX}/site-packages/torch falls über conda installiert) vorhanden:
mkdir build
cd build
# Add -DWITH_CUDA=on support for CUDA support
cmake -DCMAKE_PREFIX_PATH="..." ..
make
make install