向量数据库上传 (VDB Upload) 管线
所有环境都需要额外的 Conda 包,可以使用 conda/environments/all_cuda-125_arch-x86_64.yaml
或 conda/environments/examples_cuda-125_arch-x86_64.yaml
环境文件安装。
环境 |
支持 |
注释 |
---|---|---|
Conda | ✔ | |
Morpheus Docker 容器 | ✔ | 需要在主机上启动 Triton 和 Milvus |
Morpheus Release 容器 | ✔ | 需要在主机上启动 Triton 和 Milvus |
Dev 容器 | ✘ |
目的
此示例的主要目标是演示如何构建执行以下任务的管线
接受文档集合。
将文档分成更小的片段或块。
计算每个文本块的嵌入向量。
将文本块及其关联的嵌入上传到向量数据库 (VDB)。
源文档
该管线旨在处理来自各种文档类型的基于文本的输入。可能的用例可能包括 PDF 等结构化文档、网页等动态源以及未来通过光学字符识别 (OCR) 集成实现的基于图像的文档。
对于此演示,源文档来自 RSS 订阅源和 Web 抓取工具的结合。选择背后的理由包括
模拟实际的网络安全场景:网络安全 RSS 订阅源可以作为全面的知识库的基础,例如安全聊天机器人。
最大限度地减少外部依赖性:依赖 RSS 订阅源和 Web 抓取避免了对专用数据集或 API 密钥的需求。
嵌入模型
该管线可以容纳各种嵌入模型,这些模型将文本转换为浮点数向量。已经评估了来自 Hugging Face 的多个模型(例如
paraphrase-multilingual-mpnet-base-v2
、e5-large-v2
和all-mpnet-base-v2
)的兼容性。出于演示目的,采用了
all-MiniLM-L6-v2
模型。此模型通过 LFS 包含在此存储库中,并且因其效率和紧凑性而被选中,其特点是嵌入维度较小,为 384。
向量数据库服务
该架构与用于存储嵌入及其元数据的向量数据库 (VDB) 的选择无关。虽然目前的实现由于其 GPU 加速索引而采用了 Milvus,但如果需要,该设计支持轻松与其他数据库(如 Chroma 或 FAISS)集成。
实施细节
该管线由三个主要组件组成
文档源处理程序:此组件负责获取和预处理文本数据。鉴于在此示例中我们使用 RSS 订阅源和 Web 抓取工具,处理程序的功能是从订阅源中获取最新更新,执行初步数据清理,并标准化格式以供后续步骤使用。
嵌入生成器:这是管线的核心,它接收预处理后的文本块并计算其嵌入。利用 Hugging Face 的
all-MiniLM-L6-v2
模型,文本数据被转换为维度为 384 的嵌入。向量数据库上传器:在嵌入生成之后,此模块接收嵌入及其关联的元数据,并将它们推送到向量数据库 (VDB)。对于我们的实现,选择了 GPU 加速向量数据库 Milvus。
设计决策背后的理由
特定组件和模型的选择受到以下几个因素的影响
文档源选择:RSS 订阅源和 Web 抓取提供了动态且持续更新的数据源。对于构建网络安全知识库的用例,实时信息获取是一个合理的选择。
嵌入模型选择:选择
all-MiniLM-L6-v2
是因为它在生成嵌入方面的效率。其较小的维度确保了快速计算,而不会影响嵌入的质量。向量数据库:出于此管线的目的,选择 Milvus 是因为它的普及性、易用性和可用性。
先决条件
在运行管线之前,我们需要确保以下服务正在运行
确保 LFS 文件已下载
要从 LFS 检索数据集,请运行以下命令
./scripts/fetch_data.py fetch examples
Milvus 服务
有关运行 Milvus 的更多详细信息,请参阅 Milvus 文档。为了测试管线,我们将启动 Milvus Lite 的实例。
从 Morpheus 存储库的根目录,运行以下命令以在单独的终端中启动 Milvus
mkdir -p .tmp/milvusdb
milvus-server --data .tmp/milvusdb
Triton 服务
拉取 Triton 的 Docker 镜像
docker pull nvcr.io/nvidia/morpheus/morpheus-tritonserver-models:24.10
运行以下命令以启动 Triton 并加载
all-MiniLM-L6-v2
模型docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 nvcr.io/nvidia/morpheus/morpheus-tritonserver-models:24.10 tritonserver --model-repository=/models/triton-model-repo --exit-on-error=false --model-control-mode=explicit --load-model all-MiniLM-L6-v2
这将启动 Triton 并且仅加载
all-MiniLM-L6-v2
模型。Triton 加载模型后,将显示以下内容+------------------+---------+--------+ | Model | Version | Status | +------------------+---------+--------+ | all-MiniLM-L6-v2 | 1 | READY | +------------------+---------+--------+
运行 Morpheus 管线
每个 LLM 示例管线的顶层入口点是 examples/llm/main.py。此脚本接受一组选项和一个要运行的管线。对于本文档,我们将重点关注 vdb_upload
管线选项,该选项包含各种功能,例如处理 RSS 和文件系统源、嵌入配置以及向量数据库 (VDB) 设置。
配置平衡注意事项
配置 Morpheus 管线时,特别是对于 RSS 源和向量数据库上传等阶段,平衡响应性和性能非常重要。
RSS 源阶段:RSS 源阶段负责生成要处理的网页链接。此阶段的较大批处理大小可能会导致响应性降低,因为后续的 Web 抓取工具阶段可能需要相当长的时间来检索和处理每个批处理中的所有项目。为了确保为用户提供响应迅速的体验,建议将 RSS 源阶段配置为相对较小的批处理大小。此调整对整体性能的影响往往很小,但可以显着缩短处理每批链接的时间。
向量数据库上传阶段:在管线的另一端,向量数据库上传阶段有其自身的考虑因素。此阶段会遇到大量的事务开销。为了缓解这种情况,建议将此阶段配置为尽可能大的批处理大小。这种方法有助于有效管理事务开销并提高管线的吞吐量,尤其是在处理大量数据时。
平衡这些配置可确保管线高效运行,在 RSS 源阶段优化响应性,并在向量数据库上传阶段提高吞吐量。
运行示例
默认示例用法,带有预定义的 RSS 源
python examples/llm/main.py vdb_upload pipeline \
--enable_cache \
--enable_monitors \
--embedding_model_name all-MiniLM-L6-v2
使用 CLI 定义的源
示例:通过 CLI 定义 RSS 源
python examples/llm/main.py vdb_upload pipeline \
--source_type rss \
--interval_secs 300 \
--rss_request_timeout_sec 5.0 \
--enable_cache \
--enable_monitors \
--embedding_model_name all-MiniLM-L6-v2
示例:通过 CLI 定义文件系统源
python examples/llm/main.py vdb_upload pipeline \
--source_type filesystem \
--file_source="./examples/data/vdb_upload/*.jsonlines" \
--enable_monitors \
--embedding_model_name all-MiniLM-L6-v2
示例:通过 CLI 组合 RSS 和文件系统源
python examples/llm/main.py vdb_upload pipeline \
--source_type rss --source_type filesystem \
--file_source="./examples/data/vdb_upload/*.jsonlines" \
--interval_secs 600 \
--enable_cache \
--enable_monitors \
--embedding_model_name all-MiniLM-L6-v2
vdb_upload
命令有自己的一组选项和命令
命令
export-triton-model
langchain
pipeline
从 Hugging Face 导出和部署不同的模型
如果您希望将来自 Hugging Face 的不同嵌入模型合并到管线中,请按照以下步骤操作,以 sentence-transformers/paraphrase-multilingual-mpnet-base-v2
为例
识别所需的模型:
前往 Hugging Face 模型中心 并搜索您想要的模型。在此示例中,我们正在查看
e5-large-v2
。
使用选定的模型运行管线调用:
使用您已识别的模型名称执行以下命令
python examples/llm/main.py vdb_upload export-triton-model --model_name \ sentence-transformers/paraphrase-multilingual-mpnet-base-v2 --triton_repo ./models/triton-model-repo
处理未经授权的错误:
请确保您提供正确的模型名称。一个常见的陷阱是遇到
unauthorized error
。如果您看到以下错误requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url:
这通常意味着您提供的模型名称与 Hugging Face 上提供的模型名称不匹配。请仔细检查模型名称,然后重试。
确认模型导出成功:
运行命令后,确保指定的
--triton_repo
目录现在包含正确格式的导出模型,可以进行部署。
$ ls ${MORPHEUS_ROOT}/models/triton-model-repo | grep paraphrase-multilingual-mpnet-base-v2 sentence-transformers/paraphrase-multilingual-mpnet-base-v2
部署模型:
重新加载 Docker 容器,指定我们还需要加载 paraphrase-multilingual-mpnet-base-v2
docker run --rm -ti --gpus=all -p8000:8000 -p8001:8001 -p8002:8002 \ nvcr.io/nvidia/morpheus/morpheus-tritonserver-models:24.10 tritonserver \ --model-repository=/models/triton-model-repo --exit-on-error=false --model-control-mode=explicit --load-model \ all-MiniLM-L6-v2 --load-model sentence-transformers/paraphrase-multilingual-mpnet-base-v2
您应该看到类似于以下内容,指示 Triton 已成功加载模型
+----------------------------------+------------------------------------------------------------------------------------------+ | Option | Value | +----------------------------------+------------------------------------------------------------------------------------------+ | server_id | triton | | server_version | 2.35.0 | | server_extensions | classification sequence model_repository ... schedule_policy | | model_repository_path[0] | /models/triton-model-repo | | model_control_mode | MODE_EXPLICIT | | startup_models_0 | all-MiniLM-L6-v2 | | startup_models_1 | sentence-transformers/paraphrase-multilingual-mpnet-base-v2 | | strict_model_config | 0 | | rate_limit | OFF | | pinned_memory_pool_byte_size | 268435456 | | cuda_memory_pool_byte_size{0} | 67108864 | | cuda_memory_pool_byte_size{1} | 67108864 | | min_supported_compute_capability | 6.0 | | strict_readiness | 1 | | exit_timeout | 30 | | cache_enabled | 0 | +----------------------------------+------------------------------------------------------------------------------------------+
更新管线调用:
现在模型已导出和部署,我们可以更新管线调用以使用新模型
python examples/llm/main.py vdb_upload pipeline --model_name \ sentence-transformers/paraphrase-multilingual-mpnet-base-v2
运行 LangChain 管线(可选)
可选的 LangChain 管线运行指南(如果适用)。
注意:默认情况下,此管线将连续重复轮询配置的 RSS 源。要运行固定次数的迭代,请添加 --stop_after=N
标志。