下载
中文
注册

vNPU直通虚拟机

本章节以Atlas 800 训练服务器(型号:9000)openEuler 20.03 LTS系统为例说明如何将vNPU(虚拟NPU)直通虚拟机,操作步骤中的和打印信息仅为示例,请以实际操作界面为准。

操作步骤

  1. 创建指定NPU芯片的vNPU。
    1. 使用root用户登录物理机,执行如下命令,查看环境上NPU芯片的PCIe信息,确定待切分的NPU芯片的PCIe信息。后续步骤以db:00.0为例。
      lspci | grep <device_name>
      [root@localhost ~]# lspci | grep d801
      3d:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      3e:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      60:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      61:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      b1:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      b2:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      da:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      db:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
    2. 执行如下命令,设置vNPU模式为虚拟机。
      npu-smi set -t vnpu-mode -d 1
      [root@localhost run]# npu-smi set -t vnpu-mode -d 1
              Status                         : OK
              Message                        : Set vnpu vm mode success
    3. 执行如下命令,查看步骤1中选定NPU芯片的NPU ID。

      npu-smi info

      [root@localhost ~]# npu-smi info
      +-------------------------------------------------------------------------------------------+
      | npu-smi 23.0.rc1.b050            Version: 23.0.rc1.b050                                   |
      +----------------------+---------------+----------------------------------------------------+
      | NPU   Name           | Health        | Power(W)    Temp(C)           Hugepages-Usage(page)|
      | Chip                 | Bus-Id        | AICore(%)   Memory-Usage(MB)  HBM-Usage(MB)        |
      +======================+===============+====================================================+
      | 0     910A           | OK            | 67.8        45                0    / 0             |
      | 0                    | 0000:61:00.0  | 0           2006 / 15039      0    / 32768         |
      +======================+===============+====================================================+
      | 1     910A           | OK            | 64.4        39                0    / 0             |
      | 0                    | 0000:DB:00.0  | 0           2022 / 15039      0    / 32768         |
      +======================+===============+====================================================+
      | 2     910A           | OK            | 65.0        42                0    / 0             |
      | 0                    | 0000:B2:00.0  | 0           2022 / 15039      0    / 32768         |
      +======================+===============+====================================================+
      | 3     910A           | OK            | 64.1        43                0    / 0             |
      | 0                    | 0000:3E:00.0  | 0           2020 / 15039      0    / 32768         |
      +======================+===============+====================================================+
      | 4     910A           | OK            | 68.0        44                0    / 0             |
      | 0                    | 0000:60:00.0  | 0           2005 / 15039      0    / 32768         |
      +======================+===============+====================================================+
      | 5     910A           | OK            | 63.4        38                0    / 0             |
      | 0                    | 0000:DA:00.0  | 0           2020 / 15039      0    / 32768         |
      +======================+===============+====================================================+
      | 6     910A           | OK            | 65.9        40                0    / 0             |
      | 0                    | 0000:B1:00.0  | 0           2007 / 15039      0    / 32768         |
      +======================+===============+====================================================+
      | 7     910A           | OK            | 64.4        44                0    / 0             |
      | 0                    | 0000:3D:00.0  | 0           2006 / 15039      0    / 32768         |
      +======================+===============+====================================================+
    4. 执行如下命令,查看NPU芯片支持的算力切分模板,参数id请输入步骤3中查询到的NPU ID。根据回显选择要使用的算力切分模板。
      npu-smi info -t template-info -i <id>
      [root@localhost ~]# npu-smi info -t template-info -i 1
      +------------------------------------------------------------------------------------------+
      |NPU instance template info is:                                                            |
      |Name                AICORE    Memory    AICPU     VPC            VENC           JPEGD     |
      |                               GB                 PNGD           VDEC           JPEGE     |
      |==========================================================================================|
      |vir02               2         1         1         1              0              1         |
      |                                                  1.5            1              0         |
      +------------------------------------------------------------------------------------------+
      |vir04               4         2         1         2              0              2         |
      |                                                  3              2              1         |
      +------------------------------------------------------------------------------------------+
      |vir08               8         4         3         4              0              4         |
      |                                                  6              4              2         |
      +------------------------------------------------------------------------------------------+
      |vir16               16        8         7         8              0              8         |
      |                                                  12             8              4         |
      +------------------------------------------------------------------------------------------+
      [root@localhost ~]#
    5. 执行如下命令,生成随机uuid。

      cat /proc/sys/kernel/random/uuid

      [root@localhost ~]# cat /proc/sys/kernel/random/uuid
      bcdca436-e624-4b9c-a6e3-a62742a86ff6
      [root@localhost ~]#
    6. 执行如下命令,创建指定芯片的特定算力切分模板的vNPU。
      echo <uuid> > /sys/bus/pci/devices/<Bus-Id>/mdev_supported_types/vnpu-<template-name>/create
      [root@localhost ~]# echo bcdca436-e624-4b9c-a6e3-a62742a86ff6 > /sys/bus/pci/devices/0000\:db\:00.0/mdev_supported_types/vnpu-vir02/create
      [root@localhost ~]#

      如需删除创建好的vNPU,可通过执行echo 1 > /sys/bus/mdev/devices/bcdca436-e624-4b9c-a6e3-a62742a86ff6/remove

    7. 查看创建的vNPU设备。

      ls -l /sys/bus/mdev/devices/

      [root@localhost ~]# ls -l /sys/bus/mdev/devices/
      total 0
      lrwxrwxrwx 1 root root 0 Feb 24 10:01 bcdca436-e624-4b9c-a6e3-a62742a86ff6 -> ../../../devices/pci0000:d7/0000:d7:00.0/0000:d8:00.0/0000:d9:04.0/0000:db:00.0/bcdca436-e624-4b9c-a6e3-a62742a86ff6
      [root@localhost ~]#
  2. 将切分好的vNPU设备直通到虚拟机。
    1. 执行如下命令,查询虚拟机列表。

      virsh list --all

      [root@localhost ~]# virsh list --all
       Id   Name         State
      ----------------------------
       1    openeuler    running
    2. 执行如下命令,关闭目标虚拟机。

      virsh shutdown <domain>

      [root@localhost vm]# virsh shutdown openeuler
      Domain openeuler is being shutdown
    3. 修改目标虚拟机配置,将vNPU直通到目标虚拟机。
      1. 执行如下命令,打开目标虚拟机的配置文本。
        virsh edit <domain>
        [root@localhost vm]# virsh edit openeuler
        Domain openeuler XML configuration edited.
        
        [root@localhost vm]#

        ubuntu系统可能会出现如下提示,请按照提示选择编辑器。

        Select an editor.  To change later, run 'select-editor'.
          1. /bin/nano        <---- easiest
          2. /usr/bin/vim.basic
          3. /usr/bin/vim.tiny
          4. /bin/ed
        Choose 1-4 [1]:
      2. 在配置文本的devices域中添加待直通的vNPU芯片信息,格式如下:
        <hostdev mode='subsystem' type='mdev' model='vfio-pci'>
            <source>
                <address uuid='bcdca436-e624-4b9c-a6e3-a62742a86ff6'/>
            </source>
        </hostdev>

        “<address uuid='bcdca436-e624-4b9c-a6e3-a62742a86ff6'/>”为待直通vNPU的uuid信息,其中uuid字段取值为1.e生成的uuid值。

    4. 执行如下命令,打开目标虚拟机。
      virsh start <domain>
      [root@localhost vm]# virsh start openeuler
      Domain openeuler started
    5. 登录到目标虚拟机。

      在物理机上通过ssh root@xxx 命令登录目标虚拟机(xxx为目标虚拟机IP地址,如:192.168.1.199)

    6. 查看直通的vNPU芯片PCIe信息。

      lspci | grep <device_name>

      [root@localhost ~]# lspci | grep d801
      08:00.0 Processing accelerators: Huawei Technologies Co., Ltd. Device d801 (rev 20)
      [root@localhost ~]#
      表1 参数说明

      参数

      说明

      device_name

      NPU芯片的PCIe名称。

      • Atlas 300I Pro 推理卡/Atlas 300V Pro 视频解析卡/Atlas 300V 视频解析卡/Atlas 300I Duo 推理卡<device_name>取值为d500
      • Atlas 800 训练服务器(型号:9000)/Atlas 800 训练服务器(型号:9010)<device_name>取值为d801

      Bus-Id

      NPU芯片的Bus-Id值,可通过执行npu-smi info查询。

      说明:

      Bus-Id值中的“:”需要用“\”进行转义。

      id

      NPU芯片的ID,与1.c中查询到ID保持一致。

      uuid

      每个vNPU特有的编号,不能重复。

      template-name

      算力切分模板名称。

      domain

      目标虚拟机名称。可以通过virsh list --all命令查看。