下面內容介紹的是我個人在復現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
,則說明導入成功。