NAMD acelerado por GPU

Empieza hoy mismo con esta Guía para aplicaciones preparadas para GPU.

NAMD

NAMD (NAnoscale Molecular Dynamics) es una aplicación de calidad y producción de dinámica molecular diseñada para simulaciones de alto rendimiento de sistemas biomoleculares grandes. Desarrollada por la Universidad de Illinois en Urbana-Champaign (UIUC), NAMD se distribuye de forma gratuita con binarios y código fuente.

La última versión, NAMD 2.11, es siete veces más rápida en las GPU NVIDIA que en los sistemas de una sola CPU*, lo que permite a los usuarios ejecutar simulaciones de dinámica molecular en horas, en lugar de días. También es el doble de rápida que NAMD 2.10, de forma que los usuarios ahorran en coste de hardware, a la vez que aceleran considerablemente los descubrimientos científicos.

* Servidor con doble CPU, Intel E5-2698 v3 a 2,3 GHz, NVIDIA Tesla K80 con ECC desactivado, Autoboost activado; conjunto de datos STMV

NAMD ofrece una aceleración siete veces mayor en GPU

Instalación

Requisitos del sistema

NAMD no necesita instalación en plataformas paralelas con un compilador de C++ moderno. Los binarios precompilados de NAMD 2.11 acelerados por GPU están disponibles para su descarga para Windows, macOS y Linux. NAMD usa tanto GPU como CPU, por lo que recomendamos el uso de una CPU relativamente moderna para aprovechar el mejor rendimiento de las aplicaciones NAMD. 

Instrucciones de descarga e instalación

Los desarrolladores de NAMD ofrecen binarios completos y optimizados para todas las plataformas comunes en las que funciona. Estos binarios están disponibles en la página de descargas de NAMD.

No es necesario compilar NAMD, salvo que quieras agregar y modificar características, o mejorar el rendimiento compilando una versión de Charm++ que aproveche el hardware de redes especial, o bien si has personalizado tu versión de NAMD. Las instrucciones completas para compilar NAMD están disponibles en las notas de la versión, así como en el sitio web de NAMD y en todas las distribuciones.

A CONTINUACIÓN SE PRESENTA UN BREVE RESUMEN DEL PROCEDIMIENTO DE COMPILACIÓN

1. Descarga el código fuente de NAMD.

2. Extrae el paquete y Charm++.

tar xf NAMD_2.11_Source.tar.gz
cd NAMD_2.11_Source
tar xf charm-6.7.0.tar

3. Descarga e instala TCL y FFTW.

Consulta las notas de lanzamiento para conocer la versión correcta de estas bibliotecas.

wget http://www.ks.uiuc.edu/Research/namd/libraries/fftw-linux-x86_64.tar.gz
wget http://www.ks.uiuc.edu/Research/namd/libraries/tcl8.5.9-linux-x86_64.tar.gz
wget http://www.ks.uiuc.edu/Research/namd/libraries/tcl8.5.9-linux-x86_64-threaded.tar.gz
tar xzf fftw-linux-x86_64.tar.gz
mv linux-x86_64 fftw
tar xzf tcl*-linux-x86_64.tar.gz
tar xzf tcl*-linux-x86_64-threaded.tar.gz
mv tcl*-linux-x86_64 tcl
mv tcl*-linux-x86_64-threaded tcl-threaded

4. Compila Charm++.

El script de compilación tiene un modo interactivo, aunque también puedes especificar opciones en la línea de comandos como se explica a continuación.

cd charm-6.7.0
./build charm++ {arquitectura} {compilador de C} {compilador de Fortran} {otras opciones} 

En {arquitectura}, es necesario usar una de las siguientes opciones: “verbs-linux-x86_64” para configuraciones de varios nodos o “multicore-linux64” para sistemas de un único nodo. Hay otras opciones que no son necesarias, pero sí recomendables para obtener el mejor rendimiento: “smp” para usar SMP para configuraciones de varios nodos (haz clic aquí para obtener más información) o “--with-production” para usar optimizaciones de nivel de producción.

Ejemplo 1. Compilación de Charm++ para configuraciones de varios nodos que usan compiladores Intel y SMP con todas las optimizaciones de producción:

./build charm++ verbs-linux-x86_64 icc smp --with-production 

Ejemplo 2. Compilación de Charm++ para configuraciones de un único nodo que usan compiladores Intel con todas las optimizaciones de producción.

./build charm++ multicore-linux64 icc --with-production 

5. Compila NAMD.

Asegúrate de que estás en el directorio principal de NAMD y, después, configura y ejecuta:

./config {arquitectura-namd} --charm-arch {arquitectura-charm} {opciones}
cd {namd-arch}
make -j4 

En {arquitectura-namd}, recomendamos usar “Linux-x86_64-icc”, {arquitectura-charm} debería ser la mismo con la que compilaste Charm++, {opciones} debe establecerse en “--with-cuda” para activar la aceleración por GPU; de lo contrario, cámbialo a “--without-cuda” para compilaciones de una sola CPU. El directorio de compilación se puede extender con .[comentario] para compilar (por ejemplo, Linux-x86_64.cuda). Esto resulta útil para gestionar diferentes compilaciones de NAMD. Ten en cuenta que la extensión no tiene significado, de forma que “./config Linux-x86_64.cuda” no será una compilación CUDA, salvo que también especifiques “--with-cuda”.

Modificadores opcionales para la compilación CUDA:
a. --cuda-prefix puede utilizarse para configurar la ruta correcta al kit de herramientas de CUDA;
b. --cuda-gencode te permite agregar una arquitectura de computación de la GPU diferente.

Ejemplo 1. Compilación NAMD para una arquitectura x86_64 que usa compiladores Intel, con aceleración por GPU y una ruta CUDA especificada, para un único nodo:

./config Linux-x86_64-icc --charm-arch multicore-linux64-icc --with-cuda --cuda-prefix /usr/local/cuda 

Ejemplo 2. Compilación NAMD para una arquitectura x86_64 que usa compiladores Intel, con aceleración por GPU y una ruta CUDA especificada, para varios nodos:

./config Linux-x86_64-icc --charm-arch verbs-linux-x86_64-smp-icc --with-cuda --cuda-prefix /usr/local/cuda 

Ejemplo 3. Compilación NAMD para una arquitectura x86_64 que usa compiladores Intel, sin aceleración por GPU, para varios nodos:


./config Linux-x86_64-icc --charm-arch verbs-linux-x86_64-smp-icc 

Ejecución de trabajos

Antes de ejecutar una versión acelerada por GPU de NAMD, instala los últimos controladores NVIDIA de tu GPU. Para ejecutar NAMD, necesitas el ejecutable “namd2”; para la ejecución en varios nodos, también necesitas charmrun. Asegúrate de especificar las opciones de afinidad de la CPU, como se explica a continuación.

OPCIONES DE LA LÍNEA DE COMANDOS

Línea de comandos general para ejecutar NAMD en un sistema de un solo nodo:

namd2 {opcionesNamd} {archivoEntrada}

En un sistema de varios nodos, NAMD se tiene que ejecutar con charmrun, como se especifica a continuación:

charmrun {opcionesCharm} namd2 {opcionesNamd} {archivoEntrada}

{opcionesCharm}

  • ++nodelist {archivoListaNodos}: las ejecuciones de varios nodos necesitan una lista de nodos
  • Charm++ también es compatible con una opción ++mpiexec alternativa si usas un sistema de cola que mpiexec reconozca.
  • ++p $totalPes: especifica la cantidad total de subprocesos de PE.
  • Esta es la cantidad total de subprocesos de trabajo (también denominados subprocesos de PE). Recomendamos que sea igual a (TotalNúcleosCPU - TotalGPU).
  • ++ppn $pesPerProcess: cantidad de PE por proceso
    • Recomendamos establecer esto en (NúcleosPorNodo / GPUporNodo - 1).
    • Esto es necesario para liberar uno de los subprocesos por proceso para la comunicación. Asegúrate de especificar +commap a continuación.
    • La cantidad total de procesos es igual a ($totalPes / $pesPorProceso).
    • Al usar el valor recomendado para esta opción, cada proceso usará una única GPU

{opcionesNamd}

  • NAMD heredará “++p” y “++ppn” como “+p” y “+ppn” si están establecidos en {opcionesCharm}
  • De lo contrario, para la compilación de varios núcleos, usa “+p” para establecer la cantidad de núcleos.
  • Es recomendable que no tengas más de un proceso por GPU en la ejecución de varios nodos. Para conseguir más subprocesos de comunicación, se recomienda iniciar un proceso por GPU exactamente. Para un solo nodo, no hay problema en usar varias GPU por proceso.
  • Opciones de afinidad de la CPU (consulta la Guía del usuario):
    • “+setcpuaffinity” para evitar que los subprocesos cambien.
    • “+pemap #-#”: esto asigna los subprocesos computacionales a los núcleos de la CPU.
    • “+commap #-#”: esto establece el rango de subprocesos de comunicación.
    • Ejemplo de configuración de socket doble con 16 núcleos por socket:
      • +setcpuaffinity +pemap 1-15,17-31 +commap 0,16
  • Opciones de la GPU (consulta la guía de usuario):
    • “+devices {ID de CUDA}”: especifica, de manera opcional, los ID de dispositivo que usar en NAMD
    • Si los dispositivos no están en el orden de sockets, podría resultar útil configurar esta opción para asegurarse de que los sockets usan las GPU conectadas directamente (por ejemplo: “+devices 2,3,0,1”).

Recomendamos que siempre compruebes los mensajes de inicio en NAMD para asegurarte de que las opciones estén configuradas correctamente. Además, la opción ++verbose puede ofrecer una salida más detallada de la ejecución que las que usen charmrun. Ejecutar otras herramientas del sistema puede ayudar a cerciorarte de que obtienes la asignación de subprocesos solicitada. 

{archivoEntrada}

Usa el archivo de entrada *.namd correspondiente en uno de los conjuntos de datos de la subsección siguiente.

Ejemplo 1. Ejecuta ApoA1 en un nodo con dos GPU y dos CPU (20 núcleos en total) y una compilación NAMD de varios núcleos:

./namd2 +p 20 +devices 0,1 apoa1.namd

Ejemplo 2. Ejecuta STMV en dos nodos, cada uno con dos GPU y dos CPU (20 núcleos) y una compilación SMP NAMD (ten en cuenta que iniciamos cuatro procesos, cada uno controlando una GPU):

charmrun ++p 36 ++ppn 9 ./namd2 ++nodelist $NAMD_NODELIST +setcpuaffinity +pemap 1-9,11-19 +commap 0,10 +devices 0,1 stmv.namd

Ten en cuenta que, de forma predeterminada, el comando “rsh” se usa para iniciar namd2 en los nodos especificados en el archivo nodelist. Puedes cambiar esto mediante la variable de entorno CONV_RSH; es decir, para usar una ejecución ssh en vez de rsh “export CONV_RSH=ssh” (consulta las notas de lanzamiento de NAMD para obtener más información).

Pruebas de referencia

En esta sección, se demuestra la aceleración por GPU de los conjuntos de datos seleccionados. Ten en cuenta que puede que tengas que actualizar los archivos de entrada para reducir la frecuencia de energía o tiempo de salida. Las pruebas de referencia aparecen según un orden creciente de número de átomos. Es recomendable ejecutar casos de prueba elevados, como STMV, en sistemas con varias GPU.

Apolipoproteína A1 (APOA1)
Número de átomos
92 224
Períodos
500
Energías de salida
100
Plazo de salida
100

APOA1

La apolipoproteína A1 (ApoA1) es el componente proteínico más importante de la lipoproteína de alta densidad (HDL) en el torrente sanguíneo y cumple una función específica en el metabolismo de los lípidos. La prueba de referencia ApoA1 consiste en 92 224 átomos y ha servido de referencia multiplataforma NAMD durante años.

ATP sintasa
Número de átomos
327 506
Períodos
500
Energías de salida
100
Plazo de salida
100

ATPasa

El complejo ATP sintasa es una enzima que sintetiza trifosfato de adenosina (ATM), la unidad de energía molecular común en las células. La prueba de referencia F1-ATPasa es un modelo de la subunidad F1 de ATP sintasa.

Virus satélite del mosaico del tabaco (SMTV)
Número de átomos
1 066 628
Períodos
500
Energías de salida
100
Plazo de salida
100

STMV

El virus satélite del mosaico del tabaco (STMV) es un virus pequeño e icosaédrico que agrava los síntomas de la infección provocada por el virus del mosaico del tabaco (TMV). El SMTV es un candidato excelente para la investigación en dinámica molecular porque es relativamente pequeño para ser un virus y está en el rango medio-alto de lo que es posible simular utilizando la dinámica molecular tradicional en una estación de trabajo o en un servidor pequeño.

LECTURA DEL RESULTADO

El factor de mérito es “ns/día” (cuanto más alto, mejor), pero en el registro aparece como “días/ns” (cuanto más bajo, mejor). Ten en cuenta que la mayoría de los usuarios de dinámica molecular se centran en “ns/día”, el valor inverso de “días/ns”. Es recomendable usar la media de todos los casos de este valor a efectos de la prueba de referencia; la frecuencia del resultado se puede controlar en el archivo de entrada *.namd correspondiente. Debido al equilibrio de carga inicial, la “hora de inicio” debe omitirse en favor de los resultados posteriores (“hora de la prueba de referencia”).

Resultados del rendimiento esperado

Consulta a continuación los resultados de referencia de las diferentes configuraciones de sistema con CPU con socket doble y tarjetas NVIDIA Tesla de uno a cuatro nodos conectados con InfiniBand 4xEDR.

ApoA1
F1ATPasa
STMV

Configuraciones recomendadas del sistema

Configuración de hardware

PC

Parámetro
Especificaciones

Arquitectura de CPU

x86

Memoria del sistema

16-32 GB

CPU

2 (más de 8 NÚCLEOS, más de 2 GHz)

Modelo de GPU

GeForce GTX TITAN X

GPU

2-4

Servidores

Parámetro
Especificaciones

Arquitectura de CPU

x86

Memoria del sistema

32 GB

CPUs/Nodos

2 (más de 8 núcleos, más de 2 GHz)

Número total de nodos

1-10 000

Modelo de GPU

NVIDIA Tesla® P100

GPUs/Nodos

2-4

Interconexión

InfiniBand

Configuración de software

Pila de software

Parámetro
Versión

SO

CentOS 6.2

Controlador de GPU

352.68 o posterior

Kit de herramientas de CUDA

7.5 o posteriores

Compiladores Intel

2016.0.047

Crea tu solución ideal de GPU hoy mismo.