docker简单操作,以及运行gpu

来源:互联网 发布:淘宝皇冠账号多少钱 编辑:程序博客网 时间:2024/06/07 21:56

         最近正在做关于gpu的运行相关的工作。所以本篇文章所写的都是本人经过真实操作的,并非网络版本的copy,这个也是增加积累以及分享。

         先说下我最近的目的,希望训练模型可以运行在cpu以及gpu上,由于gpu运行速度较快,所以在机器学习中,计算资源的考虑必不可少,其实我的最终目标是使用kubernetes集群来管理运行基于tensorflow的模型训练任务。由于目前k8s运行gpu还没有实际跑通,所以最近一直比较苦恼,若是有大神能指导下,感谢之至。

         好的,下面来说如何在docker中运行gpu。

         先简单介绍下docker的基本使用。下面我就完全以我的操作来说明。

         首先下载需要的image,我是需要下载Google tensorflow的cpu版本,当然docker hub上基本都有常用的image,所以如果机器直接可访问外网,那么直接

        docker  pull  tensorflow:tensorflow

        如果无法访问外网,那么你需要通过其他方式下载,完了save镜像成为一个tar包,然后copy到你的环境中,进行load即可。下载image后,为了整个集群的各个node节点都可用,可以push到私有仓库即可。具体如下:

        docker tag  tensorflow:tensorflow  27.10.0.101:5000/tensorflow:v1

        docker push    27.10.0.101:5000/tensorflow:v1

       如上,就已经push到私有仓库了。如何创建私有仓库此处不做说明,因为网上资料已经很好了。吐舌头

    

       我们也可以自己制作image,比如说我是制作基于cpu 版本的tensorflow的mnist手写字体的image,具体如下:

      vim Dockerfile

      FROM     27.10.0.101:5000/tensorflow:v1

      MAINTAINER  ANDYTAO

      COPY MNIST_data    /MNIST_data

      COPY mnist.py   /

      如上Dockerfile已经创建好,执行 docker build -t   mnist:v1   -f Dockerfile .

      如此,我创建的mnist运行image已经完成。接下来介绍如何运行?

      docker  run  -it   mnist:v1  /bin/bash

      启动容器,进入容器后 cd  /

      python mnist.py  

      到此,docker简单的运行介绍完毕。

      

     GPU运行:

     要运行gpu,那么毫无疑问是需要gpu的运行环境的。安装NVIDIA driver以及cuda,以及cudnn。注意在安装这些时,需要根据os版本,内核版本等来选择适合的版本安装。以下的介绍都是基于tensorflow官网的提示进行的,本人也是在摸索中前进的。

     1、下载对应的gpu image。docker pull gcr.io/tensorflow/tensorflow:0.110-gpu   可参考tensorflow官网

     2、根据宿主机配置选择合适版本nvidia-docker。具体参考:http://www.nvidia.cn/object/docker-container-cn.html

     3、安装nvidia-docker

     4、启动nvidia-docker服务。systemctl  start  nvidia-docker.service

     5、同样,如上所示,制作Dockerfile,切记将FROM基础镜像换成gpu版本的image。

     6、运行python mnist.py  

     7、回到宿主机,执行watch   -n  1   nvidia-smi   可以看到gpu的利用率,内存都发生了变化,那么证明运行成功。

      

        至此,docker中运行gpu的示例demo已经完毕,但是我目前遇到的问题如何在k8s里边运行gpu。因为k8s封装了docker,直接起的容器方式就是通过docker,但是我目前跑通gpu的实例如上,需要借助nvidia-docker而不是docker,所以我不知道这两种方式如何进行统一或者一致,否则k8s如何进行底层切换?cpu时使用docker创建container,而gpu时使用nvidia-docker?所以各位明白我文章开头说的问题了吧。

        我看到网上也有说使用docker run  -v 以及--device运行gpu的方式,我也试过,但是每当代码执行的时候,老是报错,can't open libcuda.so,以及什么文件找不到的问题,并且代码执行之后,从宿主机看,gpu使用率以及内存都不发生任何变化,也没有检测到pid,所以我目前还不知道如何通过k8s来真正执行gpu,目前还在学习中,一旦问题解决,后期还会分享。




  

     







0 0