Inferencia de modelos LLM en Orange Pi 5 Plus (en local) y conversión a RKLLM para correr sobre NPU

Como realizar la prueba de inferencia de modelos LLM en la Orange Pi 5 Plus y como convertir modelos en formato Hugging Face a modelos RKLLM para utilizar la NPU de 6 TOPS que incorpora la placa.

INTELIGENCIA ARTIFICIAL

Biblioman

3/4/20255 min leer

Introducción

La forma mas fácil de hacer la prueba de inferencia de un modelo de IA LLM (Modelo Extenso de Lenguaje) en cualquier PC o placa de desarrollo embebido como la Orange Pi 5 Plus es utilizar Ollama que es un framework diseñado para facilitar la implementación y el uso de modelos de inteligencia artificial, especialmente en el ámbito del procesamiento del lenguaje natural, se podría decir que es como un Docker para IAs. Pero como veremos en el siguiente vídeo aún utilizando modelos con un número pequeño de parámetros no tienen un rendimiento optimo en la Orange Pi 5 Plus debido a las exigencias hardware que requieren. Podemos ir un paso mas allá y convertir los módelos al formato RKLLM y poder utilizar la NPU de 6 TOPS que incorpora la Orange Pi 5 Plus. En estos apuntes se describe como realizar el proceso de las dos formas y la diferencia en rendimiento que hay entre ellas.

Test de inferencia utilizando Ollama
  • Instalación: instalamos Ollama simplemente ejecutando el siguiente comando en una terminal de la Orange Pi 5 Plus.

curl -fsSL https://ollama.com/install.sh | sh

  • Descarga y ejecución del modelo: desde la página de Ollama seleccionamos la pestaña Models por ejemplo el modelo deepseek-r1 de 7 billones de parámetros, copiamos y pegamos en una terminal el siguiente comando. Si el modelo no se había descargado previamente lo hará y se ejecutará.

ollama run deepseek-r1:7b

En el siguiente vídeo tenéis los resultados obtenidos:

  • Desinstalación:

Remover el servicio de ollama:

sudo systemctl stop ollama

sudo systemctl disable ollama

sudo rm /etc/systemd/system/ollama.service

Remover el binario de ollama desde el directorio bin (/usr/local/bin, /usr/bin, or /bin):

sudo rm $(which ollama)

Remover los modelos descargados, usuario y grupo creado por Ollama:

sudo rm -r /usr/share/ollama

sudo groupdel ollama

sudo userdel ollama

Remover las librerías instaladas:

sudo rm -rf /usr/local/lib/ollama

Modelos RKLLM para procesadores Rockchip

La pila de software RKLLM puede ayudarnos a implementar rápidamente modelos LLM de IA en chips Rockchip, al igual que hicimos con RKNN para las redes neuronales convolucionales en la detección y clasificación de objetos, tenéis un ejemplo aquí. Un diagrama de bloques general es el siguiente:

Material necesario:

  • Una Orange Pi 5 Plus con Ubuntu 22.04 con controlador 0.9.6+ se puede utilizar el siguiente comando para comprobarlo:

sudo cat /sys/kernel/debug/rknpu/version

RKNPU driver: v0.9.6

  • Un PC con arquitectura x86/64 bits con Ubuntu 22.04 instalado versión de Python 3.10.12 para ejecutar el compilador cruzado y el SDK de Rockchip, se puede comprobar la versión de Python con el siguiente comando:

python --version

Nota: si utilizamos otra versión de Ubuntu tenemos que tener en cuenta que la versión de Python tiene ser la 3.10 o 3.8 si no podemos utilizar Conda para crear un nuevo entorno virtual.

Pasos a realizar en el PC x86/64

A) Instalación del entorno de desarrollo RKLLM:

  1. Descargamos el SDK con:

    git clone https://github.com/airockchip/rknn-llm.git -b release-v1.1.4

  2. Abrimos una terminal en la carpeta rkllm y con el comando pip instalamos el paquete whl:

    cd rknn-llm

    pip3 install rkllm-toolkit/packages/rkllm_toolkit-1.1.4-cp310-cp310-linux_x86_64.whl

  3. Si no hay errores al ejecutar el siguiente comando indica que todo se ha instalado correctamente:

    python3

    >>> from rkllm.api import RKLLM

B) Compilar código de prueba:

  1. Abrimos una terminal en la carpeta rkllm instalamos cmake, descargamos la cadena de herramientas de compilación cruzada y la descomprimimos:

    sudo apt install cmake

    wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz

    tar -zxf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz

    Dentro de la carpeta rknn-llm debemos de tener la siguiente estructura de directorios:

  1. Editamos el archivo build-linux.sh que se encuentra en la ruta rknn-llm/examples/rkllm_api_demo

    nano rknn-llm/examples/rkllm_api_demo/build-linux.sh

    y en GCC_COMPILER_PATH ponemos la ruta completa al compilador cruzado, GCC_COMPILER_PATH=~/rknn-llm/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu

    según se muestra en la siguiente imagen:

  1. Compilamos el código de prueba utilizando el script build-linux.sh

    cd rknn-llm/examples/rkllm_api_demo

    bash build-linux.sh

  2. Por último visualizamos el ejecutable generado (llm_demo) en la carpeta ~/rknn-llm/examples/rkllm_api_demo/build/build_linux_aarch64_Release

C) Conversión de modelos:

RKLLM-Toolkit ofrece funciones de conversión y cuantificación de modelos. Permite a los usuarios convertir LLM en formato Hugging Face o GGUF en modelos RKLLM, lo que permite la implementación y ejecución del modelo en el procesador Rockchip utilizando la NPU de 6 TOPS que incorpora la Orange Pi 5 Plus. No todos los modelos son convertibles pero hay muchos que sí, en el manual de Orange Pi 5 Plus vienen varios ejemplos de conversión de modelos, el procedimiento es similar en todos.

Conversión del modelo Qwen1.5

  1. Instalamos las aplicaciones necesarias:

sudo apt update

sudo apt install curl git git-lfs

  1. Clonamos el modelo Qwen1.5

git clone https://huggingface.co/Qwen/Qwen1.5-0.5B

  1. Modificamos el archivo test.py que se encuentra en la ruta ~/rknn-llm/rkllm-toolkit/examples:

    1. En modelpath: ponemos la ruta absoluta al modelo.

    2. En llm.export_rkllm: Ponemos la ruta y el nombre del modelo que queramos que tenga al convertirse, ejemplo: ret = llm.export_rkllm("./Qwen1_5.rkllm")

      Tal y como se muestra en la siguiente figura:

  1. Creamos un archivo llamado 'data_quant.json' en la ruta: rknn-llm/rkllm-toolkit/examples/ el contenido del archivo puede ser el siguiente:

    [{"input": "Humano: ¡Hola!\nAsistente: ", "target": "¡Hola! ¡Soy el asistente de inteligencia artificial Qwen1.5!"}]

  2. Por último usamos Python3 para convertir el modelo:

    cd rknn-llm/rkllm-toolkit/examples

    python3 test.py

El modelo convertido a .rkllm aparecerá en la carpeta ~/rknn-llm/rkllm-toolkit/examples

Inferencia del modelo (en Orange Pi 5 Plus 16GB de RAM)
  1. Copiamos los siguientes archivos a la orange Pi 5 plus:

librkllmrt.so llm_demo model.rkllm

Y abrimos una terminal en la carpeta donde los hemos copiado.

  1. Le damos permisos de ejecución a los siguientes archivos:

chmod +x llm_demo

chmod +x librkllmrt.so

  1. Exportamos la librería (agregar el directorio actual a la lista de rutas donde el sistema buscará bibliotecas compartidas)

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)

  1. Ejecutamos el siguiente comando para limitar el número máximo de descriptores de archivos que se pueden abrir (hay que ejecutarlo cada vez que se abra una nueva terminal)

ulimit -HSn 102400

5. Ejecutamos el siguiente comando para iniciar el modelo:

./llm_demo ./model.rkllm 256 320

  1. Para comprobar el uso de NPU usada durante la respuesta del modelo ejecutamos:

watch sudo cat /sys/kernel/debug/rknpu/load

Aquí tenéis el vídeo con la prueba de inferencia: