Spec-Zone.ru › PyTorch 2.14

Привязка NUMA

Создано: 25 июля 2025 г. | Последнее обновление: 6 мая 2026 г.

В системах NUMA (неоднородный доступ к памяти) обращение к памяти на удалённых узлах NUMA приводит к дополнительной задержке. PyTorch предоставляет средства привязки NUMA, позволяющие повысить локальность памяти, привязывая рабочие процессы к процессорам рядом с назначенными им устройствами-ускорителями.

На практике привязка NUMA обычно повышает общую производительность на 1–10 %, однако для некоторых рабочих нагрузок прирост может быть гораздо значительнее или отсутствовать вовсе.

Чтобы включить привязку NUMA, используйте флаг --numa-binding с torchrun, например:

torchrun --numa-binding=node --nproc_per_node=8 train.py

Также можно передать NumaOptions в LaunchConfig при использовании elastic_launch.

Доступные режимы привязки см. в разделе AffinityMode.

class torch.numa.binding.AffinityMode(value) [исходный код]

Перечисление.

NODE = 'node'

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

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

SOCKET = 'socket'

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

Пример: Если в сокете 0 находятся устройство 3 и узлы NUMA 0–1, рабочий процесс с локальным рангом 3 будет привязан к процессорам узлов NUMA 0–1.

Если на каждом сокете в любом случае имеется только один узел NUMA, этот вариант эквивалентен NODE.

EXCLUSIVE = 'exclusive'

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

Пример: Если на узле NUMA 1 имеется 16 физических ядер и устройства 2 и 3, рабочий процесс с локальным рангом 2 будет привязан к ядрам 0–7, а рабочий процесс с локальным рангом 3 — к ядрам 8–15.

CORE_COMPLEX = 'core-complex'

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

Пример: Если на узле NUMA 1 есть два кластера ядер (ядра 0–7 используют общую кэш-память L3, а ядра 8–15 — другую) и устройства 2 и 3, рабочий процесс с локальным рангом 2 будет привязан к ядрам 0–7, а рабочий процесс с локальным рангом 3 — к ядрам 8–15.

class torch.numa.binding.NumaOptions(affinity_mode: torch.numa.binding.AffinityMode, should_fall_back_if_binding_fails: bool = False) [исходный код]
affinity_mode: AffinityMode
should_fall_back_if_binding_fails: bool = False

Если True, исключения, возникающие непосредственно при привязке NUMA, будут подавляться, а не вызывать ошибку.

Исключения не ожидаются, поэтому не используйте этот параметр без необходимости. Он предназначен исключительно для снижения риска сбоев при массовом развёртывании привязки NUMA.

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/elastic/numa.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API