Benchmark de Modelos LLM Locais
História
Eu construí o LLM Speed Benchmark (LLMSB) durante meu tempo como estagiário de Engenharia em meio período na Anarchy (YC W23). O LLMSB é uma ferramenta de benchmark para avaliar o desempenho de um modelo LLM. Ele usa a biblioteca transformers da HuggingFace para carregar e executar um modelo LLM e mede:
- tempo total de execução
- tokens por segundo
- especificações gerais de hardware
- uso de CPU (frequência atual e % de uso dos núcleos ao longo do tempo)
- uso de RAM (RAM e swap ao longo do tempo)
- uso de GPU (carga, uso de memória e temperatura ao longo do tempo)
AQUI está um exemplo de uma execução de benchmark para o modelo codellama-13b-oasst-sft-v10 rodando em um H100. Eu pessoalmente possuo uma Nvidia RTX 2070 Ti, que tem 8 GB de VRAM. Infelizmente, para a maioria dos modelos LLM modernos, 8 GB de VRAM não é suficiente para interagir com um modelo. Devido a isso, eu usei o RunPod para “alugar” GPU(s) e executar meus benchmarks em certos modelos.
Esta foi a história de origem do LLMSB. Como o projeto é de código aberto, você pode visualizar o código AQUI. Abaixo, incluí o README do repositório se você quiser dar uma olhada.
Sobre
🚧 O LLM Speed Benchmark (LLMSB) está atualmente em beta (v0). Por favor, não use isso em produção, ou use por sua conta e risco. Ainda estamos resolvendo alguns problemas e melhorando a funcionalidade. Se você encontrar algum bug ou tiver sugestões, por favor, relate-os em ISSUES. Seu feedback é inestimável!
O LLM Speed Benchmark (LLMSB) é uma ferramenta de benchmark para avaliar o desempenho de modelos LLM em diferentes plataformas de hardware. Seu objetivo final é compilar um conjunto de dados abrangente detalhando o desempenho de modelos LLM em vários sistemas, permitindo que os usuários escolham de forma mais eficaz o(s) modelo(s) LLM certo(s) para seus projetos.
Limitações
O LLMSB está na versão v0, portanto, possui limitações:
- Projetado apenas para rodar em sistemas operacionais baseados em Debian, ou seja, não é projetado para rodar no Windows. Isso ocorre porque o LLMSB usa neofetch e nvidia-smi para coletar métricas nos bastidores e a lógica do caminho do arquivo é baseada em sistemas operacionais Unix.
- Devido à forma como as métricas são registradas, pode levar até 1 segundo para o coletor de métricas fazer uma coleta. Isso significa que, na melhor das hipóteses, podemos coletar métricas de hardware a cada 1 segundo.
- O LLMSB usa apenas a HuggingFace para carregar e executar modelos. Isso funciona por enquanto, mas o objetivo é que o LLMSB suporte múltiplas estruturas, não apenas a HuggingFace.
- Atualmente, todos os modelos são executados através da lógica apresentada na função run_llm(), localizada em src/hf.py, onde as funções AutoTokenizer() e AutoModelForCausalLM() são usadas para carregar e executar um modelo. Isso funciona, mas limita como podemos configurar/otimizar modelos específicos. Sabendo disso, o objetivo é criar classes separadas para cada modelo popular e utilizar as classes específicas de modelo da HuggingFace, como LlamaTokenizer e LlamaForCausalLM, em vez disso.
- O LLMSB apenas coleta métricas gerais e de alto nível. No futuro, gostaríamos de coletar métricas de nível mais baixo. Acreditamos que isso pode ser feito parcialmente usando o wrapper de profiler do Pytorch.
Exemplos de Saídas
22 de Novembro de 2023
O LLMSB foi executado/testado em uma GPU L40 e H100 através do RunPod. Nesses benchmarks, os modelos llama-2-7b-hf, codellama-13b-oasst-sft-v10 e mpt-7b foram testados. Confira os resultados AQUI. Se algum erro/problema for notado, por favor, relate-os em ISSUES.
Configuração
-
Crie e ative o ambiente Python:
python3 -m venv env source env/bin/activate -
Instale as dependências do pacote (usando APT):
apt -y update apt install -y vim apt install -y neofetch -
Instale as dependências do Python:
pip3 install transformers pip3 install psutil pip3 install gputil pip3 install tabulate pip3 install sentencepiece pip3 install protobuf -
Instale o Pytorch
# instale a versão estável do pytorch, para linux, usando CUDA 12.1: pip3 install torch torchvision torchaudio -
Instale o LLM-VM:
pip install llm-vm -
(opcional) Se você estiver usando modelos como LLAMA, precisará de um token de acesso da HuggingFace. Configure seu token de acesso AQUI e salve seu token no seu console executando o seguinte comando:
huggingface-cli login
Como Executar
-
Complete os passos listados na seção Configuração.
-
Para configurar seu conjunto, você precisa criar um arquivo json com os seguintes parâmetros (aqui está um exemplo):
- NOTA: nem todas as estruturas suportam os mesmos parâmetros
{ "model": "bigscience/bloom-560m", # o caminho/repositório do modelo na HuggingFace (https://huggingface.co/models) "prompt": "Olá Mundo!", # o prompt que você deseja inserir no modelo LLM "device": "cuda:0", # o dispositivo que você deseja usar para executar o modelo LLM (GPU/CPU) "max_length": 50, # o comprimento máximo dos tokens gerados "temperature": 0.9, # valor de temperatura para o modelo LLM "top_k": 50, # valor top-k para o modelo LLM "top_p": 0.9, # valor top-p para o modelo LLM "num_return_sequences": 1, # o número de instâncias do modelo executadas independentemente "time_delay": 0, # o atraso de tempo (segundos) que o coletor de métricas aguardará por interação "model_start_pause": 1, # o tempo (segundos) que o teste aguardará ANTES de executar o modelo LLM "model_end_pause": 1, # o tempo (segundos) que o teste aguardará DEPOIS que o modelo LLM terminar de executar, "framework": "llm-vm" # o nome da estrutura/biblioteca que você deseja usar para executar o modelo } -
Usando o caminho para o arquivo de configuração que você criou na etapa anterior, execute o seguinte para iniciar o benchmark (escolha uma opção):
# executar um benchmark python3 run.py --config ./configs/llmvm_test.json # executar mais de um benchmark (neste caso 3) python3 run.py --config ./configs/llmvm_test.json --loops 3 -
Após o benchmark terminar de rodar, confira os resultados finais em um arquivo que deve ter uma aparência semelhante a esta:
report_2023-11-25_05:55:04.207515_utc_1ffc4fa7-3aa9-4878-b874-1ff445e1ff8a.json
Configurando o RunPod:
-
Configure o RunPod, configure seu certificado/chave ssh e inicie um pod. Você pode acessar seu(s) pod(s) na Página do Console do RunPod.
-
Clique no botão “Conectar” para obter as informações de conexão ssh. Essas informações devem ter uma aparência semelhante a esta:
ssh root@12.345.678.90 -p 12345 -i ~/.ssh/id_example-
Este comando será formatado assim:
ssh <user>@<ip-address> -p <port> -i <local-path-to-ssh-cert>
-
-
Usando o comando na etapa #2, você deve ser capaz de ssh no pod e usar a GPU que você selecionou naquele pod do RunPod.
-
Se você quiser copiar um arquivo do pod para sua máquina local, você deve executar o comando neste formato (referindo-se às variáveis mostradas na etapa #2):
scp -P <port> -i <local-path-to-ssh-cert> <user>@<ip-address>:<path-to-file-in-pod> <path-to-local-directory>-
Aqui está um exemplo de tal comando:
scp -P 12345 -i ~/.ssh/id_example <user>@<ip-address>:/root/test.txt /home/user1/Downloads/
-
-
Depois de terminar com o pod, desligue-o ou pause-o. Mas atenção, se você pausar, ainda será cobrado, apenas muito menos.
Ótimas Fontes:
- Conjuntos de Dados de Prompt: awesome-chatgpt-prompts, bigscience/P3, & writing-prompts
- Saiba mais sobre os parâmetros LLM
- Ótimo benchmark para avaliar modelos LLM baseados em nuvem
- Classificações legais de inteligência LLM: FastEval & open_llm_leaderboard