Hacia una IA generativa más privada

JUL 09, 2024
Krzysztof Ostrowski Research Scientist
Rene Kolga Senior Product Manager

Si bien la IA generativa se está adoptando rápidamente, todavía existe un gran potencial para crear productos aplicando esta herramienta en datos que presentan requisitos más estrictos, con el fin de garantizar que sigan siendo privados y confidenciales.

Por ejemplo, se podría aplicar la IA generativa en los siguientes casos:

  • Procesamiento de datos que permite que los asistentes personales estén más integrados y sean conscientes de lo que está sucediendo en nuestras vidas y, por lo tanto, puedan ayudarnos en una variedad más amplia de situaciones cotidianas.

  • Información comercial confidencial; por ejemplo, para automatizar tareas tediosas como el procesamiento de facturas o el manejo de consultas de atención al cliente para mejorar la productividad y reducir el costo operativo.

En ciertas aplicaciones como estas, puede haber requisitos más estrictos con respecto a la privacidad o confidencialidad, la transparencia y la verificabilidad externa del procesamiento de datos.

Google desarrolló una serie de tecnologías que puedes usar para comenzar a experimentar y explorar el potencial de la IA generativa a la hora de procesar datos cuya privacidad debe mantenerse más controlada. En esta entrada, explicaremos cómo puedes usar el proyecto de código abierto GenC, que se lanzó recientemente, para combinar Confidential Computing, los modelos de código abierto de Gemma y las plataformas móviles si quieres comenzar a experimentar con la creación de tus propias apps de IA generativa que puedan manejar datos con requisitos más estrictos con respecto a la privacidad o confidencialidad, la transparencia y la verificabilidad externa.


Trabajo en conjunto de dispositivos de usuario final y la nube

La situación en la que nos centraremos en esta entrada, que ilustraremos a continuación, involucra una dispositivos móviles que tiene acceso a datos en el dispositivo y desea procesar la IA generativa en estos datos utilizando un LLM.

Por ejemplo, imagina una app de asistente personal a la que se le pide que resuma o responda una pregunta sobre notas, un documento o una grabación guardada en el dispositivo. El contenido puede incluir información privada, como mensajes con otra persona, por lo que queremos asegurarnos de que siga siendo privada.

En nuestro ejemplo, elegimos la familia de modelos de código abierto de Gemma. Ten en cuenta que, si bien nos centramos aquí en una app para dispositivos móviles, los mismos principios se aplican a las empresas que alojan sus propios datos en sus instalaciones.

A model cascade that spans from a mobile device to a trusted enclave in cloud.

Este ejemplo muestra una configuración "híbrida" que involucra dos LLM: uno que se ejecuta localmente en el dispositivo del usuario y otro alojado en los entornos de ejecución confiable (TEE) de Confidential Space de Google Cloud, con tecnología de Confidential Computing. Esta arquitectura híbrida permite que la app para dispositivos móviles aproveche tanto los recursos disponibles en el dispositivo como en la nube para beneficiarse de las ventajas únicas que ofrecen ambos:

  • Una instancia más pequeña de Gemma 2B cuantificado que viene en un paquete de ~1,5 GB y se adapta a dispositivos móviles modernos (como Pixel 7), donde puede proporcionar tiempos de respuesta más rápidos (sin incurrir en latencia de red o transferencia de datos), la capacidad de admitir consultas incluso sin una conexión de red, y una mejor rentabilidad gracias a que aprovecha los recursos de hardware locales del dispositivo (y así llegar a un público más amplio por el mismo costo en el lado de la nube).

  • Una instancia más grande de Gemma 7B sin cuantificar que tiene casi ~35 GB y que no cabe ni siquiera en dispositivos de alta potencia. Dado que está alojada en la nube, depende de una conexión de red y tiene un costo más alto, pero ofrece una mejor calidad y la capacidad de manejar consultas más complejas o costosas (con más recursos disponibles para procesar), además de brindar otros beneficios (como minimizar el consumo de batería del dispositivo móvil gracias a los cálculos de descarga a la nube, etc.).

En nuestro ejemplo, los dos modelos trabajan juntos, conectados en una cascada de modelos en la que Gemma 2B, más pequeño, barato y rápido, sirve como primer nivel y maneja consultas más simples, mientras que Gemma 7B, más grande, sirve como respaldo para consultas que el primero no puede manejar por sí solo. Por ejemplo, en el fragmento de código más adelante, configuramos Gemma 2B para que actúe como enrutador en el dispositivo que primero analiza cada consulta de entrada a fin de decidir cuál de los dos modelos es el más apropiado, y luego, en función del resultado, procede a manejar la consulta localmente en el dispositivo, o la transmite a Gemma 7B, que se aloja en un TEE basado en la nube.


TEE como una extensión lógica del dispositivo

Se podría decir que el TEE en la nube en esta arquitectura es como una extensión lógica del dispositivo móvil del usuario, impulsado por la transparencia, las garantías criptográficas y el hardware confiable:

  • El contenedor privado con Gemma 7B y el tiempo de ejecución de GenC alojado en el TEE se ejecuta con memoria encriptada. La comunicación entre el dispositivo y el TEE también está encriptada y no se conserva ningún dato (pero si es necesario, también podría encriptarse en reposo).

  • Antes de que se produzca cualquier interacción, el dispositivo verifica la identidad e integridad del código en el TEE que manejará las consultas delegadas desde el dispositivo solicitando un informe de certificación, que incluye un resumen SHA256 de la imagen del contenedor que se ejecuta en el TEE. El dispositivo compara este resumen con un resumen que el desarrollador integró en la aplicación (ten en cuenta que, en esta situación simple, el usuario confía en el desarrollador de la aplicación, tal como lo haría con una aplicación que se encuentra exclusivamente en el dispositivo. Es posible contar con configuraciones más complejas, pero que no están dentro del alcance de este artículo).

  • Todo el código que se ejecuta en la imagen del contenedor en este escenario es 100% abierto. Por lo tanto, el desarrollador o cualquier tercero puede inspeccionar de forma independiente el código que ingresa en la imagen para verificar si procesa los datos de una manera que guarde relación con las expectativas del usuario o del propietario de los datos y si cumple con las obligaciones reglamentarias o contractuales, etc., y, luego, proceder a crear la imagen por su cuenta y confirmar que el resumen de la imagen resultante coincida con el resumen agrupado dentro de la aplicación y que espera la aplicación en el informe de certificación que posteriormente devuelve el TEE.

A primera vista, esta configuración puede parecer compleja. De hecho, lo sería si fuera necesario configurar todo completamente desde cero. Desarrollamos GenC precisamente para facilitar el proceso.


Cómo simplificar la experiencia de los desarrolladores

Este es el ejemplo de código que realmente tendrías que escribir para configurar un escenario como el anterior en GenC. Aquí usamos Python como opción popular, aunque también ofrecemos API de creación de Java y C++. En este ejemplo, utilizamos la presencia de un tema más sensible como una señal de que un modelo más potente (que sea capaz de elaborar una respuesta más cuidadosa) debe manejar la consulta. Ten en cuenta que se simplificó este ejemplo con fines ilustrativos. En la práctica, la lógica de enrutamiento podría ser más elaborada y centrarse más en la aplicación, y se requiere de una cuidadosa ingeniería rápida para lograr un buen rendimiento, especialmente con modelos más pequeños.

@genc.authoring.traced_computation
def cascade(x):
  gemma_2b_on_device = genc.interop.llamacpp.model_inference(
    '/device/llamacpp', '/gemma-2b-it.gguf', num_threads=16, max_tokens=64)
 
  gemma_7b_in_a_tee = genc.authoring.confidential_computation[
    genc.interop.llamacpp.model_inference(
      '/device/llamacpp', '/gemma-7b-it.gguf', num_threads=64, max_tokens=64),
    {'server_address': /* server address */, 'image_digest': /* image digest */ }]
 
  router = genc.authoring.serial_chain[
    genc.authoring.prompt_template[
      """Read the following input carefully: "{x}".
      Does it touch on political topics?"""],
    gemma_2b_on_device,
    genc.authoring.regex_partial_match['does touch|touches']]
 
  return genc.authoring.conditional[
    gemma_2b_on_device(x), gemma_7b_in_a_tee(x)](router(x))

Puedes ver un desglose detallado paso a paso de cómo crear y ejecutar dichos ejemplos en nuestros tutoriales en GitHub. Como puedes ver, el nivel de abstracción coincide con lo que puedes encontrar en SDK populares como LangChain. Las llamadas de inferencia de modelo a Gemma 2B y 7B se intercalan aquí con plantillas de solicitud y analizadores de salida, y se combinan en cadenas (por cierto, ofrecemos una interoperabilidad limitada de LangChain que esperamos expandir).

Ten en cuenta que, si bien la llamada de inferencia del modelo Gemma 2B se utiliza directamente dentro de una cadena que se ejecuta en el dispositivo, la llamada de Gemma 7B está explícitamente integrada dentro de una sentencia confidential_computation.

El punto es que no hay sorpresas: el programador siempre tiene el control total de la decisión de qué procesamiento realizar en el dispositivo y qué delegar del dispositivo a un TEE en la nube. Esta decisión se refleja explícitamente en la estructura del código (ten en cuenta que en este ejemplo, solo delegamos las llamadas de Gemma 7B a un único backend confiable, el mecanismo que proporcionamos es genérico y se puede usar para delegar fragmentos más grandes de procesamiento, como un bucle de agente completo, a un número arbitrario de backends).


Desde la creación de prototipos hasta una implementación flexible

Mientras que el código que se muestra arriba se expresa utilizando una sintaxis de Python familiar, en el nivel subyacente se está transformando en lo que llamamos una plataforma portátil y una forma independiente del lenguaje, a la que nos referimos como la representación intermedia (o "IR" para abreviar).

Este enfoque ofrece una serie de ventajas, como las siguientes:

  • Te permite crear prototipos y probar tu lógica de IA generativa en un entorno de desarrollo rápido y fácil de usar, que admite iteraciones rápidas, como una notebook Jupyter, y, luego, implementar el mismo código de IA generativa con cambios mínimos o sin cambios para ejecutar, por ejemplo, en una aplicación Java en un dispositivo móvil. En nuestros instructivos, esto es tan simple como copiar un archivo que contiene el IR en tu dispositivo móvil y cargarlo en tu app.

  • Te permite implementar y ejecutar la misma lógica con un comportamiento consistente en todos los lenguajes y plataformas (por ejemplo, desde plataformas basadas en Linux hasta móviles, desde Python hasta Java y C++). Esta es una ventaja si planeas apuntar a una serie de superficies de productos diferentes.

  • Te permite delegar dinámicamente cualquier parte de la lógica de la IA generativa a través de los límites del proceso y la máquina. Esto es implícitamente lo que está sucediendo en nuestra situación, con el dispositivo móvil delegando a un TEE en la nube. Resulta que, en este ejemplo simple, delegamos una sola operación (la llamada de inferencia de Gemma 7B). El mecanismo que ofrecemos es considerablemente más general.

En implementaciones realistas, el rendimiento suele ser un factor crítico. Nuestros ejemplos publicados en este momento se limitan a un solo CPU, y GenC actualmente solo ofrece llama.cpp como controlador para modelos en un TEE. Sin embargo, el equipo de Confidential Computing amplía el soporte a Intel TDX con el acelerador incorporado Intel AMX junto con la próxima versión preliminar de las GPU Nvidia H100, que se ejecutan en modo confidencial. Estamos trabajando activamente para ampliar la gama de opciones de software y hardware disponibles, a fin de lograr el mejor rendimiento y soporte para una variedad más amplia de modelos. ¡Presta atención a las próximas actualizaciones!


Queremos conocer tu opinión.

Esperamos haber despertado tu curiosidad y que esta entrada del blog te anime a experimentar con la creación de tus propias apps de IA generativa utilizando algunas de las tecnologías que presentamos. Y en ese sentido, ten en cuenta que GenC es un marco de trabajo experimental, desarrollado con fines experimentales y de investigación: lo creamos para demostrar lo que puedes hacer y para inspirarte a que explores este emocionante espacio con nosotros. Si deseas contribuir, comunícate con los autores o simplemente comunícate con nosotros en GitHub. ¡Nos encanta colaborar!