一、什么是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
网友评论