Pular para o conteúdo principal
InicioTutoriaisInteligência Artificial (IA)

Llama.cpp Tutorial: Um guia completo para inferência e implementação eficientes de LLM

Este guia abrangente sobre o Llama.cpp o guiará pelos fundamentos da configuração do seu ambiente de desenvolvimento, compreendendo suas principais funcionalidades e aproveitando seus recursos para resolver casos de uso reais.
abr. de 2024  · 11 min leer

Os modelos de linguagem grande (LLMs) estão revolucionando vários setores. De chatbots de atendimento ao cliente a sofisticadas ferramentas de análise de dados, os recursos dessa poderosa tecnologia estão remodelando o cenário da interação e automação digital.

No entanto, as aplicações práticas dos LLMs podem ser limitadas pela necessidade de computação de alta potência ou pela necessidade de tempos de resposta rápidos. Em geral, esses modelos exigem hardware sofisticado e dependências extensas, o que pode dificultar sua adoção em ambientes mais restritos.

É nesse ponto que o LLaMa.cpp (ou LLaMa C++) vem em socorro, oferecendo uma alternativa mais leve e portátil às estruturas mais pesadas.

Logotipo Llama.cpp

Logotipo Llama.cpp(fonte)

O que é Llama.cpp?

O LLaMa.cpp foi desenvolvido por Georgi Gerganov. Ele implementa a arquitetura LLaMa do Meta em C/C++ eficiente e é uma das comunidades de código aberto mais dinâmicas em torno da inferência LLM, com mais de 390 colaboradores, mais de 43.000 estrelas no repositório oficial do GitHub e mais de 930 versões.

Algumas das principais vantagens de usar o LLama.cpp para inferência LLM

Algumas das principais vantagens de usar o LLama.cpp para inferência LLM

  • Compatibilidade universal: O design do Llama.cpp como uma biblioteca C++ que prioriza a CPU significa menos complexidade e integração perfeita em outros ambientes de programação. Essa ampla compatibilidade acelerou sua adoção em várias plataformas.

  • Integração abrangente de recursos: Atuando como um repositório de recursos críticos de baixo nível, o Llama.cpp espelha a abordagem da LangChain para recursos de alto nível, simplificando o processo de desenvolvimento, embora com possíveis desafios futuros de escalabilidade.

  • Otimização focada: O Llama.cpp se concentra em uma arquitetura de modelo único, permitindo aprimoramentos precisos e eficazes. Seu compromisso com os modelos Llama por meio de formatos como GGML e GGUF levou a ganhos substanciais de eficiência.

Com esse entendimento do Llama.cpp, as próximas seções deste tutorial percorrem o processo de implementação de um caso de uso de geração de texto. Começamos explorando os fundamentos do LLama.cpp, compreendendo o fluxo de trabalho geral de ponta a ponta do projeto em questão e analisando algumas de suas aplicações em diferentes setores.

Llama.cpp Architecture

A espinha dorsal do Llama.cpp são os modelos originais do Llama, que também se baseiam na arquitetura do transformador. Os autores do Llama aproveitam vários aprimoramentos que foram propostos posteriormente e usaram modelos diferentes, como o PaLM.

Diferença entre Transformers e arquitetura Llama (arquitetura Llama por Umar Jamil)

Diferença entre Transformers e arquitetura Llama (arquitetura Llama por Umar Jamil)

A principal diferença entre a arquitetura LLaMa e a dos transformadores:

  • Pré-normalização (GPT3): usada para melhorar a estabilidade do treinamento, normalizando a entrada de cada subcamada do transformador usando a abordagem RMSNorm, em vez de normalizar a saída.
  • Função de ativação SwigGLU (PaLM): a função de ativação ReLU de não linearidade original é substituída pela função de ativação SwiGLU, o que leva a melhorias no desempenho.
  • Embeddings rotativos (GPTNeao): os embeddings posicionais rotativos (RoPE) foram adicionados em cada camada da rede após a remoção dos embeddings posicionais absolutos.

Configuração do ambiente

Os pré-requisitos para começar a trabalhar com o LLama.cpp incluem:

  • PythonPara poder executar o pip, que é o gerenciador de pacotes Python
  • Llama-cpp-python: a ligação Python para llama.cpp

Criar o ambiente virtual

Recomenda-se criar um ambiente virtual para evitar qualquer problema relacionado ao processo de instalação, e o conda pode ser um bom candidato para a criação do ambiente.

Todos os comandos desta seção são executados em um terminal. Usando a instrução conda create, criamos um ambiente virtual chamado llama-cpp-env.

conda create --name llama-cpp-env

Após a criação bem-sucedida do ambiente virtual, ativamos o ambiente virtual acima usando a instrução conda activate, como segue:

conda activate llama-cpp-env

A instrução acima deve exibir o nome da variável de ambiente entre colchetes no início do terminal, como segue:

Nome do ambiente virtual após a ativação

Nome do ambiente virtual após a ativação

Agora, podemos instalar o pacote Llama-cpp-python da seguinte forma:

pip install llama-cpp-python
or
pip install llama-cpp-python==0.1.48

A execução bem-sucedida do site llama_cpp_script.py significa que a biblioteca está instalada corretamente.

Para garantir que a instalação seja bem-sucedida, vamos criar e adicionar o comando import e, em seguida, executar o script.

  • Primeiro, adicione o endereço from llama_cpp import Llama ao arquivo llama_cpp_script.py e, em seguida
  • Execute o python llama_cpp_script.py para executar o arquivo. Se a biblioteca não for importada, será gerado um erro; portanto, será necessário um diagnóstico adicional para o processo de instalação.

Entenda os conceitos básicos do Llama.cpp

Nesta etapa, o processo de instalação deve ter sido bem-sucedido, e vamos nos aprofundar na compreensão dos conceitos básicos do LLama.cpp.

A classe Llama importada acima é o principal construtor utilizado ao usar o Llama.cpp e recebe vários parâmetros, não se limitando aos que estão abaixo. A lista completa de parâmetros é fornecida na documentação oficial:

  • model_path: O caminho para o arquivo do modelo Llama que está sendo usado
  • pronto: O prompt de entrada para o modelo. Esse texto é tokenizado e passado para o modelo.
  • dispositivo: O dispositivo a ser usado para executar o modelo Llama; esse dispositivo pode ser CPU ou GPU.
  • max_tokens: O número máximo de tokens a serem gerados na resposta do modelo
  • stop: Uma lista de cadeias de caracteres que farão com que o processo de geração de modelos seja interrompido
  • temperatura: Esse valor varia entre 0 e 1. Quanto mais baixo for o valor, mais determinístico será o resultado final. Por outro lado, um valor mais alto leva a mais aleatoriedade e, portanto, a um resultado mais diversificado e criativo.
  • top_p: É usado para controlar a diversidade das previsões, o que significa que ele seleciona os tokens mais prováveis cuja probabilidade cumulativa excede um determinado limite. A partir de zero, um valor mais alto aumenta a chance de encontrar um resultado melhor, mas exige cálculos adicionais.
  • eco: Um booleano usado para determinar se o modelo inclui o prompt original no início (True) ou não o inclui (False)

Por exemplo, se quisermos usar um modelo de linguagem grande chamado <MY_AWESOME_MODEL> armazenado no diretório de trabalho atual, o processo de instanciação será semelhante a este:

# Instanciate the model
my_aweseome_llama_model = Llama(model_path="./MY_AWESOME_MODEL")


prompt = "This is a prompt"
max_tokens = 100
temperature = 0.3
top_p = 0.1
echo = True
stop = ["Q", "\n"]


# Define the parameters
model_output = my_aweseome_llama_model(
       prompt,
       max_tokens=max_tokens,
       temperature=temperature,
       top_p=top_p,
       echo=echo,
       stop=stop,
   )
final_result = model_output["choices"][0]["text"].strip()

O código é autoexplicativo e pode ser facilmente compreendido a partir dos pontos iniciais que indicam o significado de cada parâmetro.

O resultado do modelo é um dicionário que contém a resposta gerada junto com alguns metadados adicionais. O formato da saída é explorado nas próximas seções do artigo.

Seu primeiro projeto Llama.cpp

Agora, é hora de começar a implementação do projeto de geração de texto. Iniciar um novo projeto Llama.cpp nada mais é do que seguir o modelo de código python acima, que explica todas as etapas, desde o carregamento do modelo de linguagem grande de interesse até a geração da resposta final.

O projeto utiliza a versão GGUF do Zephyr-7B-Beta da Hugging Face. É uma versão ajustada do mistralai/Mistral-7B-v0.1 que foi treinada em uma mistura de conjuntos de dados sintéticos disponíveis publicamente usando a otimização de preferência direta (DPO).

Nossa Introdução ao uso de Transformers e Hugging Face oferece uma melhor compreensão dos Transformers e de como aproveitar seu poder para resolver problemas da vida real. Também temos um tutorial do Mistral 7B.

Modelo Zephyr da Hugging Face

Modelo Zephyr da Hugging Face(fonte)

Depois que o modelo for baixado localmente, podemos movê-lo para o local do projeto na pasta model. Antes de mergulhar na implementação, vamos entender a estrutura do projeto:

A estrutura do projeto

A estrutura do projeto

A primeira etapa é carregar o modelo usando o construtor Llama. Como esse é um modelo grande, é importante especificar o tamanho máximo do contexto do modelo a ser carregado. Neste projeto específico, usamos 512 tokens.

from llama_cpp import Llama


# GLOBAL VARIABLES
my_model_path = "./model/zephyr-7b-beta.Q4_0.gguf"
CONTEXT_SIZE = 512


# LOAD THE MODEL
zephyr_model = Llama(model_path=my_model_path,
                    n_ctx=CONTEXT_SIZE)

Depois que o modelo é carregado, a próxima etapa é a fase de geração de texto, usando o modelo de código original, mas, em vez disso, usamos uma função auxiliar chamada generate_text_from_prompt.

def generate_text_from_prompt(user_prompt,
                             max_tokens = 100,
                             temperature = 0.3,
                             top_p = 0.1,
                             echo = True,
                             stop = ["Q", "\n"]):




   # Define the parameters
   model_output = zephyr_model(
       user_prompt,
       max_tokens=max_tokens,
       temperature=temperature,
       top_p=top_p,
       echo=echo,
       stop=stop,
   )


   return model_output

Na cláusula __main__, a função pode ser executada usando um determinado prompt.

if __name__ == "__main__":


   my_prompt = "What do you think about the inclusion policies in Tech companies?"


   zephyr_model_response = generate_text_from_prompt(my_prompt)


   print(zephyr_model_response)

A resposta do modelo é fornecida abaixo:

A resposta do modelo

A resposta do modelo

A resposta gerada pelo modelo é e a resposta exata do modelo é destacada na caixa laranja.

  • O prompt original tem 12 tokens
  • Os tokens de resposta ou conclusão têm 10 tokens e,
  • O total de tokens é a soma dos dois tokens acima, que é 22

Embora essa saída completa possa ser útil para uso posterior, talvez estejamos interessados apenas na resposta textual do modelo. Podemos formatar a resposta para obter esse resultado selecionando o campo “text” do elemento "choices” da seguinte forma:

final_result = model_output["choices"][0]["text"].strip()

A função strip() é usada para remover todos os espaços em branco à esquerda e à direita de uma cadeia de caracteres e o resultado é:

Tech companies want diverse workforces to build better products.

Aplicativos do mundo real do Llama.CPP

Esta seção apresenta uma aplicação do LLama.cpp no mundo real e fornece o problema subjacente, a possível solução e os benefícios de usar o Llama.cpp.

Problema

Imagine a ETP4Africa, uma startup de tecnologia que precisa de um modelo de idioma que possa operar com eficiência em vários dispositivos para seu aplicativo educacional sem causar atrasos.

Solução com Llama.cpp

Eles implementam o Llama.cpp, aproveitando seu desempenho otimizado para CPU e a capacidade de interagir com seu backend baseado em Go.

Benefícios

  • Portabilidade e velocidade: O design leve do Llama.cpp garante respostas rápidas e compatibilidade com muitos dispositivos.
  • Personalização: Os recursos personalizados de baixo nível permitem que o aplicativo forneça assistência de codificação em tempo real de forma eficaz.

A integração do Llama.cpp permite que o aplicativo ETP4Africa ofereça orientação de programação imediata e interativa, melhorando a experiência e o envolvimento do usuário.

A engenharia de dados é um componente essencial para qualquer projeto de ciência de dados e IA, e nosso tutorial Introdução ao LangChain para engenharia de dados e aplicativos de dados fornece um guia completo para incluir IA de modelos de linguagem grandes em pipelines e aplicativos de dados.

Conclusão

Em resumo, este artigo forneceu uma visão geral abrangente sobre a configuração e a utilização de modelos de linguagem grandes com o LLama.cpp.

Foram fornecidas instruções detalhadas para entender os conceitos básicos do Llama.cpp, configurar o ambiente de trabalho, instalar a biblioteca necessária e implementar um caso de uso de geração de texto (perguntas e respostas).

Por fim, foram fornecidos insights práticos sobre um aplicativo do mundo real e como o Llama.cpp pode ser usado para resolver o problema subjacente com eficiência.

Pronto para se aprofundar no mundo dos grandes modelos de linguagem? Aprimore suas habilidades com as poderosas estruturas de aprendizagem profunda LangChain e Pytorch usadas por profissionais de IA com nosso tutorial How to Build LLM Applications with LangChain e How to Train a LLM with PyTorch.

Temas

Comece sua jornada de IA hoje mesmo!

Course

Generative AI Concepts

2 hr
24.6K
Discover how to begin responsibly leveraging generative AI. Learn how generative AI models are developed and how they will impact society moving forward.
See DetailsRight Arrow
Start Course
Veja MaisRight Arrow
Relacionado

blog

25 exemplos práticos da transformação da IA nos setores

Desde a reformulação da saúde e do comércio eletrônico até a revolução da agricultura e das finanças, descubra exemplos reais de IA que impulsionam o crescimento, a eficiência e a inovação.

Nahla Davies

15 min

blog

O que é um algoritmo?

Aprenda algoritmos e sua importância no aprendizado de máquina. Entenda como os algoritmos resolvem problemas e executam tarefas com etapas bem definidas.
DataCamp Team's photo

DataCamp Team

11 min

blog

O que são redes neurais?

As NNs são modelos computacionais inspirados no cérebro, usados no aprendizado de máquina para reconhecer padrões e tomar decisões.
Abid Ali Awan's photo

Abid Ali Awan

7 min

tutorial

Um guia introdutório para aperfeiçoar os LLMs

O ajuste fino dos modelos de linguagem ampla (LLMs) revolucionou o processamento de linguagem natural (PLN), oferecendo recursos sem precedentes em tarefas como tradução de idiomas, análise de sentimentos e geração de texto. Essa abordagem transformadora aproveita modelos pré-treinados como o GPT-2, aprimorando seu desempenho em domínios específicos por meio do processo de ajuste fino.
Josep Ferrer's photo

Josep Ferrer

12 min

tutorial

Primeiros passos com o Claude 3 e a API do Claude 3

Saiba mais sobre os modelos Claude 3, benchmarks de desempenho detalhados e como acessá-los. Além disso, descubra a nova API Python do Claude 3 para geração de texto, acesso a recursos de visão e streaming.
Abid Ali Awan's photo

Abid Ali Awan

tutorial

Como usar o Midjourney: Um guia abrangente para a criação de obras de arte geradas por IA

Descubra o poder do Midjourney, uma ferramenta de IA generativa para criar obras de arte impressionantes. Saiba como começar, escrever prompts eficazes e otimizar seu uso com nosso guia passo a passo.
Kurtis Pykes 's photo

Kurtis Pykes

12 min

See MoreSee More