鱼与熊掌,二者可皆得乎?
——子棐
前言
气隙系统,英文原文是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的使用效率,从而提高训练的迭代速度。
以上
子棐
领取专属 10元无门槛券
私享最新 技术干货