4.1.1. 内存管理
模型编译和推理时设定每个主机和设备都有自己独立的内存空间。模型编译运行在主机端,而模型推理计算运行在设备端。主机端代指CPU及其内存,设备端代指后摩M50 IPU核及其内存。
使用TCIM接口编译和推理模型,用户无需关心内存管理,TCIM内部会完成主机和设备侧内存的管理。对于进阶用户,TCIM 提供C++接口管理主机侧内存,再通过 tcim::Tensor::CreateHostTensor 在主机端创建模型输入输出tensor。
4.1.2. 设备管理
模型推理默认在逻辑ID为0的后摩设备上执行。TCIM提供C++和Python API来管理当前进程或线程中用于推理的后摩设备。
每颗后摩M50 芯片都会映射为一个带有唯一 ID 的逻辑设备,当 M50 产品包含多颗芯片时,表示有多个逻辑设备可用于模型的并行部署和推理。
4.1.2.1. 指定设备
用户可通过 Option 类指定使用的单个后摩设备:
C++:
Module::OptionPython:
tcim_lite.runtime.Option
下面示例展示如何设置使用逻辑ID为1的后摩设备上推理模型。
C++示例如下:
// Set to use logical device 1 for model inference
tcim::Module::Option option(1);
// Load model
auto module = tcim::Module::LoadFromFile(model_path, option);
Python示例如下:
import tcim_lite as tcim
# Set to use logical device 1 for model inference
option = tcim.runtime.Option(1)
# Load model
module = tcim.runtime.load(model_path, option = option)
对于单个模型部署在多个后摩设备上,需调用 tcim::DevManager(C++)或 tcim_lite.runtime.DevManager(Python)指定要使用的所有后摩逻辑设备 ID。详情参看 单模型多设备部署。
对于大语言模型或一个模型多个实例,可在创建共享权重时,调用 tcim::Module::WeightManager::CreateWeightManager(C++)、tcim_lite.runtime.WeightManager(Python)设置共享存放权重的设备和模型推理使用的设备。示例参看 模型权重复用。
有关API详情,参看《后摩大道® M50 TCIM开发者手册》。
4.1.3. Stream管理
应用程序通过stream来管理所有的并发操作。同一个stream中的命令按下发顺序执行,可以由不同的主机线程发出。不同的stream以无序或并发的方式执行,因此不能保证stream能够按照顺序完成。在一个stream上发出的命令需要满足所有依赖关系后才能执行,这些依赖关系可能是同一个stream上先前启动的命令,也可能是其他stream上的依赖关系。显式同步能够保证stream中所有启动的命令已完成。如果不显示创建stream,模型内部会创建一个默认stream,用于模型推理。
由于每个 stream 可能会占用1个或多个 IPU 核,当 stream 中所有命令已执行完成,IPU 核资源不会被自动释放,因此其他 stream可能会因无可用的 IPU 核而不能执行。用户可在创建 tcim::Stream(C++)或 tcim_lite.runtime.Stream(Python) 对象时,通过 auto_yield 参数设置是否在stream的所有命令都完成后,自动释放IPU核资源。默认情况下,auto_yield 参数设置为 true,即自动释放IPU核资源。如果设置为 false,则需用户在所有命令完成后,手动调用 Stream.SyncYield(C++)或 tcim_lite_runtime.Stream.sync_yield(Python)释放IPU核资源。
模型推理支持单线程单stream、多模型多线程多stream和多模型多线程单stream场景。在单stream模式下,如果对多个模型推理,则所有模型必须设置相同的IPU核数。如果模型设置了不同的IPU核数,用户必须在前一个模型推理完成并调用 SyncYield(C++)或 sync_yield(Python)接口后,再调用接口推理下一个模型。如果在创建 Stream 对象时设置 auto_yield 参数为 true (即默认值),则需调用 Sync(C++)或 sync(Python)接口,无需调用yeild接口。
对于单模型推理,仅支持单线程单stream模式。对于多模型推理,支持多线程多stream和多线程单stream模式(仅支持单个后摩逻辑设备):
多线程单stream模式:多个模型共享同一个stream,且每次只有一个线程可以调用stream。由于线程安全问题,不建议使用多线程单stream模式。
多线程多stream模式:每个线程可以调用多个独立的stream,通过多个线程并行处理多个模型。
stream调用的主要流程如下:
创建stream。
设置模型推理使用的stream。
调用
Sync(C++)或sync(Python)同步stream。
下面为关键步骤示例代码,仅供参考,不可以直接拷贝运行:
C++示例:
#include "tcim/tcim_runtime.h"
// ...
// Load the model to be inferred
auto wm = tcim::Module::WeightManager::CreateWeightManager(0);
tcim::Module::Option option(wm);
auto module = tcim::Module::LoadFromFile(model_path, option);
// Create a stream and set to automatically release resources after completed
tcim::Stream stream(true);
// Set the stream to be used for inference
module.SetStream(&stream);
//...
// Synchinize the stream
stream.Sync()
// ...
Python示例:
import tcim_lite as tcim
# ...
# Load the model to be inferred
wm = tcim.runtime.WeightManager(0)
option = tcim.runtime.Option(wm)
module = tcim.runtime.load(model_path, option = option)
# Create a stream and set to the module
stream = tcim.runtime.Stream()
module.set_stream(stream)
#...
# Synchinize the stream
stream.sync()
#...