test/docs/metax_offline_deployment.md

235 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 沐曦 GPU 国产化离线部署指南
本文档用于沐曦/MetaX GPU 环境的编译、模型准备、离线包导出与目标机部署。
## 基础镜像原则
沐曦部署应使用沐曦官方或现场确认的 vLLM/MACA 基础镜像:
```bash
cr.metax-tech.com/public-ai-release/maca/vllm-metax:0.17.0-maca.ai3.5.3.307-torch2.8-py312-ubuntu22.04-amd64
```
该镜像负责提供 MACA 运行时、PyTorch、vLLM 与相关内核。本项目的 `Dockerfile.metax` 只叠加通用 Python 依赖和业务代码,不在 Dockerfile 内重新安装 vLLM,也不使用 uv 虚拟环境。
## 目录约定
目标机推荐统一使用以下宿主机目录:
```text
/opt/dep/asr/
models/
data/
logs/
temp/
tasks/
```
容器内默认挂载为:
```text
/app/models
/app/data
```
## 在线编译融合镜像
先按沐曦官网复制的命令登录并拉取基础镜像。账号、密码和 token 不要写入项目文件、`.env` 或离线包。
官网命令通常形如:
```bash
docker login --username=<沐曦账号> --password=<沐曦token> cr.metax-tech.com && \
docker pull cr.metax-tech.com/public-ai-release/maca/vllm-metax:0.17.0-maca.ai3.5.3.307-torch2.8-py312-ubuntu22.04-amd64
```
如果沐曦基础镜像是 tar 包,则改为先导入:
```bash
docker load -i metax-vllm-official.tar
docker images | grep -i -E 'metax|maca|vllm'
```
然后用完整官方镜像名构建融合镜像:
```bash
./scripts/package_vendor_gpu_image.sh \
--vendor metax \
--base-image cr.metax-tech.com/public-ai-release/maca/vllm-metax:0.17.0-maca.ai3.5.3.307-torch2.8-py312-ubuntu22.04-amd64 \
-v 0.17.0-maca.ai3.5.3.307
```
脚本会生成融合镜像:
```text
unis/qwen3-asr:metax-0.17.0-maca.ai3.5.3.307
```
并导出镜像归档到:
```text
build-file/qwen3-asr-metax-0.17.0-maca.ai3.5.3.307-amd64.tar.gz
```
## 单独准备模型
模型下载建议独立于业务服务执行。`download-models.sh` 是增量下载脚本,不会删除已有模型目录,也不依赖 uv。
在项目根目录或离线包目录执行:
```bash
./scripts/download-models.sh --models-dir /opt/dep/asr/models
```
如果本机没有 Python 依赖,但已经有融合镜像,可以用镜像内环境下载:
```bash
ASR_IMAGE=unis/qwen3-asr:metax-0.17.0-maca.ai3.5.3.307 \
./scripts/download-models.sh \
--mode docker \
--models-dir /opt/dep/asr/models
```
## 导出完整离线交付包
```bash
./export_offline_bundle.sh \
--type metax \
--metax-base cr.metax-tech.com/public-ai-release/maca/vllm-metax:0.17.0-maca.ai3.5.3.307-torch2.8-py312-ubuntu22.04-amd64 \
-v 0.17.0-maca.ai3.5.3.307
```
如果模型要单独准备,不希望离线包包含模型压缩包:
```bash
./export_offline_bundle.sh \
--type metax \
--metax-base cr.metax-tech.com/public-ai-release/maca/vllm-metax:0.17.0-maca.ai3.5.3.307-torch2.8-py312-ubuntu22.04-amd64 \
-v 0.17.0-maca.ai3.5.3.307 \
--skip-models
```
如果不指定 `-v`,脚本会使用当前时间戳作为版本号。
沐曦官方镜像内的 Python 默认使用 `/opt/conda/bin/python`。如果现场镜像路径不同,可额外指定:
```bash
./export_offline_bundle.sh \
--type metax \
--metax-base cr.metax-tech.com/public-ai-release/maca/vllm-metax:0.17.0-maca.ai3.5.3.307-torch2.8-py312-ubuntu22.04-amd64 \
--metax-python /path/to/python \
--skip-models
```
也可以先给官方长镜像名打一个本地短标签,再把短标签传给 `--metax-base`;这只是为了少复制长镜像名,不是必需步骤。
沐曦离线包只会包含沐曦专用启动文件:
```text
docker-compose-metax.yml
.env
.env.example
init_host_dirs.sh
download-models.sh
download_models_standalone.py
README.md
DEPLOYMENT.md
METAX_DEPLOYMENT.md
BUNDLE_INFO.txt
qwen3-asr-metax-*-amd64.tar.gz
```
不会要求使用通用 `docker-compose.yml`。
## 目标机离线部署
将整个离线包复制到目标机后,进入离线包目录:
```bash
chmod +x init_host_dirs.sh download-models.sh
./init_host_dirs.sh
```
导入镜像:
```bash
gunzip -c qwen3-asr-metax-0.17.0-maca.ai3.5.3.307-amd64.tar.gz | docker load
```
确认 `.env` 中的镜像名与导入镜像一致:
```env
ASR_IMAGE=unis/qwen3-asr:metax-0.17.0-maca.ai3.5.3.307
```
按需设置显卡与 vLLM 显存比例:
```env
METAX_VISIBLE_DEVICES=0
MACA_VISIBLE_DEVICES=0
MX_VISIBLE_DEVICES=0
QWEN_GPU_MEMORY_UTILIZATION=0.25
QWEN_VLLM_ENFORCE_EAGER=true
```
启动服务:
```bash
docker compose -f docker-compose-metax.yml up -d
```
查看状态与日志:
```bash
docker compose -f docker-compose-metax.yml ps
docker compose -f docker-compose-metax.yml logs -f
```
服务默认端口:
```text
http://<目标机IP>:17003
```
## 沐曦与天数的差异
- 沐曦使用 `Dockerfile.metax` 和 `docker-compose-metax.yml`
- 天数使用 `Dockerfile.iluvatar` 和 `docker-compose-iluvatar.yml`
- 沐曦目标机需要可访问宿主 `/dev` 与 `/opt/mxdriver`
- 沐曦 compose 使用 host network、host pid/ipc、privileged,并挂载 `/dev` 与 `/opt/mxdriver`
- 天数 compose 同样使用 host network、host pid/ipc、privileged 和宿主机设备/驱动目录挂载
## 常见问题
### 为什么不用 uv?
沐曦 Docker 镜像内推荐直接使用系统 Python 环境。`Dockerfile.metax` 使用:
```bash
python3 -m pip install --no-cache-dir -r environments/metax/requirements.txt
```
不创建 uv 虚拟环境,也不在镜像内运行 `uv pip install`。
### 为什么不重新安装 vLLM?
国产 GPU 的 vLLM、PyTorch、内核和运行时通常需要严格匹配厂商镜像。项目层重新 `pip install vllm` 容易解析到 PyPI/NVIDIA CUDA 依赖,破坏沐曦官方镜像里的匹配关系。
### `QWEN_GPU_MEMORY_UTILIZATION` 为什么没生效?
变量必须进入容器才会生效。沐曦 compose 中需要有:
```yaml
QWEN_GPU_MEMORY_UTILIZATION: ${QWEN_GPU_MEMORY_UTILIZATION:-}
QWEN_VLLM_ENFORCE_EAGER: ${QWEN_VLLM_ENFORCE_EAGER:-true}
```
然后在 `.env` 设置:
```env
QWEN_GPU_MEMORY_UTILIZATION=0.25
QWEN_VLLM_ENFORCE_EAGER=true
```
修改 `.env` 后必须 `down` 再 `up -d`。