美文网首页
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 虚拟化实现

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