4 pontos por GN⁺ 2024-10-04 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2024-10-04
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_VERSION no Linux, dá para rodar quase tudo com o PyTorch upstream e transformers
    O llama.cpp também vem compilando sem grandes problemas há pelo menos cerca de um ano e, no Windows, normalmente há um binário win-hip nos releases; se não houver, dá para contornar com um build Vulkan, embora com desempenho menor
    Mas 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 bitsandbytes upstream, xformers upstream e Flash Attention baseado em Triton: https://llm-tracker.info/howto/AMD-GPUs

  • É 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 ramificar
    Basicamente é definir duas variáveis de ambiente e configurar duas flags do torch

    • Precisei até fazer terapia para corrigir a expectativa de confundir cientistas de dados e pessoal de machine learning com engenheiros de software e esperar deles os mesmos entregáveis
      Em equipes ou organizações, acho que gestão de expectativas é realmente uma parte enorme
    • Achei que talvez fosse severo demais, mas olhei o repositório e não era
      De fato, quase não há conteúdo
    • Entendo o que você quer dizer, mas comentários assim fazem as pessoas relutarem em compartilhar código, fazer contribuições open source ou continuar programando
  • 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/pytorch mais recente e rodar nela o que fosse necessário

    • A RX 7900 XTX (gfx1100) foi habilitada pela primeira vez no ROCm 5.4 em bibliotecas matemáticas como rocBLAS, mas acho que bibliotecas de IA como MIOpen só foram habilitadas a partir do ROCm 5.5
      Acredito que o desempenho também melhorou bastante nas versões posteriores
  • No Ubuntu 24.04 e no Debian Unstable, é possível rodar llama.cpp com ROCm em quase todas as GPUs AMD dedicadas posteriores à Vega usando apenas os pacotes fornecidos pelo sistema operacional
    Não é preciso Docker nem HSA_OVERRIDE_GFX_VERSION; basta instalar hipcc, libhipblas-dev, librocblas-dev, cmake etc., conceder permissões aos grupos video e render e compilar com GGML_HIPBLAS=ON
    Para 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

    • No Ubuntu 22.04.5, instalei o ROCm e o Ollama fornecidos pela AMD com uma RX 7900 XTX sem grandes problemas, e a execução de LLMs baseados em ROCm pelo Ollama também funciona bem
    • Existe hoje no mercado alguma placa AMD com mais de 24 GB de VRAM a um preço amigável para consumidores?
  • 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 elogios

    • Deve ser possível obter suporte a ROCm/HIP também na iGPU; basta tentar compilar o llama.cpp com a flag LLAMA_HIP_UMA=1
      Olhando 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, em services.ollama, configurei acceleration = "rocm";, ROC_ENABLE_PRE_VEGA = "1"; e HSA_OVERRIDE_GFX_VERSION = "11.0.0";

  • Antigamente, ao ver a simplicidade do llamafile, quase cheguei a instalar o AMD ROCm
    Mas o resultado de sudo apt install rocm foi 203 pacotes a instalar, cerca de 2,37 GB de download e 35,7 GB de espaço necessário
    Não entendo como dá para justificar 36 GB para algo que, na prática, parece quase um driver de GPU

    • É verdade que o software hoje ficou absurdamente inchado, mas ROCm não é simplesmente 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
    • Estão resolvendo esse problema em https://github.com/zml/zml
    • Hoje em dia, um driver de CPU que roda na GPU é praticamente um sistema operacional completo
    • A AMD está praticamente poluindo por completo o kernel Linux com o driver: https://www.phoronix.com/news/AMD-5-Million-Lines
  • 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 here e # 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 aqui

    • Na prática, é um arquivo requirements grande e um Dockerfile; o resto é, em sua maior parte, scripts auxiliares
  • Quais 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

    • Comprei recentemente uma MI100 por US$ 650
      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.cpp tenha 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/7011
      Com xformers nos padrões do SDXL, dá algo em torno de 4,5–5 it/s, mais ou menos entre uma 3090 e uma 4090; no exllamav2, 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 baixa
      Não sei bem o que este projeto oferece a mais para usuários AMD em comparação com opções existentes como llama.cpp, exllamav2 e mlc-ai; hoje em dia, a maioria dos projetos funciona com relativa facilidade
    • Pessoalmente, GPUs/iGPUs AMD acabaram não valendo muito a pena para mim, porque quebravam a cada atualização do PyTorch, ROCm, xformers e Ollama
      Com Nvidia, dá para dormir mais tranquilo à noite
    • Comprei uma Radeon Pro VII nova por 300 euros, e foi um negócio razoável
      Ela tem HBM2 e largura de banda de memória de 1 TB/s, igual à 4090
      Mas tem apenas 16 GB de VRAM
    • Provavelmente a resposta seja a 7900 XTX
      São 24 GB de RAM por US$ 1.000
  • As pessoas costumam dizer “baseado em Docker”, mas o que isso realmente significa é distribuir $SOFTWARE como imagem Docker
    Ao dizer “baseado em Docker”, parece que a inferência em placas AMD é feita pelo Docker, o que soa como uma formulação sem sentido

    • É possível fazer inferência dentro de um contêiner Docker, como se faz com Nvidia
      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
    • Docker virou ferramenta padrão em machine learning porque uma distribuição Python ligada a bibliotecas do sistema vira uma bagunça se não levar junto também essa camada
    • É possível montar dispositivos específicos no Docker
      Olhando o script, ele monta a GPU: https://github.com/slashml/amd_inference/blob/main/run-docke...
    • Estão resolvendo esse problema no ZML: https://github.com/zml/zml
    • Por que não faria sentido? Contêineres Docker também conseguem se comunicar com dispositivos; basta anexá-los