torch.futures
Этот пакет предоставляет тип Future, который инкапсулирует асинхронное выполнение и набор служебных функций для упрощения операций над объектами Future. В настоящее время тип Future используется преимущественно в Фреймворке распределённого RPC.
-
class torch.futures.Future(*, devices=None) -
Обёртка вокруг
torch._C.Future, которая инкапсулирует асинхронное выполнение вызываемого объекта, например,rpc_async(). Она также предоставляет набор API для добавления функций обратного вызова и установки результатов.Предупреждение
Поддержка GPU — это бета-функция, и она может быть изменена.
-
add_done_callback(callback)[source] -
Добавить заданную функцию обратного вызова в этот
Future, которая будет выполнена, когдаFutureбудет завершена. Несколько обратных вызовов могут быть добавлены к одномуFuture, но порядок их выполнения гарантировать нельзя. Функция обратного вызова должна принимать один аргумент — ссылку на этотFuture. Функция обратного вызова может использовать методvalue()для получения значения. Обратите внимание, что если этотFutureуже завершен, заданный обратный вызов будет выполнен немедленно.Рекомендуется использовать метод
then(), так как он обеспечивает синхронизацию после завершения вашего обратного вызова.add_done_callbackможет быть дешевле, если ваш обратный вызов ничего не возвращает. Но какthen(), так иadd_done_callbackиспользуют один и тот же API регистрации обратных вызовов под капотом.Что касается тензоров на GPU, этот метод ведет себя так же, как
then().- Параметры
-
callback (
Future) – функция обратного вызова, которая принимает один аргумент — ссылку на этотFuture.
Примечание
Обратите внимание, что если функция обратного вызова вызывает исключение, будь то из-за завершения исходного будущего с исключением и вызова
fut.wait(), или из-за другого кода в обратном вызове, обработка ошибок должна быть тщательно продумана. Например, если этот обратный вызов позже завершает дополнительные фьючеры, эти фьючеры не помечаются как завершенные с ошибкой, и пользователь отвечает за самостоятельную обработку завершения/ожидания этих фьючеров.- Пример::
-
>>> def callback(fut): ... print("This will run after the future has finished.") ... print(fut.wait()) >>> fut = torch.futures.Future() >>> fut.add_done_callback(callback) >>> fut.set_result(5) This will run after the future has finished. 5
-
done()[source] -
Возвращает
True, если этотFutureзавершен. Фьючер считается завершенным, если у него есть результат или исключение.Если значение содержит тензоры, находящиеся на GPU,
Future.done()вернётTrue, даже если асинхронные ядра, заполняющие эти тензоры, ещё не завершили выполнение на устройстве, потому что на этом этапе результат уже доступен при условии выполнения соответствующей синхронизации (см.wait()).- Тип возвращаемого значения
-
set_exception(result)[source] -
Установить исключение для этого
Future, что пометит этотFutureкак завершённый с ошибкой и запустит все присоединённые обратные вызовы. Обратите внимание, что при вызове wait()/value() для этогоFuture, здесь установленное исключение будет поднято немедленно.- Параметры
-
result (BaseException) – исключение для этого
Future.
- Пример::
-
>>> fut = torch.futures.Future() >>> fut.set_exception(ValueError("foo")) >>> fut.wait() Traceback (most recent call last): ... ValueError: foo
-
set_result(result)[source] -
Установить результат для этого
Future, что пометит этотFutureкак завершённый и запустит все присоединённые обратные вызовы. Обратите внимание, чтоFutureне может быть помечен как завершённый дважды.Если результат содержит тензоры, находящиеся на GPU, этот метод может быть вызван даже если асинхронные ядра, заполняющие эти тензоры, ещё не завершили выполнение на устройстве, при условии, что потоки, в которых были запущены эти ядра, установлены как текущие, когда вызывается этот метод. Проще говоря, вызвать этот метод сразу после запуска этих ядер безопасно, без дополнительной синхронизации, пока не изменяются потоки между вызовами. Этот метод запишет события во всех соответствующих текущих потоках и использует их для обеспечения надлежащего планирования для всех потребителей этого
Future.- Параметры
-
result (object) – объект результата этого
Future.
- Пример::
-
>>> import threading >>> import time >>> def slow_set_future(fut, value): ... time.sleep(0.5) ... fut.set_result(value) >>> fut = torch.futures.Future() >>> t = threading.Thread( ... target=slow_set_future, ... args=(fut, torch.ones(2) * 3) ... ) >>> t.start() >>> print(fut.wait()) tensor([3., 3.]) >>> t.join()
-
then(callback)[source] -
Добавить заданную функцию обратного вызова в этот
Future, которая будет запущена, когдаFutureзавершится. Несколько обратных вызовов могут быть добавлены к одномуFuture, но порядок их выполнения гарантировать нельзя (чтобы принудительно установить определённый порядок, рассмотрите цепочку:fut.then(cb1).then(cb2)). Функция обратного вызова должна принимать один аргумент — ссылку на этотFuture. Функция обратного вызова может использовать методvalue()для получения значения. Обратите внимание, что если этотFutureуже завершен, заданный обратный вызов будет запущен немедленно.Если значение фьючера содержит тензоры, находящиеся на GPU, обратный вызов может быть вызван, пока асинхронные ядра, заполняющие эти тензоры, ещё не завершили выполнение на устройстве. Однако обратный вызов будет вызван с некоторыми специальными потоками, установленными как текущие (полученные из глобального пула), которые будут синхронизированы с этими ядрами. Таким образом, любая операция, выполняемая обратным вызовом над этими тензорами, будет запланирована на устройстве после завершения ядер. Другими словами, пока обратный вызов не переключает потоки, он может безопасно манипулировать результатом без дополнительной синхронизации. Это аналогично поведению без блокировки
wait().Аналогично, если обратный вызов возвращает значение, содержащее тензоры, находящиеся на GPU, он может сделать это, даже если ядра, производящие эти тензоры, ещё работают на устройстве, пока обратный вызов не изменил потоки во время своего выполнения. Если требуется изменение потоков, необходимо с осторожностью пересинхронизировать их с исходными потоками, то есть с теми, которые были текущими при вызове обратного вызова.
- Параметры
-
callback (
Callable) – функция обратного вызова, которая принимает в качестве единственного аргумента этотFuture. - Возвращает
-
Новый объект
Future, который содержит возвращаемое значениеcallbackи будет помечен как завершенный, когда заданныйcallbackзавершится. - Тип возвращаемого значения
-
Future[S]
Примечание
Обратите внимание, что если функция обратного вызова вызывает исключение, будь то из-за завершения исходного будущего с исключением и вызова
fut.wait(), или из-за другого кода в обратном вызове, будущее, возвращённоеthen, будет соответствующим образом помечено с возникшей ошибкой. Однако, если этот обратный вызов позже завершает дополнительные фьючеры, эти фьючеры не помечаются как завершенные с ошибкой, и пользователь отвечает за самостоятельную обработку завершения/ожидания этих фьючеров.- Пример::
-
>>> def callback(fut): ... print(f"RPC return value is {fut.wait()}.") >>> fut = torch.futures.Future() >>> # The inserted callback will print the return value when >>> # receiving the response from "worker1" >>> cb_fut = fut.then(callback) >>> chain_cb_fut = cb_fut.then( ... lambda x : print(f"Chained cb done. {x.wait()}") ... ) >>> fut.set_result(5) RPC return value is 5. Chained cb done. None
-
value()[source] -
Получить значение уже завершённого будущего.
Этот метод следует вызывать только после завершения вызова
wait()или внутри функции обратного вызова, переданной вthen(). В других случаях у этогоFutureможет ещё не быть значения, и вызовvalue()может завершиться неудачно.Если значение содержит тензоры, находящиеся на GPU, этот метод не выполнит дополнительной синхронизации. Это необходимо сделать предварительно отдельно, посредством вызова
wait()(за исключением обратных вызовов, для которых этим уже занимаетсяthen()).- Возвращает
-
Значение, хранящееся в этом
Future. Если функция (обратный вызов или RPC), создающая значение, выбросила ошибку, этот методvalue()также выбросит ошибку. - Тип возвращаемого значения
-
T
-
-
wait()[source] -
Ожидание, пока значение этого
Futureбудет готово.Если значение содержит тензоры, расположенные на GPU, то выполняется дополнительная синхронизация с ядрами (выполняемыми на устройстве), которые могут асинхронно заполнять эти тензоры. Такая синхронизация неблокирующая, что означает, что
wait()вставит необходимые инструкции в текущие потоки, чтобы гарантировать, что дальнейшие операции, помещённые в эти потоки, будут правильно запланированы после асинхронных ядер, но, как только это будет сделано,wait()вернётся, даже если эти ядра всё ещё работают. Дальнейшая синхронизация не требуется при обращении к значениям и использовании их, пока не меняются потоки.- Возвращает
-
Значение, хранящееся в этом
Future. Если функция (обработчик или RPC), создающая значение, выбросила ошибку, этот методwaitтакже выбросит ошибку. - Тип возвращаемого значения
-
T
-
-
torch.futures.collect_all(futures)[source] -
Собирает предоставленные объекты
Futureв один объединённый объектFuture, который завершается, когда все подзадачи завершены.- Параметры
- Возвращает
-
Возвращает объект
Futureсо списком переданных объектов Futures. - Тип возвращаемого значения
- Пример::
-
>>> fut0 = torch.futures.Future() >>> fut1 = torch.futures.Future() >>> fut = torch.futures.collect_all([fut0, fut1]) >>> fut0.set_result(0) >>> fut1.set_result(1) >>> fut_list = fut.wait() >>> print(f"fut0 result = {fut_list[0].wait()}") fut0 result = 0 >>> print(f"fut1 result = {fut_list[1].wait()}") fut1 result = 1
-
torch.futures.wait_all(futures)[source] -
Ожидает завершения всех предоставленных задач и возвращает список завершённых значений. Если какая-либо из задач столкнётся с ошибкой, метод завершится преждевременно и сообщит об ошибке, не дожидаясь завершения других задач.
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/futures.html