Observação:

Usar MPI Aberto no Oracle Roving Edge Infrastructure

Introdução

A Oracle Roving Edge Infrastructure é uma plataforma robusta de computação em nuvem e armazenamento adequada para implantação na borda da rede ou em locais com conectividade limitada ou sem conectividade externa. À medida que cargas de trabalho maiores, mais complexas e exigentes se movem em direção à borda da rede, isso pode apresentar desafios para uma infraestrutura de borda.

Open MPI é uma implementação do padrão MPI (Message Passing Interface) usado para desenvolver aplicativos paralelos em HPC (High Performance Computing). O MPI aberto pode ser usado para implementar Computação de Alto Desempenho e cargas de trabalho altamente paralelas em partes relativamente menores de infraestrutura que, em seguida, operam como um conjunto maior e agregado de recursos. Essa abordagem pode ser usada para distribuir uma carga de trabalho para a CPU e outros recursos de computação, como GPU, que permite a implantação de tarefas maiores e computacionalmente intensivas na borda da rede, como modelagem preditiva ou outras tarefas de Inteligência Artificial/Aprendizado de Máquina (AI/ML).

O MPI aberto pode ser usado para implantar cargas de trabalho paralelas utilizando recursos nos nós do Oracle Roving Edge Infrastructure. O Netfilter fornece a DNAT (Destination Network Address Translation) e a SNAT (Source Network Address Translation) necessárias para instâncias de VM usando o software de clusterização hospedado nos nós do Oracle Roving Edge Infrastructure. Este tutorial implementa o Open MPI usando o Netfilter no Oracle Roving Edge Infrastructure executando uma calculadora de números primos para demonstrar melhor desempenho ao usar recursos paralelos.

Informações Básicas

O MPI aberto pode ser executado em várias instâncias de Máquina Virtual (VM) em um único nó do Oracle Roving Edge Infrastructure ou em vários nós do Oracle Roving Edge Infrastructure. A execução em um único nó do Oracle Roving Edge Infrastructure é perfeita e não apresenta problemas. Ao executar em vários nós do Oracle Roving Edge Infrastructure, é importante entender a rede nas instâncias de VM do Oracle Roving Edge Infrastructure e como o Open MPI roteia o tráfego para evitar possíveis problemas.

Rede em Instâncias de Máquina Virtual da Oracle Roving Edge Infrastructure

As instâncias de Máquina Virtual em execução no Oracle Roving Edge Infrastructure usam endereços IP privados para comunicação com outras instâncias de VM na mesma sub-rede hospedada no mesmo nó. É possível designar endereços IP públicos a instâncias de VM hospedadas no Oracle Roving Edge Infrastructure para permitir que as instâncias se comuniquem com outras sub-redes e recursos em execução fora do nó do Oracle Roving Edge Infrastructure em que estão hospedadas.

Observação: Os endereços IP públicos são designados a VNICs da instância da VM por meio de um pool de endereços IP públicos. Embora os endereços sejam chamados de IPs Públicos, eles são, na verdade, endereços IP na mesma rede local em que o nó do Oracle Roving Edge Infrastructure está conectado por meio de sua porta RJ-45. Esses endereços podem ser um endereço IPv4 acessível pela internet ou são endereços em uma sub-rede privada na rede local. Esses endereços também são chamados de endereços IP externos, pois podem ser conectados a recursos externos ao nó em que a instância da VM está hospedada.

É importante entender quando uma instância de VM em execução em um nó do Oracle Roving Edge Infrastructure tenta acessar recursos fora do nó, o tráfego passa pelo endereço IP externo que é roteado dentro do nó e para a conexão de rede externa.

Um exemplo de instância de VM no nó do Oracle Roving Edge Infrastructure é mostrado na imagem a seguir. Observe os endereços IP públicos e privados designados.

Um exemplo de instância de VM em um nó do Oracle Roving Edge Infrastructure

Desafios para Executar o MPI Aberto em Vários Nós do Oracle Roving Edge Infrastructure

O uso de endereços IP privados da instância de VM é problemático para software de cluster, como Open MPI, quando é implementado em vários nós do Oracle Roving Edge Infrastructure. Cada nó não tem conhecimento de mapeamentos de endereços IP privados para públicos e da conversão dos mapeamentos para instâncias de VM hospedadas em outros nós. Como os mapeamentos não são compartilhados, os pacotes que usam endereços IP privados são roteados incorretamente ou perdidos.

Um exemplo de como esse problema pode aparecer usando Abrir MPI:

O MPI aberto em execução em instâncias de VM tentará determinar o melhor caminho de rede a ser usado para acessar outros membros da instância de VM. O software pode examinar as interfaces locais e os endereços IP e registrá-los em outros nós do cluster.

Implementar MPI Aberto na Oracle Roving Edge Infrastructure

Para tratar da natureza não compartilhada de uma rede interna do Oracle Roving Edge Infrastructure, o software Netfilter nas instâncias de VM do Linux é usado para reescrever pacotes de rede provenientes e destinados a VMs hospedadas em outros nós do Oracle Roving Edge Infrastructure.

Considerações sobre Projeto

Neste tutorial, três nós do Oracle Roving Edge Infrastructure Roving Edge Devices (RED) são usados para criar um cluster Open MPI. Todos os REDs estão conectados a uma rede externa compartilhada. Cada nó foi configurado com seu próprio pool de IPs externos para alocação a instâncias de VM.

Tabela CIDR da VCN e da Sub-rede

Nome RED CIDR da VCN CIDR da Sub-rede
RED1 10/16 10/24
RED2 10/16 10/24
RED3 10/16 10/24

Este exemplo é mostrado na imagem a seguir, duas configurações de rede de dois REDs diferentes.

Exemplo de VCN e sub-rede em "RED1"

Exemplo de VCN e sub-rede em "RED2"

Público-alvo

Administradores, desenvolvedores e usuários do Oracle Roving Edge Infrastructure.

Objetivos

Pré-requisitos

Tarefa 1: Criar Instâncias de Máquina Virtual

Crie uma instância de VM em cada sub-rede em cada RED.

Exemplo de designações de endereço IP:

Nome RED Nome da VM VM O/S IP Privado da VM IP Público da VM
RED1 redvm1 Ubuntu 22.04 10/24 10.123
RED2 redvm2 Ubuntu 22.04 10/24 10.123
RED3 redvm3 Ubuntu 22.04 10/24 10.123

Observação: As instâncias de VM nesta tarefa são criadas usando uma imagem exportada do OCI (Oracle Cloud Infrastructure) usando o LTS 22.04 do OCI Ubuntu. Qualquer distribuição Linux com pacotes Open MPI adequados pode ser usada, por exemplo, Oracle Linux 8 ou 9, Fedora e assim por diante.

Exemplo de Lista de VMs em "RED3"

  1. Em cada RED, navegue até Compute, Instance e clique em Create Instance.

  2. Em Criar Instância do Serviço Compute, digite Nome, selecione a Imagem personalizada importada, Forma, Configurar rede, chaves SSH e clique em Criar.

    Criando uma Imagem de Computação em cada RED

Tarefa 2: Instalar Pacote de MPI Aberto em Cada Instância de VM

Depois que todas as instâncias de VM tiverem sido criadas, faça log-in em cada instância de VM via SSH com a chave fornecida durante o provisionamento. Os comandos a seguir são adequados para o Ubuntu 22.04. Talvez você precise adaptar essas instruções ou incluir repositórios de pacotes adicionais se estiver usando outra distribuição do Linux.

  1. Execute o comando a seguir para atualizar o sistema e reinicializar.

    sudo apt update && sudo apt upgrade -y
    

    Isso pode levar um tempo para ser concluído. Quando isso estiver concluído, reinicialize a instância.

    sudo shutdown -r now
    
  2. Faça login na instância e instale os pacotes Open MPI.

    Observação:

    • Isso trará algumas dependências.

    • O pacote libopenmpi-dev só é necessário para compilar posteriormente um programa de amostra com o qual testar. Se você não estiver compilando recursos do Open MPI em programas, este pacote não será necessário.

    sudo apt install openmpi-bin libopenmpi-dev -y
    

Tarefa 3: Configurar DNAT (Destination Network Address Translation) e SNAT (Source Network Address Translation)

  1. Exiba os detalhes de cada instância de VM iniciada e anote os endereços IP públicos privados e designados aleatoriamente. Navegue até Compute, Instance e clique no nome da instância para exibir os detalhes.

    Exemplo de VM em "RED3"

  2. Crie os SNATs.

    • Se mapearmos as regras SNAT para cada VM em uma tabela, ela deverá ter esta aparência:

      SNAT Vindo de RED1 Vindo de RED2 Vindo de RED3
      Em redvm1 N/A Entrada src 10.123.123.67 SNAT to src 10.0.2.2 Entrada src 10.123.123.101 SNAT to src 10.0.3.2
      Em redvm2 Entrada src 10.123.123.32 SNAT to src 10.0.1.2 N/A Entrada src 10.123.123.101 SNAT to src 10.0.3.2
      Em redvm3 Entrada src 10.123.123.32 SNAT to src 10.0.1.2 Entrada src 10.123.123.67 SNAT to src 10.0.2.2 N/A
    • Use os comandos iptables para cada VM.

      • Em redvm1.

        sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2
        sudo netfilter-persistent save
        
      • Em redvm2.

        sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2
        sudo netfilter-persistent save
        
      • Em redvm3.

        sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2
        sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2
        sudo netfilter-persistent save
        

      Observação: A adição da primeira regra (sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT) para permitir o acesso da sub-rede que os REDs estão usando para seus IPs públicos. Sem isso (ou uma regra semelhante), o tráfego de entrada de RED para RED provavelmente será descartado pelo RED receptor. Nessas VMs, as novas regras persistem com sudo netfilter-persistent save; no entanto, esse comando provavelmente será outra coisa se você estiver usando outra distribuição do Linux.

  3. Crie os DNATs.

    • Da mesma forma, se mapearmos as regras DNAT para cada VM em uma tabela, ela deverá ter esta aparência:

      DNAT Indo Para RED1 Indo Para RED2 Indo Para RED3
      Em redvm1 N/A Saída dst 10.0.2.2 DNAT to dst 10.123.123.67 Saída dst 10.0.3.2 DNAT to dst 10.123.123.101
      Em redvm2 Saída dst 10.0.1.2 DNAT to dst 10.123.123.32 N/A Saída dst 10.0.3.2 DNAT to dst 10.123.123.101
      Em redvm3 Saída dst 10.0.1.2 DNAT to dst 10.123.123.32 Saída dst 10.0.2.2 DNAT to dst 10.123.123.67 N/A
    • Use os comandos iptables para cada VM.

      • Em redvm1.

        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67
        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101
        sudo netfilter-persistent save
        
      • Em redvm2.

        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32
        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101
        sudo netfilter-persistent save
        
      • Em redvm3.

        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32
        sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67
        sudo netfilter-persistent save
        

      Observação: Nas instâncias de VM, as novas regras persistem com sudo netfilter-persistent save.

Tarefa 4: Configurar MPI aberto

O MPI aberto usa o SSH para se comunicar entre membros do cluster, portanto, há algumas coisas que precisam ser tratadas para que possamos executar jobs.

  1. O MPI aberto usará os endereços IP privados de cada uma das VMs, criará entradas /etc/hosts para cada instância de VM e seu endereço IP privado em cada instância de VM Open MPI.

    Por exemplo, o uso da configuração acima da entrada /etc/hosts em redvm1 conterá as seguintes entradas:

    127.0.0.1 localhost
    127.0.1.1 redvm1  redvm1
    10.0.2.2  redvm2
    10.0.3.2  redvm3
    

    Em redvm2, o /etc/hosts conterá as seguintes entradas:

    127.0.0.1 localhost
    127.0.1.1 redvm2  redvm2
    10.0.1.2  redvm1
    10.0.3.2  redvm3
    

    Em redvm3, o /etc/hosts conterá as seguintes entradas:

    127.0.0.1 localhost
    127.0.1.1 redvm3  redvm3
    10.0.1.2  redvm1
    10.0.2.2  redvm2
    
  2. Também precisamos garantir que a equivalência SSH exista entre cada VM para uso de MPI Aberto.

    Observação: O pressuposto aqui é que essas são novas VMs que não contêm chaves SSH existentes para o usuário do Ubuntu. Se você estiver usando VMs mais antigas que já tiveram chaves SSH criadas, precisará adaptar essas instruções, essas instruções poderão substituir as chaves existentes e bloqueá-lo de suas VMs.

    1. Em redvm1, crie um novo par de chaves públicas ou privadas (se você ainda não tiver chaves criadas). Use o comando ssh-keygen semelhante a ssh-keygen -b 4096 -t rsa (aceite os padrões, não defina uma senha para as novas chaves). Isso gerará ~/.ssh/id_rsa e ~/.ssh/id_rsa.pub.

    2. Adicione a nova chave pública ao arquivo authorized_keys executando cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ou copiando-a manualmente por meio de um editor de texto.

    3. Copie id_rsa e id_rsa.pub para o diretório ~/.ssh do usuário ubuntu em redvm2 e redvm3. Certifique-se de adicionar id_rsa.pub a authorized_keys, execute cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys em redvm2 e redvm3.

    4. Uma vez feito isso, de cada VM, conecte-se a todas as outras VMs, incluindo a própria VM, para garantir que a conectividade funcione e que o SSH confie nos outros hosts.

      • Conexão SSH em redvm1.

        ubuntu@redvm1:~$ ssh redvm1 date
        The authenticity of host 'redvm1 (127.0.1.1)' can't be established.
        ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
        This key is not known by any other names
        Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
        Warning: Permanently added 'redvm1' (ED25519) to the list of known hosts.
        Fri Apr  5 04:28:57 UTC 2024
        ubuntu@redvm1:~$
        ubuntu@redvm1:~$ ssh redvm2 date
        The authenticity of host 'redvm2 (10.0.2.2)' can't be established.
        ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
        This key is not known by any other names
        Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
        Warning: Permanently added 'redvm2' (ED25519) to the list of known hosts.
        Wed Jan 31 04:29:11 UTC 2024
        ubuntu@redvm1:~$
        ubuntu@redvm1:~$ ssh redvm3 date
        The authenticity of host 'redvm3 (10.0.3.2)' can't be established.
        ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
        This key is not known by any other names
        Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
        Warning: Permanently added 'redvm3' (ED25519) to the list of known hosts.
        Wed Jan 31 04:29:19 UTC 2024
        
    5. Repita as etapas acima para redvm2 estabelecer conexão com redvm2, redvm1 e redvm3 e redvm3 estabelecendo conexão com redvm3, redvm1 e redvm2.

  3. Crie um local de armazenamento comum para cada membro do cluster.

    Observação: O ideal é que todas as instâncias de VM que usam o Open MPI tenham um local de armazenamento compartilhado. Isso pode assumir a forma de NFS, GlusterFS, OCFS2 ou qualquer número de outras soluções de sistema de arquivos compartilhados. Isso é particularmente importante se um diretório de trabalho ou conjunto de dados comum for necessário para a carga de trabalho.

    Um sistema de arquivos compartilhado não é necessário para este exemplo, apenas um local com um nome comum para nossos binários de teste. Em cada VM, crie o local do nome comum /mpitest.

    sudo mkdir /mpitest && sudo chown ubuntu:ubuntu /mpitest
    

    Se usarmos um sistema de arquivos compartilhado, o sistema de arquivos compartilhado será montado neste local em todas as instâncias de VM.

  4. Crie um hostfile para uso com mpirun. Para obter mais informações, consulte Como eu uso a opção -hostfile para mpirun?.

    1. Criaremos dois hostfiles para teste. Em redvm1, usando nosso local de nome comum /mpitest criado acima, crie um arquivo /mpitest/mpihosts.txt com o seguinte conteúdo:

      redvm1
      redvm2
      redvm3
      
    2. Crie um arquivo /mpitest/mpihosts_slots.txt com o seguinte conteúdo:

      redvm1 slots=1
      redvm2 slots=1
      redvm3 slots=1
      

Observação: Neste tutorial, os testes só serão executados em redvm1; portanto, não precisamos copiar esses arquivos para redvm2 e redvm3. Se você também quiser executar jobs de outras VMs, precisará copiar esses arquivos para as outras instâncias de VM ou usar um sistema de arquivos compartilhado adequado, como NFS.

Tarefa 5: Testar a Instância da VM

  1. Um simples teste de comandos distribuídos.

    • Um teste simples é apenas chamar um comando, como hostname, em todos os membros do cluster. Aqui está a saída esperada em execução em três nós com o arquivo slots=1 (mpihosts_slots.txt). A diretiva slots informa mpirun quantos processos podem ser alocados para esse nó em vez de mpirun determinar o número de processos.

      Observação: Especificar slots pode ser necessário se você estiver usando recursos limitados que não sejam CPU (por exemplo, GPUs), em que deseja limitar os processos ao número do outro recurso. Não fazer isso pode resultar em falha nos processos devido a não conseguir alocar os outros recursos.

      ubuntu@redvm1:~$ cd /mpitest
      
      ubuntu@redvm1:/mpitest$ cat mpihosts_slots.txt
      redvm1 slots=1
      redvm2 slots=1
      redvm3 slots=1
      
      ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts_slots.txt hostname
      redvm1
      redvm2
      redvm3
      
    • Execute o mesmo teste, mas sem especificar o arquivo slots (mpihosts.txt), mpirun determinará as CPUs disponíveis e executará o número de comandos hostname de CPUs em cada nó. Essas três VMs têm 16 CPUs, portanto, devemos obter 3 x 16 respostas (16 de cada nome de host).

      ubuntu@redvm1:/mpitest$ cat mpihosts.txt
      redvm1
      redvm2
      redvm3
      
      ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt hostname | sort | uniq -c
          16 redvm1
          16 redvm2
          16 redvm3
      
  2. Crie um binário de teste Open MPI.

    Para um teste adequado com um programa que usa Open MPI, usamos um exemplo de calculadora de números primos de John Burkardt. Isso precisará ser baixado e compilado em redvm1. Para obter mais informações, consulte Prime Number Calculator by John Burkardt.

    ubuntu@redvm1:~$ cd /mpitest
    
    ubuntu@redvm1:/mpitest$ curl https://people.sc.fsu.edu/~jburkardt/c_src/prime_mpi/prime_mpi.c -o prime_mpi.c
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
    100  4699  100  4699    0     0   2990      0  0:00:01  0:00:01 --:--:--  2991
    
    ubuntu@redvm1:/mpitest$ mpicc prime_mpi.c -o prime_mpi
    
    ubuntu@redvm1:/mpitest$ ls -l prime_mpi
    -rwxrwxr-x 1 ubuntu ubuntu 16736 Apr  5 05:38 prime_mpi
    

    Como um sistema de arquivos compartilhado não está configurado para teste, o binário prime_mpi precisa ser copiado para redvm2 e redvm3 no mesmo local em que está em redvm1. Execute o seguinte comando.

    ubuntu@redvm1:/mpitest$ scp prime_mpi redvm2:/mpitest
    prime_mpi                                                                                                                     100%   16KB  27.4MB/s   00:00
    ubuntu@redvm1:/mpitest$ scp prime_mpi redvm3:/mpitest
    prime_mpi                                                                                                                     100%   16KB  28.3MB/s   00:00
    
  3. Para comparar uma linha de base, execute um binário MPI aberto independente. Execute prime_mpi sem Abrir MPI para uma linha de base ou comparação.

    ubuntu@redvm1:/mpitest$ ./prime_mpi
    31 January 2024 06:08:17 AM
    
    PRIME_MPI
      C/MPI version
    
      An MPI example program to count the number of primes.
      The number of processes is 1
    
            N        Pi          Time
    
            1         0        0.000003
            2         1        0.000000
            4         2        0.000000
            8         4        0.000000
            16         6        0.000000
            32        11        0.000001
            64        18        0.000002
          128        31        0.000022
          256        54        0.000019
          512        97        0.000066
          1024       172        0.000231
          2048       309        0.000810
          4096       564        0.002846
          8192      1028        0.010093
        16384      1900        0.037234
        32768      3512        0.137078
        65536      6542        0.515210
        131072     12251        1.932970
        262144     23000        7.243419
    
    PRIME_MPI - Master process:
      Normal end of execution.
    
    31 January 2024 06:08:27 AM
    

    Observação: o número de processos é 1 e leva cerca de 10 segundos para ser concluído.

  4. Uma execução distribuída usando Open MPI. Execute prime_mpi com Open MPI em todas as CPUs disponíveis nas três instâncias de VM usando o arquivo mpihosts.txt.

    ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt ./prime_mpi
    31 January 2024 06:09:02 AM
    
    PRIME_MPI
      C/MPI version
    
      An MPI example program to count the number of primes.
      The number of processes is 48
    
            N        Pi          Time
    
            1         0        0.020740
            2         1        0.000428
            4         2        0.000331
            8         4        0.000392
            16         6        0.000269
            32        11        0.000295
            64        18        0.000374
          128        31        0.000390
          256        54        0.000380
          512        97        0.000331
          1024       172        0.000351
          2048       309        0.000385
          4096       564        0.000740
          8192      1028        0.001931
        16384      1900        0.006316
        32768      3512        0.021577
        65536      6542        0.078834
        131072     12251        0.273368
        262144     23000        0.808825
    
    PRIME_MPI - Master process:
      Normal end of execution.
    
    31 January 2024 06:09:03 AM
    

    48 processos são usados e leva cerca de 1 segundo para ser executado.

    Explore o Open MPI executando o mesmo exemplo, mas com o arquivo mpihosts_slots.txt. Você deve ver uma melhoria em comparação com a execução do prime_mpi standalone, mas ele só usará 1 processador em cada nó (total de 3) em vez do complemento completo em todos os nós. Alterando o número de slots em cada instância de VM, você pode controlar a distribuição do job.

Confirmação

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.