Repositório oficial do LLM Engineer's Handbook de Paul Iusztin e Maxime Labonne
O objetivo deste livro é criar seu próprio sistema baseado em LLM de ponta a ponta usando as melhores práticas:
Você pode baixar e usar o modelo final treinado em Hugging Face.
Para instalar e executar o projeto localmente, você precisa das seguintes dependências.
Ferramenta | Versão | Propósito | Link de instalação |
---|---|---|---|
pyenv | ≥2.3.36 | Várias versões do Python (opcional) | Guia de instalação |
Pitão | 3.11 | Ambiente de execução | Download |
Poesia | ≥1.8.3 | Gerenciamento de pacotes | Guia de instalação |
Docker | ≥27.1.1 | Conteinerização | Guia de instalação |
CLI da AWS | ≥2,15,42 | Gerenciamento de nuvem | Guia de instalação |
Git | ≥2,44,0 | Controle de versão | Download |
O código também usa e depende dos seguintes serviços em nuvem. Por enquanto, você não precisa fazer nada. Iremos orientá-lo nas seções de instalação e implantação sobre como usá-los:
Serviço | Propósito |
---|---|
Abraçando o rosto | Registro de modelo |
Cometa ML | Rastreador de experimentos |
Opik | Monitoramento imediato |
ZenML | Camada de orquestrador e artefatos |
AWS | Computação e armazenamento |
MongoDB | Banco de dados NoSQL |
Qdrant | Banco de dados de vetores |
Ações do GitHub | Pipeline de CI/CD |
No Manual do Engenheiro LLM, o Capítulo 2 orientará você em cada ferramenta. Os Capítulos 10 e 11 fornecem guias passo a passo sobre como configurar tudo o que você precisa.
Aqui está a visão geral do diretório:
.
├── code_snippets/ # Standalone example code
├── configs/ # Pipeline configuration files
├── llm_engineering/ # Core project package
│ ├── application/
│ ├── domain/
│ ├── infrastructure/
│ ├── model/
├── pipelines/ # ML pipeline definitions
├── steps/ # Pipeline components
├── tests/ # Test examples
├── tools/ # Utility scripts
│ ├── run.py
│ ├── ml_service.py
│ ├── rag.py
│ ├── data_warehouse.py
llm_engineering/
é o principal pacote Python que implementa as funcionalidades LLM e RAG. Ele segue os princípios do Domain-Driven Design (DDD):
domain/
: Entidades e estruturas comerciais principaisapplication/
: Lógica de negócios, rastreadores e implementação de RAGmodel/
: treinamento e inferência LLMinfrastructure/
: integrações de serviços externos (AWS, Qdrant, MongoDB, FastAPI) A lógica do código e as importações fluem da seguinte forma: infrastructure
→ model
→ application
→ domain
pipelines/
: contém os pipelines ZenML ML, que servem como ponto de entrada para todos os pipelines de ML. Coordena os estágios de processamento de dados e treinamento de modelo do ciclo de vida de ML.
steps/
: Contém etapas ZenML individuais, que são componentes reutilizáveis para construir e personalizar pipelines ZenML. As etapas executam tarefas específicas (por exemplo, carregamento de dados, pré-processamento) e podem ser combinadas nos pipelines de ML.
tests/
: cobre alguns testes de amostra usados como exemplos dentro do pipeline de CI.
tools/
: scripts utilitários usados para chamar os pipelines ZenML e o código de inferência:
run.py
: script de ponto de entrada para executar pipelines ZenML.ml_service.py
: inicia o servidor de inferência da API REST.rag.py
: demonstra o uso do módulo de recuperação RAG.data_warehouse.py
: usado para exportar ou importar dados do data warehouse MongoDB por meio de arquivos JSON. configs/
: arquivos de configuração ZenML YAML para controlar a execução de pipelines e etapas.
code_snippets/
: exemplos de código independentes que podem ser executados de forma independente.
Comece clonando o repositório e navegando até o diretório do projeto:
git clone https://github.com/PacktPublishing/LLM-Engineers-Handbook.git
cd LLM-Engineers-Handbook
A seguir, temos que preparar seu ambiente Python e suas dependências adjacentes.
O projeto requer Python 3.11. Você pode usar a instalação global do Python ou configurar uma versão específica do projeto usando pyenv.
Verifique sua versão do Python:
python --version # Should show Python 3.11.x
pyenv --version # Should show pyenv 2.3.36 or later
pyenv install 3.11.8
python --version # Should show Python 3.11.8
python --version
# Output: Python 3.11.8
Observação
O projeto inclui um arquivo .python-version
que define automaticamente a versão correta do Python quando você está no diretório do projeto.
O projeto usa Poesia para gerenciamento de dependências.
poetry --version # Should show Poetry version 1.8.3 or later
poetry env use 3.11
poetry install --without aws
poetry run pre-commit install
Isto irá:
Como nosso gerenciador de tarefas, executamos todos os scripts usando Poe the Poet.
poetry shell
poetry poe ...
Se estiver tendo problemas com poethepoet
, você ainda pode executar os comandos do projeto diretamente por meio do Poetry. Veja como:
pyproject.toml
poetry run
com o comando subjacente Em vez de:
poetry poe local-infrastructure-up
Use o comando direto de pyproject.toml:
poetry run < actual-command-from-pyproject-toml >
Nota: Todos os comandos do projeto são definidos na seção [tool.poe.tasks] de pyproject.toml
Agora, vamos configurar nosso projeto local com todas as credenciais e tokens necessários para executar o código localmente.
Depois de instalar todas as dependências, você deve criar e preencher um arquivo .env
com suas credenciais para interagir adequadamente com outros serviços e executar o projeto. Definir suas credenciais confidenciais em um arquivo .env
é uma boa prática de segurança, pois esse arquivo não será confirmado no GitHub nem compartilhado com mais ninguém.
cp .env.example .env # The file must be at your repository's root!
.env
para você começar. A seguir estão as configurações obrigatórias que devemos concluir ao trabalhar localmente: Para autenticar na API do OpenAI, você deve preencher o env var OPENAI_API_KEY
com um token de autenticação.
OPENAI_API_KEY = your_api_key_here
→ Confira este tutorial para aprender como fornecer um do OpenAI.
Para autenticar no Hugging Face, você deve preencher o env var HUGGINGFACE_ACCESS_TOKEN
com um token de autenticação.
HUGGINGFACE_ACCESS_TOKEN = your_token_here
→ Confira este tutorial para aprender como fornecer um do Hugging Face.
Para autenticar no Comet ML (obrigatório apenas durante o treinamento) e no Opik, você deve preencher o env var COMET_API_KEY
com seu token de autenticação.
COMET_API_KEY = your_api_key_here
→ Confira este tutorial para aprender como obter as variáveis Comet ML acima. Você também pode acessar o painel do Opik usando este link.
Ao implantar o projeto na nuvem, devemos definir configurações adicionais para Mongo, Qdrant e AWS. Se você estiver trabalhando apenas localmente, os valores padrão desses env vars funcionarão imediatamente. Instruções detalhadas de implantação estão disponíveis no Capítulo 11 do LLM Engineer's Handbook.
Devemos alterar o env var DATABASE_HOST
com o URL apontando para seu cluster MongoDB em nuvem.
DATABASE_HOST = your_mongodb_url
→ Confira este tutorial para aprender como criar e hospedar um cluster MongoDB gratuitamente.
Altere USE_QDRANT_CLOUD
para true
, QDRANT_CLOUD_URL
com o ponto de URL para seu cluster Qdrant na nuvem e QDRANT_APIKEY
com sua chave de API.
USE_QDRANT_CLOUD = true
QDRANT_CLOUD_URL = your_qdrant_cloud_url
QDRANT_APIKEY = your_qdrant_api_key
→ Confira este tutorial para aprender como criar um cluster Qdrant gratuitamente
Para que sua configuração da AWS funcione corretamente, você precisa da AWS CLI instalada em sua máquina local e configurada corretamente com um usuário administrador (ou um usuário com permissões suficientes para criar novos recursos SageMaker, ECR e S3; usar um usuário administrador irá tornar tudo mais simples).
O Capítulo 2 fornece instruções passo a passo sobre como instalar a AWS CLI, criar um usuário administrador na AWS e obter uma chave de acesso para configurar as variáveis de ambiente AWS_ACCESS_KEY
e AWS_SECRET_KEY
. Se você já possui um usuário administrador da AWS, deverá configurar os seguintes env vars em seu arquivo .env
:
AWS_REGION=eu-central-1 # Change it with your AWS region.
AWS_ACCESS_KEY=your_aws_access_key
AWS_SECRET_KEY=your_aws_secret_key
As credenciais da AWS normalmente são armazenadas em ~/.aws/credentials
. Você pode visualizar este arquivo diretamente usando cat
ou comandos semelhantes:
cat ~ /.aws/credentials
Importante
Opções de configuração adicionais estão disponíveis em settings.py. Qualquer variável na classe Settings
pode ser configurada através do arquivo .env
.
Ao executar o projeto localmente, hospedamos um banco de dados MongoDB e Qdrant usando Docker. Além disso, um servidor ZenML de teste é disponibilizado por meio de seu pacote Python.
Aviso
Você precisa do Docker instalado (>= v27.1.1)
Para facilitar o uso, você pode iniciar toda a infraestrutura de desenvolvimento local com o seguinte comando:
poetry poe local-infrastructure-up
Além disso, você pode parar o servidor ZenML e todos os contêineres Docker usando o seguinte comando:
poetry poe local-infrastructure-down
Aviso
Ao executar no MacOS, antes de iniciar o servidor, exporte a seguinte variável de ambiente: export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
Caso contrário, a conexão entre o servidor local e o pipeline será interrompida. ? Mais detalhes nesta edição. Isso é feito por padrão ao usar Poe the Poet.
Inicie a API RESTful de inferência em tempo real:
poetry poe run-inference-ml-service
Importante
O microsserviço LLM, chamado pela API RESTful, funcionará somente após a implantação do LLM no AWS SageMaker.
URL do painel: localhost:8237
Credenciais padrão:
username
: padrãopassword
:→ Saiba mais sobre como usar e configurar o ZenML.
URL da API REST: localhost:6333
URL do painel: localhost:6333/dashboard
→ Saiba mais sobre como usar e configurar o Qdrant com Docker.
URI do banco de dados: mongodb://llm_engineering:[email protected]:27017
Nome do banco de dados: twin
Credenciais padrão:
username
: llm_engineeringpassword
: llm_engineering→ Saiba mais sobre como usar e configurar o MongoDB com Docker.
Você pode pesquisar suas coleções MongoDB usando o plugin MongoDB de IDEs (que você deve instalar separadamente), onde você deve usar o URI do banco de dados para se conectar ao banco de dados MongoDB hospedado no contêiner Docker: mongodb://llm_engineering:[email protected]:27017
Importante
Tudo relacionado ao treinamento ou execução de LLMs (por exemplo, treinamento, avaliação, inferência) só poderá ser executado se você configurar o AWS SageMaker, conforme explicado na próxima seção sobre infraestrutura em nuvem.
Aqui apresentaremos rapidamente como implantar o projeto na AWS e outros serviços sem servidor. Não entraremos em detalhes (pois tudo é apresentado no livro), mas apenas apontaremos as principais etapas que você deverá percorrer.
Primeiro, reinstale suas dependências do Python com o grupo AWS:
poetry install --with aws
Observação
O Capítulo 10 fornece instruções passo a passo na seção "Implementação do microsserviço LLM usando AWS SageMaker".
Neste ponto, esperamos que você tenha a AWS CLI instalada e sua AWS CLI e os env vars do projeto (dentro do arquivo .env
) configurados corretamente com um usuário administrador da AWS.
Para garantir as melhores práticas, devemos criar um novo usuário AWS restrito a criar e excluir apenas recursos relacionados ao AWS SageMaker. Crie-o executando:
poetry poe create-sagemaker-role
Ele criará um arquivo sagemaker_user_credentials.json
na raiz do seu repositório com seus novos valores AWS_ACCESS_KEY
e AWS_SECRET_KEY
. Mas antes de substituir suas novas credenciais da AWS, execute também o seguinte comando para criar a função de execução (para criá-la usando suas credenciais de administrador).
Para criar a função de execução do IAM usada pelo AWS SageMaker para acessar outros recursos da AWS em nosso nome, execute o seguinte:
poetry poe create-sagemaker-execution-role
Ele criará um arquivo sagemaker_execution_role.json
na raiz do seu repositório com seu novo valor AWS_ARN_ROLE
. Adicione-o ao seu arquivo .env
.
Depois de atualizar os valores AWS_ACCESS_KEY
, AWS_SECRET_KEY
e AWS_ARN_ROLE
no arquivo .env
, você poderá usar o AWS SageMaker. Observe que esta etapa é crucial para concluir a configuração da AWS.
Iniciamos o pipeline de treinamento por meio do ZenML executando o seguinte:
poetry poe run-training-pipeline
Isso iniciará o código de treinamento usando as configurações de configs/training.yaml
diretamente no SageMaker. Você pode visualizar os resultados no painel do Comet ML.
Iniciamos o pipeline de avaliação por meio do ZenML executando o seguinte:
poetry poe run-evaluation-pipeline
Isso iniciará o código de avaliação usando as configurações de configs/evaluating.yaml
diretamente no SageMaker. Você pode visualizar os resultados em conjuntos de dados *-results
salvos em seu perfil Hugging Face.
Para criar um endpoint de inferência do AWS SageMaker, execute:
poetry poe deploy-inference-endpoint
Para testar, execute:
poetry poe test-sagemaker-endpoint
Para excluí-lo, execute:
poetry poe delete-inference-endpoint
Os pipelines, artefatos e contêineres de ML são implantados na AWS aproveitando os recursos de implantação do ZenML. Portanto, você deve criar uma conta no ZenML Cloud e seguir seu guia sobre como implantar uma pilha ZenML na AWS. Caso contrário, fornecemos instruções passo a passo no Capítulo 11 , seção Implantando os pipelines do LLM Twin na nuvem sobre o que você deve fazer.
Aproveitamos as opções sem servidor do Qdrant e do MongoDB ao implantar o projeto. Assim, você pode seguir os tutoriais do Qdrant e do MongoDB sobre como criar um cluster freemium para cada um ou passar pelo Capítulo 11 , seção Implantando os pipelines do LLM Twin na nuvem e seguir nossas instruções passo a passo.
Usamos GitHub Actions para implementar nossos pipelines de CI/CD. Para implementar o seu próprio, você deve bifurcar nosso repositório e definir os seguintes env vars como segredos de ações em seu repositório bifurcado:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_ECR_NAME
AWS_REGION
Além disso, fornecemos instruções sobre como configurar tudo no Capítulo 11 , seção Adicionando LLMOps ao LLM Twin .
Você pode visualizar os resultados em seus painéis auto-hospedados se criar uma conta Comet e definir corretamente a variável de ambiente COMET_API_KEY
. Como o Opik é alimentado pelo Comet, você não precisa configurar mais nada junto com o Comet:
Todos os pipelines de ML serão orquestrados nos bastidores pelo ZenML. Existem algumas exceções ao executar scripts de utilitários, como exportar ou importar do data warehouse.
Os pipelines ZenML são o ponto de entrada para a maioria dos processos neste projeto. Eles estão na pasta pipelines/
. Assim, quando você deseja entender ou depurar um fluxo de trabalho, começar com o pipeline ZenML é a melhor abordagem.
Para ver os pipelines em execução e seus resultados:
Pipelines
feature_engineering
)feature_engineering_run_2024_06_20_18_40_24
)Agora, vamos explorar todos os pipelines que você pode executar. Da coleta de dados ao treinamento, iremos apresentá-los em sua ordem natural para percorrer o projeto LLM de ponta a ponta.
Execute o ETL de coleta de dados:
poetry poe run-digital-data-etl
Aviso
Você deve ter o Chrome (ou outro navegador baseado em Chromium) instalado em seu sistema para que os rastreadores do LinkedIn e do Medium funcionem (que usam Selenium nos bastidores). Com base na sua versão do Chrome, o Chromedriver será instalado automaticamente para ativar o suporte Selenium. Outra opção é executar tudo usando nossa imagem Docker se não quiser instalar o Chrome. Por exemplo, para executar todos os pipelines combinados, você pode executar poetry poe run-docker-end-to-end-data-pipeline
. Observe que o comando pode ser ajustado para oferecer suporte a qualquer outro pipeline.
Se, por qualquer outro motivo, você não tiver um navegador baseado em Chromium instalado e não quiser usar o Docker, você tem duas outras opções para contornar esse problema do Selenium:
chromedriver_autoinstaller.install()
de application.crawlers.base e outras chamadas estáticas que verificam drivers do Chrome e selênio. Para adicionar links adicionais para coletar, vá para configs/digital_data_etl_[author_name].yaml
e adicione-os ao campo links
. Além disso, você pode criar um arquivo completamente novo e especificá-lo em tempo de execução, como este: python -m llm_engineering.interfaces.orchestrator.run --run-etl --etl-config-filename configs/digital_data_etl_[your_name].yaml
Execute o pipeline de engenharia de atributos:
poetry poe run-feature-engineering-pipeline
Gere o conjunto de dados de instruções:
poetry poe run-generate-instruct-datasets-pipeline
Gere o conjunto de dados de preferência:
poetry poe run-generate-preference-datasets-pipeline
Execute todos os itens acima compactados em um único pipeline:
poetry poe run-end-to-end-data-pipeline
Exporte os dados do data warehouse para arquivos JSON:
poetry poe run-export-data-warehouse-to-json
Importe dados para o data warehouse a partir de arquivos JSON (por padrão, ele importa os dados do diretório data/data_warehouse_raw_data
):
poetry poe run-import-data-warehouse-from-json
Exporte artefatos ZenML para JSON:
poetry poe run-export-artifact-to-json-pipeline
Isso exportará os seguintes artefatos ZenML para a pasta output
como arquivos JSON (levará sua versão mais recente):
Você pode configurar quais artefatos exportar ajustando o arquivo de configuração configs/export_artifact_to_json.yaml
.
Execute o pipeline de treinamento:
poetry poe run-training-pipeline
Execute o pipeline de avaliação:
poetry poe run-evaluation-pipeline
Aviso
Para que isso funcione, certifique-se de configurar corretamente o AWS SageMaker conforme descrito em Configurar a infraestrutura de nuvem (para produção).
Chame o módulo de recuperação RAG com uma consulta de teste:
poetry poe call-rag-retrieval-module
Inicie a API RESTful de inferência em tempo real:
poetry poe run-inference-ml-service
Chame a API RESTful de inferência em tempo real com uma consulta de teste:
poetry poe call-inference-ml-service
Lembre-se de que você pode monitorar os rastreamentos de prompt no Opik.
Aviso
Para que o serviço de inferência funcione, você deve ter o microsserviço LLM implantado no AWS SageMaker, conforme explicado na seção de configuração da infraestrutura de nuvem.
Verifique ou corrija seus problemas de linting:
poetry poe lint-check
poetry poe lint-fix
Verifique ou corrija seus problemas de formatação:
poetry poe format-check
poetry poe format-fix
Verifique o código para credenciais vazadas:
poetry poe gitleaks-check
Execute todos os testes usando o seguinte comando:
poetry poe test
Com base nas etapas de configuração e uso descritas acima, assumindo que a infraestrutura local e em nuvem funcione e o .env
seja preenchido conforme o esperado, siga as próximas etapas para executar o sistema LLM de ponta a ponta:
Coletar dados: poetry poe run-digital-data-etl
Recursos de computação: poetry poe run-feature-engineering-pipeline
Conjunto de dados de instruções de computação: poetry poe run-generate-instruct-datasets-pipeline
Conjunto de dados de alinhamento de preferência de cálculo: poetry poe run-generate-preference-datasets-pipeline
Importante
De agora em diante, para que essas etapas funcionem, você precisa configurar corretamente o AWS SageMaker, como executar poetry install --with aws
e preencher as variáveis de ambiente e configurações relacionadas à AWS.
SFT ajuste fino Llamma 3.1: poetry poe run-training-pipeline
Para DPO, vá para configs/training.yaml
, altere finetuning_type
para dpo
e execute poetry poe run-training-pipeline
novamente
Avalie modelos ajustados: poetry poe run-evaluation-pipeline
Importante
De agora em diante, para que essas etapas funcionem, você precisa configurar corretamente o AWS SageMaker, como executar poetry install --with aws
e preencher as variáveis e configurações de ambiente relacionadas à AWS.
Chame apenas o módulo de recuperação RAG: poetry poe call-rag-retrieval-module
Implante o microsserviço LLM Twin no SageMaker: poetry poe deploy-inference-endpoint
Teste o microsserviço LLM Twin: poetry poe test-sagemaker-endpoint
Inicie o servidor RAG ponta a ponta: poetry poe run-inference-ml-service
Servidor RAG de teste: poetry poe call-inference-ml-service
Este curso é um projeto de código aberto lançado sob a licença do MIT. Assim, desde que você distribua nossa LICENÇA e reconheça nosso trabalho, você pode clonar ou bifurcar este projeto com segurança e usá-lo como fonte de inspiração para o que quiser (por exemplo, projetos universitários, projetos de graduação universitária, projetos pessoais, etc.).