「记录」使用PCI设备直通技术在vSphere中部署基于Ubuntu Server 1804的GPU服务器

大约在两年前我撰写了一篇文章记录我为实验室部署GPU云的核心过程。现在给学院部署GPU云,本以为可以照着原来的文章很顺利就可以装完,结果却搞得心态爆炸,一度怀疑人生,所以很有必要再写一篇记录一下。

环境:

实体机:曙光 天阔 W780-G20
操作系统: VMware ESXi, 6.7.0, 14320388
管理平台: VMware vCenter Server Appliance, 6.7.0, 15129973
GPU:NVIDIA GP100GL [Tesla P100 PCIe 16GB] ×8

先简单说一下部署环境和上次的区别:第一是平台不再是商业大厂DELL EMC,很多文档资料缺失;第二是底层esxi和管理平台vcenter都升级到了6.7;第三是虚拟机准备安装Ubuntu Server 1804,之前的16在21年来看有点过老。最关键的是第四点:显卡质量和数量都上了一个巨大台阶,原来单台机器最多3卡(一个泰坦X,两个泰坦XP),遇到的显存最大的卡应该就是p40。当时在安装p40的时候就遇到奇怪的问题,为此还写了一篇记录文章。这次遇到的核心问题和p40那次应该是同一个,都是高级显卡显存过大,需要一些特定的底层配置参数,vmware专门有博客文章(下简称博文)进行了介绍,但是我一开始寻找解决方案的方向有很大偏差,绕了一大圈才找到。

让我一度怀疑人生的核心问题

0. 准备工作

0.1. 主机BIOS设置

根据博文内容,需要在运行虚拟GPU服务器的esxi主机的BIOS设置中查找并开启类似这样的选项:“above 4G decoding”、“memory mapped I/O above 4GB”、“PCI 64-bit resource handing above 4G”

启用BISO中的相关设定

0.2. 配置PCI设备直通

在esxi主机中配置好显卡的设备直通

0.3. 上传系统安装镜像

将ubuntu server 1804安装镜像上传到主机数据存储

1. 创建虚拟机

⚠️注意:必须在vsphere client中创建虚拟机,不可以在本地workstation创建虚拟机安装后再上传

首先按照常规方法创建虚拟机,创建后不要启动!按以下步骤进行预先配置。

1.1. 设置虚拟机引导方式为EFI

为虚拟机的“引导选项”中启用EFI

在虚拟机页面,“操作”→“编辑设置”→“虚拟机选项”→“引导选项”→“固件”,选择“EFI”。

1.2. 设置虚拟机高级配置参数

虚拟机选项中的高级选项卡

在刚才1.1的“引导选项”下方找到“高级”,点击“配置参数”右侧的“编辑配置”,进入高级参数配置窗口。

高级参数配置窗口

在窗口中点击“添加配置参数”,然后添加2条

⚠️注意:“pciPassthru.64bitMMIOSizeGB”条目的值需要根据虚拟机具体直通的显卡型号和数量进行计算后得出!

博文中提供了一种简单估算方法:GPU个数 × 一块GPU的显存大小(GB为单位),然后将结果向上取整到下一个2的整数次幂。

例如,要给这个虚拟机直通两个p100显卡,则值应为:2 × 16 = 32,向上取整到下一个2的整数次幂,得到64。但如果是直通v100显卡,64则只能直通一块,因为v100单卡显存就是32G,想要直通两块就需要改为128。

⚠️注意:与通常情况不同的是不可以添加“hypervisor.cpuid.v0 = FALSE”参数!

1.3. 修改虚拟机兼容性

选择升级虚拟机兼容性

在虚拟机页面,“操作”→“兼容性”→“升级虚拟机兼容性”,打开“配置虚拟机兼容性窗口”。

配置虚拟机兼容性窗口

将虚拟机兼容性改为:ESXi 6.7 Update 2 及更高版本

2. 安装操作系统

现在可以进行第一次开机,并按照提示安装操作系统。安装后,顺便进行基本的系统配置,例如换源、配置网络、软件包升级等。

3. 为虚拟机添加显卡直通

3.1. 启用内存预留

启用内存预留

在虚拟机页面,“操作”→“编辑设置”→“虚拟硬件”→“内存”,勾选“预留所有客户机内存(全部锁定)”。

3.2. 添加显卡设备

添加显卡设备

在虚拟机页面,“操作”→“编辑设置”→“虚拟硬件”→“添加新设备”→“PCI 设备”,然后在PCI设备选项中选择需要添加的显卡。

4. 安装NVIDIA驱动和CUDA

4.1. 检查GPU

4.2. 禁用nouveau

4.3. 安装依赖包

4.4. 安装NVIDIA驱动

默认已经下载好驱动文件

4.5. 安装CUDA

「记录」在vSphere中基于Ubuntu Server 1604部署Docker,并安装CUDA,构建多层虚拟化深度学习开发环境

首先准备好Ubuntu Server 1604的虚拟机,只设定基本功能,不添加显卡直通等特殊功能,以便于基础环境完成后进行快照。

安装好系统后,进行ssh端口设置,apt换源,apt upgrade等基本操作,之后关机打快照。

1、 显卡直通

1.1、 添加显卡直通

勾选“预留所有客户机内存(全部锁定)”,并添加显卡PCI设备,确定修改。不在第一步直通显卡的话,之后的驱动安装可能有问题!

1.2、 修改虚拟机硬件配置参数

切换到“虚拟机硬件”选项卡。展开“高级”,修改“配置参数”。 在打开的“配置参数”对话框中,点击“添加配置参数”,填入“
hypervisor.cpuid.v0 = FALSE”
,确定修改。完成后务必再次进入“配置参数”,检查参数确实已经添加并保存!

1.3、 启动虚拟机并配置基本环境

配置网络、换源、更新软件包等

完成基本配置后建议对虚拟机生成快照!

2、 安装显卡驱动

2.1、 下载驱动

可以在 NVIDIA驱动下载 或者 Geforce显卡驱动下载 页面搜索并下载需要的驱动程序,也可以通过直接拼接资源链接:
http://cn.download.nvidia.com/XFree86/Linux-x86_64/[驱动版本号]/NVIDIA-Linux-x86_64-[驱动版本号].run,进行下载。比如我要下载430.14版本号的Linux驱动,可以直接在服务器运行以下代码:

2.2、 检查GPU

应该显示相应的PCI设备

2.3、 禁用nouveau

2.3、 安装显卡驱动

安装完驱动建议对虚拟机生成快照!

然后开机安装docker,去清华源帮助文档里找清华源安装方法。安装好之后配置docker远程管理,参考“docker 配置 TLS 认证开启远程访问”“Docker 守护进程+远程连接+安全访问+启动冲突解决办法 (完整收藏版)”。配置好docker之后关机打快照。

在ESXi中添加显卡直通,并启动。

2020年6月28日补充

2.4、安装CUDA

本处使用的CUDA安装文件是文章在19年6月初次完成时下载的,因此安装方法也是当时的安装方法。根据从英伟达官网的CUDA安装文档来看,最新的推荐安装方式似乎变成了用apt包管理器安装。但是根据最新的安装文档,我在操作过程中出现了两个问题:首先是所有的下载资源(包括软件源证书和软件包)都无法在中国大陆正常下载;另一个是安装后server系统会出现GUI界面。因此,我决定使用去年的安装包和安装方法。

安装完CUDA建议对虚拟机生成快照!

3、 安装Docker

3.1、 安装Docker

根据清华开源镜像站的帮助文档,安装Docker。

3.2、 安装nvidia-docker

安装并配置好docker建议对虚拟机生成快照!

4、 配置TLS远程管理,及Portainer接入

配置TLS远程管理是在Docker服务器(运行docker守护进程的服务器)进行配置,因此下面的$HOSTDocker服务器的IP

4.1、 修改openssl配置的CA部分

ubuntu 16.04 下 openssl 配置文件位置:/usr/lib/ssl/openssl.cnf,其他系统可参考

4.2、 生成私钥并自签证书

4.3、 颁发证书

4.4、 配置Docker使用TLS认证

4.5、 Portainer接入

如果已经添加过服务器,只更新TLS认证配置,则只需要上传相应证书:

/etc/docker/ssl/目录内的cert.pemkey.pem文件拷贝到本地,上传至Portainer。

上传证书

如果是新服务器,按照下面步骤进行添加:

配置好TLS远程管理后建议对虚拟机生成快照!

参考资料

docker 配置 TLS 认证开启远程访问

Docker 守护进程+远程连接+安全访问+启动冲突解决办法 (完整收藏版)