- Motor de inferência baseado em Docker para executar modelos de linguagem de grande porte em GPUs AMD, voltado para modelos do Hugging Face e com foco na família LLaMA
- O ambiente de execução exige GPU AMD com suporte a ROCm, Docker e driver ROCm 5.4.2 ou versão compatível instalado no host
- O
run-docker-amd.sh cria automaticamente a imagem Docker e executa o contêiner com /dev/kfd, /dev/dri, grupo video, SYS_PTRACE e seccomp=unconfined para permitir o acesso necessário à GPU AMD
- O usuário pode trocar o modelo passando o nome do repositório no Hugging Face e o prompt como argumentos; os exemplos incluem
meta-llama/Llama-2-7b-chat-hf e facebook/opt-1.3b
- Para alterar o comportamento da inferência, é preciso modificar
run_inference.py e recriar a imagem Docker; em caso de falta de memória, use um modelo menor ou comprimentos de entrada/saída mais curtos
Objetivo do projeto e modelos-alvo
- Este projeto é um motor de inferência baseado em Docker para executar LLMs em GPUs AMD
- Foi projetado para usar modelos do Hugging Face, com foco especial na família de modelos LLaMA
- Usa a biblioteca Hugging Face Transformers
Requisitos do ambiente
- Antes de executar, são necessários os seguintes itens
- GPU AMD com suporte a ROCm
- Docker instalado no sistema
- Driver ROCm instalado no sistema host
- É necessária a versão 5.4.2 ou uma versão compatível
Estrutura do projeto
- A estrutura do repositório é composta pelo diretório
src/ e pelos arquivos de execução e build
src/engine.py
src/model.py
src/utils.py
src/amd_setup.py
Dockerfile
requirements.txt
run_inference.py
run-docker-amd.sh
README.md
Fluxo de execução rápida
- Clone o repositório e entre no diretório do projeto
git clone https://github.com/slashml/amd-gpu-inference.git
cd amd-gpu-inference
- Dê permissão de execução ao script
chmod +x run-docker-amd.sh
- Execute o motor de inferência informando o nome do modelo e o prompt
./run-docker-amd.sh "meta-llama/Llama-2-7b-chat-hf" "Translate the following English text to French: 'Hello, how are you?'"
"meta-llama/Llama-2-7b-chat-hf" pode ser trocado pelo modelo do Hugging Face que você quiser usar, e o prompt também pode ser definido diretamente
Como Docker e ROCm são executados
- O
Aptfile lista os pacotes ROCm que serão instalados dentro do contêiner Docker
- Essa configuração serve para disponibilizar no contêiner os drivers e bibliotecas ROCm necessários
- O
run-docker-amd.sh cria automaticamente a imagem Docker
- O build manual pode ser feito com o comando abaixo
docker build -t amd-gpu-inference .
- Ao executar manualmente o contêiner, é preciso definir os dispositivos e permissões para acesso à GPU AMD
docker run --rm -it \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
amd-gpu-inference "model_name" "your prompt here"
- Em
"model_name", coloque o nome do modelo no Hugging Face, e em "your prompt here", o texto de entrada
Personalização e solução de problemas
- A troca de modelo é feita informando o nome do repositório no Hugging Face no momento da execução
./run-docker-amd.sh "facebook/opt-1.3b" "Your prompt here"
- Para alterar a lógica de inferência, modifique o arquivo
run_inference.py
- Depois da alteração, é preciso recriar a imagem Docker
- Os itens de solução de problemas são os seguintes
- Verifique se o driver da GPU AMD e o ROCm estão instalados e configurados corretamente no sistema host
- Se ocorrer o erro
"out of memory", use um modelo menor ou reduza o tamanho da entrada e da saída
- Para problemas específicos de um modelo, consulte a documentação desse modelo no Hugging Face
Licença e referência
- O projeto aceita contribuições via Pull Request
- O ROCm é desenvolvido pela AMD e fornecido sob a MIT License
- Dúvidas ou problemas podem ser abertos como issue no repositório GitHub
1 comentários
Opiniões do Hacker News
Para uso em inferência, se for uma placa compatível ou uma arquitetura em que seja possível usar
HSA_OVERRIDE_GFX_VERSIONno Linux, dá para rodar quase tudo com o PyTorch upstream etransformersO
llama.cpptambém vem compilando sem grandes problemas há pelo menos cerca de um ano e, no Windows, normalmente há um bináriowin-hipnos releases; se não houver, dá para contornar com um build Vulkan, embora com desempenho menorMas o ROCm 5.4.2 deste texto é uma versão de quase 2 anos atrás, e muita coisa mudou desde então; fico curioso sobre por que foi publicado agora, em outubro de 2024
Atualizei recentemente a documentação de compatibilidade focada em RDNA3 para o ROCm 6.2, e mesmo em poucos meses houve muitas mudanças, como
bitsandbytesupstream,xformersupstream e Flash Attention baseado em Triton: https://llm-tracker.info/howto/AMD-GPUsSe você usa algo como
a1111, não confie norequirements.txt; instale o torch na versão ROCm seguindo as instruções do site do PyTorchO Obsidian é parecido, e o HIP é relativamente simples pelo menos no Arch e no Ubuntu, enquanto o Fedora ainda exige alguns ajustes
Eu não sabia que
xformerstambém funcionava; é uma boa notíciaA única coisa que funcionou de imediato foi o Ollama, que tem exemplos: https://github.com/ollama/ollama/blob/main/docs/docker.md
llama.cppekoboldcpptêm imagens Docker, mas faltavam exemplos de execução, e otext-generation-webui-dockerquebrou em uma 7800 XT no RHEL9: https://github.com/ggerganov/llama.cpp/blob/master/docs/dock..., https://github.com/LostRuins/koboldcpp?tab=readme-ov-file#do..., https://github.com/Atinoda/text-generation-webui-dockerEm resumo, eles rodam o Llama 405B em inferência de precisão completa em um único nó com 8 GPUs AMD MI300X usando o ROCm 6.2 mais recente
Fico curioso para saber quão maduro eles consideram o ROCm 6.2 e a stack da AMD em comparação com a Nvidia
É surpreendente a proliferação de bibliotecas de machine learning feitas de qualquer jeito com geração automática
Metade desta biblioteca são instruções
print, e os pontos de ramificação na verdade nem precisariam ramificarBasicamente é definir duas variáveis de ambiente e configurar duas flags do
torchEm equipes ou organizações, acho que gestão de expectativas é realmente uma parte enorme
De fato, quase não há conteúdo
Parece que está usando o ROCm 5.4.2 antigo; é uma versão de 2 anos atrás, então desconfio que dê suporte à minha RX 7900 XTX
Pessoalmente, o mais fácil para mim foi usar a imagem
rocm/pytorchmais recente e rodar nela o que fosse necessáriogfx1100) foi habilitada pela primeira vez no ROCm 5.4 em bibliotecas matemáticas comorocBLAS, mas acho que bibliotecas de IA comoMIOpensó foram habilitadas a partir do ROCm 5.5Acredito que o desempenho também melhorou bastante nas versões posteriores
No Ubuntu 24.04 e no Debian Unstable, é possível rodar
llama.cppcom ROCm em quase todas as GPUs AMD dedicadas posteriores à Vega usando apenas os pacotes fornecidos pelo sistema operacionalNão é preciso Docker nem
HSA_OVERRIDE_GFX_VERSION; basta instalarhipcc,libhipblas-dev,librocblas-dev,cmakeetc., conceder permissões aos gruposvideoerendere compilar comGGML_HIPBLAS=ONPara usuários de RDNA 3, MI200 e MI300, os pacotes ROCm fornecidos pela AMD são melhores para desempenho; e, quando é necessário PyTorch, também é melhor usar os pacotes fornecidos pela AMD, porque há dependências que não existem nos pacotes do sistema
Ainda assim, em facilidade de instalação e compatibilidade com hardware antigo, os pacotes do sistema operacional são difíceis de superar; o link de referência é https://lists.debian.org/debian-ai/2024/07/msg00002.html
Comprei um Ryzen 8700G há uns 8 meses para fazer inferência de redes neurais com a NPU, mas até agora a única aceleração que consegui foi com Vulkan na iGPU, não na NPU
Uso só Linux, e o lado bom é que, graças aos 64 GB de RAM, consegui testar sem problemas até modelos com mais de 32 GB
O
llama.cpp, que dá suporte ao backend Vulkan, merece elogiosllama.cppcom a flagLLAMA_HIP_UMA=1Olhando https://github.com/amd/RyzenAI-SW, há bastante software para brincar com a NPU, mas o Phoenix tem 16 TOPS, então não fiquei com vontade de testar por conta própria
Na minha workstation com NixOS, bastou adicionar algo desse tipo
Ativei
hardware.graphics.enable = true;e, emservices.ollama, configureiacceleration = "rocm";,ROC_ENABLE_PRE_VEGA = "1";eHSA_OVERRIDE_GFX_VERSION = "11.0.0";Antigamente, ao ver a simplicidade do
llamafile, quase cheguei a instalar o AMD ROCmMas o resultado de
sudo apt install rocmfoi 203 pacotes a instalar, cerca de 2,37 GB de download e 35,7 GB de espaço necessárioNão entendo como dá para justificar 36 GB para algo que, na prática, parece quase um driver de GPU
Ele inclui várias ferramentas e bibliotecas
O CUDA toolkit também passa de 4 GB só de download quando baixado como arquivo único, então, de qualquer lado, o resultado parece ridiculamente grande
Isso parece um wrapper feito por IA em cima de um wrapper de um wrapper de um wrapper
Há comentários como
# Other AMD-specific optimizations can be added heree# For example, you might want to set specific flags or use AMD-optimized libraries; com isso, não dá para saber o que está sendo feito aquirequirementsgrande e um Dockerfile; o resto é, em sua maior parte, scripts auxiliaresQuais GPUs AMD têm bom custo-benefício hoje em dia?
Acabei de comprar duas 3090 usadas recondicionadas no eBay por cerca de US$ 750 cada, mas queria saber o que outras pessoas usam para rodar LLM localmente
Ela tem 32 GB de HBM2 e, em benchmarks básicos do Flash Attention 2, fica de 0% a 5% mais rápida que uma 3090, mas o desempenho em aplicações reais varia bastante
Muitos projetos não são otimizados para os matrix cores da CDNA e, mesmo quando há trabalho feito para RDNA, isso muitas vezes não se traduz diretamente para CDNA
Também é frustrante que o
llama.cpptenha fechado o PR de Flash Attention para AMD dizendo que uma biblioteca header-only adicionava uma dependência desnecessária: https://github.com/ggerganov/llama.cpp/pull/7011Com
xformersnos padrões do SDXL, dá algo em torno de 4,5–5 it/s, mais ou menos entre uma 3090 e uma 4090; noexllamav2, o Qwen 72B 3bpw fica em cerca de 7 t/s, mais lento que uma 3090, mas, para caber na 3090, seria preciso usar uma precisão mais baixaNão sei bem o que este projeto oferece a mais para usuários AMD em comparação com opções existentes como
llama.cpp,exllamav2emlc-ai; hoje em dia, a maioria dos projetos funciona com relativa facilidadexformerse OllamaCom Nvidia, dá para dormir mais tranquilo à noite
Ela tem HBM2 e largura de banda de memória de 1 TB/s, igual à 4090
Mas tem apenas 16 GB de VRAM
São 24 GB de RAM por US$ 1.000
As pessoas costumam dizer “baseado em Docker”, mas o que isso realmente significa é distribuir
$SOFTWAREcomo imagem DockerAo dizer “baseado em Docker”, parece que a inferência em placas AMD é feita pelo Docker, o que soa como uma formulação sem sentido
A OpenAI também roda clusters K8s dessa forma, e a AMD tem documentação sobre isso
Só que, no lado de IA da AMD, você precisa da placa certa, da versão certa do ROCm e de pura sorte
Como a AMD fornece imagens Docker com suporte a ROCm, você pode usá-las como camada base, juntar com a aplicação e repassar a GPU para o contêiner, e então pode funcionar
No fim das contas, isso reduz em uma variável o que é preciso se preocupar na implantação; então, literalmente, é fazer inferência na AMD com Docker
Olhando o script, ele monta a GPU: https://github.com/slashml/amd_inference/blob/main/run-docke...