适用于大规模部署的功能¶
本说明讨论了几个可能有用的扩展点和技巧 在较大的系统中运行 PyTorch 或使用 PyTorch 中的实例。
它不涵盖将模型部署到生产环境的主题。check 或相应的教程之一。
该说明假定您从 组织或能够静态链接要加载的其他代码 当使用 PyTorch 时。因此,许多钩子都作为 C++ API 公开,这些 API 可以在集中位置触发一次,例如在静态初始化中 法典。
整个队列的操作员分析¶
PyTorch 具有能够测量时间的功能
由个体操作员按需拍摄。可以使用相同的机制来执行
“always ON” 测量,适用于运行 PyTorch 的任何进程。它可能对
收集有关在给定进程中运行的 PyTorch 工作负载的信息,或者
跨整套机器。
任何运算符调用的新回调都可以使用 添加。Hook 将使用描述调用的结构体调用
context (例如 name)。如果启用,则包含参数
的函数表示为 variant 类型。请注意,输入
日志记录相对昂贵,因此必须显式启用。torch::addGlobalCallback
torch::RecordFunction
RecordFunction::inputs()
torch::IValue
运算符回调还可以访问 interface,该接口返回指向保存调试信息的结构的指针。
此调试信息可以通过使用 object 提前设置。
调试信息通过向前(包括异步任务)和向后传递传播,可用于传递一些额外信息
关于执行环境(例如模型 ID)的
application down 到 operator callback。c10::ThreadLocalDebugInfo::get()
at::DebugInfoGuard
fork
调用回调会增加一些开销,因此通常随机调用会很有用
示例运算符调用。这可以通过
传入 的可选采样率。torch::addGlobalCallback
请注意,这不是线程安全的,只有在没有
PyTorch 运算符正在运行。通常,最好在
初始化。addGlobalCallback
下面是一个示例:
// Called somewhere in the program beginning
void init() {
// Sample one in a hundred operator runs randomly
addGlobalCallback(
RecordFunctionCallback(
&onFunctionEnter,
&onFunctionExit)
.needsInputs(true)
.samplingProb(0.01)
);
// Note, to enable observers in the model calling thread,
// call enableRecordFunction() in the thread before running a model
}
void onFunctionEnter(const RecordFunction& fn) {
std::cerr << "Before function " << fn.name()
<< " with " << fn.inputs().size() << " inputs" << std::endl;
}
void onFunctionExit(const RecordFunction& fn) {
std::cerr << "After function " << fn.name();
}
API 使用情况日志记录¶
在更广泛的生态系统中运行时,例如在 Managed Job Scheduler 中,它是 通常用于跟踪哪些二进制文件调用特定的 PyTorch API。那里 在几个重要的 API 点注入了简单的插桩,这些 触发给定的回调。因为通常 PyTorch 是在一次性的 python 中调用的 脚本,则对于每个 API 的给定进程,回调仅触发一次。
c10::SetAPIUsageHandler
可用于注册 API 使用情况检测
处理器。传递的参数将是一个 “api key” 标识使用点,因为
PyTorch 扩展导入的示例,或者如果触发了 TorchScript 编译。python.import
torch.script.compile
SetAPIUsageLogger([](const std::string& event_name) {
std::cerr << "API was used: " << event_name << std::endl;
});
开发人员请注意:可以使用 C++ 或 Python 在代码中添加新的 API 触发点。C10_LOG_API_USAGE_ONCE("my_api")
torch._C._log_api_usage_once("my.api")
将元数据附加到保存的 TorchScript 模型¶
TorchScript 模块可以保存为捆绑序列化的存档文件
parameters 和模块代码作为 TorchScript (请参阅 )。它
通常可以方便地将附加信息与模型捆绑在一起,以便
示例,模型生成器或辅助构件的描述。
可以通过将参数传递给 and to store 和 retrieve 来实现
保存过程中的任意二进制 blob。由于 TorchScript 文件是
常规 ZIP 存档,额外信息将作为常规文件存储在其中
archive 的目录中。
_extra_files
torch::jit::load
extra/
还有一个全局钩子,允许将额外的文件附加到任何 TorchScript 当前进程中生成的存档。使用 创建器元数据,类似于数码相机生成的 JPEG 元数据。例 用法可能如下所示:
SetExportModuleExtraFilesHook([](const Module&) {
ExtraFilesMap files;
files["producer_info.json"] = "{\"user\": \"" + getenv("USER") + "\"}";
return files;
});
构建环境注意事项¶
TorchScript 的编译需要能够访问原始 python 文件,如
它使用 Python 的调用。在某些生产环境中
它可能需要显式部署 files 以及 precompiled 。inspect.getsource
.py
.pyc