Air-GappedDGX运维指南

鱼与熊掌,二者可皆得乎?

——子棐

前言

气隙系统,英文原文是Air-Gapped System,指代的是不通过任何方式与互联网连接的电脑。在连接上网络之后服务器容易受到恶意软件的侵扰或者恶意的攻击,因此基于安全性考虑,大多数企业都会对自己数据中心的服务器进行互联网访问限制,这就造成了DGX无法访问外部网络从而无法更新DGX专属操作系统,软件以及容器镜像。DGX的系统更新会修复系统或者Firmware里面存在的漏洞并提高系统的稳定性,软件的更新能提供更加丰富的功能,容器镜像的更新能进一步加速深度学习训练,因此这三部分的更新都是非常重要也必要的。因此如何在保证安全性的前提下,进一步利用DGX自带的软件部分的优势是本文的主要内容。

平台篇

气隙DGX的平台包括了以下两部分内容:

DGX 操作系统

DGX Firmware (BIOS,BMC)

DGX 操作系统 --- 重置系统

从Enterprise Support Portal (ESP) 下载DGX ISO镜像

使用DGX控制台U盘安装

制作可启动优盘,详细流程参考:https://docs.nvidia.com/dgx/dgx1-user-guide/maintenance.html#create-bootable-usb-flash-drive

按照屏幕提示重装操作系统: https://docs.nvidia.com/dgx/dgx1-user-guide/maintenance.html#reimaging-the-system-usb

使用BMC虚拟控制台安装:https://docs.nvidia.com/dgx/dgx1-user-guide/maintenance.html#reimaging-the-system-remotely-bmc

将ISO保存到本地机器;

通过BMC虚拟控制台挂在虚拟媒介;

按照提示安装操作系统。

DGX 操作系统 --- 更新系统

拥有网络访问权限的DGX可使用以下命令对操作系统进行OTA更新 (小版本更新)

sudo apt-get update

sudo apt-get dist-upgrade

对于气隙DGX同样可以使用以上命令进行更新,但需要制作本地数据源仓库,制作方法请参见软件包部分。

*对于大版本系统更新需要更多操作配置,具体参见https://docs.nvidia.com/dgx/dgx-os-server-release-notes/index.html

DGX Firmware

为了进一步提高系统的稳定性并修复漏洞,NVIDIA官方会提供DGX相关的BIOS和BMC的升级文件,升级的方法是通过容器的形式来实现,升级流程如下:

下载升级容器tar包;

使用U盘或移动硬盘将该容器tar包复制到气隙DGX上;

在需升级的气隙DGX上使用以下命令载入该tar包;

docker load -i nvidia-dgx-fw-0101-2017XXXXXX.tar.gz

使用以下命令验证是否成功载入该容器镜像:

docker images

查询该Firmware的版本号:

docker run --privileged -v /:/hostfs nvidia-dgx-fw-0101-2017XXXX show_fw_manifest

更新VBIOS Firmware:

docker run --privileged -ti -v /:/hostfs nvidia-dgx-fw-0101-2017 update_fw VBIOS

安装完成后重启系统;

通过以下命令验证是否成功安装:

nvidia-smi -q | grep -i VBIOS

总的来说,对于DGX操作系统重置可通过U盘、虚拟控制台安装完成;对于系统的升级可以利用基于互联网的OTA升级或基于本地软件仓库的OTA升级;对于Firmware的升级是利用升级专用容器镜像包来完成的。

软件包篇

软件包是任何操作系统的灵魂,OS是承载这个灵魂的血肉,若没有一个优秀的灵魂,那也不过一具行尸走肉。对于气隙DGX来说,其是无法访问到互联网的,因此也是无法获取到软件仓库提供的新鲜资源,久而久之,再美好的灵魂也会枯萎,因此如何让气隙DGX获得最新的养分——软件包呢?这边给出的方法是在气隙DGX集群内部提供内部离线的repositories,主要包括以下两个部分:

使用非气隙本地服务器镜像备份DGX repository的软件包*

在气隙本地服务器创建web服务(HTTP/HTTPS/FTP)以接收来自于本地DGX的apt请求(安装包安装请求)

* DGX repository为英伟达专为DGX用户提供并维护的repository,只有DGX用户才可以获取该repository,其中包括了针对DGX优化的系统文件,软件包等。

镜像备份DGX repository的软件包

DGX repository是基于Linux的软件仓库,提供的是DGX的操作系统的所需的常见软件安装包。由于气隙DGX无法访问互联网,因此需要使用一个拥有网络访问权限的本地服务器将DGX repository的软件包备份成镜像,这里我们可以使用apt-mirror工具来实现,配置的具体流程如下:

在非气隙的本地服务器中安装apt-mirror:apt-get install -y apt-mirror;

配置apt-mirror:编辑非气隙本地服务器的/etc/apt/mirror.list文件,该文件包含的是备份的repository的链接地址。需要将DGX的/etc/apt/sources.list文件和目录/etc/apt/sources.list.d下面的文件中的repository地址添加到该文件中;

运行apt-mirror以备份所有repository,可以通过设置/etc/apt/mirror.list文件中bash_path变量以指定软件包下载目录;

下载目录中的mirror文件夹包括了所有下载的deb文件;

此外,也可以设置一个cron job来定期更新repository。

本地repository

在非气隙本地服务器中镜像备份了DGX repository软件仓库之后,可以在气隙本地服务器运行一个Web服务器来让气隙DGX可以访问本地的repository,以满足本地DGX的软件访问需求,主要配置流程如下:

Web服务器中安装Apache;

将非气隙本地服务器下载目录挂载或者复制到Web服务器中;

确认Web服务器可以访问软件包下载目录。一般来说,Apache服务器的默认文档路径为/var/www/html(Ubuntu 14.04以后),但这不一定是镜像仓库下载目录,这时候可以:

编辑/etc/apache/conf/httpd.conf配置文件里的DocumentRoot变量,使其指向下载目录的mirror文件夹

或将下载目录的mirror文件夹的内容复制到默认文档路径下

或在默认文档路径下创建一个软链接指向下载目录的mirror文件夹

重启Web服务器的Apache服务:sudo service apache2 restart

配置气隙DGX的仓库列表,使其使用本地repository:更新/etc/apt/sources.list文件以及/etc/apt/sources.list.d文件夹里面的文件,使其指向本地repository。例如将deb http://security.ubuntu.com/ubuntu xenial-seurity main 替换为 deb http://本地源服务器的IP地址/ubuntu/ xenial-secutiry main

在DGX上运行sudo apt-get update更新软件仓库列表

自动化工具

以上的解决办法只能是简单的解决了气隙DGX访问软件仓库的问题,但是其中也有一些问题:

本地仓库下载有几百G的大小,如何只下载需要的软件包;

怎么解决安装依赖的问题;

怎么对于不同的DGX使用不同版本的软件源;

怎么对一整个集群进行管理和更新;

怎么自动化这个配置流程;

为了解决这些问题,这边主要有两个工具:

Aptly

支持备份部分软件包及相关依赖包;可接收来自不同源的软件包以及对本地repository进行镜像操作以保存指定版本的软件包。

Landscape

支持对DGX进行分组,从而精确控制DGX的本地repository访问权限;远程的更新软件包;自动管理更新任务等等。

容器篇

DGX提供了10个优化容器镜像,包括Caffe、Mxnet、Pytorch、TensorFlow等等。这些容器镜像大约每个月都会得到相应的更新和优化,以Caffe为例,相同的硬件条件下,在两年的时间内性能翻番。那如何能够在气隙DGX上使用最新的、优化的深度学习框架呢,这是接下来需要详细介绍的内容。

复制指定容器镜像至气隙DGX

对于拥有互联网访问权限的DGX来说是可以直接去NVIDIA DGX容器镜像库拉取最新的深度学习容器镜像的,那么对于气隙DGX来说最简单的方法就是在可以访问互联网的服务器下载镜像,然后将镜像复制导入DGX,具体的操作流程如下:

本地服务器(拥有互联网访问权限)

登录至DGX容器镜像库:docker login nvcr.io

username: $oauthtoken

Password: (获取的API Key)

使用docker pull拉取所需的容器镜像:docker pull nvcr.io/nvidia/caffe:18.04-py2

使用docker images显示所有下载好的镜像

将docker镜像保存导出成tar包: docker save -o caffe-18.04-py2.tar nvcr.io/nvidia/caffe:18.04.py2

将保存的镜像tar包拷贝到气隙DGX中

气隙DGX

使用docker load命令将容器镜像导入DGX中: docker load -icaffe-18.04-py2.tar

使用docker images显示所有下载好的镜像

DGX容器镜像库为NVIDIA专为DGX用户提供的容器镜像库,前文登录需要前往相应账户获取登录所需的API Key。

使用Docker Registry

上面的在管理几台DGX时是可行的,但是如果需要管理大的集群或者需要定期的对容器镜像进行更新,这种手动维护的方式效率就十分低下了。因此最好是通过维护本地Docker Registry的方法来实现,这样类似于拥有了本地的容器镜像库,而无需对每台气隙DGX逐一拷贝导入而是使用docker pull命令即可完成镜像下载。Docker Registry由Docker官方提供了容器镜像,只需要基于该镜像运行容器即可,整体系统的实现架构如下图所示:

非气隙服务器

运行Docker registry容器:

docker run -d \

-p 5000:5000 \

--restart=always \

--name registry \

-v /mnt/registry:/var/lib/registry \

registry:2

使用docker pull命令拉取DGX container registry提供的镜像

docker pull nvcr.io/nvidia/caffe:18.04-py2

使用docker tag命令每一个镜像打上自定义标签

docker tag caffe:18.04-py2 localhost:5000/caffe:18.04-py2

使用docker push命令将标签化的容器镜像上传至本地registry

docker push localhost:5000/caffe:18.04-py2

气隙服务器

运行Docker registry容器:这里需要挂载映射的volume是是前面在气隙机器中映射的/mnt/registry

气隙DGX

使用docker pull即可去气隙服务器中拉取所需的镜像

docker pull myregistryhost:5000/caffe:18.04-py2

这里需要注意的是:

对于Docker registry,其默认的registry数据都是存放在/var/lib/docker下的,但是这个volume是有大小限制的,因此建议使用bind-mount将volume挂载映射到/var/lib/volume目录下。这样在气隙系统重新运行内部Docker registry可以直接挂载映射这个volume.

自动化工具及其他篇

如上文所介绍的,我们需要自己手动处理的操作至少包括:

平台——运行Firmware更新容器

软件包——更新软件仓库列表,更新DNS

容器——测试DGX是否可以访问本地的repository

如果是一个大规模的集群,这些手动的管理将会是非常低效的,如何高效的完成这些任务呢,这里介绍的就是自动化管理工具Ansible。Ansible是开源的自动化配置管理工具,其配置通过是通过YAML来实现,其是非常容易学习和使用的,管理节点只需要在安装了Python 2.6或者Python2.7的非Windows系统上即可。下图是Ansible部署结构图:

管理员通过提交Inventory文件和Playbook至Ansible管理节点即可对目标DGX进行管理。其中Inventory文件是包括的需要管理的DGX节点,需要在该文件中指定DGX节点的IP地址、主机名和密码,当然也可以手动输入密码,此外还可以在文件中对气隙DGX节点进行分组,这样Playbook可以对不同组的设备分别执行不同的操作。而Playbook就是我们需要对目标DGX进行的配置操作,例如更新多个DGX的Firmware等等。

文末

如上图所示,这是整个气隙DGX运维管理指南:

对于操作系统、Firmware的更新可以采用离线镜像安装的方式完成;

对于系统OTA、软件包的更新可以通过维护管理一个本地DGX repository的方式完成;

对于容器镜像仓库可以采用载入导出或者创建本地Docker registry的方式完成。

而对于大的集群的管理,Ansible是一个很好的自动化配置工具,能极大的提高集群的管理效率。行文至此,已经基本介绍完了如何在拥有熊掌(安全性)的同时拥有鱼(最新的软件系统服务),通过这样的解决方案能进一步的提高DGX的使用效率,从而提高训练的迭代速度。

以上

子棐

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180513G0JFT300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券