Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Supercomputacin en
Guillem Borrell i Nogueras III Jornada SAGE/Python. Vigo, 21 y 22 de Junio de 2012
Python en Supercomputacin
De qu hablar este?
Noticias
Vicisitud
Sordidez
Conclusiones
Python en Supercomputacin
Antes de empezar
Guillem Borrell i Nogueras.
http://guillemborrell.es/ @guillemborrell
Ingeniero Aeronutico
Nunca me han gustado especialmente los aviones
Python en Supercomputacin
Python en Supercomputacin
Python en Supercomputacin
Python en Supercomputacin
Python en Supercomputacin
Vicisitud es generar tus datos mediante una simulacin numrica. Es, por lo general, un proceso agotador.
Python en Supercomputacin
http://pyvideo.org/speaker/204/william-scullin
Trabaja en Argonne y el ejemplo corre en Intrepid.
Python en Supercomputacin
Python es an un experimento
S nos lo encontramos...
Problemas relativamente pequeos. Middleware. Cdigo pegamento.
Python en Supercomputacin
Python es an un experimento
S nos lo encontramos...
Problemas relativamente pequeos. Middleware. Cdigo pegamento.
No nos lo encontramos...
Cuando te prestan algo que vale mucho dinero. Cuando tu director de tesis te dice que con su prestigio no se juega. Cuando quien tiene que revisar tu trabajo no usa Python.
Python en Supercomputacin
Sordidez es conseguir los datos y hacer algo til con ellos, normalmente guarreando y picando piedra. Sueles intentar como sea que eso no requiera ms recursos que generarlos. Y cada vez que hablas de ello lo haces con cierto morbo masoquista.
Python en Supercomputacin
Diseados especcamente para los datos en cuestin. Pueden requerir grandes cantidades de memoria. Seriales o paralelos. Reutilizan cdigo de la propia simulacin. Veamos unos cuantos ejemplos concretos.
Python en Supercomputacin
Problema 1: Filtros
Tengo un campo de 15000x500x4000 (120 GiB) Quiero reducir el nmero de puntos para poder visualizar cosas grandes.
Aplico un ltro gaussiano. Tomo un punto de cada 3 en cada direccin
Python en Supercomputacin
Solucin:
Leo el archivo y reparto los datos en los nodos de un cluster de clculo Filtro en dos direcciones Hago una traspuesta global Filtro en la direccin restante. Deshago la traspuesta Guardo en disco.
Python en Supercomputacin
MPI4py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def chzy2xy(self): """Changes. It uses a lot of memory""" ssbuf = np.empty((self.NZ,self.NPX,self.NY),dtype=np.float32) rrbuf = np.empty((self.size,self.NPZ,self.NPX,self.NY),dtype=np.float32)
ssbuf[:,:,:] = np.transpose(self.data,(2,0,1))[:,:,:] self.comm.Alltoall([ssbuf, self.NY*self.NPZ*self.NPX, MPI.FLOAT], [rrbuf, self.NY*self.NPZ*self.NPX, MPI.FLOAT]) del ssbuf rbuf = np.empty((self.NPZ,self.NY,self.size,self.NPX),dtype=np.float32) rbuf[:,:,:,:] = np.transpose(rrbuf,(1,3,0,2))[:,:,:,:] self.data = rbuf.reshape((self.NPZ,self.NY,self.NX))
Fcilmente paralelizable.
Python en Supercomputacin
Pero qu escribo?
1 2 3 4 5 6 7 8 9 /> python -m cProfile objects.py > objects.prof 1088768 function calls (1058481 primitive calls) in 141.797 seconds Ordered by: standard name ncalls tottime percall 1 0.023 0.023 387 102.151 0.264 1 14.458 14.458
Python en Supercomputacin
Inlining
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def __stencilize_par(clusterbed): codestring =""" int i,j,k; int counter = 0; #pragma omp parallel for private(i,j,k) for (i=1;i<nx-1;i++){ for (j=1;j<ny-1;j++){ for (k=1;k<nz-1;k++){ clusterbed(i,j,k,1) = clusterbed(i,j,k-1,0); [...] """ nx = clusterbed.shape[0] ny = clusterbed.shape[1] nz = clusterbed.shape[2] variables = "clusterbed nx ny nz".split() inline(codestring, variables, extra_compile_args =[-O3 -fopenmp], extra_link_args=[-lgomp], type_converters=converters.blitz)
Python en Supercomputacin
Solucin: Weave+Blitz
Permite escribir cdigo en C. Ofrece un interfaz sencillo a arrays. Weave es til cuando se opera con tipos simples: escalares, arrays... No es recomendable cuando hay que operar con tuples, listas...
1 2 3 4 5 6 7 8 9 /> python -m cProfile objects_weave.py > objects_weave.prof 1088768 function calls (1058481 primitive calls) in 141.797 seconds Ordered by: standard name ncalls tottime percall cumtime 1 0.023 0.023 53.191 387 0.007 0.000 12.484 1 14.413 14.413 49.556
Python en Supercomputacin
Python en Supercomputacin
Si buscamos implementaciones por Internet, todas son recursivas. Al llegar al 6o nivel de recursin... BUM!
El heap tiene un tamao limitado Si genero objetos en la recursin, almacenarlos requiere memoria.
Est bien para cosas pequeas, pero no es mi problema. Vamos, que es difcil.
Python en Supercomputacin
El mdulo itertools es realmente til... ...y rpido. Qu pasa si tengo cdigo en Python y no es lo sucientemente rpido?
1 2 ncalls 262144 tottime 11.994 percall 0.000 cumtime 21.658 percall filename:lineno(function) 0.000 otree_loop.py:223(pos)
Python en Supercomputacin
Cython
Cython es un source-to-source compiler. Python es lento porque es dinmico, no porque es interpretado Cython es python + tipado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cpdef build_lower(np.ndarray[float, ndim=3] f, int nlevels, int NX, voxels): """ Extension to boost the generation of the lowest level tree. """ cdef int p[6] cdef float n[8] cdef int dist cdef int facx cdef int facy cdef int facz [...]
Python en Supercomputacin
Et voil.
1 2 ncalls 262144 tottime 0.399 percall 0.000 cumtime 0.399 percall filename:lineno(function) 0.000 {otree_fast.select_lower}
Pero se me va el tiempo.
Python en Supercomputacin
Conclusiones
Me siento como un crash test dummy. Enorme cantidad de alternativas y herramientas. Ms variedad y calidad que Matlab... ...y probablemente que cualquier otro lenguaje interpretado Hay soluciones para prcticamente todos los problemas... ...pero ninguna universal.
Python en Supercomputacin
Muchas gracias.
Python en Supercomputacin