数据格式

Mnonlith支持多种数据格式:

  • ExampleBatch: 主要用于批式训练,以列式存储的方式,一次存取一批样本,这样做的好处是方便做特征裁剪

  • Example: 主要用于流式训练,以行式存储的方式,一次存取一个样本

另外,在推荐场景中,通常有一些额外信息,如采样率(sample rate),请求时间(request time),用户原始ID,物品原始ID等等这些信息存于LineID中。所以每个样本会附加一个LineID

1. LineID

LineID中有很多field,这里列出一部分,并给出注释,具体如下:

message LineId
    optional fixed64 uid = 2;                        // 用户原始ID
    optional int64 req_time = 3;                     // 请求时间
    optional fixed64 item_id = 4;                    // 物品ID
    optional string req_id = 5;                      // 请求ID
    repeated int32 actions = 6 [packed=true];        // 行为列表
    optional int64 generate_time = 20;               // 样本生成时间
    optional int32 emit_type = 21;                   // 样本发送类型
    repeated int32 pre_actions = 23 [packed=true];   // 上一次行为列表
    optional string model_names = 25;                // 模型名,multi-task样本中用到
    optional float sample_rate = 27 [default = 1.0]; // 负样本采样率
}

其中,uidreq_timesample_rate是日志系统打点必要字段。其它的是可选字段

2. Example类格式

2.1 Feature定义

Feature是Example的基础,定义如下:

message FidList {
  repeated fixed64 value = 1;
}

message FidLists {
  repeated FidList list = 1;
}

message FloatList {
  repeated float value = 1;
}

message FloatLists {
  repeated FloatList list = 1;
}

message DoubleList {
  repeated double value = 1;
}

message DoubleLists {
  repeated DoubleList list = 1;
}

message Int64List {
  repeated int64 value = 1;
}

message Int64Lists {
  repeated Int64List list = 1;
}

message BytesList {
  repeated bytes value = 1;
}

message BytesLists {
  repeated BytesList list = 1;
}

// Basic extracted features
message Feature {
  oneof type {
    FidList fid_list = 2;
    FloatList float_list = 3;
    DoubleList double_list = 4;
    Int64List int64_list = 5;
    BytesList bytes_list = 6;

    FidLists fid_lists = 7;
    FloatLists float_lists = 8;
    DoubleLists double_lists = 9;
    Int64Lists int64_lists = 10;
    BytesLists bytes_lists = 11;
  }
}

说明:

  • 离散特征会抽提成feature id (简称fid),对应fid_list

  • 稠密特征可以是float/double/int64/bytes等几种数据类型

  • 序列特征可以用*_lists字段表示

另外,标签(label)用float_list表示; LineID序列化后,用bytes_list表示

2.2 ExampleBatch格式

ExampleBatch是Monolith批试训练格式,如下:

enum FeatureListType {
  INDIVIDUAL = 0;  // 每个样本有独立值
  SHARED = 1;      // 所有样本有共享值
}

message NamedFeatureList {
  string name = 1;                // 特征名称
  repeated Feature feature = 2;   // 特征,同一batch的特征放在一起,所以是repeated
  FeatureListType type = 3;       // 特征类型,用于指定是否是共享特征
  int32 id = 4;                   // 特征编号,目前未启用
}

message ExampleBatch {
  repeated NamedFeatureList named_feature_list = 1;   // 特征列表
  int32 batch_size = 3;                               // batch大小
}

简单总结: ExampleBatch是以列形式存储

虽然输入Monolith时为ExampleBatch,但是由于下列原因,Monolith会先将它转化为Example再处理:

  • ExampleBatch不方便样本过滤,负例生成,采样等操作

  • ExampleBatch并不是固定batch size的,上一个ExampleBatch的batch size为100,下一个可能为125,不利于训练

2.3 Example格式

Example是Monolith流试训练格式,如下:

message NamedFeature {
  string name = 1;        // 特征名称
  Feature feature = 2;    // 特征
  int32 id = 3;           // 特征编号,目前未启用
}

message Example {
  repeated NamedFeature named_feature = 1;  // 特征信息

  LineId line_id = 100;                     // line_id信息
  repeated float label = 101;               // 标签信息
}

简单总结: ExampleBatch是以行形式存储

值得注意的是line_id,label的原始信息是存于NamedFeature中的:

  • line_id: 特征名为__LINE_ID__,值是序列化的二进制数据,以byets形式存储

  • label: 特征名为__LABEL__,值是float,以float_list的形式存储

由于label/line_id在特征过滤,负例采样,负例生成中常常用到,为了防止多次反序列化,在读取数据时,将它们的反序列化结果直接放在Example中

3. 格式转换

Monolith支持输入/出格式,如下:

  • 输入格式: Example/ExampleBatch

  • 输出格式: Example