Ce package se compose d'une petite bibliothèque d'extension d'opérations matricielles clairsemées optimisées avec support Autograd. Ce package se compose actuellement des méthodes suivantes:
Toutes les opérations incluses fonctionnent sur différents types de données et sont implémentées à la fois pour CPU et GPU. Pour éviter la création de torch.sparse_coo_tensor , ce package définit les opérations sur les tenseurs clairsemés en passant simplement les tenseurs index et value comme des arguments (avec les mêmes formes que définies dans Pytorch). Notez que seule value est livrée avec le support Autograd, car index est discret et donc non différenciable.
MISE À JOUR: Vous pouvez maintenant installer pytorch-sparse via Anaconda pour toutes les principales combinaisons OS / Pytorch / Cuda? Étant donné que vous avez installé pytorch >= 1.8.0 , exécutez simplement
conda install pytorch-sparse -c pyg
Nous fournissons également des roues PIP pour toutes les principales combinaisons OS / Pytorch / Cuda, voir ici.
Pour installer les binaires pour Pytorch 2.5.0, exécutez simplement
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.5.0+${CUDA}.html
où ${CUDA} doit être remplacé par cpu , cu118 , cu121 ou cu124 en fonction de votre installation Pytorch.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Fenêtre | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
Pour installer les binaires pour Pytorch 2.4.0, exécutez simplement
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html
où ${CUDA} doit être remplacé par cpu , cu118 , cu121 ou cu124 en fonction de votre installation Pytorch.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Fenêtre | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
Remarque: Des binaires des versions plus anciennes sont également fournies pour 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.0 / 1.10.1 / 1.10.2, pytorch 1.11.0, pyTTOR 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, et Pytorch 2.3.0 / 2.3.1 (suivant la même procédure). Pour les anciennes versions, vous devez spécifier explicitement le dernier numéro de version pris en charge ou installer via pip install --no-index afin d'empêcher une installation manuelle de Source. Vous pouvez rechercher le dernier numéro de version pris en charge ici.
Assurez-vous qu'au moins Pytorch 1.7.0 est installé et vérifiez que cuda/bin et cuda/include sont respectivement dans votre $PATH et $CPATH , par exemple :
$ python -c "import torch; print(torch.__version__)"
>>> 1.7.0
$ echo $PATH
>>> /usr/local/cuda/bin:...
$ echo $CPATH
>>> /usr/local/cuda/include:...
Si vous souhaitez en outre construire torch-sparse avec le support METIS, par exemple pour le partion, veuillez télécharger et installer la bibliothèque Metis en suivant les instructions du fichier Install.txt . Notez que les Métis doivent être installés avec IDXTYPEWIDTH 64 bits en modifiant include/metis.h . Ensuite, définissez la variable d'environnement WITH_METIS=1 .
Puis courez:
pip install torch-scatter torch-sparse
Lors de l'exécution dans un conteneur Docker sans pilote nvidia, Pytorch doit évaluer les capacités de calcul et peut échouer. Dans ce cas, assurez-vous que les capacités de calcul sont définies via TORCH_CUDA_ARCH_LIST , par exemple :
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)
index de tri des lignes et supprime les entrées en double. Les entrées en double sont supprimées en les dispersant ensemble. Pour la diffusion, toute opération de torch_scatter peut être utilisée.
"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)
Transpose les dimensions 0 et 1 d'une matrice clairsemée.
False , ne fuira pas la production. (par défaut: 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
Matrice Produit d'une matrice clairsemée avec une matrice dense.
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)
Produit matriciel de deux tenseurs clairsemés. Les deux matrices clairsemées d'entrée doivent être coalescées (utilisez l'attribut coalesced à la force).
True , fusionnera les deux matrices clairsemées d'entrée. (par défaut: 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 propose également une API C ++ qui contient un équivalent C ++ des modèles Python. Pour cela, nous devons ajouter TorchLib au -DCMAKE_PREFIX_PATH ( par exemple , il peut exister dans {CONDA}/lib/python{XX}/site-packages/torch si installé via conda ):
mkdir build
cd build
# Add -DWITH_CUDA=on support for CUDA support
cmake -DCMAKE_PREFIX_PATH="..." ..
make
make install