目录

适用于大规模部署的功能

本说明讨论了几个可能有用的扩展点和技巧 在较大的系统中运行 PyTorch 或使用 PyTorch 中的实例。

它不涵盖将模型部署到生产环境的主题。check 或相应的教程之一。

该说明假定您从 组织或能够静态链接要加载的其他代码 当使用 PyTorch 时。因此,许多钩子都作为 C++ API 公开,这些 API 可以在集中位置触发一次,例如在静态初始化中 法典。

整个队列的操作员分析

PyTorch 具有能够测量时间的功能 由个体操作员按需拍摄。可以使用相同的机制来执行 “always ON” 测量,适用于运行 PyTorch 的任何进程。它可能对 收集有关在给定进程中运行的 PyTorch 工作负载的信息,或者 跨整套机器。

任何运算符调用的新回调都可以使用 添加。Hook 将使用描述调用的结构体调用 context (例如 name)。如果启用,则包含参数 的函数表示为 variant 类型。请注意,输入 日志记录相对昂贵,因此必须显式启用。torch::addGlobalCallbacktorch::RecordFunctionRecordFunction::inputs()torch::IValue

运算符回调还可以访问 interface,该接口返回指向保存调试信息的结构的指针。 此调试信息可以通过使用 object 提前设置。 调试信息通过向前(包括异步任务)和向后传递传播,可用于传递一些额外信息 关于执行环境(例如模型 ID)的 application down 到 operator callback。c10::ThreadLocalDebugInfo::get()at::DebugInfoGuardfork

调用回调会增加一些开销,因此通常随机调用会很有用 示例运算符调用。这可以通过 传入 的可选采样率。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.importtorch.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_filestorch::jit::loadextra/

还有一个全局钩子,允许将额外的文件附加到任何 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

常见扩展点

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

  • 用 C++ 实现的自定义运算符 - 有关更多详细信息,请参阅教程

  • 自定义数据读取通常可以通过调用相应的 python 库直接集成。的现有功能可以通过扩展 来利用。

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源