Ajuste Fino
O ajuste fino de modelos de linguagem costumava significar alugar GPUs na nuvem e assistir ao relógio rodar. Se você possui um Mac com chip Apple Silicon, agora pode adaptar um modelo aberto aos seus próprios dados localmente, sem custos de nuvem, usando uma estrutura construída especificamente para o hardware que está no seu laptop. Eu fiz a transição de Windows e Dell para Mac em 2014 e nunca olhei para trás. O que começou como curiosidade sobre um sistema operacional mais limpo se transformou em uma profunda apreciação por como a Apple integra hardware e software de forma tão próxima. Mais de uma década depois, essa integração está gerando dividendos que eu nunca imaginei, mais recentemente na capacidade de ajustar modelos de linguagem completamente no dispositivo, sem uma conta de nuvem ou um único byte de dados saindo da minha máquina. Essa capacidade é impulsionada pelo MLX, uma biblioteca de arrays de código aberto da equipe de pesquisa de aprendizado de máquina da Apple, e seu pacote de acompanhamento MLX LM, que fornece geração de texto e ajuste fino para milhares de modelos abertos por meio de um pequeno conjunto de comandos.
Este tutorial percorre todo o processo de ponta a ponta: instalar as ferramentas, preparar um conjunto de dados, treinar um adaptador LoRA, reduzir o uso de memória com quantização e, em seguida, testar e servir o resultado. Ao final, você terá um modelo ajustado em execução na sua própria máquina e um fluxo de trabalho repetível que você pode usar em qualquer conjunto de dados. A maioria das ferramentas de inferência local começou a vida em hardware NVIDIA e foi posteriormente portada para o Mac. O MLX seguiu o caminho oposto. A equipe de pesquisa da Apple o projetou do zero em torno da arquitetura de memória unificada do Apple Silicon, onde o CPU e o GPU compartilham um único pool de memória. Esse design remove a etapa de cópia que normalmente transporta dados entre a memória do sistema e a memória do GPU dedicado.
Em um Mac de 16 GB, os pesos do modelo, o estado do otimizador e o lote de treinamento coexistem no mesmo espaço, o que é exatamente o que torna o ajuste fino no dispositivo prático em vez de aspiracional. A API espelha o NumPy de perto, adiciona diferenciação automática para treinamento e usa Metal para acelerar o trabalho do GPU, mantendo essa visão compartilhada da memória. Antes de começar, você precisará de um Mac com Apple Silicon (M1 ou mais recente), macOS Ventura 13.5 ou posterior e Python 3.10 ou superior. Os Macs Intel não são suportados. Tentar instalar em um deles retorna um erro de “distribuição não correspondente”. Com essa arquitetura em mente, vamos instalar as ferramentas. Comece com o pacote e seus extras de treinamento, que trazem tudo o que os comandos de ajuste fino precisam.
Confirme se a instalação funciona com um teste de geração rápido contra um modelo pequeno. A primeira execução baixa um modelo Mistral quantizado em 4 bits da organização MLX Community no Hugging Face, o armazena localmente e, em seguida, transmite uma resposta. A organização MLX Community hospeda milhares de modelos pré-convertidos, então você raramente precisa converter os pesos você mesmo. Uma restrição digna de nota desde cedo: o ajuste fino do MLX requer modelos no formato safetensors do Hugging Face. Arquivos GGUF, comuns em outras ferramentas locais, funcionam para inferência, mas não para treinamento aqui. As arquiteturas suportadas incluem Llama, Mistral, Qwen2, Phi, Gemma e Mixtral, entre outras, então a maioria dos modelos abertos populares está disponível pronta para uso.
Agora que o ambiente está pronto, o próximo passo é colocar seus dados em uma forma que o treinador possa usar. O MLX LM lê dados de treinamento de uma pasta contendo três arquivos: train.jsonl, valid.jsonl e um arquivo de teste.jsonl opcional. Cada linha contém um exemplo em JSON. O arquivo de treinamento é obrigatório, o arquivo de validação permite que o treinador relatar a perda de validação à medida que ele é executado, e o arquivo de teste pontua o modelo após o treinamento. Três formatos são suportados: chat, complementos e texto. O formato de chat é o padrão mais robusto. Ele armazena mensagens com marcação de papel por linha e permite que o MLX LM aplique o modelo de chat próprio, então seus dados correspondem à forma como o modelo foi treinado para lidar com conversas.
Para pares de entrada e saída simples, o formato de complementos é mais simples e funciona bem para tarefas de estilo de instrução. Por padrão, o treinador computa a perda sobre o exemplo inteiro, o que significa que o modelo gasta esforço para aprender a reproduzir o prompt, bem como a resposta. Passar –mask-prompt instrui-o a computar a perda apenas na complementação, então o treinamento se concentra na resposta que você realmente se importa. Isso geralmente produz um modelo que segue instruções de forma mais confiável, e funciona com os formatos de chat e complementos. Para dados de chat, a mensagem final na lista é tratada como a complementação. Mantenha cada exemplo em uma única linha sem quebras de linha internas, pois o leitor trata cada linha como um registro separado. Divida seus dados para que aproximadamente 80 por cento caia em train.jsonl e 10 a 20 por cento em valid.jsonl. Cerca de 200 a 500 exemplos é um número sensato para começar.
Com essas considerações em mente, você está pronto para começar a ajustar seu modelo. O MLX fornece uma poderosa ferramenta para fazer isso de forma eficiente e econômica, aproveitando a arquitetura do Apple Silicon. Ao seguir essas etapas e entender as opções disponíveis, você pode criar modelos de linguagem personalizados que atendam às suas necessidades específicas,