Este pacote consiste em uma pequena biblioteca de extensão de operações de matriz esparsa otimizada com suporte automático. Atualmente, este pacote consiste nos seguintes métodos:
Todas as operações incluídas funcionam em diferentes tipos de dados e são implementadas para CPU e GPU. Para evitar o hab de criar torch.sparse_coo_tensor , este pacote define operações em tensores esparsos, simplesmente passando index e value tensores como argumentos (com as mesmas formas definidas em Pytorch). Observe que apenas value vem com o suporte do AutoGRAD, pois index é discreto e, portanto, não é diferenciável.
ATUALIZAÇÃO: Agora você pode instalar pytorch-sparse via Anaconda para todas as principais combinações OS/Pytorch/Cuda? Dado que você tem pytorch >= 1.8.0 instalado, basta executar
conda install pytorch-sparse -c pyg
Alternativamente, fornecemos rodas PIP para todas as principais combinações de OS/Pytorch/Cuda, veja aqui.
Para instalar os binários para Pytorch 2.5.0, basta executar
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.5.0+${CUDA}.html
onde ${CUDA} deve ser substituído por cpu , cu118 , cu121 ou cu124 dependendo da instalação do Pytorch.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Windows | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
Para instalar os binários para Pytorch 2.4.0, basta executar
pip install torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html
onde ${CUDA} deve ser substituído por cpu , cu118 , cu121 ou cu124 dependendo da instalação do Pytorch.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Windows | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
Note: Binaries of older versions are also provided for 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 e pytorch 2.3.0/2.3.1 (seguindo o mesmo procedimento). Para versões mais antigas, você precisa especificar explicitamente o número mais recente da versão suportada ou instalação via pip install --no-index para impedir que uma instalação manual da fonte. Você pode procurar o número mais recente da versão suportada aqui.
Certifique -se de que pelo menos o Pytorch 1.7.0 esteja instalado e verifique se cuda/bin e cuda/include estão no seu $PATH e $CPATH , respectivamente, por exemplo :
$ python -c "import torch; print(torch.__version__)"
>>> 1.7.0
$ echo $PATH
>>> /usr/local/cuda/bin:...
$ echo $CPATH
>>> /usr/local/cuda/include:...
Se você deseja criar adicionalmente torch-sparse com suporte do Metis, por exemplo , para parção, faça o download e instale a biblioteca Metis seguindo as instruções no arquivo Install.txt . Observe que o Metis precisa ser instalado com IDXTYPEWIDTH de 64 bits alterando include/metis.h . Posteriormente, defina a variável de ambiente WITH_METIS=1 .
Em seguida, corra:
pip install torch-scatter torch-sparse
Ao executar em um contêiner do Docker sem motorista da NVIDIA, o Pytorch precisa avaliar os recursos de computação e pode falhar. Nesse caso, verifique se os recursos de computação são definidos via TORCH_CUDA_ARCH_LIST , por exemplo :
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 classificação em linha e remove as entradas duplicadas. As entradas duplicadas são removidas espalhando -as juntas. Para dispersão, qualquer operação do torch_scatter pode ser usada.
"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)
Transpõe as dimensões 0 e 1 de uma matriz esparsa.
False , não coalesce a produção. (Padrão: 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
Produto matricial de uma matriz esparsa com uma 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)
Produto matricial de dois tensores esparsos. Ambas as matrizes esparsas de entrada precisam ser coalescedentes (use o atributo coalesced para forçar).
True , coalescerá as duas matrizes esparsas de entrada. (Padrão: 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 também oferece uma API C ++ que contém C ++ equivalente aos modelos Python. Para isso, precisamos adicionar TorchLib ao -DCMAKE_PREFIX_PATH ( por exemplo , ele pode existir em {CONDA}/lib/python{XX}/site-packages/torch se instalado via conda ):
mkdir build
cd build
# Add -DWITH_CUDA=on support for CUDA support
cmake -DCMAKE_PREFIX_PATH="..." ..
make
make install