Keras中CNN代码无法并行运行,NVIDIA K40 GPU调用异常求助
针对你使用NVIDIA K40远程服务器、无root权限、virtualenv+Python3.4、Theano后端Keras的场景,咱们一步步排查解决:
1. 先确认服务器是否存在可用的CUDA环境
你不确定服务器是否安装了CUDA,先在终端执行以下命令验证:
- 检查NVIDIA驱动状态:
nvidia-smi,如果能显示K40的硬件信息,说明驱动正常;如果报错,大概率是驱动未安装或你无访问权限(远程GPU服务器一般会预装驱动) - 查找CUDA编译器路径:
which nvcc,如果返回类似/usr/local/cuda/bin/nvcc的路径,说明CUDA已安装;如果找不到,要么未安装,要么环境变量未配置 - 查看CUDA版本:若找到nvcc,执行
nvcc --version,记下版本号(K40最高支持CUDA 10.2,别用太新的版本)
2. 让虚拟环境继承系统CUDA环境变量
virtualenv默认不会继承系统环境变量,需要手动把CUDA相关变量加到虚拟环境的激活脚本里:
- 进入你的虚拟环境目录,比如
cd ~/your_venv/bin - 编辑
activate脚本,在末尾添加:
(如果export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATHwhich nvcc返回的路径不是/usr/local/cuda/bin,替换成实际路径即可) - 重新激活虚拟环境:
source ~/your_venv/bin/activate,再执行nvcc --version确认虚拟环境能访问到CUDA
3. 修正Theano配置文件(.theanorc)
你的.theanorc可能配置不全,建议替换成以下内容(放在用户主目录~/.theanorc):
[global] device = gpu0 floatX = float32 [cuda] root = /usr/local/cuda # 替换成你实际的CUDA根目录,即nvcc路径的上一级 [dnn] enabled = True include_path = /usr/local/cuda/include library_path = /usr/local/cuda/lib64
注意:如果服务器装了cuDNN,要确保include_path和library_path包含cuDNN的文件(比如include下有cudnn.h,lib64下有libcudnn.so);如果没装cuDNN,可删除[dnn]部分,或设置enabled = False
4. 验证Theano的GPU识别能力
在虚拟环境里运行这段测试代码,确认GPU是否被正常识别:
import time from theano import function, config, shared, tensor import numpy as np vlen = 10 * 30 * 768 # 适配GPU核心数的测试数据量 iters = 1000 rng = np.random.RandomState(22) x = shared(np.asarray(rng.rand(vlen), config.floatX)) f = function([], tensor.exp(x)) print(f.maker.fgraph.toposort()) t0 = time.time() for i in range(iters): r = f() t1 = time.time() print(f"Looping {iters} times took {t1 - t0:.2f} seconds") print(f"Result sample: {r[:5]}") # 判断是否使用GPU if np.any([isinstance(x.op, tensor.Elemwise) and ('Gpu' not in type(x.op).__name__) for x in f.maker.fgraph.toposort()]): print('ERROR: Theano did not use the GPU') else: print('SUCCESS: Theano used the GPU')
如果输出SUCCESS: Theano used the GPU,说明配置生效了
5. 特殊情况:服务器未装CUDA,无root权限的解决办法
如果服务器确实没装CUDA,你可以手动下载适配K40的CUDA版本到个人目录,无需root权限:
- 下载CUDA 10.2的runfile安装包(NVIDIA官网选择Linux、x86_64、runfile(local))
- 执行安装命令:
sh cuda_10.2.89_440.33.01_linux.run --silent --toolkit --toolkitpath=~/cuda-10.2,将CUDA安装到个人目录 - 按照步骤2,把
~/cuda-10.2/bin和~/cuda-10.2/lib64加到虚拟环境的环境变量里,同时修改.theanorc的root路径为~/cuda-10.2 - cuDNN同理:下载对应版本的tar包,解压后将
include和lib64下的文件复制到你的CUDA目录对应位置即可
内容的提问来源于stack exchange,提问作者Syed Nauyan Rashid
相关产品推荐
相关产品推荐

