github代码中遇到的问题-解决方案
下面内容介绍的是我个人在复现github代码遇到的一些问题,如果也可以帮到你,请点个关注吧~
1.我的项目位置在D盘,但是为什么下面终端的位置在E盘
-》cd /d D:\Users\xxxx(后面的xxxx是你具体的文档位置)
2.怎么知道我原来的创建的环境是不是含有gpu版本呢?
->方法 1:在激活的环境中运行 Python 代码
-
激活环境:
bash
conda activate HSDGNN
-
运行 Python 检查代码:
bash
python -c "import torch; print('CUDA可用:', torch.cuda.is_available()); print('CUDA版本:', torch.version.cuda); print('GPU名称:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'None')"
- 输出解释:
- 如果显示
CUDA可用: True
,说明环境支持 GPU。 - 如果显示
CUDA可用: False
,说明环境仅安装了 CPU 版本。
- 如果显示
- 输出解释:
->方法 2:查看已安装的 PyTorch 包
-
激活环境:
bash
conda activate your_eve
-
检查 PyTorch 包:
pip list | grep torch
- 输出示例:
plaintext
torch 2.0.1+cu117 torchaudio 2.0.2+cu117 torchvision 0.15.2+cu117
- 包名中包含
+cu117
表示 GPU 版本(CUDA 11.7)。 - 如果只显示
torch 2.0.1
(无+cu
后缀),通常是 CPU 版本。
- 包名中包含
- 输出示例:
->方法 3:查看 conda 环境配置
-
列出所有 conda 环境:
conda env list
-
查看指定环境的详细配置:
conda list -n your-eve | grep torch
- 如果输出中包含
pytorch-cuda
或cudatoolkit
,说明安装了 GPU 支持。
- 如果输出中包含
3. CUDA 内存不足的问题(torch.cuda.OutOfMemoryError
)
1. 降低批次大小(Batch Size)
这是最直接的解决方法。在命令行中添加--batch_size
参数,减小每个批次的样本数量
如果仍然 OOM,可以继续减小到 4 或 2。
2. 优化模型内存使用
2.1梯度累积(Gradient Accumulation)
通过多次前向 / 反向传播后再更新参数,模拟大批次训练的效果
2.2使用半精度训练(Mixed Precision)
PyTorch 的torch.cuda.amp
可以减少显存占用
3. 释放不必要的显存
在每个训练步骤后手动释放缓存
4. 减少模型复杂度
如果上述方法仍无法解决,可以尝试:
- 减小隐藏层维度(
--embed_dim
和--rnn_units
) - 减少网络层数
- 使用更小的输入序列长度(
--lag
)
其他建议
- 监控显存使用:使用
nvidia-smi
实时监控 GPU 显存占用 - 检查数据加载:确保没有不必要的数据被加载到 GPU
- 分阶段训练:如果模型特别大,可以考虑先在小数据集上训练,再逐步扩展
4.为什么需要__init__.py
?
->Python 通过__init__.py
文件识别包结构,没有该文件时,Data
目录不会被视为可导入的模块。
导入路径为什么是from Data.dataloader import ...
?
-
sys.path.append(parent_dir)
后,Python 会在Titantic/
目录下搜索模块,因此Data
是包名,dataloader
是模块名(即dataloader.py
). -
PyCharm 的 “未解析的引用” 警告如何消除?
-
除了设置源根目录,还可以在train_and_visualize.py
开头添加: -
# noinspection PyUnresolvedReferences
这将忽略 IDE 的引用检查警告。
验证导入是否成功
在train_and_visualize.py
中添加调试代码:
print("已导入的模块:")
print("main:", callable(main))
print("TitanicDataset:", issubclass(TitanicDataset, torch.utils.data.Dataset))
print("collate_fn:", callable(collate_fn))
运行后若输出True
,则说明导入成功。