Benchmark de Modelos LLM Locais
Contexto
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 benchmarking para avaliar o desempenho de um modelo LLM. Ele usa a biblioteca transformers do HuggingFace para carregar e executar um modelo LLM e mede:
- tempo total de execução
- tokens por segundo
- especificações gerais de hardware
- uso da cpu (frequência atual e % de uso dos núcleos ao longo do tempo)
- uso da ram (ram e swap ao longo do tempo)
- uso da 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 executando em um H100. Eu possuo pessoalmente 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. Por causa disso, usei RunPod para “alugar” GPU(s) e executar meus benchmarks em certos modelos.
Esta foi a história de contexto/origem do LLMSB. Como o projeto é de código aberto, você pode ver o código AQUI. Abaixo, incluí o README do repositório, caso queira dar uma olhada.
Sobre
🚧 O LLM Speed Benchmark (LLMSB) está atualmente em beta (v0). Por favor, não use isto em produção, ou use por sua conta e risco. Ainda estamos ajustando algumas arestas e melhorando a funcionalidade. Se você encontrar quaisquer bugs ou tiver sugestões, por favor reporte-os em ISSUES. Seu feedback é inestimável!
O LLM Speed Benchmark (LLMSB) é uma ferramenta de benchmarking 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 v0, então tem limitações:
- Foi projetado apenas para rodar em sistemas operacionais baseados em Debian, ou seja, não foi projetado para rodar no Windows. Isso porque o LLMSB usa neofetch e nvidia-smi para coletar métricas nos bastidores e a lógica dos caminhos de arquivo é baseada em sistemas operacionais Unix.
- Devido à forma como as métricas são registradas, o coletor de métricas pode levar até 1 segundo para realizar uma coleta. Isso significa que, no mínimo, podemos coletar métricas de hardware a cada 1 segundo.
- O LLMSB usa apenas o HuggingFace para carregar e executar modelos. Isso funciona por enquanto, mas o objetivo é que o LLMSB suporte múltiplas estruturas, não apenas o HuggingFace.
- Atualmente, todos os modelos são executados por meio 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 do HuggingFace, como LlamaTokenizer e LlamaForCausalLM, em vez disso.
- O LLMSB apenas coleta métricas gerais, de alto nível. No futuro, gostaríamos de coletar métricas de nível mais baixo. Acreditamos que isso pode ser feito em parte usando o wrapper de profiler do Pytorch.
Saídas de Exemplo
22 de novembro de 2023
O LLMSB foi executado/testado em uma GPU L40 e H100 por meio 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 reporte-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
# instalar a build 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, você precisará de um token de acesso do HuggingFace. Configure seu token de acesso AQUI e então salve seu token no seu console executando o seguinte comando:
huggingface-cli login
Como Executar
-
Conclua as etapas listadas na seção Configuração.
-
Para configurar seu conjunto, você precisa criar um arquivo json com os seguintes parâmetros (aqui está um exemplo):
- OBSERVAÇÃO: nem toda estrutura suporta os mesmos parâmetros
{ "model": "bigscience/bloom-560m", # o caminho/repositório do modelo no HuggingFace (https://huggingface.co/models) "prompt": "Hello World!", # o prompt que você quer inserir no modelo LLM "device": "cuda:0", # o dispositivo em que você quer 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 de top-k para o modelo LLM "top_p": 0.9, # valor de top-p para o modelo LLM "num_return_sequences": 1, # o número de instâncias executadas independentemente do modelo "time_delay": 0, # o atraso de tempo (segundos) que o coletor de métricas aguardará por iteraçã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ê quer 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 -
Depois que o benchmark terminar de executar, confira os resultados finais em um arquivo que deve parecer algo assim:
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 obtenha um pod em execução. Você pode acessar seu(s) pod(s) na Página do Console do RunPod.
-
Clique no botão “Connect” para obter as informações de conexão ssh. Essas informações devem parecer algo assim:
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ê deverá conseguir fazer 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ê usaria um comando neste formato (isto se refere à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 que terminar com o pod, desligue-o ou pause-o. Mas atenção: se você pausá-lo, ainda será cobrado, só que bem menos.
Ótimas Fontes:
- Conjuntos de Dados de Prompts: awesome-chatgpt-prompts, bigscience/P3 e writing-prompts
- Saiba mais sobre parâmetros de LLM
- Ótimo benchmark para fazer benchmark de modelos LLM baseados em nuvem
- Quadros de liderança legais de inteligência LLM: FastEval e open_llm_leaderboard