Compilación de llama.cpp con HIP para GPUs AMD (ROCm)


Introducción

Este artículo documenta el proceso de compilación de llama.cpp con backend HIP para utilizar aceleración por GPU en hardware AMD, dentro del stack de inferencia local de modelos LLM. La integración se realiza sobre ROCm, interactuando directamente con la GPU mediante HIP y, opcionalmente, rocWMMA para optimizar Flash Attention en arquitecturas modernas.

El caso documentado corresponde a un sistema Fedora 43, con Ryzen 9 5900X y una GPU RDNA3 (gfx1100). El enfoque es extrapolable a otras GPUs AMD compatibles, pero las decisiones y validaciones están hechas específicamente sobre este entorno.


Enfoque general / Arquitectura

El flujo seguido es intencionadamente directo:

No se emplean contenedores ni capas intermedias. Se prioriza control total del toolchain, visibilidad de errores y reproducibilidad en el sistema base Fedora.


Requisitos previos


Desarrollo

Clonado del repositorio

Se parte siempre del repositorio oficial de llama.cpp, evitando forks o parches externos que puedan introducir comportamientos no controlados.

Compilación con HIP habilitado

La compilación se realiza indicando explícitamente:

HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -R)" \
cmake -S . -B build \
  -DGGML_HIP=ON \
  -DGGML_HIP_ROCWMMA_FATTN=ON \
  -DGPU_TARGETS=gfx1100 \
  -DCMAKE_BUILD_TYPE=Release \
&& cmake --build build --config Release -- -j 24

Decisiones técnicas relevantes


Uso del binario resultante

Tras la compilación, los binarios quedan disponibles en:

build/bin/

La ayuda completa puede consultarse con:

./build/bin/llama-cli -h

Ejemplo mínimo de ejecución con llama-cli:

./build/bin/llama-cli \
  -m /ruta/a/tu/modelo.gguf \
  -p "Building a website can be done in 10 steps:"

La ruta del modelo depende del layout local de almacenamiento y no forma parte de esta documentación.


Ejecución como servicio con llama-server

Además del modo CLI, llama.cpp incluye llama-server, pensado para ejecutar inferencia persistente mediante una API HTTP (compatible con clientes tipo OpenAI).

Este modo es el habitual cuando se quiere:

Ejemplo básico y genérico, válido para pruebas iniciales en GPU AMD con HIP:

./build/bin/llama-server \
  -m /ruta/a/tu/modelo.gguf \
  -ngl 99 \
  -c 4096 \
  --host 127.0.0.1 \
  --port 5000

Notas sobre los parámetros usados:

Este ejemplo evita opciones avanzadas (quantización de KV, Flash Attention explícito, buffers personalizados, plantillas de chat, etc.) para mantener un baseline claro y portable.


Aceleración adicional con rocWMMA

En arquitecturas RDNA3+ o CDNA, rocWMMA permite acelerar de forma significativa las operaciones de Flash Attention.

En escenarios no estándar, es posible añadir manualmente el include path:

-DCMAKE_CXX_FLAGS="-I<ruta>/rocwmma/library/include/"

Problemas detectados y resolución

Error: ROCm device library no encontrada

Error típico durante la compilación:

clang: error: cannot find ROCm device library;

Resolución aplicada:

  1. Localizar dentro de HIP_PATH un directorio que contenga el archivo:

    oclc_abi_version_400.bc
    
  2. Definir la variable HIP_DEVICE_LIB_PATH apuntando a dicho directorio:

HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -p)" \
HIP_DEVICE_LIB_PATH=<directorio_encontrado> \
cmake -S . -B build \
  -DGGML_HIP=ON \
  -DGPU_TARGETS=gfx1030 \
  -DCMAKE_BUILD_TYPE=Release \
&& cmake --build build -- -j 16

Arquitecturas GPU y detección

La arquitectura activa puede identificarse con:

rocminfo | grep gfx | head -1

Ejemplos habituales:

Si la GPU no está oficialmente soportada:


Variables de entorno relevantes


Resumen breve


Notas personales

HIP no es inmediato ni indulgente, pero una vez alineado el toolchain en Fedora, el resultado es estable y consistente. Para inferencia local seria en hardware AMD, ROCm sigue siendo el camino más realista pese a sus fricciones.


Referencias


Revision #1
Created 2025-12-12 11:19:16 UTC by Juan Francisco
Updated 2025-12-12 11:25:23 UTC by Juan Francisco