Обзор и тест PPU Zhenwu 810E от Alibaba для инференса LLM

Тестирование китайского AI-ускорителя от Alibaba — PPU Zhenwu 810E

Дмитрий Михин
Дмитрий Михин Старший MLOps-инженер
5 октября 2026

Подробный разбор PPU Zhenwu 810E от Alibaba: 1,5 ТБ VRAM, особенности топологии ICN, работа с Docker, бенчмарки производительности LLM и ключевые ограничения PPU SDK.

Изображение записи

Современный ландшафт AI-ускорителей изобилует всевозможными устройствами: GPU, TPU, NPU, LPU и прочими удивительными аббревиатурами. Китайские компании активно участвуют в этой колоссальной гонке, и в данном материале я расскажу, как мы тестировали AI-ускоритель от Alibaba Group.

В первую очередь мы хотели понять, что за устройство перед нами и как его можно использовать в наших стандартных сценариях для инференса — прежде всего в качестве ноды для облачного Kubernetes или как самостоятельный dedicated-сервер. Что ж, давайте разбираться.

Пару слов про PPU

Компания Chaitex предоставила нам для тестирования сервер в виде AI-станции. Она поставляется с предустановленными драйверами и компонентами для работы через UI-интерфейс. Так как работа через UI — не наш целевой вариант использования, то все тесты касались потенциальной возможности интегрировать такой сервер в нашу облачную инфраструктуру.

Серверное оборудование (AI-станция) и коммутационные кабели в дата-центре.

Возможности изменить ОС и драйверы не представилось, но тем не менее в официальной документации имеется ссылка на загрузку единственной доступной версии драйверов v2.1.2.

Конфигурация сервера включает в себя 16 PPU Zhenwu 810E. Их разрабатывает подразделение Alibaba — T-HEAD (Pingtou Ge Semiconductor Co., Ltd.). Сами Alibaba называют устройство Parallel Processing Unit. Можно воспринимать его как отдельный класс ускорителей, вроде TPU или GPU.

Zhenwu 810E, согласно характеристикам, оснащен 96GB HBM2e с заявленной пропускной способностью 2 765 ГБ/с (~2,77 ТБ/с), интерфейсом PCIe 5.0 x 16 и собственным межчиповым интерконнектом ICN с заявленной суммарной пропускной способностью до 700 ГБ/с на ускоритель. Суммарно на сервере мы имеем 1 536 ГБ HBM2e VRAM — довольно впечатляющий объем.

Документация и совместимость

Весь стек, связанный с PPU, — суверенный и локальный, нативные NVIDIA-библиотеки и инструменты не работают с PPU, хотя заявляется, что существует совместимость с исходниками для CUDA-кода. Но эти исходники нужно компилировать под PPU c помощью PPU SDK для портирования. Ниже приведена схема компиляции из документации.

Блок-схема, сравнивающая процессы компиляции и выполнения для PPU и GPU. Левая часть показывает компиляцию CUDA Host Code через NVCC Wrapper и HGCC Compiler в исполняемый файл PPU, а также компиляцию CUDA Kernel Code через NVCC Compiler в исполняемый файл GPU с пометкой о бинарной несовместимости. Правая часть демонстрирует этапы выполнения программ для PPU и GPU.
Схема компиляции Cuda-кода под PPU. Источник.

Таким образом, все привычные для трейнинга и инференса библиотеки и тулы — PyTorch, Transformers, flashattention, vLLM и прочие — должны быть портированы под PPU.

Адаптацией библиотек, тулов и квантизацией моделей занимается также компания T-HEAD. Что касается документации — она доступна на китайском языке и скорее предназначена разработчикам SDK. В комплекте с AI-станцией идет русскоязычная инструкция по работе с установленной на сервер инференс-платформой Alibaba AI Stack. Я же в своих исследованиях пользовался документацией по облачному сервису Alibaba Cloud Zhenwu PPU Service. Часть информации доступна на английском, но самая актуальная выглядит так:

Документация к релизу inference-xpu-pytorch 26.04 с описанием новых функций, обновлением CUDA до версии 13.0, интеграцией vLLM, SGLang и поддержкой нейросетей DeepSeek и MiniMax.
Пример китайской документации. Источник.

Если хотите на английском — будьте добры пройти на глобальный портал облака, но имейте в виду, что там документация доступна только в предыдущей итерации. А актуальность доступной информации для PPU имеет важное значение, и далее вы поймете, почему.

Так вот, портированный и скомпилированный стек для инференса предоставляется в виде собранного Docker-образа. Сам образ имеет определенный тег и в документации можно посмотреть конкретные версии библиотек и тулов, адаптированных под PPU.

Сравнительная таблица различных версий образов inference-xpu-pytorch. В столбцах представлены теги образов (например, 26.01-v2.0.0), сценарии использования (LLM inference), фреймворк (pytorch), требования (PPU SDK v2.0.0) и детальный список системных компонентов, включая версии Ubuntu, Python, Torch, CUDA и ACCL.
Список портированных библиотек в образе PPU SDK. Источник.

И вот тут проявляется основной риск использования этого стека. При появлении новой актуальной модели или новой версии инференс-сервера мы вынуждены дожидаться, пока команда T-HEAD портирует все это под PPU. Даже в текущей ситуации мы зачастую ждем поддержку архитектуры: например, в vLLM некоторое время и в особых случаях пользуемся nightly-образами.

C PPU эта итерация увеличивается на неопределенный срок — например, на 26.08.2026 актуальный образ vLLM имеет версию v0.27.0, а актуальная сборка для PPU, которую можно найти только на китайской версии Alibaba Cloud, имеет в своем составе vLLM v0.23.0. Плюс для PPU существуют рекомендуемые квантизации весов моделей — и их квантизацией занимается тоже команда T-HEAD.

Что касается квантования, здесь есть важный момент. PPU поддерживает FP32, BF16 и FP16, а также следующие схемы квантизации: W8A8 (INT8), AWQ (W4A16), и GPTQ (W4A16, W8A16). Сами Alibaba советуют для инференса использовать W8A8 квантизацию моделей: она компактнее полновесных, при этом нет критического падения качества. В частности, актуальные на текущий момент модели с такой квантизацией, которую советуют производители PPU, это DeepSeek R1, DeepSeek v3.2, Kimi-K2-Instruct, Qwen3-235B-A22B, GLM-5, MiniMax-M2.5 и Qwen3.5-397B-A17B:


      The following are examples of quantized models adapted for SDK 2.0. The system login credentials are the same as your PTG PIP credentials. If you do not have them, contact your account manager:
 
DeepSeek-R1: Supports per-token/per-channel a8w8 (int8) quantization. 
DeepSeek v3.2: Supports per-token/per-channel a8w8 (int8) quantization.  
Kimi-K2-Instruct: Supports per-token/per-channel a8w8 (int8) quantization.
Qwen3-235B-A22B: Supports per-token/per-channel a8w8 (int8) quantization.
GLM-5: Supports per-token/per-channel w8a8 (int8) quantization.
MiniMax-M2.5: Supports per-token/per-channel w8a8 (int8) quantization. 
Qwen3.5-397B-A17B: Supports per-token/per-channel w8a8 (int8) quantization.

В самом же UI-интерфейсе AI-станции можно увидеть такой список предлагаемых моделей вендором:

Интерфейс выбора языковых моделей в панели управления. На странице отображены карточки различных ИИ-моделей, включая Kimi (Kimi-K2.6, Kimi-K2.5), Qwen Chat (Qwen3.5, Qwen3, Qwen2.5, Qwen3.6-Plus), GLM-5 и различные версии DeepSeek (DeepSeek-R1, DeepSeek-V3, DeepSeek-V3.1). Большинство моделей имеют статус Not Deployed.

Можно оценить «свежесть» моделей и рекомендуемые квантизации. И раздобыть такие веса — та еще задача.

На Hugging Face T-HEAD не представлена — есть модели в W8A8, но от неверифицированных источников, официально не поддерживаемых T-HEAD. Сами T-HEAD выкладывают свои модели на китайском аналоге Hugging Face — Modelscope.cn (на глобальной версии Modelscope.ai их нет).

Скриншот репозитория T-HEAD на ModelScope с квантованной моделью DeepSeek-V4-Flash-0731-Quant-W-INT8-PerChannel-A-INT8-PerToken.
Модель от T-HEAD на Modelscope.

Внутри образа PPU SDK модель качается без авторизаций и токенов:


      modelscope download --model T-HEAD/DeepSeek-V4-Flash-0731-W8A8-INT8 --local_dir deepseek

Для привычных NVIDIA-утилит есть аналоги: часть доступна на самом сервере, часть — внутри образа PPU SDK . Я делаю акцент на доступности тулов вот почему: согласно документации от cloud-сервиса PPU Zhenwu 810e, чтобы добыть deb- / rpm-пакет аналога DCGM, нужен какой-то аккаунт.

Скриншот документации Alibaba Cloud о необходимости логина и пароля для скачивания установочного пакета PPU DCGM.
Скриншот про доступ к скачиванию deb-пакета.

Речь идет только о cloud-сервисе, документацией которого я пользовался, или вообще о всей обвязке PPU — непонятно, но найти rpm-пакет для ppu-dcgm мне не удалось. 

В UI-интерфейсе AI-станции меж тем метрики PPU отображены.

Скриншот графика мониторинга AI-станции: утилизация GPU, температура, энергопотребление и использование памяти.
Скриншот метрик AI-станции.

Обзор сервера

Итак, приступаем к практическим шагам. В первую очередь хотелось получить хоть какую-то знакомую информацию и я воспользовался ppu-smi — аналогом nvidia-smi. Он показывает 16 PPU-устройств с похожими метриками утилизации, возможным MIG-профилем (!), версией драйвера и возможной версией HGGC.

[root@ali117196 ~]# ppu-smi
Tue Aug 18 22:02:09 2026
+-------------------------------------------------------------------------------+
| PPU-SMI 1.18          Driver Version: 1.6.3-8ee7e7  HGGC Version: N/A         |
+---------------------------------+----------------------+----------------------+
| PPU  Name        Persistence M. | Bus-Id               | Volatile Uncorr. ECC |
| Fan  Temp  Perf   Pwr:Usage/Cap | Memory-Usage         | PPU-Util  Compute M. |
|                                 |                      |               MIG M. |
+=================================+======================+======================+
| 0  PPU-ZW810E        N/A        | 00000001:C9:00.0     |                    0 |
| N/A  31C   N/A       90W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 1  PPU-ZW810E        N/A        | 00000001:C8:00.0     |                    0 |
| N/A  33C   N/A       86W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 2  PPU-ZW810E        N/A        | 00000001:80:00.0     |                    0 |
| N/A  30C   N/A       87W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 3  PPU-ZW810E        N/A        | 00000001:81:00.0     |                    0 |
| N/A  28C   N/A       92W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 4  PPU-ZW810E        N/A        | 00000000:7E:00.0     |                    0 |
| N/A  27C   N/A       90W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 5  PPU-ZW810E        N/A        | 00000000:7F:00.0     |                    0 |
| N/A  29C   N/A       87W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 6  PPU-ZW810E        N/A        | 00000000:C7:00.0     |                    0 |
| N/A  31C   N/A       90W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 7  PPU-ZW810E        N/A        | 00000000:C6:00.0     |                    0 |
| N/A  31C   N/A       85W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 8  PPU-ZW810E        N/A        | 00000001:A5:00.0     |                    0 |
| N/A  32C   N/A       87W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 9  PPU-ZW810E        N/A        | 00000001:A4:00.0     |                    0 |
| N/A  32C   N/A       89W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 10  PPU-ZW810E        N/A       | 00000001:0A:00.0     |                    0 |
| N/A  30C   N/A       89W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 11  PPU-ZW810E        N/A       | 00000001:0B:00.0     |                    0 |
| N/A  28C   N/A       86W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 12  PPU-ZW810E        N/A       | 00000000:08:00.0     |                    0 |
| N/A  28C   N/A       87W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 13  PPU-ZW810E        N/A       | 00000000:09:00.0     |                    0 |
| N/A  31C   N/A       86W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 14  PPU-ZW810E        N/A       | 00000000:A3:00.0     |                    0 |
| N/A  33C   N/A       88W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 15  PPU-ZW810E        N/A       | 00000000:A2:00.0     |                    0 |
| N/A  32C   N/A       90W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+

+-------------------------------------------------------------------------------+
| Processes:                                                                    |
| PPU    GI   CI   PID      Type  Process name                       PPU Memory |
|        ID   ID                                                     Usage      |
+===============================================================================+
| No running processes found                                                    |
+-------------------------------------------------------------------------------+


PPU связаны между собой по хитрой физико-логической топологии.

[root@ali117196 ~]# ppu-smi topo -m 
         PPU0    PPU1    PPU2    PPU3    PPU4    PPU5    PPU6    PPU7    PPU8    PPU9    PPU10   PPU11   PPU12   PPU13   PPU14   PPU15   NIC0    NIC1    NIC2    NIC3    NIC4    NIC5    CPU Affinity    
NUMA Affinity
 PPU0    X       ICN2    ICN1    ICN2    ICN1    SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     48-95,144-191   
2-3
 PPU1    ICN2    X       ICN2    ICN1    SYS     ICN1    SYS     SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     48-95,144-191   
2-3
 PPU2    ICN1    ICN2    X       ICN1    SYS     SYS     ICN2    SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     PIX     48-95,144-191   
2-3
 PPU3    ICN2    ICN1    ICN1    X       SYS     SYS     SYS     ICN2    SYS     SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     PIX     48-95,144-191   
2-3
 PPU4    ICN1    SYS     SYS     SYS     X       ICN2    ICN1    ICN2    SYS     SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     0-47,96-143     
0-1
 PPU5    SYS     ICN1    SYS     SYS     ICN2    X       ICN2    ICN1    SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     0-47,96-143     
0-1
 PPU6    SYS     SYS     ICN2    SYS     ICN1    ICN2    X       ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     PIX     SYS     SYS     0-47,96-143     
0-1
 PPU7    SYS     SYS     SYS     ICN2    ICN2    ICN1    ICN1    X       SYS     SYS     SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     PIX     SYS     SYS     0-47,96-143     
0-1
 PPU8    SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     X       ICN2    ICN1    ICN2    ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     48-95,144-191   
2-3
 PPU9    ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     ICN2    X       ICN2    ICN1    SYS     ICN1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     48-95,144-191   
2-3
 PPU10   SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     ICN1    ICN2    X       ICN1    SYS     SYS     ICN2    SYS     SYS     SYS     SYS     SYS     PIX     SYS     48-95,144-191   
2-3
 PPU11   SYS     SYS     ICN1    SYS     SYS     SYS     SYS     SYS     ICN2    ICN1    ICN1    X       SYS     SYS     SYS     ICN2    SYS     SYS     SYS     SYS     PIX     SYS     48-95,144-191   
2-3
 PPU12   SYS     SYS     SYS     SYS     SYS     ICN1    SYS     SYS     ICN1    SYS     SYS     SYS     X       ICN2    ICN1    ICN2    SYS     SYS     SYS     SYS     SYS     SYS     0-47,96-143     
0-1
 PPU13   SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     ICN1    SYS     SYS     ICN2    X       ICN2    ICN1    SYS     SYS     SYS     SYS     SYS     SYS     0-47,96-143     
0-1
 PPU14   SYS     SYS     SYS     SYS     SYS     SYS     SYS     ICN1    SYS     SYS     ICN2    SYS     ICN1    ICN2    X       ICN1    SYS     SYS     PIX     SYS     SYS     SYS     0-47,96-143     
0-1
 PPU15   SYS     SYS     SYS     SYS     SYS     SYS     ICN1    SYS     SYS     SYS     SYS     ICN2    ICN2    ICN1    ICN1    X       SYS     SYS     PIX     SYS     SYS     SYS     0-47,96-143     
0-1
 NIC0    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     X       SYS     SYS     SYS     SYS     SYS     48-95,144-191   
2-3
 NIC1    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     X       SYS     SYS     SYS     SYS     0-47,96-143     
0-1
 NIC2    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     PIX     PIX     SYS     SYS     X       SYS     SYS     SYS     0-47,96-143     
0-1
 NIC3    SYS     SYS     SYS     SYS     SYS     SYS     PIX     PIX     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     X       SYS     SYS     0-47,96-143     
0-1
 NIC4    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     PIX     PIX     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     X       SYS     48-95,144-191   
2-3
 NIC5    SYS     SYS     PIX     PIX     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     X       48-95,144-191   
2-3

Legend:

  X    = Self
  SYS  = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
  NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
  PHB  = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
  PXB  = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
  PIX  = Connection traversing at most a single PCIe bridge
  ICN# = Connection traversing a bonded set of # ICN links

NIC Legend:

  NIC0: mlx5_bond_0
  NIC1: mlx5_bond_1
  NIC2: mlx5_bond_2
  NIC3: mlx5_bond_3
  NIC4: mlx5_bond_4
  NIC5: mlx5_bond_5

PPU Rear Group:

  Rear ID 0: PPU 0,1,2,3,4,5,6,7
  Rear ID 1: PPU 8,9,10,11,12,13,14,15

Например, в случае соединения через NVSwitch графические процессоры NVIDIA внутри узла связаны по принципу «все-со-всеми». В случае TPU — каждое устройство связано с соседом, и вместе они образуют многомерные кольца. Выглядит это примерно так: 

Схема кольцевой топологии межпроцессорных связей TPU-ускорителей.
Схема связей TPU-ускорителей для примера структуры. Источник.

Каждый Zhenwu 810E имеет семь физических ICN-линий. В зависимости от расположения пары ускорителей между ними может быть задействован один ICN-линк (ICN1), два объединенных линка (ICN2), либо обмен идет через системные PCIe (SYS).

Маркетинговая картинка, похоже, пытается отразить эти связи на скриншоте:

Маркетинговая иллюстрация межчиповых связей ICN между ускорителями PPU Zhenwu 810E.
Маркетинговый скриншот PPU. Источник. 

При этом восемь PPU образуют группу со своим оптимальным порядком взаимодействия между собой.


       Rear ID 0: PPU 0,1,2,3,4,5,6,7
 Rear ID 1: PPU 8,9,10,11,12,13,14,15

Этот порядок важно учитывать и прокидывать в переменной CUDA_VISIBLE_DEVICES при инференсе модели на нескольких картах. Для облачного K8s разработана библиотека ACCL (аналог NCCL). В ее документации можно встретить такую ремарку про порядок взаимодействия PPU:


      However, the PPU Inter-Connect Network (ICN) uses a non-fully connected topology. To achieve maximum performance with specific parallel strategies, manually configure the environment variables as needed. The core of this optimization is to allocate more ICN links to high-latency Communication Groups and reduce link sharing and contention between them. This improves the overall efficiency of interconnect communication.

# For TP=2:
export CUDA_VISIBLE_DEVICES=4,7,5,6,1,2,0,3,12,15,13,14,9,10,8,11
# For TP=4:
export CUDA_VISIBLE_DEVICES=4,5,7,6,0,1,3,2,9,8,10,11,13,12,14,15
# For TP=8:
export CUDA_VISIBLE_DEVICES=4,5,7,6,2,3,1,0,13,12,14,15,11,10,8,9
# No configuration needed for TP=1 or TP=16.

И хотя тут речь про связку Kubernetes + PPU и ACCL-библиотеки, для PCCL-библиотеки (тоже аналог NCCL) порядок также важен для оптимального интерконнекта.

Каждый ICN имеет пропускную способность примерно 53 ГБ/с.


      root@ali117196 ~]# ppu-smi icn -s 
PPU 0: PPU-ZW810E (UUID: GPU-01de0211-0952-030e-0000-000060d7d05f)
    Link 0: 53 GB/s
    Link 1: 53 GB/s
    Link 2: 53 GB/s
    Link 3: 53 GB/s
    Link 4: 53 GB/s
    Link 5: 53 GB/s
    Link 6: 53 GB/s
PPU 1: PPU-ZW810E (UUID: GPU-019e2226-0480-0030-0000-000040937a19)
    Link 0: 53 GB/s
    Link 1: 53 GB/s
    Link 2: 53 GB/s
    Link 3: 53 GB/s
    Link 4: 53 GB/s
    Link 5: 53 GB/s
    Link 6: 53 GB/s
...
...
...

В документации не удалось найти, в одном или двух направлениях заявлено это значение, но вот у NVLink третьего и четвертого поколений (карты A100 и H100) пропускная способность одного линка — 50 ГБ/с в два направления.

Таблица сравнения интерфейсов NVIDIA NVLink 3.0 для Ampere A100 и NVLink 4.0 для Hopper H100 и H200 с указанием количества линий и пропускной способности.
Характеристики NVLink 3.0 и NVLink 4.0.

Тесты интерконнектов ICN

Далее были попытки протестировать интерконнект по аналогии с nccl_perf_tests.

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

В собранном образе PPU SDK нашлись скрипты, похожие по назначению на NCCL-тесты:


      cd /usr/local/PPU_SDK/comm_tools/multi_process

ls
# all_reduce_perf
# alltoall_perf
# ...

Для типичных TP-сценариев критичны такие алгоритмы коммуникации, как AllReduce, AllGather и ReduceScatter, тогда как для экспертного параллелизма в моделях MoE важнее AlltoAll. В рамках нашего тестирования мы сфокусировались на операциях AllReduce и AlltoAll.

Попытка сразу запустить тест по аналогии с nccl-tests сразу завершилась ошибкой:


      root@ali117196:/usr/local/PPU_SDK/comm_tools/multi_process# CUDA_VISIBLE_DEVICES=4,5,7,6,2,3,1,0 ./all_reduce_perf -b 8M -e 1G -f 2 -g 8
# nThread 1 nGpus 8 minBytes 8388608 maxBytes 1073741824 offset <0>/<0> step: 2(factor) warmup iters: 5 iters: 20 validation: 1 single_test: 0 test_buffer_kind: both elapsed_type: cpu_time average: MIN register: 0
#
# Using devices
#   Rank  0 Group  0 Pid     168 on  ali117196 device  0 [0xc9] PPU-ZW810E
#   Rank  1 Group  0 Pid     168 on  ali117196 device  1 [0xc8] PPU-ZW810E
#   Rank  2 Group  0 Pid     168 on  ali117196 device  2 [0x80] PPU-ZW810E
#   Rank  3 Group  0 Pid     168 on  ali117196 device  3 [0xc7] PPU-ZW810E
#   Rank  4 Group  0 Pid     168 on  ali117196 device  4 [0x7f] PPU-ZW810E
#   Rank  5 Group  0 Pid     168 on  ali117196 device  5 [0x7e] PPU-ZW810E
#   Rank  6 Group  0 Pid     168 on  ali117196 device  6 [0xc6] PPU-ZW810E
#   Rank  7 Group  0 Pid     168 on  ali117196 device  7 [0x81] PPU-ZW810E

[ali117196][168:168][7][bootstrap.cc:93] NCCL ERROR Bootstrap : no socket interface found

[ali117196][168:168][7][net.cc:279] NCCL WARN net.cc:279 -> 3

[ali117196][168:168][7][init.cc:385] NCCL WARN init.cc:385 -> 3

[ali117196][168:168][7][init.cc:411] NCCL WARN init.cc:411 -> 3
ali117196: Test PCCL failure common.cu:1455 'internal error'

PCCL требовался сетевой интерфейс для инициализации и обмена служебной информацией. В моем случае это лечилось экспортом нужных env-переменных:


      export NCCL_SOCKET_IFNAME=lo
export NCCL_SOCKET_FAMILY=AF_INET
export NCCL_DEBUG=INFO

В документации вендора указано, какие переменные установлены по дефолту:

Настройки базовых переменных окружения NCCL в документации вендора.
Источник.

Первым тестом хотелось проверить базовый интерконнект разных типов соединений, указанных в матрице топологии ppu-smi topo между двумя PPU. Использовался AllReduce-тест с данными до 1 ГБ.

ICN2 для пары PPU0-PPU1


      CUDA_VISIBLE_DEVICES=0,1 \
./all_reduce_perf -b 4096 -e 1G -f 2 -w 10 -n 50 -g 2

Весь лог публиковать не буду, покажу только последние пять значений.


      size         time(us)    algbw     busbw
134217728     1544.41     86.91     86.91
268435456     3042.48     88.23     88.23
536870912     6034.78     88.96     88.96
1073741824   12014.10     89.37     89.37

# Out of bounds values : 0 OK

Получилось около 89,4 ГБ/с.

ICN1 для пары PPU0-PPU2


      CUDA_VISIBLE_DEVICES=0,2 \
./all_reduce_perf -b 4096 -e 1G -f 2 -w 10 -n 50 -g 2

      size         time(us)    algbw     busbw
134217728     3105.61     43.22     43.22
268435456     6136.45     43.74     43.74
536870912    12316.80     43.59     43.59
1073741824   24422.60     43.97     43.97

# Out of bounds values : 0 OK

Ожидаемо почти в два раза медленнее — около 44 ГБ/с.

SYS для пары PPU0-PPU5 без ICN


      CUDA_VISIBLE_DEVICES=0,5 \
./all_reduce_perf -b 4096 -e 1G -f 2 -w 10 -n 50 -g 2

      size         time(us)    algbw     busbw
134217728     9361.68     14.34     14.34
268435456    18748.80     14.32     14.32
536870912    37565.10     14.29     14.29
1073741824   75348.60     14.25     14.25

# Out of bounds values : 0 OK

Получилось около 14,3 ГБ/с.

Ранее я ссылался на информацию, что при инференсе на нескольких PPU очень важна топология размещения ускорителей — вот получили наглядное подтверждение. Если PPU подобраны не из одной локальной группы, то задержки при инференсе могут существенно вырасти.

Далее от пары PPU перейдем к тесту AllReduce между группой из восьми PPU одной ICN-группы.


      CUDA_VISIBLE_DEVICES=4,5,7,6,2,3,1,0 \
./all_reduce_perf -b 4096 -e 1G  -f 2  -w 10  -n 50  -g 8

      size            time(us)   algbw      busbw
67108864        560.70     119.69    209.45
134217728       1033.72    129.84    227.22
268435456       1957.16    137.16    240.02
536870912       3879.98    138.37    242.15
1073741824      7705.49    139.35    243.86

В сценарии AllReduce для восьми PPU общая нормализованная оценка эффективности коммуникационного слоя составляет 244 ГБ/с. 

Для MoE-сценария используется другой алгоритм коммуникации — AlltoAll. Тут тест выполнялся на всех доступных 16 PPU.


      ./alltoall_perf -b 4096 -e 1G -f 2  -w 10 -n 50  -g 16

      size         time(us)    algbw     busbw
33554432       449.19     74.70     70.03
67108864       862.86     77.78     72.91
134217728     1690.93     79.38     74.41
268435456     3346.55     80.21     75.20
536870912     6674.53     80.44     75.41
1073741824   13376.00     80.27     75.26

На 16 PPU нормализованная оценка эффективности коммуникационного слоя составляет 75 ГБ/с.

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

Попытки стартовать инференс

Далее нам нужно было запустить, наконец, какую-то доступную модель. Напомню, целевой способ использования сервера планируется в составе Kubernetes, поэтому инференс необходимо было запустить в подготовленных контейнерных образах с PPU SDK. 

В документации к Alibaba Cloud PPU Service образы указаны с учетом реджистри Alibaba Cloud, но, к счастью, существует возможность скачать их из глобального и доступного без регистрации реджистри:


      egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-xpu-pytorch:26.04-v2.1.0-vllm0.23.0-torch2.10-cu130-20260710

И вот после скачивания образа возник вопрос о том, как именно прокидывать PPU в запущенный контейнер. В случае с NVIDIA GPU мы устанавливаем прослойку — nvidia-container-toolkit и через нее прокидываем GPU в Docker-контейнеры. Для PPU такой прослойки нет, и нужно прокидывать каждое устройство как девайс.

Список девайсов смотрим в /dev.


      ls /dev 

alixpu
alixpu-caps
alixpu-caps-imex-channels
alixpu_ctl
alixpu_ppu0
alixpu_ppu1
alixpu_ppu10
alixpu_ppu11
alixpu_ppu12
alixpu_ppu13
alixpu_ppu14
alixpu_ppu15
alixpu_ppu2
alixpu_ppu3
alixpu_ppu4
alixpu_ppu5
alixpu_ppu6
alixpu_ppu7
alixpu_ppu8
alixpu_ppu9
alixpu_sep

А далее прокидываем устройства через параметр --device и видим внутри контейнера только то, что прокинули.


      [root@ali117196 ~]# nerdctl run -it --device=/dev/alixpu_ppu0 --device=/dev/alixpu --device=/dev/alixpu_ctl egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-xpu-pytorch:25.03-v1.4.3-hotfix-vllm0.7.3-torch2.5-cu123-20250331 -- bash 
=================================
PPU SDK Version:    v1.4.3-hotfix
CUDA Wrapper:       cuda-12.3
PyTorch Version:    2.5.1
NGC Version:        pytorch:-py3
Python Version:     Python 3.10.13
=================================
Setup environment for CUDA
[INFO] Get Dockerfile at /Dockerfile
Driver Version                              : 1.6.3-8ee7e7
HGGC Version                                : 11.1
SDK Version                                 : 1.4.3-15e77a
PPU 00000001:C9:00.0
    VBIOS Version                           : 1.6.12-af69f0
[WARNING] shm-size 64M(docker default value) which may be not enough, add --shm-size=4g or bigger depend on your model

Внутри контейнера виден прокинутый девайс:

root@8d535cca6772:/workspace/pytorch# ppu-smi 
Tue Aug 18 22:58:22 2026
+-------------------------------------------------------------------------------+
| PPU-SMI 1.13          Driver Version: 1.6.3-8ee7e7  HGGC Version: 11.1        |
+---------------------------------+----------------------+----------------------+
| PPU  Name        Persistence M. | Bus-Id               | Volatile Uncorr. ECC |
| Fan  Temp  Perf   Pwr:Usage/Cap | Memory-Usage         | PPU-Util  Compute M. |
|                                 |                      |               MIG M. |
+=================================+======================+======================+
| 0  PPU-ZW810E        N/A        | 00000001:C9:00.0     |                    0 |
| N/A  31C   N/A       90W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+

+-------------------------------------------------------------------------------+
| Processes:                                                                    |
| PPU    GI   CI   PID      Type  Process name                       PPU Memory |
|        ID   ID                                                     Usage      |
+===============================================================================+
| No running processes found                                                    |
+-------------------------------------------------------------------------------+

Есть небезопасный способ запускать контейнер через privileged-режим — так мы можем увидеть в контейнере все доступные на хосте PPU-устройства.

[root@ali117196 ~]# nerdctl run -it --privileged egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-xpu-pytorch:25.03-v1.4.3-hotfix-vllm0.7.3-torch2.5-cu123-20250331 -- bash 
=================================
PPU SDK Version:    v1.4.3-hotfix
CUDA Wrapper:       cuda-12.3
PyTorch Version:    2.5.1
NGC Version:        pytorch:-py3
Python Version:     Python 3.10.13
=================================
Setup environment for CUDA
[INFO] Get Dockerfile at /Dockerfile
Driver Version                              : 1.6.3-8ee7e7
HGGC Version                                : 11.1
SDK Version                                 : 1.4.3-15e77a
PPU 00000001:C9:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000001:C8:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000001:80:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000001:81:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:7E:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:7F:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:C7:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:C6:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000001:A5:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000001:A4:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000001:0A:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000001:0B:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:08:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:09:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:A3:00.0
    VBIOS Version                           : 1.6.12-af69f0
PPU 00000000:A2:00.0
    VBIOS Version                           : 1.6.12-af69f0
[WARNING] shm-size 64M(docker default value) which may be not enough, add --shm-size=4g or bigger depend on your model
root@813f06d4156e:/workspace/pytorch# nvidia-smi
Tue Aug 18 23:03:12 2026
+-------------------------------------------------------------------------------+
| PPU-SMI 1.13          Driver Version: 1.6.3-8ee7e7  HGGC Version: 11.1        |
+---------------------------------+----------------------+----------------------+
| PPU  Name        Persistence M. | Bus-Id               | Volatile Uncorr. ECC |
| Fan  Temp  Perf   Pwr:Usage/Cap | Memory-Usage         | PPU-Util  Compute M. |
|                                 |                      |               MIG M. |
+=================================+======================+======================+
| 0  PPU-ZW810E        N/A        | 00000001:C9:00.0     |                    0 |
| N/A  31C   N/A       90W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 1  PPU-ZW810E        N/A        | 00000001:C8:00.0     |                    0 |
| N/A  33C   N/A       86W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 2  PPU-ZW810E        N/A        | 00000001:80:00.0     |                    0 |
| N/A  29C   N/A       87W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 3  PPU-ZW810E        N/A        | 00000001:81:00.0     |                    0 |
| N/A  28C   N/A       91W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 4  PPU-ZW810E        N/A        | 00000000:7E:00.0     |                    0 |
| N/A  26C   N/A       90W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 5  PPU-ZW810E        N/A        | 00000000:7F:00.0     |                    0 |
| N/A  29C   N/A       87W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 6  PPU-ZW810E        N/A        | 00000000:C7:00.0     |                    0 |
| N/A  30C   N/A       89W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 7  PPU-ZW810E        N/A        | 00000000:C6:00.0     |                    0 |
| N/A  30C   N/A       85W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 8  PPU-ZW810E        N/A        | 00000001:A5:00.0     |                    0 |
| N/A  32C   N/A       88W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 9  PPU-ZW810E        N/A        | 00000001:A4:00.0     |                    0 |
| N/A  32C   N/A       89W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 10  PPU-ZW810E        N/A       | 00000001:0A:00.0     |                    0 |
| N/A  30C   N/A       89W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 11  PPU-ZW810E        N/A       | 00000001:0B:00.0     |                    0 |
| N/A  27C   N/A       86W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 12  PPU-ZW810E        N/A       | 00000000:08:00.0     |                    0 |
| N/A  28C   N/A       87W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 13  PPU-ZW810E        N/A       | 00000000:09:00.0     |                    0 |
| N/A  30C   N/A       86W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 14  PPU-ZW810E        N/A       | 00000000:A3:00.0     |                    0 |
| N/A  33C   N/A       88W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+
| 15  PPU-ZW810E        N/A       | 00000000:A2:00.0     |                    0 |
| N/A  32C   N/A       89W / 400W | 3MiB / 98304MiB      |   0%        Default  |
|                                 |                      |             Disabled |
+---------------------------------+----------------------+----------------------+

+-------------------------------------------------------------------------------+
| Processes:                                                                    |
| PPU    GI   CI   PID      Type  Process name                       PPU Memory |
|        ID   ID                                                     Usage      |
+===============================================================================+
| No running processes found                                                    |
+-------------------------------------------------------------------------------+

Стандартная проверка CUDA-вызовов и определения устройств из torch работает:


      root@813f06d4156e:/workspace/pytorch#  python 
Python 3.10.13 (main, Mar 24 2025, 13:57:47) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print("torch",torch.__version__)
torch 2.5.1
>>> print("cuda is available?",torch.cuda.is_available())
cuda is available? True
>>> print("device count", torch.cuda.device_count())
device count 16

В процессе попыток запуска контейнера возникало множество мелких, но поправимых багов вроде жестких ссылок и заранее определенных переменных, направленных на китайские ресурсы и зеркала. Жить можно, но нужно про это помнить.

После базовых тестов с контейнерами приступили к тестам моделей.

Тест DeepSeek-v4-Flash-0731-w8a8 (TP = 8)

В нашей команде при тестах новых моделей или железа мы используем стандартизированные профили нагрузки: так мы примерно понимаем, какой перформанс можно ожидать от модели и железа в различных сценариях. Мы определяем количество input-/output-токенов контекста и ступенчато поднимаем значение concurrency.

Для PPU и доступных моделей использовались три типовых сценария:

  • Chat: соотношение 1024/512 токенов — это наш бейзлайн;
  • RAG: соотношение 32k/1024 токенов — тяжелый prefill-сценарий;
  • Batch: соотношение 8k/8k токенов — упор на тяжелый decode-сценарий.

Мы оцениваем метрики по медианным значениям, а для анализа «хвостов» распределения отдельно выводим 99-й перцентиль — это позволяет получить более наглядную картину происходящего. 

Запустить на всех 16 PPU DeepSeek-v4-Flash-0731 не удалось — проблема связана с расчетом конфигурации vLLM для этой архитектуры. Удалось запустить только на восьми PPU:


      nerdctl run -it --privileged -p 8000:8000 -v /bmcp_lvm_fs/weights:/weights  egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-xpu-pytorch:26.04-v2.1.0-vllm0.23.0-torch2.10-cu130-20260710 -- vllm serve /weights/deepseek --host 0.0.0.0 --port 8000 --tensor-parallel-size 8 --trust-remote-code   --tool-call-parser deepseek_v4 --trust-remote-code --block-size 256   --served-model-name DeepSeek-V4-Flash-0731 --tokenizer-mode deepseek_v4   --reasoning-parser deepseek_v4 --enable-prefix-caching --enable-auto-tool-choice

Результаты получились следующие.

Chat-профиль — input 1024 / output 512:

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.83424.881274.64774.89924.5317.2020.7217.1649.189.56
161.29659.041977.13806.101254.6922.6525.1919.8560.0812.38
321.78893.162679.471260.782269.0032.5936.6426.42297.1917.91
642.271159.613478.821282.254371.0952.4256.4536.10626.3928.07
1282.781423.994271.982016.539974.6685.3690.9351.65695.3545.64
2003.031549.994649.962105.2116219.64124.66130.3268.41704.4165.81

RAG-профиль — input 32000 / output 1024:

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.17170.385495.429732.8725328.1536.9342.9316.64880.6647.51
160.20205.616631.789755.7353255.6566.4172.3522.62934.9377.69
320.22229.167391.218073.62105863.73129.39133.8531.48963.38140.44
640.24246.597953.478110.17216192.78245.58248.5548.29980.98259.34
1280.25256.128260.729920.58343338.69373.63377.1962.931002.25392.14

Batch-профиль — input 8000 / output 8000: 

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.05402.72805.643030.074888.4219.5120.0218.7637.38159.09
160.08666.421333.173105.2810945.7722.9722.3521.2642.62186.64
320.12920.591841.653117.5923389.9732.4632.8828.7857.60262.77
640.161241.582483.783134.7847682.7446.6946.9739.2887.49376.61
1280.201589.403179.6022254.1098019.5870.6972.8861.48774.03587.7
2000.251983.443967.8777924.09154652.5790.6199.2281.58785.40802.71

Тест DeepSeek-v4-Flash-0731-w8a8 (TP = 8, DP = 2)

Следующим этапом была попытка все-таки задействовать все PPU на сервере. Модель развернута с настройками TP = 8 и DP = 2: внутри vLLM поднимаются два инстанса модели, каждая модель — на своей Rear-группе, при этом веса дублируются для каждого инстанса.


      nerdctl run -d --name deepseek-dp2 --privileged -p 8000:8000 --ipc host -e NCCL_SOCKET_IFNAME=lo -e NCCL_SOCKET_FAMILY=AF_INET -e CUDA_VISIBLE_DEVICES=0,1,2,6,5,4,7,3,9,8,11,15,12,13,14,10 -e NCCL_DEBUG=INFO -v /bmcp_lvm_fs/weights:/weights egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-xpu-pytorch:26.04-v2.1.0-vllm0.23.0-torch2.10-cu130-20260710 vllm serve /weights/deepest --host 0.0.0.0 --port 8000 --tensor-parallel-size 8 --data-parallel-size 2 --api-server-count 1 --trust-remote-code --tool-call-parser deepseek_v4 --block-size 256 --served-model-name DeepSeek-V4-Flash-0731 --tokenizer-mode deepseek_v4 --reasoning-parser deepseek_v4  --enable-prefix-caching  --enable-auto-tool-choice

Chat-профиль — input 1024 / output 512:

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.40204.43614.89585.3130441.6933.1845.6132.6166.6217.54
160.82421.71268.50588.361622.5134.7843.4333.3972.0518.36
321.27651.361959.16922.8011111.1035.8151.2633.1470.8119.22
642.341198.353604.42598.803888.7444.7546.5436.7785.6923.47
1283.461772.745332.069922.669943.5954.0562.0136.5179.7737.54
2004.442271.286831.592243.702310.3983.7586.8545.34140.9445.04

RAG-профиль — input 32000 / output 1024:

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.15154.154971.879428.0915486.2242.3451.6932.40678.9352.74
160.23231.287459.7310477.1335403.4856.2965.3832.481049.8668.06
320.30309.079968.7010547.0670376.5688.0998.9832.891088.70100.86
640.33341.4111011.8611085.03171970.61156.24195.0736.411104.02170.92
1280.35358.7611571.3061363.78319504.48290.26363.8046.592127.90358.30
2000.34345.9011156.70211045.88500653.61352.76529.6461.714571.02571.92

Batch-профиль — input 8000 / output 8000:

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.03239.88479.882664.734117.0833.0833.7032.3364.47267.27
160.06455.60911.422841.767376.0933.4534.2532.8665.93270.41
320.10785.251570.903700.7114680.9336.7737.3935.2970.72297.82
640.161283.542567.724458.3935348.1540.3640.8536.5673.27327.30
1280.272138.024277.1114419.9858887.3850.7852.0341.82100.73420.61
2000.372973.575948.6246438.4191203.0361.2266.5054.04109.97536.14

Если сравнить результаты, то в этом эксперименте эффект от data parallelism появляется при большом батче. По графикам видно, что примерно с concurrency от 64 второй инстанс модели начинает влиять на метрики производительности. Возможно, два независимых инстанса с роутером перед ними будут давать совершенно другой перформанс, но такую гипотезу проверить не удалось.

Графики зависимости выходного потока токенов от числа одновременных запросов для конфигураций TP8 и TP8+DP2 в сценариях Chat, RAG и Batch/
Графики сравнения перформанса разных типов инференса DeepSeek-v4-Flash-0731.

Тепловые карты количества генерируемых токенов в секунду для модели DeepSeek-v4-Flash в зависимости от уровня параллелизма и профиля нагрузки.
Тепловая карта метрик производительности DeepSeek-v4-Flash-0731.

На тепловой карте наглядно можно увидеть ситуацию с плато по перформансу для prefill-нагруженного сценария — RAG.

Тест GLM-5.2 (TP = 16)

На самом сервере оказались полные веса GLM-5.2. При попытке запустить модель по вышеуказанному сценарию она свалилась — форк vLLM для PPU неправильно понимает чекпоинты и не может их загрузить.


      ValueError: Following weights were not initialized from checkpoint:
{
  model.layers.47.self_attn.indexer.k_norm.weight,
  model.layers.4.self_attn.indexer.k_norm.bias,
  model.layers.37.self_attn.indexer.k_norm.bias,
  ...
}

Engine core initialization failed

Тест Kimi K2.6 

Также на сервере находятся подготовленные веса Kimi K2.6 в квантизации W8A8 от T-HEAD. Эту модель удалось запустить без проблем. Результаты бенчмарков получились следующие.

Chat-профиль — input 1024 / output 512: 

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.36184.57556.591647.367980.4036.6160.8734.5740.3020.36
160.44222.93672.29360.344737.8069.9485.5763.6283.9136.10
320.53271.12817.61531.962427.35115.08126.36109.83138.8759.34
640.61311.62939.74755.213790.68195.57213.23173.71287.22100.69
1280.92473.101426.701302.722276.01216.62216.78205.71232.72112
2001.53781.782357.561975.012599.19251.81252.12240.92475.16130.65

RAG-профиль — input 32000 / output 1024:

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50, s
80.0480.301335.3530431.3462256.6884.9294.1854.542289.76117.30
160.0484.231400.6825154.27150411.03179.88185.90101.732536.83209.17
320.0483.871394.60172385.76622842246.15335.81134.672563.79424.2
640.0484.921412.211047058.011203970.53242.08330.91134.382551.541294.71

С ростом concurrency с таким контекстом емкость KV-Cache переполнена и сервер вышел на плато: 20 запросов в работе, остальные — в очереди.

График утилизации KV-Cache vLLM при тестировании модели Kimi K2.6.
Метрики утилизации KV-Cache для Kimi K2.6. 

График состояния планировщика vLLM с запросами в очередях Running и Waiting для Kimi K2.6.
Метрики очереди планировщика vLLM. 

Batch-профиль — input 8000 / output 8000:

concurrencyrpsOutput tok/sTotal tok/sTTFT p50, msTTFT
p99, ms
TPOT p50, msTPOT p99, msITL p50, msITL p99, msE2E p50
80.02185.14370.468856.0917130.8142.2443.5940.2043.81~ 5 m 
160.03204.94109188.223390876.7377.7971.9284.20~ 10 m 
320.03234.054688488.1773560.41133.88137.05123.85242.47~ 17m
640.03247.81495.8677351.28805702.39220.30345.21199.34407.01~ 30 m
1280.03241.55483.341236760.053498485.51245.52465.25199.372126.91~ 53 m
2000.03244.03488.032098643.765769940.37238.92456.35199.262061.37~ 66 m

С ростом concurrency также уперлись в KV-Cache и очередь.

График утилизации KV-Cache vLLM при бенчмаркинге Kimi K2.6 на тесте 8k/8k.
Метрики KV-Cache утилизации для Kimi K2.6 на тесте 8k/8k.

График роста очереди планировщика vLLM на тесте Batch 8k/8k для Kimi K2.6.
Состояние очереди планировщика vLLM при тесте 8k/8k.

Также для наглядности прикладываю график по E2E на 8k/8k-сценария.

Метрики задержки E2E Latency для Kimi K2.6.
График E2E для Kimi K2.6 на тесте 8k/8k.

Результирующие графики и тепловая карта также показывают выход на плато по перформансу для тяжелых prefill- и decode-сценариев.

Графики суммарной пропускной способности инференса Kimi K2.6 для профилей Chat, RAG и Batch.
Графики перформанса Kimi K2.6 на разных профилях теста.

Тепловая карта суммарной пропускной способности инференса модели Kimi K2.6 W8A8 при TP16.
Тепловая карта перформанса Kimi K2.6 на разных профилях теста.

Выводы

Справедливости ради, бейзлайна для сравнения у меня не оказалось под рукой. По идее, для адекватного сравнения нужен аналогичный сервер (например, конфигурация с 16 ускорителями A100). Между тем, с технической точки зрения AI-станция на базе 16 PPU имеет достойную пропускную способность ICN-интерконнекта и огромный объем VRAM — 1,5 ТБ. Подозреваю, что если глубже закопаться в документацию по настройке инференса для каждой доступной модели, можно выбить более интересные показатели на бенчмарках. Тем более что при поставке такого сервера в виде ПАК можно дополнительно получить от вендора дооптимизированные варианты open-source моделей семейства Qwen. 

Полноценную интеграцию с Kubernetes в рамках теста мы не выполняли, хотя тесты показали возможность работать с контейнерами на специально подготовленных образах и с пробрасыванием PPU внутрь. Основной же блокер — стек на базе PPU SDK:

  • нет достаточного объема документации для эксплуатации. А та, что есть, скорее относится к облачному сервису Alibaba Cloud;
  • нет коммьюнити и экспертизы — даже в мировом масштабе. Любые нетривиальные проблемы могут обернуться блокером. Одна надежда на коммуникацию с T-HEAD; 
  • неконтролируемый и непрогнозируемый лаг доработки PPU SDK для новых инструментов и моделей; 
  • особенности квантизации — добыть модели в нужной квантизации непросто. И хотя сервер обладает огромным объемом VRAM, полновесные модели будут забирать значительную часть этого объема. Это, конечно, глобальная проблема, но тут адаптированные небольшие веса найти сложнее.

На мой взгляд, железо подходит под запуск согласованных, адаптированных и проверенных моделей. Это актуально для проектов в государственном и бигтех-секторах, где итерация обновлений моделей может быть долгой. Проект активно развивается, поэтому в будущем имеет смысл рассмотреть следующее поколение устройства — PPU Zhenwu M890.

Скриншот с описанием характеристик процессора Zhenwu M890 от Alibaba T-Head: 144 ГБ VRAM, пропускная способность 800 ГБ/с и поддержка точностей от FP32 до FP4.
Анонс нового PPU Zhenwu M890.