Монте‑Карло на GPU: финансовые и научные расчёты

Задача страницы. Дать практический каркас для высокопараллельных симуляций Монте‑Карло на облачных GPU: финансовые риски (VaR/CVaR/XVA/Greeks), научные задачи (радиационный транспорт, MCMC, надёжность), архитектуры одного/многих GPU/узлов, RNG и разбиение последовательностей, устойчивость к прерываниям, метрики и экономика (paths_per_s, Cost_per_1M_paths). Страница — входная точка ветки Монте‑Карло.

TL;DR

  • Embarrassingly parallel. «1 процесс = 1 GPU», масштабирование количеством воркеров; межузловые обмены чаще сводятся к редукции сумм/моментов.
  • RNG‑дисциплина. Контр‑счётчики/скип‑ахед и разбиение потоков по (gpu_id, tid, path_idx) → детерминизм и воспроизводимость.
  • Варианс‑редакшн. Антитетические выборки, контрольные вариации, стратификация, квази‑Монте‑Карло (Sobol) уменьшают N при нужной точности.
  • Interruptible по умолчанию. Делим на чанки ≤ 120 с: частичные суммы/квадраты/счётчики + позиция RNG → безопасные ретраи. См. https://cloudcompute.ru/solutions/interruptible-patterns/
  • Хранилище. Исходные параметры/таблицы — «тёплое», временные буферы/частичные редукции — NVMe‑scratch, финальные агрегаты — «холодное». См. https://cloudcompute.ru/solutions/storage-data/
  • Профили GPU. 24 ГБ (Compact) — большое число независимых мелких задач; 48 ГБ (Balanced) — базовый профиль кампаний; 80 ГБ (HQ) — nested‑симуляции/длинные траектории; для плотности — MIG. См. https://cloudcompute.ru/solutions/mig/
  • Наблюдаемость. paths_per_s, stderr, ci_width, gpu_utilization, p50/p95 chunk_seconds, retry_total. См. https://cloudcompute.ru/solutions/monitoring-logging/
  • Экономика. Cost_per_1M_paths = (c_gpu / U) * (1M / paths_per_s) / 3600; выбираем профиль/режим по минимуму стоимости при SLA. См. https://cloudcompute.ru/solutions/cost-planner/

Сценарии (когда это нужно)

  • Финансы: VaR/CVaR; CVA/DVA/FVA/MVA (XVA); оценка греков (pathwise/likelihood ratio); nested MC (внешние сценарии рынков × внутренние пути); ковариации/стресс‑тесты.
  • Наука/инжиниринг: транспорт частиц/фотонов, дозиметрия; задачи надёжности и отказов; статистическая физика (Ising/Spin); редкие события (splitting/IS).
  • Байесовские методы: MCMC/SMC — множество независимых цепей/частиц; батч‑лог‑лайклихуды на GPU.
  • Очереди/симуляция событий: независимые реплики с агрегированием KPI.
  • Гибриды: скрининг → MD/CFD/докинг. См. https://cloudcompute.ru/solutions/hpc/gromacs/, https://cloudcompute.ru/solutions/hpc/openfoam-gpu/, https://cloudcompute.ru/solutions/hpc/autodock/

Архитектуры/пайплайны A) Одноузловой, multi‑GPU — редукция внутри узла

[Params/Curves] -> [Prefetch -> NVMe] -> [GPU0..GPU3: simulate paths (≤120 s)] -> [Local Reduce] -> [Write partials]
 |
 [Publish/Merge]

Ключи: 1 процесс = 1 GPU; RNG разбиение; локальная редукция (pairwise/Kahan); запись только частичных сумм/квадратов/моментов.

B) Многоузловой пул (почти без коммуникаций)

[Job Queue] -> [Node #1: GPUxN] [Node #2: GPUxN] ... -> [Reducer -> Final Stats/CI]
 | | |
 (idempotent tasks ≤120 s, retries) (S3/NVMe partials)

Ключи: обмены — периодические Reduce/Allreduce по агрегатам; CUDA‑aware MPI/NCCL по желанию.

C) Nested Monte‑Carlo (outer × inner)

[Outer scenarios] -> [Shard by scenario] -> [GPU Workers: run inner paths (≤120 s)] -> [Inner aggregates] -> [Outer merge]

Ключи: фиксированные seeds на (outer_id, inner_offset); кеш рыночных кривых; NVMe для промежуточных.

Профили GPU/VRAM/скоростей (ориентиры)

**Профиль** **VRAM** **Типовые кейсы** **Режим** **Отн. throughput (≈)** **Примечания**
**24 ГБ (Compact)** 24 ГБ Простые пути, много независимых задач Interruptible / On‑Demand 1.0 Отлично с **MIG** для плотности
**48 ГБ (Balanced)** 48 ГБ Path‑dependent, средние буферы/регрессии Оба 1.5–1.8 Базовый профиль пулов
**80 ГБ (HQ)** 80 ГБ Nested MC, LSM (Longstaff‑Schwartz), большие батчи Оба 2.2–2.6 Запас VRAM и констант в памяти

Индексы относительные; зависят от длины траектории, логики выплат и варианс‑редакшна.

Конфиги и скелеты

1) YAML задания (универсально)

job:
 name: "mc_var_cvar_equity_v1"
 mode: "interruptible" # on-demand | interruptible
 gpu_profile: "48GB-Balanced" # 24GB-Compact | 48GB-Balanced | 80GB-HQ
 chunk_seconds: 120
 retries: 3
 rng:
 type: "philox" # philox | xorwow | sobol
 base_seed: 123456
 skipahead: true # разбиение потоков по gpu_id/path_range
 antithetic: true
 sim:
 paths_total: 200000000 # совокупно
 steps_per_path: 252
 model: "gbm" # gbm | heston | jumpdiff | custom
 payoff: "barrier_call"
 variance_reduction: ["antithetic","control_variate"]
 confidence: { level: 0.99, metric: "VaR" }
 output:
 dir: "s3://cold/mc/var_cvar/"
 write_partials: true # sums, sumsqs, quantile sketches
 hooks:
 on_start: ["python /scripts/prefetch_nvme.py"]
 on_chunk: ["python /scripts/register_chunk.py"]
 on_failure: ["python /scripts/requeue.py --backoff"]

2) CUDA C++ — скелет ядра (GBM + антитетика + редукция)

// mc_gbm.cu — упрощённый пример; редукция парная, Kahan для сумм
#include <curand_kernel.h>
extern "C" __global__
void mc_gbm_kernel(double *partial_sum, double *partial_sumsq,
 unsigned long long paths, int steps, double s0, double mu, double sigma,
 unsigned long long seed, unsigned long long subseq, unsigned long long offset)
{
 unsigned long long gid = blockIdx.x * blockDim.x + threadIdx.x;
 unsigned long long stride = (unsigned long long)gridDim.x * blockDim.x;
 double c_sum=0.0, c_c=0.0, c2_sum=0.0, c2_c=0.0;
 for (unsigned long long p = gid; p < paths; p += stride) {
 // Philox-like инициализация: уникальная подпоследовательность на путь
 curandStatePhilox4_32_10_t st; curand_init(seed, p + offset, subseq, &st);
 auto path_payoff = [&](int sign){
 double s = s0;
 for (int t=0; t<steps; ++t) {
 double z = curand_normal_double(&st) * sign;
 s *= exp((mu - 0.5*sigma*sigma) + sigma * z);
 // ... логика барьера/купона по задаче
 }
 double payoff = fmax(s - s0, 0.0); // call
 return payoff;
 };
 double y1 = path_payoff(+1);
 double y2 = path_payoff(-1); // антитетическая
 double y = 0.5*(y1+y2);
 // Kahan для суммы
 double yk = y - c_c; double t1 = c_sum + yk; c_c = (t1 - c_sum) - yk; c_sum = t1;
 double y2k = y*y - c2_c; double t2 = c2_sum + y2k; c2_c = (t2 - c2_sum) - y2k; c2_sum = t2;
 }
 // редукция по блоку
 __shared__ double sm_sum[256], sm_sumsq[256];
 int lid = threadIdx.x;
 sm_sum[lid] = c_sum;
 sm_sumsq[lid] = c2_sum;
 __syncthreads();
 for (int s=blockDim.x/2; s>0; s>>=1) { if (lid < s) { sm_sum[lid]+=sm_sum[lid+s]; sm_sumsq[lid]+=sm_sumsq[lid+s]; } __syncthreads(); }
 if (lid==0) {
 atomicAdd(partial_sum, sm_sum[0]);
 atomicAdd(partial_sumsq, sm_sumsq[0]);
 }
}

Для LSM/регрессий храните минимальные статистики (матрицы моментов), решайте маленькие системы QR/SVD на GPU; не храните все траектории.

3) Python (Numba/CuPy) — быстрый прототип

import cupy as cp
def mc_barrier(paths, steps, s0, mu, sigma, barrier):
 s = cp.full(paths, s0, dtype=cp.float32)
 payoff = cp.zeros(paths, dtype=cp.float32)
 alive = cp.ones(paths, dtype=cp.bool_)
 for t in range(steps):
 z = cp.random.standard_normal(paths, dtype=cp.float32)
 s *= cp.exp((mu - 0.5*sigma*sigma) + sigma * z)
 alive &= (s > barrier)
 payoff = cp.maximum(s - s0, 0.0) * alive
 return payoff.mean(), payoff.var()

4) Slurm (многоузловая редукция агрегатов)

#!/bin/bash
#SBATCH -J mc_nested
#SBATCH -N 2
#SBATCH --gpus-per-node=4
#SBATCH -t 08:00:00
#SBATCH -p gpu
#SBATCH --exclusive
module load cuda mpi
export UCX_TLS=rc,ud,sm,self,gdr,cuda_copy,cuda_ipc
export OMP_NUM_THREADS=1
# каждый процесс пишет partials на NVMe; затем MPI reduce агрегирует двойки (sum, sumsq, count)
srun --mpi=pmix_v3 python3 run_mc_node.py --chunks 120 --seed 123456

5) SSE‑прогресс (панель мониторинга)

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import time, json
app = FastAPI()
def stream():
 paths = 0
 while True:
 paths += 5_000_000
 yield "data: " + json.dumps({"paths_done": paths, "paths_per_s": 2000000, "stderr": 0.0021}) + "nn"
 time.sleep(1)
@app.get("/events")
def events(): return StreamingResponse(stream(), media_type="text/event-stream")
``` **Наблюдаемость/метрики/алерты**

См. хабы:[ 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)

**Метрики:**

- Throughput: paths\_per\_s, inner\_paths\_per\_s (для nested), p50/p95 chunk\_seconds.
- Качество оценки: stderr (оценка стандартной ошибки), ci\_width (ширина доверительного интервала), var\_estimate.
- GPU: gpu\_utilization, gpu\_memory\_used\_bytes, sm\_occupancy, gpu\_power\_watts.
- I/O: io\_read/write\_mb\_s, nvme\_usage\_bytes, cache\_hit\_ratio{tier="nvme"}.
- Очереди: job\_queue\_depth, tasks\_inflight, retry\_total.
- Детерминизм: seed\_mismatch\_total, duplicate\_chunk\_total (ловим повторённые чанки).

**Алерты:**

- Падение paths\_per\_s &gt; X% к эталону N минут.
- stderr/ci\_width не улучшаются при росте N → проблема с RNG/корреляциями.
- gpu\_utilization &lt; 60% при глубокой очереди → узкое место I/O/слишком мелкий чанк.
- Переполнение NVMe (nvme\_usage\_bytes &gt; 85%) → авто‑drain/компакция.
- Рост retry\_total и duplicate\_chunk\_total → пересечения шардов, нарушена идемпотентность.

## **Экономика и формулы**

См.[ https://cloudcompute.ru/solutions/cost-planner/](https://cloudcompute.ru/solutions/cost-planner/?utm_source=chatgpt.com) и <https://cloudcompute.ru/solutions/throughput-vs-latency/>

**Стандартная ошибка и требуемое N:**

stderr ≈ σ / √N

N(ε, α) ≈ ( z\_{1-α/2} \* σ / ε )^2

где ε — требуемая точность оценки, α — уровень значимости.

**Стоимость 1M путей:**

Cost\_per\_1M\_paths = (c\_gpu / U) \* (1e6 / paths\_per\_s) / 3600

**Общий бюджет:**

Total\_cost = (c\_gpu \* N\_gpu\_eff \* t\_run\_hours) / U \* r + Storage\_cost

t\_run\_hours ≈ (N\_total / (paths\_per\_s \* N\_gpu\_eff)) / 3600

**Nested MC (outer × inner):**

N\_total = N\_outer \* N\_inner

stderr\_outer ≈ σ\_inner / √N\_outer, σ\_inner ∝ 1/√N\_inner

Оптимум достигается балансом N\_outer/N\_inner под заданный stderr и Cost\_total.

**LSM (американские опционы):
 — храните только базисные суммы XᵀX, Xᵀy → решайте малые системы;
 — оценка стоимости: добавьте Cost\_regression к Cost\_per\_1M\_paths.

## **Практики производительности**

- **RNG‑разбиение:** counter‑based генераторы/skip‑ahead на (gpu\_id, chunk\_id, path\_offset); фиксируйте base\_seed.
- **Варианс‑редакшн:** antithetic, control variates (напр., GBM‑аналитики), stratified; квазипоследовательности (Sobol) с цифровым сдвигом.
- **Редукции:** pairwise/Kahan/Neumaier для сумм/сумм квадратов; избегайте «гигантских» массивов выплат.
- **Память:** храните только финальные/ключевые состояния; для path‑dependent — компактные буферы фич.
- **Ветвления:** минимизируйте warp‑divergence (барьеры/срабатывания) через маски.
- **I/O:** NVMe‑scratch, collated записи агрегатов, write‑behind в «тёплое».
- **Многонодовость:** при необходимости — CUDA‑aware MPI/NCCL только для агрегатов.
- **Формат вычислений:** FP32 для траекторий + компенсированные суммы в FP64; где требуется — всё в FP64. См.[ https://cloudcompute.ru/solutions/performance-tuning/](https://cloudcompute.ru/solutions/performance-tuning/?utm_source=chatgpt.com)
- **MIG/плотность:** шардинг крупного GPU под множество мелких задач. См. <https://cloudcompute.ru/solutions/mig/>

## **Безопасность/политики**

См.[ https://cloudcompute.ru/solutions/security/](https://cloudcompute.ru/solutions/security/?utm_source=chatgpt.com)

- **Конфиденциальность.** Рыночные кривые/позиций/экспозиции — приватные; доступ по проектам и токенам; шифрование «на покое».
- **Секреты.** Ключи источников/лицензий — только из секрет‑хранилища; запрет логирования.
- **Аудит.** Кто запускал, какие seeds/версии использованы, какие агрегаты опубликованы.
- **Ретеншн.** Сырая path‑телеметрия не хранится; только агрегаты/скетчи; автоочистка NVMe.
- **Детерминизм.** Фиксация seeds/правил разбиения; контроль seed\_mismatch\_total.

**Траблшутинг (симптом → причина → решение)**

<table><tbody><tr><td>**Симптом**

</td><td>**Причина**

</td><td>**Решение**

</td></tr><tr><td>Результаты нестабильны/неповторимы

</td><td>Несогласованное разбиение RNG/повторы чанков

</td><td>Фиксировать (base\_seed, shard\_id), вести реестр чанков, включить детект duplicate\_chunk\_total

</td></tr><tr><td>stderr не уменьшается с ростом N

</td><td>Корреляции в выборке/ошибки RNG

</td><td>Перейти на независимые подпотоки, включить варианс‑редакшн/стратификацию

</td></tr><tr><td>Низкий gpu\_utilization

</td><td>Мелкие чанки/ветвления/узкое I/O

</td><td>Увеличить chunk\_seconds до 60–120 с, маски вместо ветвлений, NVMe‑prefetch

</td></tr><tr><td>OOM VRAM

</td><td>Сохранение всей траектории/большие буферы

</td><td>Переход на агрегаты/скетчи, уменьшить steps\_per\_path, перейти на 48–80 ГБ

</td></tr><tr><td>Пиление paths\_per\_s

</td><td>Конкуренция по диску/сети

</td><td>Локальный NVMe, коллатед записи, отложенная публикация

</td></tr><tr><td>Разные оценки на узлах

</td><td>Версии контейнера/модели различаются

</td><td>Единый контейнер, зафиксированные версии, smoke‑бенч

</td></tr><tr><td>Плохая конвергенция LSM

</td><td>Неподходящий базис/численная нестабильность

</td><td>Нормализация фич, QR/SVD, регуляризация, контроль обусловленности

</td></tr></tbody></table>

## **Как запустить в cloudcompute.ru**

1. **Шаблоны:**[ https://cloudcompute.ru/solutions/templates/](https://cloudcompute.ru/solutions/templates/?utm_source=chatgpt.com)
 - «Monte‑Carlo GPU (worker pool)» — пул воркеров и брокер очередей.
 - «HPC MPI (Slurm/K8S)» — многоузловая агрегация частичных сумм.
2. **Профиль GPU:** 24/48/80 ГБ по таблице; nested/LSM — 80 ГБ (HQ); много мелких задач — 24 ГБ + **MIG**.
3. **Режим:** массовые кампании — **Interruptible** (чанк ≤ 120 с, ретраи); SLA‑критичное — **On‑Demand**. См. <https://cloudcompute.ru/solutions/interruptible-patterns/>
4. **Хранилище/кэш:** параметры/кривые — «тёплое»; частичные редукции/скетчи — **NVMe**; финальные агрегаты — «холодное». См.[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/?utm_source=chatgpt.com)
5. **Оркестрация/CI:** контейнеры с зафиксированными версиями, YAML‑спеки задач, smoke‑кейс с эталонной оценкой. См. <https://cloudcompute.ru/solutions/containers-ci-cd/>
6. **Наблюдаемость:** paths\_per\_s, stderr, ci\_width, gpu\_utilization, io\_\*, алерты p95. См.[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com)
7. **Сквозные оптимизации:**[ https://cloudcompute.ru/solutions/performance-tuning/](https://cloudcompute.ru/solutions/performance-tuning/?utm_source=chatgpt.com), <https://cloudcompute.ru/solutions/throughput-vs-latency/>,[ https://cloudcompute.ru/solutions/multi-gpu/](https://cloudcompute.ru/solutions/multi-gpu/?utm_source=chatgpt.com)

**Чек‑лист перед продом**

- Зафиксированы контейнер/версии/модель выплат; описана схема RNG‑разбиения и base\_seed.
- Чанк‑цель **≤ 120 с**, задачи идемпотентны, ретраи/backoff включены.
- NVMe‑scratch подключён; коллатед записи агрегатов; публикация — батчами.
- Метрики/алерты заведены: paths\_per\_s, stderr, p95 chunk\_seconds, gpu\_utilization, io\_\*, retry\_total.
- Экономика посчитана: Cost\_per\_1M\_paths, Total\_cost при целевом SLA.
- Политики безопасности/ретенции и аудит; данных с траекторий в долговременном хранении нет.
- Smoke‑кейс подтверждает детерминизм/воспроизводимость.

**Навигация**

- Хаб HPC: <https://cloudcompute.ru/solutions/hpc/>
- Родственные приложения:
 
 - Граф‑аналитика (cuGraph): <https://cloudcompute.ru/solutions/hpc/graph-analytics/>
 - Линейная алгебра (cuBLAS/cuSPARSE): <https://cloudcompute.ru/solutions/hpc/linear-algebra/>
 - GROMACS: <https://cloudcompute.ru/solutions/hpc/gromacs/>
 - LAMMPS: <https://cloudcompute.ru/solutions/hpc/lammps/>
 - NAMD/AMBER: <https://cloudcompute.ru/solutions/hpc/namd/>
 - CFD (OpenFOAM‑CUDA): <https://cloudcompute.ru/solutions/hpc/openfoam-gpu/>
 - AutoDock‑GPU: <https://cloudcompute.ru/solutions/hpc/autodock/>
- Сквозные:
 
 - 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/>

Готовы запустить?

Запустить GPU-сервер