Paket ini terdiri dari perpustakaan ekstensi kecil dari algoritma cluster grafik yang sangat dioptimalkan untuk penggunaan di Pytorch. Paket ini terdiri dari algoritma pengelompokan berikut:
Semua operasi yang disertakan bekerja pada berbagai jenis data dan diimplementasikan baik untuk CPU dan GPU.
UPDATE: Anda sekarang dapat menginstal pytorch-cluster melalui Anaconda untuk semua kombinasi OS/Pytorch/CUDA utama? Mengingat bahwa Anda memiliki pytorch >= 1.8.0 diinstal, cukup jalankan
conda install pytorch-cluster -c pyg
Kami alternatif menyediakan roda PIP untuk semua kombinasi OS/Pytorch/CUDA utama, lihat di sini.
Untuk menginstal binari untuk Pytorch 2.5.0, cukup jalankan
pip install torch-cluster -f https://data.pyg.org/whl/torch-2.5.0+${CUDA}.html
Di mana ${CUDA} harus diganti dengan cpu , cu118 , cu121 , atau cu124 tergantung pada instalasi Pytorch Anda.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Windows | ✅ | ✅ | ✅ | ✅ |
| MacOS | ✅ |
Untuk menginstal binari untuk Pytorch 2.4.0, cukup jalankan
pip install torch-cluster -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html
Di mana ${CUDA} harus diganti dengan cpu , cu118 , cu121 , atau cu124 tergantung pada instalasi Pytorch Anda.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Windows | ✅ | ✅ | ✅ | ✅ |
| MacOS | ✅ |
Catatan: Binari versi yang lebih lama juga disediakan untuk 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.10.10.11.110.110.110.110.11.110.11.11.11.11, pyorch 1.10.10.10.110.11.110.11.110.11.110.11.11/1.10.11. 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, dan Pytorch 2.3.0/2.3.1 (mengikuti PROSIS yang sama). Untuk versi yang lebih lama, Anda perlu secara eksplisit menentukan nomor versi yang didukung terbaru atau menginstal melalui pip install --no-index untuk mencegah instalasi manual dari sumber. Anda dapat mencari nomor versi terbaru yang didukung di sini.
Pastikan bahwa setidaknya Pytorch 1.4.0 diinstal dan verifikasi bahwa cuda/bin dan cuda/include ada di $PATH Anda dan $CPATH masing -masing, misalnya :
$ python -c "import torch; print(torch.__version__)"
>>> 1.4.0
$ python -c "import torch; print(torch.__version__)"
>>> 1.1.0
$ echo $PATH
>>> /usr/local/cuda/bin:...
$ echo $CPATH
>>> /usr/local/cuda/include:...
Kemudian jalankan:
pip install torch-cluster
Saat berjalan dalam wadah Docker tanpa driver NVIDIA, Pytorch perlu mengevaluasi kemampuan komputasi dan mungkin gagal. Dalam hal ini, pastikan bahwa kemampuan komputasi diatur melalui TORCH_CUDA_ARCH_LIST , misalnya :
export TORCH_CUDA_ARCH_LIST = "6.0 6.1 7.2+PTX 7.5+PTX"
Algoritma pengelompokan yang serakah untuk memilih titik yang tidak ditandai dan mencocokkannya dengan satu tetangganya yang tidak bertanda (yang memaksimalkan berat tepi). Algoritma GPU diadaptasi dari Fagginger Auer dan Bisseling: Algoritma GPU untuk Pencocokan Grafik Serakah (LNCS 2012)
import torch
from torch_cluster import graclus_cluster
row = torch . tensor ([ 0 , 1 , 1 , 2 ])
col = torch . tensor ([ 1 , 0 , 2 , 1 ])
weight = torch . tensor ([ 1. , 1. , 1. , 1. ]) # Optional edge weights.
cluster = graclus_cluster ( row , col , weight ) print(cluster)
tensor([0, 0, 1])
Algoritma pengelompokan, yang menutupi kisi-kisi reguler ukuran yang ditentukan pengguna di atas titik awan dan kelompok semua titik dalam voxel.
import torch
from torch_cluster import grid_cluster
pos = torch . tensor ([[ 0. , 0. ], [ 11. , 9. ], [ 2. , 8. ], [ 2. , 2. ], [ 8. , 3. ]])
size = torch . Tensor ([ 5 , 5 ])
cluster = grid_cluster ( pos , size ) print(cluster)
tensor([0, 5, 3, 0, 1])
Algoritma pengambilan sampel, yang secara iteratif mengambil sampel titik paling jauh sehubungan dengan titik lainnya.
import torch
from torch_cluster import fps
x = torch . tensor ([[ - 1. , - 1. ], [ - 1. , 1. ], [ 1. , - 1. ], [ 1. , 1. ]])
batch = torch . tensor ([ 0 , 0 , 0 , 0 ])
index = fps ( x , batch , ratio = 0.5 , random_start = False ) print(index)
tensor([0, 3])
Menghitung tepi grafik ke titik k terdekat.
Args:
[N, F] .[N] , yang menetapkan setiap node ke contoh tertentu. batch perlu disortir. (default: None )True , grafik akan berisi loop sendiri. (default: False )"source_to_target" atau "target_to_source" ). (default: "source_to_target" )True , akan menggunakan jarak cosinus alih -alih jarak Euclidean untuk menemukan tetangga terdekat. (default: False )batch tidak None , atau input terletak pada GPU. (default: 1 ) import torch
from torch_cluster import knn_graph
x = torch . tensor ([[ - 1. , - 1. ], [ - 1. , 1. ], [ 1. , - 1. ], [ 1. , 1. ]])
batch = torch . tensor ([ 0 , 0 , 0 , 0 ])
edge_index = knn_graph ( x , k = 2 , batch = batch , loop = False ) print(edge_index)
tensor([[1, 2, 0, 3, 0, 3, 1, 2],
[0, 0, 1, 1, 2, 2, 3, 3]])
Menghitung tepi grafik ke semua titik dalam jarak tertentu.
Args:
[N, F] .[N] , yang menetapkan setiap node ke contoh tertentu. batch perlu disortir. (default: None )True , grafik akan berisi loop sendiri. (default: False )max_num_neighbors , tetangga yang dikembalikan dipilih secara acak. (Default: 32 )"source_to_target" atau "target_to_source" ). (default: "source_to_target" )batch tidak None , atau input terletak pada GPU. (default: 1 ) import torch
from torch_cluster import radius_graph
x = torch . tensor ([[ - 1. , - 1. ], [ - 1. , 1. ], [ 1. , - 1. ], [ 1. , 1. ]])
batch = torch . tensor ([ 0 , 0 , 0 , 0 ])
edge_index = radius_graph ( x , r = 2.5 , batch = batch , loop = False ) print(edge_index)
tensor([[1, 2, 0, 3, 0, 3, 1, 2],
[0, 0, 1, 1, 2, 2, 3, 3]])
Poin cluster dalam X bersama -sama yang paling dekat dengan titik kueri yang diberikan di y . batch_{x,y} vektor perlu diurutkan.
import torch
from torch_cluster import nearest
x = torch . Tensor ([[ - 1 , - 1 ], [ - 1 , 1 ], [ 1 , - 1 ], [ 1 , 1 ]])
batch_x = torch . tensor ([ 0 , 0 , 0 , 0 ])
y = torch . Tensor ([[ - 1 , 0 ], [ 1 , 0 ]])
batch_y = torch . tensor ([ 0 , 0 ])
cluster = nearest ( x , y , batch_x , batch_y ) print(cluster)
tensor([0, 0, 1, 1])
Sampel berjalan acak walk_length dari semua indeks node di start dalam grafik yang diberikan oleh (row, col) .
import torch
from torch_cluster import random_walk
row = torch . tensor ([ 0 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 ])
col = torch . tensor ([ 1 , 0 , 2 , 3 , 1 , 4 , 1 , 4 , 2 , 3 ])
start = torch . tensor ([ 0 , 1 , 2 , 3 , 4 ])
walk = random_walk ( row , col , start , walk_length = 3 ) print(walk)
tensor([[0, 1, 2, 4],
[1, 3, 4, 2],
[2, 4, 2, 1],
[3, 4, 2, 4],
[4, 3, 1, 0]])
pytest
torch-cluster juga menawarkan C ++ API yang berisi C ++ yang setara dengan model Python.
export Torch_DIR=`python -c 'import torch;print(torch.utils.cmake_prefix_path)'`
mkdir build
cd build
# Add -DWITH_CUDA=on support for the CUDA if needed
cmake ..
make
make install