O que é o particionamento de modelos e porque é importante para os limites de memória da IA doméstica?

Eva Wong é a Redatora Técnica e e entusiasta residente na ZimaSpace. Uma geek de longa data com paixão por homelabs e software de código aberto, ela é especialista em traduzir conceitos técnicos complexos em guias acessíveis e práticos . Eva acredita que o auto-hospedagem deve ser divertida, não intimidante. Através dos seus tutoriais, ela capacita a comunidade adesmistificar configurações de hardware , desde a construção do seu primeiro NAS até dominar os contêineres Docker., from building their first NAS to mastering Docker containers.

O particionamento do modelo distribui o estado necessário do modelo por vários dispositivos, permitindo carregar e executar um modelo que excede a memória de um único acelerador.

Num servidor de IA doméstico, a questão importante não é saber se um checkpoint chegou como vários ficheiros, mas sim se os pesos, as camadas, os tensores ou outro estado utilizados durante a execução estão realmente distribuídos por diferentes dispositivos. O particionamento pode transformar um requisito de memória impossível para uma única GPU numa implementação viável em vários dispositivos, mas os fragmentos continuam a ter de trocar dados ou de transferir trabalho entre etapas. Assim, a largura de banda da interligação, o desequilíbrio entre dispositivos e o suporte do runtime tornam-se os limites seguintes.

O particionamento em runtime distribui o estado do modelo pelos dispositivos

Um modelo em execução contém tensores que têm de estar disponíveis quando as respetivas camadas são executadas. O particionamento altera a localização desses dados, fazendo com que diferentes dispositivos sejam responsáveis por diferentes partes, em vez de replicar todo o estado em todos os dispositivos.

Um tensor distribuído pode utilizar o posicionamento de tensores particionados, atribuindo dimensões distribuídas através de uma malha de dispositivos, em vez de as armazenar de forma idêntica em cada rank.

O benefício direto para a memória é uma menor ocupação em cada dispositivo. O custo ao nível do sistema é que nenhum dispositivo passa a ter todos os dados necessários para cada operação, pelo que a coordenação passa a fazer parte da inferência.

Os fragmentos de um checkpoint não são o mesmo que um modelo em execução particionado

Os repositórios de modelos grandes dividem frequentemente um checkpoint em vários ficheiros, para que possam ser descarregados e carregados incrementalmente. Essa decisão de empacotamento, por si só, não determina onde os tensores ficam depois de o runtime terminar o carregamento.

O particionamento ao nível dos ficheiros e a colocação em runtime continuam a ser aspetos distintos, porque um carregador pode combinar checkpoints particionados com o encaminhamento entre vários dispositivos.

Assim, um utilizador doméstico pode ver dezenas de fragmentos `.safetensors` no disco, enquanto o runtime continua a tentar colocar o modelo completo numa única GPU. Inversamente, um runtime pode repartir um checkpoint por uma disposição diferente em vários dispositivos durante o carregamento.

O planeamento da capacidade deve analisar o mapa de dispositivos efetivo e as alocações residentes após o arranque, em vez de presumir que o número de ficheiros do repositório revela a topologia de inferência.

O particionamento introduz comunicação ou transferência entre etapas

Quando um dispositivo produz valores de que outro fragmento necessita, os dados têm de atravessar uma interligação ou de ser sincronizados através de uma operação coletiva. O tráfego exato depende de o runtime dividir os tensores dentro das camadas, colocar diferentes intervalos de camadas em diferentes dispositivos ou reunir o estado particionado apenas quando necessário.

As diferentes estratégias de inferência em vários dispositivos trocam diferentes padrões de comunicação por diferentes formas de colocação na memória.

É por isso que duas GPUs com VRAM combinada suficiente podem continuar a servir um modelo lentamente. A transferência de ativações ou a sincronização de resultados parciais pode dominar quando o PCIe ou outra ligação é muito mais lenta do que a memória local do acelerador.

Dispositivos desiguais podem transformar um fragmento no estrangulamento

Um servidor doméstico heterogéneo pode combinar GPUs com diferentes capacidades de memória, velocidades de computação, larguras de ligação ou gerações. Uma divisão matematicamente uniforme pode ainda deixar o dispositivo mais lento ou mais pequeno a determinar o ritmo de todo o pedido.

Por isso, as ferramentas de colocação de camadas e de descarga para outros dispositivos têm de respeitar a capacidade real de cada dispositivo, em vez de presumirem hardware simétrico. A execução distribuída de modelos explícita utiliza uma configuração de paralelismo, em vez de uma abstração automática de memória agrupada.

Uma disposição prática pode atribuir mais camadas a uma GPU maior ou manter os componentes sensíveis à latência no caminho mais rápido. O objetivo não é ter um número igual de fragmentos, mas sim um caminho crítico equilibrado que caiba em todos os dispositivos.

Meça a memória por dispositivo, a utilização, o tempo de transferência e os intervalos de inatividade com o mesmo prompt. Um fragmento que está constantemente à espera ou a transferir dados para armazenamento é um indício de que a topologia, e não a VRAM combinada bruta, está a limitar o desempenho.

O particionamento do modelo é, antes de mais, uma ferramenta para tornar a utilização da memória viável

O particionamento é mais valioso quando o modelo sem particionamento não cabe de todo num único dispositivo. Depois de o modelo se tornar carregável, a otimização passa a centrar-se no custo da interligação, no batching, na colocação da cache KV e na possibilidade de um modelo mais pequeno ou quantizado ser mais simples.

Uma estratégia de computação específica é a inferência com paralelismo de tensores; o particionamento do modelo é o problema de colocação mais abrangente, que pergunta qual o estado necessário que deve residir em cada dispositivo.

Não trate a VRAM agregada como um único conjunto transparente. O particionamento pode fazer com que memórias separadas cooperem, mas todos os runtimes continuam a ter regras de colocação e custos de comunicação que determinam se a implementação resultante é realmente útil.

Perguntas frequentes

Um checkpoint particionado é o mesmo que um modelo em execução particionado?

Não. Os fragmentos de um checkpoint dividem ficheiros para armazenamento ou carregamento; o particionamento em runtime determina em que dispositivo reside cada parte do estado do modelo durante a inferência.

O particionamento do modelo é o mesmo que o paralelismo de tensores?

Não. O paralelismo de tensores é uma forma de executar um modelo particionado, dividindo as operações sobre tensores; o particionamento também inclui estratégias de colocação por camadas, etapas, parâmetros ou outros elementos.

Duas GPUs de 12 GB fornecem automaticamente um único conjunto utilizável de 24 GB?

Não. Um runtime tem de particionar explicitamente o modelo, e a comunicação, o estado duplicado, a cache KV e a margem necessária em cada dispositivo reduzem a capacidade combinada que pode ser utilizada na prática.

Centro de Tecnologia e IA

Mais para Ler

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.