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) – функцияCallable, которая принимает один аргумент — ссылку на этотFuture.
Примечание
Обратите внимание, что если функция обратного вызова генерирует исключение, либо из-за завершения исходного будущего с исключением и вызова
fut.wait(), либо из-за других действий в коде обратного вызова, обработка ошибок должна быть тщательно продумана. Например, если этот обратный вызов в дальнейшем завершает дополнительные будущие задачи, эти будущие задачи не отмечаются как завершённые с ошибкой, и пользователь несет ответственность за самостоятельную обработку завершения/ожидания этих будущих задач.- Пример::
-
>>> def callback(fut): ... print(f"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завершен.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уже завершён, заданный обратный вызов будет выполнен немедленно.Если значение
Futureсодержит тензоры, находящиеся на GPU, обратный вызов может быть вызван, пока асинхронные ядра, заполняющие эти тензоры, ещё не завершили выполнение на устройстве. Однако обратный вызов будет вызван с некоторыми специально выделенными потоками, установленными как текущие (полученные из глобального пула), которые будут синхронизированы с этими ядрами. Поэтому любые операции, выполняемые обратным вызовом с этими тензорами, будут запланированы на устройстве после завершения ядер. Другими словами, до тех пор, пока обратный вызов не переключится на другие потоки, он может безопасно манипулировать результатом без дополнительной синхронизации. Это аналогично неблокирующему поведениюwait().Аналогично, если обратный вызов возвращает значение, содержащее тензоры, находящиеся на GPU, он может сделать это, даже если ядра, производящие эти тензоры, ещё работают на устройстве, до тех пор, пока обратный вызов не переключил потоки во время своего выполнения. Если требуется изменение потоков, следует позаботиться о повторной синхронизации их с исходными потоками, то есть теми, которые были текущими, когда был вызван обратный вызов.
- Параметры:
-
callback (
Callable) – функция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()может завершиться ошибкой.Если значение содержит тензоры, находящиеся на устройствах с графическими процессорами, то этот метод не выполнит дополнительную синхронизацию. Это следует сделать предварительно, отдельно, посредством вызова
wait()(за исключением обратных вызовов, для которых это уже выполняетсяthen()).- Возвращает:
-
Значение, хранящееся в этом
Future. Если функция (обратный вызов или RPC), создающая значение, выбросила ошибку, то этот методvalue()также выбросит ошибку. - Тип возвращаемого значения:
-
T
-
wait()[source] -
Ожидание, пока значение этого
Futureбудет готово.Если значение содержит тензоры, находящиеся на устройствах с графическими процессорами, то выполняется дополнительная синхронизация с ядрами (выполняющимися на устройстве), которые могут асинхронно заполнять эти тензоры. Такая синхронизация неблокирующая, что означает, что
wait()вставит необходимые инструкции в текущие потоки, чтобы гарантировать, что дальнейшие операции, запущенные в этих потоках, будут правильно запланированы после асинхронных ядер, но, как только это будет сделано,wait()вернётся, даже если эти ядра всё ещё работают. Дальнейшая синхронизация не требуется при доступе к значениям и их использовании, пока не изменяются потоки.- Возвращает:
-
Значение, хранящееся в этом
Future. Если функция (обратный вызов или RPC), создающая значение, выбросила ошибку, то этот методwaitтакже выбросит ошибку. - Тип возвращаемого значения:
-
T
-
-
torch.futures.collect_all(futures)[source] -
Сборка предоставленных объектов
Futureв единый объединённый объектFuture, который завершается, когда все под-будущие завершены.- Параметры:
- Возвращает:
-
Возвращает объект
Futureсо списком переданных объектов Future. - Тип возвращаемого значения:
- Пример::
-
>>> 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/1.13/futures.html