mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08:00
Add RRef Python Helper to launch function on the referenced object (#36619)
Summary: Pull Request resolved: https://github.com/pytorch/pytorch/pull/36619 With this PR, applications no longer need to create dedicated helpers to run functions on the object referenced by an RRef. Instead, `rref.rpc_sync().some_func()` will use `rpc_sync` to run `some_func` on the owner of the RRef using the object referenced by the RRef. Similar helpers for `rref.rpc_async().some_func()` and `rref.remote().some_func()` are also added. An alternative design is to expose PyRRef as RRefBase and then implement everything in a new Python RRef class. However, the RRef class cannot directly inherit from PyRRef/RRefBase, otherwise we will need to let pyRemote* C++ functions to load RRef from Python and return an RRef instance. It is possible to let RRef hold a instance of PyRRef instead of inherit from it, but this does not look like a elegant design, as we will have RRef holding PyRRef and PyRRef holding the C++ RRef. Another alternative is to use dynamic method loading, by installing member methods to PyRRef instances. However, this would require different solutions to handle RRef(data) and rpc.remote(...). Base on the above thinking, we decided to go with the current implementation for simplicity and we can also keep all RRef-related APIs in one place. Test Plan: Imported from OSS Differential Revision: D21028333 Pulled By: mrshenli fbshipit-source-id: fe90f56ef7183d18874e357900093755e1601eb4
This commit is contained in:
committed by
Facebook GitHub Bot
parent
b982a6a247
commit
5c2b273089
@ -189,6 +189,28 @@ std::string PyRRef::str() const {
|
||||
}
|
||||
}
|
||||
|
||||
py::object PyRRef::createRRefProxy(PyRRef& self, const RRefProxyType& type)
|
||||
const {
|
||||
auto& pythonRpcHandler = PythonRpcHandler::getInstance();
|
||||
pybind11::gil_scoped_acquire ag;
|
||||
auto& functions = pythonRpcHandler.getRRefProxyFunctions();
|
||||
auto& ctor = functions.rrefProxyCtor_;
|
||||
switch (type) {
|
||||
case RRefProxyType::RPC_SYNC: {
|
||||
return ctor(self, functions.rpcSync_);
|
||||
}
|
||||
case RRefProxyType::RPC_ASYNC: {
|
||||
return ctor(self, functions.rpcAsync_);
|
||||
}
|
||||
case RRefProxyType::REMOTE: {
|
||||
return ctor(self, functions.remote_);
|
||||
}
|
||||
default: {
|
||||
TORCH_INTERNAL_ASSERT(false, "Unrecognized RRefProxy type ", type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
py::tuple PyRRef::pickle() const {
|
||||
auto& ctx = RRefContext::getInstance();
|
||||
auto rrefForkData = ctx.prepareChildFork(rref_);
|
||||
|
Reference in New Issue
Block a user