Antes de empezar conoceremos como instalar el API de «Llama.cpp» y como compilar un ejemplo básico de LLM directamente en C tanto en Linux como en compilación cruzada Linux-Windows.
Todo el código de esta explicación al igual que ficheros auxiliares como «Makefile» se encuentran en GitHub de forma que se iran actualizando nuevos ejemplos «https://github.com/pinguytaz/IA/tree/main/Llama.cpp«
Instalación y Compilación Cruzada (Linux & Windows)
El primer reto es preparar el entorno. Queremos que nuestro código sea portable a windows por eso compilaremos llama.cpp también para windows, con libreria estaticas para así solo tener que llevar el ejecutable (.elf en linux y .exe en Windows) y los ficheros auxiliares como modelos o prompts.
Linux:
cmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Intel10_64ilp
cmake --build build --config Release -j
Windows: Cross-Compilation: mingw-w64-gcc
cmake -B build-windows -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DBUILD_SHARED_LIBS=OFF
cmake --build build-windows --config Release -j
Utilizamos un Makefile para la compilación, pero explicaremos los parámetros que nos permitirán saber el porque de cada uno.
******** Compilamos en Linux ********************
gcc -O2 -Wall -fopenmp -I./llama.cpp/include -I./llama.cpp/ggml/include -I./llama.cpp/common ./src/Base/Base.c -L./llama.cpp/build/src -L./llama.cpp/build/ggml/src -L./llama.cpp/build/ggml/src/ggml-blas -L./llama.cpp/build/common -lllama -lggml -lggml-base -lggml-cpu -lggml-blas -lopenblas -lpthread -lm -lstdc++ -ldl -o ./bin/Base.elf
******** Compilamos en Windows ********************
x86_64-w64-mingw32-gcc -O2 -Wall -fopenmp -static -I./llama.cpp/include -I./llama.cpp/ggml/include -I./llama.cpp/common ./src/Base/Base.c -L./llama.cpp/buildWindows/src -L./llama.cpp/buildWindows/ggml/src -L./llama.cpp/buildWindows/ggml/src/ggml-blas -L./llama.cpp/buildWindows/common -lllama -l:ggml.a -l:ggml-base.a -l:ggml-cpu.a -lpthread -lm -lstdc++ -o ./bin/Base.exe
- Compilador: gcc para Linux y x86_64-w64-mingw32-gcc para la compilación cruzada de windows.
- -O2: Aplicamos una optimización de nivel 2.
- -Wall: Activa la mayoría de los avisos útiles.
- -fopenmp: Activa OpenMP, por si el código o alguna librería usa paralelismo.
- -static (para la compilación estática en Windows) obliga a GCC a meter todas las librerías dentro del .exe.
- -I Añade los directorios include
- -L Directorio librerías para el enlazado .a (Estaticas) .so(dinamicas)
- -o Nombre del ejecutable
- Librerías
- Llama
- -lllama Enlaza con libllama
- -lggml -lggml-base -lggml-cpu -lggml-blas Enlaza con las librerias: libggml, base, backend CPU, backend BLAS.
- Librerías del sistema
- -lopenblas Enlaza con OpenBLAS
- -lpthread Soporte de Thread POSIX
- -lm Liberia matemática
- -ldl Carga dinámica Simbolos de Linux, esta no la pondremos en la compilación windows.
- -lstdc++ Biblioteca estandard C++ ya que llama.cpp/ggml esta en C++.
- Llama
Continuaremos en el próximo con la explicación ya directamente del código, del ejemplo Base, que realiza una sencilla inferencia.
