目录
背景
之前没有在Windows上用自己电脑的显卡跑过机器学习,因为感觉Windows很麻烦而且问题很多。一直是在Linux下GPU服务器上跑的。
机缘巧合下要去配Windows的tensorflow环境,还是很害怕这种事情的。但是还是去试一试了。
三种方式让tensorflow代码在windows上跑起来:
- windows装环境,可能长期来看调试比较麻烦,大部分还是linux服务器比较好弄,短期没问题;
- 租阿里云腾讯云gpu服务器然后在上面弄;
- 下载一个比如ubuntu虚拟机,安装anaconda然后把之前配过的conda环境拷贝过来。
这篇文章发生的所有事情大概占了两个凌晨和半个下午。
遇到的问题包括但不限于图像的维度问题、灰度问题、tensorflow安装的过程、cuda&cudnn选择、显卡爆满无法计算,等。
在Windows上配环境
1. 配tensorflow1.13环境
安装tensorflow并且去跑机器学习算法最关键的是各个版本的cuda和cudnn要兼容,否则就会寄掉。
可以参考:2021最新:TensorFlow各个GPU版本CUDA和cuDNN对应版本整理(最简洁)_cuda12.1对应的tensorflow-CSDN博客
我这一套配置是这样的:
python3.6.13
tensorflow1.13.1
cuda10.0
cudnn7.6.5(本来想用7.4,因为是经过验证的可适配,但是一下子没有合适的channel提供这个版本,也不想自己手动官网下载)
创建新conda环境
已经安装好了anaconda的环境,直接启动prompt。
conda create -n tensorflow1.13 python=3.6.13
conda activate tensorflow1.13
安装cuda
更新pip
python -m pip install --upgrade pip
装cuda
conda install cudatoolkit=10.0
安装cudnn
本来其实想装7.4的,结果默认的channel里没有。
于是搜一下有啥
conda search cudnn -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/
发现cudnn7.6.5也可以适配cuda10.0,就试一试了。
conda install cudnn=7.6.5 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/
#或者
conda install cudnn=7.6.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
安装tensorflow1.13.1
pip install tensorflow-gpu==1.13.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
重点是一定要先装cuda和cudnn,否则就要反复卸载tensorflow
卸载代码
pip uninstall tensorflow
验证
import tensorflow as tf
hello = tf.constant(‘Hello, TensorFlow!’)
sess = tf.Session()
print(sess.run(hello))
能打出来Hello,TensorFlow!就说明成功了。
2. 一些指令
conda list - 列出当前虚拟环境的所有包。
conda env list - 列出 conda 管理的所有虚拟环境。
conda info --envs - 列出 conda 管理的所有虚拟环境。
pip freeze - 列出所有pip下载的库
3. 安装各种库
Scipy的报错
pip install了 scipy,但是运行下面这句话
ImportError: cannot import name imsave
解决办法是
pip uninstall scipy
pip install scipy==1.2.1
# 使用镜像
pip install scipy==1.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
因为好像最新版本的scipy的imsave函数已经没了。
库缺失的报错
没装就用pip install即可。
在linux上跑算法和debug
1. TabError
TabError:inconsistent use of tabs and spaces in indentation
解决方法:
使用IDE编辑器格式化代码。
比如:在pycharm里打开.py文件,上方工具栏Code->Reformat Code然后保存。
2. Check failed: stream->parent()->GetConvolveBackwardDataAlgorithms( conv_parameters.ShouldIncludeWinogradNonfusedAlgo<T>(stream->parent()), &algorithms) Aborted (core dumped)
解决方法:
rm -r ~/.nv/
3. could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR 或者 TypeError: Fail to find the dnn implementation
可能是显存爆了,
解决方法:
一、
# tf1、tf2均可
import os
os.environ["TF_FORCE_GPU_ALLOW_GROWTH"] = "true"
#或者
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
二、减少batch size
三、
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9
session = tf.Session(config=config, ...)
4. 一些指令
nvidia-smi //查看显卡情况
nvidia-smi --gpu-reset
sudo kill -9 MY_PID //强制终止进程
CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py//指定显卡
MATLAB处理图像
1. 维度报错
算法的filter只能接收1维的图像,不能接收3维的。考虑了需求,直接把三维图像保留了第一个维度。
2. 大小报错
ValueError: Dimension 1 in both shapes must be equal, but are 256 and 1024.
3. 调整图像的MATLAB代码
- imsize函数直接调整图像大小,把256×256的图像改成了64×64。
- J=J_rgb(:,:,1)保留了图像第一个维。
for k = 1:20
imgName1 = ['D:\', num2str(k), '.png'];
imgName2 = [num2str(k), '.png'];
J_rgb=imread(imgName1)
J=J_rgb(:,:,1)
%imshow(J_gray)
J = imresize(J,[64,64]);
cd('D:\gray\')
imwrite(J,imgName2)
cd('D:\')
end