Windows 11 下复现 RandLA-Net 点云模型的完整避坑指南
作为一名长期在 Windows 平台进行深度学习研究的开发者,我深知在非 Linux 环境下复现前沿点云模型的痛苦。最近在 Windows 11 上复现 RandLA-Net 时,遇到了比预想更多的"坑"。本文将分享这些实战经验,帮助后来者少走弯路。
1. 环境配置:从零开始的版本陷阱
1.1 CUDA 与 PyTorch 的版本匹配
Windows 下最头疼的问题莫过于 CUDA 与 PyTorch 的版本兼容性。我最初安装的是 CUDA 11.7,但运行时报错显示需要 CUDA 10.2。检查后发现是之前项目残留的环境变量在作祟。
解决方案:
- 彻底清理旧版本 CUDA 环境变量
- 使用以下命令验证 PyTorch 实际使用的 CUDA 版本:
import torch print(torch.version.cuda) # 应显示 11.7 print(torch.cuda.is_available()) # 应为 True1.2 Python 虚拟环境搭建
推荐使用 Anaconda 创建独立环境,避免包冲突。我使用的是 Python 3.9,但需要注意:
- scikit-learn 必须锁定为 1.2.2 版本(最新版会导致 EuclideanDistance 报错)
- 安装顺序影响依赖解析,建议按以下顺序:
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 cudatoolkit=11.7 -c pytorch pip install scikit-learn==1.2.2 pip install -r requirements.txt
2. 数据准备:Windows 特有的路径难题
2.1 处理 .sh 脚本文件
原项目提供的预处理脚本都是 .sh 格式,这在 Windows 下无法直接运行。我尝试了三种解决方案:
- Git Bash:安装 Git for Windows 后可用,但部分命令仍会报错
- 手动执行:打开 .sh 文件,逐条执行其中的命令
- WSL:最彻底的解决方案,但会增加系统复杂度
推荐方案:对于compile_wrappers.sh,可以手动执行其中的 g++ 编译命令:
g++ -std=c++11 -O3 -march=native -fPIC -shared -o libgrid_subsampling_cuda.so grid_subsampling_cuda.cu -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lcudart2.2 文件路径的特殊字符
Windows 不允许文件名包含冒号(:),而原代码使用时间戳自动生成路径(如 "2023-08-16_18:45")。需要修改train.py中的路径生成逻辑:
# 原代码 folder_name = str(datetime.now()).replace(' ', '_')[:16] # 修改为 folder_name = str(datetime.now()).replace(' ', '_').replace(':', '_')[:16]3. 模型训练:那些意想不到的报错
3.1 scikit-learn 版本灾难
训练时遇到最棘手的错误是:
AttributeError: Can't get attribute 'EuclideanDistance'原因分析:
- scikit-learn 1.3.0 移除了 EuclideanDistance 类
- RandLA-Net 的 pickle 文件依赖旧版实现
解决方案:
pip uninstall scikit-learn pip install scikit-learn==1.2.23.2 数据加载路径错误
测试时常见的报错是找不到数据文件。这是因为 Windows 和 Linux 的路径处理方式不同。需要检查:
test.py中的默认路径假设- 确保
datasets/s3dis/subsampled目录结构正确:datasets/ └── s3dis/ └── subsampled/ ├── test/ └── train/ # 注意不是 test/train/
4. 性能优化:让 Windows 也能高效训练
4.1 解决内存泄漏问题
Windows 下的 PyTorch 有时会出现内存累积问题。在训练循环中添加定期清理:
if epoch % 5 == 0: torch.cuda.empty_cache()4.2 多进程数据加载的坑
Windows 的多进程实现与 Linux 不同,可能导致数据加载器卡死。建议:
- 设置
num_workers=0或很小的值 - 使用
persistent_workers=False - 在数据加载器外完成所有预处理
完整训练命令示例:
python train.py --num_workers 2 --batch_size 8 --val_batch_size 45. 替代方案:当问题真的无解时
经过两周的折腾,我必须承认:有些问题在 Windows 下就是难以完美解决。以下是备选方案:
- WSL2:微软官方支持的 Linux 子系统
- 云平台:Colab 或 AWS 实例
- 双系统:最彻底的解决方案
不过对于坚持使用纯 Windows 的开发者,本文提到的解决方案应该能解决 90% 的常见问题。记住关键三点:版本控制、路径处理、错误日志分析。每次报错都是学习的机会,祝你在点云学习的路上越走越顺!