docs: 新增离线部署导入镜像说明 + 更新功能特性
README: - 新增「离线部署(导入预构建镜像)」章节:docker load + 启动命令 - 功能特性更新:设置页、任务删除、进度细分、离线运行、/docs 公开 docs/DOCKER.md: - 新增「导入预构建镜像(离线部署)」完整章节: 前置要求、导出步骤、需拷贝文件清单、导入启动命令、离线说明、后续更新代码 .gitignore: - 排除 *.tar(导出的镜像文件不入库)
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -19,3 +19,6 @@ logs/
|
||||
|
||||
# 测试数据与脚本(本地测试用,不入库)
|
||||
/test/
|
||||
|
||||
# 导出的 Docker 镜像 tar(太大,不入库)
|
||||
*.tar
|
||||
|
||||
38
README.md
38
README.md
@@ -15,11 +15,14 @@
|
||||
- **双语字幕**:英文在上、中文在下,亦可单独下载英文 / 中文字幕
|
||||
- **faster-whisper 转写**:词级时间戳,断句精确(取首末词时间戳)
|
||||
- **NLLB-200 英译中**:ASR 与翻译模型不共驻,翻译时独占显存跑大 batch
|
||||
- **任务状态机**:`queued → uploading → extracting → transcribing → segmenting → translating → done`
|
||||
- **设置页**:运行时调整 batch_size / beam_size,保存后对后续任务生效(DB 持久化)
|
||||
- **任务管理**:删除已完成/失败任务及其产物,进度条按批次细分
|
||||
- **任务状态机**:`queued -> uploading -> extracting -> transcribing -> segmenting -> translating -> done`
|
||||
- **实时日志页**:按级别分层(debug=详细子步骤 / info=阶段转换 / error=完整 traceback)
|
||||
- **定时缓存清理**:任务产物默认保留 7 天,超期连同 DB 记录一并删除
|
||||
- **SQLite 持久化**(自包含,无需外部 DB)
|
||||
- `/docs`(Swagger UI)受 Basic Auth 保护
|
||||
- **离线运行**:模型缓存就位后完全离线,无需访问 HuggingFace
|
||||
- `/docs`(Swagger UI)公开访问
|
||||
|
||||
---
|
||||
|
||||
@@ -115,6 +118,37 @@ AUDIO2TEXT_VARIANT=gpu ./setup.sh
|
||||
|
||||
---
|
||||
|
||||
## 离线部署(导入预构建镜像)
|
||||
|
||||
已有 `audio2text-gpu.tar` 镜像文件时,新机器无需构建,直接导入即可启动(仍需 NVIDIA 驱动 +
|
||||
nvidia container runtime + 模型缓存 `./models`):
|
||||
|
||||
```bash
|
||||
# 1. 导入镜像
|
||||
docker load -i audio2text-gpu.tar
|
||||
|
||||
# 2. 准备配置 + 数据目录
|
||||
mkdir -p data-gpu/uploads data-gpu/.work data-gpu/outputs models
|
||||
|
||||
# 3. 启动容器(config.gpu.yaml 需自行准备,或从项目仓库取)
|
||||
docker run -d --name audio2text-gpu \
|
||||
--gpus all \
|
||||
-p 8001:8000 \
|
||||
-v "$(pwd)/data-gpu:/data" \
|
||||
-v "$(pwd)/models:/models" \
|
||||
-v "$(pwd)/config.gpu.yaml:/app/config.yaml:ro" \
|
||||
--restart unless-stopped \
|
||||
audio2text:gpu
|
||||
```
|
||||
|
||||
> **模型缓存**:`./models` 目录需包含 Whisper `large-v3-turbo` + NLLB `distilled-1.3B` 权重
|
||||
> (约 5.5GB)。首次部署时从源机器拷贝 `models/` 目录,或联网用 `prefetch_models.sh` 预拉。
|
||||
> 镜像内置 `HF_HUB_OFFLINE=1`,模型就位后完全离线运行,无需访问 HuggingFace。
|
||||
|
||||
详细步骤见 [Docker 说明 - 导入预构建镜像](./docs/DOCKER.md#导入预构建镜像离线部署)。
|
||||
|
||||
---
|
||||
|
||||
## 入口
|
||||
|
||||
| 入口 | 地址 |
|
||||
|
||||
@@ -94,6 +94,94 @@ docker compose --profile cpu up -d --build # CPU 生产
|
||||
docker compose --profile gpu up -d --build # GPU 生产(需 nvidia runtime)
|
||||
```
|
||||
|
||||
### 导入预构建镜像(离线部署)
|
||||
|
||||
当目标机器无法访问 Docker Hub(或构建太慢)时,可在已构建好镜像的机器上导出 tar,
|
||||
拷到新机器导入,跳过整个构建过程。
|
||||
|
||||
#### 前置要求(新机器)
|
||||
|
||||
- **NVIDIA GPU 驱动**(宿主机)
|
||||
- **nvidia container runtime**(`nvidia-container-toolkit`)
|
||||
- Docker
|
||||
- `config.gpu.yaml` 配置文件(从项目仓库取,或自行编写)
|
||||
- 模型缓存 `./models` 目录(约 5.5GB,从源机器拷贝或联网预拉)
|
||||
|
||||
验证 GPU 可用:
|
||||
|
||||
```bash
|
||||
nvidia-smi # 宿主能看到 GPU
|
||||
docker run --rm --gpus all nvidia/cuda:12.1.0-runtime-ubuntu22.04 nvidia-smi
|
||||
```
|
||||
|
||||
#### 步骤 1:源机器导出镜像
|
||||
|
||||
```bash
|
||||
# 在已构建好 audio2text:gpu 镜像的机器上
|
||||
docker save -o audio2text-gpu.tar audio2text:gpu
|
||||
ls -lh audio2text-gpu.tar # ~4.3GB
|
||||
```
|
||||
|
||||
#### 步骤 2:拷贝到新机器
|
||||
|
||||
需要拷贝的文件:
|
||||
|
||||
| 文件/目录 | 大小 | 说明 |
|
||||
|---|---|---|
|
||||
| `audio2text-gpu.tar` | ~4.3GB | Docker 镜像(含 ffmpeg + torch + faster-whisper + transformers + app 代码) |
|
||||
| `config.gpu.yaml` | <1KB | GPU 配置文件 |
|
||||
| `models/` | ~5.5GB | 模型缓存(Whisper large-v3-turbo + NLLB distilled-1.3B 权重) |
|
||||
|
||||
> `models/` 可不拷贝,新机器联网时用 `prefetch_models.sh` 预拉。但离线部署必须拷贝。
|
||||
|
||||
```bash
|
||||
# 用 scp / rsync / U盘 等方式拷贝
|
||||
scp audio2text-gpu.tar config.gpu.yaml user@newhost:~/audio2text/
|
||||
rsync -avP models/ user@newhost:~/audio2text/models/
|
||||
```
|
||||
|
||||
#### 步骤 3:新机器导入并启动
|
||||
|
||||
```bash
|
||||
cd ~/audio2text
|
||||
|
||||
# 1. 导入镜像
|
||||
docker load -i audio2text-gpu.tar
|
||||
# 输出:Loaded image: audio2text:gpu
|
||||
|
||||
# 2. 准备数据目录
|
||||
mkdir -p data-gpu/uploads data-gpu/.work data-gpu/outputs
|
||||
|
||||
# 3. 启动容器
|
||||
docker run -d --name audio2text-gpu \
|
||||
--gpus all \
|
||||
-p 8001:8000 \
|
||||
-v "$(pwd)/data-gpu:/data" \
|
||||
-v "$(pwd)/models:/models" \
|
||||
-v "$(pwd)/config.gpu.yaml:/app/config.yaml:ro" \
|
||||
--restart unless-stopped \
|
||||
audio2text:gpu
|
||||
|
||||
# 4. 验证
|
||||
curl -s http://127.0.0.1:8001/health | python -m json.tool
|
||||
# 应见 cuda_available=true, gpu="NVIDIA GeForce RTX 3090"
|
||||
```
|
||||
|
||||
打开 `http://127.0.0.1:8001/` 即可使用。
|
||||
|
||||
#### 离线运行说明
|
||||
|
||||
镜像内置 `HF_HUB_OFFLINE=1` + `TRANSFORMERS_OFFLINE=1` 环境变量,模型缓存就位后
|
||||
**完全离线运行**,不会尝试访问 HuggingFace。这避免了离线环境下 transformers
|
||||
pipeline 因网络请求超时导致的翻译失败。
|
||||
|
||||
#### 后续更新代码
|
||||
|
||||
导入的镜像包含导出时的 app 代码。如需更新代码,有两个选择:
|
||||
|
||||
1. **重新构建**:把项目代码拷到新机器,`docker build --build-arg VARIANT=gpu -t audio2text:gpu .`
|
||||
2. **挂载源码**(临时调试):启动时加 `-v "$(pwd)/app:/app/app"` 覆盖镜像内代码
|
||||
|
||||
---
|
||||
|
||||
## 缓存分层与删除边界
|
||||
|
||||
Reference in New Issue
Block a user