搭建mxnet-gpu docker的pyhon remote kernel
起因
最近看mxnet的东西,打算给实验室的机器装一个mxnet的环境,无奈实验室里面机器已经装了tensorflow,运行了好久了,环境比较老。而mxnet可是支持最新的cuda9.1和cudnn7的。研究了一段时间后,发现cuda的docker镜像是个不错的选择。别问我为啥不编译tensorflow以获得cuda9.1和cudnn7的支持,谁再让我编译tensorflow,谁是XX。
试着装了一个cuda9.1的docker镜像,发现很好用,基本除了nvidia-docker之外,不需要其他任何外部依赖。
配合atom的插件hydrogen,可以实现notebook的几乎全部功能。
这个文档中的带显卡的主机用的是ubuntu18.04的操作系统。远程访问的机器使用的是debian sid版本。
本来想用cuda9.2的,但是很尴尬的发现nvidia-docker不支持cuda9.2。
docker的安装
我们这里为了安装的速度比较快使用的是国内的docker安装镜像,具体的来说,使用的是ali云的docker安装镜像。注意这里说的是安装镜像,跟apt的源一样,只是用来安装docker用的。安装说明参考ali给的文档:
https://yq.aliyun.com/articles/110806
国内docker镜像源的修改
因为docker官方的镜像仓库在海外,国内访问还是比较慢的,所以我们需要修改一下,使用国内的docker镜像源。
注意,这里说的镜像源,不同于上一部分的安装源,这里说的是docker image存放的源,也就是docker hub。
以root权限,编辑/etc/docker/daemon.json文件,如果目录或者文件不存在,则直接创建就可以。这个文件是json格式的。在文件内添加如下内容:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
免 sudo 使用 docker
docker安装之后,默认,必须要用sudo去运行相关的docker命令,很不方便,这里做一下修改。
将用户加入 docker group 内。然后退出并重新登录。
sudo gpasswd -a ${USER} docker
重启 docker 服务
sudo service docker restart
切换当前会话到新 group 或者重启 X 会话
newgrp - docker
OR
pkill X
OR
ctrl alt backspace
注意,最后一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。
到这里,已经可以happy的使用docker了,但是由于docker中是无法访问主机的显卡资源的,想要在docker内部用显卡,我们还得装一些特殊的东西。
nvidia-docker2的安装
这个工具可以打通docker内部的环境和主机上的显卡。没啥好说的,参考官方的文档安装就可以了:
https://github.com/NVIDIA/nvidia-docker/
不过,需要注意的是,这个安装的过程,会自动修改/etc/docker/daemon.json的内容,所以,我们刚刚添加的国内的docker镜像源的设置会被覆盖掉。所以我们要重新设置一下,经过编辑后,我的这个json文件内容如下:
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
做完这些,我们可以试着跑个nvidia的docker看看了:
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
不出什么意外状况的话,你会看到主机上的显卡也能在docker中被正确的检测出来。
镜像的选择
nvidia自己以ubuntu的镜像为基础创建了一堆cuda的镜像:
https://hub.docker.com/r/nvidia/cuda/tags/
这些镜像中包含不同的cuda版本,以及不同的cuda库配置。
这里选用 9.1-cudnn7-runtime 这个标签的镜像作为基础。
构建docker镜像
这里使用的是docker build命令配合Dockerfile文件。
Dockerfile的语法参考 https://docs.docker.com/engine/reference/builder/
Dockerfile
文件内容如下
FROM nvidia/cuda:9.1-cudnn7-runtime
MAINTAINER dwSun
ADD sources.list /etc/apt/sources.list
RUN apt-get update
RUN apt-get install python3-pip libgfortran3 -y
RUN pip3 install mxnet-cu91mkl jupyter matplotlib seaborn pandas ipython scikit-image -i https://pypi.douban.com/simple/ && rm -rvf ~/.cache
RUN jupyter notebook --generate-config
RUN sed "s/#c.NotebookApp.token = '<generated>'/c.NotebookApp.token = 'mx_cuda'/" /root/.jupyter/jupyter_notebook_config.py -i
RUN mkdir /code
WORKDIR /code
EXPOSE 8888
CMD jupyter notebook --port=8888 --ip 0.0.0.0 --no-browser --allow-root
文件中有对sources.list文件的引用,这个文件跟Dockerfile放在同一个目录下面。文件为国内阿里的ubuntu镜像源,为的是apt-get的时候能够快一点,文件内容如下:
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
也可以使用其他的国内linux源,具体细节参考各个linux源关于ubuntu的使用说明。
注意这里使用的是ubuntu16.04,而ubuntu16.04的版本号是xenial
docker内的文件需要使用volume传递给外界,所以这里的镜像预留了一个code目录作为运行目录,使用默认参数运行的话,会直接从code目录启动ipython kernel的gateway。
sed前后的两行是为了让hydrogen运行的时候,可以不用输入token,这里直接将token设置为了mx_cuda
更详细的内容,参考 https://nteract.gitbooks.io/hydrogen/docs/Usage/RemoteKernelConnection.html
build
到Dockerfile所在的文件夹下面执行
docker build . -t mx_cuda
这里生成一个tag为mx_cuda的镜像。
需要注意的是,Dockerfile所在的文件会被整个发送给docker dameon作为编译的context,所以不要在这个文件夹里放其他没有意义的东西,更不要使用home目录。
hydrogen
介绍
参考:https://atom.io/packages/hydrogen
他们还有一个叫做nteract的项目,是桌面版本的notebook。参考 https://github.com/nteract/nteract
安装
使用apm或者直接在atom里面安装 hydrogen
apm install hydrogen
设置
找到hydrogen的设置,在 Kernel Gateways里面填写:
[{
"name": "your config name",
"options": {
"baseUrl": "http://your_cuda_host_ip:port",
"token": "mx_cuda"
}
}]
运行
到cuda的主机里面执行以下命令,启动docker镜像里面的ipython kernel gateway。
docker run --runtime=nvidia -p 0.0.0.0:8888:8888 --rm mx_cuda -d
or
docker run --runtime=nvidia -p 0.0.0.0:8888:8888 --rm -v path:/code mx_cuda -d
在atom里面编写一个简单的mxnet测试脚本,使用ctrl+shift+p找到Hydrpgen: Connect to Remote Kernel并运行
然后就是实际的使用了。
不使用hydrogen
其实不使用hydrogen,也可以直接在浏览器里面直接输入http://your_cuda_host_ip:port,直接使用jupyter notebook。
注意事项
需要注意的是,因为我们是在远程调用的kernel,所以我们代码里面读取数据的部分,都是读取的kerenl所在机器的目录,也就是docker里面的目录,而不是我们写代码的ide启动的目录。
另外,你的代码如果有多个文件,那么,其实只有你编辑的那个文件能放到你的ide所在的机器上,其他的文件都要放在docker所在的那个显卡主机上,不然import是找不到的。也就是其实hydrogen的使用其限制跟jupyter notebook是一样的。
总结
其实这里是因为host的环境太复杂了,而且不好做变更,所以选了一个比较费劲而且折腾的办法,其中很多的步骤,可以抽出来,例如,可以直接在显卡主机上安装cuda和mxnet,使用同样的方式设置hydrogen。
之所以选hydrogen,是因为他的代码提示同时基于ipykernel和atom的python-ide,比jupyter爽太多了,而且不差jupyter中的交互式代码调试。不过毕竟hydrogen太小众,自己用用就好。如果是做演示的场合,老老实实用jupyter notebook吧。
搭建mxnet-gpu docker的pyhon remote kernel的更多相关文章
- 在CentOS 6上搭建私有的Docker Registry
在CentOS 6上搭建私有的Docker Registry v2Registry概念 :Registry是一个无状态的, 高可扩展的服务器端应用程序, 用于存储和分发Docker Image. 依赖 ...
- 搭建Harbor企业级docker仓库
搭建Harbor企业级docker仓库 一.Harbor简介 1.Harbor介绍 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如 ...
- Error when Building GPU docker image for caffe: Unsupported gpu architecture 'compute_60'
issue: Error when Building GPU docker image for caffe: Unsupported gpu architecture 'compute_60' rea ...
- ubuntu安装mxnet GPU版本
安装mxnet GPUsudo pip install mxnet-cu80==1.1.0 推荐pip安装mxnet,土豪gpu版本: pip install mxnet-cu90==1.0.0 豪华 ...
- Docker容器化【Dockerfile编写&&搭建与使用Docker私有仓库】
# Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用 ...
- 在Docker容器中搭建MXNet/Gluon开发环境
在这篇文章中没有直接使用MXNet官方提供的docker image,而是从一个干净的nvidia/cuda镜像开始,一步一步部署mxnet需要的相关软件环境,这样做是为了更加细致的了解mxnet的运 ...
- 搭建和使用Docker私有仓库
需要注意的是,从Docker Pool下载的镜像文件,与官方镜像文件是完全一致的. 安装Docker之后,可以是使用官方提供的registry镜像来搭建一套本地私有仓库环境: docker run ...
- Docker系列08—搭建使用私有docker registry
本文收录在容器技术学习系列文章总目录 1.了解Docker Registry 1.1 介绍 registry 用于保存docker 镜像,包括镜像的层次结构和元数据. 启动容器时,docker dae ...
- 搭建自己的Docker registry(五)
弄了一天,在网上查了很多资料,感觉都好复杂好复杂,一步一步踩坑踩出来就好了. 服务器:阿里云(香港) 环境:CentOS Linux release 7.4.1708 (Core) Docker:1. ...
随机推荐
- laravel 创建自动化生成数据库
1. 生成 迁移脚本 php artisan make:migration create_users_table --create=users(表名) 当你⽣成⼀个模型时想要顺便⽣成⼀个 数据库迁 ...
- windows环境下安装Python的Rtree包
Rtree包是基于libspatialindex开发的,在安装Rtree之前必须先安装libspatialindex.关于libspatialindex,除了官网的英文外,这里有一个中文翻译过来的介绍 ...
- 用CSS3制作尖角标签按钮样式
如图的效果.标签有背景色,且左侧有一个三角形,三角形中间有个白色的圆圈. 你一定在想这个效果是背景图切出来的吧——答案是没有用到任何图片 那你会不会在想这个效果的html结构很复杂呢——答案是最简单的 ...
- 使用 JavaScript 截屏
经常在微博上看到很多内容使用的什么长微博截图,并且截图上还附加了很多其他的信息.之前对纯前端截图有些研究,正好本博客有这个需求,今天就把这东西实现了下. 需要声明的是,JavaScript 目前还不能 ...
- GAN 教程记录
目标:使G产生的分布sample出来接近D的分布 1.G产生的data是否是database中的图片 a.计算L1 L2相似度 2.GAN与其他生成器相比较,能够生成较为清晰的图片 3.一次itera ...
- 1,python 的基本数据类型
Python3 中有6个标准的数据类型:Number(数字);字符串(String);列表(list);元组(Tuple);字典:(Dict);集合(Sets) Number: 数字 int整形 fl ...
- Response的Content-Type一览
文件扩展名 Content-Type(Mime-Type) 文件扩展名 Content-Type(Mime-Type) .* application/octet-stream .tif image/t ...
- 解决Kubelet Pod启动CreatePodSandbox或RunPodSandbox异常方法
新装Kubernetes,创建一个新Pod,启动Pod遇到CreatePodSandbox或RunPodSandbox异常.查看日志 # journalctl --since :: -u kubele ...
- JNDI在Spring和tomcat下的使用
1. 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一.JNDI 在 J2EE 中的角色就是&q ...
- JavaScript基础应用
1.实现字符串的反向输出 var s="abc" s.split('').reverse().join('') -----> "cab" 知识点: S ...