CFD на GPU (OpenFOAM‑CUDA): сборки и I/O
Задача страницы. Дать инженерный каркас для запуска CFD‑кейсов на облачных GPU: как собирать/запускать OpenFOAM‑совместимые решатели с CUDA‑ускорением, как разбирать домен на подзадачи (MPI), какие требования к сети/дискам, как строить очереди для Interruptible, какие метрики наблюдать и как посчитать экономику (cells_per_s, Cost_per_million_cells). Страница — входная точка ветки CFD на GPU.
TL;DR
- GPU‑resident пайплайн: минимизируйте CPU↔GPU копии; переносите линейные решатели/операции на GPU; 1 MPI‑rank = 1 GPU.
- Масштабирование: внутри узла — NVLink/NVSwitch; межузловое — CUDA‑aware MPI + UCX/RDMA, низкий RTT, правильный pinning. См. https://cloudcompute.ru/solutions/multi-gpu/
- Мезги и I/O: генерация/конверсия сеток на «тёплом», рабочий scratch на NVMe (processor*/пишущие директории), collated‑I/O снижает число файлов. См. https://cloudcompute.ru/solutions/storage-data/
- Режимы: tightly‑coupled проды — On‑Demand; массовые свипы/варианты сеток — Interruptible с write‑интервалом ≤ 120 с (идемпотентные шаги). См. https://cloudcompute.ru/solutions/interruptible-patterns/
- Профили GPU: 24 ГБ (Compact) — малые сетки/свипы; 48 ГБ (Balanced) — база продакшена; 80 ГБ (HQ) — крупные сетки/много фаз/4K пост‑поля.
- Наблюдаемость: cells_per_s, iteration_time_seconds (p50/p95), residual_{p,U,k,eps}, gpu_utilization, mpi_wait_ratio, rdma_rx/tx_mb_s, io_write_mb_s. См. https://cloudcompute.ru/solutions/monitoring-logging/
- Экономика: Cost_per_million_cells = (c_gpu * N_nodes * gpus_per_node / U) / (cells_per_s / 1e6); учитывайте стоимость рестартов/хранилища. См. https://cloudcompute.ru/solutions/cost-planner/
- Практики: collated‑I/O, NVMe‑prefetch, pinned memory, CUDA‑aware MPI, processors/scotch декомпозиция, ограничение частоты writeInterval. См. https://cloudcompute.ru/solutions/performance-tuning/
Сценарии: когда это нужно
- Стационарные задачи (simpleFoam/аналог): устойчивые решатели, высокая доля линейной алгебры → отличный выигрыш на GPU.
- Неустойчивые (pisoFoam/pimpleFoam): много шагов по времени; важна стабильная сеть и предсказуемый I/O.
- Турбулентность/многофазность: большие объёмы полей; критично грамотное I/O и VRAM.
- Параметрические свипы: сетки, режимы обтекания, материалы → много независимых коротких прогонов (Interruptible идеально).
- Гибридные пайплайны: CFD → пост‑обработка/рендер/видео. См. https://cloudcompute.ru/solutions/rendering/ и https://cloudcompute.ru/solutions/rendering/video-transcode/
Архитектуры/пайплайны A) Одноузловой multi‑GPU (NVLink) — быстрый старт
[Warm Storage (case)] -> [Prefetch -> NVMe scratch] -> [decomposePar] -> [solver -parallel (GPU backends)]
| |
[processor*/] [write/funcObjects -> warm/cold]
Ключи: 1 MPI‑rank на 1 GPU; collated‑I/O, NVMe‑scratch для processor‑директорий; write‑интервал подобран под ≤ 120 с.
B) Многоузловой MPI + RDMA — плотный обмен
[Warm Storage] -> [Stager] -> [NVMe per node]
|
+-------------------+-------------------+
| (UCX/RDMA Interconnect) |
[Node #1 GPUxN] <=====> ... <=====> [Node #M GPUxN]
| |
srun/mpirun (CUDA-aware, 1 rank/GPU) [collated writer]
--------------> [Scheduler/Queue] <---/
Ключи: RDMA, bind ранков к NUMA, избегать «тонких» субдоменов (ухудшают отношение вычисления/коммуникации).
C) Свипы/варианты сеток (Interruptible)
[Mesh variants/Re] -> [Sharder] -> [Job Queue (chunk ≤120 s, retries)] -> [GPU Workers] -> [Reducer/QA] -> [Publish]
Ключи: write‑интервалы ≈ 60–120 с; идемпотентные шаги; сбор результатов после падов
Профили GPU/VRAM/ориентиры
| **Профиль** | **VRAM** | **Типовые кейсы CFD** | **Режим** | **Отн. throughput (≈)** | **Примечания** |
| **24 ГБ (Compact)** | 24 ГБ | Малые/средние сетки, свипы, однопазовые | On‑Demand / Interruptible | 1.0 | Отличен для массовых независимых прогонов |
| **48 ГБ (Balanced)** | 48 ГБ | Средние/крупные сетки, стационар/нестационар | Оба | 1.5–1.8 | Базовый профиль продакшена |
| **80 ГБ (HQ)** | 80 ГБ | Очень крупные сетки/много фаз/много полей | Оба | 2.2–2.6 | Возможен **MIG**‑шардинг для свипов: |
Оценки относительны; итог зависит от решателя, размера сетки и схем дискретизации.
Конфиги и скелеты
1) system/controlDict (runtime write и collated‑I/O)
/* system/controlDict */
application simpleFoam; // или pimpleFoam/pisoFoam
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 1000;
deltaT 1;
writeControl runtime;
writeInterval 60; // ≤ 120 c для устойчивых рестартов (Interruptible)
purgeWrite 3;
writeFormat binary;
writeCompression on;
functions
{
residuals
{
type residuals;
libs ("libutilityFunctionObjects.so");
fields (p U k epsilon);
writeControl timeStep;
writeInterval 10;
}
}
optimisationSwitches
{
fileHandler collated; // уменьшить количество файлов
}
2) system/fvSchemes (типовой GPU‑friendly)
/* system/fvSchemes */
ddtSchemes
{
default Euler;
}
divSchemes
{
div(phi,U) Gauss linearUpwind grad(U);
div(phi,k) Gauss upwind;
div(phi,epsilon) Gauss upwind;
div(phi,omega) Gauss upwind;
}
laplacianSchemes
{
default Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
3) system/fvSolution (линейные решатели, GPU‑бекенд)
/* system/fvSolution */
solvers
{
p
{
solver GAMG; // многосеточный
tolerance 1e-8;
relTol 0.01;
smoother DICGaussSeidel;
nCellsInCoarsestLevel 10;
device GPU; // использовать GPU-бекенд, если доступен
}
U
{
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-7;
relTol 0.1;
device GPU; // перенос на GPU
}
}
PISO
{
nCorrectors 2;
nNonOrthogonalCorrectors 0;
}
PIMPLE
{
nOuterCorrectors 2;
nCorrectors 1;
nNonOrthogonalCorrectors 0;
}
4) system/decomposeParDict (1 rank = 1 GPU)
/* system/decomposeParDict */
numberOfSubdomains 8; // = ranks = GPUs
method scotch;
distributed yes;
roots ( "node01:/nvme/case" "node02:/nvme/case" ); // при многоузловом запуске
5) Многоузловой запуск (Slurm + CUDA‑aware MPI/UCX)
#!/bin/bash
#SBATCH -J ofoam_gpu
#SBATCH -N 2
#SBATCH --gpus-per-node=4
#SBATCH -p gpu
#SBATCH -t 04:00:00
#SBATCH --exclusive
module load cuda mpi
# UCX/RDMA — адаптируйте под вашу сеть
export UCX_TLS=rc,ud,sm,self,gdr,cuda_copy,cuda_ipc
export UCX_NET_DEVICES=mlx5_0:1
# Подготовка
foamDictionary -entry optimisationSwitches/fileHandler -set collated system/controlDict
decomposePar -force
# Запуск решателя
srun --mpi=pmix_v3
simpleFoam -parallel -case /nvme/case > log.simpleFoam
# Сбор результатов
reconstructPar -latestTime
6) Docker/Compose — одноузловой воркер
services:
ofoam-worker:
image: registry.local/openfoam-gpu:latest
deploy:
resources:
reservations:
devices: [{ capabilities: ["gpu"] }]
volumes:
- /mnt/warm/case:/case
- /nvme:/nvme
command: >
bash -lc "
rsync -a /case/ /nvme/case/ &&
cd /nvme/case &&
decomposePar &&
mpirun -np 4 --bind-to numa --map-by ppr:1:gpu
simpleFoam -parallel &&
reconstructPar -latestTime"
environment:
- TMPDIR=/nvme/tmp
7) YAML‑спека очереди (универсально)
job:
name: "cfd_airfoil_re5e5_gpu"
mode: "on-demand" # on-demand | interruptible
nodes: 2
gpus_per_node: 4
gpu_profile: "48GB-Balanced"
network: "rdma"
io:
prefetch: ["/warm/cases/airfoil/"]
scratch: "/nvme/case"
write_interval_seconds: 60
run:
solver: "simpleFoam" # или pimpleFoam/pisoFoam
decompose:
method: "scotch"
ranks: 8
mpi:
enable: true
map_by: "ppr:1:gpu"
hooks:
on_start: ["python /scripts/prefetch.py"]
on_write: ["python /scripts/register_time.py"]
on_failure: ["python /scripts/requeue.py --backoff"]
``` **Наблюдаемость/метрики/алерты**
База:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com) и[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/?utm_source=chatgpt.com)
**Ключевые метрики CFD:**
- **Производительность:** cells\_per\_s, iterations\_per\_s, iteration\_time\_seconds (p50/p95), CourantNumber.
- **Сходимость:** residual\_p, residual\_Ux/Uy/Uz, residual\_k, residual\_epsilon (или другие).
- **GPU:** gpu\_utilization, gpu\_memory\_used\_bytes, sm\_occupancy, gpu\_power\_watts.
- **Сеть:** mpi\_wait\_ratio, rdma\_rx\_mb\_s, rdma\_tx\_mb\_s, allreduce\_time\_ms.
- **Диск/I‑O:** io\_read\_mb\_s, io\_write\_mb\_s, write\_seconds, nvme\_usage\_bytes, collated\_flush\_seconds.
- **Очередь:** job\_queue\_depth, tasks\_inflight, retry\_total.
**Алерты:**
- p95 iteration\_time\_seconds растёт > X% к эталону.
- mpi\_wait\_ratio > порога при низком gpu\_utilization → сетевое/распиновка ранков.
- write\_seconds > интервала → риск потери прогресса на **Interruptible**.
- gpu\_memory\_used\_bytes → VRAM‑предел → снизить поля/параллелизм/размер домена или перейти на 80 ГБ.
- Сходимость «застыла»: residual\_\* не снижается N итераций → QC/авто‑стоп.
## **Экономика и формулы**
См.[ https://cloudcompute.ru/solutions/cost-planner/](https://cloudcompute.ru/solutions/cost-planner/?utm_source=chatgpt.com) и <https://cloudcompute.ru/solutions/throughput-vs-latency/>
**Определения:**
Throughput\_cells\_per\_s = cells\_per\_s
Cost\_total = ((c\_gpu \* N\_nodes \* gpus\_per\_node) \* t\_run\_hours) / U \* r + Cost\_storage
Cost\_per\_million\_cells = (c\_gpu \* N\_nodes \* gpus\_per\_node / U) / (Throughput\_cells\_per\_s / 1e6)
Cost\_per\_case = Cost\_total
**Масштабирование:**
Speedup(N) = T1 / TN
Scale\_eff(N) = Speedup(N) / N
Выбирайте N, где Scale\_eff(N) остаётся приемлемой, а Cost\_per\_million\_cells — минимальной.
**Interruptible‑свип (K кейсов):**
Total\_cost = Σ\_i ( (c\_gpu \* t\_i / 3600) / U \* r\_i ) + Storage\_cost
## **Практики производительности**
- **1 rank = 1 GPU**, NUMA‑пиннинг, CUDA‑aware MPI, UCX с GDR; избегайте «узких» сабдоменов.
- **Collated‑I/O** + NVMe‑scratch: меньше файлов, быстрее запись/чтение, write‑behind в «тёплое».
- **Декомпозиция:** scotch/metis для баланса; processors — если известна форма домена.
- **Схемы:** bounded/лимитированные градиенты и upwind/linearUpwind — предсказуемая сходимость.
- **Память:** следите за числом полей/форматом (binary + compression), чистите временные директории.
- **Write‑интервалы:** ≤ 120 с для устойчивых рестартов; purgeWrite для контроля места.
- **Контейнеры:** фиксируйте версии решателей/библиотек/драйверов. См. <https://cloudcompute.ru/solutions/containers-ci-cd/>
**Безопасность/политики**
См.[ https://cloudcompute.ru/solutions/security/](https://cloudcompute.ru/solutions/security/?utm_source=chatgpt.com)
- **Данные/кейсы:** приватные сетки/геометрии в изолированных проектах; доступ по временным токенам; no‑list бакетов.
- **Секреты:** токены хранилищ/репозиториев — через секрет‑хранилище; не логировать.
- **Сеть:** egress по allow‑list; RDMA‑пулы изолированы; аудит подключений.
- **Ретеншн:** промежуточные processor\*/time автоочисткой; мастера/итоги — в «холодное».
- **Аудит:** кто запускал, какие версии/параметры/сетку публиковал.
**Траблшутинг (симптом → причина → решение)**
<table><tbody><tr><td>**Симптом**
</td><td>**Возможная причина**
</td><td>**Решение**
</td></tr><tr><td>Сходимость «стоит»
</td><td>Схемы/шаг по времени избыточны
</td><td>Уменьшить deltaT/усилить upwind/ограничители; проверить CourantNumber
</td></tr><tr><td>Взрыв остатков на старте
</td><td>Плохая сетка/качество
</td><td>Улучшить сетку/сгладить; проверить non‑orthogonality/скошенность
</td></tr><tr><td>Низкий gpu\_utilization, высокий mpi\_wait\_ratio
</td><td>Неудачная декомпозиция/нет RDMA
</td><td>SCOTCH/METIS, 1 rank/GPU, включить RDMA/UCX, NUMA‑пиннинг
</td></tr><tr><td>Письмо времени длится минуты
</td><td>Пишем на удалённое/много файлов
</td><td>Collated‑I/O, NVMe‑scratch, реже writeInterval, сжатие binary
</td></tr><tr><td>OOM VRAM
</td><td>Слишком много полей/слишком крупный домен
</td><td>Снизить число полей, перейти на 48–80 ГБ, уменьшить домен/параллелизм
</td></tr><tr><td>«Пиление» iteration\_time
</td><td>Холодный кэш/конкуренция I/O
</td><td>Prefetch на NVMe, исключить конкурентов, pinned memory
</td></tr><tr><td>Не растёт скорость с узлами
</td><td>Барьеры коммуникаций
</td><td>Увеличить размер сабдоменов/работы на ранг; снизить N; проверить MTU/топологию
</td></tr><tr><td>Зависание при реконструкции
</td><td>Нет места/сетевые тайм‑ауты
</td><td>Реконструировать по частям, чистить лишние времена, проверить purgeWrite
</td></tr></tbody></table>
## **Как запустить в cloudcompute.ru**
1. **Шаблон**:[ https://cloudcompute.ru/solutions/templates/](https://cloudcompute.ru/solutions/templates/?utm_source=chatgpt.com)
- «CFD OpenFOAM‑CUDA (single/multi‑GPU)» — быстрый старт.
- «HPC MPI (Slurm/K8S)» — многоузловые задания с RDMA.
2. **Профиль GPU**: 24/48/80 ГБ по таблице; крупные сетки/много полей — 80 ГБ (HQ); свипы — 24/48 ГБ или **MIG**. См. <https://cloudcompute.ru/solutions/mig/>
3. **Режим**:
- Tightly‑coupled проды — **On‑Demand**.
- Свипы/варианты — **Interruptible** (write‑интервал ≤ 120 с, ретраи). См. <https://cloudcompute.ru/solutions/interruptible-patterns/>
4. **Сеть/диск**: RDMA‑пулы для межузлового; NVMe‑scratch для processor\*/time; «тёплое/холодное» — по политике. См.[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/?utm_source=chatgpt.com)
5. **Контейнеры/CI**: закрепите версии решателей/библиотек/драйверов; smoke‑бенч на 1/2/М узлах. См. <https://cloudcompute.ru/solutions/containers-ci-cd/>
6. **Наблюдаемость/алерты**: дашборды GPU/сети/диска + cells\_per\_s, iteration\_time\_seconds, residual\_\*. См.[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com)
**Чек‑лист перед продом**
- 1 rank = 1 GPU; CUDA‑aware MPI/UCX включены; NUMA‑пиннинг задан.
- NVMe‑scratch подключён; collated‑I/O активен; writeInterval ≤ 120 с.
- Декомпозиция scotch/metis сбалансирована; форма сабдоменов адекватна.
- Метрики и алерты: cells\_per\_s, p95 iteration\_time\_seconds, gpu\_utilization, mpi\_wait\_ratio, io\_\*.
- Экономика: Cost\_per\_million\_cells и Cost\_per\_case посчитаны для выбранного масштаба.
- Политики безопасности/ретенции применены; логи без секретов.
- Версии контейнера/библиотек зафиксированы; smoke‑бенч на 1/2/М узлах прошёл.
**Навигация**
- Хаб HPC: <https://cloudcompute.ru/solutions/hpc/>
- Родственные приложения:
- GROMACS: <https://cloudcompute.ru/solutions/hpc/gromacs/>
- LAMMPS: <https://cloudcompute.ru/solutions/hpc/lammps/>
- NAMD/AMBER: <https://cloudcompute.ru/solutions/hpc/namd/>
- AutoDock‑GPU: <https://cloudcompute.ru/solutions/hpc/autodock/>
- Parabricks (геномика): <https://cloudcompute.ru/solutions/hpc/parabricks/>
- Монте‑Карло: <https://cloudcompute.ru/solutions/hpc/monte-carlo/>
- Граф‑аналитика: <https://cloudcompute.ru/solutions/hpc/graph-analytics/>
- Линал: <https://cloudcompute.ru/solutions/hpc/linear-algebra/>
- Сквозные и вспомогательные:
- Multi‑GPU/топологии:[ https://cloudcompute.ru/solutions/multi-gpu/](https://cloudcompute.ru/solutions/multi-gpu/?utm_source=chatgpt.com) • MIG: <https://cloudcompute.ru/solutions/mig/>
- Данные/хранилище:[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/?utm_source=chatgpt.com)
- Контейнеры/CI/CD: <https://cloudcompute.ru/solutions/containers-ci-cd/>
- Мониторинг/логи:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com)
- Наблюдаемость:[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/?utm_source=chatgpt.com)
- Оптимизация вычислений:[ https://cloudcompute.ru/solutions/performance-tuning/](https://cloudcompute.ru/solutions/performance-tuning/?utm_source=chatgpt.com) • <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>
Готовы запустить?
Запустить GPU-сервер