uibcdf / Academia

Este repositorio debe ser el punto de partida y encuentro para cualquier investigador o estudiante que quiera comenzar a trabajar con/en la UIBCDF. Si has caído aquí por otro motivo y este material te es útil, eres más que bienvenido a usarlo e interaccionar con nosotros.
Other
6 stars 8 forks source link

Foro Técnico: OpenMM #13

Open dprada opened 5 years ago

dprada commented 5 years ago

Haz uso de este hilo para dudas técnicas y reporte de problemas relacionado con la instalación y uso de OpenMM.

dprada commented 5 years ago

La plataforma CUDA no está disponible

Es posible que OpenMM no vea la/s gpus o cuda. Usaremos este post para poder poner las posibles acciones de diagnóstico y soluciones.

En primer lugar, ¿cómo saber en qué plataformas podemos correr OpenMM?:

import simtk.openmm as mm

for ii in range(mm.Platform.getNumPlatforms()):
    platform_name  = mm.Platform.getPlatform(ii).getName()
    platform       = mm.Platform.getPlatformByName(platform_name)
    platform_speed = platform.getSpeed()
    print('Plataforma {} con velocidad {}'.format(platform_name,platform_speed))
    del(platform_name, platform, platform_speed)

Si encontramos únicamente las siguientes salidas es que todo es correcto:

Plataforma Reference con velocidad 1.0
Plataforma CPU con velocidad 10.0
Plataforma CUDA con velocidad 100.0
Plataforma OpenCL con velocidad 50.0

Ahora supongamos que no aparece la linea que hace referencia a la "Plataforma CUDA", podemos ver el posible motivo de su ausencia:

print(mm.Platform.getPluginLoadFailures())

Si la salida es similar a la siguiente:

('Error loading library /home/diego/Myopt/Miniconda/miniconda3/envs/UIBCDF_lab_dev/lib/plugins/libOpenMMCUDA.so: libcufft.so.9.2: cannot open shared object file: No such file or directory', 'Error loading library /home/diego/Myopt/Miniconda/miniconda3/envs/UIBCDF_lab_dev/lib/plugins/libOpenMMRPMDCUDA.so: libOpenMMCUDA.so: cannot open shared object file: No such file or directory', 'Error loading library /home/diego/Myopt/Miniconda/miniconda3/envs/UIBCDF_lab_dev/lib/plugins/libOpenMMDrudeCUDA.so: libOpenMMCUDA.so: cannot open shared object file: No such file or directory', 'Error loading library /home/diego/Myopt/Miniconda/miniconda3/envs/UIBCDF_lab_dev/lib/plugins/libOpenMMAmoebaCUDA.so: libOpenMMCUDA.so: cannot open shared object file: No such file or directory', 'Error loading library /home/diego/Myopt/Miniconda/miniconda3/envs/UIBCDF_lab_dev/lib/plugins/libOpenMMCudaCompiler.so: libnvrtc.so.9.2: cannot open shared object file: No such file or directory')

Puede deberse a dos motivos.

1) No hay nvidia-driver ni cuda o cudatoolkit instalados.

Encontrarás orientación para solucionar este problema en la unidad de Academia dedicada a CUDA

2) La versión de cudatoolkit instalada no es compatible con la versión de openmm instalada.

Si el driver de nvidia y el paquete de cudatoolkit se encuentran instalados puede que la versión de OpenMM no sea compatible. Por ejemplo:

conda list | grep cuda
>cudatoolkit              10.0                           0  
>openmm                    7.3.1           py37_cuda92_rc_2    omnia

Vemos que, como decía el error ofrecido por openmm anteriormente, hemos instalado el paquete de openmm cuya dependencia es cudatoolkit 9.2 y por algún motivo conda no ha gestionado dicha restricción. Necesitamos instalar la versión 9.2 de cudatoolkit (no la 10.0):

conda install -c conda-forge cudatoolkit=9.2

Podemos por el contrario actualizar nuestro paquete de openmm a la versión etiquetada como 'cuda100' compatible con cudatoolkit 10.0:

conda install -c omnia/label/cuda100 openmm

Resumiendo. Si estamos a tiempo de instalar o reinstalar openmm, asegurate de que la versión de cudatoolkit es compatible:

conda install cudatoolkit=10.0
conda install -c omnia/label/cuda100 openmm

O

conda install cudatoolkit=9.2
conda install -c omnia openmm      # cuda92 por defecto

Despues de haber instalado la dependencia correcta, y para evitar que cudatoolkit sea remplazado por nuevas versiones cuando actualices las librerías de tu entorno, sería recomendable que fijaras la versión del paquete. Supongamos que hemos elegido cudatoolkit 9.2:

echo "cudatoolkit ==9.2" >> $CONDA_PREFIX/conda-meta/pinned

Ya puedes actualizar los paquetes sin miedo a que se rompa la dependencia:

conda update --all

dprada commented 5 years ago

Compatibilidad entre variables de tipo int y numpy.dtype.int64

Existen funciones de OpenMM cuya definición de tipo de variable de entrada está declarada y compilada con precisión sencilla. Es el caso por ejemplo de simtk.openmm.CustomExternalForce().addParticle().

Veamos un ejemplo:

import simtk.openmm as mm
import simtk.unit as unit
import simtk.openmm.app as app

# Supongamos que definimos una fuerza externa sobre una lista de índices átomos:
list_atoms = np.array([0,1,2])

# La nueva fuerza externa será de tipo harmónico:
harmonic_potential = '0.5*K*((x-xo)^2+(y-yo)^2+(z-zo)^2)'
harmonic_restraint_force = mm.CustomExternalForce(harmonic_potential)
harmonic_restraint_force.addGlobalParameter('K', 500.0 * unit.kilocalories_per_mole/unit.angstrom**2)
harmonic_restraint_force.addPerParticleParameter('x0')
harmonic_restraint_force.addPerParticleParameter('y0')
harmonic_restraint_force.addPerParticleParameter('z0')

# Ahora definamos en un bucle las parámetros x0, y0 y z0 para cada átomo.
# Por simplicidad, aunque no tenga sentido, hagamos que dichos parámetros tomen el valor 0.
for index in list_atoms:
    parameters = [0.0, 0.0, 0.0]
    harmonic_restraint_force.addParticle(index, parameters)

Este último bucle arroja el siguiente error:

/.../miniconda3/envs/UIBCDF_lab_dev/lib/python3.7/site-packages/simtk/openmm/openmm.py in addParticle(self, *args)
  17834             the index of the particle term that was added
  17835         """
> 17836         return _openmm.CustomExternalForce_addParticle(self, *args)
  17837 
  17838 

NotImplementedError: Wrong number or type of arguments for overloaded function 'CustomExternalForce_addParticle'.
  Possible C/C++ prototypes are:
    OpenMM::CustomExternalForce::addParticle(int,std::vector< double,std::allocator< double > > const &)
    OpenMM::CustomExternalForce::addParticle(int)

Y esto se debe a que el método addParticle espera un valor de tipo int en su primer argumento. Y nuestros valores de list_atoms son numpy.int64:

type(list_atoms_positions_restrained[0])
numpy.int64

Para solucionar el problema basta transformar el valor de la variable index a un entero int común de python:

# Ahora definamos en un bucle las parámetros x0, y0 y z0 para cada átomo.
# Por simplicidad, aunque no tenga sentido, hagamos que dichos parámetros tomen el valor 0.
for index in list_atoms:
    parameters = [0.0, 0.0, 0.0]
    harmonic_restraint_force.addParticle(index, parameters)
DSKC44 commented 4 years ago

OpenMM no detecta la plataforma CUDA u OpenCL:

En mi caso el problema se dió cuando instalé la versión más reciente de OpenMM, mediante el comando:

conda install -c omnia -c conda-forge openmm (Que esta compilada con CUDA toolkit 10.1)

Instalar este paquete con conda tampoco resuelve el problema:

conda install cudatoolkit

openmm

La solución al problema fue remover y reinstalar OpenMM con la versión CUDA de mi sistema (CUDA 9.1):

conda install -c omnia/label/cuda91 -c conda-forge openmm

Ahora el benchmark corre ccorrectamente:

Screenshot at 2019-10-24 20:19:09

dprada commented 4 years ago

OpenMM no detecta la plataforma CUDA u OpenCL:

En mi caso el problema se dió cuaeneralizado lo resolverán pronto. La versión disponible en el canal conda-forge es nueva, antes no estaba. Sólo estaba omnia. Probaré yo a ver con el de omnia.