OpenStack GPU直通服务器

news2024/10/5 15:28:50

layout: post
title: OpenStack GPU直通服务器
catalog: true
tag: [OpenStack, GPU]

  • 1. 概述
  • 2. 直通GPU特性
  • 3. 功能说明
    • 3.1. 操作系统支持
    • 3.2. 设备支持
  • 4. 实现方案
  • 5. 部署方案
    • 5.1. 示例环境说明
    • 5.2. 上线步骤
      • 5.2.1. 硬件安装
      • 5.2.2. GPU计算节点主机配置
        • 5.2.2.1. IOMMU设置
          • 5.2.2.1.1. BIOS设置
          • 5.2.2.1.2. grab设置
        • 5.2.2.2. PCI-STUB设置
        • 5.2.2.3. vfio设置
          • 5.2.2.3.1. 查看显卡信息
          • 5.2.2.3.2. 设置blacklist
          • 5.2.2.3.3. 设置whitelist
        • 5.2.2.4. 验证
      • 5.2.3. OpenStack配置
        • 5.2.3.1. 控制节点
        • 5.2.3.2. 计算节点
      • 5.2.4. 创建gpu机型
      • 5.2.5. gpu服务器启动及验证
  • 6. 常见问题
    • 6.1. NVIDIA显卡的问题
  • 7. 参考

1. 概述

直通GPU 云服务器(GPU Virtual Machine)是基于 GPU 的快速、稳定、弹性的计算服务,主要应用于深度学习训练\推理、图形图像处理以及科学计算等场景。
直通GPU 云服务器提供和标准 云服务器一致的方便快捷的管理方式,相对于vGPU云服务器,直通GPU使用的PCI透传技术能带来几乎和物理设备同等的性能。

2. 直通GPU特性

直通GPU具备以下产品特点

  • 租户独享物理GPU,可利用几乎与物理设备同等的性能。
  • 直通GPU 云服务器位于云内部网络,内网时延低,提供优秀的计算能力。

3. 功能说明

3.1. 操作系统支持

直通GPU云服务器支持Windows和Linux操作系统。

3.2. 设备支持

支持主流厂商PCI插槽的GPU卡。

4. 实现方案

直通GPU云服务器采用了PCI Passthrough技术,将宿主机上某个PCI槽位透传给虚拟机使用,GPU卡即安装在PCI卡槽上,如下图:

在这里插入图片描述

PCI直通特性允许虚拟机完全访问与直接控制物理PCI设备。此机制对任何类型的PCI设备都是通用的,并且可以与网络接口卡(NIC),
图形处理单元(GPU)或可以连接到PCI总线的任何其他设备一起运行,在PCI直通的情况下,整个物理设备只能分配给一个虚拟机,并且不能共享。
各组件的关系如下:

在这里插入图片描述

5. 部署方案

5.1. 示例环境说明

组件版本备注
GPUNVIDIA A100
操作系统版本CentOS Linux release 7.8.2003 (Core)
内核版本3.10.0-1127.el7.x86_64
OpenStack版本Train

5.2. 上线步骤

5.2.1. 硬件安装

按照相关指导安装显卡至计算节点
如有问题需要向显卡厂商寻求协助
注:英伟达服务器支持列表:
https://www.nvidia.com/object/vgpu-certified-servers.html
一般情况下,单独划分GPU AZ,如果存在不同型号的GPU,则划分更新的AZ。

5.2.2. GPU计算节点主机配置

5.2.2.1. IOMMU设置

5.2.2.1.1. BIOS设置

在BIOS中enable VT-x, VT-d, Onboard VGA. Onboard VGA 的enable可以避免一些错误的出现,具体参考Not only for miners GPU integration in Nova environment.

5.2.2.1.2. grab设置

编辑文件 /etc/default/grub

如果没有 GRUB_CMDLINE_LINUX_DEFAULT 则编辑 GRUB_CMDLINE_LINUX

对于Intel芯片:GRUB_CMDLINE_LINUX_DEFAULT=“intel_iommu=on”
对于AMD芯片:GRUB_CMDLINE_LINUX_DEFAULT=“iommu=pt iommu=1”

编辑完执行 grub2-mkconfig -o /boot/grub/grub.cfg 更新grub配置,如果UEFI启动则grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

5.2.2.2. PCI-STUB设置

编辑 /etc/modules 添加如下内容

pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel

5.2.2.3. vfio设置

5.2.2.3.1. 查看显卡信息
  • 查看显卡的ID

其中 3D controller为NVIDIA GPU, Bridge为NVLink总线设备

此处需记录NVIDIA GPU的PCI总线ID是25:00.0 2b:00.0等多个,由于该GPU卡有多个PCI接口, vendor ID是 10de, product ID是 20b0, 后面会用到

lspci -nn | grep NVIDIA
25:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
2b:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
48:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
4d:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
8c:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
91:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
b7:00.0 Bridge [0680]: NVIDIA Corporation Device [10de:1af1] (rev a1)
b8:00.0 Bridge [0680]: NVIDIA Corporation Device [10de:1af1] (rev a1)
b9:00.0 Bridge [0680]: NVIDIA Corporation Device [10de:1af1] (rev a1)
ba:00.0 Bridge [0680]: NVIDIA Corporation Device [10de:1af1] (rev a1)
bb:00.0 Bridge [0680]: NVIDIA Corporation Device [10de:1af1] (rev a1)
bc:00.0 Bridge [0680]: NVIDIA Corporation Device [10de:1af1] (rev a1)
c5:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
cb:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
  • 查看显卡当前驱动
lspci -s 4d:00.0 -k
4d:00.0 3D controller: NVIDIA Corporation Device 20b0 (rev a1)
	Subsystem: NVIDIA Corporation Device 134f
	Kernel driver in use: nvidia
	Kernel modules: nouveau, nvidia_drm, nvidia
5.2.2.3.2. 设置blacklist

编辑 /etc/modprobe.d/blacklist.conf 添加如下内容

blacklist snd_hda_intel
blacklist amd76x_edac
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
blacklist nvidia_drm
blacklist nvidia
5.2.2.3.3. 设置whitelist

加载 vfio-pci 并绑定到GPU设备

编辑 /etc/modprobe.d/vfio.conf, ids即上面的VendorID:PRODUCTID

options vfio-pci ids=10de:20b0

vfio-pci 驱动加入 /etc/modules-load.d/modules.conf, 确保在开机的时候加载

编辑 /etc/modules-load.d/modules.conf

vfio-pci

更新initramfs,执行 grub2-mkconfig -o /boot/grub/grub.cfg 更新grub配置,如果UEFI启动则grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

重启服务器使上面修改生效

总体操作如下图:

在这里插入图片描述

最后一步是解绑,一般环境是新的不用解绑,如复用则重装系统

5.2.2.4. 验证

lspci -s 4d:00.0 -nnk
4d:00.0 3D controller [0302]: NVIDIA Corporation Device [10de:20b0] (rev a1)
	Subsystem: NVIDIA Corporation Device [10de:134f]
	Kernel driver in use: vfio-pci
	Kernel modules: nouveau, nvidia_drm, nvidia

关键词 ernel driver in use: vfio-pci 说明上面操作成功

5.2.3. OpenStack配置

  • 对于控制节点来说,api需要能接收pci信息,调度器需要增加过滤器以达到想要pci虚拟机,就调度到pci节点的效果
  • 对于计算节点来说,需要制定和api相同的设备,再api请求过来的时候

5.2.3.1. 控制节点

  • 编辑 /etc/nova/nova.conf 增加根据pci调度的过滤器 PciPassthroughFilter
enabled_filters=AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter
available_filters=nova.scheduler.filters.all_filters
  • 增加pci配置

product_id, vendor_id 分别修改为实际环境

[pci]
alias = { "name": "nvidia-a100", "product_id": "20b0", "vendor_id": "10de", "device_type": "type-PF" }

这里需要特别注意下 device_type, 需要按libvirt识别,最简单直接的方式是,启动 nova-computer 服务之后开启debug日志,有一条信息如下

DEBUG nova.compute.resource_tracker [req-2e31a4aa-c3a1-47b6-b975-639940d4c453 - - - - -] Auditing locally available compute resources for gpu-computer1 (node: gpu-computer1) update_available_resource /usr/lib/python2.7/site-packages/nova/compute/resource_tracker.py:870
{"dev_id": "pci_0000_25_00_0", "product_id": "20b0", "dev_type": "type-PF", "numa_node": 0, "vendor_id": "10de", "label":....

这里的 pci_0000_25_00_0 即上面显卡的其中一个pci总线ID 25:00:0, 以这里的 dev_type 为准,这个值主要是通过kvm收集信息、openstack做转化得来的,其中libvirt层的信息可以通过如下命令获取

virsh nodedev-dumpxml pci_0000_25_00_0
<device>
  <name>pci_0000_25_00_0</name>
  <path>/sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:04.0/0000:20:00.0/0000:21:10.0/0000:23:00.0/0000:24:00.0/0000:25:00.0</path>
  <parent>pci_0000_24_00_0</parent>
  <driver>
    <name>vfio-pci</name>
  </driver>
  <capability type='pci'>
    <domain>0</domain>
    <bus>37</bus>
    <slot>0</slot>
    <function>0</function>
    <product id='0x20b0' />
    <vendor id='0x10de'>NVIDIA Corporation</vendor>
    <capability type='virt_functions' maxCount='16'/>
    <iommuGroup number='47'>
      <address domain='0x0000' bus='0x25' slot='0x00' function='0x0'/>
    </iommuGroup>
    <numa node='0'/>
    <pci-express>
      <link validity='cap' port='0' speed='16' width='16'/>
      <link validity='sta' speed='16' width='16'/>
    </pci-express>
  </capability>
</device>

关键字 <capability type='virt_functions', OpenStack会将这个值转化为type-PF

昨晚上述修改之后重启服务

systemctl restart openstack-nova-api
systemctl restart openstack-nova-scheduler

5.2.3.2. 计算节点

控制哪些设备可以透传,对齐nova-api所请求设备

编辑 /etc/nova/nova.conf 有的环境是 /etc/nova/computer.conf ,具体文件以cat /usr/lib/systemd/system/openstack-nova-compute.service 为准,如果ExecStart 没写明配置文件则 /etc/nova/nova.conf, 如果写明配置文件则以具体配置文件路径为准

[pci]
passthrough_whitelist = { "vendor_id": "10de", "product_id": "20b0" }
alias = { "name": "nvidia-a100", "product_id": "20b0", "vendor_id": "10de", "device_type": "type-PF"}

修改完成之后重启服务生效

systemctl restart openstack-nova-compute

5.2.4. 创建gpu机型

openstack flavor create --public --ram 2048 --disk 20 --vcpus 2 gpu-flavor
# nvidia-a100 即为alias中的name, 1为GPU的数量, 调度时以pci_passthrough做过滤
openstack flavor set gpu-flavor --property pci_passthrough:alias='nvidia-a100:1'

5.2.5. gpu服务器启动及验证

以上面机型创建虚拟机,镜像这里以 CentOS7.9 为例,服务器启动之后登陆服务器,检查pci设备

  • 查看PCI设备
lspci -nn|grep -i nvi
00:05:0  3D controller  [0302]: NVIAIDA Corporation GA100 [GRID A100X] [10de:20b0] (rev a1)
  • 下载并安装驱动

https://www.nvidia.cn/Download/index.aspx?lang=cn 选择产品类型,操作系统选择 linux 64-bit

wget https://www.nvidia.cn/content/DriverDownloads/confirmation.php?url=/tesla/460.106.00/NVIDIA-Linux-x86_64-460.106.00.run&lang=cn&type=Tesla
chmod +x NVIDIA-Linux-x86_64-460.106.00.run
# 安装对应版本的gcc、kernel-devel
yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r) gcc -y
./NVIDIA-Linux-x86_64-460.106.00.run

安装成功之后使用 nvidia-smi 就能看到显卡信息

在这里插入图片描述

6. 常见问题

6.1. NVIDIA显卡的问题

因为NIVIDIA显卡的驱动会检测是否跑在虚拟机里,如果在虚拟机里驱动就会出错,所以我们需要对显卡驱动隐藏hypervisor id。
在OpenStack的Pile版本中的Glance 镜像引入了img_hide_hypervisor_id=true的property,所以可以对镜像执行如下的命令隐藏hupervisor id:

openstack image set IMG-UUID --property img_hide_hypervisor_id=true

通过此镜像安装的instance就会隐藏hypervisor id。
可以通过下边的命令查看hypervisor id是否隐藏:

cpuid | grep hypervisor_id
hypervisor_id = "KVMKVMKVM "
hypervisor_id = "KVMKVMKVM "

上边的显示结果说明没有隐藏,下边的显示结果说明已经隐藏:

cpuid | grep hypervisor_id
hypervisor_id = " @ @ "
hypervisor_id = " @ @ "

7. 参考

  • pci-passthrough
  • gpu-passthrough-in-openstack
  • GPGPU on OpenStack - The Best Practice for GPGPU Internal Cloud

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法学习8】二叉查找树的基本介绍与添加数据的过程

程序员语录&#xff1a; 把时髦的技术挂在嘴边&#xff0c;还不如把过时的技术记在心里。 1 二叉查找树是什么&#xff1f; 二叉查找树是一种数据结构&#xff0c;又叫作二叉搜索树或二叉排序树,采用了图的树形结构&#xff0c;数据存储于二叉查找树的各个结点中&#xff0c;每…

GEE 9:Earth Engine Reducers 的基本操作

目录1.Image 、ImageCollection and Regions Reducers&#xff08;图层和区域的相关操作&#xff09;1.1 Image Reductions&#xff08;处理单个图层&#xff09;1.2 ImageCollection Reductions&#xff08;处理图层集&#xff09;1.3 Greenest pixel (maximum NDVI) composit…

01背包——二维动态规划【c++】代码实现

今天学了01背包&#xff0c;就想来讲一讲&#xff0c;正好回顾一下&#xff08;BZOJ上的题目&#xff09;。 01背包 所谓01背包&#xff0c;也就是背包的一种&#xff0c;01背包和完全背包的区别就在于&#xff0c;01背包一件物品只能选择一次&#xff0c;而完全背包可以重复…

架构运维篇(七):Centos7/Linux中安装Zookeeper

版本说明 JDK &#xff1a;1.8&#xff08;已安装&#xff09;ZK : 3.8.0 安装部署Zookeeper 第一步&#xff1a;下载最新版本 官网地址&#xff1a;Apache DownloadsHome page of The Apache Software Foundationhttps://www.apache.org/dyn/closer.lua/zookeeper/zookeep…

libvirt零知识学习1 —— libvirt简介

本文内容部分取自《KVM实战 —— 原理、进阶与性能调优》&#xff0c;非常好的一本书。 1. 概述 提到KVM的管理工具&#xff0c;首先必须要介绍的无疑是大名鼎鼎的libvirt。libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口。并且&#xff0c;一些常用的虚…

Oracle VM VirtualBox 安装 CentOS Linux

Virtual Box VirtualBox是一个强大的、面向个人用户或者企业用户的虚拟机产品&#xff0c;其支持x86以及AMD64/Intel64的计算架构&#xff0c;功能特性丰富、性能强劲&#xff0c;支持GPL开源协议&#xff0c;其官方网址是www.virtualbox.org&#xff0c;由Oracle开源&#xf…

Spring自动装配

自动装配的三种方式一、xml方式自动装配二、 按类型自动装配三、使用注解一、xml方式自动装配 byName: 会自动在容器上下文查找&#xff0c;和自己对象set方法后面的值对应的bean id&#xff08;通过id匹配&#xff09; //实体类 Data public class Pepole {private String n…

GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

前言&#xff1a; 游戏在转换场景的时候&#xff0c;需要花费时间来加载相关的资源。而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间&#xff08;虽然这个项目里用不到&#xff09;。 所以&#xff0c;如果这一小段时间&#xff0c;画面就卡在…

计算机网络 —— TCP篇 三次握手与四次挥手

计算机网络系列文章目录 TCP篇 三次握手四次挥手 socket 文章目录计算机网络系列文章目录前言4.1 tcp三次握手与四次挥手面试题4.1.1 TCP的基本认识TCP头部为什么需要tcp&#xff0c;tcp工作在哪一层什么是tcp什么是tcp连接如何唯一确定一个tcp连接(tcp&udp比较) UDP 和 T…

机器学习【西瓜书/南瓜书】--- 第1章绪论+第二章模型选择和评估(学习笔记+公式推导)

【西瓜书南瓜书】task01: 第1、2章&#xff08;2天&#xff09; 第一章 绪论 主要符号表 下述这些符号在本书中将频繁的使用&#xff0c;务必牢记于心各个特殊符号所具有的的含义 &#x1f31f;对上述部分定义做一下解释&#xff1a; 向量有维度&#xff0c;其中的元素是有…

路由器NAT典型配置

1.组网需求内部网络中IP地址为10.110.10.0/24的用户可以访问Internet&#xff0c;其它网段的用户则不能访问Internet。外部的PC可以访问内部的服务器。公司具有202.38.160.100/24至202.38.160.105/24六个合法的IP地址。选用202.38.160.100作为公司对外的IP地址&#xff0c;WWW服…

stm32平衡小车(2)-----编码器电机驱动

前言&#xff1a;之前做arduino小车的时候使用的是L298N电机&#xff0c;没有用过编码器&#xff0c;这次第一次用编码器&#xff0c;还是比较懵圈&#xff0c;记录一下学的整个过程。 1.编码器的简介 霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字…

下载整个网站

使用Cyotek WebCopy下载整个网站一、下载网站复制所需软件&#xff1a;二、打开Cyotek WebCopy&#xff0c;然后下载网站系统环境&#xff1a;win10 所需工具&#xff1a;Cyotek WebCopy 一、下载网站复制所需软件&#xff1a; https://www.cyotek.com/cyotek-webcopy/downloa…

3-3存储系统-高速缓冲存储器Cache

文章目录一.概述二.Cache与主存的映射方式1.直接映射2.全相联映射3.组相联映射三.Cache中主存块的替换算法1.随机算法RAND2.先进先出算法FIFO3.最近最少使用算法LRU4.最不经常使用算法LFU四.Cache写策略1.写命中2.写不命中一.概述 高速缓冲存储器&#xff08;Cache&#xff09…

labelme使用labelme2voc.py忽略部分标签生成VOC/coco类型数据集(Ignore a label in json file)

一&#xff1a;背景和问题描述这是一个比较小众&#xff0c;且查找全网未有答案的问题。在使用labelme标注数据之后&#xff0c;生成了json文件。在利用json文件生成可用于训练分割模型的voc或者coco数据集时&#xff0c;可以使用labelme中自带的示例文件labelme2voc.py&#x…

第二章.线性回归以及非线性回归—弹性网

第二章.线性回归以及非线性回归 2.14 弹性网&#xff08;Elastic Net&#xff09; Elastic Net是一种使用L1和L2作为正则化矩阵的线性回归模型&#xff0c;这种组合用于只有很少的权重非零的稀疏模型。 当多个特征和另一个特征相关时&#xff0c;弹性网络非常有用&#xff0c;L…

C++ STL简介

文章目录前言一、STL概述二、STL历史三、STL六大组件功能与运用前言 对C/C学习感兴趣的可以看看这篇文章哦&#xff1a;C/C教程 一、STL概述 在软件行业&#xff0c;一直都希望建立一种可以重复运用的东西和一种可以制造出“可重复使用的东西”的方法&#xff0c;来让程序员…

什么是基于模型设计(MBD)?

MBD(Model based Design)是什么&#xff1f; 随着嵌入式行业的快速发展&#xff0c;MBD作为解决专家紧缺、国内解决方案匮乏的新软件开发方式备受关注。 MBD是一种通过建模自动生成代码的&#xff08;Auto-generation Code&#xff09;开发方式。 可以说它与如何用传统的C/C等计…

CANoe-仿真总线上的红蓝线、“CANoe DEMO“ license下的软件限制

1、仿真总线上的红蓝线 最近有人问我一个问题,就是Simulation Setup界面下的仿真网络里,有两条线:红线、蓝线。它们表示什么意思呢? 有人可能首先想到:会不会是代表CAN总线的两条物理连线? 那LIN网络呢?LIN网络属于单条线,它在仿真网络里应该显示一条线咯? LIN总线也…

ThreadLocal 详解

ThreadLocal 详解 1. ThreadLocal简介 1.1 官方介绍 /*** This class provides thread-local variables. These variables differ from* their normal counterparts in that each thread that accesses one (via its* {code get} or {code set} method) has its own, indep…