从零开始制作PyTorch的Singularity容器镜像
技术背景
在前面的博客中,我们大篇幅的使用到了Docker和Singularity这两种常见的容器化编程环境解决方案,使得我们的各个编程环境能够更好的隔离。如果要展开讲解容器化编程环境的重要性的话,我们有可能会发现容器并不是那么的必须:比如解决python库的依赖冲突问题,我们可以选择使用python的virtualenv或者conda的虚拟环境;比如解决gcc的版本依赖冲突,我们可以手动配置和选择对应的版本;比如对于我们没有root权限和对外网络的环境,想要安装一些工具可以采用源码编译安装。那么,这些种种的问题,如果我们采用Singularity的方案,就可以一次性的解决。而且容器化是一个趋势,比如各种的机器学习框架都会提供容器版本的安装方案,像MindSpore和Tensorflow等等。这里我们尝试使用Singularity的容器def文件(类似于Docker的Dockerfile,而且兼容Docker的镜像),去构造一个Pytorch专属的编程环境。
环境准备
这里我们假设本地的容器环境是已经安装完毕的,可以通过如下指令进行检验:
dechin@ubuntu2004:~/projects/pytorch$ singularity --version
singularity version 3.8.0-rc.1
建议至少使用3.5以上版本的Singularity,否则会有编译不兼容的问题。关于Singularity的安装与基本使用,可以参考这篇在Manjaro Linux上安装Singularity的方法、以及在CentOS上安装Singularity的方法,还有这篇用Singularity来配置MindSpore环境的博客。
制作def文件
Singularity的def文件类似于Docker的Dockerfile,用于定义一个容器镜像,而在这个文件中我们除了指定基础镜像之外,还可以指定下载基础镜像之后要执行的配置项目。我们先看一个简单例子:
dechin@ubuntu2004:~/projects/pytorch$ cat pytorch.def
Bootstrap: docker
From: ubuntu
%post
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
apt-get -y update
apt -y install python
apt -y install python3-pip
pip3 install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
这个例子就实现了pytorch整个的容器化安装流程,但是这里不建议大家直接使用我写的这个def文件来制作镜像,这里面最后一步安装pytorch的指令,需要适配自己本地的环境进行调整。下面解释一下这些指令的含义:
Bootstrap用于指定下载的仓库类型,建议是选取docker,因为这里面的镜像是最多的。From用于指定一个基础镜像的版本,因为ubuntu是一个使用比较广泛的发行版,因此我们指定ubuntu的时候,脚本会自动从dockerhub上面寻找最新版本的ubuntu镜像进行下载。当然我们也可以指定一个特殊的版本,比如可以指定为ubuntu:16.04。%post是在容器镜像中执行的系统指令,这些指令执行完成后生成的文件等会被打包保存到我们的镜像sif文件中。类似的指令还有%environment,可用于配置export环境变量,还有%runscript可用于执行一些脚本命令。- 从
cp到apt-get update这4个步骤,是在容器内更新系统镜像源,我们采用的是华为云的镜像源https://mirrors.huaweicloud.com/,一般国内的镜像源在使用apt下载东西的时候会有比较明显的加速效果,当然这个镜像源仓库还有很多其他的源,比如pip源等等。 - 在这个镜像文件中我们可以直接使用
apt来安装python和pip,但是注意安装的时候要加上-y的选项,这个选项可以帮助我们默认跳过需要手动确认的项目,我们知道在apt安装的过程经常会暂停下来,要求输入一个y之后才能继续往下安装,但是这个在使用镜像的时候是没办法支持手动的输入的。 - 最后我们按照参考链接1中给出的安装指令进行安装,注意要匹配好自己的环境,本文采用的配置项目如下截图所示:

构建sif文件
在完成上述步骤的镜像配置文件后,可以用如下的指令进行镜像的构建:
sudo singularity build pytorch.sif pytorch.def
在执行的过程中会有大量的信息弹出,我们只关注下开头和结尾即可:
INFO: Starting build...
Getting image source signatures
Copying blob 345e3491a907 skipped: already exists
Copying blob 57671312ef6f skipped: already exists
Copying blob 5e9250ddb7d0 [--------------------------------------] 0.0b / 0.0b
Copying config 7c6bc52068 done
Writing manifest to image destination
Storing signatures
2021/06/15 09:44:57 info unpack layer: sha256:345e3491a907bb7c6f1bdddcf4a94284b8b6ddd77eb7d93f09432b17b20f2bbe
2021/06/15 09:44:58 info unpack layer: sha256:57671312ef6fdbecf340e5fed0fb0863350cd806c92b1fdd7978adbd02afc5c3
2021/06/15 09:44:58 info unpack layer: sha256:5e9250ddb7d0fa6d13302c7c3e6a0aa40390e42424caed1e5289077ee4054709
INFO: Running post scriptlet
+ cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
...
Successfully installed numpy-1.20.3 pillow-8.2.0 torch-1.8.1+cu111 torchaudio-0.8.1 torchvision-0.9.1+cu111 typing-extensions-3.10.0.0
INFO: Creating SIF file...
INFO: Build complete: pytorch.sif
一般如果有报错的话中途就会停下来,如果看到上面的这个指令,基本就构建成功了,并且可以在当前目录下看到一个新生成的sif文件:
dechin@ubuntu2004:~/projects/pytorch$ ll
总用量 4086900
drwxrwxr-x 2 dechin dechin 4096 6月 15 09:53 ./
drwxrwxr-x 8 dechin dechin 4096 6月 15 09:34 ../
-rw-rw-r-- 1 dechin dechin 498 6月 15 09:44 pytorch.def
-rwxr-xr-x 1 dechin dechin 4184969216 6月 15 09:53 pytorch.sif*
这个就是我们构建好的pytorch的镜像了。
PyTorch镜像测试
首先我们看一下镜像中python的版本:
dechin@ubuntu2004:~/projects/pytorch$ singularity exec pytorch.sif python3 --version
Python 3.8.5
因为pytorch对python的版本没有比较特殊的要求,所以这里3.7或3.8或3.9都是可以的。接下来执行一个pytorch官方给出的测试示例,生成一个随机数矩阵:
dechin@ubuntu2004:~/projects/pytorch$ singularity exec pytorch.sif python3 -c "import torch;x = torch.rand(5, 3);print(x)"
tensor([[0.2045, 0.2268, 0.2132],
[0.4473, 0.3536, 0.8075],
[0.0951, 0.0261, 0.5950],
[0.7112, 0.0449, 0.4564],
[0.8697, 0.7536, 0.7823]])
上述运行的方式是采用了python3 -c的方式,省去了再写一个py文件的繁琐,只是需要注意的地方,在于我们要将正常py文件中的换行符替换成这里的分号,这里执行成功了,那么就代表我们的容器化安装是成功了。但是我们需要进一步的确认下,torch能否正常的使用cuda环境,因为这是GPU加速的重点配置。测试可以使用官方给出的这个运行指令:
dechin@ubuntu2004:~/projects/pytorch$ singularity exec pytorch.sif python3 -c "import torch;print(torch.cuda.is_available())"
False
第一次看到这个结果的时候,我优先考虑的是,是否cudatoolkits没有安装的原因?因为在MindSpore中对于这个cudatoolkits是有依赖的,并且使用的是conda来安装,但是这里我们直接装的python没有采取conda的方法。但是转念一想,这里的Singularity运行指令上没有指定GPU环境,更有可能是这个问题。因此加上了--nv的选项,运行结果如下:
dechin@ubuntu2004:~/projects/pytorch$ singularity exec --nv pytorch.sif python3 -c "import torch;print(torch.cuda.is_available())"
True
可以看到pytorch的GPU版本是运行成功了的,或者应该说成功调用到了GPU。
Tricky的配置
使用容器化的方案来运行的话,在运行环境的隔离上面是做的非常好的,但是有一个缺点就是运行的指令太长了,虽然容器镜像的位置是固定不变的,但是每次执行这么一大串指令总觉得麻烦,因此就想到了在环境变量配置文件.bashrc中加上一个声明,用更加简短的语句来替代长指令:
alias mindspore='singularity exec --nv /home/dechin/tools/singularity/mindspore-gpu_1.2.0.sif python'
alias pytorch='singularity exec --nv /home/dechin/projects/pytorch/pytorch.sif python3'
写入到.bashrc文件后,需要source ~/.bashrc指令来使得配置生效,然后我们就可以使用pytorch这样的指令来运行一些pytorch的代码或者命令:
dechin@ubuntu2004:~/projects/pytorch$ pytorch -c "import torch;print('import success')"
import success
总结概要
这篇文章主要介绍Facebook所主导的机器学习框架PyTorch的容器化安装方法,基于HPC环境常用的Singularity高性能容器,并且兼容与结合了Docker容器镜像的生态,非常的友好。在容器化的编程环境中,我们不仅可以避免不同框架对于python库或者系统软件版本的依赖冲突,还可以很大程度上解决因为没有root权限以及网络外访权限的环境下所带来的极大的麻烦,故推荐使用这种方案进行安装和运行。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/pytorch.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958
参考链接
从零开始制作PyTorch的Singularity容器镜像的更多相关文章
- Docker下制作一个容器镜像
操作过程描述: (1)先基于centos的镜像启动一个centos容器 (2)在这个容器中安装nginx (3)然后把这个已经安装了nginx的容器制作成一个docker的镜像 操作:docker c ...
- Kubernetes — 深入理解容器镜像
而正如我前面所说的,Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”:而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙.这么一折 ...
- 制作ubuntu16.04的docker镜像
来自http://www.jianshu.com/p/029a1ed4fd64 背景 因为笔者是在vagrant转移到docker的玩家,所以对系统镜像情有独钟.如果你是windows.mac用户,那 ...
- [Docker]容器镜像
1.rootfs的基础知识 Mount namespaces 隔离的是文件系统挂接点,它使每个容器能看到不同的文件系统层次结构,即每当创建一个新容器时,希望容器进程看到的文件系统时一个独立的隔离环境 ...
- 容器镜像服务联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像
Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...
- 制作nginx+php的docker镜像方法
制作nginx+php的docker镜像方法一.准备安装的工具工具:docker-17.06.0-ce.nginx-1.13.2.PHP-5.5.38 .supervisor配置思路:1.安装dock ...
- 云间玉兔,自出机抒,从零开始制作Web插件网页特效小兔子组件(小挂件widget),基于原生CSS/NPM
著意登楼瞻玉兔,何人张幕遮银阙?又到了一年一度的网页小挂件环节,以往我们都是集成别人开源的组件,但所谓熟读唐诗三百首,不会做诗也会吟,熟读了别人的东西,做几首打油诗也是可以的,但若不能自出机抒,却也成 ...
- 使用Dockerfile构建容器镜像
Dockerfile官方文档: https://docs.docker.com/engine/reference/builder/ 获取容器镜像的方法 容器镜像是容器模板,通过容器镜像才能快速创建容器 ...
- Docker 定制容器镜像的2种方法
一.需求 由于在测试环境中使用了docker官网的centos 镜像,但是该镜像里面默认没有安装ssh服务,在做测试时又需要开启ssh.所以上网也查了查资料.下面详细的纪录下.在centos 容器内安 ...
随机推荐
- Codeforces Round #426 (Div. 2) A. The Useless Toy
A. The Useless Toy time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 【Python微信机器人】第六篇:优化使用方式,可pip安装
优化内容 这篇不聊技术点,说一下优化后的Python机器人代码怎么使用,优化内容如下: 将hook库独立成一个库,发布到pypi,可使用pip安装 将微信相关的代码发布成另一个库,也可以pip安装 g ...
- CTFHub XSS DOM反射 WriteUp
前言:本文需要注册一个xss平台,以接收xss反弹回来的数据,请自己在互联网上寻找合适的xss平台 1. 构造闭合语句 根据题目提示,判断网站存在DOM xss漏洞 查看页面源代码,发现关键位置,其中 ...
- python中,如何优雅的解析和管理命令行参数
背景 我们在编写python程序时,程序中经常会提供多种功能或者模式,在实际使用时根据不同的参数使用不同的功能.那么如何获取命令行传入进来的参数呢? 一般方法 一般情况下,我们会使用 sys 模块,如 ...
- Java中ArrayList的遍历与删除元素方式总结
在Java编程中,我们经常需要对数据结构进行遍历操作,并根据业务需求删除部分元素.而数组列表(ArrayList)是集合类中的一种,它可以动态地添加和删除元素,非常适合在程序中使用.本篇博客将总结Ar ...
- C++篇:第十三章_异常_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十三.异常 ① 函数指针与该指针所指的函数必须具有一致的noexcept异常说明 ...
- 带你了解敏捷和DevOps的发布策略
摘要:随着数字化.信息化.网络化和智能化的普及和发展,企业对软件服务的质量和上线速度要求越来越高.传统研发模式难以满足要求,企业的开发运维模式逐渐向敏捷和DevOps 转型,敏捷和DevOps理念正被 ...
- vue2升级vue3:provide与inject 使用注意事项
provide / inject 类似于消息的订阅和发布.provide 提供或发送数据, inject 接收数据. VUE provide 和 inject 使用场景 当我们需要从父组件向子组件传递 ...
- vmware14安装centos8
vmware14 推荐,直接选取centos8镜像,然后安装,发现是无法安装的. 然后选择自定义安装,然后,选择客户机操作系统,只有centos7 64位,没有centos8 64位的. 搜了一下,看 ...
- PPT 表格设计
顶级商业图表在哪找 https://www.mckinsey.com.cn/ 麦肯锡 图表 https://www.cbnweek.com 第一财经 https://data.163.com/ DAT ...