专栏首页Dechin的专栏从零开始制作PyTorch的Singularity容器镜像

从零开始制作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可用于执行一些脚本命令。
  • cpapt-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

参考链接

  1. https://pytorch.org/get-started/locally/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker 从零开始制作基础镜像[centos]

    http://www.oschina.net/news/62897/docker-hub-contains-high-risk-vulnerabilities ...

    双面人
  • Manjaro Linux安装singularity-container

    容器化技术在各种生产领域已经得到了广泛的应用,这得益于容器的轻量化(相比于虚拟机而言),安全性(隔离弱于虚拟机,但是权限控制得当的情况下也可以认为是安全隔离的)...

    DechinPhy
  • 在CentOS上安装Singularity高性能容器

    Singularity是劳伦斯伯克利国家实验室专门为大规模、跨节点HPC和DL工作负载而开发的容器化技术。具备轻量级、快速部署、方便迁移等诸多优势,且支持从Do...

    DechinPhy
  • 快速上手使用Singularity进行生物信息分析

    生信分析流程往往需要消耗数以万计的电脑计算资源。另外,生信分析过程中会用到大量的分析程序以及脚本,还需要对运行环境进行配置与管理。这会导致分析的可重复性变低,导...

    王诗翔呀
  • Singularity入门之通过沙盒创建镜像

    在此镜像目录之上运行容器,这里需要使用 “--writable” 选项来使其可写。

    kongxx
  • Singularity入门之运行图形应用

    要在 Singularity 中运行图形程序需要重新制作一个镜像,使其包含执行图形应用程序需要的环境和程序,这里还是通过 sandbox 的方式来制作一个可以运...

    kongxx
  • Singularity入门之运行容器

    和Docker类似,要运行 Singularity 也需要先获取镜像,Singularity 可以从Singularity Hub 或者 Docker Hub ...

    kongxx
  • Singularity入门之持久化Overlay

    在 Singularity 中运行容器,当容器退出时,对容器做的修改均会丢失,那怎么保存对容器的修改呢?此时我们可以通过 Singularity 的 Overl...

    kongxx
  • Singularity入门之通过镜像定义文件创建镜像

    下面以 Redis 数据库为例,主要说说 %startscript 和 %runscript 的区别。

    kongxx
  • PyQt5 从零开始制作 PDF 阅读器(一)

    此前,我已经写了三篇关于 Ui 界面的文章,分别是:猜数游戏、计时器程序和天气查询软件。这次,我们使用 Python 实现 PDF 阅读器。

    用户2870857
  • PyQt5 从零开始制作 PDF 阅读器(二)

    上一篇文章中,我们实现了 PDF 阅读器的初始界面。这一次,新增了阅读功能,可以实现基本的翻页以及缩放等操作。不过,暂时只可以同时阅读一本书。(文末小程序留言)

    用户2870857
  • win10从零安装配置pytorch全过程图文详解

    (anaconda内置python在内的许多package,所以不用另外下载python) 可以点击下面的清华开源软件镜像站,在官网下载anaconda不如在...

    砸漏
  • 【Docker】从零开始将自己的应用打包到docker镜像

    参考了网上各种文档,都感到说的不清不楚,实际操作过程中,又遇到了不少的坑,这里摸索OK后记录一下。

    BH8ANK
  • dyno使用教程--1个R包实现59种单细胞轨迹推断分析

    A comparison of single-cell trajectory inference methods[1](Saelens et al., 2019...

    生信技能树jimmy
  • PyTorch入门书籍盘点

    对于深度学习框架而言,PyTorch是一匹十足的黑马,虽然Tensorflow依然占据着老大哥的位置,但是从2019年的各项数据显示PyTorch大有一飞冲天之...

    HuangWeiAI
  • 六轴机械手臂有哪些奇异点?

    六轴机械手臂由六组不同位置的马达驱动,每个马达都能提供绕一轴向的旋转运动,其位置可参照下图。从自由度(Degree of Freedom)的概念来看,六轴机械手...

    机器人网
  • 如何将pytorch检测模型通过docker部署到服务器

    。镜像文件也上传到docker hub了,可以一步步运行起来,不过需要先安装好docker。docker的安装可参考官方文档。https://docs.dock...

    机器学习AI算法工程
  • PyTorch专栏(一)

    【磐创AI导读】:本篇文章讲解了PyTorch专栏的第一章,简单介绍了PyTorch及其环境搭建,希望对大家有所帮助。查看上篇关于本专栏的介绍:PyTorch专...

    磐创AI
  • Harbor 2.0的飞跃: OCI 兼容的工件仓库

    开源镜像仓库 Harbor 2.0 正式发布了!从 2017 年 4 月发布 1.1 版本算起,经过整整 3 年,Harbor 的版本号终于 “升” 到 2.x...

    Henry Zhang

扫码关注云+社区

领取腾讯云代金券