美文网首页
Nvidia GPU 虚拟化实现

Nvidia GPU 虚拟化实现

作者: 皇甫LG | 来源:发表于2020-03-29 18:25 被阅读0次

一、什么是GPU

GPU全称Graphic Processing Unit中文名为:图形处理器又称显示核心、视觉处理器、显示芯片,控制显示器的正确显示。

二、CPU vs GPU

image

三、GPU虚拟化方案

3.1 Device Simulation

设备模拟直接将设备分配给指定的虚拟机,比如qemu中现在模拟了vga显卡等。提供简单的显示功能,半虚拟化加速图像访问;不符合高效、共享的虚拟化要求。

3.2 API Forwarding

API转发将图形指令如OpenGL从客户虚拟机转发到虚拟机监视器VMM中,实现虚拟化环境下GPU的共享。目前被广泛应用在VMWare和VirutalBox等软件中。优点:性能佳、可以共享。缺点:API转发受限于平台,并且性能损失较大。

3.3 GPU Pass-Through

显卡穿透(pass-through)也叫显卡直通,直通设备利用VT-d将GPU核直通给单个虚拟机。优点:性能佳、功能完备。缺点:不能共享。

3.4 Full GPU Visualization

完全GPU虚拟化优点:性能佳、功能完备、可以共享一个GPU给多个虚拟机共享使用,显卡按时间切片分配给应用使用。(NVIDIA vGPU以已经实现,但是收费的)

四、GPU虚拟化实现-CUDA安装部署

Nvidia公司提供使用Docker虚拟机使用GPU加速的解决方案:https://github.com/NVIDIA/nvidia-docker

4.1、安装指导参考(官方)

sudo apt install gnupg-curl

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.2.88-1_amd64.deb

sudo dpkg --install cuda-repo-ubuntu1604_9.2.88-1_amd64.deb

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub

4.2、安装Cuda

此过程非常慢,有3GB的软件包下载。(最好使用其他工具下载)

sudo apt-get update
sudo apt install cuda

4.3、设置环境变量

vim ~/.bashrc

# for nvidia CUDA
export PATH="/usr/local/cuda-9.2/bin:$PATH"

export LD_LIBRARY_PATH="/usr/local/cuda-9.2/lib64:$LD_LIBRARY_PATH"

source ~/.bashrc

4.4、设置守护进程

vim /usr/lib/systemd/system/nvidia-persistenced.service

[Unit]
Description=NVIDIA Persistence Daemon
Wants=syslog.target

[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced

[Install]
WantedBy=multi-user.target

重启服务:
sudo systemctl enable nvidia-persistenced

4.5、禁用某些UDEV规则

#某个udev规则(物理设备和系统之间的接口)会阻止NVIDIA驱动程序正常工作。为此,编辑/lib/udev/rules.d/40-vm-hotadd.rules,注释掉memory子系统规则

# SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory[0-9]*", TEST=="state", ATTR{state}="online"

4.6、验证CUDA是否工作

#重启机器,尝试编译CUDA示例来验证CUDA是否正常安装。使用如下命令安装CUDA示例代码:

cuda-install-samples-9.1.sh ~     ## 其中 ~ 代表将代码安装到HOME目录下

#编译示例代码:(此步骤可能需要几十分钟的时间)
cd ~/NVIDIA_CUDA-9.2_Samples/
make

#编译完成后,运行其中的一个示例程序:
./bin/x86_64/linux/release/deviceQuery | tail -n 1

如果输出Result = PASS就表示CUDA是正常工作的。

五、安装NVIDIA Docker

5.1 首先加入nvidia-docker包列表:

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

接下来,确保你的机器上安装的是最新的docker-ce,如果之前安装了docker-engine, docker.io,需要先卸载。

5.2 移除其他Docker版本(如果无则跳过此步)

sudo apt-get remove docker docker-engine docker.io

5.3 安装nvidia-docker2

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys D8576A8BA88D21E9
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"

sudo apt-get update
sudo apt-get install docker-ce
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

5.3、验证nvidia-docker

启动nvidia提供的docker镜像,里面有一个实用程序nvidia-smi,它用来监视并管理GPU

docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

六、测试CPU、GPU

## vim benchmark.py

import sys
import numpy as np
import tensorflow as tf
from datetime import datetime

device_name = sys.argv[1] # Choose device from cmd line. Options: gpu or cpu
shape = (int(sys.argv[2]), int(sys.argv[2]))
if device_name == "gpu":
device_name = "/gpu:0"
else:
device_name = "/cpu:0"

with tf.device(device_name):
random_matrix = tf.random_uniform(shape=shape, minval=0, maxval=1)
dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
sum_operation = tf.reduce_sum(dot_operation)

startTime = datetime.now()
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:
result = session.run(sum_operation)
print(result)

# It can be hard to see the results on the terminal with lots of output -- add some newlines to improve readability.
print("\n" * 5)
print("Shape:", shape, "Device:", device_name)
print("Time taken:", str(datetime.now() - startTime))

当前python文件: benchmark.py,然后启动支持GPU的tensorflow docker镜像,运行该tensorflow程序:

编写Dockefile

FROM tensorflow/tensorflow:latest-gpu

ADD benchmark.py /app/

然后在当前目录下执行

sudo docker build -t tensorflow/tensorflow:test-gpu .

测试算力:

sudo docker run --runtime=nvidia -it --rm tensorflow/tensorflow:test-gpu python /home/benchmark.py cpu 20000

上面的命令是CPU版本的,运行完之后,将命令中的cpu参数修改为gpu,再运行一次。

即可得到两个对比结果

image image

相关文章

  • Nvidia GPU 虚拟化实现

    一、什么是GPU GPU全称Graphic Processing Unit中文名为:图形处理器又称显示核心、视觉处...

  • Nvidia GPU如何在Kubernetes 里工作

    Nvidia GPU如何在Kubernetes 里工作 本文介绍Nvidia GPU设备如何在Kubernetes...

  • NVENC编码指导

    介绍 基于 NVIDIA Kepler™ 和更高版本 GPU 架构的 NVIDIA® GPU 包含基于硬件的 H....

  • 【技术系列】浅谈GPU虚拟化技术(第一章)

    摘要:GPU深度好文系列,阿里云技术专家分享 第一章 GPU虚拟化发展史 GPU的虚拟化发展历程事实上与公有云市场...

  • GPU虚拟化

    GPU虚拟化 一、GPU概述 GPU的英文名称为Graphic Processing Unit,GPU中文全称为计...

  • GPU虚拟化

    上一篇文章,讲解了计算虚拟化之CPU虚拟化和内存虚拟化。而GPU从某种意义上来讲,其作用也是用于计算,只不过同CP...

  • Kubernetes GPU共享实践

    环境准备 1. GPU 节点准备 GPU共享依赖NVIDIA驱动和nvidia-docker2,需要事先安装。NV...

  • GPU之nvidia-smi命令详解

    1、nvidia-smi介绍 nvidia-sim简称NVSMI,提供监控GPU使用情况和更改GPU状态的功能,是...

  • TensorRT使用说明

    一、TensorRT简介 TensorRT 是Nvidia 提出的深度学习推理平台,能够在GPU 上实现低延迟、高...

  • [Ubuntu]GPU状态查询

    GPU占用查看命令:nvidia-smi

网友评论

      本文标题:Nvidia GPU 虚拟化实现

      本文链接:https://www.haomeiwen.com/subject/kjsuuhtx.html