Acelerando la inferencia de los Transformers con ctransformers
Published on
Introducción
En los últimos años, los modelos de lenguaje basados en Transformers han revolucionado el procesamiento del lenguaje natural, permitiendo avances en tareas como la generación de lenguaje, la respuesta a preguntas y la clasificación de texto. Sin embargo, estos modelos a menudo son extremadamente grandes, con miles de millones e incluso billones de parámetros, lo que los hace computacionalmente costosos de ejecutar, especialmente en la CPU.
ctransformers es una biblioteca de Python que tiene como objetivo hacer que la implementación de estos grandes modelos de lenguaje sea más eficiente y accesible. Proporciona enlaces de Python para modelos Transformer implementados en código C/C++ optimizado, aprovechando técnicas como la cuantización y el uso de instrucciones AVX para acelerar significativamente la inferencia en el hardware de la CPU.
Con ctransformers, es posible cargar y ejecutar modelos como GPT-2, GPT-J, GPT-NeoX, Llama y más con solo unas pocas líneas de código en Python. La biblioteca ofrece una interfaz simple y unificada para varios modelos, integración con Hugging Face Hub y el marco de trabajo LangChain, y acceso a API de bajo nivel para un control más preciso.
¿Qué es ctransformers?
Bajo el capó, ctransformers utiliza la biblioteca GGML, que es una biblioteca de tensores enfocada en la ejecución de modelos de ML en la CPU. GGML proporciona implementaciones eficientes de operaciones comunes como la multiplicación de matrices, especialmente para tipos de datos cuantizados. Al combinar GGML con núcleos optimizados específicos del modelo, ctransformers logra un rendimiento impresionante.
Una de las aplicaciones más emocionantes de ctransformers es la capacidad de ejecutar modelos de código abierto grandes como Llama 2 en hardware de consumo. Esto abre posibilidades para la implementación rentable y respetuosa con el medio ambiente de grandes modelos de lenguaje, lo que los hace más accesibles a una mayor variedad de usuarios y aplicaciones.
En este artículo, profundizaremos en los detalles técnicos de ctransformers, explorando sus características, características de rendimiento y API. Recorreremos ejemplos de código que muestran cómo cargar modelos, generar texto e integrarlos con LangChain. Por último, discutiremos las implicaciones y el potencial de la inferencia eficiente en la CPU para el futuro del procesamiento del lenguaje natural y la inteligencia artificial.
Algunas características clave de ctransformers:
- Interfaz unificada para cargar y ejecutar varios modelos
- Soporte para ejecutar modelos desde Hugging Face Hub
- Integración con el marco de trabajo LangChain
- Acceso a la API de C de bajo nivel para un mayor control
- Inferencia en la CPU optimizada utilizando instrucciones AVX
Instalación de ctransformers
Para instalar ctransformers, simplemente usa pip:
pip install ctransformers
Para admitir la GPU, instala con la variable de entorno CT_CUBLAS
configurada:
CT_CUBLAS=1 pip install ctransformers --no-binary ctransformers
Uso básico de ctransformers
La clase principal para cargar y ejecutar modelos es AutoModelForCausalLM
. Así es como se carga un modelo:
from ctransformers import AutoModelForCausalLM
# Cargando desde un archivo local
llm = AutoModelForCausalLM.from_pretrained('ruta/al/modelo-ggml.bin', model_type='gpt2')
# Cargando desde Hugging Face Hub
llm = AutoModelForCausalLM.from_pretrained('marella/gpt-2-ggml')
El argumento model_type
especifica el tipo de modelo que se está cargando. Las opciones incluyen gpt2
, gptj
, gpt_neox
, dolly-v2
, starcoder
, etc.
Para generar texto, simplemente llama al modelo:
output = llm("AI is going to")
print(output)
Para tener un control más preciso, hay una interfaz de generador:
tokens = llm.tokenize("AI is going to")
for token in llm.generate(tokens):
print(llm.detokenize(token))
Integración de LangChain con ctransformers
ctransformers proporciona un envoltorio para usar modelos con el marco de trabajo LangChain:
from ctransformers.langchain import CTransformers
llm = CTransformers(model='marella/gpt-2-ggml')
# Usar con primitivas de LangChain
from langchain import PromptTemplate, LLMChain
template = """Pregunta: {question}
Respuesta:"""
prompt = PromptTemplate(template=template, input_variables=['question'])
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = "¿Qué es la inteligencia artificial?"
print(llm_chain.run(question))
Ejecución de modelos Llama
ctransformers puede ejecutar los modelos Llama de código abierto en formato GGML. Aquí tienes un ejemplo utilizando el modelo Llama 2:
from ctransformers import AutoModelForCausalLM
model_id = "TheBloke/Llama-2-7B-GGML"
config = {
'max_new_tokens': 256,
'repetition_penalty': 1.1,
'temperature': 0.1
}
llm = AutoModelForCausalLM.from_pretrained(
model_id,
model_type="llama",
config=config
)
prompt = "Escribe un poema para ayudarme a recordar los primeros 10 elementos de la tabla periódica"
output = llm(prompt)
print(output)
Esto carga el modelo Llama 2 de 7B parámetros convertido al formato GGML y genera un poema a partir del texto proporcionado.
El diccionario config
permite especificar diversos parámetros de generación, como el número máximo de tokens, la penalización por repetición, la temperatura, etc.
Conclusión
ctransformers proporciona una forma fácil y eficiente de ejecutar grandes modelos de lenguaje en la CPU mediante implementaciones optimizadas en C/C++. Con una API simple en Python, integración con Hugging Face Hub y LangChain, y soporte para una variedad de modelos, es una herramienta poderosa para construir aplicaciones basadas en Transformers. La capacidad de ejecutar modelos como Llama 2 en la CPU con un rendimiento razonable abre nuevas posibilidades para la implementación rentable y respetuosa con el medio ambiente de modelos de lenguaje grandes. Conforme el ecosistema de modelos Transformador de código abierto sigue creciendo, bibliotecas como ctransformers jugarán un papel importante en hacerlos accesibles y prácticos de usar.