CUDAGraph
-
class torch.cuda.graphs.CUDAGraph(keep_graph=False)[исходный код] -
Обёртка вокруг графа CUDA.
- Параметры:
-
keep_graph (bool, необязательный) – Если
keep_graph=False, cudaGraphExec_t будет создан на GPU в концеcapture_end, а базовый cudaGraph_t будет уничтожен. Пользователи, которым нужно запросить или иным образом изменить базовый cudaGraph_t перед созданием экземпляра, могут задатьkeep_graph=Trueи получить к нему доступ черезraw_cuda_graphпослеcapture_end. Обратите внимание, что в этом случае cudaGraphExec_t не будет создан в концеcapture_end. Вместо этого он будет создан явным вызовомinstantiateили автоматически при первом вызовеreplay, если ранее не был вызванinstantiate. Рекомендуется вручную вызватьinstantiateдоreplay, чтобы избежать повышенной задержки при первом вызовеreplay. Разрешается изменять исходный cudaGraph_t после первого вызоваinstantiate, но пользователь должен вручную вызватьinstantiateещё раз, чтобы гарантировать, что созданный экземпляр графа будет содержать эти изменения. PyTorch не может отслеживать эти изменения. - Тип возвращаемого значения:
-
Self
Предупреждение
Этот API находится в бета-версии и может измениться в будущих выпусках.
-
capture_begin(pool=None, capture_error_mode='global', check_input_liveness=False)[исходный код] -
Начать захват операций CUDA в текущем потоке.
Обычно не следует вызывать
capture_beginсамостоятельно. Используйтеgraphилиmake_graphed_callables(), которые вызываютcapture_beginвнутри.- Параметры:
-
-
pool (необязательный) – Токен (возвращаемый
graph_pool_handle()илиother_Graph_instance.pool()) илиMemPool, указывающий, что этот граф может использовать общую память с указанным пулом. См. раздел Управление памятью графов. - capture_error_mode (str, необязательный) – задаёт cudaStreamCaptureMode для потока захвата графа. Может принимать значения “global”, “thread_local” или “relaxed”. Во время захвата графа CUDA некоторые действия, например cudaMalloc, могут быть небезопасны. Режим “global” приводит к ошибке при выполнении таких действий в других потоках, “thread_local” — только при выполнении таких действий в текущем потоке, а “relaxed” не вызывает ошибку при таких действиях. НЕ меняйте эту настройку, если вы не знакомы с cudaStreamCaptureMode
-
check_input_liveness (bool, необязательный) –
Если
True, отслеживает внешние тензорные входы во время захвата графа и вызывает ошибку, если какой-либо из них освобождается до повторного воспроизведения. Это помогает выявлять ошибки «использования после освобождения», когда входные тензоры удаляются сборщиком мусора между захватом и повторным воспроизведением. По умолчанию:False.Примечание
Пользовательские ядра CUDA, добавленные вне PyTorch (например, через cuLaunchKernel или DLPack), этим механизмом не отслеживаются.
-
pool (необязательный) – Токен (возвращаемый
-
capture_end()[исходный код] -
Завершить захват графа CUDA в текущем потоке.
После
capture_endдля этого экземпляра можно вызватьreplay.Обычно не следует вызывать
capture_endсамостоятельно. Используйтеgraphилиmake_graphed_callables(), которые вызываютcapture_endвнутри.
-
capture_end_post()[исходный код] -
Завершить захват, начатый с помощью
capture_end_pre(): уничтожить шаблон при вызовеkeep_graph=False(граф уже должен быть создан; это выполняютcapture_end()и менеджер контекста).
-
capture_end_pre()[исходный код] -
Завершить захват, но не финализировать его: оставить захваченный
cudaGraph_tактивным (в обоих режимахkeep_graph), чтобы его можно было проверить до того, какcapture_end_post()создаст экземпляр и/или уничтожит его.
-
debug_dump(debug_path, *, verbose=True)[исходный код] -
Сохранить захваченный граф в
debug_pathв формате Graphviz DOT.Шаблон графа должен быть активен:
keep_graph=True(илиenable_debug_mode()) либо вызов должен выполняться из обработчика завершения захвата. Требуется пакетcuda.bindings.- Параметры:
-
- debug_path (обязательный) – Путь для сохранения графа.
-
verbose (bool) – Если
True(значение по умолчанию), использовать наиболее подробный вывод DOT.
-
enable_debug_mode()[исходный код] -
Сохранять захваченный граф (эквивалентно
keep_graph=True), чтобы его можно было проверить, например, с помощьюdebug_dump(). Сохранено для обратной совместимости.
-
get_graph_data()[исходный код] -
Возвращает словарь с описанием топологии графа и метаданных его узлов.
Значение
keep_graphдолжно быть True. Перед вызовом этого метода граф должен быть создан (с помощьюinstantiate()). Требуется пакетcuda.bindings.Возвращает словарь со следующей структурой:
{ "exec_graph_id": int, "nodes": [ { "index": int, "node_type": str, "tools_id": int, "graph_id": int, "node_id": int, "kernel_name": str or None, "event_ptr": int, "host_fn_addr": int, "host_fn_name": str or None, "dependencies": [int, ...], "dependents": [int, ...], }, ..., ], }event_ptr— это дескрипторcudaEvent_t(в виде int), на который указывает узел записи события или с которого ожидает узел ожидания события: эти узлы не создают временную запись CUPTI, поэтому сопоставление ожидания с записью, которая его сигнализирует, — единственный способ определить закодированную им межпоточную синхронизацию. Для узлов других типов имеет значение0.host_fn_addr/host_fn_nameзаполняются для узлов хоста (обратный вызов CPU, выполняемый как узел графа): адрес обратного вызова и наиболее точное из доступных деманглированное имя символа для него (None, если ему не соответствует экспортируемый символ). Для узлов других типов имеют значение0/None.Значение
graph_idкаждого узла переназначается на идентификатор графа exec, чтобы значенияtools_idсовпадали со значениями, отображаемыми профилировщиками на основе CUPTI.dependenciesиdependents— это списки индексов узлов в спискеnodes.Эта структура полезна для анализа трассировки профилировщика и определения того, является ли конкретная зависимость, наблюдаемая в профиле, настоящей зависимостью (закодированной в графе) или ложной зависимостью, вызванной отображением независимых потоков на один и тот же аппаратный канал.
Дочерние графы и условные узлы отображаются как самостоятельные узлы, но этот обход не углубляется в их содержимое (это отдельные объекты
cudaGraph_t), поэтому операции внутри них отсутствуют вnodesи выводится предупреждение. При этом отображаемые идентификаторы остаются действительными: граф exec сохраняет идентификаторы узлов верхнего уровня.- Тип возвращаемого значения:
-
instantiate()[исходный код] -
Создать экземпляр графа CUDA. Вызывается методом
capture_end, еслиkeep_graph=False, либо методомreplay, еслиkeep_graph=Trueиinstantiateещё не был вызван явно. Не уничтожает cudaGraph_t, возвращаемый методомraw_cuda_graph.
-
pool()[исходный код] -
Возвращает непрозрачный токен, представляющий идентификатор пула памяти этого графа.
Этот идентификатор можно передать параметру
capture_beginдругого графа, указав, что другой граф может использовать тот же пул памяти.- Тип возвращаемого значения:
-
_POOL_HANDLE
-
pools()[исходный код] -
Возвращает непрозрачные токены для всех пулов памяти, сохраняемых этим графом.
- Тип возвращаемого значения:
-
list[_POOL_HANDLE]
-
raw_cuda_graph()[исходный код] -
Возвращает базовый cudaGraph_t. Шаблон должен быть активен: для этого требуется
keep_graph=True(он сохраняется послеcapture_end) либо доступ из обработчика завершения захвата (до уничтожения шаблона дляkeep_graph=False).Сведения об API для управления этим объектом см. в разделах Управление графами и привязки управления графами cuda-python
- Тип возвращаемого значения:
-
raw_cuda_graph_exec()[исходный код] -
Возвращает базовый cudaGraphExec_t. Если
keep_graphимеет значение True, должен быть вызванinstantiate; еслиkeep_graphимеет значение False, должен быть вызванcapture_end. Если вызватьinstantiate()послеraw_cuda_graph_exec(), ранее возвращённый cudaGraphExec_t будет уничтожен. Вы несёте ответственность за то, чтобы не использовать этот объект после уничтожения.Сведения об API для управления этим объектом см. в разделах Выполнение графов и привязки выполнения графов cuda-python
- Тип возвращаемого значения:
-
register_capture_end_hook(hook)[исходный код] -
Зарегистрировать
hook(graph)для выполнения после завершения захвата, но до финализации графа. ЗахваченныйcudaGraph_tактивен (доступен черезraw_cuda_graph()) в обоих режимахkeep_graph. Обработчики вызываются в порядке регистрации. Возвращает дескриптор, свойствоremove()которого отменяет регистрацию обработчика.- Тип возвращаемого значения:
-
RemovableHandle
-
register_capture_start_hook(hook)[исходный код] -
Зарегистрировать
hook(graph)для выполнения при начале захвата этого графа, сразу после начала захвата в текущем потоке. Обработчики вызываются в порядке регистрации. Возвращает дескриптор, свойствоremove()которого отменяет регистрацию обработчика.Предупреждение
Обработчик выполняется во время захвата: любые запущенные им операции CUDA захватываются в граф, а при режиме захвата по умолчанию
"global"небезопасный вызов вызывает ошибку. См.torch.cuda.graphs.register_graph_capture_start_hook().- Тип возвращаемого значения:
-
RemovableHandle
-
register_destroy_callback(cb, *, synchronize_before_release=False)[исходный код] -
Зарегистрировать
cb()для выполнения при уничтожении (финализации) этого графа или при явном вызовеreset(), непосредственно перед освобождением ресурсов CUDA. Обратные вызовы выполняются один раз за цикл захвата в порядке регистрации; исключения подавляются, чтобы сбой одного обратного вызова не прерывал выполнение остальных.cbНЕ должен ссылаться на этот граф: финализатор, запускающий его, хранится в глобальном реестре, поэтому обратный вызов, доступный через граф, сохраняет граф до завершения работы интерпретатора (граф никогда не собирается сборщиком мусора, а значит, обратный вызов никогда не выполняется). Возвращает дескриптор, свойствоremove()которого отменяет регистрацию обратного вызова.При очистке синхронизация CUDA не выполняется, а
cudaGraphExecDestroyосвобождает ресурсы графа, выполняющегося в данный момент, только асинхронно. Поэтому обратный вызов, освобождающий память устройства, которую граф читает или записывает, приводит к использованию после освобождения, если повторное воспроизведение ещё выполняется. Передайтеsynchronize_before_release=True, чтобы синхронизировать все потоки, в которых воспроизводился этот граф, до вызова обратного вызова. В противном случае обратные вызовы не должны освобождать объекты, на которые ссылается граф.- Тип возвращаемого значения:
-
RemovableHandle
-
register_post_instantiate_hook(hook)[исходный код] -
Зарегистрировать
hook(graph)для выполнения после каждого создания экземпляра (включая повторное создание, при котором создаётся новый граф exec). Созданный экземпляр графа доступен черезraw_cuda_graph_exec(). Обработчики вызываются в порядке регистрации. Возвращает дескриптор, свойствоremove()которого отменяет регистрацию обработчика.- Тип возвращаемого значения:
-
RemovableHandle
-
register_replay_end_hook(hook)[исходный код] -
Зарегистрировать
hook(graph)для выполнения в конце каждого вызоваreplay(), сразу после запуска графа. Запуск выполняется асинхронно, поэтому обработчик выполняется после того, как повторное воспроизведение поставлено в очередь, а не после завершения работы GPU. Обработчики вызываются в порядке регистрации. Возвращает дескриптор, свойствоremove()которого отменяет регистрацию обработчика. См. примечание о критическом пути дляregister_replay_start_hook().Обработчики завершения вызываются, даже если запуск приводит к ошибке, поэтому каждому обработчику начала соответствует обработчик завершения, после чего распространяется ошибка запуска. (Если обработчик начала вызывает ошибку, повторное воспроизведение прерывается до запуска, и обработчик завершения не вызывается.)
- Тип возвращаемого значения:
-
RemovableHandle
-
register_replay_start_hook(hook)[исходный код] -
Зарегистрировать
hook(graph)для выполнения в начале каждого вызоваreplay(), непосредственно перед запуском графа (после создания экземпляра по запросу, поэтомуraw_cuda_graph_exec()действителен). Обработчики вызываются в порядке регистрации. Возвращает дескриптор, свойствоremove()которого отменяет регистрацию обработчика.Примечание
Повторное воспроизведение — критический путь, и зарегистрированный обработчик выполняется при каждом повторном воспроизведении, поэтому он должен быть быстрым. Если обработчик не зарегистрирован, затраты ограничиваются одной проверкой словаря на пустоту.
- Тип возвращаемого значения:
-
RemovableHandle
-
replay()[исходный код] -
Повторно воспроизвести операции CUDA, захваченные этим графом.
-
reset()[исходный код] -
Удалить граф, хранящийся в этом экземпляре.
-
retain_object(obj, *, synchronize_before_release=False)[исходный код] -
Сохранять
objактивным в течение текущего цикла захвата этого графа и освободить его при уничтожении (финализации) графа или явном вызовеreset(). Обратный вызов не выполняется; обычный подсчёт ссылок удаляетobjпосле освобождения сохранённой ссылки. Возвращает дескриптор, свойствоremove()которого досрочно освобождает сохранённую ссылку. Как и в случае сregister_destroy_callback(),objНЕ должен ссылаться на этот граф, иначе граф будет сохраняться до завершения работы интерпретатора, аobjникогда не будет освобождён.synchronize_before_releaseимеет тот же смысл и те же ограничения, что и вregister_destroy_callback(): задайте его, если освобождениеobjосвобождает память устройства, которую граф читает или записывает (например, еслиobj— последняя ссылка на тензор, используемый графом), а повторное воспроизведение ещё может выполняться.- Тип возвращаемого значения:
-
RemovableHandle
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.cuda.graphs.CUDAGraph.html