Use modelos abertos Gemma com o Dataflow

O Gemma é uma família de modelos abertos leves e de vanguarda criados a partir de investigação e tecnologia usadas para criar os modelos Gemini. Pode usar modelos Gemma nos seus pipelines de inferência do Apache Beam. O termo peso aberto significa que os parâmetros ou os pesos pré-treinados de um modelo são divulgados. Não são fornecidos detalhes como o conjunto de dados original, a arquitetura do modelo e o código de preparação.

Exemplos de utilização

Pode usar os modelos Gemma com o Dataflow para análise de sentimentos. Com o Dataflow e os modelos Gemma, pode processar eventos, como críticas de clientes, à medida que chegam. Execute as críticas através do modelo para as analisar e, em seguida, gerar recomendações. Ao combinar o Gemma com o Apache Beam, pode concluir este fluxo de trabalho sem problemas.

Apoio técnico e limitações

Os modelos abertos Gemma são suportados com o Apache Beam e o Dataflow com os seguintes requisitos:

  • Disponível para pipelines de processamento em lote e streaming que usam as versões 2.46.0 e posteriores do SDK Python do Apache Beam.
  • As tarefas do Dataflow têm de usar o Runner v2.
  • As tarefas do Dataflow têm de usar GPUs. Para ver uma lista dos tipos de GPU suportados com o Dataflow, consulte a secção Disponibilidade. Os tipos de GPU T4 e L4 são recomendados.
  • O modelo tem de ser transferido e guardado no formato de ficheiro .keras.
  • O gestor de modelos do TensorFlow é recomendado, mas não obrigatório.

Pré-requisitos

  • Aceda aos modelos Gemma através do Kaggle.
  • Preencha o formulário de consentimento e aceite os Termos de Utilização.
  • Transfira o modelo Gemma. Guarde-o no formato de ficheiro .keras numa localização à qual a sua tarefa do Dataflow possa aceder, como um contentor do Cloud Storage. Quando especifica um valor para a variável de caminho do modelo, use o caminho para esta localização de armazenamento.
  • Para executar a sua tarefa no Dataflow, crie uma imagem de contentor personalizada. Este passo permite executar o pipeline com GPUs no serviço Dataflow.

Use o Gemma no seu pipeline

Para usar um modelo Gemma no seu pipeline do Apache Beam, siga estes passos.

  1. No código do Apache Beam, depois de importar as dependências do pipeline, inclua um caminho para o modelo guardado:

    model_path = "MODEL_PATH"
    

    Substitua MODEL_PATH pelo caminho onde guardou o modelo transferido. Por exemplo, se guardar o modelo num contentor do Cloud Storage, o caminho tem o formato gs://STORAGE_PATH/FILENAME.keras.

  2. A implementação do Keras dos modelos Gemma tem um método generate() que gera texto com base num comando. Para transmitir elementos ao método generate(), use uma função de inferência personalizada.

    def gemma_inference_function(model, batch, inference_args, model_id):
      vectorized_batch = np.stack(batch, axis=0)
      # The only inference_arg expected here is a max_length parameter to
      # determine how many words are included in the output.
      predictions = model.generate(vectorized_batch, **inference_args)
      return utils._convert_to_result(batch, predictions, model_id)
    
  3. Execute o pipeline, especificando o caminho para o modelo preparado. Este exemplo usa um controlador de modelo do TensorFlow.

    class FormatOutput(beam.DoFn):
      def process(self, element, *args, **kwargs):
        yield "Input: {input}, Output: {output}".format(input=element.example, output=element.inference)
    
    # Instantiate a NumPy array of string prompts for the model.
    examples = np.array(["Tell me the sentiment of the phrase 'I like pizza': "])
    # Specify the model handler, providing a path and the custom inference function.
    model_handler = TFModelHandlerNumpy(model_path, inference_fn=gemma_inference_function)
    with beam.Pipeline() as p:
      _ = (p | beam.Create(examples) # Create a PCollection of the prompts.
             | RunInference(model_handler, inference_args={'max_length': 32}) # Send the prompts to the model and get responses.
             | beam.ParDo(FormatOutput()) # Format the output.
             | beam.Map(print) # Print the formatted output.
      )
    

O que se segue?