共计 2163 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在企业内网或网络受限环境中部署 AI 基础设施时,开发者常遇到以下典型问题:

- 依赖地狱:Chroma 依赖的 PyTorch/TensorFlow 等库存在严格的 CUDA 版本绑定,离线环境无法自动下载匹配版本
- 隐式依赖缺失 :如
libcuda.so等系统级依赖不会通过 pip 报错,直到运行时才暴露问题 - 编译工具链不完整:部分数据库后端需要 g ++/cmake 等工具现场编译,内网机器可能缺少基础开发环境
技术方案对比
针对不同离线场景,主流方案对比如下:
| 方案 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| pip 离线包 | 简单 Python 环境 | 轻量级,兼容性好 | 需手动解决系统依赖 |
| conda-pack | 复杂科学计算环境 | 包含二进制依赖 | 镜像体积较大(>1GB) |
| Docker 镜像 | 需要环境隔离的生产部署 | 一次构建处处运行 | 需要宿主机 docker daemon 支持 |
核心实现步骤
1. 构建离线依赖包
在联网机器执行(以 Linux 为例):
# 创建依赖目录
mkdir chroma_deps && cd chroma_deps
# 下载主包及依赖
pip download chromadb \
--platform manylinux2014_x86_64 \
--python-version 3.8 \
--only-binary=:all:
Windows 需移除 --platform 参数:
pip download chromadb --python-version 3.8
2. 离线安装脚本
带自动重试的安装脚本示例(Python 3.8+):
import subprocess
from typing import List
import time
def install_offline(packages_dir: str, max_retries: int = 3) -> bool:
"""离线安装 pip 包带重试机制"""
retry_count = 0
while retry_count < max_retries:
try:
cmd = [
"pip", "install",
"--no-index",
"--find-links", packages_dir,
"chromadb"
]
subprocess.run(cmd, check=True)
return True
except subprocess.CalledProcessError as e:
retry_count += 1
print(f"安装失败,正在重试({retry_count}/{max_retries})")
time.sleep(5)
return False
3. 关键配置项
在 ~/.chroma/config.yml 中需特别注意:
chroma_db_impl: duckdb+parquet # 避免使用需要编译的 clickhouse
persist_directory: /data/chroma # 确保有写入权限
避坑指南
常见错误解决方案
- libcuda.so not found
- 原因:NVIDIA 驱动未正确安装
-
解决:
# 检查驱动版本 nvidia-smi # 安装对应 CUDA Toolkit sudo apt install cuda-11-7 -
内存不足
- 临时增加 SWAP 空间:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
验证方案
功能测试
import chromadb
def test_chroma():
client = chromadb.Client()
collection = client.create_collection("test")
collection.add(documents=["Hello world"],
ids=["id1"]
)
results = collection.query(query_texts=["world"])
assert len(results["documents"][0]) > 0
压力测试脚本
import concurrent.futures
from chromadb.utils.embedding_functions import DefaultEmbeddingFunction
def stress_test():
embed_fn = DefaultEmbeddingFunction()
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = [
executor.submit(
lambda: collection.add(ids=[f"id_{i}"],
embeddings=embed_fn([f"text_{i}"])
)
) for i in range(1000)
]
concurrent.futures.wait(futures)
延伸思考
离线环境下的升级策略建议:
- 版本冻结 :通过
pip freeze > requirements.txt严格锁定所有依赖版本 - 增量更新:只下载新增依赖包(使用
pip download --no-deps) - 回滚机制:保留旧版本的所有依赖包
参考资源
通过这套方案,我们成功在某金融机构内网部署了 Chroma 服务,环境搭建时间从原来的 3 天缩短到 2 小时。关键点在于提前下载完整依赖树和准备好系统级工具链。
正文完
发表至: 未分类
近一天内
