数据格式¶
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]; // 负样本采样率
}
其中,uid
,req_time
,sample_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