11 puntos por GN⁺ 2024-02-24 | 1 comentarios | Compartir por WhatsApp
  • Motor de inferencia C++ ligero e independiente para los modelos Gemma
  • ¿Para quién es este proyecto?
    • Los motores modernos de inferencia para modelos de lenguaje grandes (LLM) son sistemas complejos con capacidades personalizadas que van más allá de los runtimes tradicionales de redes neuronales
    • Existen oportunidades de investigación e innovación mediante el codiseño de algoritmos de alto nivel y cómputo de bajo nivel, pero hay una brecha entre los runtimes de inferencia en C++ que no fueron diseñados para experimentación y los frameworks de investigación de ML centrados en Python que abstraen el cómputo de bajo nivel
    • gemma.cpp ofrece una implementación mínima de los modelos Gemma 2B y 7B, con énfasis en la simplicidad y la claridad directa por encima de la generalidad
    • gemma.cpp está orientado a casos de experimentación e investigación, puede integrarse fácilmente en otros proyectos con dependencias mínimas y es fácil de modificar, con unas 2K LoC de implementación central y 4K LoC de utilidades de soporte
    • Aprovecha el SIMD portable de Google Highway Library para inferencia en CPU
    • Para despliegues en producción, se recomienda la ruta de despliegue estándar usando frameworks de Python como JAX, Keras, PyTorch y Transformers

Inicio rápido

Requisitos del sistema

  • Antes de comenzar, debes tener instalados CMake, el compilador Clang de C++ (con soporte para C++17 o superior) y tar para extraer el archivo desde Kaggle

Paso 1: Obtener los pesos del modelo y el tokenizador desde Kaggle

  • Visita la página del modelo Gemma en Kaggle y selecciona Model Variations |> Gemma C++
  • El menú desplegable Variation incluye opciones de pesos bfloat16 (mayor fidelidad) y pesos de punto flotante convertidos a 8 bits (inferencia más rápida)
  • En general, se recomienda comenzar con el checkpoint -sfp

Paso 2: Extraer los archivos

  • Después de completar el acuerdo, descarga y extrae el archivo archive.tar.gz
  • Los archivos extraídos incluyen los pesos del modelo (por ejemplo, 2b-it-sfp.sbs) y el archivo del tokenizador (tokenizer.spm)
  • Puedes mover estos archivos a una ubicación de directorio conveniente (por ejemplo, el directorio build/ de este repositorio)

Paso 3: Compilar

  • El sistema de compilación usa CMake
  • Para compilar el runtime de inferencia de gemma, crea un directorio de compilación y usa cmake desde el directorio raíz del proyecto para generar los archivos de compilación
  • En el caso de los pesos de punto flotante convertidos a 8 bits (sfp), ejecuta cmake sin opciones
  • Si descargaste pesos bfloat16, en lugar de ejecutar cmake sin opciones como arriba, ejecútalo configurando WEIGHT_TYPE con el tipo hwy::bfloat16_t de highway
  • Después de ejecutar el comando cmake correspondiente, entra al directorio build/ y ejecuta make para compilar el ejecutable ./gemma

Paso 4: Ejecutar

  • Puedes ejecutar gemma dentro del directorio build/
  • gemma requiere argumentos obligatorios y, por ejemplo, puede ejecutarse usando el archivo de pesos 2b-it-sfp.sbs y el archivo de tokenizador tokenizer.spm

Uso

  • gemma tiene varios modos de uso controlados por la bandera de verbosidad
  • Actualmente, todos los modos de uso son interactivos y la generación de texto se activa al ingresar una nueva línea

Aplicación interactiva de terminal

  • De forma predeterminada, la verbosidad está configurada en 1, y al invocar gemma se proporciona una interfaz interactiva basada en terminal

Uso como herramienta de línea de comandos

  • Para usar el ejecutable gemma como herramienta de línea de comandos, puede ser útil crear un alias con todos los argumentos para gemma.cpp completamente especificados

Incluir la biblioteca gemma.cpp en tu proyecto

  • La manera más fácil de incluir gemma.cpp en tu propio proyecto es usar FetchContent para traer gemma.cpp y sus dependencias
  • Puedes agregar lo siguiente a tu CMakeLists.txt

Compilar gemma.cpp como biblioteca

  • gemma.cpp puede usarse como dependencia de biblioteca en tu propio proyecto, y puedes generar un artefacto de biblioteca compartida compilando el objetivo libgemma

Agradecimientos y contacto

  • gemma.cpp fue iniciado en otoño de 2023 por Austin Huang y Jan Wassenberg, y se lanzó en febrero de 2024 con contribuciones de Phil Culliton, Paul Chang y Dan Zheng
  • Este no es un producto de Google con soporte oficial.

Opinión de GN⁺:

  1. gemma.cpp es una herramienta útil para experimentar e investigar con modelos de lenguaje grandes, y al ofrecer un motor de inferencia ligero basado en C++ ayuda a cerrar la brecha con los frameworks existentes centrados en Python
  2. Este proyecto brinda una oportunidad para contribuir a la comunidad de código abierto y subraya la importancia de seguir las directrices de código abierto de Google
  3. gemma.cpp está diseñado para ofrecer varios modos de uso de modo que desarrolladores e investigadores puedan integrarlo y usarlo fácilmente en sus propios proyectos, lo que tiene el potencial de impulsar la innovación en los campos de IA y ML

1 comentarios

 
GN⁺ 2024-02-24
Opiniones en Hacker News
  • Resumen de comentarios de Hacker News:
    • Presentación de Austin y explicación del proyecto:

      • Austin es coautor del proyecto y dice que responderá preguntas.
      • gemma.cpp es independiente de llama.cpp/ggml, aunque se inspiró en el proyecto llama.cpp.
      • gemma.cpp es una implementación directa de Gemma, centrada en la experimentación, la investigación, la portabilidad y la facilidad de modificación.
      • La implementación inicial está enfocada en CPU SIMD, y están explorando opciones para soporte de GPU.
      • Las preguntas sobre el modelo Gemma en sí las responderá otro colega, ya que esta es una implementación en C++, pero relativamente independiente del proceso de entrenamiento del modelo.
      • Fue desarrollado por un pequeño equipo de Google y esperan que a otros les resulte útil.
      • Comparten un enlace a un hilo de Twitter sobre el proyecto.
    • Opiniones sobre la competitividad de Google en LLM:

      • Aunque hay críticas de que Google va detrás de OpenAI en productos comerciales, en el campo de los LLM es muy competente.
      • Hay quien opina que, cuando Google se pone en marcha, puede lograr resultados impresionantes.
      • Se espera que la competencia open source continúe gracias a Facebook y Llama, y que se recuerde que, aunque OpenAI se ha alejado de su misión original, su visión inicial sigue siendo importante.
    • Pregunta sobre el sistema de compilación:

      • Un comentario pregunta por qué Google no usó bazel como sistema de compilación.
    • Elogios al rendimiento de Gemma:

      • Gemma fue agregado al leaderboard de HHEM y está mostrando una baja tasa de alucinaciones entre los modelos pequeños.
    • Asombro por la velocidad de evolución del ecosistema open source de LLM:

      • Se comenta que el ecosistema open source de LLM está avanzando muy rápido, con información y código nuevos apareciendo constantemente.
    • Pregunta sobre formatos de modelo:

      • Un comentario pide una explicación de las diferencias entre varios formatos de modelo como GGUF y GGML, y de cómo se gestionan.
    • Debate sobre la capacidad matemática de los LLM:

      • Se explica que los LLM no resuelven bien problemas de matemáticas, y se debate por qué ChatGPT parece hacerlo bien.
      • También se pregunta si los proyectos de LLM soportan modelos de plugins y si es posible aplicar un enfoque de plugins a un sistema desarrollado con llama.cpp.
    • Pregunta sobre si Gemma tiene restricciones de contenido:

      • Un comentario pregunta si Gemma incorpora restricciones de contenido como Gemini, o si eso es una característica de la aplicación Gemini.
    • Agradecimiento por gemma.cpp y expectativa por futuras funciones:

      • Se agradece el repositorio de gemma.cpp y se menciona que se desarrolló un wrapper de Python.
      • Ese wrapper de Python fue creado para poder usar fácilmente cada nueva tecnología que actualice el equipo de gemma.cpp.
    • Pregunta sobre el tamaño del ejecutable del modelo Gemma:

      • Un comentario pregunta qué tan grande sería el ejecutable final si el modelo Gemma se construyera con una interfaz mínima de línea de comandos y se convirtiera en un binario independiente ejecutable sin conexión.