다음을 통해 공유


Azure Stack HCI에서 Ubuntu Linux VM에 GPU 연결

적용 대상: Azure Stack HCI, 버전 23H2 및 22H2

참고

Azure Stack HCI 23H2에서 VM을 만들고 관리하는 권장 방법은 Azure Arc 컨트롤 플레인을 사용하는 것입니다. Azure Arc VM에서 사용할 수 없는 기능이 필요한 경우에만 아래에 설명된 메커니즘을 사용하여 VM을 관리합니다.

이 항목에서는 Ubuntu VM(가상 머신)에 대한 DDA(불연속 디바이스 할당) 기술을 사용하여 Azure Stack HCI에서 NVIDIA GPU(그래픽 처리 장치)를 설치하고 구성하는 방법에 대한 단계별 지침을 제공합니다. 이 문서에서는 Azure Stack HCI 클러스터가 배포되고 VM이 설치되어 있다고 가정합니다.

GPU를 설치한 다음 PowerShell에서 분리

  1. OEM 지침 및 BIOS 권장 사항에 따라 NVIDIA GPU를 적절한 서버에 물리적으로 설치합니다.

  2. 각 서버의 전원

  3. NVIDIA GPU가 설치된 서버에 대한 관리 권한이 있는 계정을 사용하여 로그인합니다.

  4. 장치 관리자 열고 다른 디바이스 섹션으로 이동합니다. "3D 비디오 컨트롤러"로 나열된 디바이스가 표시됩니다.

  5. "3D 비디오 컨트롤러"를 마우스 오른쪽 단추로 클릭하여 속성 페이지를 표시합니다. 세부 정보를 클릭합니다. 속성 아래의 드롭다운에서 "위치 경로"를 선택합니다.

  6. 아래 스크린샷에서 강조 표시된 대로 문자열 PCIRoot가 있는 값을 확인합니다. 값을 마우스 오른쪽 단추로 클릭하고 복사/저장합니다.

    위치 경로 스크린샷

  7. 상승된 권한으로 Windows PowerShell 열고 cmdlet을 Dismount-VMHostAssignableDevice 실행하여 DDA용 GPU 디바이스를 VM에 분리합니다. LocationPath 값을 6단계에서 가져온 디바이스의 값으로 바꿉니다.

    Dismount-VMHostAssignableDevice -LocationPath "PCIROOT(16)#PCI(0000)#PCI(0000)" -force
    
  8. 디바이스가 장치 관리자 시스템 디바이스 아래에 분리됨으로 나열되어 있는지 확인합니다.

    분리된 디바이스 스크린샷

Ubuntu 가상 머신 만들기 및 구성

  1. Ubuntu 데스크톱 릴리스 18.04.02 ISO를 다운로드합니다.

  2. GPU가 설치된 시스템 노드에서 Hyper-V 관리자 를 엽니다.

    참고

    DDA는 장애 조치(failover)를 지원하지 않습니다. 이는 DDA의 가상 머신 제한 사항입니다. 따라서 Hyper-V 관리자 를 사용하여 장애 조치(failover) 클러스터 관리자 대신 노드에 VM을 배포하는 것이 좋습니다. DDA와 함께 장애 조치(failover) 클러스터 관리자 를 사용하면 VM에 고가용성을 지원하지 않는 디바이스가 있음을 나타내는 오류 메시지와 함께 실패합니다.

  3. 1단계에서 다운로드한 Ubuntu ISO를 사용하여 Hyper-V 관리자새 가상 머신 마법사를 사용하여 새 가상 머신을 만들어 2GB 메모리와 네트워크 카드 연결된 Ubuntu Gen 1 VM을 만듭니다.

  4. PowerShell에서 아래 cmdlet을 사용하여 분리된 GPU 디바이스를 VM에 할당하고 LocationPath 값을 디바이스의 값으로 바꿉니다.

    # Confirm that there are no DDA devices assigned to the VM
    Get-VMAssignableDevice -VMName Ubuntu
    
    # Assign the GPU to the VM
    Add-VMAssignableDevice -LocationPath "PCIROOT(16)#PCI(0000)#PCI(0000)" -VMName Ubuntu
    
    # Confirm that the GPU is assigned to the VM
    Get-VMAssignableDevice -VMName Ubuntu
    

    VM에 GPU를 성공적으로 할당하면 아래 출력이 표시됩니다.

    GPU 할당 스크린샷

    여기에서 GPU 설명서에 따라 추가 값을 구성 합니다.

     # Enable Write-Combining on the CPU
     Set-VM -GuestControlledCacheTypes $true -VMName VMName
    
     # Configure the 32 bit MMIO space
     Set-VM -LowMemoryMappedIoSpace 3Gb -VMName VMName
    
     # Configure greater than 32 bit MMIO space
     Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName VMName
    

    참고

    값 33280Mb는 대부분의 GPU에 적합하지만 GPU 메모리보다 큰 값으로 바꿔야 합니다.

  5. Hyper-V 관리자를 사용하여 VM에 연결하고 Ubuntu OS 설치를 시작합니다. VM에 Ubuntu OS를 설치하려면 기본값을 선택합니다.

  6. 설치가 완료되면 Hyper-V 관리자 를 사용하여 VM을 종료하고 아래 스크린샷과 같이 게스트 운영 체제를 종료하도록 VM에 대한 자동 중지 작업을 구성합니다.

    게스트 OS 종료 스크린샷

  7. Ubuntu에 로그인하고 터미널을 열어 SSH를 설치합니다.

     $ sudo apt install openssh-server
    
  8. ifconfig 명령을 사용하여 Ubuntu 설치에 대한 TCP/IP 주소를 찾고 eth0 인터페이스의 IP 주소를 복사합니다.

  9. OpenSSH(기본적으로 Windows 10 설치되어 ssh.exe) 또는 Putty와 같은 SSH 클라이언트를 사용하여 추가 구성을 위해 Ubuntu VM에 연결합니다.

  10. SSH 클라이언트를 통해 로그인하면 lspci 명령을 실행하고 NVIDIA GPU가 "3D 컨트롤러"로 나열되어 있는지 확인합니다.

    중요

    NVIDIA GPU가 "3D 컨트롤러"로 표시되지 않으면 더 이상 진행하지 마세요. 계속하기 전에 위의 단계를 수행해야 합니다.

  11. VM 내에서 소프트웨어 & 업데이트 검색하고 엽니다. 추가 드라이버로 이동한 다음, 나열된 최신 NVIDIA GPU 드라이버를 선택합니다. 변경 내용 적용 단추를 클릭하여 드라이버 설치를 완료합니다.

    드라이버 설치 스크린샷

  12. 드라이버 설치가 완료된 후 Ubuntu VM을 다시 시작합니다. VM이 시작되면 SSH 클라이언트를 통해 연결하고 nvidia-smi 명령을 실행하여 NVIDIA GPU 드라이버 설치가 성공적으로 완료되었는지 확인합니다. 출력은 아래 스크린샷과 유사해야 합니다.

    nvidia-smi 명령의 출력을 보여 주는 스크린샷

  13. SSH 클라이언트를 사용하여 리포지토리를 설정하고 Docker CE 엔진을 설치합니다.

    $ sudo apt-get update
    $ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
    

    Docker의 공식 GPG 키를 추가합니다.

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    

    지문의 마지막 8자를 검색하여 이제 지문 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 키가 있는지 확인합니다.

    $ sudo apt-key fingerprint 0EBFCD88
    

    출력은 다음과 유사합니다.

    pub   rsa4096 2017-02-22 [SCEA]
    9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
    sub   rsa4096 2017-02-22 [S]
    

    Ubuntu AMD64 아키텍처에 대해 안정적인 리포지토리를 설정합니다.

    $ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    

    패키지를 업데이트하고 Docker CE를 설치합니다.

    $ sudo apt-get update
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
    

    Docker CE 설치 확인:

    $ sudo docker run hello-world
    

Azure IoT Edge 구성

이 구성을 준비하려면 Moby 대신 Docker를 설치해야 하는 필요성을 설명하는 NVIDIA-Deepstream-Azure-IoT-Edge-on-a-NVIDIA-Jetson-Nano GitHub 리포지토리에 포함된 FAQ를 검토하세요. 검토한 후 아래 단계를 진행합니다.

NVIDIA Docker 설치

  1. SSH 클라이언트에서 패키지 리포지토리를 추가합니다.

    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
    sudo apt-key add -
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
    sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    
    sudo apt-get update
    
  2. nvidia-docker2를 설치하고 Docker 디먼 구성을 다시 로드합니다.

    sudo apt-get install -y nvidia-docker2
    sudo pkill -SIGHUP dockerd
    
  3. VM을 다시 부팅합니다.

    sudo /sbin/shutdown -r now
    
  4. 다시 부팅 시 NVIDIA Docker를 성공적으로 설치했는지 확인합니다.

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

    설치에 성공하면 아래 스크린샷의 출력과 같습니다.

    성공적인 Docker 설치 스크린샷

  5. 여기의 지침에 따라 Azure IoT Edge 설치를 계속 진행하여 런타임 설치를 건너뜁니다.

    curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list
    
    sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
    
    curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/
    sudo apt-get update
    
    sudo apt-get install iotedge
    

    참고

    Azure IoT Edge 설치한 후 config.yaml이 Ubuntu VM의 /etc/iotedge/config.yaml에 있는지 확인합니다.

  6. 여기에 있는 지침에 따라 Azure Portal IoT Edge 디바이스 ID를 만듭니. 다음으로 새로 만든 IoT Edge 대한 디바이스 연결 문자열 복사합니다.

  7. SSH 클라이언트를 사용하여 Ubuntu VM의 config.yaml에서 디바이스 연결 문자열 업데이트합니다.

    sudo nano /etc/iotedge/config.yaml
    

    파일의 프로비저닝 구성을 찾아 "수동 프로비저닝 구성" 섹션의 주석 처리를 제거합니다. device_connection_string의 값을 IoT Edge 디바이스의 연결 문자열로 업데이트합니다. 다른 프로비저닝 섹션이 주석 처리되었는지 확인합니다. 프로비전: 줄에 선행 공백이 없고 중첩된 항목이 다음 두 공백으로 들여쓰기되어 있는지 확인합니다.

    수동 프로비저닝 구성 스크린샷

    클립보드 콘텐츠를 Nano에 붙여넣려면 shift+마우스 오른쪽 단추를 클릭하거나 shift+insert를 누릅니다. 파일을 저장하고 닫습니다(Ctrl + X, Y, Enter).

  8. SSH 클라이언트를 사용하여 IoT Edge 디먼을 다시 시작합니다.

    sudo systemctl restart iotedge
    

    설치를 확인하고 IoT Edge 디먼의 상태 검사.

    systemctl status iotedge
    
    journalctl -u iotedge --no-pager --no-full
    
  9. SSH 클라이언트를 사용하여 Ubuntu VM에 다음 디렉터리 구조를 만듭니다.

    cd /var
    sudo mkdir deepstream
    mkdir ./deepstream/custom_configs
    cd /var/deepstream
    sudo mkdir custom_streams
    sudo chmod -R 777 /var/deepstream
    cd ./custom_streams
    
  10. 작업 디렉터리가 /var/deepstream/custom_streams 있는지 확인하고 SSH 클라이언트에서 다음 명령을 실행하여 데모 비디오 파일을 다운로드합니다.

    wget -O cars-streams.tar.gz --no-check-certificate https://onedrive.live.com/download?cid=0C0A4A69A0CDCB4C&resid=0C0A4A69A0CDCB4C%21588371&authkey=AAavgrxG95v9gu0
    

    비디오 파일 압축 해제:

    tar -xzvf cars-streams.tar.gz
    

    /var/deepstream/custom_streams 디렉터리의 내용은 아래 스크린샷과 유사해야 합니다.

    사용자 지정 스트림 스크린샷.

  11. /var/deepstream/custom_configs 디렉터리에 test5_config_file_src_infer_azure_iotedge_edited.txt이라는 새 파일을 만듭니다. 텍스트 편집기를 사용하여 파일을 열고 다음 코드에 붙여넣은 다음 파일을 저장하고 닫습니다.

    # Copyright (c) 2018 NVIDIA Corporation.  All rights reserved.
    #
    # NVIDIA Corporation and its licensors retain all intellectual property
    # and proprietary rights in and to this software, related documentation
    # and any modifications thereto.  Any use, reproduction, disclosure or
    # distribution of this software and related documentation without an express
    # license agreement from NVIDIA Corporation is strictly prohibited.
    
    [application]
    enable-perf-measurement=1
    perf-measurement-interval-sec=5
    #gie-kitti-output-dir=streamscl
    
    [tiled-display]
    enable=1
    rows=2
    columns=2
    width=1280
    height=720
    gpu-id=0
    #(0): nvbuf-mem-default - Default memory allocated, specific to particular platform
    #(1): nvbuf-mem-cuda-pinned - Allocate Pinned/Host cuda memory, applicable for Tesla
    #(2): nvbuf-mem-cuda-device - Allocate Device cuda memory, applicable for Tesla
    #(3): nvbuf-mem-cuda-unified - Allocate Unified cuda memory, applicable for Tesla
    #(4): nvbuf-mem-surface-array - Allocate Surface Array memory, applicable for Jetson
    nvbuf-memory-type=0
    
    [source0]
    enable=1
    #Type - 1=CameraV4L2 2=URI 3=MultiURI
    type=3
    uri=file://../../../../../samples/streams/sample_1080p_h264.mp4
    num-sources=2
    gpu-id=0
    nvbuf-memory-type=0
    
    [source1]
    enable=1
    #Type - 1=CameraV4L2 2=URI 3=MultiURI
    type=3
    uri=file://../../../../../samples/streams/sample_1080p_h264.mp4
    num-sources=2
    gpu-id=0
    nvbuf-memory-type=0
    
    [sink0]
    enable=0
    
    [sink3]
    enable=1
    #Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming
    type=4
    #1=h264 2=h265
    codec=1
    sync=0
    bitrate=4000000
    # set below properties in case of RTSPStreaming
    rtsp-port=8554
    udp-port=5400
    
    [sink1]
    enable=1
    #Type - 1=FakeSink 2=EglSink 3=File 4=UDPSink 5=nvoverlaysink 6=MsgConvBroker
    type=6
    msg-conv-config=../configs/dstest5_msgconv_sample_config.txt
    #(0): PAYLOAD_DEEPSTREAM - Deepstream schema payload
    #(1): PAYLOAD_DEEPSTREAM_MINIMAL - Deepstream schema payload minimal
    #(256): PAYLOAD_RESERVED - Reserved type
    #(257): PAYLOAD_CUSTOM   - Custom schema payload
    msg-conv-payload-type=1
    msg-broker-proto-lib=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_azure_edge_proto.so
    topic=mytopic
    #Optional:
    #msg-broker-config=../../../../libs/azure_protocol_adaptor/module_client/cfg_azure.txt
    
    [sink2]
    enable=0
    type=3
    #1=mp4 2=mkv
    container=1
    #1=h264 2=h265 3=mpeg4
    ## only SW mpeg4 is supported right now.
    codec=3
    sync=1
    bitrate=2000000
    output-file=out.mp4
    source-id=0
    
    [osd]
    enable=1
    gpu-id=0
    border-width=1
    text-size=15
    text-color=1;1;1;1;
    text-bg-color=0.3;0.3;0.3;1
    font=Arial
    show-clock=0
    clock-x-offset=800
    clock-y-offset=820
    clock-text-size=12
    clock-color=1;0;0;0
    nvbuf-memory-type=0
    
    [streammux]
    gpu-id=0
    ##Boolean property to inform muxer that sources are live
    live-source=0
    batch-size=4
    ##time out in usec, to wait after the first buffer is available
    ##to push the batch even if the complete batch is not formed
    batched-push-timeout=40000
    ## Set muxer output width and height
    width=1920
    height=1080
    ##Enable to maintain aspect ratio wrt source, and allow black borders, works
    ##along with width, height properties
    enable-padding=0
    nvbuf-memory-type=0
    
    [primary-gie]
    enable=1
    gpu-id=0
    batch-size=4
    ## 0=FP32, 1=INT8, 2=FP16 mode
    bbox-border-color0=1;0;0;1
    bbox-border-color1=0;1;1;1
    bbox-border-color2=0;1;1;1
    bbox-border-color3=0;1;0;1
    nvbuf-memory-type=0
    interval=0
    gie-unique-id=1
    model-engine-file=../../../../../samples/models/Primary_Detector/resnet10.caffemodel_b4_int8.engine
    labelfile-path=../../../../../samples/models/Primary_Detector/labels.txt
    config-file=../../../../../samples/configs/deepstream-app/config_infer_primary.txt
    #infer-raw-output-dir=../../../../../samples/primary_detector_raw_output/
    
    [tracker]
    enable=1
    tracker-width=600
    tracker-height=300
    ll-lib-file=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_mot_klt.so
    #ll-config-file required for DCF/IOU only
    #ll-config-file=tracker_config.yml
    #ll-config-file=iou_config.txt
    gpu-id=0
    #enable-batch-process applicable to DCF only
    enable-batch-process=0
    
    [tests]
    file-loop=1
    
  12. Azure Portal로 이동합니다. 프로비전된 IoT Hub 선택하고 자동 장치 관리 클릭한 다음 IoT Edge 클릭합니다.

    자동 장치 관리 스크린샷

  13. 오른쪽 창에서 디바이스 연결 문자열 위에서 사용된 디바이스 ID를 선택합니다. 모듈 설정을 클릭합니다.

    모듈 설정 스크린샷

  14. IoT Edge 모듈에서 IoT Edge 모듈을 클릭하고 선택합니다.

    IoT Edge 모듈 추가 스크린샷

  15. IoT Edge 모듈 추가 창에서 모듈 설정 탭을 선택한 다음, 다음 값을 입력하거나 선택합니다.

    • IoT Edge 모듈 이름: NVIDIADeepStreamSDK

    • 이미지 URI: marketplace.azurecr.io/nvidia/deepstream-iot2

    • 정책 다시 시작: 항상

    • 원하는 상태: 실행 중

    • 이미지 끌어오기 정책: 비어 있음

    추가를 선택합니다.

    DeepStream SDK 스크린샷

  16. NvidiaDeepStreamSDK 모듈이 IoT Edge 모듈 아래에 나열되어 있는지 확인합니다.

    IoT Edge 모듈 스크린샷

  17. "NVIDIADeepStreamSDK" 모듈을 클릭하고 "컨테이너 만들기 옵션"을 선택합니다. 기본 구성은 다음과 같습니다.

    컨테이너 만들기 옵션 스크린샷

    위의 구성을 아래 구성으로 바꿉니다.

    {
      "ExposedPorts": {
        "8554/tcp": {}
      },
      "Entrypoint": [
        "/usr/bin/deepstream-test5-app",
        "-c",
        "test5_config_file_src_infer_azure_iotedge_edited.txt",
        "-p",
        "1",
        "-m",
        "1"
      ],
      "HostConfig": {
        "runtime": "nvidia",
        "Binds": [
          "/var/deepstream/custom_configs:/root/deepstream_sdk_v4.0.2_x86_64/sources/apps/sample_apps/deepstream-test5/custom_configs/",
          "/var/deepstream/custom_streams:/root/deepstream_sdk_v4.0.2_x86_64/sources/apps/sample_apps/deepstream-test5/custom_streams/"
        ],
        "PortBindings": {
          "8554/tcp": [
            {
              "HostPort": "8554"
            }
          ]
        }
      },
      "WorkingDir": "/root/deepstream_sdk_v4.0.2_x86_64/sources/apps/sample_apps/deepstream-test5/custom_configs/"
    }
    
  18. 검토 및 만들기를 클릭하고 다음 페이지에서 만들기를 클릭합니다. 이제 Azure Portal IoT Edge 디바이스에 대해 아래에 나열된 세 가지 모듈이 표시됩니다.

    모듈 및 IoT Edge Hub Connections 스크린샷

  19. SSH 클라이언트를 사용하여 Ubuntu VM에 연결하고 올바른 모듈이 실행 중인지 확인합니다.

    sudo iotedge list
    

    iotedge 목록의 출력을 보여 주는 스크린샷

    nvidia-smi
    

    nvidia-smi 스크린샷

    참고

    NvidiaDeepstream 컨테이너를 다운로드하는 데 몇 분 정도 걸립니다. "journalctl -u iotedge --no-pager --no-full" 명령을 사용하여 iotedge 디먼 로그를 확인하여 다운로드의 유효성을 검사할 수 있습니다.

  20. NvdiaDeepStreem 컨테이너가 작동하고 있는지 확인합니다. 아래 스크린샷의 명령 출력은 성공을 나타냅니다.

    sudo iotedge list
    

    NvdiaDeepStreem 컨테이너가 작동 중임을 보여 주는 출력의 스크린샷

    sudo iotedge logs -f NVIDIADeepStreamSDK
    

    iotedge 로그 -f NVIDIADeepStreamSDK 명령에 대한 출력을 보여 주는 스크린샷.

    nvidia-smi
    

    nvidia-smi 명령에 대한 추가 출력을 보여 주는 스크린샷

  21. ifconfig 명령을 사용하여 Ubuntu VM의 TCP/IP 주소를 확인하고 eth0 인터페이스 옆에 있는 TCP/IP 주소를 찾습니다.

  22. 워크스테이션에 VLC 플레이어를 설치합니다. VLC 플레이어 내에서 미디어 -> 네트워크 스트림을 열고 다음 형식을 사용하여 주소를 입력합니다.

    rtsp://ipaddress:8554/ds-test

    여기서 ipaddress는 VM의 TCP/IP 주소입니다.

    VLC 플레이어 스크린샷.

다음 단계

GPU 및 DDA에 대한 자세한 내용은 다음을 참조하세요.