Как работает нарезка Ascend vNPU
В отличие от NVIDIA vGPU, где можно запросить любой размер памяти, виртуализация Huawei NPU основана на шаблонах. Для каждой модели чипа задан фиксированный набор размеров срезов (так называемых templates), которые принимает прошивка; плагин и scheduler всегда округляют запрос памяти вверх до ближайшего шаблона.
С установочными шагами, которые настраивают Ascend device plugin и ConfigMap hami-scheduler-device, упомянутый ниже, см. Установка для Huawei Ascend NPU.
Содержание
Три числа для каждой модели чипаЧто видно на nodeКак округляется запрос памяти —trimMemoryПошаговый пример: 8 × 910B4, два pod на одной nodeЧто важно помнитьТри числа для каждой модели чипа
Раздел vnpus в ConfigMap hami-scheduler-device определяет для каждой модели чипа три вещи, которые нужны плагину и scheduler:
Например, запись по умолчанию для Ascend910B4 выглядит так:
Что видно на node
Для каждой физической карты плагин объявляет kubelet memoryAllocatable / smallestTemplateMemory «слотов». Каждый слот представляет один потенциальный срез на этой карте; фактический размер среза определяется позже, во время scheduling, по запрошенной памяти.
Пример — node с 8 × Ascend 910B4 (по 32 GiB каждая), использующий конфигурацию по умолчанию выше:
-
Самый маленький шаблон —
vir05_1c_8g(8 GiB), поэтому каждая карта предоставляет32768 / 8192 = 4слота. -
status.allocatablenode содержит только количество слотов:
Связанный ресурс huawei.com/Ascend910B4-memory не является расширенным ресурсом kubelet и не отображается на node. Вместо этого плагин публикует UUID каждой карты, общий объем памяти и aiCore в аннотации hami.io/node-register-Ascend910B4; hami-scheduler читает эту аннотацию, чтобы вести бюджет памяти для каждой карты отдельно. Pod одновременно потребляет один слот из status.allocatable и часть бюджета памяти, отслеживаемого scheduler.
Посмотреть представление со стороны scheduler можно так:
Как округляется запрос памяти — trimMemory
Когда pod допускается к запуску, HAMi webhook проходит по шаблонам от меньшего к большему и выбирает первый шаблон, у которого memory ≥ запрошенной памяти. Этот шаблон определяет, сколько памяти и сколько aiCore фактически использует срез.
Затем webhook переписывает запрос huawei.com/Ascend910B4-memory в pod до округленного значения, поэтому после admission в pod spec вы видите размер среза, а не исходно запрошенное значение.
Пошаговый пример: 8 × 910B4, два pod на одной node
Начальное состояние — каждая карта пуста: свободно 32 GiB, свободно 20 aiCore.
Третий pod, запрашивающий 1 GiB (округляется до 8 GiB / 5 aiCore), как раз поместился бы на карту #0 и заполнил бы ее; четвертый заставил бы scheduler перейти на карту #1. При gpuSchedulerPolicy=spread каждый новый срез, наоборот, начинал бы с новой карты.
Когда контейнеры, привязанные к срезу, запускаются, Ascend Docker Runtime видит переменные окружения, которые внедряет плагин:
и запрашивает у прошивки создание фактического vNPU. Когда pod завершается и vNPU переходит в idle, периодическая очистка плагина (CleanupIdleVNPUs) удаляет его на следующем тике, чтобы слот можно было использовать повторно.
Что важно помнить
- Дробных шаблонов нет. Запрос 2 GiB на чипе, у которого самый маленький шаблон — 8 GiB, все равно потребляет 8 GiB и 5 aiCore. Подбирайте chip / набор шаблонов под типичную нагрузку.
- Нарезка работает только внутри одной карты.
huawei.com/Ascend910B4 > 1интерпретируется как «мне нужно N полных карт» — webhook отклоняет запросы, которые сочетают count > 1 с запросом памяти меньшеmemoryAllocatable. - ConfigMap — источник истины. Если у ваших карт нестандартный размер памяти или вам нужны другие формы шаблонов, отредактируйте запись
vnpusдля этого chip вhami-scheduler-deviceи перезапустите podhami-ascend-device-plugin. Изменения будут потеряны при следующем обновлении chart.