Ativação de uma IA generativa mais particular

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

Embora a adoção da IA generativa (gen AI) esteja aumentando rapidamente, ainda há um potencial amplamente inexplorado para criar produtos com sua aplicação a dados que têm requisitos mais altos para garantir que permaneçam particulares e confidenciais.

Por exemplo, isso pode significar a aplicação da gen AI para:

  • Processamento de dados que possibilitem assistentes pessoais mais bem integrados e conscientes do que está acontecendo em nossas vidas e, portanto, capazes de nos ajudar em uma gama mais ampla de circunstâncias diárias.

  • Informações de negócios confidenciais, por exemplo, para automatizar tarefas tediosas, como processar faturas ou lidar com consultas de suporte ao cliente para aumentar a produtividade e reduzir o custo operacional.

Em certas aplicações como essas, pode haver requisitos mais rigorosos em relação à privacidade/confidencialidade, transparência e capacidade de verificação externa do processamento de dados.

O Google desenvolveu várias tecnologias que você pode usar para começar a fazer experimentos e explorar o potencial da gen AI para processar dados que precisem permanecer particulares. Nesta postagem, explicaremos como você pode usar o projeto de código aberto GenC recentemente lançado para combinar a Computação confidencial, os modelos de código aberto do Gemma e as plataformas móveis para começar a criar seus próprios apps habilitados pela gen AI com capacidade para lidar com dados que tenham requisitos mais rigorosos em relação à privacidade/confidencialidade, transparência e capacidade de verificação externa.


Dispositivos de usuário final e a nuvem, trabalhando juntos

O cenário em que nos concentraremos nesta postagem, ilustrado abaixo, envolve um app para dispositivos móveis que tem acesso a dados do dispositivo e deseja realizar o processamento da gen AI nesses dados usando um LLM.

Por exemplo, imagine um app de assistente pessoal que está sendo solicitado a resumir ou responder a uma pergunta sobre notas, um documento ou uma gravação armazenados no dispositivo. O conteúdo pode incluir informações particulares, como mensagens trocadas com outra pessoa, por isso é preciso garantir que ele permaneça particular.

Em nosso exemplo, escolhemos a família Gemma de modelos de código aberto. Observe que, embora nos concentremos aqui em um app para dispositivos móveis, os mesmos princípios se aplicam às empresas que hospedam seus próprios dados no local.

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

Este exemplo mostra uma configuração "híbrida" que envolve dois LLMs, um executado localmente no dispositivo do usuário e outro hospedado em um ambiente de execução confiável (TEE) do Confidential Space do Google Cloud habilitado por Computação confidencial. Essa arquitetura híbrida permite que o app para dispositivos móveis aproveite os recursos do dispositivo e da nuvem para se beneficiar das vantagens exclusivas de:

  • Uma instância menor do Gemma 2B quantizado que vem em um pacote de ~1,5 GB e cabe em dispositivos móveis modernos (como o Pixel 7), nos quais pode fornecer tempos de resposta mais rápidos (sem incorrer em latência de rede ou transferência de dados), a capacidade de suportar consultas mesmo sem uma conexão de rede e uma melhor relação custo-benefício graças à capacidade de aproveitar os recursos locais do hardware no dispositivo (e, assim, alcançar um público mais amplo pelo mesmo custo no lado da nuvem).

  • Uma instância maior do Gemma 7B não quantizado que tem quase ~35 GB e não cabe nem mesmo nos dispositivos mais avançados. Por ser hospedado na nuvem, ele depende de uma conexão de rede e tem um custo mais alto, mas oferece uma qualidade mais alta e a capacidade de lidar com consultas mais complexas ou caras (com mais recursos disponíveis para processamento), além de outros benefícios (como a minimização do consumo de bateria do dispositivo móvel, graças à transferência dos cálculos para a nuvem, entre outras coisas).

Em nosso exemplo, os dois modelos funcionam juntos, conectados a uma cascata de modelos na qual o Gemma 2B menor, mais barato e mais rápido serve como o primeiro nível e lida com consultas mais simples, enquanto o Gemma 7B maior serve como backup para consultas que o primeiro não pode tratar sozinho. Por exemplo, no snippet de código mostrado mais adiante, configuramos o Gemma 2B para atuar como um roteador no dispositivo que primeiro analisa cada consulta de entrada para decidir qual dos dois modelos é o mais apropriado e, em seguida, com base no resultado disso, lida com a consulta localmente no dispositivo ou a redireciona para o Gemma 7B que reside em um TEE baseado na nuvem.


O TEE como uma extensão lógica do dispositivo

Você pode pensar no TEE na nuvem nesta arquitetura como efetivamente uma extensão lógica do dispositivo móvel do usuário, contando com transparência, garantias criptográficas e hardware confiável:

  • O contêiner particular com o Gemma 7B e o ambiente de execução do GenC hospedado no TEE são executados com memória criptografada, a comunicação entre o dispositivo e o TEE também é criptografada e não há persistência de dados (mas, se necessário, isso também pode ser criptografado em repouso).

  • Antes de qualquer interação, o dispositivo verifica a identidade e integridade do código no TEE que lidará com consultas delegadas do dispositivo solicitando um relatório de atestado, que inclui um resumo SHA256 da imagem do contêiner que é executada no TEE. O dispositivo compara esse resumo com um resumo fornecido com o app pelo desenvolvedor. (Observe que, neste cenário simples, o usuário ainda confia no desenvolvedor do app, assim como faria com um app puramente no dispositivo; configurações mais complexas são possíveis, mas estão além do escopo deste artigo.)

  • Todo o código que é executado na imagem do contêiner neste cenário é 100% código aberto. Assim, o desenvolvedor ou qualquer outra parte externa pode inspecionar independentemente o código que entra na imagem para verificar se ele lida com os dados de uma maneira que corresponda às expectativas do usuário ou do proprietário dos dados, a obrigações regulatórias ou contratuais etc., e depois prosseguir para criar a imagem por conta própria e confirmar se o resumo da imagem resultante corresponde ao resumo fornecido no app e esperado pelo app no relatório de atestado que é, posteriormente, retornado pelo TEE.

À primeira vista, essa configuração pode parecer complexa, e de fato seria se alguém tivesse que configurar tudo completamente do zero. Desenvolvemos o GenC precisamente para facilitar o processo.


Simplificação da experiência do desenvolvedor

Segue o exemplo de código que você realmente teria que escrever para configurar um cenário como o indicado acima no GenC. Temos como padrão o Python como uma escolha popular, embora também ofereçamos APIs de criação em Java e C++. Neste exemplo, usamos a presença de um assunto mais confidencial como um sinal de que a consulta deve ser tratada por um modelo mais avançado (que seja capaz de criar uma resposta mais cuidadosa). Tenha em mente que este exemplo é simplificado para fins ilustrativos. Na prática, a lógica de roteamento pode ser mais elaborada e específica à aplicação, e uma engenharia rápida e cuidadosa é essencial para alcançar um bom desempenho, especialmente com modelos menores.

@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))

Você pode ver um detalhamento passo a passo de como criar e executar esses exemplos em nossos tutoriais no GitHub. Como você pode ver, o nível de abstração corresponde ao que você pode encontrar em SDKs populares, como o LangChain. As chamadas de inferência de modelo para o Gemma 2B e 7B são intercaladas aqui com modelos de prompt e analisadores de saída e combinadas em cadeias. (A propósito, oferecemos uma interoperabilidade limitada com o LangChain que pretendemos expandir.)

Observe que, enquanto a chamada de inferência do modelo do Gemma 2B é usada diretamente em uma cadeia executada no dispositivo, a chamada do Gemma 7B é explicitamente incorporada a uma instrução confidential_computation.

O fato é que não há surpresas aqui: o programador está sempre no controle total da decisão de qual processamento executar no dispositivo e qual delegar do dispositivo para um TEE na nuvem. Essa decisão é explicitamente refletida na estrutura do código. (Observe que, neste exemplo, só delegamos as chamadas do Gemma 7B a um único back-end confiável, o mecanismo que fornecemos é genérico e é possível utilizá-lo para delegar blocos maiores de processamento, por exemplo, uma repetição de agente inteira, a um número arbitrário de back-ends.)


Da prototipagem à implantação flexível

Embora o código mostrado acima seja expressado por meio de uma sintaxe do Python familiar, nos bastidores ele está sendo transformado no que chamamos de uma forma portável e independente de plataforma e linguagem que batizamos como representação intermediária (ou "IR", na sigla em inglês).

Essa abordagem oferece uma série de vantagens; como:

  • Ela permite prototipar e testar a lógica da gen AI em um ambiente de desenvolvimento rápido e fácil de usar que suporta iteração em ritmo acelerado, como um notebook Jupyter, e depois implanta o mesmo código de gen AI com o mínimo de alterações para execução, por exemplo, em um app Java em um dispositivo móvel. Em nossos tutoriais, isso é tão simples quanto copiar um arquivo contendo a IR para o dispositivo móvel e carregá-lo no app.

  • Ela permite implantar e executar a mesma lógica, com comportamento consistente em todas as linguagens e plataformas (por exemplo, de plataformas baseadas em Linux a plataformas móveis, de Python a Java e C++). Isso é ótimo se você planejar segmentar várias plataformas de produtos diferentes.

  • Ela permite delegar dinamicamente qualquer parte da lógica da gen AI entre limites de processo e máquina. Isso é implicitamente o que está acontecendo em nosso cenário, com o dispositivo móvel delegando para um TEE na nuvem. Acontece que, neste exemplo simples, estamos delegando apenas uma única operação (a chamada de inferência do Gemma 7B). O mecanismo que oferecemos é consideravelmente mais geral.

Em implantações realistas, o desempenho é muitas vezes um fator crítico. Nossos exemplos publicados no momento estão limitados apenas à CPU, e o GenC atualmente oferece apenas o llama.cpp como driver para modelos em um TEE. No entanto, a equipe de Computação confidencial está estendendo o suporte ao Intel TDX com o acelerador integrado Intel AMX, juntamente com a próxima prévia das GPUs Nvidia H100 em execução no modo confidencial, e estamos trabalhando ativamente para expandir a gama de opções de software e hardware disponíveis para desbloquear o melhor desempenho e suporte possíveis para uma gama mais ampla de modelos. Não perca as próximas atualizações!


Adoraríamos saber a sua opinião!

Esperamos ter aguçado a sua curiosidade e que esta postagem incentive você a tentar criar seus próprios aplicativos de gen AI usando algumas das tecnologias que introduzimos. E, falando nisso, tenha em mente que o GenC é um framework experimental, desenvolvido para fins experimentais e de pesquisa. Nós o criamos para demonstrar o que é possível e para inspirar você a explorar esse espaço emocionante conosco. Se você quiser contribuir, entre em contato com os autores ou simplesmente fale conosco no GitHub. Adoramos colaborar!