12.6. GPU 장치에 PCI 패스스루 활성화

PCI 통과를 사용하여 그래픽 카드와 같은 물리적 PCI 장치를 인스턴스에 연결할 수 있습니다. 장치에 PCI 패스스루를 사용하는 경우 인스턴스는 작업을 수행하기 위해 장치에 대한 전용 액세스를 예약하고 호스트에서 장치를 사용할 수 없습니다.

사전 요구 사항

  • pciutils 패키지는 PCI 카드가 있는 물리적 서버에 설치됩니다.
  • GPU 장치의 드라이버는 장치가 전달되는 인스턴스에 설치해야 합니다. 따라서 필수 GPU 드라이버가 설치된 사용자 정의 인스턴스 이미지를 생성해야 합니다. GPU 드라이버를 설치한 사용자 정의 인스턴스 이미지를 생성하는 방법에 대한 자세한 내용은 Creating a custom GPU 인스턴스 이미지 생성을 참조하십시오.

절차

  1. 각 패스스루 장치 유형의 벤더 ID와 제품 ID를 확인하려면 PCI 카드가 있는 물리적 서버에 다음 명령을 입력합니다.

    # lspci -nn | grep -i <gpu_name>

    예를 들어 NVIDIA GPU의 벤더 및 제품 ID를 확인하려면 다음 명령을 입력합니다.

    # lspci -nn | grep -i nvidia
    3b:00.0 3D controller [0302]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1eb8] (rev a1)
    d8:00.0 3D controller [0302]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1db4] (rev a1)
  2. 각 PCI 장치에 SR-IOV(Single Root I/O Virtualization) 기능이 있는지 확인하려면 PCI 카드가 있는 물리적 서버에 다음 명령을 입력합니다.

    # lspci -v -s 3b:00.0
    3b:00.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
              ...
              Capabilities: [bcc] Single Root I/O Virtualization (SR-IOV)
              ...
  3. PCI 패스스루를 위해 오버클라우드에서 컨트롤러 노드를 구성하려면 환경 파일(예: pci_passthru_controller.yaml )을 만듭니다.
  4. pci_passthru_controller.yaml NovaSchedulerDefaultFilters 매개변수에 PciPassthrough Filter를 추가합니다.

    parameter_defaults:
      NovaSchedulerDefaultFilters: ['AvailabilityZoneFilter','ComputeFilter','ComputeCapabilitiesFilter','ImagePropertiesFilter','ServerGroupAntiAffinityFilter','ServerGroupAffinityFilter','PciPassthroughFilter','NUMATopologyFilter']
  5. 컨트롤러 노드에서 장치의 PCI 별칭을 지정하려면 pci_passthru_controller.yaml에 다음 구성을 추가합니다.

    • PCI 장치에 SR-IOV 기능이 있는 경우:

      ControllerExtraConfig:
        nova::pci::aliases:
          - name: "t4"
            product_id: "1eb8"
            vendor_id: "10de"
            device_type: "type-PF"
          - name: "v100"
            product_id: "1db4"
            vendor_id: "10de"
            device_type: "type-PF"
    • PCI 장치에 SR-IOV 기능이 없는 경우:

      ControllerExtraConfig:
        nova::pci::aliases:
          - name: "t4"
            product_id: "1eb8"
            vendor_id: "10de"
          - name: "v100"
            product_id: "1db4"
            vendor_id: "10de"

      device_type 필드 구성에 대한 자세한 내용은 PCI 패스스루 장치 유형 필드를 참조하십시오.

      참고

      nova-api 서비스가 컨트롤러 이외의 역할에서 실행 중인 경우 <Role> ExtraConfig 형식으로 Controller ExtraConfig 를 사용자 역할로 바꿉니다.

  6. PCI 패스스루에 대해 오버클라우드에서 Compute 노드를 구성하려면 환경 파일(예: pci_passthru_compute.yaml )을 생성합니다.
  7. Compute 노드에서 장치에 사용 가능한 PCI를 지정하려면 pci_passthru_compute.yaml에 다음을 추가합니다.

    parameter_defaults:
      NovaPCIPassthrough:
        - vendor_id: "10de"
          product_id: "1eb8"
  8. 인스턴스 마이그레이션 및 크기 조정 작업을 위해 컴퓨팅 노드에 PCI 별칭 사본을 생성해야 합니다. 컴퓨팅 노드에서 장치의 PCI 별칭을 지정하려면 pci_passthru_compute.yaml에 다음을 추가합니다.

    • PCI 장치에 SR-IOV 기능이 있는 경우:

      ComputeExtraConfig:
        nova::pci::aliases:
          - name: "t4"
            product_id: "1eb8"
            vendor_id: "10de"
            device_type: "type-PF"
          - name: "v100"
            product_id: "1db4"
            vendor_id: "10de"
            device_type: "type-PF"
    • PCI 장치에 SR-IOV 기능이 없는 경우:

      ComputeExtraConfig:
        nova::pci::aliases:
          - name: "t4"
            product_id: "1eb8"
            vendor_id: "10de"
          - name: "v100"
            product_id: "1db4"
            vendor_id: "10de"
      참고

      컴퓨팅 노드 별칭은 컨트롤러 노드의 별칭과 동일해야 합니다.

  9. Compute 노드의 서버 BIOS에서 IOMMU를 활성화하여 PCI 패스스루를 지원하려면 KernelArgs 매개변수를 pci_passthru_compute.yaml에 추가합니다.

    parameter_defaults:
      ...
      ComputeParameters:
        KernelArgs: "intel_iommu=on iommu=pt"
  10. 다른 환경 파일을 사용하여 스택에 사용자 지정 환경 파일을 추가하고 오버클라우드를 배포합니다.

    (undercloud)$ openstack overcloud deploy --templates \
      -e [your environment files] \
      -e /home/stack/templates/pci_passthru_controller.yaml \
      -e /home/stack/templates/pci_passthru_compute.yaml
  11. PCI 장치를 요청하도록 플레이버를 구성합니다. 다음 예제에서는 각각 공급업체 ID가 10de 이고 제품 ID가 13f2 인 두 개의 장치를 요청합니다.

    # openstack flavor set m1.large \
     --property "pci_passthrough:alias"="t4:2"

검증

  1. PCI 패스스루 장치를 사용하여 인스턴스를 생성합니다.

    # openstack server create --flavor m1.large \
     --image <custom_gpu> --wait test-pci

    <custom_gpu> 를 필수 GPU 드라이버가 설치된 사용자 정의 인스턴스 이미지의 이름으로 바꿉니다.

  2. 클라우드 사용자로 인스턴스에 로그인합니다.
  3. 인스턴스에서 GPU에 액세스할 수 있는지 확인하려면 인스턴스에서 다음 명령을 입력합니다.

    $ lspci -nn | grep <gpu_name>
  4. NVIDIA 시스템 관리 인터페이스 상태를 확인하려면 인스턴스에서 다음 명령을 입력합니다.

    $ nvidia-smi

    출력 예:

    -----------------------------------------------------------------------------
    | NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |
    |---------------------------------------------------------------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===========================================================================|
    |   0  Tesla T4            Off  | 00000000:01:00.0 Off |                    0 |
    | N/A   43C    P0    20W /  70W |      0MiB / 15109MiB |      0%      Default |
    ---------------------------------------------------------------------------
    
    -----------------------------------------------------------------------------
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    -----------------------------------------------------------------------------