treinar_lora_mlx.sh 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/env bash
  2. # Treina um LoRA do Llama-3.1-8B-Instruct com os atendimentos exportados (estágio 2),
  3. # usando MLX no Apple Silicon. Ajustado para 16 GB de RAM (M4): modelo 4-bit, batch 1.
  4. #
  5. # Pré-requisito: dataset exportado (backend: node scripts/exportarDatasetTreinamento.js)
  6. # Uso: ./treinar_lora_mlx.sh [epocas] (default 3)
  7. set -euo pipefail
  8. cd "$(dirname "$0")"
  9. MODEL="mlx-community/Meta-Llama-3.1-8B-Instruct-4bit"
  10. DATA_DIR="data"
  11. ADAPTER_DIR="adapters"
  12. EPOCAS="${1:-3}"
  13. if [[ ! -f "$DATA_DIR/train.jsonl" ]]; then
  14. echo "ERRO: $DATA_DIR/train.jsonl não existe. Rode antes: cd .. && node scripts/exportarDatasetTreinamento.js" >&2
  15. exit 1
  16. fi
  17. if [[ ! -d .venv ]]; then
  18. python3 -m venv .venv
  19. fi
  20. source .venv/bin/activate
  21. pip -q install --upgrade mlx-lm
  22. N_TRAIN=$(wc -l < "$DATA_DIR/train.jsonl" | tr -d ' ')
  23. ITERS=$(( N_TRAIN * EPOCAS ))
  24. if (( ITERS < 100 )); then ITERS=100; fi
  25. echo "Treinando: $N_TRAIN amostras, $EPOCAS épocas => $ITERS iterações (batch 1)"
  26. mlx_lm.lora \
  27. --model "$MODEL" \
  28. --train \
  29. --data "$DATA_DIR" \
  30. --adapter-path "$ADAPTER_DIR" \
  31. --batch-size 1 \
  32. --num-layers 16 \
  33. --iters "$ITERS" \
  34. --max-seq-length 4096 \
  35. --grad-checkpoint \
  36. --save-every 100 \
  37. --steps-per-eval 100
  38. echo
  39. echo "Adapter salvo em $ADAPTER_DIR/. Teste rápido:"
  40. echo " mlx_lm.generate --model $MODEL --adapter-path $ADAPTER_DIR --prompt 'Boa tarde, minha internet caiu'"
  41. echo "Para publicar no Ollama: ./publicar_no_ollama.sh"