11 pontos por GN⁺ 2024-02-24 | 1 comentários | Compartilhar no WhatsApp
  • Mecanismo de inferência C++ leve e executado de forma independente para os modelos Gemma do Google
  • Para quem é este projeto?
    • Os mecanismos modernos de inferência para modelos de linguagem de grande porte (LLMs) são sistemas complexos com recursos personalizados que vão além dos runtimes tradicionais de redes neurais
    • Há oportunidades de pesquisa e inovação por meio do co-design entre algoritmos de alto nível e computação de baixo nível, mas existe uma lacuna entre runtimes de inferência em C++ que não foram projetados para experimentação e frameworks de pesquisa em ML centrados em Python que abstraem a computação de baixo nível
    • O gemma.cpp oferece uma implementação mínima dos modelos Gemma 2B e 7B, com foco em simplicidade e objetividade em vez de generalidade
    • O gemma.cpp é voltado para casos de experimentação e pesquisa, pode ser facilmente integrado a outros projetos com dependências mínimas e é fácil de modificar, com cerca de 2K LoC de implementação principal e 4K LoC de utilitários de suporte
    • Utiliza o SIMD portátil da Google Highway Library para inferência em CPU
    • Para implantações em produção, recomenda-se o caminho de deploy padrão usando frameworks Python como JAX, Keras, PyTorch e Transformers

Início rápido

Requisitos do sistema

  • Antes de começar, é necessário ter instalado o CMake, o compilador Clang C++ (com suporte a C++17 ou superior) e o tar para extrair o arquivo baixado do Kaggle

Etapa 1: obter os pesos do modelo e o tokenizador no Kaggle

  • Visite a página do modelo Gemma no Kaggle e selecione Model Variations |> Gemma C++
  • O menu suspenso Variation inclui opções de pesos bfloat16 (maior fidelidade) e pesos convertidos para ponto flutuante de 8 bits (inferência mais rápida)
  • Em geral, recomenda-se começar com o checkpoint -sfp

Etapa 2: extrair os arquivos

  • Após preencher o termo de concordância, baixe e extraia o arquivo archive.tar.gz
  • Os arquivos extraídos incluem os pesos do modelo (por exemplo, 2b-it-sfp.sbs) e o arquivo do tokenizador (tokenizer.spm)
  • Você pode mover esses arquivos para um diretório conveniente (por exemplo, o diretório build/ deste repositório)

Etapa 3: build

  • O sistema de build usa CMake
  • Para compilar o runtime de inferência do gemma, crie um diretório de build e use o cmake no diretório raiz do projeto para gerar os arquivos de build
  • No caso dos pesos de ponto flutuante convertidos para 8 bits (sfp), execute o cmake sem opções
  • Se você baixou pesos bfloat16, em vez de executar o cmake sem opções como acima, execute-o definindo WEIGHT_TYPE como o tipo hwy::bfloat16_t da highway
  • Depois de executar o comando cmake apropriado, vá para o diretório build/ e execute make para gerar o executável ./gemma

Etapa 4: executar

  • Você pode executar o gemma dentro do diretório build/
  • O gemma exige argumentos obrigatórios e pode ser executado, por exemplo, usando o arquivo de pesos 2b-it-sfp.sbs e o arquivo de tokenizador tokenizer.spm

Uso

  • O gemma possui vários modos de uso controlados pela flag de verbosity
  • Atualmente, todos os modos de uso são interativos, e a geração de texto é acionada ao inserir uma nova linha

Aplicativo de terminal interativo

  • Por padrão, a verbosity é definida como 1, e o gemma fornece uma interface interativa baseada em terminal quando é chamado

Uso como ferramenta de linha de comando

  • Para usar o executável gemma como ferramenta de linha de comando, pode ser útil criar um alias com todos os argumentos para o gemma.cpp completamente especificados

Incluir a biblioteca gemma.cpp no projeto

  • A maneira mais fácil de incluir o gemma.cpp no seu próprio projeto é usar FetchContent para obter o gemma.cpp e suas dependências
  • Você pode adicionar o seguinte ao CMakeLists.txt

Compilar gemma.cpp como biblioteca

  • O gemma.cpp pode ser usado como dependência de biblioteca no seu próprio projeto, e é possível gerar um artefato de biblioteca compartilhada compilando o alvo libgemma

Agradecimentos e contato

  • O gemma.cpp foi iniciado no outono de 2023 por Austin Huang e Jan Wassenberg, e lançado em fevereiro de 2024 com contribuições de Phil Culliton, Paul Chang e Dan Zheng
  • Este não é um produto oficial com suporte do Google.

Opinião do GN⁺:

  1. O gemma.cpp é uma ferramenta útil para experimentar e pesquisar modelos de linguagem de grande porte, contribuindo para reduzir a lacuna em relação aos frameworks existentes centrados em Python ao oferecer um mecanismo de inferência leve baseado em C++
  2. Este projeto oferece uma oportunidade de contribuir com a comunidade open source e reforça a importância de seguir as diretrizes de código aberto do Google
  3. O gemma.cpp foi projetado para que desenvolvedores e pesquisadores possam integrá-lo e usá-lo facilmente em seus próprios projetos, oferecendo vários modos de uso e potencial para impulsionar a inovação nas áreas de AI e ML

1 comentários

 
GN⁺ 2024-02-24
Comentários no Hacker News
  • Resumo dos comentários do Hacker News:
    • Apresentação do Austin e descrição do projeto:

      • Austin é coautor do projeto e disse que responderia perguntas.
      • O gemma.cpp é independente do llama.cpp/ggml e foi inspirado pelo projeto llama.cpp.
      • O gemma.cpp é uma implementação direta do Gemma, com foco em experimentação, pesquisa, portabilidade e facilidade de modificação.
      • A implementação inicial é centrada em CPU SIMD, e estão explorando opções de suporte a GPU.
      • Perguntas sobre o próprio modelo Gemma serão respondidas por outros colegas; esta é a implementação em C++, mas é relativamente independente do processo de treinamento do modelo.
      • O trabalho foi feito por uma pequena equipe do Google, que espera que outras pessoas achem isso útil.
      • Foi fornecido um link para uma thread no Twitter sobre o projeto.
    • Opiniões sobre a competitividade do Google em LLMs:

      • Há críticas de que o Google está atrás da OpenAI em produtos comerciais, mas no campo de LLMs ele é muito competente.
      • Há a opinião de que, quando o Google realmente entra em ação, consegue resultados impressionantes.
      • Há esperança de que a concorrência open source continue graças ao Facebook e ao Llama, e de que se lembre que a visão inicial da OpenAI era importante, mesmo que ela esteja se afastando de sua missão original.
    • Pergunta sobre o sistema de build:

      • Um comentário pergunta por que o Google não usou bazel como sistema de build.
    • Elogios ao desempenho do Gemma:

      • O Gemma foi adicionado ao leaderboard HHEM e está mostrando baixa taxa de alucinação entre os modelos pequenos.
    • Admiração com a velocidade de evolução do ecossistema open source de LLMs:

      • A velocidade de evolução do ecossistema open source de LLMs é muito alta, com novas informações e código surgindo o tempo todo.
    • Pergunta sobre formatos de modelo:

      • Um comentário pede uma explicação sobre as diferenças entre vários formatos de modelo, como GGUF e GGML, e como eles são gerenciados.
    • Discussão sobre a capacidade matemática dos LLMs:

      • Há uma explicação de que LLMs não resolvem bem problemas de matemática, além de uma discussão sobre por que o ChatGPT parece resolvê-los bem.
      • Há uma pergunta sobre se projetos de LLM suportam modelos de plugin e se seria possível aplicar uma abordagem de plugins a um sistema desenvolvido com llama.cpp.
    • Pergunta sobre restrições de conteúdo no Gemma:

      • Há uma pergunta sobre se o Gemma tem recursos de restrição de conteúdo embutidos como o Gemini, ou se isso é uma característica do aplicativo Gemini.
    • Agradecimento pelo gemma.cpp e expectativa por novos recursos:

      • Um comentário agradece pelo repositório do gemma.cpp e diz que desenvolveu um wrapper em Python.
      • O wrapper em Python foi criado para facilitar o uso sempre que a equipe do gemma.cpp atualizar novas tecnologias.
    • Pergunta sobre o tamanho do executável do modelo Gemma:

      • Há uma pergunta sobre qual seria o tamanho final do executável se o modelo Gemma fosse construído com uma interface de linha de comando mínima e transformado em um arquivo executável autônomo capaz de rodar offline.