趋近智
尽管专用编译器和运行时在为目标硬件优化特定模型或子图方面表现出色,但这些优化组件很少独立存在。它们必须平稳地融入到模型开发、训练和部署的更大体系中,通常涉及TensorFlow或PyTorch等高级框架。确保有效的互操作性是运行时系统设计的一个主要方面。这涉及在宿主框架和专用运行时之间定义清晰的控制传输、数据交换和资源管理接口。
主要目的是让开发者在其偏好的框架中工作时,能受益于运行时提供的优化执行,通常只需对现有代码进行极少改动。这需要弥合框架的高级、通常动态的执行模型与运行时更底层、可能静态优化的执行环境之间的差异。
框架通常提供多个专用运行时可使用的扩展点:
自定义操作 (Op): 这是一个常见方法。运行时将其功能(例如,执行编译后的子图)封装在自定义操作符定义中。该操作符在框架中注册(例如,使用TensorFlow中的tf.RegisterOp或PyTorch的C++/CUDA扩展机制)。从框架的角度来看,它只是计算图中的另一个节点或即时执行中的另一个函数调用。此自定义操作的实现涉及调用运行时的API来加载编译好的产物、准备输入、执行并获取输出。
后端/设备插件: 更复杂的框架提供集成替代计算后端或虚拟设备的机制。示例包括TensorFlow的PluggableDevice接口或PyTorch的分发器可扩展性(__torch_dispatch__,外部后端)。在此,运行时充当特定设备或计算后端的实现。框架会拦截指向此后端的操作,并将其转发到运行时对应的核函数实现。这使得集成程度可能比自定义操作更深,使运行时能够更直接地管理自己的设备内存和执行流。
JIT编译器集成: 框架通常包含自己的JIT编译器(例如XLA、TorchScript)。专用运行时可能作为框架JIT的后端。框架JIT执行初始图捕获和高级优化,然后将图的部分内容降级为专用运行时编译器可处理的中间表示。运行时随后处理这些特定子图的优化、代码生成和执行的最后阶段。
以下图表说明了这些交互点:
高级机器学习框架与专用运行时系统之间的交互点。控制和数据通过自定义操作符或后端插件等已定义接口流动。
重要考量包括:
memcpy、cudaMemcpyAsync)。dlpack,它提供了一种通用方式来描述张量元数据(形状、步长、数据类型、设备)并共享底层内存指针,即使在不同库之间也无需复制。float32、bfloat16、int8)并处理任何必要的转换,特别是在处理量化模型时,还需要传递比例因子和零点信息。框架通常驱动整体执行流程。调用运行时时:
Compute方法,一个后端函数)。此调用通常传递输入张量和任何必要的配置参数。cudaEventRecord、cudaStreamWaitEvent)来建立框架操作与运行时操作之间的依赖关系。运行时通常需要初始化并管理其自身状态和资源。
设计互操作性需要仔细考虑目标框架的扩展机制、数据处理约定和执行模型。良好定义的接口允许专用运行时接入这些框架,在不扰乱用户现有开发流程的情况下提供优化的性能。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造