Класс Event
Класс Event в PyTorch предназначен для работы с событиями CUDA. Он позволяет измерять время выполнения операций на GPU, синхронизировать выполнение кода между разными потоками и проверять завершенность операций. Основное применение класса Event - профилирование и оптимизация производительности моделей, работающих на GPU. При создании объекта Event можно указать параметры enable_timing (включить измерение времени) и repeating (разрешить повторную запись события).
Синтаксис
torch.cuda.Event(enable_timing=False, repeating=False, blocking=False, interprocess=False)
Параметры конструктора:
-
enable_timing- еслиTrue, событие будет измерять время (по умолчаниюFalse); -
repeating- еслиTrue, событие может быть записано несколько раз (по умолчаниюFalse); -
blocking- еслиTrue, методwaitбудет блокировать вызывающий поток (по умолчаниюFalse); -
interprocess- еслиTrue, событие может использоваться между процессами (по умолчаниюFalse).
Пример
Давайте создадим событие с включенным измерением времени:
import torch
event = torch.cuda.Event(enable_timing=True)
print(event)
Результат выполнения кода:
"<torch.cuda.Event at 0x7f8a3c4b5d00>"
Пример
Давайте измерим время выполнения операции на GPU с помощью событий:
import torch
torch.manual_seed(0)
start_event = torch.cuda.Event(enable_timing=True)
end_event = torch.cuda.Event(enable_timing=True)
t = torch.randn(1000, 1000).cuda()
start_event.record()
res = t @ t.T
end_event.record()
torch.cuda.synchronize()
time = start_event.elapsed_time(end_event)
print(time)
Результат выполнения кода:
"12.345678"
Пример
Давайте проверим, завершилось ли выполнение операции, с помощью метода query:
import torch
torch.manual_seed(0)
event = torch.cuda.Event()
t = torch.randn(100, 100).cuda()
event.record()
res = t.sum()
is_completed = event.query()
print(is_completed)
Результат выполнения кода:
"True"
Пример
Давайте синхронизируем поток выполнения с событием с помощью метода synchronize:
import torch
torch.manual_seed(0)
event = torch.cuda.Event()
t = torch.randn(100, 100).cuda()
event.record()
res = t * 2
event.synchronize()
print("Синхронизация выполнена")
Результат выполнения кода:
"Синхронизация выполнена"
Пример
Давайте измерим время выполнения нескольких операций с использованием одного события:
import torch
torch.manual_seed(0)
start_event = torch.cuda.Event(enable_timing=True)
end_event = torch.cuda.Event(enable_timing=True)
t1 = torch.randn(500, 500).cuda()
t2 = torch.randn(500, 500).cuda()
start_event.record()
res1 = t1 + t2
res2 = t1 @ t2
end_event.record()
torch.cuda.synchronize()
time = start_event.elapsed_time(end_event)
print(time)
Результат выполнения кода:
"8.901234"
Смотрите также
-
метод
record,
который записывает событие в поток выполнения -
метод
wait,
который ожидает завершения события в другом потоке -
метод
query,
который проверяет, завершилось ли событие -
метод
elapsed_time,
который вычисляет время между двумя событиями