论文链接 :论文链接
解决的问题
在 cuda 中编译 torch
一开始我只是单纯的安装了cuda,cudnn和torch,但是一旦运行之后就会报出以下错误
AssertionError: Torch not compiled with CUDA enabled
解决方法
要在PyTorch中启用CUDA,需要确保已经正确安装了NVIDIA GPU驱动和CUDA工具包 并且PyTorch版本已经编译支持CUDA。
- 安装NVIDIA GPU驱动和CUDA工具包:首先,需要安装与GPU型号和操作系统版本匹配的NVIDIA GPU驱动程序和CUDA工具包。可以从NVIDIA官方网站下载适合系统的驱动和工具包。
- 安装PyTorch:确保安装了支持CUDA的PyTorch版本。在安装PyTorch时,系统会自动检测CUDA并编译相应的功能。可以从PyTorch官方网站或使用以下命令安装PyTorch:
使用conda:
conda install pytorch torchvision torchaudio cudatoolkit=<CUDA版本>
使用pip:
pip install torch torchvision torchaudio -f https://download.pytorch.org/whl/cu<CUDA版本>/torch_stable.html
- 启用CUDA:在PyTorch代码中,可以通过将张量移到GPU设备上来启用CUDA。例如:
import torch
# 检查CUDA是否可用
if torch.cuda.is_available():
device = torch.device('cuda') # 将设备设置为GPU
tensor = torch.tensor([1.0, 2.0]).to(device) # 将张量移到GPU上
print("CUDA is available. Using GPU.")
else:
device = torch.device('cpu') # 将设备设置为CPU
tensor = torch.tensor([1.0, 2.0]).to(device)
print("CUDA is not available. Using CPU.")
如果上述方法不能解决问题
如果在PyCharm中安装了CUDA,但是仍然提示没有安装的话,可能有几个原因导致这种情况:
-
PyCharm的Python环境与系统环境不一致:PyCharm使用的Python解释器可能与系统中的Python环境不一致,导致无法找到正确的CUDA安装。确保在PyCharm中使用与已安装的CUDA兼容的Python解释器。
-
PyCharm中的Python环境未配置CUDA路径:即使在系统中安装了CUDA,PyCharm中的Python解释器可能不知道CUDA的位置。需要确保在PyCharm中配置Python解释器,以使其知道CUDA的安装路径。
-
PyCharm的虚拟环境问题:如果在PyCharm中使用虚拟环境,需要确保在虚拟环境中安装了正确版本的PyTorch和相关依赖,以支持CUDA。在虚拟环境中使用
conda
或pip
安装正确版本的PyTorch,并确保torch.cuda.is_available()
返回True
。 -
重启PyCharm:有时候,在更改了环境变量或配置之后,PyCharm可能需要重新启动才能正确识别已安装的CUDA。
-
检查路径设置:在PyCharm中,可能需要设置正确的CUDA路径。可以在PyCharm的设置中找到Python解释器,并在解释器设置中检查CUDA路径是否已正确配置。
-
检查项目配置:如果在PyCharm中打开了特定的项目,请确保项目配置正确。可以在项目设置中检查解释器和相关依赖。
-
使用conda环境:如果使用conda来管理环境,确保在PyCharm中使用的Python解释器与您在conda环境中安装的解释器相匹配。
Python 语言版本问题
在原文的ReadMe.md
文档中,明确给出了使用的python版本为python3.6,但是仍有一部分代码使用了python2独有的语句
这可能需要一点时间来更改
虚拟环境配置
在复现的过程中,学长指出可以不用更改base的python之类的版本,可以创建虚拟环境
之前我虽然知道虚拟环境,但是C盘空间小的可怜,经常是红色的爆满状态。
为了使用虚拟环境,我决定对C盘进行扩容
于是我用到了傲梅分区助手
:
利用D盘的空间对C盘进行扩容,简直是一键搞定
配置虚拟环境我参考了这篇文章:
只有虚拟环境是不够的,还需要在虚拟环境中配置一些需要的东西:
在Pycharm中搭建Pytorch,CUDA(踩坑无数最终精华极简版)
感谢这位大佬的踩坑无数,确实节约了不少时间
进程问题
解决完上述问题之后, 运行测试的指令
python evaluation_texture.py --method RCA --load_path pretrained/RCA2.npy --suffix yolov2_RCA2 --prepare_data
控制台会报出以下信息:
preparing the test data
preparing the test data
Traceback (most recent call last):
.......
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
ForkingPickler(file, protocol).dump(obj)
BrokenPipeError: [Errno 32] Broken pipe
遇到的错误是与 Python 中的多进程相关的。代码使用了多进程,可能是因为使用了 DataLoader 来并行加载数据。在 Windows 系统中,这种问题经常出现。
解决方法
- 使用主块包裹代码:
将创建和使用 DataLoader 的代码放在if __name__ == '__main__':
块内部。这有助于防止在脚本被导入时执行多进程代码,因为这可能在 Windows 上引发问题。
if __name__ == '__main__':
# 放置使用 DataLoader 和多进程的主要代码部分
- 将主要代码移到单独的脚本中:
可以将涉及多进程的主要代码移到一个单独的脚本中。然后,创建一个新的脚本,从第一个脚本导入所需的函数或类并执行它们。
# main_script.py
import os
import torch
import itertools
# ...(其他导入)
def main():
# 放置使用 DataLoader 和多进程的主要代码部分
if __name__ == '__main__':
main()
# execution_script.py
from main_script import main
if __name__ == '__main__':
main()
按照这些步骤,可以避免在 Windows 系统上由于多进程引起的Broken pipe
错误。如果问题仍然存在,还可以考虑在创建任何进程之前设置多进程模块的start_method
为spawn
方法,而不是默认的 fork
方法:
import multiprocessing
if __name__ == '__main__':
multiprocessing.set_start_method('spawn')
# 放置使用 DataLoader 和多进程的主要代码部分
虚拟内存不足问题
解决以上问题后,再次运行代码,会报出以下错误:
preparing the test data
Traceback (most recent call last):
......
OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading
......
ForkingPickler(file, protocol).dump(obj)
BrokenPipeError: [Errno 32] Broken pipe
遇到的错误信息似乎与多进程和加载某些 DLL 文件有关,可能是由于在多进程上下文中加载 CUDA 和 GPU 库时出现问题。出现的错误可能与 Torch 库内部的多进程设置有关。
解决方法
增加虚拟内存
我参考了这篇文章:
解决pycharm中: OSError: [WinError 1455] 页面文件太小,无法完成操作 的问题
我的Python就装在了D盘,结果D盘没有设置虚拟内存,自然就导致了报错
复现结果
TCEGA
RCA
TCA
EGA
心得体会
说! 为什么论文作者的代码不给个直接配好环境就能跑的!(威胁)
修改后的代码链接:
代码复现的过程,也是学习很多基础知识的一个过程。今天每一个基础的技能,也许就能为以后的学术道路再扬一只帆。
虽然代码是复现出来了,但是有1/3的代码我甚至都不知道是什么意思。。。
还是先打好基础,多读文献,多读代码,多看看花书吧
鸣谢
感谢Lyu学长的悉心帮助!