build / pull
基于 docker image 创建 singularity image:
singularity -d build /home/tom/singularity-images/tf-2.1.simg \
docker://tensorflow/tensorflow:2.1.0-gpu-py3
对应 docker 之 docker pull tensorflow/tensorflow:2.1.0-gpu-py3
,其中:
- 第一个参数是拉下来的 image 的保存路径、名字,按需自改。
docker://
之后就是要拉的 image 名。- 可以基于本地的 docker 仓库 build,见 [1]。
拉完就可以在 /home/tom/singularity-images/ 下看到 tf-2.1.simg。
build from recipes
类似 docker 用 Dockerfile 创建镜像,singularity 的创建文件称 recipe 写法参考 [3],build 方法参考 [4]。[5] 有 recipe 示例:
#
注释;Bootstrap
写 docker,From
就可以用 docker hub 上的 docker 镜像,详见 [3];%labels
写 meta data,格式:<key> <value>
;%post
是创建时的命令,类似 dockerfile 的RUN
。
Bootstrap: docker
From: pytorch/pytorch:1.2-cuda10.0-cudnn7-runtime
%labels
Python 3.6.9
CUDA 10.0
cuDNN 7
PyTorch 1.2.0
torchvision 0.4.0
%post
# required by UTS iHPC
export DEBIAN_FRONTEND=noninteractive
mkdir -p /data /projects /scratch
# python packages
pip install --upgrade pip setuptools wheel
pip install --no-cache-dir \
"scikit-learn>=0.23.2" "munkres>=1.1.4" "opencv-python==4.3.0.38" "numpy>=1.19.1" \
click Cython easydict fire graphviz h5py matplotlib \
ninja pandas PyYAML scipy tensorboard xlwt
可考虑用 nvidia 优化过的 docker image 为基础 build,见 [6]。
instance start / run
启动容器:
export SINGULARITY_TMPDIR=/home/tom/tmp
export TMPDIR=/home/tom/tmp
singularity instance start --nv \
# --fakeroot \
-B /home/tom:/home/tom,/home/tom/dataset:/home/dataset \
/home/tom/singularity-images/tf-2.1.simg \
tf-2
类似 docker 之 docker run
,其中:
-
这一步在计算结点执行。
-
--nv
启用 gpu 支持,类似 docker 之--gpus all
。 -
--fakeroot
确保容器内有权限(其实目前不加好像也完全可以)- 加了这个参数,会产生
rootfs-*
目录,见下一条。
- 加了这个参数,会产生
-
两行
export
更改 Temporary Folders,防止 /tmp 被撑爆。- /tmp 可能磁盘容量少,就需要改去一个容量大的位置。
- 加
--fakeroot
会在这个指定的 tmp dir 下生成形如rootfs-*
的目录,stop 容器之后还在,要手动删。
-
-B <宿主路径>:<容器内路径>
挂载目录,类似 docker 之-v
。多个挂载点用逗号,
分隔。 -
tf-2
是容器名(instance name),自己随便取,连接容器时要用。
instance list / ps
singularity instance list
可以看到已启动的容器,类似 docker 之 docker ps
。
shell / exec
进容器:
singularity shell instance://tf-2
类似 docker 之 docker exec
。 tf-2
就是 start 创建时指定的 instance name。
exit
退出容器,在容器内:
exit
退出之后可以重连。
instance stop / stop + rm
关闭(并删除)容器:
singularity instance stop tf-2
关了好像就!没!了!不像 docker stop,用 docker ps -a
还可以看到、可以重新 start。更像是 docker stop
+ docker rm
。
所以没事别 stop,exit 就好。而如果加了 --fakeroot
记得 stop 之后删掉产生的 rootfs-*
目录。