Inteligência artificial
PowerInfer: Serviço Rápido de Modelo de Linguagem Grande com uma GPU de Consumo

Devido às suas capacidades excepcionais de criação de conteúdo, os Modelos de Linguagem Grande Gerativos estão agora à frente da revolução da IA, com esforços contínuos para melhorar suas capacidades gerativas. No entanto, apesar dos avanços rápidos, esses modelos exigem uma grande quantidade de poder computacional e recursos. Isso ocorre principalmente porque eles consistem em centenas de bilhões de parâmetros. Além disso, para operar suavemente, os modelos de IA gerativos dependem de milhares de GPUs, o que leva a custos operacionais significativos. As altas demandas operacionais são um dos principais motivos pelos quais os modelos de IA gerativos ainda não são implantados efetivamente em dispositivos pessoais.
Neste artigo, discutiremos o PowerInfer, um motor de inferência de LLM de alta velocidade projetado para computadores padrão alimentados por uma única GPU de consumo. O framework PowerInfer busca utilizar a alta localidade inerente à inferência de LLM, caracterizada por uma distribuição de poder em ativações de neurônios. Isso significa que, a qualquer momento, um pequeno subconjunto de neurônios “quentes” está consistentemente ativo em todas as entradas, enquanto o restante, denominado neurônios “frios”, é ativado com base em entradas ou requisitos específicos. Essa abordagem permite que o framework PowerInfer reduza a potência de computação necessária para a IA gerativa produzir saídas desejadas.
Iremos mergulhar no framework PowerInfer em detalhes, explorando sua metodologia, pipeline e resultados práticos de aplicação. Vamos começar.
PowerInfer: Modelo de Linguagem Grande Rápido com GPU de Consumo
Modelos de Linguagem Grande Gerativos, como ChatGPT e DALL-E, são conhecidos por tarefas sofisticadas de processamento de linguagem natural e geração de conteúdo. Devido às suas altas exigências computacionais, esses modelos são normalmente implantados em centros de dados com GPUs avançadas. A necessidade de tal poder computacional limita sua implantação a centros de dados, destacando a necessidade de implantar modelos de linguagem grande em plataformas locais mais acessíveis, como computadores pessoais.
Aumentar a acessibilidade dos modelos de linguagem grande pode reduzir os custos de inferência e geração de conteúdo, melhorar a privacidade de dados e permitir a personalização de modelos. Além disso, enquanto as implantações de centros de dados priorizam a alta taxa de transferência, as implantações locais de LLM poderiam se concentrar em baixa latência devido a tamanhos de lote menores.
No entanto, implantar esses modelos em dispositivos locais apresenta desafios significativos devido às suas substanciais exigências de memória. Modelos de linguagem grande, funcionando como transformadores autoregressivos, geram texto token a token, com cada token exigindo acesso a todo o modelo, que compreende centenas de bilhões de parâmetros. Isso exige numerosas GPUs de alta qualidade para geração de saída de baixa latência. Além disso, as implantações locais normalmente processam solicitações individuais sequencialmente, limitando o potencial para processamento paralelo.
Para abordar as complexas exigências de memória do framework de IA gerativa, as soluções existentes empregam métodos como descarga de modelo e compressão. Técnicas como destilação, poda e quantização reduzem o tamanho do modelo, mas ainda são muito grandes para GPUs padrão em computadores pessoais. A descarga de modelo, que divide o modelo na camada de Transformer entre CPUs e GPUs, permite o processamento de camadas distribuídas entre memórias de CPU e GPU. No entanto, esse método é limitado pela interconexão PCIe lenta e pelas capacidades computacionais limitadas das CPUs, levando a uma alta latência de inferência.
O framework PowerInference afirma que a discordância entre as características de inferência de LLM e a estrutura de hardware é a principal causa dos problemas de memória na inferência de LLM. Idealmente, os dados acessados com frequência devem ser armazenados em GPUs de alta largura de banda e capacidade limitada, enquanto os dados acessados com menos frequência devem estar em CPUs de baixa largura de banda e alta capacidade. No entanto, o grande volume de parâmetros de cada iteração de inferência de LLM torna o conjunto de trabalho muito grande para uma única GPU, resultando em uma exploração ineficiente da localidade.
O processo de inferência em modelos de linguagem grande demonstra alta localidade, com cada iteração ativando um número limitado de neurônios. O framework PowerInference visa explorar essa localidade, gerenciando um pequeno número de neurônios “quentes” com a GPU, enquanto a CPU lida com os neurônios “frios”. Ele pré-seleciona e pré-carrega neurônios “quentes” na GPU e identifica neurônios ativados durante a execução. Essa abordagem minimiza as caras transferências de dados PCIe, permitindo que as GPUs e CPUs processem seus neurônios designados de forma independente.
No entanto, implantar LLMs em dispositivos locais enfrenta obstáculos. Os preditores online, cruciais para identificar neurônios ativos, consomem considerável memória de GPU. O framework PowerInfer utiliza um método adaptativo para construir pequenos preditores para camadas com maior inclinação e esparsidade de ativação, mantendo a precisão enquanto reduz o tamanho. Além disso, frameworks de LLM exigem operadores esparsos especializados. O framework PowerInfer emprega operadores esparsos conscientes de neurônios que se comunicam diretamente com os neurônios, eliminando a necessidade de conversões de formato esparsos específicos.
Por fim, colocar neurônios ativados entre a CPU e a GPU de forma otimizada é desafiador. O framework PowerInfer utiliza uma etapa offline para criar uma política de colocação de neurônios, medindo o impacto de cada neurônio nos resultados da inferência de LLM e formulando-o como um problema linear de números inteiros.
Arquitetura e Metodologia
A figura a seguir detalha a arquitetura do framework PowerInfer, consistindo em componentes offline e online na pipeline.

Graças à variação observada nas propriedades de localidade entre diferentes modelos de linguagem grande, o componente offline perfila a esparsidade de ativação do framework LLM, permitindo que ele diferencie entre neurônios “quentes” e “frios”. Por outro lado, na fase offline, dois tipos de neurônios são carregados pelo motor de inferência em ambos a CPU e a GPU, servindo assim às solicitações de LLM durante a execução com baixa latência.
Fase Offline: Solucionador de Política e Perfilar de LLM
Na fase offline, um componente de perfil de LLM usa solicitações derivadas de um conjunto de dados geral para coletar dados de ativação do processo de inferência. Na primeira etapa, ele monitora a ativação de neurônios em todas as camadas do framework e, em seguida, usa um componente de solucionador de política para categorizar os neurônios como “quentes” ou “frios”. O objetivo principal do solucionador de política é alocar neurônios ativados com mais frequência para as camadas de GPU, enquanto aloca o restante para as camadas de CPU. Na segunda etapa, o componente de solucionador de política usa métricas de impacto de neurônios e especificações de hardware para equilibrar a carga de trabalho entre as camadas e maximizar a métrica de impacto da GPU para neurônios, utilizando programação linear de números inteiros.
Fase Online: Motor de Inferência de LLM Consciente de Neurônios
Uma vez que a fase offline é executada com sucesso, o framework procede para executar a fase online. Na terceira etapa do processo, o motor online atribui neurônios “quentes” e “frios” a suas unidades de processamento respectivas antes de processar as solicitações do usuário, dependendo do resultado do solucionador de política offline. Durante a execução, e na quarta etapa, o motor online gerencia cálculos de GPU-CPU, criando executores de CPU e GPU que são threads em execução no lado da CPU. O motor, em seguida, prevê os neurônios ativados e procede a pular os neurônios não ativados. Os neurônios ativados são, então, pré-carregados na GPU para processamento. Enquanto isso, a CPU calcula e transfere os resultados para seus neurônios para serem integrados com a GPU. O motor online é capaz de se concentrar em linhas e colunas individuais de matrizes porque usa operadores esparsos conscientes de neurônios em CPUs, bem como em GPUs.

Preditores de Esparsidade Adaptativos
O conceito principal por trás da redução das cargas computacionais pelo motor de inferência online no framework PowerInfer é que ele processa apenas os neurônios que ele prevê que estarão ativados. Tradicionalmente, dentro de cada camada de Transformer, um framework utiliza dois diferentes preditores para prever a ativação de neurônios nos blocos de MLP e auto-atendimento, como resultado do qual o cálculo de inferência é limitado aos neurônios previstos para estar ativos. No entanto, é difícil projetar preditores eficazes para implantação local porque a quantidade limitada de recursos torna difícil equilibrar o tamanho do modelo e a precisão da previsão. Como esses preditores são implantados frequentemente pelo framework para prever neurônios ativos, eles precisam ser armazenados na GPU para permitir um acesso mais rápido. No entanto, os frameworks geralmente implantam um grande número de preditores que ocupam considerável memória, mesmo a necessária para armazenar parâmetros de LLM.
Além disso, o tamanho dos preditores é geralmente determinado por dois fatores: Inclinação Interna e Esparsidade de Camadas de LLM.

Para otimizar esses fatores, o framework PowerInfer utiliza um método de treinamento iterativo para cada preditor na camada de Transformer sem um tamanho fixo. Na primeira etapa desse método de treinamento, o tamanho do modelo de referência é estabelecido com base no perfil de esparsidade do modelo, e o tamanho do modelo é ajustado iterativamente, considerando a inclinação interna de ativação para manter a precisão.
Colocação e Gerenciamento de Neurônios
Como mencionado anteriormente, enquanto o componente de solucionador de política offline está determinando a política de colocação de neurônios, o componente de motor de inferência online carrega o modelo na memória da GPU e da CPU de acordo com a política gerada. Para cada camada que pode ou não ter várias matrizes de peso, o framework PowerInfer atribui cada neurônio à CPU ou à GPU com base em se o neurônio é ativado “quente”. Garantir o cálculo preciso de neurônios segmentados na sequência determinada é essencial para resultados precisos. Para lidar com isso, o framework PowerInfer gera duas tabelas de neurônios: uma localizada na GPU e outra na memória da CPU, com cada tabela correlacionando neurônios individuais à sua posição original na matriz.
Operador Consciente de Neurônios
Dada a esparsidade de ativação observada em modelos de linguagem grande, os neurônios inativos e seus pesos podem ser ignorados por operações de multiplicação de matrizes, criando assim a necessidade de usar operadores esparsos. Em vez de empregar operadores esparsos que têm várias limitações, o framework PowerInfer emprega operadores conscientes de neurônios que calculam neurônios ativados e seus pesos diretamente na GPU e na CPU, sem exigir conversão para formato denso durante a execução. Os operadores conscientes de neurônios diferem dos operadores esparsos tradicionais, pois se concentram em linhas e colunas individuais de vetores dentro de uma matriz, em vez de se concentrar na matriz inteira.
Política de Colocação de Neurônios
Para explorar as capacidades computacionais de CPUs e GPUs, o componente offline no framework PowerInfer gera uma política de colocação que orienta o framework ao alocar neurônios para a CPU ou as camadas de GPU. O solucionador de política gera essa política e controla a colocação de neurônios dentro de cada camada, o que ajuda a determinar a carga de trabalho computacional para unidades de processamento individuais. Ao gerar a política de colocação, o componente de solucionador de política considera vários fatores, incluindo a frequência de ativação para cada neurônio, a sobrecarga de comunicação e as capacidades computacionais, como largura de banda e tamanho de memória de cada unidade de processamento.
Resultados e Implementação
Para demonstrar as capacidades de generalização do framework PowerInfer em dispositivos com diferentes configurações de hardware, os experimentos são realizados em dois computadores pessoais distintos: um equipado com processador Intel i9-13900K, GPU NVIDIA RTX 4090 e 192 GB de memória de host, enquanto o outro opera com processador Intel i7-12700K, GPU NVIDIA RTX 2080Ti e 64 GB de memória de host.
O desempenho de ponta a ponta do framework PowerInfer é comparado com o llama.cpp com um tamanho de lote de 1 e configurações de implantação padrão. O framework, em seguida, amostra prompts dos conjuntos de dados ChatGPT e Alpaca, considerando a variabilidade de comprimento observada em diálogos de entrada e saída do mundo real. A figura a seguir demonstra as velocidades de geração para diferentes modelos.

Como pode ser observado, o framework PowerInfer gera 8,32 tokens por segundo e atinge até 16 tokens gerados por segundo, superando assim o framework llama.cpp por uma margem significativa. Além disso, à medida que o número de tokens de saída aumenta, o desempenho do framework PowerInfer também melhora, pois a fase de geração afeta significativamente o tempo total de inferência.

Além disso, como pode ser observado na imagem acima, o framework PowerInfer supera o framework llama.cpp em PCs de baixo custo, com uma taxa de geração de pico de 7 tokens por segundo e uma velocidade de geração de token média de 5 tokens por segundo.

A imagem acima demonstra a distribuição da carga de neurônios entre a GPU e a CPU para os dois frameworks. Como pode ser visto, o framework PowerInfer aumenta significativamente a participação da GPU na carga de neurônios, de 20 para 70%.

A imagem acima compara o desempenho dos dois frameworks em dois PCs com especificações diferentes. Como pode ser visto, o framework PowerInfer consistentemente entrega uma alta velocidade de geração de tokens de saída quando comparado ao framework llama.cpp.
Pensamentos Finais
Neste artigo, discutimos o PowerInfer, um motor de inferência de LLM de alta velocidade para um computador padrão alimentado por uma única GPU de consumo. No seu núcleo, o framework PowerInfer tenta explorar a alta localidade inerente à inferência de LLMs, um método caracterizado pela distribuição de poder em ativações de neurônios. O framework PowerInfer é um sistema de interferência rápido projetado para modelos de linguagem grande que utiliza preditores adaptativos e operadores conscientes de neurônios para ativar os neurônios e a esparsidade computacional.












