Ускорение инференса LLM через тензорный параллелизм (подробный обзор)

Использование Ollama или нативного HF инференса может порождать стереотипы о медленной скорости генерации ответа LLM при работе на нескольких GPU, об отсутствии какого-то заметного ускорения.

Достаточно долго мне не доводилось натыкаться на факты, когда с помощью второго GPU можно ускорить генерацию одного запроса. Множество опубликованных тестов производительности делают акцент на демонстрацию увеличения общей пропускной способности при параллельной генерации. В то время как тензорный параллелизм, реализованный в профессиональных движках типа vLLM или Tensor-RT, позволяет ускорить генерацию и одного потока за счет нескольких GPU. Об этом и многом другом поговорим в данном обзоре.

Содержание

  • Что не так с llama.cpp (Ollama)
  • Коротко о тензорах в LLM
  • Причем здесь тензорные ядра в GPU?
  • Введение в параллелизм (конвейерный, тензорный, дата параллелизм, что на счет device_map)
  • Ускорение одиночного запроса в vLLM через тензорный параллелизм
  • Метрики скорости инференса
  • Cкорость параллелизма в vLLM
  • Схемы тензорного параллелизма
  • Какие архитектуры LLM подходят для тензорного параллелизма?
  • Влияние тензорного параллелизма на точность инференса
  • Влияние PCIE на тензорный параллелизм
  • Энергоэффективность разных видов параллелизма

Что не так с Ollama

Предпосылками для написания статьи в большей степени стало несовершенство инференса сервера Ollama, который работает на библиотеке llama.cpp. Движок разработан для работы на широком разнообразии оборудования, но страдает от проблем с масштабированием на нескольких GPU, не способен полностью задействовать модельный параллелизм. Такие недостатки ограничивают применение этого движка в многопользовательских и высоконагруженных приложениях.

Типичный инференс в Ollama. На графике продемонстрировано слабое масштабирование llama.cpp с помощью множества GPU. (Здесь не используется опция --split-mode row)<a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Farxiv.org%2Fhtml%2F2411.00136v1&postId=2052555" rel="nofollow noreferrer noopener" target="_blank">@</a>
Типичный инференс в Ollama. На графике продемонстрировано слабое масштабирование llama.cpp с помощью множества GPU. (Здесь не используется опция --split-mode row)@

В исследовании было показано, LLaMA-2-7B превосходит по производительности как Mistral-7B, так и LLaMA-3-8B, в то время как Mistral-7B опережает LLaMA-3-8B при различных размерах батча и количестве GPU. Это контринтуитивно по сравнению с TRT-LLM и vLLM, где модели с GQA работают лучше, чем модели с MHA. Это показывает, что llama.cpp не в состоянии в полной мере использовать преимущества механизма Grouped-Query Attention.

Несмотря на то, что llama.cpp активно развивается и внедряются различные методы оптимизации, полноценного ускорения от тензорного параллелизма нет даже через опцию --split-mode row (-sm row), которая ускоряет по разным оценкам до 20%.

Схожая проблема наблюдается и со стандартным инференсом HF через device_map. Но об этом чуть позже.

Коротко о тензорах в LLM

В контексте LLM тензор — это универсальный контейнер для чисел, похожий на многомерную таблицу, в котором хранится абсолютно вся информация. Когда вы пишете запрос, например, «Сколько цветов», модель сначала превращает его в простой числовой список (1D-тензор), допустим [5, 2, 7]. Затем этот список преобразуется в более сложный, «глубокий» 3D-тензор, где каждое число «обрастает» сотнями других чисел, описывающих его семантическое значение.

Виды тензоров<a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fwww.datacamp.com%2Ftutorial%2Finvestigating-tensors-pytorch&postId=2052555" rel="nofollow noreferrer noopener" target="_blank">@</a>
Виды тензоров@

Все «знания» самой модели — это тоже гигантские тензоры (веса), и вся работа LLM сводится к тому, чтобы математически перемножить и преобразовать ваш тензор-запрос с помощью своих тензоров-весов, в результате чего создается финальный тензор - логиты (logits), из которого уже генерируется текстовый ответ.

Причем здесь тензорные ядра в GPU?

Если тензоры — это гигантские таблицы с числами, на которых работает LLM, то тензорные ядра в GPU — это специализированные «мини-фабрики» для их быстрой обработки. Они созданы для одной-единственной задачи: мгновенно перемножать целые блоки этих таблиц, а не отдельные числа по очереди. Представьте, что вместо обычного калькулятора у вас есть кнопка «умножить две таблицы целиком», — это и есть принцип работы тензорного ядра.

Число тензорных ядер в GPU и их поколение напрямую влияет на скорость инференса LLM. Однако, если в графическом ускорителе нет тензорных ядер это не означает, что устройство не совместимо с с тензорным параллелизмом. Вычисление тензоров будет проходить на CUDA ядрах в Nvidia, или на Stream Processors у AMD карт.

В 2017 году тензорные ядра впервые были представлены NVIDIA в архитектуре Volta. Первый ускоритель Tesla V100 получил впечатляющее число - 640 тензорных ядер. Почти все последующие GPU, включая геймерский класс, стали выпускаться с этим блоком вычислений. Выпущено уже 5 поколений к 2025 году. Наличие наибольшее числа тензорных ядер присуще топовым потребительским или профессиональным моделям, что также сказывается на увеличение стоимости.

Тензорные ядра часто вносят путаницу в производительность GPU. Во многих публикациях путают производительность тензорных вычислений с CUDA-ядрами. В технической документации разделяют на Peak FP16 (non Tensor) - обычно десятки TFLOPS для CUDA-ядер, а Peak FP16 Tensor - исчисляются сотнями TFLOPS для тензорных ядер.

Разные поколения тензорных ядер могут существенно отличаться по производительности. Например, у Tesla V100 640 тензорных ядер имеют пик 125 TLFOPS, а RTX 3090 TI имеет всего 336 тензорных ядер 3-го поколения - 160 TLFOPS, а у RTX 4090 всего 512 ядер 4-го поколения - 330 FP16 TFLOPS (и 660 FP6 TFLOPS). Однако, в реальности не всякий сценарий инференса дает прирост, только лишь на тензорным ядрам.

Введение в параллелизм для инференса

Применение модельного параллелизма (model parallelism) подразумевает наличие более 1 GPU в сервере или хотя бы по 1 GPU на двух серверах. Разные механизмы параллелизма (или комбинация механизмов) решают следующие задачи инференса:

  • Увеличение общей пропускной способности для множества параллельных запросов генерации (обеспечение одновременной работы пользователей) - Data / Pipeline / Tensor Parallelism или комбинации.
  • Увеличение скорости генерации одного токена и сокращение задержки первого токена (TTF) - Tensor Parallelism
  • Распределение модели, которая по памяти не помещается в 1 GPU, на несколько GPU внутри одного сервера - Pipeline / Tensor Parallelism
  • Распределение модели на кластер, когда модель не вмещается в число GPU одного сервера - Pipeline Parallelism, Tensor Parallelism или комбинация

Конвейерный параллелизм

Конвейерный параллелизм (Pipeline Parallelism) представляет собой метод распределения LLM целыми слоями на несколько GPU. Данные обрабатываются поэтапно, переходя от одного GPU к другому, что позволяет распределить память, необходимую для хранения весов модели, между несколькими устройствами. Можно использовать любое число устройств, как четное так и нечетное 1, 2, 3 4 и т.д.

Конвейерный параллелизм - последовательные вычисления от GPU 0 к GPU 1<a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fnvidia.github.io%2FTensorRT-LLM%2F0.18.2%2Fperformance%2Fperformance-tuning-guide%2Fdeciding-model-sharding-strategy.html&postId=2052555" rel="nofollow noreferrer noopener" target="_blank">@</a>
Конвейерный параллелизм - последовательные вычисления от GPU 0 к GPU 1@

Основным ограничением данного подхода является последовательный характер вычислений, приводящий к простоям GPU («пузырькам конвейера»), особенно при обработке одиночных запросов.

Для повышения эффективности используется техника микробатчинга, когда входные данные разделяются на небольшие пакеты, обрабатываемые параллельно со смещением по времени, что частично сокращает простои и увеличивает общую пропускную способность системы. Несмотря на это, конвейерный параллелизм не уменьшает задержку обработки единичного запроса, так как каждый элемент данных последовательно проходит все сегменты модели, однако коммуникационные издержки остаются умеренными, поскольку обмен информацией (активациями) происходит только на границах сегментов.

Тензорный параллелизм

Тензорный параллелизм - одновременные вычисления всех слоев, разрезанных на два GPU. <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fnvidia.github.io%2FTensorRT-LLM%2F0.18.2%2Fperformance%2Fperformance-tuning-guide%2Fdeciding-model-sharding-strategy.html&postId=2052555" rel="nofollow noreferrer noopener" target="_blank">@</a>
Тензорный параллелизм - одновременные вычисления всех слоев, разрезанных на два GPU. @

Тензорный параллелизм (Tensor Parallelism) представляет собой метод внутрислойного параллелизма, при котором каждый слой LLM разделяется горизонтально на фрагменты и распределяется между несколькими GPU.

Все GPU работают над одним и тем же токеном, затем частичные результаты вычислений агрегируются посредством операции All-Reduce. Данный подход способствует сокращению времени обработки слоя за счет пропорционального уменьшения вычислительной нагрузки на каждый GPU и обеспечения их одновременной работы.

Однако тензорный параллелизм сопряжен со значительными коммуникационными издержками, так как требует частого обмена данными между устройствами для синхронизации результатов после обработки каждого слоя, что выдвигает высокие требования к пропускной способности межпроцессорных соединений (NVLink, NVSwitch, InfiniBand). Эффективность тензорного параллелизма напрямую зависит от скорости этих соединений: при высокоскоростных соединениях он обеспечивает существенный прирост производительности, тогда как при медленных коммуникационные задержки могут нивелировать выгоды или замедлить инференс.

В практических реализациях тензорный параллелизм часто комбинируют с другими техниками, такими как конвейерный параллелизм, для оптимизации распределенных вычислений в крупных моделях на несколько серверов. Если же соединение между серверами медленное (например, разные узлы по Ethernet), то обмены сведут на нет ускорение – лучше задействовать конвейерный параллелизм между узлами, а тензорный использовать только внутри узлов или вовсе отказаться от него.

Data Parallel или реплики моделей

Data Parallel (DP) - еще один метод параллизма, но на уровне данных. Каждый GPU содержит модель целиком, батчи раскидываются параллельно.

Сравнение методов
Сравнение методов

DP, в отличие от tensor/pipeline parallelism, не помогает впихнуть слишком крупную модель и почти не влияет на латентность одного запроса, зато даёт самое простое и дешёвое горизонтальное масштабирование сервиса. Если модель уже помещается и цель — throughput кучи запросов, проще запустить несколько полных копий (data-parallel) вместо TP.

В vLLM можно запустить --tensor-parallel-size 1 --num-gpus 4 --worker-use-ray - Ray поднимет четыре независимых воркера-реплики (data-parallel) и роутер раздаст им запросы

Инфографика DP, PP, TP. <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Frobotchinwag.com%2Fposts%2Fdemystifying-tensor-parallelism%2F&postId=2052555" rel="nofollow noreferrer noopener" target="_blank">@</a>
Инфографика DP, PP, TP. @

Что на счет device_map в Hugging Face

Все режимы device_map в Hugging Face Accelerate/Transformers — "auto", "balanced", "balanced_low_0" и "sequential" — выполняют только последовательное размещение слоёв на разных устройствах, чтобы модель поместилась в память. Они не реализуют ни тензорный параллелизм (деление весов слоя между GPU с All-Reduce внутри слоя), ни конвейерный параллелизм. Поэтому от device_map не стоит ждать ускорения: в каждый момент времени работает лишь одна карта, а остальные ждут, пока управление дойдёт до их слоёв.

Сравнение device_map c TP / PP
Сравнение device_map c TP / PP

Комбинированный или гибридный параллелизм

Как запустить модель Llama 3.1 405B без квантования, которой требуется от 800 Гб видеопамяти в bf16? Это можно сделать на 16 GPU H100 или на 16 GPU A100 80GB, используя конвейерный или тензорный параллелизм vLLM, а также через совместное использование конвейерного и тензорного параллелизма.

При наличии 16 GPU на 2 узлах, вы можете использовать двойной конвейерный параллелизм (PP) и восьмикратный тензорный параллелизм (TP) для оптимизации использования GPU.

vllm serve meta-llama/Meta-Llama-3.1-405B-Instruct --tensor-parallel-size 8 --pipeline-parallel-size 2

Если у вас есть быстрая сеть между серверами типа Infiniband, вы можете использовать 16-сторонний тензорный параллелизм:

vllm serve meta-llama/Meta-Llama-3.1-405B-Instruct --tensor-parallel-size 16
Пропускная способность инференса на 16 GPU H100  (по 8 GPU на узел) с использованием синтетического набора данных (средняя длина входных данных 1024, средняя длина выходных данных 128).  
Пропускная способность инференса на 16 GPU H100 (по 8 GPU на узел) с использованием синтетического набора данных (средняя длина входных данных 1024, средняя длина выходных данных 128).  

Конвейерный параллелизм необходим, когда узлы не соединены через Infiniband. По сравнению с 16-кратным тензорным параллелизмом без Infiniband, сочетание 2-кратного конвейерного параллелизма с 8-кратным тензорным параллелизмом приводит к увеличению пропускной способности в 6,6 раза. С другой стороны, при наличии Infiniband производительность обеих конфигураций схожа.

Ускорение одиночного запроса в vLLM через тензорный параллелизм

Теоретически, если коммуникация между GPU достаточно быстрая, время на проход одного токена сокращается почти вдвое на 2 GPU (или примерно в N раз на N GPU). В реальности ускорение меньше идеального из-за времени на синхронизацию результатов между устройствами (all-reduce) и возможных дисбалансов нагрузки. В отличие от конвейерного, тензорный параллелизм требует всегда четного числа GPU - 2, 4, 8.

Ускорение от тензорного параллелизма возможно как в случае, когда модель не помещается на один GPU, так и в случае, когда вмещается целиком. По умолчанию у vLLM стоит tensor_parallel_size = 1 и инференс идет на 1 GPU. Если модель помещается на 1 GPU, то указав tensor_parallel_size = 2 инференс 1 потока будет идти на 2 GPU с почти линейным ускорением.

Настройки в vLLM

  • Выберите tensor_parallel_size, кратный hidden_size и num_heads модели. Llama-2-7B: 4096 hidden / 32 heads ⇒ TP = 2, 4, 8 допустимы.
# 2 GPU, t.bfloat16 CUDA_VISIBLE_DEVICES=0,1 \ vllm serve meta-llama/Llama-2-7b-hf \ --dtype bfloat16 \ --tensor-parallel-size 2 \ --max-model-len 4096 \ --gpu-memory-utilization 0.9

Или из питона

from vllm import LLM llm = LLM("meta-llama/Llama-2-7b-hf", tensor_parallel_size=2, dtype="bfloat16") print(llm.generate("Explain TP in two lines:"))

vLLM распилит весовые матрицы по алгоритму Megatron-style TP и создаст два воркера (в системе два python процесса будут), работающих параллельно. См. документацию.

Метрики скорости инференса

Метрики скорости инференса <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fblog.squeezebits.com%2Fvllm-vs-tensorrtllm-1-an-overall-evaluation-30703&postId=2052555" rel="nofollow noreferrer noopener" target="_blank">@</a>
Метрики скорости инференса @

Оценка производительности инференса LLM требует понимания трех ключевых метрик: пропускной способности (Throughput), времени до первого токена (Time-to-First-Token, TTFT) и времени на генерацию выходного токена (Time-Per-Output-Token, TPOT). Каждая метрика и связанные с ней параметры показаны на схеме.

Пропускная способность (Токены/с)

Пропускная способность — это количество токенов, которое система может сгенерировать в единицу времени при обработке максимального числа параллельных запросов (batch - max_num_seqs в VLLM). Она рассчитывается как общее количество сгенерированных токенов, деленное на общее время вывода (инференса). Высокая пропускная способность указывает на то, что система может эффективно обрабатывать большой объем запросов, что крайне важно для приложений, работающих в реальном времени, и для одновременного обслуживания множества пользователей.

Стоит заметить, что скорость генерации 1 запроса может быть весьма ограниченной, например, 50 токенов/секунду, в то время как общая пропускная способность может измеряться сотнями или тысячами токенов/секунду.

Время до первого токена (TTFT, с)

TTFT измеряет задержку между получением запроса и генерацией его первого токена. Эта метрика критически важна для пользовательского опыта, особенно в интерактивных приложениях, где ожидается немедленный отклик. Чем ниже TTFT, тем быстрее первоначальный ответ и отзывчивее приложение.

Время на генерацию выходного токена (TPOT, мс)

TPOT, также известный как межтокенная задержка (inter-token-latency, ITL), — это среднее время, затрачиваемое на генерацию каждого последующего токена после первого. Эта метрика дает представление о скорости генерации токенов моделью во время вывода. Чем ниже TPOT, тем быстрее и плавнее происходит генерация токенов.

Отслеживая и оптимизируя пропускную способность, TTFT и TPOT, специалисты могут принимать обоснованные решения о развертывании модели, распределении ресурсов и конфигурациях системы.

Cкорость параллелизма в VLLM

Пример с Batch Size 64 на 1, 2 и 4 GPU

Сравнение скорости разных методов параллелизма <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fdl.acm.org%2Fdoi%2Fpdf%2F10.1109%2FSCW63240.2024.00178&postId=2052555" rel="nofollow noreferrer noopener" target="_blank">@</a>
Сравнение скорости разных методов параллелизма @

На рисунке а показана производительность модели LLaMA-3-8B на 1, 2 и 4 GPU, а на рисунке b представлено сравнение для модели Mixtral-8x7B при использовании различных видов параллелизма в рамках одного узла. Несмотря на то, что гибридный подход к распараллеливанию обеспечивает большую гибкость, тензорный параллелизм (TP) оказывается эффективнее благодаря более высокой утилизации устройств и меньшим накладным расходам на обмен данными. Наши наблюдения показывают, что при использовании LLaMA-3-8B на 4-х GPU A100, TP в 1,30 раза быстрее гибридного подхода (TP=2, PP=2) и в 1,94 раза быстрее, чем конвейерный параллелизм (PP).

Схемы тензорного параллелизма

Схемы тензорного параллелизма постепенно усложняются: сначала — 1-D (Megatron-style) с делением весов только по одной оси и одной коллективной операцией all-gather/reduce-scatter; затем 2-D, где веса и активации шардируются по двум измерениям сетки устройств, уменьшая трафик примерно в √p раз; дальше 2.5-D, добавляющая к квадратной сетке дополнительную ось реплик для лучшего баланса между памятью и коммуникациями; и, наконец, 3-D, объединяющая тензорное, пайплайновое и дата-параллельное разбиения, чтобы обслуживать сотни миллиардов параметров.

Каждая следующая ступень экономит сеть или память по сравнению с предыдущей, но требует более сложных коллективных операций и поддерживающего кода; реализованы эти подходы в библиотеках вроде Megatron-LM, Colossal-AI, DeepSpeed и JAX pjit.

Ускорение инференса LLM через тензорный параллелизм (подробный обзор)

Схема разделения на столбцы или ряды при 1-D.

Ускорение инференса LLM через тензорный параллелизм (подробный обзор)

Параллелизмы по другим осям, которые часто сочетают с TP

Ускорение инференса LLM через тензорный параллелизм (подробный обзор)

Как выбрать схему TP на практике

  1. До 8 GPU → чаще всего хватает 1-D TP: минимум кода, поддерживается во всех фреймворках.
  2. 32-128 GPU одной платы/подсети → переходят на 2-D; выигрываете ~√p в трафике без сильного роста памяти.
  3. Кластеры 100+ GPU, NVLink/NVSwitch → 2.5-D даёт лучший trade-off, если памяти много, а сеть «узкая».
  4. Сотни-тысячи GPU, целевые модели > 100 B параметров → нужна гибридная 3-D схема (TP + PP + ZeRO/FSDP).

Какие архитектуры LLM подходят для тензорного параллелизма?

Проще всего на тензорный делить классический decoder-only Transformer с много-головым (MHA) вниманием и одинаковыми, кратными числу GPU размерами скрытых слоёв (GPT-3/NeoX, LLaMA 1-3, Mistral 7B, Falcon 40B и т.п.).

TP делит матрицы Q K V и MLP-слоёв по колонкам/строкам или по головам, и каждая карта считает «свою» долю — коммуникация нужна только для итогового All-Reduce на выходе слоя, что масштабируется почти линейно при NVLink/NVSwitch (≈ 85-95 % эффективности на 8 GPU)

Можно ли ускорить инференс в 1 поток модели, которая вмещается 2-4 раза в память GPU?

Коротко - нет. Если есть избыток памяти, можно попробовать спекулятивный декодинг. Однако его преимущества могут быть хуже при множественных параллельных запросах и привести к деградации скорости.

А если 1 GPU разделен на 2 виртуальных?

Большую VRAM одной мощной карты (A100 80 GB, H100 94 GB, RTX 6000 Ada 48 GB и т.д.) можно «нарезать» на несколько виртуальных GPU (профиль vGPU, Hyper-V GPU-PV) или, на архитектурах Ampere/Hopper, на MIG-инстансы. Такое деление не ускорит одну «тяжёлую» модель через tensor parallelism: каждая виртуальная доля получает лишь часть потоковых мультипроцессоров, тензорных ядер и памяти, а добавляется ещё синхронизация между инстансами. На практике один рабочий поток почти всегда быстрее на «цельном» GPU.

Влияние тензорного параллелизма на точность инференса

Теоретически не снижает качество инференса, но может быть фактором детерминирования из-за чего вывод может незначительно отличаться по сравнению с моделью, которая помещается на GPU или при конвейерном параллелизме.

Тензорный параллелизм и пропускная способность PCIe

Как и в случае со скоростью инференса, использование Ollama и конвейерного параллелизма создает стереотип, что скорость шины не важна, или минимальна и можно даже на майнинговых райзерах 1x PCIE работать. Однако при тензорном параллелизме узким местом становится шина PCIE и может привести к тому, что пользы не будет или наоборот замедлит инференс. Поэтому в HPC-решениях используют SXM/NVLINK, а Infiniband для соединения узлов.

Я замерил на своем сервере и действительно при тензорном параллелизме на два GPU PCIE 3 была полностью забита до теоретического максимума на этапе prefill, загрузка снижалась лишь на этапе decode. В данном обзоре не буду делать свою выкладку по тестированию, пожалуй, лучше в отдельную статье размещу.

Пользователь с reddit показал, что инференс Mistral Large 123B 5bpw на 4x3090 в конфигурации x8 x8 x4 x1 PCI-E 3.0 давал 15-20 т/с, а на другом сервере в режиме x16 PCI-E 4.0 - достигал уже 40 т/с. В то же время принудительное занижение до 3 версии PCIE снизило лишь на 5% скорость.

Еще один замечательный пример наконец-то показывает значимость NVLINK даже для потребительских карт. 3090 карты установлены в режиме PCIE Gen4 x8:

vllm command: NCCL_P2P_DISABLE=[0 or 1] CUDA_VISIBLE_DEVICES=[3,5 OR 0,4,3,5] vllm serve Qwen/Qwen2.5-7B-Instruct-1M --tensor-parallel [2 OR 4] --gpu-memory-utilization 0.9 --max-model-len 32768
NVLInk улучшает производительность вывода (в тензорном параллелизме) на 50% при использовании 2x3090 и на 10% при использовании 4x3090. Это имеет смысл. 
NVLInk улучшает производительность вывода (в тензорном параллелизме) на 50% при использовании 2x3090 и на 10% при использовании 4x3090. Это имеет смысл. 

Энергоэффективность разных видов параллелизма

Важно иметь ввиду, особенно при работе на домашнем сервере с multi-GPU, чтобы не спалить проводку или не накрутить счетчики: при тензорном параллелизме все GPU в системе нагружаются одновременно. Значит пиковая потребляемая мощность будет максимальной из возможной, если позволяет, конечно, шина PCIE.

В статье тензорный параллелизм (TP) сравнивается с data parallelism (DP) и pipeline parallelism (PP). TP потребляет больше энергии, чем DP (из-за коммуникаций), но меньше, чем PP (где overhead на синхронизацию слоёв выше). Например: DP: Низкий overhead, энергия ~80–90% на вычисления.TP: ~60–70% на вычисления, 30–40% на коммуникации. PP: Может быть энергоёмким из-за bubble time (простои), до 50% потерь.

Mixed-precision (FP16/bf16) снижает энергопотребление на 20–30% в TP, так как уменьшает объём данных для коммуникаций. Без этого overhead растёт (до +15% энергии).

Заключение

Вот вроде и разобрались в большинстве нюансов тензорного параллелизма. Теперь, надеюсь, есть достаточно обоснования для покупки нескольких GPU в систему с наибольшим объемом памяти, а также стало очевидно, что нельзя пренебрегать скоростью шины PICE в конфигурация с multi-GPU.

Заглядывайте на мой ТГ-канал, черкану может там чего еще полезного.

Начать дискуссию