Dépôt officiel du LLM Engineer's Handbook de Paul Iusztin et Maxime Labonne
L'objectif de ce livre est de créer votre propre système LLM de bout en bout en utilisant les meilleures pratiques :
Vous pouvez télécharger et utiliser le modèle final formé sur Hugging Face.
Pour installer et exécuter le projet localement, vous avez besoin des dépendances suivantes.
Outil | Version | But | Lien d'installation |
---|---|---|---|
pyenv | ≥2.3.36 | Plusieurs versions de Python (facultatif) | Guide d'installation |
Python | 3.11 | Environnement d'exécution | Télécharger |
Poésie | ≥1.8.3 | Gestion des colis | Guide d'installation |
Docker | ≥27.1.1 | Conteneurisation | Guide d'installation |
AWS CLI | ≥2.15.42 | Gestion du cloud | Guide d'installation |
Git | ≥2.44.0 | Contrôle des versions | Télécharger |
Le code utilise et dépend également des services cloud suivants. Pour l’instant, vous n’avez rien à faire. Nous vous guiderons dans les sections d'installation et de déploiement sur la façon de les utiliser :
Service | But |
---|---|
ÉtreindreVisage | Registre des modèles |
Comète ML | Suivi des expériences |
Opique | Surveillance rapide |
ZenML | Couche orchestrateur et artefacts |
AWS | Calcul et stockage |
MongoDB | Base de données NoSQL |
Qdrant | Base de données vectorielles |
Actions GitHub | Pipeline CI/CD |
Dans le manuel de l'ingénieur LLM, le chapitre 2 vous guidera à travers chaque outil. Les chapitres 10 et 11 fournissent des guides étape par étape sur la façon de configurer tout ce dont vous avez besoin.
Voici l'aperçu du répertoire :
.
├── 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/
est le principal package Python implémentant les fonctionnalités LLM et RAG. Il suit les principes de Domain-Driven Design (DDD) :
domain/
: Entités et structures métiers principalesapplication/
: logique métier, robots d'exploration et implémentation de RAGmodel/
: Formation LLM et inférenceinfrastructure/
: Intégrations de services externes (AWS, Qdrant, MongoDB, FastAPI) La logique du code et les importations se déroulent comme suit : infrastructure
→ model
→ application
→ domain
pipelines/
: Contient les pipelines ZenML ML, qui servent de point d'entrée à tous les pipelines ML. Coordonne les étapes de traitement des données et de formation des modèles du cycle de vie du ML.
steps/
: contient des étapes ZenML individuelles, qui sont des composants réutilisables pour créer et personnaliser des pipelines ZenML. Les étapes effectuent des tâches spécifiques (par exemple, chargement des données, prétraitement) et peuvent être combinées au sein des pipelines ML.
tests/
: couvre quelques exemples de tests utilisés comme exemples dans le pipeline CI.
tools/
: Scripts utilitaires utilisés pour appeler les pipelines ZenML et le code d'inférence :
run.py
: Script de point d'entrée pour exécuter les pipelines ZenML.ml_service.py
: démarre le serveur d'inférence de l'API REST.rag.py
: démontre l'utilisation du module de récupération RAG.data_warehouse.py
: Utilisé pour exporter ou importer des données de l'entrepôt de données MongoDB via des fichiers JSON. configs/
: fichiers de configuration ZenML YAML pour contrôler l'exécution des pipelines et des étapes.
code_snippets/
: Exemples de code indépendants pouvant être exécutés indépendamment.
Commencez par cloner le référentiel et accédez au répertoire du projet :
git clone https://github.com/PacktPublishing/LLM-Engineers-Handbook.git
cd LLM-Engineers-Handbook
Ensuite, nous devons préparer votre environnement Python et ses dépendances adjacentes.
Le projet nécessite Python 3.11. Vous pouvez soit utiliser votre installation globale de Python, soit configurer une version spécifique au projet à l'aide de pyenv.
Vérifiez votre version de 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
Note
Le projet comprend un fichier .python-version
qui définit automatiquement la version correcte de Python lorsque vous êtes dans le répertoire du projet.
Le projet utilise Poetry pour la gestion des dépendances.
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
Cela va :
En tant que gestionnaire de tâches, nous exécutons tous les scripts en utilisant Poe the Poet.
poetry shell
poetry poe ...
Si vous rencontrez des problèmes avec poethepoet
, vous pouvez toujours exécuter les commandes du projet directement via Poetry. Voici comment procéder :
pyproject.toml
poetry run
avec la commande sous-jacente Au lieu de:
poetry poe local-infrastructure-up
Utilisez la commande directe de pyproject.toml :
poetry run < actual-command-from-pyproject-toml >
Remarque : Toutes les commandes du projet sont définies dans la section [tool.poe.tasks] de pyproject.toml
Maintenant, configurons notre projet local avec toutes les informations d'identification et jetons nécessaires pour exécuter le code localement.
Après avoir installé toutes les dépendances, vous devez créer et remplir un fichier .env
avec vos informations d'identification pour interagir de manière appropriée avec d'autres services et exécuter le projet. Définir vos informations d'identification sensibles dans un fichier .env
est une bonne pratique de sécurité, car ce fichier ne sera pas validé sur GitHub ni partagé avec quelqu'un d'autre.
cp .env.example .env # The file must be at your repository's root!
.env
pour commencer. Voici les paramètres obligatoires que nous devons remplir lorsque nous travaillons localement : Pour vous authentifier auprès de l'API d'OpenAI, vous devez remplir la variable d'environnement OPENAI_API_KEY
avec un jeton d'authentification.
OPENAI_API_KEY = your_api_key_here
→ Consultez ce tutoriel pour savoir comment en fournir un depuis OpenAI.
Pour vous authentifier auprès de Hugging Face, vous devez remplir la variable d'environnement HUGGINGFACE_ACCESS_TOKEN
avec un jeton d'authentification.
HUGGINGFACE_ACCESS_TOKEN = your_token_here
→ Consultez ce tutoriel pour savoir comment en fournir un à partir de Hugging Face.
Pour vous authentifier auprès de Comet ML (obligatoire uniquement pendant la formation) et Opik, vous devez remplir la variable d'environnement COMET_API_KEY
avec votre jeton d'authentification.
COMET_API_KEY = your_api_key_here
→ Consultez ce tutoriel pour savoir comment obtenir les variables Comet ML ci-dessus. Vous pouvez également accéder au tableau de bord d'Opik en utilisant ce lien.
Lors du déploiement du projet sur le cloud, nous devons définir des paramètres supplémentaires pour Mongo, Qdrant et AWS. Si vous travaillez uniquement localement, les valeurs par défaut de ces variables d'environnement fonctionneront immédiatement. Des instructions de déploiement détaillées sont disponibles au chapitre 11 du manuel de l'ingénieur LLM.
Nous devons modifier la variable d'environnement DATABASE_HOST
avec l'URL pointant vers votre cluster cloud MongoDB.
DATABASE_HOST = your_mongodb_url
→ Consultez ce tutoriel pour apprendre à créer et héberger gratuitement un cluster MongoDB.
Remplacez USE_QDRANT_CLOUD
par true
, QDRANT_CLOUD_URL
avec l'URL pointant vers votre cluster cloud Qdrant et QDRANT_APIKEY
avec sa clé API.
USE_QDRANT_CLOUD = true
QDRANT_CLOUD_URL = your_qdrant_cloud_url
QDRANT_APIKEY = your_qdrant_api_key
→ Consultez ce tutoriel pour apprendre à créer un cluster Qdrant gratuitement
Pour que votre configuration AWS fonctionne correctement, vous devez installer l'AWS CLI sur votre ordinateur local et correctement configuré avec un utilisateur administrateur (ou un utilisateur disposant des autorisations suffisantes pour créer de nouvelles ressources SageMaker, ECR et S3 ; l'utilisation d'un utilisateur administrateur rendre tout plus simple).
Le chapitre 2 fournit des instructions étape par étape sur la façon d'installer l'AWS CLI, de créer un utilisateur administrateur sur AWS et d'obtenir une clé d'accès pour configurer les variables d'environnement AWS_ACCESS_KEY
et AWS_SECRET_KEY
. Si vous disposez déjà d'un utilisateur administrateur AWS, vous devez configurer les variables d'environnement suivantes dans votre fichier .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
Les informations d'identification AWS sont généralement stockées dans ~/.aws/credentials
. Vous pouvez afficher ce fichier directement à l'aide cat
ou de commandes similaires :
cat ~ /.aws/credentials
Important
Des options de configuration supplémentaires sont disponibles dans settings.py. Toute variable de la classe Settings
peut être configurée via le fichier .env
.
Lors de l'exécution du projet localement, nous hébergeons une base de données MongoDB et Qdrant à l'aide de Docker. De plus, un serveur de test ZenML est mis à disposition via leur package Python.
Avertissement
Vous devez installer Docker (>= v27.1.1)
Pour plus de facilité d'utilisation, vous pouvez démarrer toute l'infrastructure de développement local avec la commande suivante :
poetry poe local-infrastructure-up
Vous pouvez également arrêter le serveur ZenML et tous les conteneurs Docker à l'aide de la commande suivante :
poetry poe local-infrastructure-down
Avertissement
Lors de l'exécution sous MacOS, avant de démarrer le serveur, exportez la variable d'environnement suivante : export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
Sinon, la connexion entre le serveur local et le pipeline sera interrompue. ? Plus de détails dans ce numéro. Ceci est fait par défaut lors de l'utilisation de Poe the Poet.
Démarrez l'API RESTful d'inférence en temps réel :
poetry poe run-inference-ml-service
Important
Le microservice LLM, appelé par l'API RESTful, ne fonctionnera qu'après le déploiement du LLM sur AWS SageMaker.
URL du tableau de bord : localhost:8237
Identifiants par défaut :
username
: par défautpassword
:→ En savoir plus sur l'utilisation et la configuration de ZenML.
URL de l'API REST : localhost:6333
URL du tableau de bord : localhost:6333/dashboard
→ En savoir plus sur l'utilisation et la configuration de Qdrant avec Docker.
URI de la base de données : mongodb://llm_engineering:[email protected]:27017
Nom de la base de données : twin
Identifiants par défaut :
username
: llm_engineeringpassword
: llm_engineering→ En savoir plus sur l'utilisation et la configuration de MongoDB avec Docker.
Vous pouvez rechercher vos collections MongoDB à l'aide du plugin MongoDB de votre IDE (que vous devez installer séparément), où vous devez utiliser l'URI de la base de données pour vous connecter à la base de données MongoDB hébergée dans le conteneur Docker : mongodb://llm_engineering:[email protected]:27017
Important
Tout ce qui concerne la formation ou l'exécution des LLM (par exemple, la formation, l'évaluation, l'inférence) ne peut être exécuté que si vous configurez AWS SageMaker, comme expliqué dans la section suivante sur l'infrastructure cloud.
Ici, nous présenterons rapidement comment déployer le projet sur AWS et d'autres services sans serveur. Nous n'entrerons pas dans les détails (car tout est présenté dans le livre) mais nous indiquerons seulement les principales étapes à suivre.
Tout d'abord, réinstallez vos dépendances Python avec le groupe AWS :
poetry install --with aws
Note
Le chapitre 10 fournit des instructions étape par étape dans la section « Implémentation du microservice LLM à l'aide d'AWS SageMaker ».
À ce stade, nous nous attendons à ce que l'AWS CLI soit installée et que votre AWS CLI et les variables d'environnement du projet (dans le fichier .env
) soient correctement configurées avec un utilisateur administrateur AWS.
Pour garantir les meilleures pratiques, nous devons créer un nouvel utilisateur AWS limité à la création et à la suppression uniquement des ressources liées à AWS SageMaker. Créez-le en exécutant :
poetry poe create-sagemaker-role
Il créera un fichier sagemaker_user_credentials.json
à la racine de votre référentiel avec vos nouvelles valeurs AWS_ACCESS_KEY
et AWS_SECRET_KEY
. Mais avant de remplacer vos nouvelles informations d'identification AWS, exécutez également la commande suivante pour créer le rôle d'exécution (pour le créer à l'aide de vos informations d'identification d'administrateur).
Pour créer le rôle d'exécution IAM utilisé par AWS SageMaker pour accéder à d'autres ressources AWS en notre nom, exécutez ce qui suit :
poetry poe create-sagemaker-execution-role
Il créera un fichier sagemaker_execution_role.json
à la racine de votre référentiel avec votre nouvelle valeur AWS_ARN_ROLE
. Ajoutez-le à votre fichier .env
.
Une fois que vous avez mis à jour les valeurs AWS_ACCESS_KEY
, AWS_SECRET_KEY
et AWS_ARN_ROLE
dans votre fichier .env
, vous pouvez utiliser AWS SageMaker. Notez que cette étape est cruciale pour terminer la configuration d'AWS.
Nous démarrons le pipeline de formation via ZenML en exécutant ce qui suit :
poetry poe run-training-pipeline
Cela démarrera le code de formation en utilisant les configurations de configs/training.yaml
directement dans SageMaker. Vous pouvez visualiser les résultats dans le tableau de bord de Comet ML.
Nous démarrons le pipeline d'évaluation via ZenML en exécutant ce qui suit :
poetry poe run-evaluation-pipeline
Cela démarrera le code d'évaluation en utilisant les configurations de configs/evaluating.yaml
directement dans SageMaker. Vous pouvez visualiser les résultats dans des ensembles de données *-results
enregistrés dans votre profil Hugging Face.
Pour créer un point de terminaison d'inférence AWS SageMaker, exécutez :
poetry poe deploy-inference-endpoint
Pour le tester, exécutez :
poetry poe test-sagemaker-endpoint
Pour le supprimer, exécutez :
poetry poe delete-inference-endpoint
Les pipelines, artefacts et conteneurs ML sont déployés sur AWS en tirant parti des fonctionnalités de déploiement de ZenML. Ainsi, vous devez créer un compte avec ZenML Cloud et suivre leur guide sur le déploiement d'une pile ZenML sur AWS. Sinon, nous fournissons des instructions étape par étape dans le chapitre 11 , section Déploiement des pipelines du LLM Twin vers le cloud sur ce que vous devez faire.
Nous exploitons les options sans serveur de Qdrant et MongoDB lors du déploiement du projet. Ainsi, vous pouvez soit suivre les tutoriels de Qdrant et MongoDB sur la façon de créer un cluster freemium pour chacun, soit parcourir le chapitre 11 , section Déploiement des pipelines du LLM Twin vers le cloud et suivre nos instructions étape par étape.
Nous utilisons GitHub Actions pour implémenter nos pipelines CI/CD. Pour implémenter le vôtre, vous devez forker notre référentiel et définir les variables d'environnement suivantes comme secrets d'actions dans votre référentiel forké :
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_ECR_NAME
AWS_REGION
Nous fournissons également des instructions sur la façon de tout configurer au chapitre 11 , section Ajout de LLMOps au LLM Twin .
Vous pouvez visualiser les résultats sur leurs tableaux de bord auto-hébergés si vous créez un compte Comet et définissez correctement la variable d'environnement COMET_API_KEY
. Comme Opik est alimenté par Comet, vous n'avez rien d'autre à configurer sur Comet :
Tous les pipelines ML seront orchestrés en coulisses par ZenML. Il existe quelques exceptions lors de l'exécution de scripts d'utilitaires, comme l'exportation ou l'importation depuis l'entrepôt de données.
Les pipelines ZenML sont le point d'entrée pour la plupart des processus tout au long de ce projet. Ils se trouvent sous le dossier pipelines/
. Ainsi, lorsque vous souhaitez comprendre ou déboguer un workflow, commencer par le pipeline ZenML est la meilleure approche.
Pour voir les pipelines en cours d'exécution et leurs résultats :
Pipelines
feature_engineering
)feature_engineering_run_2024_06_20_18_40_24
)Explorons maintenant tous les pipelines que vous pouvez exécuter. De la collecte des données à la formation, nous les présenterons dans leur ordre naturel pour parcourir le projet LLM de bout en bout.
Exécutez l'ETL de collecte de données :
poetry poe run-digital-data-etl
Avertissement
Vous devez avoir Chrome (ou un autre navigateur basé sur Chromium) installé sur votre système pour que les robots d'exploration LinkedIn et Medium fonctionnent (qui utilisent Selenium sous le capot). En fonction de votre version de Chrome, le Chromedriver sera automatiquement installé pour activer la prise en charge de Selenium. Une autre option consiste à tout exécuter en utilisant notre image Docker si vous ne souhaitez pas installer Chrome. Par exemple, pour exécuter tous les pipelines combinés, vous pouvez exécuter poetry poe run-docker-end-to-end-data-pipeline
. Notez que la commande peut être modifiée pour prendre en charge n'importe quel autre pipeline.
Si, pour une autre raison, vous n'avez pas installé de navigateur basé sur Chromium et que vous ne souhaitez pas utiliser Docker, vous disposez de deux autres options pour contourner ce problème de Selenium :
chromedriver_autoinstaller.install()
de application.crawlers.base et d'autres appels statiques qui vérifient les pilotes Chrome. et le sélénium. Pour ajouter des liens supplémentaires à partir desquels collecter, accédez à configs/digital_data_etl_[author_name].yaml
et ajoutez-les au champ links
. En outre, vous pouvez créer un tout nouveau fichier et le spécifier au moment de l'exécution, comme ceci : python -m llm_engineering.interfaces.orchestrator.run --run-etl --etl-config-filename configs/digital_data_etl_[your_name].yaml
Exécutez le pipeline d'ingénierie des fonctionnalités :
poetry poe run-feature-engineering-pipeline
Générez l'ensemble de données d'instruction :
poetry poe run-generate-instruct-datasets-pipeline
Générez l'ensemble de données de préférences :
poetry poe run-generate-preference-datasets-pipeline
Exécutez tout ce qui précède compressé dans un seul pipeline :
poetry poe run-end-to-end-data-pipeline
Exportez les données de l'entrepôt de données vers des fichiers JSON :
poetry poe run-export-data-warehouse-to-json
Importez des données dans l'entrepôt de données à partir de fichiers JSON (par défaut, il importe les données du répertoire data/data_warehouse_raw_data
) :
poetry poe run-import-data-warehouse-from-json
Exportez les artefacts ZenML vers JSON :
poetry poe run-export-artifact-to-json-pipeline
Cela exportera les artefacts ZenML suivants vers le dossier output
sous forme de fichiers JSON (cela prendra leur dernière version) :
Vous pouvez configurer les artefacts à exporter en modifiant le fichier de configuration configs/export_artifact_to_json.yaml
.
Exécutez le pipeline de formation :
poetry poe run-training-pipeline
Exécutez le pipeline d'évaluation :
poetry poe run-evaluation-pipeline
Avertissement
Pour que cela fonctionne, assurez-vous d'avoir correctement configuré AWS SageMaker comme décrit dans Configurer l'infrastructure cloud (pour la production).
Appelez le module de récupération RAG avec une requête de test :
poetry poe call-rag-retrieval-module
Démarrez l'API RESTful d'inférence en temps réel :
poetry poe run-inference-ml-service
Appelez l'API RESTful d'inférence en temps réel avec une requête de test :
poetry poe call-inference-ml-service
N'oubliez pas que vous pouvez surveiller les traces d'invite sur Opik.
Avertissement
Pour que le service d'inférence fonctionne, vous devez déployer le microservice LLM sur AWS SageMaker, comme expliqué dans la section de configuration de l'infrastructure cloud.
Vérifiez ou résolvez vos problèmes de peluches :
poetry poe lint-check
poetry poe lint-fix
Vérifiez ou résolvez vos problèmes de formatage :
poetry poe format-check
poetry poe format-fix
Vérifiez le code pour détecter les informations d'identification divulguées :
poetry poe gitleaks-check
Exécutez tous les tests à l'aide de la commande suivante :
poetry poe test
Sur la base des étapes de configuration et d'utilisation décrites ci-dessus, en supposant que l'infrastructure locale et cloud fonctionne et que le .env
est rempli comme prévu, suivez les étapes suivantes pour exécuter le système LLM de bout en bout :
Collecter des données : poetry poe run-digital-data-etl
Fonctionnalités de calcul : poetry poe run-feature-engineering-pipeline
Ensemble de données d'instruction de calcul : poetry poe run-generate-instruct-datasets-pipeline
Ensemble de données d'alignement des préférences de calcul : poetry poe run-generate-preference-datasets-pipeline
Important
À partir de maintenant, pour que ces étapes fonctionnent, vous devez configurer correctement AWS SageMaker, par exemple en exécutant poetry install --with aws
et en remplissant les variables d'environnement et les configurations liées à AWS.
SFT peaufine Llamma 3.1 : poetry poe run-training-pipeline
Pour DPO, accédez à configs/training.yaml
, remplacez finetuning_type
par dpo
et exécutez à nouveau poetry poe run-training-pipeline
Évaluer des modèles affinés : poetry poe run-evaluation-pipeline
Important
À partir de maintenant, pour que ces étapes fonctionnent, vous devez configurer correctement AWS SageMaker, par exemple en exécutant poetry install --with aws
et en remplissant les variables d'environnement et les configurations liées à AWS.
Appelez uniquement le module de récupération RAG : poetry poe call-rag-retrieval-module
Déployer le microservice LLM Twin sur SageMaker : poetry poe deploy-inference-endpoint
Testez le microservice LLM Twin : poetry poe test-sagemaker-endpoint
Démarrer le serveur RAG de bout en bout : poetry poe run-inference-ml-service
Test du serveur RAG : poetry poe call-inference-ml-service
Ce cours est un projet open source publié sous licence MIT. Ainsi, tant que vous distribuez notre LICENCE et reconnaissez notre travail, vous pouvez cloner ou bifurquer ce projet en toute sécurité et l'utiliser comme source d'inspiration pour tout ce que vous voulez (par exemple, des projets universitaires, des projets d'études collégiales, des projets personnels, etc.).