在IBM公有云上平台随心所欲的构建GPU虚拟服务器

如何在IBM Cloud上使用物理机自建带GPU的虚拟机

最近准备使用GPU的计算资源,听说IBM云平台上的裸机服务器性能不错,于是在IBM公有云平台上注册了一个账号(账号注册还是比较简单的,三步搞定,也是大家一看就明白的操作,我这里就不废话了)。 由于IBM云平台上的基础架构设施,诸如物理机,虚拟机,当然包括GPU资源的这些都属于基础架构一层,他们订购的话需要账号绑定信用卡,所以我联系了IBM相关人员,让他把我加到他们的一个POC测试账号下,这样就可以免费搞一个一个月的机器来使用了。

我们现在有几个项目,想在多种环境下测试多种GPU卡的性能,为最后的选型做准备,IBM平台上的物理机有多个GPU卡型号可选,但是虚拟机就一个型号(V100)而且在某些数据中心,GPU卡的资源还比较紧缺。由于我们想测试多个型号的GPU虚拟机,所以选择了在带GPU的物理机器上自建虚拟机来实现,然后再把GPU资源划分给虚拟机

在IBM云平台上下单含有GPU卡的物理机,我们下面所做的安装设置都是使用Passthrough方式访问的GPU卡,也就是说,一个GPU卡限定只给到单个虚拟机使用,如果你需要在同一台物理机上创建多个含有GPU卡的虚拟机的话,可以在下单物理机的时候选择多张GPU卡。

IBM云平台本身也提供GPU能力的虚拟机,但是有些时候,客户可能需要指定型号的GPU卡,这个时候IBM云平台不一定能提供到你要求的GPU卡的虚拟机,这种情况你可以使用物理机自己构建。

由于现阶段IBM云平台上单个物理机最多只支持两张GPU卡,所以创建的虚拟机也最多仅支持两张GPU卡。IBM在今年下半年会支持多张GPU卡的物理机推出,同时也会推出更多GPU卡的型号,如T4等等,到时单台物理机器可最多容纳8张GPU卡,大大提升了IBM云平台上GPU的能力。

 

前提:已经在IBM云平台上部署有带GPU卡的物理机

 

这里我们使用KVM来构建虚拟机,所以安装的是Linux操作系统,我下面的KVM相关操作都是在CentOS7的系统上来进行的。

 

启用passthrough直通模式:

物理机打开IOMMU功能。编辑配置文件: /etc/default/grub , 在GRUB_CMDLINE_LINUX = “ xxx” 的值中,添加一项intel_iommu=on, 然后运行grub2-mkconfig >/boot/grub2/grub.cfg将配置更新到启动文件,之后reboot,使其生效。这个是内核参数,只有重启才会重新加载内核才能生效。

 

如果物理机没有安装nvidia驱动的话,比较好处理:直接可以使用

如果已经在物理机上面安装了nvidia驱动的话,在上述过程之前,需要首先将设备从物理机解除绑定,才能够直通给VM,所以还需要下面的一些前期工作:

echo "10de 15f8" >/sys/bus/pci/drivers/pci-stub/new_id

说明:“10de 15f8”这个号是设备ID,在lspci -vnn |grep -i nvidia 的时候,最后一项就是,第一个号码(81:00.0)是PCI ID

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

echo 0000:81:00.0> /sys/bus/pci/devices/0000:81:00.0/driver/unbind

说明:“0000:81:00.0”为PCI的ID number

 

echo 0000:81:00.0 > /sys/bus/pci/drivers/pci-stub/bind

说明:“0000:81:00.0”是PCI的ID number

 

如果没有lspci命令,请执行下面命令安装:

Yum install pciutils

 

如果上述均执行成功,恭喜你,已经可以在VM中像在物理机使用GPU一样了。

 

在宿主机上检查并安装KVM虚拟软件:

  1. 首先验证CPU是否支持虚拟化,输入有vmx或svm就支持,支持虚拟化则就支持KVM

cat /proc/cpuinfo | egrep 'vmx|svm'

有输出,则说明机器支持虚拟化,否则提交工单要求后台启用虚拟化(这一步基本不会出现)

  1. 查看是否加载KVM,输出如下

[[email protected] ~]# lsmod | grep kvm

kvm_intel             170086  0

kvm                   566340  1 kvm_intel

irqbypass              13503  1 kvm

如果没有加载则执行以下命令加载KVM

modprobe kvm

  1. 关闭selinux

#setenforce 0

编辑selinux配置文件

vim /etc/sysconfig/selinux

SELINUX=disabled

关闭SELINUX,以免机器重启后仍然生效

  1. 安装KVM相关软件包

yum install qemu-kvm qemu-img \

virt-manager libvirt libvirt-python virt-manager \

libvirt-client virt-install virt-viewer -y

 

说明:

qemu-kvm: KVM模块

libvirt: 虚拟管理模块

virt-manager: 图形界面管理虚拟机

virt-install: 虚拟机命令行安装工具

  1. 启动libvirt并设置开机自启动

systemctl start libvirtd

systemctl enable libvirtd

  1. 手动配置Bridge网卡

安装网桥管理工具包:bridge-utile

yum install bridge-utils -y

 

编辑网桥设备,在/etc/sysconfig/network-scripts/目录下创建ifcg-br0文件(内网),并写入以下内容

DEVICE="br0"

ONBOOT="yes"

TYPE="Bridge"

BOOTPROTO=none

NM_CONTROLLED=no

IPADDR=10.x.x.x

NETMASK=255.255.255.192

 

(此处的ip地址和子网掩码是bond0里面的IP地址和掩码,我们下面需要修改ifcfg-bond0文件)

Ifcfg-bond0文件内容如下(将原先的ip地址删除,添加BRIDGE=br0一行):

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

再按照上面步骤创建br1网桥(供外网通讯使用)。

 

 

  1. 使用图形化界面安装虚拟机

先建立两个目录分别用来存放iso文件和生成的qocow2磁盘文件

mkdir /data/iso

mkdir /data/images

IBM云平台默认提供的操作系统没有安装相应的图像软件包,所以需要自己安装并设置一下,

A.)yum groupinstall -y "GNOME Desktop" "Graphical Administration Tools" //安装GNOME桌面.

B.)systemctl set-default graphical.target      //设置图形模式为默认界面,即下次开机自动启用图形界面.

重启机器,使之进入图形界面。

通过IPMI访问图形界面(或启动VNC访问图形界面),此处介绍如何使用IPMI访问图形界面

一、如果使用自己本机访问IPMI,则需要先拨通IBM云平台的v*n:

打开浏览器,输入地址:https://v*n.tok02.softlayer.com/

(此中的tok02可以换成IBM其他数据中心的简称,如dal05,hkg01等等)

注:可能需要使用IE浏览器打开上面链接,否则无法输入用户名和密码(java applet的原因)

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

成功登录后,您就可以访问IBM云主机的内网和管理网络,(IPMI需要访问IBM物理机的管理网络。

二、如果你在物理机所在的同一账号下恰巧有一台windows的虚拟机(物理机当然也可),那么你可以用这台windows机器作为跳板机再连接IPMI,这样,你本机就不需要连接v*n了,这样操作的顺畅度也会快一些(两个机器之间都在同一个内网中,延时和性能都会好太多)

然后,使用浏览器,输入物理机的管理ip地址,登录IPMI。

如何查找物理机的管理ip和密码情况下面介绍:

在IBM云平台上找到你需要访问的物理机,在首页,点击设备,进入设备List

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

找到所要机器,并点击进入详细页面:

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

点击左侧的远程管理获取管理IP和密码:

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

红色框中是我们需要的内容。

 

登入IPMI后的页面类似如下:

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

然后点击Remote Control à Console Redirectionà Launch Console即可打开物理机的console(打开console有多种方式,可以是java applet,也可以是HTML5方式),打开之后,下面就和本地Linux操作一致了。

 

 

进入KVM图形化管理窗口(如果你对KVM命令行相当熟悉,请忽略下面的KVM他图形化操作)

[[email protected] ~]# virt-manager

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

本地安装介质

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

选择浏览

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

这里我们选择左下角的加号来新建一个存储池(不创建也可以,这样会安装到默认的位置,我这里的默认位置磁盘空间不够,因此新建一个存放位置)

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

创建存储池,名称随便起

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

目标路径就是前面创建的目录

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

创建好后,会出现在上面,点击它,然后点击加号,在images存储池里创建一个存储卷

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

名称随便起,我这里的空间大,就给了100G

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

点击选择卷

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

找到/data/iso目录下的iso文件

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

这里选择自定义存储,就是我们在images存储池里创建的存储卷

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

然后点击添加硬件,加入第二张网卡和GPU卡,期间,记住网卡MAC地址,以便在配置虚拟机网络的时候,确定哪个网卡是内网,哪个网卡是外网。

检查网卡是否选择了之间创建的网桥设备(br0, br1)

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

添加Passthrough模式的NVIDIA GPU卡类型是选PCI Host Device,然后找到GPU卡并添加。

 

 

点击安装即可开始操作系统的安装(可以是windows,也可以是Linux)

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

安装完系统之后,进入系统配置网络。

 

新虚拟机上的网络配置需通过若干步骤来完成。对于公用和专用网络,需要单独的可移植 IP 块。假定您使用的虚拟化产品需要在 VLAN 广播域上有辅助子网,而不路由到 VLAN(无网络标识/网关/广播)子网。如果未计划在虚拟机上使用专用网络,那么只需要公用子网。可移植 IP 块可以直接通过门户网站的销售 -> 添加 IP 地址 进行订购,或者通过公用网络 IP 管理器 进行订购。

 

获取 IP 块后,可以在虚拟机上配置联网。如果未安装虚拟机,那么可以通过操作系统安装过程来配置公用网络块。此过程是配置公用网络的最快方法。所有网络配置步骤都假定第一个网络接口是专用网络,第二个网络接口是公用网络。

 

配置网络对于每种操作系统各不相同。您可以找到有关为以下操作系统配置网络的详细信息。注:分组在一起的操作系统具有相同的网络配置。

 

网络配置需要公共和专用 IP 块的以下信息。这些信息可在门户网站的公用网络 -> IP 管理器 下的“公共 IP 块”以及专用网络 -> IP 管理器 下的“专用 IP 块”中找到。

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

 

Windows系统配置网络连接:

 

示例专用 IP 块 - 10.0.0.0/29

IP 地址 - 10.0.0.2

网关 - 10.0.0.1

子网掩码 - 255.255.255.248

 

打开网络配置

 

转至“开始”菜单 > 设置 > 控制面板

打开网络和共享中心,然后单击管理网络连接

如果已安装两个网络适配器,那么会看到“本地连接”和“本地连接 2”。

 

公用网络

 

以下指示信息提供了通过 Windows 图形界面配置公用网络的详细步骤。

 

右键单击本地连接 > 属性。

选择 Internet 协议版本 4 (TCP/IPv4) > 属性。

转至常规 > 使用下面的 IP 地址:,然后输入您的公共 IP 地址、子网掩码和网关。

选中使用下面的 DNS 服务器地址:。如果要配置专用网络,请使用以下 DNS 服务器。如果不打算配置专用网络,那么需要提供 DNS 服务器。

首选 DNS 服务器:10.0.80.11

备用 DNS 服务器:10.0.80.12

单击确定。

 

专用网络

 

右键单击本地连接 2 > 属性,然后选择 Internet 协议版本 4 (TCP/IPv4) > 属性。

转至常规 > 使用下面的 IP 地址:,输入您的专用 IP 地址和子网掩码,然后单击确定。

再次单击确定以关闭网络配置窗口。

要提供对包含 DNS 服务器的整个专用网络的访问权,您需要向服务器添加定制路径。

 

转至开始 > 运行,输入“cmd”,然后单击确定。

运行以下命令:注:请将网关地址 (10.0.0.1) 替换为您的专用 IP 块网关。

route add 10.0.0.0 mask 255.0.0.0 10.0.0.1 –p

 

 

RedHat、Fedora 和 CentOS网络配置:

 

在 RedHat、Fedora 和 CentOS 上配置网络是通过手动编辑配置文件来完成的。要手动编辑这些文件,您需要登录到虚拟机。

 

示例公共 IP 块 - 192.0.2.0/29

IP 地址 - 192.0.2.2

网关 - 192.0.2.1

子网掩码 - 255.255.255.248

 

示例专用 IP 块 - 10.0.0.0/29

IP 地址 - 10.0.0.2

网关 - 10.0.0.1

子网掩码 - 255.255.255.248

 

公用网络

 

公用网络设置包含在以下文件中。您需要使用提供的信息来编辑此文件。请将示例 IP 地址替换为您的公共 IP 块中的 IP 地址。如果此文件不存在,请进行创建。如果存在,请将文件中的所有数据替换为以下信息:

 

/etc/sysconfig/network-scripts/ ifcfg-eth1

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

专用网络

 

专用网络设置包含在以下文件中。您需要使用提供的信息来编辑此文件。请将示例 IP 地址替换为您的专用 IP 块中的正确 IP 地址。如果此文件不存在,请进行创建。如果文件存在,请将文件中的所有数据替换为以下信息:注:专用网络没有缺省路径,因此未定义 GATEWAY。

 

/etc/sysconfig/network-scripts/ ifcfg-eth0

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

最后,需要新路径来提供对整个专用网络的专用访问权以包含 DNS 服务器,这可通过编辑以下文件来完成。此文件不存在,因此需要进行创建。注:请将示例中的“10.0.0.1”替换为您的专用子网 IP 网关。

 

/etc/sysconfig/network-scripts/route-eth0

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

DNS 配置

 

主 DNS 配置和辅助 DNS 配置包含在单独的文件中。您需要使用以下信息来编辑该文件。如果此虚拟机无权访问专用网络,那么需要将服务器 IP 替换为要使用的 DNS 服务器的 IP 地址。

vi /etc/resolv.conf

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

为了使这些更改生效,需要在服务器上重新启动联网。可以通过运行以下命令来重新启动联网:

systemctl restart network

 

 

 

Ubuntu 和 Debian网络配置:

可以通过单个配置文件来配置 Ubuntu 和 Debian 网络。您需要使用以下信息来编辑此配置文件。要编辑此文件,您需要具有对服务器的 root 用户访问权。Ubuntu 的基本安装未提供 root 用户登录。但是,在安装过程中创建的用户可以访问 sudo。如果运行的是 Ubuntu,那么需要使用 sudo 命令来编辑此文件。

 

示例公共 IP 块 - 192.0.2.0/29

IP 地址 - 192.0.2.2

网关 - 192.0.2.1

子网掩码 - 255.255.255.248

 

示例专用 IP 块 - 10.0.0.0/29

·IP 地址 - 10.0.0.2 ·网关 - 10.0.0.1 ·子网掩码 - 255.255.255.248

 

公用和专用网络

 

使用任何文本编辑器来编辑以下文件,并将示例 IP 地址替换为您的公共和专用 IP 块中的 IP。

 

/etc/network/interfaces

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

 

DNS 配置

 

主 DNS 配置和辅助 DNS 配置包含在单独的文件中。您需要使用以下信息来编辑此配置文件。如果此虚拟机无权访问专用网络,那么需要将服务器 IP 替换为要使用的 DNS 服务器的 IP 地址。

vi /etc/resolv.conf

在IBM公有云上平台随心所欲的构建GPU虚拟服务器

为了使这些更改生效,需要在服务器上重新启动联网。可以通过运行以下命令来重新启动网络:

/etc/init.d/network restart

 

 

注:根据 RFC1166 和 RFC5737,192.0.2.0/24 将用作公共 IP 文档。因此,不要在服务器上使用这些 IP 地址。