热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

docker使用GPU及linux下cuda安装和更新问题

文章目录1.docker使用GPU2.镜像cuda版本和宿主机cuda版本不兼容2.1确定问题2.2解决方案3.ubuntu上安装GPU驱动4.NVIDIACUDAInstalla

文章目录

  • 1. docker使用GPU
  • 2. 镜像cuda版本和宿主机cuda版本不兼容
    • 2.1 确定问题
    • 2.2 解决方案
  • 3. ubuntu上安装GPU驱动
  • 4. NVIDIA CUDA Installation Guide for Linux


1. docker使用GPU

首先介绍几个事实:

  • 最初的docker是不支持gpu的
  • 为了让docker支持nvidia显卡,英伟达公司开发了nvidia-docker。该软件是对docker的包装,使得容器能够看到并使用宿主机的nvidia显卡。
  • 根据网上的资料,从docker 19版本之后,nvidia-docker成为了过去式。不需要单独去下nvidia-docker这个独立的docker应用程序,也就是说gpu docker所需要的Runtime被集成进docker中,使用的时候用–gpus参数来控制。

所以我一直都是直接以--gpus这个参数来使用容器的,直接给容器分配GPU

docker run -it -d --gpus "device=3" --ipc=host -p 10036:22 -v /ws/huangshan:/ws --name "paddle2.1" paddlepaddle/paddle:2.1.2-gpu-cuda11.2-cudnn8 bash -c "/etc/rc.local; /bin/bash"

详情见参考:

  • 怎么在docker中使用nvidia显卡

2. 镜像cuda版本和宿主机cuda版本不兼容

2.1 确定问题

下载PaddlePaddle的镜像,一开始使用的是最新的
在这里插入图片描述
然后就报错cuda版本不匹配
在这里插入图片描述
容器对应的镜像要求cuda版本是11.2以上,但是宿主机的cuda版本只有11.1。

docker: Error response from daemon: OCI runtime create failed:
container_linux.go:367: starting container process caused:
process_linux.go:495: container init caused:
Running hook #0:: error running hook: exit status 1,
stdout: , stderr:
nvidia-container-cli: requirement error:
unsatisfied condition: cuda>=11.2,
please update your driver to a newer version, or use an earlier cuda container: unknown.

参考:Ubuntu 配置docker以及 nvidia-docker

基本可以确定是因为宿主机的cuda驱动版本低导致的,网上大部分的说法是:
保持最新即可,CUDA驱动版本要求和CUDA版本匹配,而CUDA又要求cuDNN/TF是匹配的。不过CUDA驱动版本是向下兼容的,所以保持最新就没事

在这里插入图片描述
可以看到,nvidia-smi的版本和driver version驱动版本是一致的,cuda版本另算,不过两者之间有一定的对应关系,例如:

CUDA 10.0 containers至少需要cuda驱动版本是410
CUDA 10.1 containers至少需要cuda驱动版本是418

在这里插入图片描述

2.2 解决方案

很明显只有两条路可以走:

  1. 更新cuda版本
  2. 重新下载一个老一点的镜像,对cuda版本要求低一些的


搜索分析可行性和代价:

方案一:更新cuda版本

网上找到的答案大部分都是如何安装,没有更新的,关于更新的也都是建议卸载重装,其实还是属于安装。。。

参考:

  • stack-overflow问题:Tensorflow/nvidia/cuda docker mismatched versions
  • stackExchange问题:How do I Install CUDA on Ubuntu 18.04?

# 找到的有用信息就是如何安装,看起来比较简洁,记录下来
#In a terminal, type:
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo ubuntu-drivers autoinstall
# 重启
sudo apt install nvidia-cuda-toolkit gcc-6
nvcc --version

  • stack-overflow问题:Best practice for upgrading CUDA and cuDNN for tensorflow

如果要更新,需要先卸载所有cuda相关的内容,包括驱动,cuda以及cudnn等;然后再进行安装。
另外,在这个问题下,发现了nvidia的官方链接:NVIDIA CUDA Installation Guide for Linux,详细介绍写在本文第四部分。

结论就是官方文档也说想要安装新的,必须卸载旧的,没有可以直接更新的方式


方案二:重新下载一个老一点的镜像,从风险和耗费时间来看,都是这个比较靠谱!行动,

# 查看当前使用这个镜像的容器有哪些
docker ps -a|grep paddle
# 根据上面筛选出的容器,先关闭再删除
docker stop 容器ID
docker rm 容器ID
# 删除完容器之后再去删除镜像
docker rmi 镜像名称
# 删除镜像之前要先查看 通过这个镜像产生的容器有没有关闭和删除,不然镜像删不干净

在这里插入图片描述
搞一个老版本的
在这里插入图片描述

3. ubuntu上安装GPU驱动

参考:谷歌云-安装 GPU 驱动程序
科学上网才可以访问这个网页

主要就是搬运一下,也许以后用得到

# 1. 更新代码库
sudo apt-get update# 2. 搜索最新的 NVIDIA 内核模块软件包或您所需的版本。此软件包包含由 Ubuntu 密钥签名的 NVIDIA 内核模块。运行以下命令以查看最新的软件包
NVIDIA_DRIVER_VERSION=$(sudo apt-cache search 'linux-modules-nvidia-[0-9]+-gcp$' | awk '{print $1}' | sort | tail -n 1 | head -n 1 | awk -F"-" '{print $4}')
"""
注意:
如果您要查找早期版本,请更改 tail 命令中的数字以获取早期版本。
例如,将数字指定为 2 可获取下一个早期版本:
NVIDIA_DRIVER_VERSION=$(sudo apt-cache search 'linux-modules-nvidia-[0-9]+-gcp$' | awk '{print $1}' | sort | tail -n 2 | head -n 1 | awk -F"-" '{print $4}')
"""# 3. 安装内核模块软件包和相应的 NVIDIA 驱动程序:
sudo apt install linux-modules-nvidia-${NVIDIA_DRIVER_VERSION}-gcp nvidia-driver-${NVIDIA_DRIVER_VERSION}
"""
如果该命令失败,并且显示“找不到软件包”错误,则代码库可能缺少最新的 nvidia 驱动程序。返回到最后一步,以查找早期驱动程序版本。
注意:安装软件包时,系统可能会升级您的内核。
"""# 4. 验证是否已安装 NVIDIA 驱动程序,可能需要重启系统
nvidia-smi# 5. 找到兼容的 CUDA 驱动程序版本。以下脚本确定与我们刚刚安装的 NVIDIA 驱动程序兼容的最新 CUDA 驱动程序版本:
CUDA_DRIVER_VERSION=$(apt-cache madison cuda-drivers | awk '{print $3}' | sort -r | while read line; doif dpkg --compare-versions $(dpkg-query -f='${Version}\n' -W nvidia-driver-${NVIDIA_DRIVER_VERSION}) ge $line ; thenecho "$line"breakfi
done)
"""
也可以通过运行 echo $CUDA_DRIVER_VERSION 来检查 CUDA 驱动程序版本。输出是一个类似于 455.32.00-1 的版本字符串。
"""# 6. 使用上一步中识别的版本安装 CUDA 驱动程序。
sudo apt install cuda-drivers-${NVIDIA_DRIVER_VERSION}=${CUDA_DRIVER_VERSION} cuda-drivers=${CUDA_DRIVER_VERSION}# 7. 安装 CUDA 工具包和运行时。选择合适的 CUDA 版本。以下脚本确定与我们刚刚安装的 CUDA 驱动程序兼容的最新 CUDA 版本:
CUDA_VERSION=$(apt-cache showpkg cuda-drivers | grep -o 'cuda-runtime-[0-9][0-9]-[0-9],cuda-drivers [0-9\.]*' | while read line; doif dpkg --compare-versions ${CUDA_DRIVER_VERSION} ge $(echo $line | grep -Eo '[[:digit:]]+\.[[:digit:]]+') ; thenecho $(echo $line | grep -Eo '[[:digit:]]+-[[:digit:]]')breakfi
done)

"""
您可以通过运行 echo $CUDA_VERSION 来检查 CUDA 版本。输出是一个类似于 11-1 的版本字符串。
安装 CUDA 软件包:
sudo apt install cuda-${CUDA_VERSION}
"""
# 8. 验证 CUDA 安装:
sudo nvidia-smi
/usr/local/cuda/bin/nvcc --version
"""
第一条命令输出 GPU 信息。第二条命令输出已安装的 CUDA 编译器版本。
"""

4. NVIDIA CUDA Installation Guide for Linux

  • nvidia的官方链接:NVIDIA CUDA Installation Guide for Linux
    在这里插入图片描述
    其实这个英伟达的文档也是超级详细,以linux环境下安装cuda这个为例,看看(这里版本是11.4.1,如果想看其他版本的,可以点击这里或者cuda-toolkit-archive,加载速度可能会很慢,耐心等待,我以11.2.0为例进行说明):
    在这里插入图片描述

文档链接地址:
https://docs.nvidia.com/cuda/archive/11.2.1/cuda-installation-guide-linux/index.html

安装需求

一上来就是一个大表,重点关注其中gcc版本是9.x就好了。
在这里插入图片描述

处理安装版本冲突
这就是我一直纠结的地方,

Before installing CUDA, any previously installations that could conflict should be uninstalled. This will not affect systems which have not had CUDA installed previously, or systems where the installation method has been preserved (RPM/Deb vs. Runfile). See the following charts for specifics.
安装cuda之前,可能造成冲突的任何之前的安装都需要卸载掉,之前没有安装过cuda的系统无所谓,或者是之前的安装是保留的,如下表:

在这里插入图片描述

# Use the following command to uninstall a Toolkit runfile installation:
# 使用下列语句卸载一个toolkit runfile的安装
$ sudo /usr/local/cuda-X.Y/bin/uninstall_cuda_X.Y.pl
# Use the following command to uninstall a Driver runfile installation:
# 使用下列语句完成驱动的卸载
$ sudo /usr/bin/nvidia-uninstall
#Use the following commands to uninstall a RPM/Deb installation:
# 使用下列语句完成通过RPM或者Deb安装的卸载
$ sudo dnf remove <package_name> # RHEL8/CentOS8
$ sudo yum remove <package_name> # RHEL7/CentOS7
$ sudo dnf remove <package_name> # Fedora
$ sudo zypper remove <package_name> # OpenSUSE/SLES
$ sudo apt-get --purge remove <package_name> # Ubuntu

所以结论就是没有直接更新的方法&#xff0c;如果想要更新到新版本&#xff0c;必须卸载重装&#xff01;


推荐阅读
  • modulepaddle.fluidhasnoattributedata解决:pipinstallpaddlepaddle-gpu1.7.0.post107-ih ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 该ROM为红米3S3X手机提供了最强大的自定义功能,包括美观流畅的界面、全新的起航动画、魔幻的动画效果以及冰箱冻结功能。同时,还提供了高级设置,包括悬浮窗口显示自定义、WIFI密码查看器、S8炫酷跑马灯显示自定义等多项实用功能。此外,该ROM还优化了手机的待机时间、wifi连接速度,并支持状态栏实时网速显示和电池电量百分比显示。 ... [详细]
  • 本文介绍了Java调用Windows下某些程序的方法,包括调用可执行程序和批处理命令。针对Java不支持直接调用批处理文件的问题,提供了一种将批处理文件转换为可执行文件的解决方案。介绍了使用Quick Batch File Compiler将批处理脚本编译为EXE文件,并通过Java调用可执行文件的方法。详细介绍了编译和反编译的步骤,以及调用方法的示例代码。 ... [详细]
  • go channel 缓冲区最大限制_Golang学习笔记之并发.协程(Goroutine)、信道(Channel)
    原文作者:学生黄哲来源:简书Go是并发语言,而不是并行语言。一、并发和并行的区别•并发(concurrency)是指一次处理大量事情的能力 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Inno Setup区段之Components篇相关知识详解
    本文详细介绍了Inno Setup区段之Components篇相关的知识,包括Components和Types的使用方式以及各个参数的说明,希望对读者有一定的参考价值。内容涵盖了ComponentsName、Description、Types、ExtraDiskSpaceRequired、ExtraDiskSpaceRequiredFlags等多个关键词,帮助读者更好地理解和应用Inno Setup区段之Components篇的知识。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
author-avatar
手机用户2502927617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有