ROMA / README-RTX6000.md
Houssem0's picture
Swap GH200 layer for Quadro RTX 6000 (Turing) Docker setup
b0734ca verified
|
Raw
History Blame Contribute Delete
4.68 kB
# Running ROMA reproducibly on Quadro RTX 6000 (×4)
This guide reproduces the **inference / real-time streaming demos** of
[ROMA (arXiv:2601.10323)](https://arxiv.org/abs/2601.10323) on a workstation with
**4× Quadro RTX 6000** (Turing, sm_75, x86_64, 24 GB each = 96 GB), driver 570.x / CUDA 12.8, using
Docker for reproducibility. It covers the **real-time proactive** demo (the Speak Head decides *when*
to respond), plus narration and reactive QA. See [ARCHITECTURE.md](ARCHITECTURE.md) for how ROMA works.
> Training and the full evaluation suite are **out of scope** for this image.
## Why a Turing-specific image?
The Quadro RTX 6000 is **Turing (sm_75)**, which changes three things vs. the repo's defaults:
| Repo default | Problem on Turing | This image |
|---|---|---|
| `attn_implementation="flash_attention_2"` | FlashAttention-2 needs Ampere (sm_80+) | defaults to **`sdpa`** (`ROMA_ATTN`) |
| `torch_dtype=torch.bfloat16` | bf16 not hardware-accelerated on Turing | defaults to **fp16** (`ROMA_DTYPE`) |
| `flash_attn==2.7.4.post1` in requirements | no sm_75 wheel; source build fails | **removed** from `requirements-rtx6000.txt` |
| single-GPU fp16 (~22 GB) | won't fit 24 GB + KV-cache | **sharded across all 4 GPUs** via `device_map="auto"` |
x86_64 means the original `+cu124` PyTorch wheels are valid, so this image stays close to the
upstream pins (unlike an ARM/GH200 build). We base on `nvidia/cuda:12.4.1-cudnn-runtime` and install
**official cu124 PyTorch wheels**, which include Turing kernels.
## Prerequisites
- NVIDIA driver (present: 570.195.03) + **NVIDIA Container Toolkit**.
Verify: `docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi` lists all 4 cards.
- Docker with Compose v2, ~40 GB free disk (image + checkpoint).
- Network access to `pypi.org`, `download.pytorch.org`, `github.com`, `huggingface.co`.
## 1. Build
```bash
git clone <your-repo-url> ROMA && cd ROMA
docker compose -f docker/docker-rtx6000/docker-compose.yml build
```
## 2. Start an interactive container (all 4 GPUs)
```bash
docker compose -f docker/docker-rtx6000/docker-compose.yml run --rm --service-ports roma bash
```
The checkpoint, HF cache and demo media are bind-mounted to the host (`./whole_model`, `./hf_cache`,
`./demo_media`) so they persist across runs.
## 3. Download the checkpoint (inside the container)
```bash
bash scripts/rtx6000/download_model.sh # -> whole_model/model (~16-22 GB)
```
(If the pull is rate-limited/gated, set `HF_TOKEN`.)
## 4. Run a real-time demo (inside the container)
```bash
bash scripts/rtx6000/run_demo.sh proactive # real-time proactive event alert (default)
# or
bash scripts/rtx6000/run_demo.sh narration # real-time streaming narration
bash scripts/rtx6000/run_demo.sh mme # reactive multimodal QA
```
Open **`http://<host>:7860`** and click **â–¶ Start Detection Stream**. ROMA streams its output live,
with the Speak Head triggering above its threshold.
### Using your own clips
```bash
ROMA_VIDEO=/app/demo_media/my_clip.mp4 \
ROMA_AUDIO=/app/demo_media/my_clip.wav \
bash scripts/rtx6000/run_demo.sh proactive
```
A bundled sample video: `gradio/aCkbw-aI4xU_cut80s.mp4` (the `narration` default).
## Smoke test (verify the environment)
Inside the container:
```bash
python -c "import torch; print(torch.__version__, torch.cuda.device_count(), torch.cuda.get_device_name(0), torch.cuda.get_device_capability(0))"
# expect: 2.6.0+cu124 4 'Quadro RTX 6000' (7, 5)
python -c "from transformers import Qwen2_5OmniModel; print('Qwen2_5OmniModel OK')"
```
While a demo runs, `nvidia-smi` should show the model **sharded across GPUs 0–3** (~5–6 GB each).
## Fallback matrix (env vars)
| Symptom | Try |
|---|---|
| `sdpa` rejected by the transformers fork | `ROMA_ATTN=eager bash scripts/rtx6000/run_demo.sh ...` |
| Gate probabilities print as `nan` (fp16 overflow) | `ROMA_DTYPE=bfloat16 ...` (bf16 runs in software on Turing — slower but safe) |
| `device_map="auto"` mis-places modules / cross-GPU error | run on one card with 8-bit: `CUDA_VISIBLE_DEVICES=0 ROMA_LOAD_8BIT=1 ...` |
| Want to free 3 GPUs for other work | `CUDA_VISIBLE_DEVICES=0 ROMA_LOAD_8BIT=1 ...` (fits ~10–12 GB on one card) |
| 8-bit load errors on the omni encoders | edit `llm_int8_skip_modules` in the demo loader, or set `ROMA_LOAD_8BIT=0` |
## Notes
- The demos only use `model.thinker`; the loader calls `disable_talker()` (best-effort) to free memory.
- `attn_implementation` and dtype are read from env at load time, so the same scripts also run with the
paper's original settings on an Ampere+ GPU: `ROMA_ATTN=flash_attention_2 ROMA_DTYPE=bfloat16`.