# 沐曦 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`。