作为深度学习算法工程师,除了要跟论文、公式、数据、代码打交道,还有更基础、有时候也是最头疼的就是环境,环境操作的熟练程度对工作效率有重要影响。经过无数次的挖坑踩坑,有必要把常用的环境操作进行总结梳理。
为了支持多个不同的工程,只有一个环境一般是不够的,使用过的多环境工具有anaconda虚拟环境、pipenv、docker等,但在大规模工程实践中,docker在多系统移植、多平台支持和多用户复用和隔离等方面有着非常大的优势,所以应用更加广泛。本文主要介绍docker的基本操作,以及搭建好docker环境后,如何使用本地pycharm远程连接docker环境并在本地浏览器使用tensorboard进行可视化分析。
一、docker基本操作和应用场景
docker有两个基本概念:镜像(image)和容器(container),二者的关系类似于类和对象,一个是静态且固化的环境文件,一个是运行起来的、可以修改和操作的环境实例。docker的所有操作的前提是已经安装好docker软件,并且存在至少一个基础镜像,基础镜像可以从远程镜像仓拉取或者自行下载。
下面从基于一个基础镜像启动一个新的容器开始:
1.查看所有本地镜像
查看本地镜像的命令是:
docker images
可以看到镜像名称、ID、创建时间、size和标签(TAG),假设有一个镜像名称和标签为image_test:1.0
2.创建容器
创建容器的命令有:
docker run
或docker create
二者都是基于一个镜像创建新的容器,区别是docker create只创建不启动,而docker run创建后启动。
注意在docker19版本之前,docker是不支持gpu的,因而无法使用nvidia显卡,如果需要使用nvidia,需要使用nvidia-docker命令,而docker19版本之后不需要。假设我们要创建一个名为container_test的容器并启动它:
nvidia-docker run --name container_test image_test:1.0
如果需要启动后直接进入容器,则需要加上-it参数
如果需要外部访问容器,需要用-p参数设置容器与服务器之间的端口映射。由于后续要使用pycharm(默认22端口)和tensorboard(默认6006端口),所以至少需要设置两个端口映射。
如果需要挂载服务器地址,需要用-v参数设置容器与服务器之间的地址映射。由于需要使用docker运行服务器中/home/my_name/projects下的代码,所以需要将这个地址映射到容器内,假设新建一个/workspace
由于默认给docker分配的共享内存只有64M,所以需要用--shm-size调整大小。
所以完整命令可以写为:
nvidia-docker run --name container_test --shm-size="32g" -v /home/my_name/projects:/workspace -p 40010:22 -p 40011:6006 -it image_test:1.0