Guia de modelos de linguagem para hackers [Vídeo]
(youtube.com)- Jeremy Howard aborda modelos de linguagem com uma abordagem focada em código, mais do que em teoria, passando pelo fluxo prático de uso desde a API da OpenAI até modelos open source locais
- Modelos de linguagem preveem tokens, não palavras, e passam por pré-treinamento, ajuste por instruções e RLHF para ficarem mais adequados a responder perguntas e executar tarefas
- Em setembro de 2023, o GPT-4 era uma escolha forte, mas é fraco em informações sobre si mesmo, URLs e fatos posteriores ao corte de conhecimento, e custom instructions influenciam bastante a qualidade das respostas
- A API da OpenAI não armazena o estado da conversa, então é preciso enviar o histórico completo da conversa a cada vez, e é possível acoplar ferramentas como execução de Python por meio de chamadas de função
- A execução local é possível com Hugging Face Transformers, Llama 2, quantização GPTQ, RAG, fine-tuning com Axolotl, MLC e
llama.cpp, mas isso também traz exigências de GPU, formato de prompt e limitações de avaliação
Modelos de linguagem são sistemas de compressão que preveem tokens
- Modelos de linguagem funcionam prevendo a próxima palavra de uma frase ou preenchendo palavras que faltam
- Como exemplo, ele insere na
text-davinci-003da OpenAI uma frase contendo “panda breeding facility” e “live frogs” e gera a continuação da frase - No
nat.dev, é possível testar vários modelos de linguagem e ver a probabilidade dos próximos tokens candidatos
- Como exemplo, ele insere na
- A unidade real de previsão não é a palavra, e sim o token
- Tokens podem ser palavras inteiras, partes de palavras, pontuação, números etc.
- Com
tiktoken, é possível codificar uma string em um array de IDs de tokens com o mesmo tokenizador dos modelos GPT e depois decodificá-la novamente - No exemplo, “they are splashing” é dividido em partes de palavras incluindo os espaços
- O pré-treinamento é o processo de treinar uma rede neural para acertar a próxima palavra em documentos da internet ou frases da Wikipedia
- Um exemplo de treinamento mostra o modelo aprendendo a prever Hitchcock depois de Alfred em um trecho da Wikipedia sobre “The Birds”
- Para prever bem a próxima palavra, o modelo precisa aprender internamente conhecimento de mundo sobre objetos, tempo, filmes, diretores e nomes de pessoas
- Howard vê a previsão da próxima palavra como uma forma de compressão
- Para prever bem a próxima palavra, muita informação precisa ser comprimida dentro dos parâmetros da rede neural
- A relação entre compressão e inteligência é uma ideia discutida há muito tempo
O fluxo do pré-treinamento ao ajuste por instruções e RLHF
- Howard trata o ULMFiT como a ideia fundamental de como usar modelos de linguagem
- ULMFiT é um algoritmo criado por Howard em 2017 e transformado em artigo no início de 2018 com Sebastian Ruder
- O exemplo original era um modelo de linguagem pré-treinado com Wikipedia
- O fluxo de treinamento se divide em três etapas
- Pré-treinamento do modelo de linguagem: aprende conhecimento geral prevendo a próxima palavra
- Fine-tuning do modelo de linguagem: volta a treinar a previsão da próxima palavra com documentos mais próximos da tarefa final
- Fine-tuning do classificador: ajusta o modelo para a tarefa final
- Nos modelos de linguagem modernos, a segunda etapa é usada principalmente na forma de ajuste por instruções
- O modelo é ajustado com dados de perguntas, instruções, pedidos e respectivas respostas
- Os conjuntos de dados
OpenOrcaeFLAN collectionsão citados como exemplos - O OpenOrca inclui cerca de 4 GB de dados de perguntas, contexto e respostas
- A terceira etapa costuma usar RLHF
- Humanos ou um modelo melhor escolhem a melhor resposta entre várias respostas possíveis
- Um exemplo compara duas respostas para uma pergunta como “5 ideias para reencontrar a paixão pela carreira”
- A expressão “modelo de linguagem” pode, dependendo do contexto, se referir tanto a um modelo apenas pré-treinado quanto a um modelo ajustado por instruções ou que também passou por RLHF
- Um modelo puramente pré-treinado, sozinho, em geral tem pouca utilidade prática, e o fine-tuning aumenta bastante sua utilidade
- Howard comenta que hoje também existe discussão sobre se apenas ajuste por instruções já pode ser suficiente
Como usar bem o GPT-4 e quais são seus limites
- Howard recomenda fortemente o GPT-4 como o melhor modelo de linguagem em setembro de 2023
- No ChatGPT, pagando 20 dólares por mês, é possível usar bastante o GPT-4
- A API da OpenAI usa uma cobrança separada por token
- Sobre a afirmação de que o GPT-4 não consegue raciocinar, ele diz que, ao inserir diretamente exemplos de artigos ou da internet, muitas vezes o modelo acertava
- Os exemplos incluem o problema sobre quando Mabel morreu, o problema de Sally e seus irmãos, e o problema da posição de xícaras, dedais e diamantes
- Howard diz que, ao verificar exemplos na internet apresentados como falhas do GPT-4, na maioria das vezes eles funcionavam
- O modelo não é um sistema treinado para sempre dar a resposta correta
- O pré-treinamento é um processo de prever a próxima palavra mais plausível, e a internet contém ficção, piadas e informações erradas
- No RLHF, respostas mais confiantes podem ter sido preferidas, e os avaliadores talvez não conseguissem distinguir bem respostas erradas
- Custom instructions ajudam a melhorar a qualidade das respostas
- É possível anexar antes de toda consulta instruções como “você raciocina bem”, “diga se pode não haver resposta correta” e “primeiro explique o contexto em algumas frases”
- O modelo gera uma palavra por vez e inclui o que já gerou de volta na entrada, então gerar mais palavras permite fazer mais cálculo
- Também aparece o exemplo de uma regra pessoal como começar com
VVpara pedir respostas concisas
- O GPT-4 também tem limitações claras
- O modelo não teve chance de aprender, durante o treinamento, informações como a forma como ele mesmo foi treinado ou qual é seu comprimento de contexto
- Ele não conhece bem o conteúdo de URLs e, se perguntado, pode inventar
- O conhecimento de pré-treinamento do GPT-4 vai até setembro de 2021
- Se um quebra-cabeça clássico conhecido for levemente alterado, o modelo pode ser levado por padrões anteriores e responder errado
- É usado como exemplo um problema de atravessar o rio com repolho, cabra e lobo com restrições modificadas
- Depois de dar uma resposta errada, se tentar corrigir pela conversa, o modelo pode continuar errando, então é melhor usar o recurso de editar do chat para corrigir o prompt anterior
API da OpenAI e acoplamento de ferramentas com chamadas de função
- A API da OpenAI permite chamar modelos de linguagem programaticamente em Python e outras linguagens
- Depois de
pip install openai, é mostrado um exemplo chamando um modelo comogpt-3.5-turbocomChatCompletion.create - A mensagem
systemcumpre um papel parecido com o de custom instructions no ChatGPT - No exemplo, ele usa um prompt de sistema como “Aussie LLM” que usa gírias australianas e metáforas, e pergunta “What is money?”
- Depois de
- Nas conversas via API, não há estado persistente armazenado no servidor
- Ao fazer uma pergunta seguinte, é preciso reenviar o histórico completo da conversa
- Mesmo que o usuário altere arbitrariamente uma resposta anterior do assistant, o modelo continuará a partir daquele histórico de conversa
- No exemplo, ele finge que o assistant disse “money is like kangaroos” e pede para continuar explicando essa metáfora
- O custo varia de acordo com o modelo e a quantidade de tokens
- Em média, há um pouco mais tokens do que palavras, cerca de 1⅓ token por palavra
- No exemplo, é mencionada uma diferença de preço na ordem de
0.0015dólar para GPT-3.5 e0.03dólar para GPT-4 - Uma resposta de cerca de 150 tokens sai por volta de
0.0003dólar no GPT-3.5 - O uso pode ser consultado na página de usage da OpenAI
- Contas iniciais de API podem ter rate limit baixo
- Como exemplo, usuários gratuitos ou pagos nas primeiras 48 horas podem ter limites baixos, como 3 requisições por minuto
- Em caso de erro de rate limit, é preciso um código Python que leia o valor de
retry-after, espere e tente de novo
- Com function calling, é possível informar ao modelo quais ferramentas ele pode usar
- Em vez de enviar a própria função Python, informa-se ao modelo o nome da função, descrição e parâmetros em JSON schema
- A docstring com a descrição da função é a informação principal para o modelo decidir para que a ferramenta serve
- No exemplo da função
sums, o modelo não responde diretamente 6+3, e sim retorna o nome da chamada de função e os argumentos - Se uma função
pythonfor oferecida como ferramenta, o modelo pode gerar código para calcular, por exemplo, o fatorial de 12, e depois o usuário executa e devolve o resultado para a conversa - Dessa forma, dá para criar manualmente um interpretador de código simples dentro do Jupyter
Opções de modelos locais, RAG e fine-tuning
- Para usar modelos de linguagem localmente, em geral é necessário ter GPU
- O Kaggle pode oferecer notebooks com duas GPUs antigas
- O Colab pode oferecer GPUs melhores e mais RAM, e uma assinatura mensal amplia as opções
- São citadas opções de aluguel de GPU como RunPod, Lambda Labs e Vast.ai
- Tarefas sensíveis não são apropriadas para rodar “no computador de outra pessoa”
- Na escolha de GPU, velocidade e capacidade de memória são mais importantes do que desempenho bruto de computação
- Uma GTX 3090 usada é mencionada no eBay por algo em torno de 700 dólares
- A RTX 4090 é uma GPU mais nova, mas para modelos de linguagem não é claramente melhor do que a 3090
- 24 GB podem não ser suficientes para muitas tarefas, então duas 3090 aparecem como opção de cerca de 1.500 dólares
- Uma A6000 com 48 GB de RAM custa por volta de 5.000 dólares
- Macs com muita RAM, especialmente o M2 Ultra, não são ruins para rodar modelos existentes, mas são mais lentos do que placas Nvidia
- O ecossistema Hugging Face é a principal ferramenta para experimentar modelos locais
- Com
Transformers, é possível carregar modelos pré-treinados e ajustados hospedados no Hugging Face - Leaderboards servem como referência, mas podem não refletir bem a usabilidade real, e pode haver leakage quando dados de benchmark vazam para o conjunto de treinamento
- Em um ambiente comum com GPU pessoal, modelos de 13B ou 7B são mais realistas do que modelos de 70B
- Com
- A família Llama 2 e a quantização são os principais exemplos usados
- O
Llama 2 7Bda Meta é apenas um modelo pré-treinado, sem ajuste por instruções nem RLHF, então não é adequado de imediato para perguntas e respostas - Carregar um modelo 7B em 16 bits exige cerca de 14 GB só para os pesos
- Fazer cast para 8 bits reduz o uso de memória, mas pode deixar tudo mais lento
bfloat16é mais rápido, mas exige mais RAM- Modelos quantizados com
GPTQsão otimizados com menor precisão, reduzindo a movimentação de memória, e no exemplo até um modelo 13B GPTQ roda mais rápido que um 7B TheBlokeé citado como alguém que otimiza modelos populares com GPTQ e os publica no Hugging Face
- O
- Modelos ajustados por instruções exigem obrigatoriamente o formato de prompt correto
- Um modelo ajustado por instruções baseado em Llama 2, como
Stable Beluga, deve usar exatamente o formato de prompt mostrado na página do modelo - O
OpenOrca Platypus 13B GPTQtambém exige verificar um formato próprio de prompt e encapsulá-lo em uma função - Quando o formato é respeitado, perguntas como “Who is Jeremy Howard?” produzem respostas melhores, embora alucinações ainda possam ocorrer
- Um modelo ajustado por instruções baseado em Llama 2, como
- RAG é uma forma de usar informações atualizadas ou documentos privados
- O sistema busca documentos úteis para a pergunta e os adiciona ao contexto para o modelo responder
- Ao inserir como contexto as 613 palavras da página da Wikipedia de Jeremy Howard, o modelo gera uma resposta mais próxima de uma biografia correta de 100 palavras
sentence-transformersconverte documentos e perguntas em vetores de embedding e calcula similaridade para selecionar os documentos relevantes- Quando há milhares ou milhões de documentos, usa-se um banco de dados vetorial para pré-computar os embeddings
H2O GPTé citado como exemplo open source que permite enviar PDFs localmente e fazer RAG- Em perguntas seguintes, se o modelo de busca não conhecer o contexto anterior, pode recuperar documentos irrelevantes
- Fine-tuning é uma forma de mudar o comportamento do próprio modelo
- O conjunto de dados de exemplo contém esquema de banco de dados, perguntas em linguagem natural e o SQL correto como resposta
- O dataset é carregado com a biblioteca
datasetsdo Hugging Face - Com
Axolotl, ele copia um exemplo para Llama 2 e cria uma configuração YAML para treinar SQL - Após cerca de uma hora de treinamento com o comando
accelerate launch axolotl, é criado o diretórioq_lora_out Qsignifica quantize, eLoRAé uma técnica que ajuda a treinar com modelos menores e GPUs menores- Depois do treinamento, ao fornecer o esquema e a pergunta, o modelo gera o SQL correto no formato
SELECT count(hosts), theme ... GROUP BY theme
- Também há opções para Mac e outros ambientes de execução
MLCé um projeto para rodar modelos de linguagem em iPhone, Android e navegador web- Um exemplo mostra um modelo 7B quantizado rodando no Mac e respondendo “What is the meaning of life?”, com cerca de 9,6 tokens/s
llama.cppusa o formatoggufe também pode ser chamado por um wrapper Python- Se você já está acostumado com GPU Nvidia e Python, faz mais sentido usar PyTorch e o ecossistema Hugging Face
- O ambiente de desenvolvimento de modelos de linguagem muda rápido e ainda está em estágio inicial, então instalação e casos de borda são complicados, mas é um momento interessante para programadores Python
- É possível fazer perguntas ou compartilhar experiências no canal
generativedo Discord da fast.ai
- É possível fazer perguntas ou compartilhar experiências no canal
1 comentários
Opiniões do Hacker News
Acabei de publicar e fiquei surpreso que já apareceu no HN.
Estou bem empolgado com este vídeo. Tentei colocar o máximo possível das informações essenciais que me vieram à cabeça em uma apresentação de 90 minutos, e o objetivo era criar um único lugar para indicar quando desenvolvedores perguntarem “me diga tudo o que preciso saber sobre LLMs”.
Ainda assim, com certeza pode haver coisas que deixei de fora ou pontos que ficaram pouco claros. Esta é a primeira tentativa e, em algum momento, pretendo expandir isso para um curso completo, então seria ótimo saber quais perguntas restaram depois de assistir ao vídeo ou quais conceitos vocês acham que eu deveria ter abordado.
Preciso ir dormir em breve; como já é tarde na Austrália, talvez eu não consiga responder a muitas perguntas até de manhã. Mesmo assim, quando eu acordar, vou com certeza olhar esta página, e amanhã também vou adicionar links para os artigos relacionados na descrição do YouTube.
Não tratei de questões de ética ou políticas. Não porque não sejam importantes, mas porque, nesta apresentação, decidi me concentrar totalmente apenas nas questões técnicas.
Excelente. O notebook para acompanhar o vídeo está aqui: https://github.com/fastai/lm-hackers/blob/main/lm-hackers.ip...
A estrutura do projeto também ficou boa. Inclui hacking da API da OpenAI, uma imitação do Code Interpreter feita com OpenAI functions, execução de LLM local com modelos do Hugging Face e até um exemplo de fine-tuning para criar um modelo texto-para-SQL nos últimos 10 minutos.
Obrigado pelo vídeo. Foi o melhor tutorial de uso de LLMs que já vi até agora.
Em https://youtu.be/jkrNMKz9pWU?si=Dvz-Hs4InJXNozhi&t=3278, ao falar sobre os casos de uso adequados para modelos locais e para o GPT-4, ele diz que “com fine-tuning, é possível criar um modelo especialmente forte para o tipo de problema que preciso resolver, e nesses casos é perfeitamente possível ter desempenho melhor que o GPT-4”.
Tenho pensado há algum tempo em uma ideia relacionada a isso. Dá para imaginar um chatbot com vários modelos “pequenos” por trás, por exemplo modelos de 7 bilhões de parâmetros. Cada modelo seria ajustado para uma tarefa específica; será que um sistema assim poderia superar o GPT-4?
A ideia geral seria esta: enviar o contexto/prompt para um “modelo roteador”, que decidiria qual modelo especialista conseguiria responder ou completar melhor. Em seguida, o sistema passaria o contexto/prompt para esse modelo especialista e retornaria a resposta. Se não houvesse um modelo especialista adequado, usaria um LLM genérico de uso geral ajustado para seguir instruções.
Se um modelo pequeno ajustado para uma tarefa específica pode, em teoria, ser melhor que o GPT-4, então me pergunto se um conjunto desses pequenos modelos também não poderia, no geral, superar o GPT-4.
O vídeo está aqui [1] https://sambanova.ai/launch2023
Descendo um pouco, eles comparam com o modelo Falcon de 180 bilhões de parâmetros rodando em GPUs da HuggingFace. O resultado do MoE não só tem qualidade semelhante, como também é incrivelmente rápido, quase instantâneo. A possibilidade de trocar modelos especialistas ou retreiná-los com novos dados também é uma grande vantagem, algo que naturalmente não é fácil em um modelo único e mais monolítico de 180 bilhões de parâmetros.
Também é impressionante que o vídeo seja de uma das pessoas que escreveram o artigo que deu início a todo esse movimento.
É um vídeo excelente, compartilhei até no trabalho. Do ponto de vista prático, é provavelmente a introdução mais abrangente sobre o tema que eu conheço.
Gostei especialmente da seção “posts virais dizendo que GPT não consegue fazer X não são reproduzíveis”. Espero que ajude as pessoas ao meu redor a aprenderem a pensar de forma crítica ao olhar para essa tecnologia.
Excelente vídeo. Aprendi alguns truques novos que posso usar daqui para frente.
Só de tentar alguma coisa você acaba descobrindo novos usos.
Tive um bom exemplo há pouco tempo. Eu precisava converter uma planilha com endereços em GeoJSON para usá-la como camada de mapa, mas estava me sentindo muito preguiçoso e quis ver até onde o ChatGPT conseguiria lidar com isso.
Como primeiro passo, dei um par de latitude/longitude e pedi para converter o formato de graus/minutos para decimal; ele mostrou o cálculo sem problemas. Depois dei a coluna inteira de latitudes/longitudes e pedi para não mostrar os cálculos, e a saída também ficou boa.
Em seguida, criei uma estrutura JSON de exemplo com placeholders e disse que daria os dados para ele preencher os placeholders usando os nomes das colunas. Quando colei os dados, ele gerou o JSON perfeitamente.
O interessante foi que, sem instrução separada, ele refez a conversão de latitude/longitude e também incrementou uma propriedade id que eu nem tinha mencionado. Foi bem impressionante.
Jeremy é alguém que admiro e, como alguém que nasceu e vive em Queensland, ele me lembra que talentos de nível mundial realmente existem por toda parte ao nosso redor.
Claro que há muitas pessoas assim em todas as áreas, mas Jeremy é uma das pessoas que conheço e respeito profundamente.