对于大规模部署的特点

  • 舰队宽操作者剖析

  • API使用记录

  • 将元数据附加到保存TorchScript模型

  • 构建环境的考虑

  • 普通的扩展点

本说明有关一个更大的系统内运行PyTorch或操作在一个更大的组织使用PyTorch多个系统时可能有用的几个扩展点和技巧讲座。

它不包括生产部署模型的主题。检查 torch.jit或相应的教程。

该说明假定您无论是从源组织中的建PyTorch或有静态链接用于PyTorch时加载额外的代码的能力。因此,许多钩的公开为C ++的API,可以一次在一个集中的地方来触发,例如在静态初始化代码。

舰队宽操作仿形

PyTorch自带torch.autograd.profiler能够测量按需采取个体经营者时间的。人们可以使用相同的机制做“永远在线”的三围运行PyTorch任何进程。这可能是收集有关在给定的过程或整组机器的运行PyTorch工作负荷的信息是有用的。

对于任何运营商调用回调新可以用添加Torch :: autograd ::探查:: pushCallback [HTG3。钩将与被称为Torch :: autograd ::探查:: RecordFunction结构描述调用上下文(例如,名称)。如果启用,RecordFunction ::输入() 包含表示为torch:: IValue变体类型的函数的自变量。请注意,该输入记录是比较昂贵的,因此,必须明确启用。

调用回调增加了一些开销,所以通常它只是随机采样操作调用有用。这可以在每个回调基础上通过Torch :: autograd ::探查:: setSamplingProbability 中指定的全局采样率启用。

请注意,pushCallbacksetSamplingProbability不是线程安全的,没有PyTorch操作运行,只有当可以被调用。通常情况下,这是一个好主意,在初始化时调用了它们一次。

下面是一个例子:

  1. // Called somewhere in the program beginning
  2. void init() {
  3. // Sample one in a hundred operator runs randomly
  4. torch::autograd::setSamplingProbability(0.01);
  5. pushCallback(
  6. &onFunctionEnter,
  7. &onFunctionExit,
  8. /* needs_inputs */ true,
  9. /* sampled */ true
  10. );
  11. }
  12. void onFunctionEnter(const RecordFunction& fn) {
  13. std::cerr << "Before function " << fn.name()
  14. << " with " << fn.inputs().size() << " inputs" << std::endl;
  15. }
  16. void onFunctionExit(const RecordFunction& fn) {
  17. std::cerr << "After function " << fn.name();
  18. }

API使用登录

当在更广泛的生态系统中运行,例如在管理作业调度程序,但是这是要跟踪的二进制文件调用特定的API PyTorch。存在于触发一个给定的回调几个重要的API点注射简单的仪器。因为通常PyTorch是一次性的Python脚本调用,回调火灾只有一次针对每个API的规定的处理。

C10 :: SetAPIUsageHandler可用于注册API使用的仪器处理程序。传递的参数将是一个“API密钥”识别用于点,例如python.import [HTG7用于PyTorch延长进口或torch.script.compile [HTG11如果TorchScript编译被触发。``

  1. SetAPIUsageLogger([](const std::string& event_name) {
  2. std::cerr << "API was used: " << event_name << std::endl;
  3. });

注意为开发新的API的触发点可以在代码被添加与C10_LOG_API_USAGE_ONCE (“my_api”)在C ++或torch._C._log_api_usage_once(“我的。 API“)在Python。

将元数据附加到保存TorchScript模型

TorchScript模块可以保存为捆绑串行化参数和模块代码作为TorchScript存档文件(见 torch.jit.save() )。这是很方便的与该模型一起捆绑的其他信息,例如,模型制作者或辅助的工件的描述。

它可以通过使_extra_files参数为 torch.jit.save()和[HTG10来实现] Torch :: JIT ::负载 存储和保存过程中检索任意的二进制块。由于TorchScript文件定期ZIP档案,额外的信息被存储作为普通的文件归档的额外/目录内。

还有一个全局钩子允许额外的文件附加到当前进程产生的任何TorchScript存档。这可能是与制片人的元数据,类似于数码相机产生的JPEG元数据标签模型有用。用法示例可能类似于:

  1. SetExportModuleExtraFilesHook([](const script::Module&) {
  2. script::ExtraFilesMap files;
  3. files["producer_info.json"] = "{\"user\": \"" + getenv("USER") + "\"}";
  4. return files;
  5. });

构建环境的考虑

TorchScript的编译需要访问原来的Python文件,因为它使用python的inspect.getsource通话。在某些生产环境,可能需要与预编译.pyc文件沿着明确部署的.py文件。

普通的扩展点

PyTorch的API通常是松散耦合的,很容易与专门的版本替换部件。常见的扩展点包括:

Next 对于大规模部署的特点 - 图1 对于大规模部署的特点 - 图2 Previous


©版权所有2019年,Torch 贡献者。