Open dprada opened 5 years ago
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.
Encontrarás orientación para solucionar este problema en la unidad de Academia dedicada a CUDA
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
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)
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
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:
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.
Haz uso de este hilo para dudas técnicas y reporte de problemas relacionado con la instalación y uso de OpenMM.