Paul Iusztin 和 Maxime Labonne 撰写的 LLM 工程师手册的官方存储库
本书的目标是使用最佳实践创建您自己的基于 LLM 的端到端系统:
您可以在 Hugging Face 上下载并使用最终训练的模型。
要在本地安装并运行项目,您需要以下依赖项。
工具 | 版本 | 目的 | 安装链接 |
---|---|---|---|
pyenv | ≥2.3.36 | 多个Python版本(可选) | 安装指南 |
Python | 3.11 | 运行时环境 | 下载 |
诗 | ≥1.8.3 | 包管理 | 安装指南 |
码头工人 | ≥27.1.1 | 集装箱化 | 安装指南 |
AWS CLI | ≥2.15.42 | 云端管理 | 安装指南 |
git | ≥2.44.0 | 版本控制 | 下载 |
该代码还使用并依赖于以下云服务。目前,您无需执行任何操作。我们将在安装和部署部分指导您如何使用它们:
服务 | 目的 |
---|---|
抱脸 | 模型注册表 |
彗星ML | 实验追踪器 |
奥皮克 | 及时监控 |
ZenML | Orchestrator 和工件层 |
AWS | 计算和存储 |
MongoDB | NoSQL数据库 |
奎德兰特 | 矢量数据库 |
GitHub 操作 | CI/CD 管道 |
在《LLM 工程师手册》中,第 2 章将引导您了解每个工具。第 10 章和第 11 章提供了有关如何设置您所需的一切的分步指南。
以下是目录概述:
.
├── 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/
是实现 LLM 和 RAG 功能的主要 Python 包。它遵循领域驱动设计 (DDD) 原则:
domain/
:核心业务实体和结构application/
:业务逻辑、爬虫和RAG实现model/
:LLM训练和推理infrastructure/
:外部服务集成(AWS、Qdrant、MongoDB、FastAPI)代码逻辑和导入流程如下: infrastructure
→ model
→ application
→ domain
pipelines/
:包含 ZenML ML 管道,用作所有 ML 管道的入口点。协调 ML 生命周期的数据处理和模型训练阶段。
steps/
:包含单独的 ZenML 步骤,它们是用于构建和自定义 ZenML 管道的可重用组件。步骤执行特定任务(例如,数据加载、预处理),并且可以在 ML 管道内组合。
tests/
:涵盖一些在 CI 管道中用作示例的示例测试。
tools/
:用于调用 ZenML 管道和推理代码的实用程序脚本:
run.py
:运行 ZenML 管道的入口点脚本。ml_service.py
:启动 REST API 推理服务器。rag.py
:演示 RAG 检索模块的用法。data_warehouse.py
:用于通过 JSON 文件从 MongoDB 数据仓库导出或导入数据。 configs/
:ZenML YAML 配置文件,用于控制管道和步骤的执行。
code_snippets/
:可以独立执行的独立代码示例。
首先克隆存储库并导航到项目目录:
git clone https://github.com/PacktPublishing/LLM-Engineers-Handbook.git
cd LLM-Engineers-Handbook
接下来,我们必须准备您的 Python 环境及其相邻的依赖项。
该项目需要Python 3.11。您可以使用全局 Python 安装,也可以使用 pyenv 设置特定于项目的版本。
验证您的 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
笔记
该项目包含一个.python-version
文件,当您位于项目目录中时,该文件会自动设置正确的 Python 版本。
该项目使用 Poetry 进行依赖管理。
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
这将:
作为我们的任务管理器,我们使用 Poe the Poet 运行所有脚本。
poetry shell
poetry poe ...
如果您在使用poethepoet
时遇到问题,您仍然可以直接通过 Poetry 运行项目命令。方法如下:
pyproject.toml
中查找命令定义poetry run
与底层命令而不是:
poetry poe local-infrastructure-up
使用 pyproject.toml 中的直接命令:
poetry run < actual-command-from-pyproject-toml >
注意:所有项目命令都在 pyproject.toml 的 [tool.poe.tasks] 部分中定义
现在,让我们使用所有必要的凭据和令牌配置本地项目以在本地运行代码。
安装所有依赖项后,您必须使用您的凭据创建并填充.env
文件,以便与其他服务正确交互并运行项目。在.env
文件中设置敏感凭据是一种良好的安全实践,因为该文件不会提交到 GitHub 或与其他任何人共享。
cp .env.example .env # The file must be at your repository's root!
.env
文件中的所有基本变量以帮助您入门。以下是我们在本地工作时必须完成的强制设置: 要对 OpenAI 的 API 进行身份验证,您必须使用身份验证令牌填写OPENAI_API_KEY
环境变量。
OPENAI_API_KEY = your_api_key_here
→ 查看本教程,了解如何从 OpenAI 提供一个。
要对 Hugging Face 进行身份验证,您必须使用身份验证令牌填写HUGGINGFACE_ACCESS_TOKEN
环境变量。
HUGGINGFACE_ACCESS_TOKEN = your_token_here
→ 查看本教程,了解如何从 Hugging Face 中提供一个。
要对 Comet ML(仅在训练期间需要)和 Opik 进行身份验证,您必须使用身份验证令牌填写COMET_API_KEY
环境变量。
COMET_API_KEY = your_api_key_here
→ 查看本教程,了解如何从上面获取 Comet ML 变量。您还可以使用?此链接访问 Opik 的仪表板。
将项目部署到云端时,我们必须对 Mongo、Qdrant 和 AWS 进行额外设置。如果您只是在本地工作,这些环境变量的默认值将立即可用。详细的部署说明可在 LLM 工程师手册的第 11 章中找到。
我们必须使用指向云 MongoDB 集群的 URL 来更改DATABASE_HOST
环境变量。
DATABASE_HOST = your_mongodb_url
→ 查看本教程,了解如何免费创建和托管 MongoDB 集群。
将USE_QDRANT_CLOUD
更改为true
,将QDRANT_CLOUD_URL
更改为指向您的云 Qdrant 集群的 URL,将QDRANT_APIKEY
更改为其 API 密钥。
USE_QDRANT_CLOUD = true
QDRANT_CLOUD_URL = your_qdrant_cloud_url
QDRANT_APIKEY = your_qdrant_api_key
→ 查看本教程,了解如何免费创建 Qdrant 集群
为了使您的 AWS 设置正常工作,您需要在本地计算机上安装 AWS CLI,并使用管理员用户(或具有足够权限创建新 SageMaker、ECR 和 S3 资源的用户;使用管理员用户将进行正确配置)让一切变得更加简单)。
第 2 章提供有关如何安装 AWS CLI、在 AWS 上创建管理员用户以及获取访问密钥以设置AWS_ACCESS_KEY
和AWS_SECRET_KEY
环境变量的分步说明。如果您已经有 AWS 管理员用户,则必须在.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
AWS 凭证通常存储在~/.aws/credentials
中。您可以使用cat
或类似命令直接查看该文件:
cat ~ /.aws/credentials
重要的
settings.py 中提供了其他配置选项。 Settings
类中的任何变量都可以通过.env
文件进行配置。
在本地运行项目时,我们使用 Docker 托管 MongoDB 和 Qdrant 数据库。此外,还可以通过其 Python 包提供测试 ZenML 服务器。
警告
您需要安装 Docker (>= v27.1.1)
为了便于使用,您可以使用以下命令启动整个本地开发基础设施:
poetry poe local-infrastructure-up
此外,您可以使用以下命令停止 ZenML 服务器和所有 Docker 容器:
poetry poe local-infrastructure-down
警告
在 MacOS 上运行时,在启动服务器之前,导出以下环境变量: export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
否则,本地服务器和管道之间的连接将中断。 ?本期有更多详细信息。使用 Poe the Poet 时默认会执行此操作。
启动实时推理RESTful API:
poetry poe run-inference-ml-service
重要的
由 RESTful API 调用的 LLM 微服务只有在将 LLM 部署到 AWS SageMaker 后才会工作。
仪表板 URL: localhost:8237
默认凭据:
username
:默认password
:→ 了解有关使用和设置 ZenML 的更多信息。
REST API URL: localhost:6333
仪表板 URL: localhost:6333/dashboard
→ 了解有关通过 Docker 使用和设置 Qdrant 的更多信息。
数据库 URI: mongodb://llm_engineering:[email protected]:27017
数据库名称: twin
默认凭据:
username
:llm_engineeringpassword
:llm_engineering→ 了解有关通过 Docker 使用和设置 MongoDB 的更多信息。
您可以使用IDE MongoDB 插件(必须单独安装)搜索 MongoDB 集合,其中必须使用数据库 URI 连接到 Docker 容器中托管的 MongoDB 数据库: mongodb://llm_engineering:[email protected]:27017
重要的
与训练或运行 LLM 相关的所有内容(例如训练、评估、推理)只有在您设置了 AWS SageMaker 后才能运行,如下一节有关云基础设施的说明。
这里我们将快速介绍如何将项目部署到AWS和其他无服务器服务。我们不会详细介绍(因为书中介绍了所有内容),而仅指出您必须经历的主要步骤。
首先,使用 AWS 组重新安装 Python 依赖项:
poetry install --with aws
笔记
第 10 章“使用 AWS SageMaker 实现 LLM 微服务”部分提供了分步说明。
此时,我们希望您已安装 AWS CLI,并使用 AWS 管理员用户正确配置您的 AWS CLI 和项目的环境变量(在.env
文件内)。
为了确保最佳实践,我们必须创建一个新的 AWS 用户,该用户仅限于创建和删除与 AWS SageMaker 相关的资源。通过运行创建它:
poetry poe create-sagemaker-role
它将使用新的AWS_ACCESS_KEY
和AWS_SECRET_KEY
值在存储库的根目录下创建sagemaker_user_credentials.json
文件。但在替换新的 AWS 凭证之前,还要运行以下命令来创建执行角色(使用您的管理员凭证创建它)。
要创建 AWS SageMaker 用于代表我们访问其他 AWS 资源的 IAM 执行角色,请运行以下命令:
poetry poe create-sagemaker-execution-role
它将使用新的AWS_ARN_ROLE
值在存储库的根目录下创建sagemaker_execution_role.json
文件。将其添加到您的.env
文件中。
更新.env
文件中的AWS_ACCESS_KEY
、 AWS_SECRET_KEY
和AWS_ARN_ROLE
值后,您就可以使用 AWS SageMaker。请注意,此步骤对于完成 AWS 设置至关重要。
我们通过运行以下命令来通过 ZenML 启动训练管道:
poetry poe run-training-pipeline
这将直接在 SageMaker 中使用configs/training.yaml
中的配置启动训练代码。您可以在 Comet ML 的仪表板中可视化结果。
我们通过运行以下命令来通过 ZenML 启动评估管道:
poetry poe run-evaluation-pipeline
这将直接在 SageMaker 中使用configs/evaluating.yaml
中的配置启动评估代码。您可以在保存到 Hugging Face 配置文件的*-results
数据集中可视化结果。
要创建 AWS SageMaker 推理终端节点,请运行:
poetry poe deploy-inference-endpoint
要测试它,请运行:
poetry poe test-sagemaker-endpoint
要删除它,请运行:
poetry poe delete-inference-endpoint
利用 ZenML 的部署功能将 ML 管道、工件和容器部署到 AWS。因此,您必须使用 ZenML Cloud 创建一个帐户,并按照他们的指南将 ZenML 堆栈部署到 AWS。否则,我们将在第 11 章“将 LLM Twin 的管道部署到云”部分中提供有关您必须执行的操作的分步说明。
在部署项目时,我们利用 Qdrant 和 MongoDB 的无服务器选项。因此,您可以遵循 Qdrant 和 MongoDB 的教程,了解如何为每个集群创建免费增值集群,也可以阅读第 11 章,将 LLM Twin 的管道部署到云部分,并按照我们的分步说明进行操作。
我们使用 GitHub Actions 来实现 CI/CD 管道。要实现您自己的,您必须分叉我们的存储库,并将以下环境变量设置为分叉存储库中的操作机密:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_ECR_NAME
AWS_REGION
此外,我们在第 11 章“将 LLMOps 添加到 LLM Twin”部分中提供了有关如何设置所有内容的说明。
如果您创建 Comet 帐户并正确设置COMET_API_KEY
环境变量,则可以在其自托管仪表板上可视化结果。由于 Opik 由 Comet 提供支持,因此您无需沿 Comet 设置任何其他内容:
所有 ML 管道都将由 ZenML 在幕后精心编排。运行实用程序脚本时存在一些例外情况,例如从数据仓库导出或导入。
ZenML 管道是整个项目中大多数流程的入口点。它们位于pipelines/
文件夹下。因此,当您想要理解或调试工作流程时,从 ZenML 管道开始是最好的方法。
要查看正在运行的管道及其结果:
Pipelines
部分feature_engineering
)feature_engineering_run_2024_06_20_18_40_24
)现在,让我们探索您可以运行的所有管道。从数据收集到培训,我们将按照自然顺序呈现它们,以端到端地完成法学硕士项目。
运行数据收集ETL:
poetry poe run-digital-data-etl
警告
您必须在系统上安装 Chrome(或其他基于 Chromium 的浏览器),LinkedIn 和 Medium 爬虫才能工作(在后台使用 Selenium)。根据您的 Chrome 版本,Chromedriver 将自动安装以启用 Selenium 支持。如果您不想安装 Chrome,另一种选择是使用我们的 Docker 映像运行所有内容。例如,要运行组合的所有管道,您可以运行poetry poe run-docker-end-to-end-data-pipeline
。请注意,可以调整该命令以支持任何其他管道。
如果由于任何其他原因,您没有安装基于 Chromium 的浏览器并且不想使用 Docker,那么您还有另外两个选项来绕过此 Selenium 问题:
chromedriver_autoinstaller.install()
命令以及其他检查 Chrome 驱动程序的静态调用和硒。要添加其他链接以从中收集,请转到configs/digital_data_etl_[author_name].yaml
并将它们添加到links
字段。此外,您还可以创建一个全新的文件并在运行时指定它,如下所示: python -m llm_engineering.interfaces.orchestrator.run --run-etl --etl-config-filename configs/digital_data_etl_[your_name].yaml
运行特征工程管道:
poetry poe run-feature-engineering-pipeline
生成指令数据集:
poetry poe run-generate-instruct-datasets-pipeline
生成偏好数据集:
poetry poe run-generate-preference-datasets-pipeline
将以上所有内容压缩到单个管道中运行:
poetry poe run-end-to-end-data-pipeline
将数据从数据仓库导出到 JSON 文件:
poetry poe run-export-data-warehouse-to-json
从 JSON 文件导入数据到数据仓库(默认从data/data_warehouse_raw_data
目录导入数据):
poetry poe run-import-data-warehouse-from-json
将 ZenML 工件导出为 JSON:
poetry poe run-export-artifact-to-json-pipeline
这会将以下 ZenML 工件作为 JSON 文件导出到output
文件夹(它将采用最新版本):
您可以通过调整configs/export_artifact_to_json.yaml
配置文件来配置要导出的工件。
运行训练管道:
poetry poe run-training-pipeline
运行评估管道:
poetry poe run-evaluation-pipeline
警告
为此,请确保您按照设置云基础设施(用于生产)中所述正确配置 AWS SageMaker。
使用测试查询调用 RAG 检索模块:
poetry poe call-rag-retrieval-module
启动实时推理RESTful API:
poetry poe run-inference-ml-service
使用测试查询调用推理实时 RESTful API:
poetry poe call-inference-ml-service
请记住,您可以在 Opik 上监控提示痕迹。
警告
为了使推理服务正常工作,您必须将 LLM 微服务部署到 AWS SageMaker,如设置云基础设施部分中所述。
检查或修复您的 linting 问题:
poetry poe lint-check
poetry poe lint-fix
检查或修复您的格式问题:
poetry poe format-check
poetry poe format-fix
检查代码是否泄露凭据:
poetry poe gitleaks-check
使用以下命令运行所有测试:
poetry poe test
根据上述设置和使用步骤,假设本地和云基础设施正常运行并且.env
按预期填充,请按照以下步骤端到端运行 LLM 系统:
收集数据: poetry poe run-digital-data-etl
计算特征: poetry poe run-feature-engineering-pipeline
计算指令数据集: poetry poe run-generate-instruct-datasets-pipeline
计算偏好对齐数据集: poetry poe run-generate-preference-datasets-pipeline
重要的
从现在开始,为了使这些步骤发挥作用,您需要正确设置 AWS SageMaker,例如运行poetry install --with aws
并填写与 AWS 相关的环境变量和配置。
SFT 微调 Llamma 3.1: poetry poe run-training-pipeline
对于 DPO,转到configs/training.yaml
,将finetuning_type
更改为dpo
,然后再次运行poetry poe run-training-pipeline
评估微调模型: poetry poe run-evaluation-pipeline
重要的
从现在开始,为了使这些步骤发挥作用,您需要正确设置 AWS SageMaker,例如运行poetry install --with aws
并填写与 AWS 相关的环境变量和配置。
仅调用 RAG 检索模块: poetry poe call-rag-retrieval-module
将 LLM Twin 微服务部署到 SageMaker: poetry poe deploy-inference-endpoint
测试 LLM Twin 微服务: poetry poe test-sagemaker-endpoint
启动端到端RAG服务器: poetry poe run-inference-ml-service
测试 RAG 服务器: poetry poe call-inference-ml-service
本课程是根据 MIT 许可证发布的开源项目。因此,只要您分发我们的许可证并认可我们的工作,您就可以安全地克隆或分叉该项目,并将其用作您想要的任何内容的灵感来源(例如,大学项目、大学学位项目、个人项目等)。