# TEI 服务（Qwen3-Embedding-0.6B）说明

> 本文是本仓库 TEI（Text Embeddings Inference）专项运行手册。目标是让新同事在一台新机器上可以独立完成环境准备、部署、验收与排障。

## 1. 作用与边界

- TEI 提供文本向量 HTTP 服务（默认 `http://127.0.0.1:8080`）。
- 本项目中文本 embedding 服务（默认 `6005`）把文本向量请求转发到 TEI。
- TEI 仅负责文本向量，不负责图片向量（图片向量由 `cnclip` 提供）。

## 2. 代码与脚本入口

- 启动脚本：`scripts/start_tei_service.sh`
- 停止脚本：`scripts/stop_tei_service.sh`
- 统一编排：`scripts/service_ctl.sh`
- 文本 embedding 服务启动脚本（会校验 TEI 健康）：`scripts/start_embedding_text_service.sh`

## 3. 前置条件

### 3.1 必需软件

- Docker（必须）
- curl（用于健康检查与接口验收）

### 3.2 GPU 模式额外要求（推荐生产）

- NVIDIA 驱动可用（`nvidia-smi` 可执行）
- Docker 已配置 `nvidia` runtime（`docker info` 能看到 `nvidia`）

检查命令：

```bash
docker --version
docker info --format '{{json .Runtimes}}'
nvidia-smi
```

## 4. 安装与准备（可复现）

### 4.1 拉取代码并进入项目

```bash
cd /data/saas-search
```

### 4.2 （仅 GPU 模式）配置 Docker GPU runtime

如果 `docker info` 中没有 `nvidia` runtime，先按机器环境安装 `nvidia-container-toolkit` 并执行：

```bash
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
```

再次确认：

```bash
docker info --format '{{json .Runtimes}}'
```

## 5. 启动方式

### 5.1 GPU 模式启动（默认）

```bash
TEI_DEVICE=cuda ./scripts/start_tei_service.sh
```

预期输出包含：

- `Image: ghcr.io/huggingface/text-embeddings-inference:turing-...` 或 `cuda-...`（脚本按 GPU 架构自动选择）
- `Mode: cuda`
- `TEI is ready and output probe passed: http://127.0.0.1:8080`

说明：
- T4（compute capability 7.5）会自动使用 `turing-*` 镜像。
- Ampere 及更新架构（compute capability >= 8）会自动使用 `cuda-*` 镜像。

### 5.2 CPU 模式启动（显式）

```bash
TEI_DEVICE=cpu ./scripts/start_tei_service.sh
```

预期输出包含：

- `Image: ghcr.io/huggingface/text-embeddings-inference:1.9`（非 `cuda-`）
- `Mode: cpu`
- `TEI is ready and output probe passed: http://127.0.0.1:8080`

### 5.3 停止服务

```bash
./scripts/stop_tei_service.sh
```

## 6. 验收步骤（必须做）

### 6.1 健康检查

```bash
curl -sS http://127.0.0.1:8080/health
```

### 6.2 向量接口检查

```bash
curl -sS http://127.0.0.1:8080/embed \
  -H "Content-Type: application/json" \
  -d '{"inputs":["Instruct: Given a shopping query, rank product titles by relevance\nQuery: What is the capital of China?"]}'
```

返回应为二维数组（每条输入对应一个向量）。

建议再连续请求一次，确认不是“首个请求正常，后续返回 null/NaN”。

### 6.3 与 embedding 服务联调

```bash
./scripts/start_embedding_text_service.sh

curl -sS -X POST "http://127.0.0.1:6005/embed/text" \
  -H "Content-Type: application/json" \
  -d '["芭比娃娃 儿童玩具"]'
```

返回应为 1024 维向量数组。

### 6.4 运行建议（单服务兼顾在线与索引）

- 在线 query（低延迟优先）：客户端建议 `batch=1~4`
- 索引构建（吞吐优先）：客户端建议 `batch=15~20`

## 7. 配置项（环境变量）

`scripts/start_tei_service.sh` 支持下列变量：

- `TEI_DEVICE`：`cuda/cpu`，默认 `cuda`
- `TEI_CONTAINER_NAME`：容器名，默认 `saas-search-tei`
- `TEI_PORT`：宿主机端口，默认 `8080`
- `TEI_MODEL_ID`：默认 `Qwen/Qwen3-Embedding-0.6B`
- `TEI_VERSION`：镜像版本，默认 `1.9`
- `TEI_DTYPE`：默认 `float16`
- `TEI_MAX_BATCH_TOKENS`：默认 `4096`
- `TEI_MAX_CLIENT_BATCH_SIZE`：默认 `24`
- `HF_CACHE_DIR`：HF 缓存目录，默认 `$HOME/.cache/huggingface`
- `HF_TOKEN`：可选，避免匿名限速
- `TEI_IMAGE`：可选，手动指定镜像（通常不需要，建议使用脚本自动选择）

## 8. service_ctl 使用方式

启动全套（含 TEI）：

```bash
TEI_DEVICE=cuda ./scripts/service_ctl.sh start tei cnclip embedding embedding-image translator reranker
```

仅启动 TEI：

```bash
./scripts/service_ctl.sh start tei
```

查看状态：

```bash
./scripts/service_ctl.sh status tei
```

日志文件：`logs/tei.log`

## 9. 常见问题与排障

### 9.1 `ERROR: TEI_DEVICE=cuda but Docker nvidia runtime is not configured`

- 原因：Docker 未配置 NVIDIA runtime。
- 处理：按本文 4.2 配置后重启 Docker。

### 9.2 `mode mismatch (need GPU/CPU)`

- 原因：已有同名容器在另一种模式运行（比如当前是 GPU 容器，但你这次要求 CPU）。
- 处理：

```bash
./scripts/stop_tei_service.sh
TEI_DEVICE=cpu ./scripts/start_tei_service.sh   # 或改为 cuda
```

### 9.3 embedding 服务报 TEI 不可达

- 先检查 TEI：

```bash
curl -sS http://127.0.0.1:8080/health
```

- 再检查 embedding 侧地址：
  - `TEI_BASE_URL`
  - `services.embedding.backends.tei.base_url`（`config/config.yaml`）

### 9.4 `/embed/text` 第二次请求开始出现 NaN/null

- 常见原因：在 T4 这类 pre-Ampere GPU 上误用了 `cuda-*` TEI 镜像。
- 处理：

```bash
./scripts/start_tei_service.sh
```

该脚本会自动按 GPU 架构选择镜像，并在启动后做两次输出探测；若发现 `null/NaN/Inf` 会直接失败并清理错误容器。

## 10. 相关文档

- 开发总览：`docs/QUICKSTART.md`
- 体系规范：`docs/DEVELOPER_GUIDE.md`
- embedding 模块：`embeddings/README.md`
- CN-CLIP 专项：`docs/CNCLIP_SERVICE说明文档.md`
