setup_cnclip_venv.sh
5.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
#
# 创建 CN-CLIP 服务专用虚拟环境(.venv-cnclip),用于隔离 clip-server 及其依赖
#(如 grpcio、jina、docarray 等),避免与主项目 .venv 的依赖冲突或构建失败。
#
# 使用方式:
# ./scripts/setup_cnclip_venv.sh
#
# 完成后,start_cnclip_service.sh 会自动优先使用 .venv-cnclip(若存在)。
#
set -e
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
VENV_DIR="${PROJECT_ROOT}/.venv-cnclip"
CLIP_SERVER="${PROJECT_ROOT}/third-party/clip-as-service/server"
TMP_DIR="${CNCLIP_PIP_TMPDIR:-${PROJECT_ROOT}/.tmp/cnclip-pip}"
echo "=========================================="
echo "CN-CLIP 专用环境 (.venv-cnclip)"
echo "=========================================="
echo ""
if [ ! -d "${CLIP_SERVER}" ]; then
echo "错误: 未找到 clip-as-service 服务目录: ${CLIP_SERVER}" >&2
exit 1
fi
mkdir -p "${TMP_DIR}"
export TMPDIR="${TMP_DIR}"
# 使用系统或当前默认的 python3 创建 venv(不依赖主项目 .venv)
if [ -d "${VENV_DIR}" ]; then
echo "已存在 .venv-cnclip,将复用并更新依赖。"
else
echo "创建虚拟环境: ${VENV_DIR}"
python3 -m venv "${VENV_DIR}"
fi
# 激活并升级基础工具。固定 setuptools<82,因 82 移除了 pkg_resources,而 jina/hubble 仍依赖它。
"${VENV_DIR}/bin/pip" install --no-cache-dir --upgrade pip wheel
"${VENV_DIR}/bin/pip" install --no-cache-dir 'setuptools>=66,<82'
# grpcio:jina 要求 <=1.68;1.57 在 Python 3.12 上无预编译 wheel(会触发源码构建与 pkg_resources 报错)。1.68.x 有 3.12 wheel,故先安装 1.68.x,避免后续安装 clip-server 时解析到 1.57。
echo "安装 grpcio(优先预编译 wheel,兼容 jina<=1.68)..."
if ! "${VENV_DIR}/bin/pip" install --no-cache-dir --only-binary=grpcio 'grpcio>=1.46.0,<=1.68.1' 2>/dev/null; then
echo "镜像无匹配 wheel,尝试 PyPI..."
if ! "${VENV_DIR}/bin/pip" install --no-cache-dir --only-binary=grpcio -i https://pypi.org/simple 'grpcio>=1.46.0,<=1.68.1' 2>/dev/null; then
echo "错误: 无法获取 grpcio 预编译包,请检查网络或使用 Python 3.10/3.11。" >&2
exit 1
fi
fi
# 安装 docarray==0.21(clip-server 要求)
echo "安装 docarray(clip-server 要求 0.21)..."
"${VENV_DIR}/bin/pip" install --no-cache-dir 'docarray==0.21.0'
# jina 3.27 声明 grpcio<=1.57,会触发源码构建;先装 grpcio 配套的 reflection/health 1.68(wheel),再以 --no-deps 装 jina,最后补齐 jina 的其余依赖(不包含 grpcio)
echo "安装 grpcio-reflection / grpcio-health-checking(与已装 grpcio 1.68 一致)..."
"${VENV_DIR}/bin/pip" install --no-cache-dir --only-binary=:all: 'grpcio-reflection>=1.46,<=1.68' 'grpcio-health-checking>=1.46,<=1.68' 2>/dev/null || "${VENV_DIR}/bin/pip" install --no-cache-dir 'grpcio-reflection>=1.46,<=1.68' 'grpcio-health-checking>=1.46,<=1.68'
echo "安装 jina(--no-deps,避免拉取 grpcio 1.57)..."
"${VENV_DIR}/bin/pip" install --no-cache-dir 'jina>=3.27,<3.28' --no-deps
# 补齐 jina 3.27 的运行时依赖(见 jina 的 install_requires,不含 grpcio)。
# 关键约束:
# - pydantic<2、opentelemetry-sdk<1.20、urllib3<2:与 jina 3.27 保持一致,减少 resolver 冲突告警
"${VENV_DIR}/bin/pip" install --no-cache-dir 'uvicorn[standard]<=0.23.1' 'fastapi>=0.76' 'protobuf>=3.19' 'pyyaml>=5.3' 'pydantic<2' 'prometheus_client>=0.12' 'aiofiles' 'opentelemetry-api>=1.12,<1.20' 'opentelemetry-sdk>=1.14,<1.20' 'opentelemetry-exporter-otlp>=1.12,<1.20' 'opentelemetry-instrumentation-grpc>=0.35' 'opentelemetry-instrumentation-fastapi>=0.33' 'opentelemetry-instrumentation-aiohttp-client>=0.33' 'opentelemetry-exporter-prometheus>=0.33b0' 'websockets' 'python-multipart' 'urllib3<2'
# 安装 CN-CLIP
echo "安装 cn-clip..."
"${VENV_DIR}/bin/pip" install --no-cache-dir cn-clip
# 安装 clip-server 以 --no-deps 方式,避免因 docarray==0.21 解析到旧 jina 并拉取 grpcio 1.57 源码构建。依赖由前面已装的 jina/grpcio/cn-clip 与下面显式安装补齐。
echo "安装 clip-server[cn_clip](--no-deps,再补齐依赖)..."
"${VENV_DIR}/bin/pip" install --no-cache-dir -e "${CLIP_SERVER}[cn_clip]" --no-deps
# clip-server 的 install_requires:ftfy, torch, regex, torchvision, jina, docarray, prometheus-client, open_clip_torch, pillow-avif-plugin;jina/cn_clip 已装;补齐 ftfy regex open_clip_torch pillow-avif-plugin(torch/torchvision 由 cn-clip 带入,prometheus_client 由 jina 带入)
"${VENV_DIR}/bin/pip" install --no-cache-dir 'ftfy' 'regex' 'open_clip_torch>=2.8.0,<2.9.0' 'pillow-avif-plugin'
# grpc_health 需要 protobuf 含 runtime_version(>=4);open_clip_torch 会拉低到 3.20,此处再升级
"${VENV_DIR}/bin/pip" install --no-cache-dir 'protobuf>=4,<6'
# jina 3.27 声明的可选依赖,clip 服务需用到
"${VENV_DIR}/bin/pip" install --no-cache-dir 'jcloud>=0.0.35'
echo ""
echo "=========================================="
echo "✓ .venv-cnclip 已就绪"
echo "=========================================="
echo "启动 CN-CLIP 服务时将自动使用此环境:"
echo " ./scripts/start_cnclip_service.sh"
echo "或:"
echo " ./scripts/service_ctl.sh start cnclip"
echo ""