专栏首页小小挖掘机深度学习环境配置有哪些坑?

深度学习环境配置有哪些坑?

深度学习第一问是关于环境配置的。之前笔者也在深度学习60讲系列中讲到如何配置深度学习开发环境的问题:深度学习笔记15:ubuntu16.04 下深度学习开发环境搭建与配置。但环境配置并不是一路顺利的,总有些奇奇怪怪的问题让人头疼,所以,在第一问中笔者选取了几个典型的环境配置的错误供大家参考。

1. 特别注意cuda、cudnn、cuda driver和cudatoolkit的版本

cuda是nvidia推出的用于自家GPU的并行计算框架,也就是说cuda只能在nvidia的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥cuda的作用。

cudnn是nvidia打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cudnn不是必须的,但是一般会采用这个加速库。

cuda driver即cuda驱动器,是用来支持cuda运行的必备程序。而cudatoolkit则是cuda相关的工具包。

以上四者之间必须有个版本对应和匹配的问题。有时候安装keras GPU版本的时候会默认安装cudatoolikit 10.0,这时候如果你cuda是9.0的版本的话,一般会报个CUDA driver version is insufficient for CUDA的错误。如下所示:

这时候你可能需要降低cudatoolkit的版本:

conda install cudatoolkit==9.0

还有一种常见的错误是cuda driver的驱动器跟cuda不匹配。执行nvidia-smi命令会出现如下图错误:

Failed to initialize NVML: Driver/library version mismatch

nvidia官方给出了cuda和cuda driver之间版本对应关系:

在版本不匹配时,适当降低或者更新驱动器版本即可。另外驱动器版本更新之后可能需要重启系统,当然通过如下方法不用重启也可以更新版本。首先尝试删除nvidia相关的kernel mod。

sudo rmmod nvidia

当然这里一般会报个Module nvidia is in use by的错误。不碍事,我们先查看下kernel mod 的依赖情况:

ls mod | grep nvidia

根据根据结果逐一rmmod即可。

sudo rmmod nvidia_uvm
sudo rmmod nvidia_modeset

最后再rmmod nvidia即可达到驱动器更新效果。

sudo rmmod nvidia
nvidia-smi

还有一种报错是cudnn版本不匹配的问题:

此时直接更新cudnn版本即可。

2. 使用Python虚拟环境时要注意的坑

一般来说,大家在共用实验室GPU服务器的时候为了避免环境污染都会各自建好虚拟环境,在虚拟环境下进行各自的深度学习实验。有些同学喜欢使用jupyter进行交互式实验,或者是使用ipython,这时候你要注意虚拟环境下的ipython和jupyter版本是跟系统全局环境是一致的,跟你当前虚拟环境的python版本不一定一致。举个例子,假设你的系统全局环境的tensorflow是1.13.1版本,当你在虚拟环境下安装的是tensorflow1.14版本,你虚拟环境下的jupyter tensorflow版本不是1.14,而是1.13.1。这一点大家需要注意。

想要在虚拟环境下使用当前环境的jupyter或者ipython会比较麻烦,首先需要卸载系统全局环境下的jupyter和ipython,卸载起来会比较麻烦,具体过程可参考stackoverflow:

https://stackoverflow.com/questions/37061089/trouble-with-tensorflow-in-jupyter-notebook?rq=1

3. 验证TensorFlow/Keras/Torch版本是否支持GPU

虽说按部就班的配环境好像也没啥大问题,但要想让你的TensorFlow和Torch顺利用上GPU跑起来并不是一件那么顺利的事。此时,直接使用nvidia-smi命令并不能表明TensorFlow就能顺利用上GPU。

比如说我们用Keras跑模型时指定了GPU,有时候会报如下错误:

一方面,你的机器可能确实没有那么多GPU,另外一种可能就是你没有安装支持GPU的TensorFlow或者Keras版本。这时候我们可以先来验证下当前的TensorFlow或Keras是否支持GPU。

先来看TensorFlow:

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

如果输出结果有类似上述包含GPU的信息,那说明你的tensorflow是支持GPU的。再看keras:

from keras import backend as K
print(K.tensorflow_backend._get_available_gpus())

如果能输出下述包含GPU的信息的话那说明当前的keras版本也是支持GPU的。

Torch的话安装到时候一般都会根据官网的配置要求来:

一般安装后输入下列命令即可:

import torch
torch.cuda.is_available()

如果输出为True的话则表明当前的torch是支持GPU加速的。

如果你没有得到上述的输出结果,那么需要重新安装带gpu版本的tensorfow或者keras:

pip install tensorflow-gpu
conda install keras-gpu

按照上述过程下来一般就会顺利配置好各深度学习框架版本。

4. 免费的GPU资源

最后,如果大家没有GPU资源又或者嫌配置太糟心,我们还是有免费的GPU可以褥的。一个是谷歌的colab,自动支持GPU,大家可以直接去褥。另外一个是kaggle竞赛平台的kernel,里面也是提供GPU算力的。

colab目前提供的GPU已经由之前K80升级到了Tesla T4:

kaggle提供的则是Tesla P100:

大家可以自行去褥。当然前提可能是大家需要一点点访问外国网站的方法。

colab地址:

https://colab.research.google.com/notebooks/

kaggle地址:

https://www.kaggle.com/

nvidia官方文档地址:

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

本文分享自微信公众号 - 小小挖掘机(wAIsjwj)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 推荐系统遇上深度学习(十四)--强化学习与推荐系统的强强联合!

    之前学习了强化学习的一些内容以及推荐系统的一些内容,二者能否联系起来呢!今天阅读了一篇论文,题目叫《DRN: A Deep Reinforcement Lear...

    石晓文
  • 美团BERT的探索和实践

    2018年,自然语言处理(Natural Language Processing,NLP)领域最激动人心的进展莫过于预训练语言模型,包括基于RNN的ELMo[1...

    石晓文
  • RS Meet DL(53)-DUPN:通过多任务学习用户的通用表示

    本文介绍的文章题目是:《Perceive Your Users in Depth: Learning Universal User Representation...

    石晓文
  • 初创公司BabbleLabs用AI来增强语音

    总部位于加利福尼亚的创业公司BabbleLabs正致力于提高语音质量,包括准确性和个性化。该公司最近宣布推出一款新的深度学习产品,该产品依靠端到端的GPU来执行...

    AiTechYun
  • matlab强化学习Sarsa与Sarsa(lambda)对比

    适用于回合型环境,要等到回合结束, 才开始对本回合所经历的所有步都添加更新, 但是这所有的步都是和宝藏有关系的, 都是为了得到宝藏需要学习的步, 所以每一步在下...

    万木逢春
  • Redis教程10(事务)

    在MULTI命令执行之后,我们可以继续发送命令执行,但此时命令不会立即执行,而是保持到一个队列中,如下

    用户4919348
  • 通过照片内容搜图,Facebook这个新技能是如何实现的?

    现在,你可以在Facebook上通过描述照片中的内容来搜索图片了:手工添加的图片标题和标签都不再重要。 这个功能的背后,是Facebook计算机视觉平台Lum...

    量子位
  • JavaScript 数据结构(2-1):栈与队列-栈篇

    栈和队列是web开发中最常用的两种数据结构。绝大多数用户,甚至包括web开发人员,都不知道这个惊人的事实。如果你是一个程序员,那么请听我讲两个启发性的例子:使用...

    疯狂的技术宅
  • 给初学者:JavaScript 中数组操作注意点

    作者:CarterLi https://segmentfault.com/a/1190000012463583 不要用 for_in 遍历数组 这是 JavaS...

    企鹅号小编
  • 【k8s开发必备技能】使用client-go包访问Kubernetes CRD

    Kubernetes API服务器可通过自定义资源定义轻松扩展。但是,用client-go库访问这些资源有点麻烦,官方也没有完整的文档。如kubebuilder...

    sealyun

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动