1. 环境

  • ubuntu16.04
  • GTX1080Ti x 4
  • nvidia-418
  • cuda-10.1
  • pytorch1.0.0

目标:在最新的显卡驱动下,使用不同版本的cuda和深度学习框架来执行、编译模型代码。

2. 前言

众所周知,NVIDIA的cuda版本更新的很快,且不同cuda版本不兼容,所以导致有些模型的部分layer在cuda编译时,十分的麻烦。

例如我碰到的例子,实验室需要运行flownet2.0,NVIDIA给出了官方实现,但其中有几个layer使用了cuda编写,在运行模型之前要先编译这几个layer,这就导致了几个问题:

  1. pytorch版本限制为0.4.1,实验室服务器的版本是1.0.0
  2. cuda版本要求9.0,实验室服务器的版本是10.1

在不能回退服务器版本的情况下,就需要献上docker大法了,这也是本篇博客的主题。

3. 更新nvidia驱动

在切换cuda之前,我推荐给你的服务器来个大升级,把驱动更新到最新以支持最新版的cuda(目前是10.1)。

但是驱动也不是随意更新的,例如我安装nvidia-410和nvidia-415驱动,都不能识别显卡(nvidia-smi命令运行不了)。

大家肯定常常听说,cuda的恐怖之处在于需要和显卡驱动版本对应,其实cuda-8.0后就没有这个问题了,可以看NVIDIA给出的版本对照表格:

https://github.com/NVIDIA/nvidia-docker/wiki/CUDA

所以其实只需要保持驱动最新就行了,没有版本的上限,所以推荐给你的驱动做一下升级。

首先查看推荐驱动:

sudo ubuntu-drivers devices

输出:

== /sys/devices/pci0000:80/0000:80:03.0/0000:83:00.0 ==
modalias : pci:v000010DEd00001B06sv000010DEsd0000120Fbc03sc00i00
vendor : NVIDIA Corporation
driver : nvidia-418 - third-party free recommended
driver : nvidia-396 - third-party free
driver : nvidia-415 - third-party free
driver : nvidia-390 - third-party free
driver : nvidia-410 - third-party free
driver : xserver-xorg-video-nouveau - distro free builtin
driver : nvidia-384 - distro non-free

可见推荐的驱动为nvidia-418

建议在安装新驱动之前卸载旧版本驱动:

sudo apt-get remove --purge '^nvidia-.*'
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-418 # 需要重启才能生效
sudo reboot

安装完成后检查是否生效:

nvidia-smi

4. 安装docker和nvidia-docker

这一步就跳过啦,网上已经有很多教程了。

验证是否可以运行多cuda环境(会自动pull不存在的镜像):

docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi

5. 万金油,启动

万金油docker:https://github.com/ufoym/deepo (docker hub上的说明文档更新不及时)

可以看到你可以选择不同版本的cuda来安装镜像,这里以flownet2.0需要的pytorch0.4.1和cuda-9.0举例:

首先把cuda-9.0 + pytorch的镜像拉取下来:

docker pull ufoym/deepo:pytorch-py36-cu90

运行(这里假设你的数据放在/home/ubuntu/data下:

docker run --runtime=nvidia -it -v /home/ubuntu/data:/data ufoym/deepo:pytorch-py36-cu90 bash

此时就会进入docker的bash,我们来检查一下版本是否正确:

root@6b0ddf89d46f:/# python
Python 3.6.8 (default, Dec 24 2018, 19:24:27)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'1.0.0'
>>> torch.version.cuda
'9.0.176'
>>>

可以发现cuda版本对了,但是torch还是1.0.0,这个时候我们只需要查阅一下pytorch的官网,重装一下pytorch就行了。

旧版本参阅:https://pytorch.org/get-started/previous-versions/

# 卸载旧版本
pip uninstall pytorch-nightly torchvision-nightly # 安装新版
pip install https://download.pytorch.org/whl/cu90/torch-0.4.1-cp36-cp36m-linux_x86_64.whl

再次验证后,torch版本已经修改到了0.4.1:

root@6b0ddf89d46f:/# python
Python 3.6.8 (default, Dec 24 2018, 19:24:27)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.__version__
'0.4.1'
>>> torch.version.cuda
'9.0.176'
>>>

这个时候我们就能cd到data目录下,对flownet的几个cuda layer进行编译了。

但是如果你退出了docker bash,这个镜像会被关闭,这个时候只需要执行以下命令就可以再次进入:

# 查看刚刚启动的镜像id
docker ps -a # 启动镜像
docker start 6b0dd # 进入bash
docker exec -it 6b0dd bash # 当你再次退出时就不需要重新启动镜像了,直接用上述命令进入即可。

6. 总结

做完上述事情后,我们就可以在最新的显卡驱动下,使用各版本的cuda来编译我们的代码了。

7. 参考资料

参考博客:

http://andy51002000.blogspot.com/2019/01/nvidia-smi-has-failed-because-it.html

CUDA版本列表:

https://github.com/NVIDIA/nvidia-docker/wiki/CUDA

查看推荐驱动:

sudo ubuntu-drivers devices

查看显卡是否识别:

lspci | grep 'VGA'

确认kernel版本:

uname -a

升级ubuntu:

sudo do-release-upgrade -d

安装驱动:

sudo apt-get remove --purge '^nvidia-.*'
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-418

重启

sudo reboot

查看安装是否成功

nvidia-smi

检测cuda10在docker中是否可用:

docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi

安装deepo:

docker pull ufoym/deepo:all-jupyter-py36-cu100

[AI] 切换cuda版本的万金油的更多相关文章

  1. cmake编译opencv时指定cuda版本

    之前有网友提问说,基于cmake编译时如果切换cuda版本,比如我同时装了cuda8和cuda9,opencv总是找到cuda9,我想用cuda8怎么办?实际上,手头上要配置的工程是基于opencv3 ...

  2. linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数

    linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数 ln -s /usr/local/arm/3.4.1/bin/arm-linux-gcc /usr/bin/arm-linux ...

  3. mac 切换php版本

    通过brew安装的php可以通过brew link和brew unlink来切换不同版本 #brew list #brew unlink php56 #brew link php55

  4. 在macOS上通过pyenv安装和切换多版本Python

    1. 安装homebrew 官网 http://brew.sh/index_zh-cn.html 打开终端,在终端中粘贴如下脚本 /usr/bin/ruby -e "$(curl -fsSL ...

  5. 使用nvm管理node不同版本,安装,环境配置,切换不同版本的node版本

    文章包含以下内容: 一.下载地址 二.nvm-noinstall.zip安装 三.nvm-setup.zip安装 四.测试安装以及使用 一.下载地址 https://github.com/coreyb ...

  6. lnmp 切换PHP版本,并且安装swoole

    lnmp 切换php版本 进入 lnmp 安装的目录,进入install.sh 的目录执行: sudo ./install.sh mphp 备注: find / -name install.sh 备注 ...

  7. 使用GNVM工具高效切换node版本

    在开发中,有时候需要在多个node版本之间切换,重复手动下载安装node安装包来切换版本很麻烦,在Mac系统中可以使用nvm工具,而windows系统无法使用nvm工具.gnvm解决了在windows ...

  8. 切换JDK版本时修改JAVA_HOME环境变量不生效(转)

    当电脑上存在多个版本的JDK时,可能 会遇到想切换版本时无论你如何改JAVA_HOME的路径 进入cmd java -version 都无法得到最新设置的JDK版本 如果遇到类似以下信息 Regist ...

  9. Linux(ubuntu18.04)切换python版本

    前言 Ubuntu18.04系统在安装python时会安装两个版本:2.7和3.6.默认情况下系统环境使用的是python2,但是我们有时需要使用python3来作为我们的开发环境,所以需要自由切换p ...

随机推荐

  1. 使用vue搭建应用二加入element

    安装使用 element 1.安装 yarn add element-ui 2.使用 (1)在 main.js 中引入 element main.js 为修改 import Vue from 'vue ...

  2. Linux 就该这么学 CH04 VIM编辑器和Shell命令脚本

    0 概述 1 Vim编辑器 在linux 中一切都是文件,而配置一个服务就是修改其配置文件的参数. vim 编辑器有三种模式:命令模式,末行模式和编辑模式. 命令模式:控制光标移动,对文件进行操作. ...

  3. [转帖]Shell运维手册

    shell实例手册    https://github.com/liquanzhou/ops_doc   0 说明{       手册制作: 雪松   更新日期: 2018-09-11       欢 ...

  4. Python实现字典树

    字典树,又称单词查找树,Trie 树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串 ...

  5. git第一次上传push失败解决

    第一次上传有可能会遇到push失败的情况,那是因为跟SVN一样,github上有一个README.md 文件没有下载下来 .我们得先 git pull --rebase origin master   ...

  6. [动图演示]Redis 持久化 RDB/AOF 详解与实践【华为云技术分享】

    Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...

  7. python内存机制与垃圾回收、调优手段

    目录 一.python的内存机制 二.python的垃圾回收 1. 引用计数 1.1 原理: 1.2 优缺点: 1.4 两种情况: 2. 标记清除 2.1 原理: 2.2 优缺点: 3. 分代回收 3 ...

  8. kie-api介绍和使用

    参考:KIE kie在drools jbpm uberfire里广泛被使用,下面对kie-api中的几个重要组件做下简单介绍 maven依赖 <dependency> <groupI ...

  9. Golang slice和map的申明和初始化

    1 前言 仅供记录使用. 2 代码 /** * @Author: FB * @Description: * @File: SliceMapInit.go * @Version: 1.0.0 * @Da ...

  10. JVM性能优化--Java的垃圾回收机制

    一.Java内存结构 1.Java堆(Java Heap) java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例 ...