Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Foro Técnico: OpenMM #13

Open
dprada opened this issue May 8, 2019 · 4 comments
Open

Foro Técnico: OpenMM #13

dprada opened this issue May 8, 2019 · 4 comments
Labels
Foro Foro de preguntas y respuestas

Comments

@dprada
Copy link
Contributor

dprada commented May 8, 2019

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

@dprada dprada added the Foro Foro de preguntas y respuestas label May 8, 2019
@dprada
Copy link
Contributor Author

dprada commented May 8, 2019

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
Copy link
Contributor Author

dprada commented May 9, 2019

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
Copy link
Contributor

DSKC44 commented Oct 25, 2019

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
Copy link
Contributor Author

dprada commented Oct 25, 2019

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.

@dprada dprada changed the title Foro Técnico: OpenMM OpenMM Jun 2, 2021
@dprada dprada changed the title OpenMM Foro Técnico: OpenMM Jun 2, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Foro Foro de preguntas y respuestas
Projects
None yet
Development

No branches or pull requests

2 participants