tvm.rpc

轻量级TVM RPC模块。

RPC 能够连接到远程服务器,上传并启动函数。 这对于交叉编译和远程测试非常有用, 编译器堆栈运行在本地服务器上,而我们使用 RPC 服务器 在没有可用编译器的远程运行时环境中运行。

测试程序在本地服务器上编译程序,上传并运行远程RPC服务器,获取结果返回以验证正确性。

TVM RPC服务器默认用户是可信的,必须在可信网络环境和加密通道中使用。它允许向服务器写入任意文件,并为任何能访问此API的人提供完整的远程代码执行能力。

类:

服务器([host, port, port_end, is_proxy, ...])

在单独的进程中启动RPC服务器。

RPCSession(sess)

RPC客户端会话模块

LocalSession()

基于本地环境的RPCSession接口。

PopenSession(binary)

基于popen实现的RPCSession接口。

TrackerSession(addr)

追踪器客户端会话。

功能:

connect(url, port[, key, session_timeout, ...])

连接到RPC服务器

connect_tracker(url, port)

连接到RPC追踪器

with_minrpc(compile_func[, server, runtime])

附加带有minrpc相关选项的编译器函数。

class tvm.rpc.Server(host='0.0.0.0', port=9091, port_end=9199, is_proxy=False, tracker_addr=None, key='', load_library=None, custom_addr=None, silent=False, no_fork=False, server_init_callback=None, reuse_addr=True, timeout=None)

在单独的进程中启动RPC服务器。

这是一个基于多进程的简单Python实现。 也可以使用不依赖Python的TVM运行时来实现类似的基于C的服务器。

Parameters:
  • host (str) – 服务器的主机URL。

  • port (int) – 要绑定的端口号

  • port_end (int, optional) – 搜索的结束端口

  • is_proxy (bool, optional) – 指定地址是否为代理。如果为真,主机和端口实际上对应的是代理服务器的地址。

  • tracker_addr (Tuple (str, int) , optional) – RPC跟踪器的地址,格式为元组(主机名, 端口号)。 如果该参数不为None,服务器会向跟踪器注册自己。

  • key (str, optional) – 用于在追踪器中标识设备类型的键。

  • load_library (str, optional) – 执行期间要加载的附加库列表。

  • custom_addr (str, optional) – 要报告给RPC跟踪器的自定义IP地址

  • silent (bool, optional) – 是否以静默模式运行此服务器。

  • no_fork (bool, optional) – 是否禁止在multiprocessing中使用fork。

  • server_init_callback (Callable, optional) – 服务器启动时的额外初始化函数。

  • reuse_addr (bool, optional) – 允许内核重用处于TIME_WAIT状态的本地套接字。

  • timeout (float, optional) - 为套接字上的所有操作设置超时时间

注意

TVM RPC服务器默认用户是可信的,必须在可信网络环境和加密通道中使用。它允许向服务器写入任意文件,并为任何能访问此API的人提供完整的远程代码执行能力。

RPC服务器只能识别tvm命名空间中的函数。 如果要在服务器环境中添加额外的自定义函数,可以使用server_init_callback。

def server_init_callback():
    import tvm
    # must import mypackage here
    import mypackage

    tvm.register_func("function", mypackage.func)

server = rpc.Server(host, server_init_callback=server_init_callback)

方法:

terminate()

终止服务器进程

terminate()

终止服务器进程

tvm.rpc.connect(url, port, key='', session_timeout=0, session_constructor_args=None, enable_logging=False)

连接到RPC服务器

Parameters:
  • url (str) – 主机的url地址

  • port (int) – 要连接的端口号

  • key (str, optional) – 用于匹配服务器的附加密钥

  • session_timeout (float, optional) – 会话持续时间(秒),当持续时间超过该值时允许服务器终止连接。当持续时间为零时,表示请求必须始终保持活动状态。

  • session_constructor_args (List) - 传递给远程会话构造函数的额外参数列表。 列表的第一个元素始终是指定会话构造函数名称的字符串,后面的参数是该函数的位置参数。

  • enable_logging (boolean) - 用于启用/禁用日志记录的标志。默认情况下日志记录是禁用的。

Returns:

sess – 已连接的会话。

Return type:

RPCSession

示例

常规用法 .. code-block:: python

client = rpc.connect(server_url, server_port, server_key)

Session_constructor 可用于在远程自定义会话 以下代码通过代理连接到远程内部服务器 通过在代理机器上构建另一个 RPCClientSession 并使用该会话 作为代理端点的服务会话。

client_via_proxy = rpc.connect(
    proxy_server_url, proxy_server_port, proxy_server_key, enable_logging
    session_constructor_args=[
        "rpc.Connect", internal_url, internal_port, internal_key, internal_logging])
tvm.rpc.connect_tracker(url, port)

连接到RPC追踪器

Parameters:
  • url (str) – 主机的URL地址

  • port (int) – 要连接的端口号

Returns:

sess – 已连接的追踪器会话。

Return type:

TrackerSession

class tvm.rpc.RPCSession(sess)

RPC客户端会话模块

不要直接创建对象,请调用connect方法

方法:

system_lib()

获取系统范围内的库模块。

get_function(name)

从会话中获取函数。

device(dev_type[, dev_id])

构建一个远程设备。

upload(数据[, 目标])

上传文件到远程运行时临时文件夹

download(path)

从远程临时文件夹下载文件。

remove(path)

从远程临时文件夹中移除文件。

listdir(path)

从远程临时文件夹列出文件。

load_module(path)

加载远程模块,需要先上传文件。

download_linked_module(path)

链接远程模块并下载它。

cpu([dev_id])

构建CPU设备。

cuda([dev_id])

构建CUDA GPU设备。

cl([dev_id])

构建OpenCL设备。

vulkan([dev_id])

构建Vulkan设备。

metal([dev_id])

构建Metal设备。

rocm([dev_id])

构建ROCm设备。

ext_dev([dev_id])

构建扩展设备。

hexagon([dev_id])

构建Hexagon设备。

webgpu([dev_id])

构建WebGPU设备。

system_lib()

获取系统范围内的库模块。

Returns:

module – 系统范围的库模块。

Return type:

运行时模块

另请参阅

tvm.runtime.system_lib

get_function(name)

从会话中获取函数。

Parameters:

name (str) – 函数名称

Returns:

f – 结果函数。

Return type:

Function

device(dev_type, dev_id=0)

构建一个远程设备。

Parameters:
  • dev_type (intstr)

  • dev_id (int, 可选参数)

Returns:

dev – 对应的编码远程设备。

Return type:

设备

upload(data, target=None)

上传文件到远程运行时临时文件夹

Parameters:
  • data (strbytearray) - 要上传的本地文件名或二进制数据。

  • target (str, optional) – 远程路径

download(path)

从远程临时文件夹下载文件。

Parameters:

path (str) – 远程临时文件夹的相对路径。

Returns:

blob – 来自文件的结果二进制数据块。

Return type:

bytearray

remove(path)

从远程临时文件夹中移除文件。

Parameters:

path (str) – 远程临时文件夹的相对路径。

listdir(path)

从远程临时文件夹列出文件。

Parameters:

path (str) – 远程临时文件夹的相对路径。

Returns:

dirs – 给定目录中的文件,使用逗号','作为分隔符。

Return type:

str

load_module(path)

加载远程模块,需要先上传文件。

Parameters:

path (str) – 远程临时文件夹的相对路径。

Returns:

m – 包含远程函数的远程模块。

Return type:

模块

download_linked_module(path)

链接远程模块并下载它。

Parameters:

path (str) – 远程临时文件夹的相对路径。

Returns:

blob - 来自文件的结果二进制数据块。

Return type:

bytearray

注意

当本地客户端没有链接器时,此函数会很有帮助。

示例

mod = build_module_with_cross_compilation()
# export the module as tar because a local linker is not available
mod.export_library("lib.tar")
remote.upload("lib.tar")
# invoke the linker on the remote to link the module as a library
# note that the library can only run on the same env as the remote
with open("lib.so", "wb") as file:
    file.write(remote.download_linked_module("lib.tar"))
cpu(dev_id=0)

构建CPU设备。

cuda(dev_id=0)

构建CUDA GPU设备。

cl(dev_id=0)

构建OpenCL设备。

vulkan(dev_id=0)

构建Vulkan设备。

metal(dev_id=0)

构建Metal设备。

rocm(dev_id=0)

构建ROCm设备。

ext_dev(dev_id=0)

构建扩展设备。

hexagon(dev_id=0)

构建Hexagon设备。

webgpu(dev_id=0)

构建WebGPU设备。

class tvm.rpc.LocalSession

基于本地环境的RPCSession接口。

该类可用于实现需要同时在本地和远程运行的函数。

class tvm.rpc.PopenSession(binary)

基于popen实现的RPCSession接口。

Parameters:

binary (List[Union[str, bytes]]) – 要执行的二进制文件。

class tvm.rpc.TrackerSession(addr)

追踪器客户端会话。

Parameters:

addr (tuple) – 地址元组

方法:

close()

关闭追踪器连接。

summary()

获取追踪器的摘要字典。

text_summary()

获取跟踪器的文本摘要。

request(key[, priority, session_timeout, ...])

向追踪器请求一个新的连接。

request_and_run(key, func[, priority, ...])

从追踪器请求资源并运行该函数。

close()

关闭追踪器连接。

summary()

获取跟踪器的摘要字典。

text_summary()

获取跟踪器的文本摘要。

request(key, priority=1, session_timeout=0, max_retry=5, session_constructor_args=None)

向追踪器请求一个新的连接。

Parameters:
  • key (str) – 设备的类型键。

  • priority (int, optional) – 请求的优先级。

  • session_timeout (float, optional) – 会话持续时间,允许服务器在持续时间超过此值时终止连接。当持续时间为零时,表示请求必须始终保持活动状态。

  • max_retry (int, optional) – 放弃前最大重试次数。

  • session_constructor_args (list, optional) – 传递给远程会话构造函数的额外参数列表。 列表的第一个元素始终是指定会话构造函数名称的字符串,后续参数是该函数的位置参数。

request_and_run(key, func, priority=1, session_timeout=0, max_retry=2)

从追踪器请求资源并运行该函数。

该函数用于在执行过程中防止罕见的服务器节点意外退出。 在这种情况下,系统将请求新的资源并重新运行该函数。

Parameters:
  • key (str) – 设备的类型键。

  • func (function of session -> value) – 一个无状态函数

  • priority (int, optional) – 请求的优先级。

  • session_timeout (float, optional) – 会话持续时间,允许服务器在持续时间超过此值时终止连接。当持续时间为零时,表示请求必须始终保持活动状态。

  • max_retry (int, optional) – 在放弃前重试该函数的最大次数。

tvm.rpc.with_minrpc(compile_func, server='posix_popen_server', runtime='libtvm')

附加带有minrpc相关选项的编译器函数。

Parameters:
  • compile_func (Union[str, Callable[[str, str, Optional[str]], None]]) – 需要装饰的编译函数。

  • server (str) – 服务器类型。

  • runtime (str) – 运行时库。

Returns:

fcompile – 返回编译结果。

Return type:

函数