Skip to content

lerker/cupydle

Repository files navigation

CUPYDLE

Build Status GitHub issues GitHub license GitHub forks todofy badge

CUdaPYthonDeepLEarning Machine Learning

Introducción

cupydle es una libreria simple y sencilla, que provee todas las funcionalidades necesarias para la ejecucion de Redes de Creencia Profunda (DBN) sobre placas de procesamiento grafico para proposito general (GP-GPU).

cupydle posse una inteface 'pythonica', y además, el codigo puede ser ejecutado de forma transparente tanto en GPU como en CPU gracias a Theano (http://deeplearning.net/software/theano/).

Documentacion: DOCS

✅ finished

❎ not done

⁉️ in progress or not finished

‼️ very important and not done

Funcionalidades:

  • Generales

    • Optimizacion inteligente en la carga de memoria con los datos, chunk_size automatico
    • Persistencia de los datos optimizada, unico archivo comprimido de dimension variable
  • Maquinas de Boltzmann Restringidas (RBM)

    • Entrenamiento

      • MacroBatch, copia por chunks hacia la GPU.
      • Algoritmo de Divergencia Constrastiva de n pasos de Gibbs (CD_n)
      • Algoritmo de Divergencia Constrastiva Persistente de n pasos de Gibbs (PCD_n)
      • Momento, batch-learning
      • Unidades Ocultas Binarias.
      • Unidades Ocultas Gausianas.
      • Función de costo, error cuadratico medio (MSE).
      • Función de costo, entropia cruzada.
      • Función de costo, Energia Libre.
    • Evaluación

      • Muestreo desde el modelo.
      • Visialización de Filtros.
      • Almacenamiento y recuperación de las representaciones ocultas.
  • Redes de Creencia Profunda (DBN)

    • Entrenamiento (no supervisado)
      • Apilado de RBMs en capas.
      • Almacenamiento.
    • Entrenamiento (supervisado)
      • Recuperacion de las capas, pesos ya entrenados.
      • Ajuste de los pesos por medio de un Perceptron Multi-Capa (MLP).
        • Inicialización de los pesos.
  • Redes Neuronales Generales (MLP)

    • Entrenamiento
      • Numero variable de capas, capas logisticas, softmax.
      • Funciones de activacion varias, Sigmoidea.
      • Algoritmo del Gradiente Descendiente Estocastico (SGD)
        • Calculo de gradientes, retropropagacion del error.
        • Tecnicas
          • [] patience
          • rapid evaluation
      • momento, batch-learning.
      • Función de costo, entropia cruzada.
      • Función de costo, error cuadratico medio (MSE).
  • Validacion y testing

    • Validacion Cruzada
      • K_fold
      • LabelKFold
      • LeaveOneOut
      • StratifiedKFold
    • [] Parameters Searching
      • [] Grid Search
      • [] Random Grid Search
  • Pruebas

    • MNIST
      • Preparación de los datos, descarga y manipulación.
      • Visualización de los datos.
      • Visualización de los filtros. ⁉️ (realizar la funcion en rbm que genere los filtro a partir de patches cuadrados...)
      • Muestreo de varios ejemplos a traves de sucesivas cadenas de Markov.
    • RML
      • Pre-procesamiento de datos crudos
        • videos
        • audio
      • Reduccion de dimension de los datos crudos
        • PCA a los videos
        • f0_enegy, coeficientes ceptrales, windowing, etc a los audios
      • Normalizacion de los datos
        • z_score
        • whitening
        • min_max

Notas GP-GPU

En la maquina Host debe estar instalado el driver correspondiente Nvidia al modelo de la placa, en el caso de pruebas es Nvidia

~$: /proc/driver/nvidia/gpus/0000\:01\:00.0/information

Model:           Tesla C1060
IRQ:             46
GPU UUID:        GPU-ffb9af25-05ad-7d83-5e0b-a397677ec9fe
Video BIOS:      62.00.7a.00.05
Bus Type:        PCIe
DMA Size:        40 bits
DMA Mask:        0xffffffffff
Bus Location:    0000:01:00.0
~$: cat /proc/driver/nvidia/version

NVRM version: NVIDIA UNIX x86_64 Kernel Module  340.29  Thu Jul 31 20:23:19 PDT 2014
GCC version:  gcc version 4.6.4 (Ubuntu/Linaro 4.6.4-6ubuntu2)

Pasos, en ubuntu, fue requerido por cuestiones de compatibilidad por la placa la version de CUDA 6.0, aunque versiones mas recientes (7.5) funcionan con normalidad:

:$ wget http://developer.download.nvidia.com/compute/cuda/6_0/rel/installers/cuda_6.0.37_linux_64.run

# o bien la 6.5
:$ wget http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda_6.5.14_linux_64.run

Cuda Toolkit requiere como a lo mas la version de compilador GCC 4.6

:$ chmod a+x cuda_6.0.37_linux_64.run
:$ ./cuda_6.0.37_linux_64.run

# controlar las variables de entorno
:$ export PATH=/usr/local/cuda/bin:${PATH}
:$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}
:$ export PYTHONPATH=/root/cupydle/:${PYTHONPATH}

# probar el correcto funcionamiento
:$ cd [ruta de los ejemplos]/NVIDIA_CUDA-6.0_Samples/deviceQuery ; make ; ./deviceQuery

:$ cat /proc/driver/nvidia/version
:$ nvidia-smi
:$ nvcc --version

Notas Docker

La libreria fue probada sobre un entorno 'virtualizado' del estilo Docker.

A continuacion se detallan algunos pasos para su correcta intalación, los pasos se encuentran en el 'Dockerfile'.

  1. Se debe ejecutar siempre antes del inicio del Docker Container el ejecutable deviceQuery para que la unidad GPU sea visible.

  2. Crear la imagen a partir del Dockerfile, en el caso de que sea necesario ejecutar si o si el paso anterior este no funcionara, se debera realizar la instalacion manual (debido a que las unidades no son cargadas al inicio con el build). Alguno de los siguientes pasos:

  3. docker build -t "ubuntu/cuda/theano/python3" .

  4. sudo docker run -it --privileged=true --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm --device /dev/nvidia0:/dev/nvidia ubuntu:14.04 /bin/bash

    correr en modo previligiado y cargar los devices (probar con docker-nvidia o docker solo)

    sudo nvidia-docker run -it --privileged=true --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm --device /dev/nvidia0:/dev/nvidia ubuntu/cuda/theano/python3 /bin/bash

  5. Cheat Sheet

  • contenedores (-q solo ids)

    docker ps -a

  • imagenes

    docker images -a

  • borrar contenedor [ docker rm $(docker ps -aq) ]

    docker rm

  • borrar imagen

    docker rmi

  • crear imagen

    docker build -t "nombre/de/mi/imagen/:tag" /path:dockerfile

  • correr contenedor (iterativo -i, borrar contenedor al salir --rm)

    sudo docker run -it --privileged=true --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm --device /dev/nvidia0:/dev/nvidia <imagen_id> /bin/bash

  • salir sin exit del contenedor

    ctrl+p y luego ctrl+q

  • commitear los cambios

    docker commit

  • volver al container

    docker attach

  • copiar un archivo del container en ejecucion

    docker cp :absolut/path/to/file destination/path/in/host

Autor

Ponzoni Cuadra, Nelson E. (@lerker)

Contacto y Soporte

Algun problema? Mandame un mail a npcuadra@gmail.com