
Los modelos basados en agentes prosperan gracias al paralelismo. La GPU FLAME ejecuta las funciones de los agentes como núcleos CUDA, por lo que una GPU del tipo de una estación de trabajo puede simular millones de agentes en tiempo real, si estructura el modelo de forma limpia. Esta guía muestra una ruta práctica y compatible con la GPU desde NetLogo/Mesa hasta FLAME GPU.
Nota de precisión: la mayoría de los ABM funcionan bien en FP32. Si su modelo es sensible, ver el Lista de verificación del FP64.
Tu trabajo funciona dentro de un contenedor. Dos opciones que funcionan bien:
A) Tiempo de ejecución de CUDA + compilación desde la fuente (portátil)
# Dockerfile (boceto)
DESDE nvidia/cuda:12.4.1 - runtime-ubuntu22.04
ARG DEBIAN_FRONTEND=No interactivo
EJECUTE apt-get update && apt-get install -y --no-install-recommends\
cmake git python3 python3-pip\
&& rm -rf /var/lib/apt/lists/ *
ENV NVIDIA_VISIBLE_DEVICES=Todos\
NVIDIA_DRIVER_CAPABILITIES=Computación, utilidad
B) Utilice una imagen de GPU FLAME mantenida (la más rápida)
De cualquier manera, confirma la visibilidad de la GPU dentro del contenedor:
nvidia-smi
/trabajo
├── CMakeLists.txt
├── src/
│ ├── agents.cu # funciones de agente
│ ├── model.cu # descripción del modelo y capas
│ ── main.cu # punto de entrada
├── python/ # controlador Python opcional
── datos/ # entradas, semillas, puntos de control
Inicializa CMake y compila a partir de un árbol:
cmake -S. -B build -DCMAKE_BUILD_TYPE=Lanzamiento
cmake --build build -j
Se ejecuta FLAME GPU funciones de agente sobre matrices de agentes en la GPU. Usa mensajes para las interacciones locales.
//agents.cu
#include <flamegpu/flamegpu.h>
//Cada agente lee los mensajes en su vecindario y actualiza la velocidad
FLAMEGPU_AGENT_FUNCTION (paso, flamegpu: :messageSpatial2D, flamegpu: :messageSpatial2D) {
<float>const float x = flameGPU->getVariable («x»);
<float>const float y = flameGPU->getVariable («y»);
<float>float vx = flameGPU->getVariable («vx»);
<float>float vy = flameGPU->getVariable («vy»);
//cohesión simple
flotante cx = 0.f, cy = 0.f; int n = 0;
for (const auto &m: flameGPU->message_in (x, y)) {//iteración espacial
x += m.getVariable <float>(«x»);
cy += m.getVariable <float>(«y»);
n++;
}
if (n) {cx /= n; cy /= n; vx += 0.05f * (cx - x); vy += 0.05f * (cy - y);}
//escribir el estado y la posición de la salida
FlameGPU-> Establecer variable <float>(«vx», vx);
flameGPU->setVariable <float>(«vy», vy);
FlameGPU-> Establecer variable <float>(«x», x + vx);
FlameGPU-> Establecer variable <float>(«y», y + vy);
//emitir un mensaje para los vecinos en el siguiente paso
<float>flameGPU-> message_out.setVariable («x», x);
<float>flameGPU-> message_out.setVariable («y», y);
devuelve flamegpu: :ALIVE;
}
Descripción del modelo (patrón)
//modelo.cu
#include <flamegpu/flamegpu.h>
usando el espacio de nombres flamegpu;
modelo de descripción del modelo («abm»);
agentDescription agent = model.newAgent («A»);
<float>agent.newVariable <float>(«x»); agent.newVariable («y»);
<float>agent.newVariable <float>(«vx»); agent.newVariable («vy»);
MessageSpatial2D: :Mensaje de descripción (modelo);
msg.setBounds (0, 100, 0, 100);//límites de dominio
msg.setRadius (1.0f);//radio de interacción
msg.Nueva variable <float>(«x»);
msg.NewVariable <float>(«y»);
capa LayerDescription = Model.newLayer («L»);
Layer.addAgent Function (paso);
Esto refleja los patrones comunes de NetLogo (tortugas y radio de visión), pero en un diseño de estructura de matrices compatible con la GPU.
. /build/abm --agents 5_000_000 --steps 1000 --seed 42\
--datos de salida/puntos de control --intervalo de punto de control 100
Si los resultados no coinciden, compruebe el radio del mensaje, las condiciones de los límites y el orden de actualización.
Usa números que sean importantes para la planificación.
métricas:
agentes: <N>
pasos: <T>
wall_seconds: <... >
agent_pasos_por_segundo: N*T/wall_seconds
cost_per_millon_agent_steps: (precio_por_hora * wall_seconds/3600)/1e6 * (N*T)
Registra el modelo de GPU o VRAM, el controlador, la versión de CUDA, la GPU FLAME y la línea de comandos exacta.
GPU inactiva
Muy pocos agentes o mucho trabajo del lado del anfitrión. Aumente N, reduzca la E/S por paso o transfiera la configuración al código del dispositivo.
Sin memoria
Reduzca las variables de agente, fragmente las salidas o elija un perfil de VRAM más grande.
Resultados no deterministas
Arregla las semillas y evita las reducciones desordenadas del lado del huésped. Documento RNG.
Errores de compilación
Haga coincidir CUDA con su imagen base y con la cadena de herramientas de CMake. Limpiar y reconstruir.
hardware:
gpu: "<model>(<VRAM>GB)»
conductor: "<NVIDIA driver>»
<CUDA version>cuda: "»
software:
<version>flameGPU: "»
imagen: «Ubuntu 24.04 LTS (CUDA 12.6)»
modelo:
domínio: «[0,100] x [0,100]»
agentes: <N>
reglas: «demostración exclusiva de cohesión»
correr:
cmd:». <N><T>/build/abm --agents --steps --seed 42»
puntos de control: «cada 100 pasos»
salidas:
wall_seconds: «<... >»
agent_steps_per_segundo: «<... >»
cost_per_millon_agent_steps: «<... >»
Inicia una instancia de GPU con una plantilla preparada para CUDA (p. ej., Ubuntu 24.04 LTS/CUDA 12.6) o tu propia imagen de GROMACS. Disfrute de una facturación flexible por segundo con plantillas personalizadas y la posibilidad de iniciar, detener y reanudar las sesiones en cualquier momento. ¿No está seguro de los requisitos de FP64? Póngase en contacto con el servicio de asistencia para que le ayuden a seleccionar el perfil de hardware ideal para sus necesidades informáticas.