Build Pytorch & tersorflow with Docker

"Docker Pytorch & tersorflow"

Posted by Stephen on January 2, 2021

前言

基于Docker 搭建 Pytorch_GPU & tersorflow_GPU

环境

系统环境

Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
Linux version :       5.3.0-46-generic ( buildd@lcy01-amd64-013 ) 
Gcc version:         7.5.0  ( Ubuntu 7.5.0-3ubuntu1~18.04 )

软件信息

version : 	
     None

正文

1、安装Docker

​ 略

2、安装nvidia显卡驱动

# 查看本机是否安装了nvidia显卡驱动程序
$ sudo dpkg --list | grep nvidia-*

# 卸载nvidia程序
$ sudo apt-get purge nvidia*

# 查看gpu硬件版本情况
$ cat /proc/driver/nvidia/version

# 查看推荐的nvidia驱动版本
$ ubuntu-drivers devices

## 这里选择 recommended,即
sudo apt install nvidia-driver-470

3、安装nvidia-Docker

因为原来的docker不支持GPU加速,所以NVIDIA单独做了一个docker,来让docker镜像可以使用NVIDIA的gpu。

nvidia-docker官方文档

4、部署

镜像(image),是一个配置好的环境。容器(container),是image的具体实例。镜像和容器的关系相当于面向对象中类与对象的关系。

4.1、部署Pytorch

  1. 拉取指定版本docker-image,并启动容器。

    docker-hub: pytorch/pytorch: 文档说明书很少

    bitnami/pytorch:文档说明详细

    $ docker run --runtime=nvidia -it --name pt1 -v $(realpath ~/workspace/${PWD##*/}):/workspace/${PWD##*/}  -p 5678:5678 pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel 
    

4.2、部署Tersorflow

  1. 拉取指定版本docker-image,并启动容器。

    docker-hub:tensorflow/tensorflow: 文档说明详细

以tensorflow/tensorflow:2.6.0rc1-gpu-jupyter例子:

Run a Jupyter notebook server with your own notebook directory (assumed here to be ~/notebooks). To use it, navigate to localhost:8888 in your browser.

$ docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:2.6.0rc1-gpu-jupyter

5.检测cuda 和cudnn

5.1 cuda和cudnn

cuda: Compute Unified Device Architecture,是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。

cuDNN:NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。

cuda和cuDNN的关系: CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。

5.2 cuda

nvcc -V

5.3 Pytorch

使用 PyTorch 查看 CUDA 和 cuDNN 版本

import torch
print(torch.__version__)

print(torch.version.cuda)
print(torch.cuda.is_available()) 

print(torch.backends.cudnn.version())
print(torch.backends.cudnn.is_available())

5.4 Tensorflow

  • 判断CUDA是否可用:

    tf.test.is_built_with_cuda()
    
    参考: [tf.test.is_built_with_cuda TensorFlow](https://www.tensorflow.org/versions/master/api_docs/python/tf/test/is_built_with_cuda)
  • 判断GPU是否可用:

    tf.test.is_gpu_available(
        cuda_only=False,
        min_cuda_compute_capability=None
    )
    

    参考: tf.test.is_gpu_available TensorFlow

    tl;dr: If tensorflow-gpu works, then CuDNN is used.

    How can I check if keras/tensorflow is using cuDNN?

后记

问题1

在某个时间,突然发现显卡不能用了,输入nvidia-smi显示:

$ nvidia-smi -a
Failed to initialize NVML: Driver/library version mismatch

分析:

可能nvidia-smi版本被修改了(自动更新还是人为修改),参考

原因

dmesg |tail -4

使用此命令,会发现报错原因

NVRM: API mismatch: the client has the version 450.102.04, but
NVRM: this kernel module has the version 440.80.02.  Please
NVRM: make sure that this kernel module and all NVIDIA driver
NVRM: components have the same version.

也就是libnvidia-compute-450的包已经是102版本了,但驱动还是80,导致版本不匹配

vi /var/log/apt/history.log

使用此命令,能看到更新时间和命令,发现是自动更新时导致的libnvidia-compute-450 package升级

Start-Date: 2021-01-21  06:47:07
Commandline: /usr/bin/unattended-upgrade
Upgrade: libnvidia-compute-450-server:amd64 (450.80.02-0ubuntu0.18.04.3, 450.102.04-0ubuntu0.18.04.1)
End-Date: 2021-01-21  06:47:10

解决:

网上很多人说重启就行了【先尝试重启】,然而我这里并不行,最终解决办法是:

sudo apt install nvidia-driver-450

然后再重启

sudo reboot