一、PyTorch 扩展库torch_geometric、torch_scatter、torch_sparse 和 torch_cluster介绍
1. torch_geometric
torch_geometric 是一个用于处理图数据的 PyTorch 扩展库。它提供了丰富的功能和工具,用于加载、处理和操作图形数据集。torch_geometric 的主要目标是简化图神经网络 (GNN) 的实现过程,并提供高效的图数据处理工具。
主要特点:
- 提供了各种数据集加载器,用于加载常见的图数据集。
- 实现了各种图数据处理和操作函数,例如图嵌入、图卷积等。
- 支持图数据的可视化和分析工具。
torch_geometric 的出现极大地简化了在 PyTorch 中实现图神经网络的过程,使得研究人员和开发者能够更轻松地处理和分析图数据。
2. torch_scatter
torch_scatter 是一个用于在 PyTorch 中进行稀疏张量聚合操作的扩展库。在处理图数据时,经常需要将节点的特征聚合到它们的邻居节点上,而 torch_scatter 提供了高效的方法来执行这些操作。
主要特点:
- 提供了各种聚合操作,例如求和、求平均值等。
- 支持按照给定的索引将值聚合到稀疏张量的指定位置。
- 高效利用 GPU 加速进行计算。
torch_scatter 的出现极大地简化了在 PyTorch 中处理大规模稀疏数据的过程,使得研究人员和开发者能够更高效地进行图神经网络的实验和应用。
3. torch_sparse
torch_sparse 是一个用于稀疏张量操作的 PyTorch 扩展库。它提供了各种函数和工具,用于创建、操作和计算稀疏张量。在处理图数据时,经常会遇到稀疏的邻接矩阵表示,而 torch_sparse 提供了高效的方法来处理这些稀疏张量。
主要特点:
- 提供了各种稀疏张量的创建和操作函数,例如稀疏矩阵乘法、转置等。
- 支持在 GPU 上高效地进行稀疏张量的计算。
- 提供了稀疏张量的存储和加载功能。
torch_sparse 的出现使得在 PyTorch 中处理大规模稀疏数据变得更加方便和高效,为图神经网络的研究和应用提供了强大的支持。
4. torch_cluster
torch_cluster 是一个用于在 PyTorch 中进行图聚类操作的扩展库。它包含了一些图聚类算法的实现,例如 K-means 等。这些算法可以用于将图数据集划分为不同的子图或聚类。
主要特点:
- 提供了各种图聚类算法的实现,例如 K-means。
- 支持在 GPU 上高效地进行图聚类计算。
torch_cluster 的出现为图数据的聚类和子图提取提供了方便和高效的方法,为图数据的分析和应用提供了更多的可能性。
这四个库的结合为深度学习领域的图数据处理提供了重要的工具和支持,为研究人员和开发者提供了更加便捷和高效的方法来处理和分析图数据。
二、约束条件
上面说到,torch_geometric、torch_scatter、torch_sparse 和 torch_cluster是pytorch的拓展库,所以与pytorch版本,cuda版本关系密切。制约pytorch版本跟cuda版本主要有一下因素:
- BIONIC
在BIONIC的github上有他们导出的yml文件,上面要求cuda的版本只有纯cpu、cu102、cu111,然后pytorch的版本是1.9.0 - torch_sparse
torch_sparse官方的github上要求的torch版本至少是1.8.0,然后要求cuda版本要求没有说,就是说cuda版本需要适配pytorch - 3090
由于服务器使用的3090不支持cu102,所以要用cu111
三、心路历程
2024年4月24日凌晨5点拂晓在骑兵营营长的助力下,配置完成并跑通BIONIC的model文件。配置之路甚是曲折犹如坐牢,当然配好之后就非常爽,正所谓否极泰来,接下来是配置的心路历程
pytorch1.13.0+cu117
在第一次安装这四个包的时候,我还没有意识到事情的严重性,就直接使用之前的配的环境接着装。一开始是直接
pip install torch-scatter==2.0.8 torch-sparse==0.6.11 torch-cluster==1.5.9
pip install torch-geometric==1.7.2
然后发现没办法下载下来,后来在加上-f 跟下载那个包的路径之后就可以了scater spaser cluster的whl下载地址还是不行 然后就看到满屏报错
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:71:61: error: invalid static_cast from type ‘const torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >’ to type ‘torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >&’
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h: In instantiation of ‘std::shared_ptr<torch::nn::Module> torch::nn::Cloneable<Derived>::clone(const c10::optional<c10::Device>&) const [with Derived = torch::nn::TransformerDecoderLayerImpl]’:
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/optim/sgd.h:55:48: required from here
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:58:59: error: invalid static_cast from type ‘const torch::OrderedDict<std::basic_string<char>, at::Tensor>’ to type ‘torch::OrderedDict<std::basic_string<char>, at::Tensor>&’
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:71:61: error: invalid static_cast from type ‘const torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >’ to type ‘torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >&’
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h: In instantiation of ‘std::shared_ptr<torch::nn::Module> torch::nn::Cloneable<Derived>::clone(const c10::optional<c10::Device>&) const [with Derived = torch::nn::TransformerEncoderLayerImpl]’:
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/optim/sgd.h:55:48: required from here
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:58:59: error: invalid static_cast from type ‘const torch::OrderedDict<std::basic_string<char>, at::Tensor>’ to type ‘torch::OrderedDict<std::basic_string<char>, at::Tensor>&’
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:71:61: error: invalid static_cast from type ‘const torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >’ to type ‘torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >&’
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h: In instantiation of ‘std::shared_ptr<torch::nn::Module> torch::nn::Cloneable<Derived>::clone(const c10::optional<c10::Device>&) const [with Derived = torch::nn::GRUCellImpl]’:
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/optim/sgd.h:55:48: required from here
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:58:59: error: invalid static_cast from type ‘const torch::OrderedDict<std::basic_string<char>, at::Tensor>’ to type ‘torch::OrderedDict<std::basic_string<char>, at::Tensor>&’
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:71:61: error: invalid static_cast from type ‘const torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >’ to type ‘torch::OrderedDict<std::basic_string<char>, std::shared_ptr<torch::nn::Module> >&’
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h: In instantiation of ‘std::shared_ptr<torch::nn::Module> torch::nn::Cloneable<Derived>::clone(const c10::optional<c10::Device>&) const [with Derived = torch::nn::LSTMCellImpl]’:
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/optim/sgd.h:55:48: required from here
/data/anaconda3/envs/scgpt_2/lib/python3.10/site-packages/torch/include/torch/csrc/api/include/torch/nn/cloneable.h:58:59: error: invalid static_cast fro
这个时候才意识到是cuda117不行
pytorch1.9.0+cu102
那个时候没有想很多,看到BIONIC文件的对cuda版本有要求,没过多想就开始安装cuda102
build:
strategy:
fail-fast: false
matrix:
python-version: [3.8]
poetry-version: [1.0.10]
os: [ubuntu-latest, windows-latest]
cuda: [cpu, cu102, cu111]
runs-on: ${{ matrix.os }}
等到装好后我们又发现3090不支持cu102,因为GeForce RTX 3090 显卡仅支持 CUDA 11 以上的版本damn,于是我们装好之后甚至找不到这个包
pytorch1.9.1+cu111
这个时候我们两个已经看了大概四五个逗逼的雀巢,这个时候我们看到csdn一个文章,(12月最新)完美兼容安装torch-geometric与torch-scatter torch-sparse torch-cluster、torch-spline-conv的方法及版本对应关系
我们在geometric的官网轮包https://pytorch-geometric.com/whl/看到了我们的版本
这就说明这个版本的配置理论上是存在的,于是我们非常兴奋的开了第七个虚拟环境,点开pytorch的官网,开始下载对应版本的torch
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html
然后指定版本下载torch_geometric、torch_scatter、torch_sparse 和 torch_cluster,就是在上面geomatric轮包的地方右键获取下载连接-f下载
pip install torch-scatter==2.0.8 torch-sparse==0.6.11 torch-cluster==1.5.9 -f https://pytorch-geometric.com/whl/torch-1.9.1%2Bcu111.html
pip install torch-geometric==1.7.2
终于我们的服务器上终于装上了这个四个库!!!
总结,如果在我们的服务器上安装scater spaser cluster,在重开环境之后使用下面的代码就可以
总结
pytorch版本与cuda版本就是很难调,csdn上的文章大多数时候都是大家自己的经验,然后官方的环境要求很多时候图省事也没有说的很清楚,这个时候也只能说多看报错,官方配置环境要求,最重要的是多思考,不要以上头就不经大脑的疯狂尝试。