阅读(4214) (9)

为TensorFlow定义config.proto

2018-01-02 10:59:55 更新
package tensorflow;
option cc_enable_arenas = true;
option java_outer_classname = "ConfigProtos";
option java_multiple_files = true;
option java_package = "org.tensorflow.framework";

import "tensorflow/core/framework/cost_graph.proto";
import "tensorflow/core/framework/graph.proto";
import "tensorflow/core/framework/step_stats.proto";
import "tensorflow/core/protobuf/debug.proto";
import "tensorflow/core/protobuf/cluster.proto";
import "tensorflow/core/protobuf/rewriter_config.proto";

message GPUOptions {
  //一个介于0和1之间的值, 指示可用的 GPU 内存来分配每个进程. 
  //1意味为了分配所有的 GPU 内存, 0.5 意味着过程分配 50% 的可用 GPU 内存.
  double per_process_gpu_memory_fraction = 1;

  // 要使用的 GPU 分配策略的类型的分数.
  //
  // 允许的值:
  // "": 空字符串 (默认) 使用系统选择的默认值这可能会随着时间的推移而改变.
  //
  // "BFC":"Best-fit with coalescing" 算法, 从 dlmalloc 的版本简化了
  string allocator_type = 2;

  //延迟删除多达这许多字节, 以减少数量与 gpu 驱动程序代码的交互.
  //如果为 0, 系统选择合理的默认值 (几个 MBs).
  int64 deferred_deletion_bytes = 3;

  // 如果为 true, 则分配器不分配整个指定的GPU 内存区域, 而不是从小开始, 并根据需要增长.
  bool allow_growth = 4;

  // 一个以逗号分隔的 GPU id 列表, 用于确定 "可见"到 GPU 设备的 "虚拟" 映射.
  // 例如, 如果 TensorFlow可以看到 8 GPU 设备的过程中, 和一个想映射可视的 GPU 设备5和3作为 "/device:GPU:0", 和 "/device:GPU:1", 
  // 然后一个将此字段指定为 "53".
  // 此字段类似于精神到 CUDA_VISIBLE_DEVICES 环境变量, 除了它适用于过程中可见的 GPU 设备.
  // 注意: GPU 驱动程序提供了可见的 gpu在一个不保证有任何关联的顺序机器中的物理 * GPU id.
  // 此字段用于重新映射 "visible" 到 "virtual", 这意味着只操作进程开始后.
  // 用户必须使用供应商特定的机制 (例如, CUDA_VISIBLE_DEVICES) 来控制在调用 TensorFlow 之前物理到可见的设备映射.
  string visible_device_list = 5;

  // 在事件轮询循环中, 当队列不是空时, 在 PollEvents 调用之间休眠这许多微秒.
  // 如果值未设置或设置为 0, 则将其设置为非零默认.
  int32 polling_active_delay_usecs = 6;

  // 当队列为空时, 在事件轮询循环中休眠 PollEvents 调用之间的许多 millisconds.
  // 如果值未设置或设置为 0, 则将其设置为非零默认.
  int32 polling_inactive_delay_msecs = 7;

  // 强制所有张量都为 gpu_compatible.
  // 在启用了 GPU 的 TensorFlow 上, 启用此选项将强制将所有 CPU 张量分配给 Cuda 固定内存.
  // 通常, TensorFlow 会推断出应将哪个张量分配为固定内存.
  // 但是, 如果推理不完整, 此选项可以显著加快设备内存复制性能, 只要它符合内存的大小.
  // 请注意, 对于未知或非常大的模型, 此选项不是默认情况下应该启用的,
  // 因为所有 Cuda 固定内存都是 unpageable 的, 有太多的固定内存可能会对整个主机系统的性能产生负面影响.
  bool force_gpu_compatible = 8;
};

// 传递给图形优化器的选项
message OptimizerOptions {
  // 如果为 true, 则使用公共子表达式消除来优化关系图.
  bool do_common_subexpression_elimination = 1;

  // 如果为 true, 则在图上执行恒定的折叠优化.
  bool do_constant_folding = 2;

  // 如果为 true, 则在关系图上执行函数内联.
  bool do_function_inlining = 4;

  // 优化级别
  enum Level {
    // L1 是默认级别.
    // 优化执行在 L1:
    // 1. 共同子表达式消除
    // 2. 恒定的折叠
    L1 = 0;

    // 不优化
    L0 = -1;
  }

  // 整体优化水平.
  // 实际应用的优化将是此级别所隐含的或已设置的标志的逻辑或标志.
  Level opt_level = 3;

  // 控制编译器/jit的使用.
  enum GlobalJitLevel {
    DEFAULT = 0;  // 默认设置 (现在是"off", 但后来预期是 "on")
    OFF = -1;
    // 以下设置将启用编译, 更高的值更具积极性.
    // 较高的值可能会减少并行性的机会, 并可能会占用更多内存.
    //  (目前, 没有区别, 但预计会发生变化)
    ON_1 = 1;
    ON_2 = 2;
  }
  GlobalJitLevel global_jit_level = 5;
}

message GraphOptions {
  // 删除, 请使用下面的 optimizer_options.
  reserved "skip_common_subexpression_elimination";
  reserved 1;

  // 如果为 true, 则使用控制流来安排接收节点的激活.(当前被忽略.)
  bool enable_recv_scheduling = 2;

  // 控制如何优化图表的选项.
  OptimizerOptions optimizer_options = 3;

  // 在返回成本模型详细说明之前要运行的步骤数图中每个节点的内存使用情况和性能.
  // 0意味没有成本模型.
  int64 build_cost_model = 4;

  // 在收集成本模型的统计信息之前要跳过的步骤数.
  int64 build_cost_model_after = 9;

  // 使用 Op 输出形状数据对每个节点进行注释, 以使其可以静态推断.
  bool infer_shapes = 5;

  // 只放置运行的子图形, 而不是整个图形.
  // 这对于交互式图形生成非常有用, 在这个过程中, 您可能会产生无法在调试进程中放置的图形.
  // 特别是, 它允许客户端在将节点添加到其位置约束为不可的关系图之后继续在会话中工作.
  bool place_pruned_graph = 6;

  // 如果为 true, 则将进程之间的浮点值转换为 bfloat16.
  bool enable_bfloat16_sendrecv = 7;

  // 如果 > 0, 记录一个时间线, 每这许多步骤.
  // 实例: 目前这对 MasterSession 没有影响.
  int32 timeline_step = 8;

  // 控制图形重写类型和数量的选项.
  // 当前无法通过公共 Python api 进行配置 (即, 如果显式导入 RewriterConfig, 则没有 api 稳定性保证).
  RewriterConfig rewrite_options = 10;
};

message ThreadPoolOptionProto {
  // 池中的线程数.
  // 0表示系统根据使用此选项的原始位置选取一个值 (有关详细信息, 请参见特定字段的声明).
  int32 num_threads = 1;

  // 线程池的全局名称.
  // 如果为空, 则根据线程池的范围制作和使用, 例如, 对于会话线程池, 该会话只使用它.
  // 如果为非空, 则:-与此名称关联的全局线程池将被查或创建.
  // 例如, 这允许在多个会话中共享一个线程池 (例如, 如果未配置 inter_op_parallelism_threads, 则与默认行为类似),但仍将分区分成一个大的和小的池.
  // -如果已存在此 global_name 的线程池, 则如果现有池是使用此调用中指定的不同 num_threads 值创建的, 则为错误.
  // -threadpools 创建这种方式从来没有垃圾收集.
  string global_name = 2;
};

message RPCOptions {
  // 如果为 true, 则始终使用 RPC 与会话目标联系.
  // 如果为 false (默认选项), TensorFlow 可以使用优化的传输来避免 RPC 堆栈的客户端主通信.
  // 此选项主要用于测试 RPC 堆栈.
  bool use_rpc_for_inprocess_master = 1;
};

  // 会话配置参数.
  // 系统为未设置的字段选取适当的值.
message ConfigProto {
  // 从设备类型名称 (例如, "CPU" 或 "GPU") 映射到该类型要使用的最大设备数.
  // 如果在 map 中找不到特定的设备类型, 系统将选取一个适当的数字.
  map<string, int32> device_count = 1;

  // 单个 op (对于某些 op 类型) 的执行可以在一个 intra_op_parallelism_threads 的池中并行.0表示系统选取适当的数字.
  int32 intra_op_parallelism_threads = 2;

  // 执行阻塞操作的节点排队在每个进程中可用的 inter_op_parallelism_threads 池上.
  // 0表示系统选取适当的数字.
  // 请注意, 在进程中创建的第一个会话设置所有未来会话的线程数, 除非 use_per_session_threads 为真或配置了 session_inter_op_thread_pool.
  int32 inter_op_parallelism_threads = 5;

  // 如果为 true, 则使用此会话的新线程集, 而不是全局线程池.
  // 仅由直接会话支持.如果为 false, 则使用由第一个会话创建的全局线程, 或由 session_inter_op_thread_pool 配置的每个会话线程池.
  // 此选项已弃用.同样的效果可以通过设置 session_inter_op_thread_pool 有一个元素, 其 num_threads 等于 inter_op_parallelism_threads.
  bool use_per_session_threads = 9;

  // 这个选项是实验性的-它可能会被未来的不同机制所取代.
  // 配置会话线程池.
  // 如果配置了此选项, 则运行调用的 RunOptions 可以选择要使用的线程池.
  // 预期的用途是, 当某些会话调用需要在仅限于少量线程的后台池中运行时:
  // 例如, 会话可以配置为具有一个大池 (用于常规计算) 和一个小池 (用于定期、低优先级的工作);
  // 使用小池是当前限制低优先级工作的 inter-op 并行性的机制.
  // 注意, 它不会限制单个 op 内核实现所产生的工作的并行性.
  // -在培训中通常不需要使用此设置, 但可以帮助某些服务用例.
  // -通常还建议设置此原型的 global_name 字段, 以避免创建多个大型池.
  // 通常, 在单个大型池中运行 non-low 优先级的工作 (甚至跨会话) 会更好.
  repeated ThreadPoolOptionProto session_inter_op_thread_pool = 12;

  // 节点对设备的分配是在每个 placement_period 步骤中重新计算的,直到系统预热 (此时计算通常会自动减速).  int32 placement_period = 3;

  // 当任何筛选器都是当前会话时, 将忽略与筛选器不匹配的所有设备.
  // 每个筛选器可以部分指定, 例如:"/job:ps"、"/job:worker/replica:3", etc.
  repeated string device_filters = 4;

  // 适用于所有  GPUs 的选项.
  GPUOptions gpu_options = 6;

  // 是否允许 soft placement . 如果 allow_soft_placement 是 true,
  // 如果有如下情况,则将在 CPU 上放置 op:
  //   1. 没有o GPU 实现的 OP 
  // 或者
  //   2. 没有 GPU 设备是已知或注册
  // 或者
  //   3. 需要与来自 CPU 的 reftype input(s) 合用.  bool allow_soft_placement = 7;

  // 是否应记录设备放置.
  bool log_device_placement = 8;

  // 应用于所有图形的操作
  GraphOptions graph_options = 10;

  // 是否应记录设备放置.
  // 此会话中所有阻塞操作的全局超时.如果为非零, 且不在每个操作基础上重写, 则此值将用作所有阻塞操作的截止时间.  int64 operation_timeout_in_ms = 11;

  // 此会话使用分布式运行时应用的选项.
  RPCOptions rpc_options = 13;

  // 在此会话中使用的所有工作人员的可选列表.
  ClusterDef cluster_def = 14;

  // Next: 15
};

  // 单个运行 () 调用的选项.
message RunOptions {
  // TODO (pbar) 将其转换为 TraceOptions 的原型, 允许跟踪以更正交的方式进行控制?
  enum TraceLevel {
    NO_TRACE = 0;
    SOFTWARE_TRACE = 1;
    HARDWARE_TRACE = 2;
    FULL_TRACE = 3;
  }
  TraceLevel trace_level = 1;

  // 等待操作完成的时间 (以毫秒为单位).
  int64 timeout_in_ms = 2;

  // 要使用的线程池 (如果配置了 session_inter_op_thread_pool).
  int32 inter_op_thread_pool = 3;

  // 是否应通过 RunMetadata 输出由执行器完成的分区图.
  bool output_partition_graphs = 5;

  // 实例, 用于初始化 DebuggerState 的选项 (如果已启用).
  DebugOptions debug_options = 6;

  reserved 4;
}

// 单个Run()调用的元数据输出 (即非张量).
message RunMetadata {
  // 跟踪此步骤的统计信息.
  // 如果通过 "RunOptions" 原型打开跟踪, 则填充.实验: 在将来的版本中, 事件的格式和设置可能会发生变化.
  StepStats step_stats = 1;

  // 运行调用定义的计算的成本关系图.
  CostGraphDef cost_graph = 2;

  // 执行的分区的图.
  repeated GraphDef partition_graphs = 3;
}