DeepFreeze es la herramienta utilizada para modelar PPA y generar RTL para el proyecto Fixynn . Los scripts se incluyen para generar RTL a partir de un gráfico TensorFlow y para sintetizar/simular ese diseño. Para trabajar con un gráfico de flujo no tensor, debe escribir su propia estructura de datos de capa para alimentarse a un objeto Veriloggenerator (consulte el final de gen_verliog.py
por ejemplo el uso).
Para obtener más información sobre Fixynn , incluida una descripción de DeepFreeze en contexto, consulte el siguiente documento: Fixynn: Hardware eficiente para la visión de la computadora móvil a través del aprendizaje de transferencia.
Esta herramienta fue construida y probada con Python 2.7.15 y TensorFlow 1.10.1.
Los paquetes de pitón requeridos son numpy y tensorflow. Para instalar:
pip install numpy tensorflow
cd deep_freeze/
bash run.sh
Para agregar un modelo para la generación o modelado RTL, debe proporcionar:
mobilenet_base
regresa en https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py)Cada capa en una red fija se define mediante un módulo Verilog generado o una instanciación parametrizada de un módulo escrito a mano. Se genera cualquier capa con variables entrenables, y todas las demás están instanciadas. Las variables entrenables están codificadas en el RTL con precisión variable, y se implementan en un diseño sintetizado como escalar fijos. Lo que tradicionalmente se implementaría en una unidad MAC en un acelerador programable se compone de escalar fijos seguido de un árbol de adder salvado en un diseño de peso fijo. Esto es muy eficiente en energía, pero requiere una gran área de silicio. El área de silicio crece linealmente con el nuble de variables fijas.
Para lograr una alta utilización de datos de datos fijos, tenemos capas de tubería completamente juntas. Esto requiere activaciones de amortiguación entre capas. Podemos evitar amortiguar la activación completa de una capa utilizando un búfer de línea. Este artículo proporciona una explicación fundamental qué buffer de línea y cómo se usan.
Nuestra implementación de un búfer de línea se compone de dos partes: un búfer SRAM y un búfer de registro. El SRAM almacena las activaciones para tantas filas que deba ser compiladas a la vez (igual a la altura del siguiente núcleo). El búfer de registro sigue el búfer SRAM y almacena las activaciones de MXN para los siguientes núcleos MXN. Esto elimina las lecturas innecesarias del búfer SRAM.
El tamaño SRAM requerido para una capa es IM_HEIGHT * IM_WIDTH * NCHANNELS * NBITS
. Esto se divide en IM_HEIGHT * IM_WIDTH
palabras de tamaño NCHANNELS * NBITS
. El tamaño del búfer de registro es K_HEIGHT * K_WIDTH * NCHANNELS * NBITS
.
La fijación de capas en el hardware brinda la oportunidad de una variedad de optimizaciones agresivas (tanto optimizaciones de hardware como optimizaciones en el diseño del modelo).
Las mejoras en la arquitectura de red pueden dar lugar a mejoras de PPA de hardware. Por ejemplo, las capas separables en profundidad pueden lograr una precisión similar a las capas convolucionales tradicionales con 8-9x menos pesos. Estas capas funcionan muy bien en Fixynn debido a la reducción de los costos de área. Cualquier otra técnica que reduzca el tamaño del modelo o mejore la precisión puede beneficiar a Fixynn.
La fijación de pesos en silicio nos permite beneficiarnos de una complejidad reducida de ciertos valores. Los pesos de valor cero son un ejemplo: se pueden eliminar explícitamente del hardware sin sobrecarga. Esto hace que la poda sea especialmente poderosa y atractiva.
Además, los valores con bajos pesos de hamming, es decir, el número de bits no cero en su representación binaria, son baratos de implementar en hardware fijo. Esto se debe a que los escalar fijos se implementan como una serie de turnos y agrega. Los menos bits no distintos de cero del multiplicando fijo, menos cambios y agentes se requieren. La herramienta de síntesis también puede aprovechar los valores con alto peso de hamming en relación con el número total de bits necesarios para representar el número. Por ejemplo, una x * 239
escalar (peso hamming = 7, nbits = 8) puede implementarse como x << 8 - x << 5
en hardware.
Para imágenes de alta resolución, cada fila de un búfer de línea requiere un área significativa de SRAM. Podemos eliminar parte de este sram amortiguando solo fracciones de una línea a la vez, y haciendo varios pases por la imagen. Esto tiene el costo de un mayor hardware de control y un cálculo redundante de las activaciones en el límite del rango de búfer de línea. Este cálculo redundante incurre en un costo mínimo de energía y latencia porque el hardware de peso fijo es muy eficiente.
Cualquier núcleo 1x1 no requiere que el amortiguador lo precieve porque puede consumir directamente las activaciones generadas por la capa anterior. Esto da como resultado capas separables en profundidad que no requieren ninguna amortiguación entre las convoluciones de profundidad y puntual. Por lo tanto, podemos fusionar estas dos operaciones en un bloque Cambinacional.
Las capas Conv2D son efectivas en este diseño porque exhiben una reutilización de alto peso, lo que resulta en un costo de área relativamente bajo. Las capas densas no exhiben reutilización de peso. Por lo tanto, las capas densas dan como resultado un uso muy ineficiente del área. Además, las capas densas no permiten el amortiguación de línea, lo que da como resultado áreas de registro bastante grandes.
Nuestro trabajo para SYSML 2019 (ver sysml_2019/
) explora los extractores de características CNN totalmente fijadas. El PPA para ese extractor de características es excelente porque solo contiene capas conv2d. Las redes completas implementadas en hardware fijo deben pagar el costo de área que demandan las capas densas. Esto puede ser aceptable para pequeños modelos IoT.
Los CNN generalmente exhiben el comportamiento donde las capas frontales tienen muchos píxeles de entrada y una pequeña cantidad de núcleos, mientras que las capas de fondo tienen menos píxeles de entrada y una gran cantidad de núcleos. Esto da como resultado que el área de SRAM se concentre hacia la parte delantera de la tubería de red, mientras que el área combinacional se concentra hacia la parte posterior de la tubería de la red.
Cualquier capa con un paso mayor que 1x1 produce menos píxeles de activación de lo que consume por imagen. Por ejemplo, una capa de piscina2D que se ejecuta 2x2 sobre una imagen de 100x100 produce una imagen 50x50, que es una reducción 4x en píxeles. Esto da como resultado las siguientes capas que tienen 1/4x el número de ciclos activos (cada píxel de salida por capa requiere 1 ciclo). Esto significa que las tuberías de red muy profundas con una gran cantidad de muestras descendentes serán en gran medida los cuellos de botella por las capas frontales, lo que dará como resultado una baja utilización de las capas de back-end.
Esta idea nos ayuda a seleccionar modelos que se traducirán bien en hardware. Ciertas arquitecturas realizan un muestreo inicial temprano de las activaciones para reducir la latencia en una CPU al reducir el número total de Mac (a costa del tamaño del modelo) (ver FD-Mobilenet). Los modelos implementados en Fixynn quieren hacer la compensación opuesta: para reducir el número de parámetros a costa de cálculo (ya que el área es la limitación principal del rendimiento en un sistema de mundo real).
Arreglar una parte de un CNN en hardware hace que sea difícil reutilizar ese hardware para otro propósito. Nuestro trabajo para SYSML 2019 explora esta compensación y demuestra que cierta cantidad de hardware fijo puede generalizarse a muchos modelos diferentes. El trabajo futuro se centrará en mejorar aún más la generalización del hardware fijo al agregar cierta programabilidad (al tiempo que se beneficia de la eficiencia del hardware de peso fijo).
SAME
relleno modificando sram_controller.sv
flatten.sv
para habilitar las redes de clasificación de imágenes totalmente fijadas aplanando una imagen de capas 2D a capas densas.ker_size
of Data se escribe en el SRAM.Los trabajos publicados que han utilizado esta herramienta se han presentado en SYSML 2019 y en el taller de ML en el dispositivo Neurips 2018. El papel completo se puede encontrar en ARXIV en Fixynn: hardware eficiente para la visión de la computadora móvil a través del aprendizaje de transferencia.
Si encuentra que esta investigación profunda para su investigación, utilice el siguiente bibtex para citarnos,
@article{fixynn,
title={FixyNN: Efficient Hardware for Mobile Computer Vision via Transfer Learning},
author={Whatmough, Paul and Zhou, Chuteng and Hansen, Patrick and Venkataramanaiah, Shreyas Kolala and Seo, Jae-Sun and Mattina, Matthew},
journal={SysML},
year={2019}
}
Patrick Hansen, Arm ML Research Lab, Boston, MA
Shreyas Kolala Venkataramanaiah, Universidad Estatal de Arizona
Paul Whatmough, Arm ML Research Lab, Boston, MA
Este proyecto tiene licencia bajo la licencia MIT; consulte el archivo de licencia para obtener más detalles.