feat: implement GCN for Cora node classification
本项目使用 Jittor 和 Jittor Geometric 实现两层图卷积神经网络(Graph Convolutional Network,GCN),完成计图比赛热身赛中的 Cora 节点分类任务。
项目包含数据加载、特征归一化、图结构归一化、GCN 模型训练、验证集评测以及测试集预测结果生成等完整流程。
. ├── data/ │ └── cora.pkl ├── gcn.py ├── README.md ├── requirements.txt ├── LICENSE ├── .gitignore └── result.json
各文件说明如下:
gcn.py
data/cora.pkl
requirements.txt
LICENSE
.gitignore
result.json
本项目已在以下环境中运行验证:
Jittor 使用即时编译机制,首次运行时需要编译 C++ 和 CUDA 算子,因此第一次运行时间通常较长。
source "$(conda info --base)/etc/profile.d/conda.sh" conda create -n jittor_gcn python=3.10 -y conda activate jittor_gcn
检查 Python 版本:
python --version
应显示 Python 3.10。
进入项目根目录:
cd ~/autodl-tmp
安装依赖:
python -m pip install --upgrade pip python -m pip install -r requirements.txt
如果访问 GitHub 时出现临时 TLS 连接错误,可以重新执行安装命令。Jittor Geometric 使用 GitHub 官方源码压缩包安装。
本项目使用 Jittor 提供的 CUDA 12.2 和 cuDNN 8 环境。
设置环境变量:
export JTCUDA_VERSION=12.2 export OMP_NUM_THREADS=16 export use_cutlass=0 unset nvcc_path
安装 Jittor CUDA:
python -m jittor_utils.install_cuda
安装完成后,Jittor CUDA 通常位于:
~/.cache/jittor/jtcuda/cuda12.2_cudnn8_linux/
为了在每次激活 Conda 环境时自动设置变量,可以执行:
mkdir -p "$CONDA_PREFIX/etc/conda/activate.d" tee "$CONDA_PREFIX/etc/conda/activate.d/jittor_env.sh" > /dev/null <<'ENV' export JTCUDA_VERSION=12.2 export OMP_NUM_THREADS=16 export use_cutlass=0 unset nvcc_path ENV
重新激活环境:
conda deactivate conda activate jittor_gcn
创建一个简单的 GPU 张量并执行计算:
python -c "import jittor as jt; jt.flags.use_cuda=1; x=jt.array([1.0,2.0,3.0]); print((x*2).numpy())"
正常情况下应输出:
[2. 4. 6.]
当前 Jittor Geometric 2.0 的 SpmmCsr Python 接口向底层算子传入了 trans_A 和 trans_B,而 Jittor 1.3.9.14 中的 cusparse_spmmcsr 只接受七个参数。
SpmmCsr
trans_A
trans_B
cusparse_spmmcsr
对于本项目使用的无向 Cora 图,经过 gcn_norm 后的邻接传播矩阵是对称的,因此可以删除这两个额外的转置参数。
gcn_norm
安装依赖后,执行:
SPMM_FILE="$CONDA_PREFIX/lib/python3.10/site-packages/jittor_geometric/ops/spmmcsr.py" cp "$SPMM_FILE" "${SPMM_FILE}.bak" sed -i \ 's/,v_num,v_num,trans_A,trans_B)/,v_num,v_num)/' \ "$SPMM_FILE" sed -i \ 's/,self\.v_num,self\.v_num,self\.trans_A,self\.trans_B)/,self.v_num,self.v_num)/' \ "$SPMM_FILE"
检查修改结果:
grep -n "cusparse_spmmcsr" "$SPMM_FILE"
有效调用的结尾应分别为:
..., v_num, v_num).fetch_sync()
和:
..., self.v_num, self.v_num).fetch_sync()
该处理仅适用于当前无向 Cora 图任务。如果用于非对称有向图,需要使用真正支持转置参数的稀疏矩阵乘法实现。
本项目使用比赛提供的预处理 Cora 数据:
请将 cora.pkl 放在项目根目录下的 data/ 文件夹中:
cora.pkl
data/
项目根目录/ ├── data/ │ └── cora.pkl └── gcn.py
运行前检查数据文件:
ls -lh data/cora.pkl
cora.pkl 应包含以下字段:
x y edge_index train_mask val_mask test_mask num_features num_classes
其中:
x
y
edge_index
train_mask
val_mask
test_mask
num_features
num_classes
根据比赛开源规范,数据文件不直接提交到 Git 仓库。
本项目使用两层 GCN:
GCN 的传播形式为:
H^(l+1) = σ(D^(-1/2) A D^(-1/2) H^(l) W^(l))
主要模型参数如下:
优化器使用 Adam,损失函数使用交叉熵损失。
确认已经激活环境:
conda activate jittor_gcn
检查代码语法:
python -m py_compile gcn.py
开始训练:
python gcn.py
如需同时保存日志:
mkdir -p outputs python gcn.py 2>&1 | tee outputs/train.log
本项目的训练、验证和测试预测集成在同一个入口脚本中,不需要额外的命令行参数。
本项目使用节点分类准确率(Accuracy)作为验证指标:
Accuracy = 正确分类的节点数 / 参与评测的节点总数
训练过程中每隔 20 个 epoch 输出训练集准确率和当前最佳验证集准确率。
在上述环境下运行 200 个 epoch,得到以下结果:
由于测试节点标签未公开,本项目不计算测试集准确率,而是生成测试节点的预测类别。
本次运行共生成:
1000
个测试节点的预测结果。
受 GPU、CUDA、Jittor 版本以及算子编译环境影响,不同环境中的结果可能存在小幅差异。
训练结束后,程序自动对测试集节点进行预测,并生成:
结果格式如下:
{ "节点编号": 预测类别 }
可以执行以下命令检查结果:
ls -lh result.json head -n 20 result.json
本次运行共预测 1000 个测试节点。
为提高实验的可复现性,本项目采用以下设置:
42
Jittor 使用异步执行和即时编译机制,不同 GPU、CUDA 或编译器环境下可能出现合理的数值差异。
如果出现:
FileNotFoundError: data/cora.pkl
请执行:
cd ~/autodl-tmp ls -lh data/cora.pkl
确认当前目录是项目根目录。
如果出现 CUTLASS 的 MD5 校验错误,执行:
rm -f ~/.cache/jittor/cutlass/cutlass.zip export use_cutlass=0
本项目不依赖 CUTLASS。
libcudnn_ops_infer.so not found
执行:
export JTCUDA_VERSION=12.2 unset nvcc_path python -m jittor_utils.install_cuda
Wrong inputs arguments cusparse_spmmcsr
请按照“Jittor Geometric 兼容处理”一节修改 spmmcsr.py。
spmmcsr.py
本项目使用以下开源软件:
Jittor Geometric 采用 Apache License 2.0。Cora 数据集的版权和使用许可归原数据集发布者所有,本仓库不直接分发 cora.pkl。
如果代码参考或修改自比赛模板或其他第三方代码,应在项目中保留相应声明,并注明代码来源和许可证。
本项目采用 MIT License,具体内容见 LICENSE。
基于 Jittor GCN 的 Cora 节点分类
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
基于 GCN 的 Cora 节点分类
本项目使用 Jittor 和 Jittor Geometric 实现两层图卷积神经网络(Graph Convolutional Network,GCN),完成计图比赛热身赛中的 Cora 节点分类任务。
项目包含数据加载、特征归一化、图结构归一化、GCN 模型训练、验证集评测以及测试集预测结果生成等完整流程。
1. 项目结构
各文件说明如下:
gcn.py:数据处理、GCN 模型定义、训练、验证和预测代码;data/cora.pkl:比赛提供的预处理 Cora 数据文件,不提交到代码仓库;requirements.txt:Python 依赖及版本;LICENSE:项目开源许可证;.gitignore:Git 忽略规则;result.json:程序生成的测试节点预测结果。2. 运行环境
本项目已在以下环境中运行验证:
Jittor 使用即时编译机制,首次运行时需要编译 C++ 和 CUDA 算子,因此第一次运行时间通常较长。
3. 环境安装
3.1 创建 Conda 环境
检查 Python 版本:
应显示 Python 3.10。
3.2 安装 Python 依赖
进入项目根目录:
安装依赖:
如果访问 GitHub 时出现临时 TLS 连接错误,可以重新执行安装命令。Jittor Geometric 使用 GitHub 官方源码压缩包安装。
3.3 配置 Jittor CUDA
本项目使用 Jittor 提供的 CUDA 12.2 和 cuDNN 8 环境。
设置环境变量:
安装 Jittor CUDA:
安装完成后,Jittor CUDA 通常位于:
为了在每次激活 Conda 环境时自动设置变量,可以执行:
重新激活环境:
3.4 验证 Jittor GPU
创建一个简单的 GPU 张量并执行计算:
正常情况下应输出:
4. Jittor Geometric 兼容处理
当前 Jittor Geometric 2.0 的
SpmmCsrPython 接口向底层算子传入了trans_A和trans_B,而 Jittor 1.3.9.14 中的cusparse_spmmcsr只接受七个参数。对于本项目使用的无向 Cora 图,经过
gcn_norm后的邻接传播矩阵是对称的,因此可以删除这两个额外的转置参数。安装依赖后,执行:
检查修改结果:
有效调用的结尾应分别为:
和:
该处理仅适用于当前无向 Cora 图任务。如果用于非对称有向图,需要使用真正支持转置参数的稀疏矩阵乘法实现。
5. 数据准备
本项目使用比赛提供的预处理 Cora 数据:
请将
cora.pkl放在项目根目录下的data/文件夹中:运行前检查数据文件:
cora.pkl应包含以下字段:其中:
x:节点特征矩阵;y:节点类别标签;edge_index:图的边连接关系;train_mask:训练节点掩码;val_mask:验证节点掩码;test_mask:测试节点掩码;num_features:节点特征维数;num_classes:节点类别数量。根据比赛开源规范,数据文件不直接提交到 Git 仓库。
6. 模型说明
本项目使用两层 GCN:
GCN 的传播形式为:
主要模型参数如下:
优化器使用 Adam,损失函数使用交叉熵损失。
7. 训练与评测
确认已经激活环境:
进入项目根目录:
检查代码语法:
开始训练:
如需同时保存日志:
本项目的训练、验证和测试预测集成在同一个入口脚本中,不需要额外的命令行参数。
8. 评价指标
本项目使用节点分类准确率(Accuracy)作为验证指标:
训练过程中每隔 20 个 epoch 输出训练集准确率和当前最佳验证集准确率。
9. 实验结果
在上述环境下运行 200 个 epoch,得到以下结果:
由于测试节点标签未公开,本项目不计算测试集准确率,而是生成测试节点的预测类别。
本次运行共生成:
个测试节点的预测结果。
受 GPU、CUDA、Jittor 版本以及算子编译环境影响,不同环境中的结果可能存在小幅差异。
10. 预测结果
训练结束后,程序自动对测试集节点进行预测,并生成:
结果格式如下:
可以执行以下命令检查结果:
本次运行共预测 1000 个测试节点。
11. 可复现性说明
为提高实验的可复现性,本项目采用以下设置:
42;data/cora.pkl;gcn.py;.gitignore排除数据、缓存和训练日志;Jittor 使用异步执行和即时编译机制,不同 GPU、CUDA 或编译器环境下可能出现合理的数值差异。
12. 常见问题
12.1 找不到数据文件
如果出现:
请执行:
确认当前目录是项目根目录。
12.2 CUTLASS 下载校验失败
如果出现 CUTLASS 的 MD5 校验错误,执行:
本项目不依赖 CUTLASS。
12.3 找不到 cuDNN
如果出现:
执行:
12.4 cusparse_spmmcsr 参数数量错误
如果出现:
请按照“Jittor Geometric 兼容处理”一节修改
spmmcsr.py。13. 第三方依赖与声明
本项目使用以下开源软件:
Jittor Geometric 采用 Apache License 2.0。Cora 数据集的版权和使用许可归原数据集发布者所有,本仓库不直接分发
cora.pkl。如果代码参考或修改自比赛模板或其他第三方代码,应在项目中保留相应声明,并注明代码来源和许可证。
14. License
本项目采用 MIT License,具体内容见 LICENSE。