Este paquete consiste en una pequeña biblioteca de extensión de operaciones de matriz dispersas optimizadas con soporte de Autograd. Este paquete actualmente consta de los siguientes métodos:
Todas las operaciones incluidas funcionan en diferentes tipos de datos y se implementan tanto para CPU como para GPU. Para evitar el listón de crear torch.sparse_coo_tensor , este paquete define las operaciones de tensores dispersos simplemente pasando tensores index y value como argumentos (con las mismas formas como se definen en Pytorch). Tenga en cuenta que solo value viene con el soporte de Autograd, ya que index es discreto y, por lo tanto, no es diferenciable.
ACTUALIZACIÓN: ¿Ahora puede instalar pytorch-sparse a través de Anaconda para todas las principales combinaciones OS/Pytorch/Cuda? Dado que tiene pytorch >= 1.8.0 instalado, simplemente ejecute
conda install pytorch-sparse -c pyg
Alternativamente, proporcionamos ruedas PIP para todas las principales combinaciones de OS/Pytorch/CUDA, ver aquí.
Para instalar los binarios para Pytorch 2.5.0, simplemente ejecute
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.5.0+${CUDA}.html
Donde ${CUDA} debe ser reemplazado por cpu , cu118 , cu121 o cu124 dependiendo de su instalación de Pytorch.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Windows | ✅ | ✅ | ✅ | ✅ |
| macosa | ✅ |
Para instalar los binarios para Pytorch 2.4.0, simplemente ejecute
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html
Donde ${CUDA} debe ser reemplazado por cpu , cu118 , cu121 o cu124 dependiendo de su instalación de Pytorch.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Windows | ✅ | ✅ | ✅ | ✅ |
| macosa | ✅ |
Nota: También se proporcionan binarios de las versiones más antiguas para 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, Pytorch 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 y Pytorch 2.3.0/2.3.1 (siguiente el mismo procedimiento). Para versiones anteriores, debe especificar explícitamente el último número de versión compatible o instalar a través de pip install --no-index para evitar una instalación manual desde la fuente. Puede buscar el último número de versión compatible aquí.
Asegúrese de que al menos Pytorch 1.7.0 esté instalado y verifique que cuda/bin y cuda/include estén en su $PATH y $CPATH respectivamente, por ejemplo :
$ python -c "import torch; print(torch.__version__)"
>>> 1.7.0
$ echo $PATH
>>> /usr/local/cuda/bin:...
$ echo $CPATH
>>> /usr/local/cuda/include:...
Si desea construir además torch-sparse con el soporte de Metis, por ejemplo , para la división, descargue e instale la biblioteca METIS siguiendo las instrucciones en el archivo Install.txt . Tenga en cuenta que METIS debe instalarse con IDXTYPEWIDTH de 64 bits cambiando include/metis.h . Luego, establezca la variable de entorno WITH_METIS=1 .
Luego corre:
pip install torch-scatter torch-sparse
Cuando se ejecuta en un contenedor Docker sin controlador NVIDIA, Pytorch necesita evaluar las capacidades de cálculo y puede fallar. En este caso, asegúrese de que las capacidades de cálculo se establezcan a través de TORCH_CUDA_ARCH_LIST , EG :
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 clases en cuanto a filas y elimina entradas duplicadas. Las entradas duplicadas se eliminan esparciéndolas juntas. Para la dispersión, se puede utilizar cualquier operación de torch_scatter .
"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)
Transpone las dimensiones 0 y 1 de una matriz escasa.
False , no se unirá la producción. (predeterminado: 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
Matriz Producto de una matriz escasa con una matriz densa.
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)
Matriz Producto de dos tensores dispersos. Ambas matrices dispersas de entrada deben fusionarse (usar el atributo coalesced para la fuerza).
True , se unirá a ambas matrices dispersas. (predeterminado: 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 también ofrece una API C ++ que contiene C ++ equivalente de los modelos de Python. Para esto, necesitamos agregar TorchLib al -DCMAKE_PREFIX_PATH ( por ejemplo , puede existe en {CONDA}/lib/python{XX}/site-packages/torch si está instalado a través de conda )::
mkdir build
cd build
# Add -DWITH_CUDA=on support for CUDA support
cmake -DCMAKE_PREFIX_PATH="..." ..
make
make install