SoC arm64 RK3588

Demo da placa de desenvolvimento RK3588

RK3588/RK3588S é um SoC ARM64 de alto desempenho lançado pela Rockchip, com as seguintes configurações:

  • 8C (A764 + A554)
  • GPU (4 núcleos, Mali-G610) com suporte a decodificação de hardware 8K
  • NPU (2Tops * 3)

O RK3588 tem alguns módulos externos a mais, suportando mais interfaces, enquanto o RK3588S não tem esses módulos, mas seu preço é um pouco mais baixo.

Meu hardware

  1. Orange Pi 5 8G (RK3588S)
  2. Rock 5A 4G (RK3588S)
  3. Orange Pi 5 Plus 16G (RK3588)

De acordo com a documentação e o ecossistema da Orange Pi, parece ser um pouco melhor que o Rock Pi; na minha experiência, a documentação da Orange Pi realmente é bem feita, bem clara e vem em duas línguas, chinês e inglês. Por outro lado, a WIKI do Rock Pi, apesar de parecer mais moderna, aparenta ter mais críticas na comunidade, e também vi pessoas comentando sobre os problemas com fornecimento de energia PD do Rock 5.

Por isso, no momento, minha percepção é que, em termos de ecossistema de software, Raspberry Pi » Orange Pi > Rock Pi; e, em termos de custo-benefício, Orange Pi > Rock Pi » Raspberry Pi (agora a diferença não é tão significativa, já que os preços do Raspberry Pi caíram).

Outras placas RK3588 ou placas com outros SoCs ARM, ou são muito caras ou têm desempenho abaixo do esperado. Por enquanto, as placas chinesas que têm um melhor custo-benefício e são mais “hackeáveis” são a Orange Pi e a Rock Pi.

A FriendlyELEC (anteriormente conhecida como FriendlyARM, traduzida como “Braço Amigável”) também lançou produtos com RK3588 e RK3588S, porém, os produtos dessa empresa parecem ser principalmente destinados ao OpenWRT, com um design voltado para roteadores. Por enquanto, não estou interessado. A Wildfire, outra empresa que vem da educação em sistemas embarcados, também planeja lançar uma placa com RK3588S (da série LubanMao), que parece ter um preço OK e foi anunciada para estar disponível em 2023/8/8. No entanto, já tenho placas RK3588S suficientes e não estou considerando comprar mais por enquanto.

Outros materiais de referência da comunidade:

O que se pode fazer com uma placa de desenvolvimento RK3588

  1. Brincar com sistemas embarcados via GPIO
  2. Instalar o sistema Android e usar como uma máquina de transmissão ao vivo com OBS, por exemplo, para transmitir vídeos locais em loop ou conteúdo de câmeras ao vivo
  3. Usar para gravar automaticamente as transmissões ao vivo de seus UPs favoritos, gravar automaticamente quando começam e poder rever a qualquer momento
  4. Usar como servidor de transmissão ao vivo/sala de bate-papo por vídeo, com suporte para codificação e decodificação em tempo real em diferentes resoluções
  5. Usar como um servidor virtual ou para Docker, virtualizando vários hosts ARM, e até mesmo rodar Android
  6. Usar como um nó ARM num cluster de máquinas virtuais Proxmox

Exemplos de uso do NPU

Se for usar o NPU, recomendo instalar diretamente a imagem oficial Debian da Orange Pi 5, o que deve apresentar menos problemas.

A Rockchip fornece dois repositórios relacionados ao NPU, que incluem manuais de uso, exemplos e drivers:

  • rknn-toolkit2: Esse repositório realmente contém dois pacotes em Python, descritos a seguir
    • rknn-toolkit2 x64: localizado na pasta docs/examples/packages na raiz do repositório, inclui documentação, exemplos e pacotes “wheel” para a versão x64 que só podem ser instalados em hosts x64 e dependem de frameworks de IA como ONNX, TensorFlow e PyTorch. Suporta inferência IA com NPU, inferência IA de emulador local e conversão de modelos ONNX para o formato rknn compatível com NPU
      • Principalmente utilizado para depuração de modelos em PCs
      • Atenção: de acordo com a documentação oficial, até a versão 1.4, este SDK é compatível apenas com os sistemas Ubuntu18.04(x64) / Ubuntu20.04(x64), e com as versões Python 3.6/3.8
    • rknn-toolkit2 lite2 arm64: encontrado na pasta rknn_toolkit_lite2 do repositório, depende apenas do OpenCV e do NumPy, e fornece APIs Python para o NPU
      • Pode ser utilizado para implantar modelos através da API Python
      • Atenção: de acordo com a documentação oficial, até a versão 1.4, este SDK é compatível apenas com os sistemas Debian 10(arm64) / Debian 11(arm64), e com as versões Python 3.7/3.9
  • rknpu2: O rknpu2 fornece uma API C para o NPU, principalmente usado para implantar modelos em linguagem C.

Atenção: o ambiente de desenvolvimento no PC é diferente dos requisitos do sistema no dispositivo, então preste atenção nas diferenças!

Embora ambos os repositórios usem repositórios git, todo o conteúdo subjacente é em forma de binários, como “.so”, “.whl”, imagens docker, e os códigos-fonte não são abertos.

Além disso, a imagem docker x64 fechada fornecida oficialmente é muito grande e foi compartilhada apenas através do lento serviço de compartilhamento da Baidu Cloud. Com base na documentação, eu mesmo escrevi um Dockerfile.rknn_toolkit2_1.4.0

que funciona normalmente.

O processo de desenvolvimento e teste é assim: primeiro executar o contêiner e mapear meu diretório de trabalho para dentro dele, também adicionando recursos de X11 Forwarding com --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw"

para que os programas GUI dentro do contêiner possam ser exibidos através do X11 Server do host:

docker run --name rknn -d \ --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" \ -v /home/ryan/Downloads/rk3588s/:/work \ rknn-toolkit2:1.4.0 \ bash -c 'while true; do sleep 1000000; done'

Depois simplesmente acesso remoto ao contêiner via vscode para desenvolvimento~

Primeiro fiz um demo de detecção de objetos em vídeos, o código está aqui yolov5_rknn_toolkit2_demo

1. Rodando um demo oficial do rknn-toolkit2-lite2 no orangepi

O processo de instalação é o mesmo que o do rknn_toolkit2:

# Instalar pacotes básicos de python sudo apt-get update sudo apt-get install -y python3 python3-dev python3-pip gcc # Instalar dependências do rknn-toolkit2-lite2 sudo apt-get install -y python3-opencv python3-numpy # Entrar na pasta onde o pacote rknn_toolkit_lite2 está armazenado cd rknn_toolkit_lite2/packages # Usar o espelho da BFSU para acelerar o download dos pacotes Python pip config set global.index-url https://mirrors.bfsu.edu.cn/pypi/web/simple # Instalar o rknn_toolkit_lite2 na pasta do usuário, para debian 11 instalar o whl cpython3.9 pip install --user rknn_toolkit_lite2-1.4.0-cp39-cp39-linux_aarch64.whl

Isso é tudo, agora você pode começar a rodar tarefas npu.

A API é quase idêntica à do rknn_toolkit2, mas só pode carregar modelos rknn que sejam compatíveis com o modelo do SoC e não tem a funcionalidade de conversão de modelos.

Se você quiser implantar um programa baseado no rknpu2, o processo é semelhante, basta olhar a documentação oficial no repositório.

2. Debugging de desempenho do NPU

O documento oficial do rknpu2 Rockchip_RKNPU_User_Guide_RKNN_API_V1.4.0_CN.pdf inclui uma seção no final que fala sobre debugging de desempenho. O conteúdo a seguir é uma cópia principal daquele documento

Normalmente, as frequências das várias unidades no dispositivo são ajustadas dinamicamente, o que pode causar variação nos resultados de desempenho do modelo. Para evitar inconsistências nos resultados dos testes de desempenho, recomenda-se fixar as frequências das unidades relevantes antes de realizar os testes. Os comandos para visualização e configuração dessas frequências são:

1. Comandos de debug de CPU

  1. Verificar a frequência da CPU:
    # Método 1 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq # Método 2 cat /sys/kernel/debug/clk/clk_summary | grep arm
  2. Fixar a frequência da CPU (suportado pelo rk3588)
    # Ver as frequências disponíveis da CPU cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies # Saidas => 408000 600000 816000 1008000 1200000 1416000 1608000 1800000 # Definir a frequência da CPU, por exemplo, para a máxima de 1.8GHz echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor echo 1800000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed

    2. Comandos de debug de memória (DDR)

  3. Verificar a frequência da memória (DDR)
    cat /sys/kernel/debug/clk/clk_summary | grep ddr
  4. Fixar a frequência da memória (DDR)

    Necessita do suporte do firmware, o comando a seguir não funciona no orangepi5, provavelmente por não ser suportado

    # Ver as frequências disponíveis para DDR cat /sys/class/devfreq/dmc/available_frequencies # Definir a frequência DDR, por exemplo, para 1560MHz echo userspace > /sys/class/devfreq/dmc/governor echo 1560000000 > /sys/class/devfreq/dmc/userspace/set_freq

3. Comandos de debug do NPU

  1. Verificar a frequência do NPU (específico para rk3588)

    cat /sys/class/devfreq/fdab0000.npu/cur_freq
  2. Fixar a frequência do NPU (específico para rk3588)

    Atenção: nas versões posteriores a 0.7.2 do driver NPU, é necessário ligar a alimentação do NPU antes de configurar a frequência

    # Ver as frequências disponíveis do NPU cat /sys/class/devfreq/fdab0000.npu/available_frequencies # => 300000000 400000000 500000000 600000000 700000000 800000000 900000000 1000000000 # Definir a frequência do NPU, por exemplo, para a máxima de 1 GHz echo userspace > /sys/class/devfreq/fdab0000.npu/governor echo 1000000000 > /sys/kernel/debug/clk/clk_npu_dsu0/clk_rate

4. Configurações suportadas de consulta do NPU

Para drivers do NPU versão 0.7.2 e posterior, é possível consultar através de nós a versão do NPU, a utilização dos diferentes núcleos do NPU e controlar manualmente a alimentação do NPU

# 1. Consultar a versão do driver do NPU ## Corrigi o comando, o documento oficial tinha um erro e dava erro cat /sys/kernel/debug/rknpu/version # 2. Consultar a utilização do NPU cat /sys/kernel/debug/rknpu/load # 3. Consultar o estado da alimentação do NPU cat /sys/kernel/debug/rknpu/power # 4. Ligar a alimentação do NPU echo on > /sys/kernel/debug/rknpu/power # 5. Desligar a alimentação do NPU echo off > /sys/kernel/debug/rknpu/power

Para drivers do NPU versão 0.8.2 e posteriores, foram adicionadas funcionalidades como ajuste de frequência, tensão e controle dinâmico de energia:

# 1. Consultar a frequência de trabalho do NPU cat /sys/kernel/debug/rknpu/freq # 2. Definir a frequência de trabalho do NPU ## Verificar as frequências disponíveis do RK3588 NPU cat /sys/class/devfreq/fdab0000.npu/available_frequencies ## Definir a frequência do RK3588 NPU, por exemplo, para 1 GHz echo 1000000000 > /sys/kernel/debug/rknpu/freq # 3. Consultar a tensão de trabalho do NPU ## Atenção: não é suportado modificá-la diretamente, só é possível modificar a frequência, a tensão é ajustada em função disso cat /sys/kernel/debug/rknpu/volt # 4. Consultar o controle dinâmico da alimentação do NPU e o tempo de atraso para desligar (em ms) cat /sys/kernel/debug/rknpu/delayms # 5. Definir o controle dinâmico da alimentação do NPU e o tempo de atraso para desligar (em ms) ## Definir 2s de atraso para desligar a alimentação echo 2000 > /sys/kernel/debug/rknpu/delayms

Drivers GPU

Até março de 2023, a Orange Pi 5 estava atrasada com os drivers de GPU e só era possível usar GPU para decodificar vídeos 8K com sistemas wayland da comunidade chamados armbian.

No entanto, agora a imagem oficial de Ubuntu 22.04 da Orange Pi 5 já vem com drivers de GPU integrados.

Comparado com os sistemas oficiais Ubuntu/Debian fornecidos por armbian, orangepi5/rock5 a armbian tem um ambiente mais de código aberto e ativo, com atualizações de drivers ARM mais rápidas e experiência consistente em várias placas ARM.

Documentos relacionados aos drivers de GPU armbian:

https://github.com/ryan4yin/knowledge/tree/master/electrical-engineering/rk3588