Dela via


Koppla en GPU till en virtuell Ubuntu Linux-dator på Azure Stack HCI

Gäller för: Azure Stack HCI, versionerna 23H2 och 22H2

Anteckning

Det rekommenderade sättet att skapa och hantera virtuella datorer på Azure Stack HCI 23H2 är att använda Azure Arc-kontrollplanet. Använd mekanismen som beskrivs nedan för att endast hantera dina virtuella datorer om du behöver funktioner som inte är tillgängliga på virtuella Azure Arc-datorer.

Det här avsnittet innehåller stegvisa instruktioner om hur du installerar och konfigurerar en NVIDIA-grafikprocessor (GPU) med Azure Stack HCI med hjälp av DDA-teknik (Discrete Device Assignment) för en virtuell Ubuntu-dator (VM). Det här dokumentet förutsätter att du har Azure Stack HCI-klustret distribuerat och virtuella datorer installerade.

Installera GPU:n och demontera den sedan i PowerShell

  1. Installera NVIDIA GPU:er fysiskt i lämpliga servrar enligt OEM-instruktioner och BIOS-rekommendationer.

  2. Starta på varje server.

  3. Logga in med ett konto med administratörsbehörighet till servrarna med NVIDIA GPU installerat.

  4. Öppna Enhetshanteraren och gå till avsnittet andra enheter. Du bör se en enhet som visas som "3D-videostyrenhet".

  5. Högerklicka på "3D Video Controller" för att öppna sidan Egenskaper . Klicka på Information. I listrutan under Egenskap väljer du "Platssökvägar".

  6. Observera värdet med strängen PCIRoot som markerat i skärmbilden nedan. Högerklicka på Värde och kopiera/spara det.

    Skärmbild av platssökväg.

  7. Öppna Windows PowerShell med förhöjd behörighet och kör cmdleten Dismount-VMHostAssignableDevice för att demontera GPU-enheten för DDA till virtuell dator. Ersätt Värdet LocationPath med värdet för din enhet som hämtades i steg 6.

    Dismount-VMHostAssignableDevice -LocationPath "PCIROOT(16)#PCI(0000)#PCI(0000)" -force
    
  8. Bekräfta att enheten visas under systemenheter i Enhetshanteraren som Demonterad.

    Skärmbild av demonterad enhet.

Skapa och konfigurera en virtuell Ubuntu-dator

  1. Ladda ned Ubuntu Desktop version 18.04.02 ISO.

  2. Öppna Hyper-V Manager på noden i systemet med GPU:n installerad.

    Anteckning

    DDA stöder inte redundans. Det här är en begränsning för virtuella datorer med DDA. Därför rekommenderar vi att du använder Hyper-V Manager för att distribuera den virtuella datorn på noden i stället för Klusterhanteraren för växling vid fel. Användning av Klusterhanteraren för växling vid fel med DDA misslyckas med ett felmeddelande som anger att den virtuella datorn har en enhet som inte stöder hög tillgänglighet.

  3. Använd Ubuntu ISO som laddades ned i steg 1 och skapa en ny virtuell dator med guiden Ny virtuell dator i Hyper-V Manager för att skapa en virtuell Ubuntu Gen 1-dator med 2 GB minne och ett nätverkskort kopplat till den.

  4. I PowerShell tilldelar du den demonterade GPU-enheten till den virtuella datorn med hjälp av cmdletarna nedan och ersätter LocationPath-värdet med värdet för din enhet.

    # 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
    

    En lyckad tilldelning av GPU:n till den virtuella datorn visar utdata nedan:

    Tilldela GPU-skärmbild.

    Konfigurera ytterligare värden enligt GPU-dokumentationen här:

     # 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
    

    Anteckning

    Värdet 33280 Mb bör räcka för de flesta GPU:er, men bör ersättas med ett värde som är större än GPU-minnet.

  5. Använd Hyper-V Manager, anslut till den virtuella datorn och starta installationen av Ubuntu OS. Välj standardinställningarna för att installera Ubuntu-operativsystemet på den virtuella datorn.

  6. När installationen är klar använder du Hyper-V Manager för att stänga av den virtuella datorn och konfigurera åtgärden Automatiskt stopp för den virtuella datorn så att gästoperativsystemet stängs av som på skärmbilden nedan:

    Skärmbild av avstängning av gästoperativsystem.

  7. Logga in på Ubuntu och öppna terminalen för att installera SSH:

     $ sudo apt install openssh-server
    
  8. Leta upp TCP/IP-adressen för Ubuntu-installationen med hjälp av kommandot ifconfig och kopiera IP-adressen för eth0-gränssnittet .

  9. Använd en SSH-klient som OpenSSH (ssh.exe installeras med Windows 10 som standard) eller Putty för att ansluta till den virtuella Ubuntu-datorn för ytterligare konfiguration.

  10. Vid inloggning via SSH-klienten utfärdar du kommandot lspci och verifierar att NVIDIA GPU visas som "3D-styrenhet".

    Viktigt

    Om NVIDIA GPU inte ses som "3D-styrenhet" ska du inte gå vidare. Kontrollera att stegen ovan följs innan du fortsätter.

  11. I den virtuella datorn söker du efter och öppnar Software & Uppdateringar. Gå till Ytterligare drivrutiner och välj sedan de senaste NVIDIA GPU-drivrutinerna i listan. Slutför drivrutinsinstallationen genom att klicka på knappen Tillämpa ändringar .

    Skärmbild av drivrutinsinstallation.

  12. Starta om den virtuella Ubuntu-datorn när drivrutinsinstallationen har slutförts. När den virtuella datorn startar ansluter du via SSH-klienten och utfärdar kommandot nvidia-smi för att kontrollera att NVIDIA GPU-drivrutinsinstallationen har slutförts. Utdata bör likna skärmbilden nedan:

    Skärmbild som visar utdata från nvidia-smi-kommandot.

  13. Med hjälp av SSH-klienten konfigurerar du lagringsplatsen och installerar Docker CE-motorn:

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

    Lägg till Docker officiella GPG-nyckel:

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

    Kontrollera att du nu har nyckeln med fingeravtrycket 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 genom att söka efter fingeravtryckets sista åtta tecken:

    $ sudo apt-key fingerprint 0EBFCD88
    

    Dina utdata bör se ut ungefär så här:

    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]
    

    Konfigurera den stabila lagringsplatsen för Ubuntu AMD64-arkitekturen:

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

    Uppdatera paket och installera Docker CE:

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

    Kontrollera Docker CE-installationen:

    $ sudo docker run hello-world
    

Konfigurera Azure IoT Edge

För att förbereda för den här konfigurationen kan du läsa vanliga frågor och svar i GITHub-lagringsplatsen NVIDIA-Deepstream-Azure-IoT-Edge-on-a-NVIDIA-Jetson-Nano , som förklarar behovet av att installera Docker i stället för Moby. När du har granskat går du vidare till stegen nedan.

Installera NVIDIA Docker

  1. Från SSH-klienten lägger du till paketlagringsplatser:

    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. Installera nvidia-docker2 och ladda om Docker-daemonkonfigurationen:

    sudo apt-get install -y nvidia-docker2
    sudo pkill -SIGHUP dockerd
    
  3. Starta om den virtuella datorn:

    sudo /sbin/shutdown -r now
    
  4. Vid omstart kontrollerar du att NVIDIA Docker har installerats:

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

    Installationen kommer att se ut som utdata på skärmbilden nedan:

    Skärmbild av lyckad Docker-installation.

  5. Följ anvisningarna här och fortsätt att installera Azure IoT Edge och hoppa över körningsinstallationen:

    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
    

    Anteckning

    När du har installerat Azure IoT Edge kontrollerar du att config.yaml finns på den virtuella Ubuntu-datorn på /etc/iotedge/config.yaml

  6. Skapa en IoT Edge enhetsidentitet i Azure Portal följande vägledning här. Kopiera sedan enhetens anslutningssträng för den nyligen skapade IoT Edge.

  7. Använd SSH-klienten och uppdatera enheten anslutningssträng i config.yaml på den virtuella Ubuntu-datorn:

    sudo nano /etc/iotedge/config.yaml
    

    Leta reda på konfigurationerna för filen och avkommentera avsnittet "Manuell etableringskonfiguration". Uppdatera värdet för device_connection_string med anslutningssträng från IoT Edge enheten. Kontrollera att alla andra etableringsavsnitt har kommenterats bort. Kontrollera att etableringen: raden inte har något föregående blanksteg och att kapslade objekt är indragna med två blanksteg:

    Skärmbild av konfiguration av manuell etablering.

    Om du vill klistra in innehållet i Urklipp i Nano skiftar du+högerklickar eller trycker på skift+insert. Spara och stäng filen (Ctrl + X, Y, Retur).

  8. Starta om IoT Edge-daemon med hjälp av SSH-klienten:

    sudo systemctl restart iotedge
    

    Kontrollera installationen och kontrollera statusen för IoT Edge-daemon:

    systemctl status iotedge
    
    journalctl -u iotedge --no-pager --no-full
    
  9. Använd SSH-klienten och skapa följande katalogstruktur på den virtuella Ubuntu-datorn:

    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. Kontrollera att arbetskatalogen är /var/deepstream/custom_streams och ladda ned demovideofilen genom att köra följande kommando i SSH-klienten:

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

    Avkomprimera videofilerna:

    tar -xzvf cars-streams.tar.gz
    

    Innehållet i katalogen /var/deepstream/custom_streams bör likna skärmbilden nedan:

    Skärmbild av anpassade strömmar.

  11. Skapa en ny fil med namnet test5_config_file_src_infer_azure_iotedge_edited.txt i katalogen /var/deepstream/custom_configs. Öppna filen med hjälp av en textredigerare och klistra in följande kod och spara och stäng sedan filen.

    # 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. Gå till Azure-portalen. Välj IoT Hub Etablerad, klicka på Automatisk Enhetshantering och klicka sedan på IoT Edge:

    Skärmbild av automatisk Enhetshantering.

  13. I den högra rutan väljer du den enhetsidentitet vars anslutningssträng användes ovan. Klicka på Ange moduler:

    Ställ in moduler Skärmbild.

  14. Under IoT Edge moduler klickar du på och väljer IoT Edge modul:

    Lägg till IoT Edge modulskärmbild.

  15. I fönstret Lägg till IoT Edge modul väljer du fliken Modulinställningar och anger eller väljer sedan följande värden:

    • IoT Edge modulnamn: NVIDIADeepStreamSDK

    • Bild-URI: marketplace.azurecr.io/nvidia/deepstream-iot2

    • Omstartsprincip: alltid

    • Önskad status: körs

    • Bildhämtningsprincip: tom

    Välj Lägg till.

    DeepStream SDK Skärmbild.

  16. Se till att NvidiaDeepStreamSDK-modulen visas under IoT Edge-moduler:

    skärmbild av IoT Edge-moduler.

  17. Klicka på modulen "NVIDIADeepStreamSDK" och välj "Alternativ för att skapa container". Standardkonfigurationen visas här:

    Skärmbild av alternativ för att skapa container.

    Ersätt konfigurationen ovan med konfigurationen nedan:

    {
      "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. Klicka på Granska och skapa och klicka på Skapa på nästa sida. Nu bör du se de tre modulerna nedan för din IoT Edge-enhet i Azure Portal:

    Skärmbild av moduler och IoT Edge Hub Connections.

  19. Anslut till den virtuella Ubuntu-datorn med SSH-klienten och kontrollera att rätt moduler körs:

    sudo iotedge list
    

    Skärmbild som visar utdata från iotedge-listan.

    nvidia-smi
    

    nvidia-smi skärmbild.

    Anteckning

    Det tar några minuter innan NvidiaDeepstream-containern laddas ned. Du kan verifiera nedladdningen med kommandot "journalctl -u iotedge --no-pager --no-full" för att titta på daemonloggarna för iotedge.

  20. Kontrollera att NvdiaDeepStreem-containern fungerar. Kommandots utdata i skärmbilderna nedan indikerar att det lyckades.

    sudo iotedge list
    

    Skärmbild av utdata som visar att NvdiaDeepStreem-containern fungerar.

    sudo iotedge logs -f NVIDIADeepStreamSDK
    

    Skärmbild som visar utdata för kommandot iotedge logs -f NVIDIADeepStreamSDK.

    nvidia-smi
    

    Skärmbild som visar ytterligare utdata för nvidia-smi-kommandot.

  21. Bekräfta TCP/IP-adressen för din virtuella Ubuntu-dator med hjälp av kommandot ifconfig och leta efter TCP/IP-adressen bredvid eth0-gränssnittet .

  22. Installera VLC Player på din arbetsstation. I VLC Player klickar du på Media –> öppna nätverksströmmen och skriver in adressen med det här formatet:

    rtsp://ipaddress:8554/ds-test

    där ipaddress är den virtuella datorns TCP/IP-adress.

    Skärmbild av VLC-spelare.

Nästa steg

Mer information om GPU:er och DDA finns också: