llama.cpp es una biblioteca de software de código abierto escrita principalmente en C++ que realiza inferencia en varios Modelos de Lenguaje Grandes (LLMs), como Llama. Su objetivo principal es proporcionar un rendimiento de vanguardia para la inferencia de LLM en una amplia gama de hardware con una configuración mínima. Además, hay enlaces de Python disponibles para esta biblioteca, que ofrecen una API de alto nivel para la finalización de texto y un servidor web compatible con OpenAI.
El objetivo principal de llama.cpp es habilitar la inferencia de LLM con una configuración mínima y un rendimiento de vanguardia en una amplia variedad de hardware, tanto localmente como en la nube.
- Implementación en C/C++ sin dependencias
- Apple silicon es un ciudadano de primera clase - optimizado a través de ARM NEON, Accelerate y Metal frameworks
- Soporte para AVX, AVX2 y AVX512 para arquitecturas x86
- Cuantización de enteros de 1.5-bit, 2-bit, 3-bit, 4-bit, 5-bit, 6-bit y 8-bit para una inferencia más rápida y un uso reducido de memoria
- Kernels CUDA personalizados para ejecutar LLMs en GPUs NVIDIA (soporte para GPUs AMD a través de HIP)
- Soporte para backend de Vulkan y SYCL
- Inferencia híbrida CPU+GPU para acelerar parcialmente modelos más grandes que la capacidad total de VRAM
El modelo Phi-3.5-Instruct se puede cuantificar usando llama.cpp, pero Phi-3.5-Vision y Phi-3.5-MoE aún no son compatibles. El formato convertido por llama.cpp es gguf, que también es el formato de cuantificación más utilizado.
Hay una gran cantidad de modelos en formato GGUF cuantificados en Hugging face. AI Foundry, Ollama y LlamaEdge dependen de llama.cpp, por lo que los modelos GGUF también se utilizan con frecuencia.
GGUF es un formato binario que está optimizado para la carga y el guardado rápido de modelos, lo que lo hace altamente eficiente para fines de inferencia. GGUF está diseñado para su uso con GGML y otros ejecutores. GGUF fue desarrollado por @ggerganov, quien también es el desarrollador de llama.cpp, un popular marco de inferencia LLM en C/C++. Los modelos desarrollados inicialmente en frameworks como PyTorch pueden convertirse al formato GGUF para su uso con esos motores.
ONNX es un formato tradicional de aprendizaje automático/aprendizaje profundo, que está bien soportado en diferentes Frameworks de IA y tiene buenos escenarios de uso en dispositivos edge. En cuanto a GGUF, está basado en llama.cpp y se puede decir que se produjo en la era de GenAI. Los dos tienen usos similares. Si deseas un mejor rendimiento en hardware embebido y capas de aplicación, ONNX puede ser tu elección. Si usas el framework derivado y la tecnología de llama.cpp, entonces GGUF puede ser mejor.
1. Configuración del Entorno
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
make -j8
2. Cuantificación
Usando llama.cpp convierte Phi-3.5-Instruct a FP16 GGUF
./convert_hf_to_gguf.py <Your Phi-3.5-Instruct Location> --outfile phi-3.5-128k-mini_fp16.gguf
Cuantificando Phi-3.5 a INT4
./llama.cpp/llama-quantize <Your phi-3.5-128k-mini_fp16.gguf location> ./gguf/phi-3.5-128k-mini_Q4_K_M.gguf Q4_K_M
3. Pruebas
Instalar llama-cpp-python
pip install llama-cpp-python -U
Nota
Si usas Apple Silicon, por favor instala llama-cpp-python así
CMAKE_ARGS="-DLLAMA_METAL=on" pip install llama-cpp-python -U
Pruebas
llama.cpp/llama-cli --model <Your phi-3.5-128k-mini_Q4_K_M.gguf location> --prompt "<|user|>\nCan you introduce .NET<|end|>\n<|assistant|>\n" --gpu-layers 10
-
Aprende más sobre llama.cpp https://onnxruntime.ai/docs/genai/
-
Aprende más sobre GGUF https://huggingface.co/docs/hub/en/gguf
Descargo de responsabilidad: Este documento ha sido traducido utilizando servicios de traducción automática basados en inteligencia artificial. Aunque nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda la traducción humana profesional. No nos hacemos responsables de cualquier malentendido o interpretación errónea que surja del uso de esta traducción.