Partilhar via


Anexando uma GPU a uma VM Ubuntu Linux no Azure Local

Aplica-se a: Azure Local 2311.2 e posterior

Nota

  • A maneira recomendada de criar e gerenciar VMs no Azure Local é usando o plano de controle Azure Arc. No entanto, como a funcionalidade descrita neste artigo ainda não é fornecida pelo Azure Arc, você pode usar o Windows Admin Center ou o PowerShell conforme descrito neste artigo. As VMs criadas dessa forma não são habilitadas pelo Azure Arc, têm capacidade de gerenciamento limitada do plano de controle do Azure Arc e menos Benefícios Híbridos do Azure, incluindo o uso do Azure Update Manager sem custo extra.

  • Para obter mais informações, consulte Comparar recursos de gerenciamento de VMs no Azure Local e operações com suporte para VMs locais do Azure.

Este tópico fornece instruções passo a passo sobre como instalar e configurar uma unidade de processamento gráfico (GPU) NVIDIA no Azure Local usando a tecnologia DDA (Discrete Device Assignment) para uma máquina virtual (VM) Ubuntu. Você deve ter uma instância Local do Azure já implantada e VMs instaladas.

Instale a GPU e desmonte-a no PowerShell

  1. Instale as GPUs NVIDIA fisicamente na máquina apropriada seguindo as instruções do OEM e as recomendações do BIOS.

  2. Ligue cada máquina.

  3. Entre usando uma conta com privilégios administrativos na máquina com a GPU NVIDIA instalada.

  4. Abra o Gestor de Dispositivos e navegue até à secção de outros dispositivos . Você verá um dispositivo listado como "Controlador de vídeo 3D".

  5. Clique com o botão direito do rato em "3D Video Controller" para abrir a página Propriedades . Clique em Detalhes. No menu pendente em Propriedade, selecione "Caminhos de localização".

  6. Observe o valor com a cadeia de caracteres PCIRoot conforme destacado na captura de tela. Clique com o botão direito do rato em Valor e copie/guarde-o.

    Captura de tela do caminho de localização.

  7. Abra o Windows PowerShell com privilégios elevados e execute o Dismount-VMHostAssignableDevice cmdlet para desmontar o dispositivo GPU do DDA para a VM. Substitua o valor LocationPath pelo valor para o dispositivo obtido na etapa 6.

    Dismount-VMHostAssignableDevice -LocationPath "PCIROOT(16)#PCI(0000)#PCI(0000)" -force
    
  8. Confirme se o dispositivo está listado em dispositivos do sistema no Gerenciador de dispositivos como desmontado.

    Captura de tela do dispositivo desmontado.

Criar e configurar uma VM do Ubuntu

  1. Download Ubuntu desktop versão 18.04.02 ISO.

  2. Abra o Hyper-V Manager na máquina em sua instância local do Azure com a GPU instalada.

    Nota

    O DDA não suporta failover. Esta é uma limitação de VM com DDA. Portanto, recomendamos usar o Hyper-V Manager para implantar a VM na máquina em vez do Gerenciador de Cluster de Failover. O uso do Gerenciador de Cluster de Failover com DDA falha com uma mensagem de erro indicando que a VM tem um dispositivo que não suporta alta disponibilidade.

  3. Usando o ISO do Ubuntu baixado na etapa 1, crie uma nova VM usando o Assistente de Nova Máquina Virtual no Hyper-V Manager para criar uma VM Ubuntu Geração 1 com 2 GB de memória e uma placa de rede conectada a ela.

  4. No PowerShell, atribua o dispositivo GPU desmontado à VM usando os cmdlets, substituindo o valor LocationPath pelo valor do seu dispositivo.

    # 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
    

    Aqui está um resultado da atribuição bem-sucedida da GPU à VM:

    Designe a captura de ecrã da GPU.

    Configure outros valores seguindo a documentação da GPU aqui:

     # 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
    

    Nota

    O valor 33280Mb deve ser suficiente para a maioria das GPUs, mas deve ser substituído por um valor maior do que a memória da GPU.

  5. Usando o Gerenciador do Hyper-V, conecte-se à VM e inicie a instalação do sistema operacional Ubuntu. Escolha os padrões para instalar o Ubuntu OS na VM.

  6. Após a conclusão da instalação, use o Hyper-V Manager para desligar a VM e configurar a Ação de parada automática para a VM desligar o sistema operacional convidado, como na captura de tela:

    Captura de tela de desligamento do SO convidado.

  7. Faça login no Ubuntu e abra o terminal para instalar o SSH:

     $ sudo apt install openssh-server
    
  8. Encontre o endereço TCP/IP para a instalação do Ubuntu usando o comando ifconfig e copie o endereço IP para a interface eth0 .

  9. Use um cliente SSH como OpenSSH (ssh.exe instalado com o Windows 10 por padrão) ou Putty para se conectar à VM do Ubuntu para configuração adicional.

  10. Após o login através do cliente SSH, emita o comando lspci e valide se a GPU NVIDIA está listada como "controlador 3D".

    Importante

    Se a GPU NVIDIA não for vista como "controlador 3D", não prossiga. Certifique-se de que os passos acima são seguidos antes de prosseguir.

  11. Dentro da VM, procure e abra Atualizações de Software. Navegue até Drivers adicionais e escolha os drivers de GPU NVIDIA mais recentes listados. Conclua a instalação do driver clicando no botão Aplicar alterações .

    Captura de tela de instalação do driver.

  12. Reinicie a VM do Ubuntu após a conclusão da instalação do driver. Quando a VM for iniciada, conecte-se através do cliente SSH e execute o comando nvidia-smi para verificar se a instalação do driver da GPU NVIDIA foi concluída com êxito. A saída deve ser semelhante à captura de tela:

    Captura de tela que mostra a saída do comando nvidia-smi.

  13. Usando o cliente SSH, configure o repositório e instale o Docker CE Engine:

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

    Adicione a chave GPG oficial do Docker:

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

    Verifique se agora tem a chave com a impressão digital 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, procurando os últimos oito caracteres da impressão digital:

    $ sudo apt-key fingerprint 0EBFCD88
    

    O seu resultado deve assemelhar-se a isto:

    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]
    

    Configure o repositório estável para a arquitetura Ubuntu AMD64:

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

    Atualize pacotes e instale o Docker CE:

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

    Verifique a instalação do Docker CE:

    $ sudo docker run hello-world
    

Configurar o Azure IoT Edge

Para se preparar para essa configuração, consulte as perguntas frequentes contidas no repositório NVIDIA-Deepstream-Azure-IoT-Edge-on-a-NVIDIA-Jetson-Nano GitHub, que explica a necessidade de instalar o Docker em vez do Moby. Após a revisão, prossiga para as próximas etapas.

Instalar o NVIDIA Docker

  1. No cliente SSH, adicione repositórios de pacotes:

    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. Instale o nvidia-docker2 e recarregue a configuração do daemon do Docker:

    sudo apt-get install -y nvidia-docker2
    sudo pkill -SIGHUP dockerd
    
  3. Reinicialize a VM:

    sudo /sbin/shutdown -r now
    
  4. Após a reinicialização, verifique se a instalação do NVIDIA Docker foi bem-sucedida.

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

    Aqui está uma saída de uma instalação bem-sucedida:

    Captura de tela de instalação bem-sucedida do Docker.

  5. Seguindo as instruções aqui, prossiga para instalar o Azure IoT Edge, ignorando a instalação em tempo de execução:

    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
    

    Nota

    Depois de instalar o Azure IoT Edge, verifique se o config.yaml está presente na VM do Ubuntu em /etc/iotedge/config.yaml

  6. Crie uma identidade de dispositivo IoT Edge no portal do Azure seguindo as orientações aqui. Em seguida, copie a cadeia de conexão do dispositivo para o IoT Edge recém-criado.

  7. Usando o cliente SSH, atualize a cadeia de conexão do dispositivo em config.yaml na VM do Ubuntu:

    sudo nano /etc/iotedge/config.yaml
    

    Encontre as configurações de provisionamento do arquivo e descomente a seção "Configuração de provisionamento manual". Atualize o valor de device_connection_string com a cadeia de conexão do seu dispositivo IoT Edge. Certifique-se de que quaisquer outras secções de provisionamento estejam comentadas. Certifique-se de que a linha de provisionamento: não tenha espaços em branco antes e que os itens aninhados estejam indentados por dois espaços.

    Captura de tela de configuração de provisionamento manual.

    Para colar o conteúdo da área de transferência no Nano, shift+clique com o botão direito do rato ou prima shift+inserir. Salve e feche o arquivo (Ctrl + X, Y, Enter).

  8. Usando o cliente SSH, reinicie o daemon do IoT Edge:

    sudo systemctl restart iotedge
    

    Verifique a instalação e verifique o status do daemon do IoT Edge:

    systemctl status iotedge
    
    journalctl -u iotedge --no-pager --no-full
    
  9. Usando o cliente SSH, crie a seguinte estrutura de diretórios na VM do Ubuntu:

    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. Certifique-se de que seu diretório de trabalho é /var/deepstream/custom_streams e baixe o arquivo de vídeos de demonstração executando o seguinte comando no cliente SSH:

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

    Descompacte os arquivos de vídeo:

    tar -xzvf cars-streams.tar.gz
    

    O conteúdo do diretório /var/deepstream/custom_streams deve ser semelhante à captura de tela:

    Captura de ecrã de fluxos personalizados.

  11. Crie um novo arquivo chamado test5_config_file_src_infer_azure_iotedge_edited.txt no diretório /var/deepstream/custom_configs. Usando um editor de texto, abra o arquivo e cole no código a seguir, salve e feche o arquivo.

    # 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 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 isn't 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. Navegue para o portal do Azure. Selecione IoT Hub Provisioned, clique em Gerenciamento Automático de Dispositivos e, em seguida, clique em IoT Edge:

    Captura de tela de gerenciamento automático de dispositivos.

  13. No painel direito, selecione a identidade do dispositivo cuja cadeia de conexão do dispositivo foi usada. Clique em definir módulos:

    Defina a captura de tela dos módulos.

  14. Em Módulos IoT Edge, clique e escolha Módulo IoT Edge:

    Adicionar captura de tela do módulo IoT Edge.

  15. No painel Adicionar Módulo de Borda IoT , selecione a guia Configurações do Módulo e insira ou selecione os seguintes valores:

    • Nome do módulo IoT Edge: NVIDIADeepStreamSDK

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

    • Política de reinicialização: sempre

    • Status desejado: em execução

    • Política de extração de imagem: em branco

    Selecione Adicionar.

    Captura de tela do SDK do DeepStream.

  16. Verifique se o módulo NvidiaDeepStreamSDK está listado em Módulos IoT Edge:

    Captura de tela dos módulos IoT Edge.

  17. Clique no módulo "NVIDIADeepStreamSDK" e escolha "Opções de criação de contêiner". A configuração padrão é mostrada aqui:

    Captura de tela de Opções de Criação de Contêiner.

    Substitua a configuração acima pela configuração:

    {
      "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. Selecione Rever e Criar e, na página seguinte, clique em Criar. Agora você deve ver os três módulos listados para seu dispositivo IoT Edge no portal do Azure:

    Captura de tela de módulos e conexões do IoT Edge Hub.

  19. Conecte-se à VM do Ubuntu usando o cliente SSH e verifique se os módulos corretos estão em execução:

    sudo iotedge list
    

    Captura de tela que mostra a saída da lista iotedge.

    nvidia-smi
    

    nvidia-smi screenshot.

    Nota

    Leva alguns minutos para que o NvidiaDeepstream Container seja baixado. Você pode validar o download usando o comando journalctl -u iotedge --no-pager --no-full para examinar os logs do daemon iotedge.

  20. Confirme se o contêiner NvdiaDeepStreem está operacional. A saída do comando nas capturas de tela indica sucesso.

    sudo iotedge list
    

    Captura de tela da saída que mostra que o contêiner NvdiaDeepStreem está operacional.

    sudo iotedge logs -f NVIDIADeepStreamSDK
    

    Captura de ecrã que mostra a saída dos logs iotedge para o comando -f NVIDIADeepStreamSDK.

    nvidia-smi
    

    Captura de tela que mostra a saída adicional para o comando nvidia-smi.

  21. Confirme o endereço TCP/IP para sua VM Ubuntu usando o comando ifconfig e procure o endereço TCP/IP ao lado da interface eth0 .

  22. Instale o VLC Player na sua estação de trabalho. No VLC Player, clique em Mídia -> fluxo de rede aberta e digite o endereço usando este formato:

    rtsp://ipaddress:8554/ds-test

    onde ipaddress é o endereço TCP/IP da sua VM.

    VLC Player Screenshot.

Próximos passos

Para obter mais informações sobre GPUs e DDA, consulte também: