模型存储格式

Angel的模型是以矩阵为单位来保存的,每一个矩阵在模型保存路径下对应一个以矩阵名命名的文件夹,里面包含矩阵的元数据文件和数据文件。一个矩阵只有一个元数据文件,但是一般有多个数据文件,因为Angel的大部分算法模型都是从PS导出的。

元数据文件

元数据采用JSON格式保存。矩阵元数据主要由矩阵特征,分区索引和行相关索引组成:分别由MatrixFilesMetaMatrixPartitionMetaRowPartitionMeta类来描述。

MatrixFilesMeta

用途:矩阵相关信息具体包含字段

  • matrixId:矩阵ID
  • rowType:矩阵类型,可参看RowType类
  • row:矩阵行数
  • blockRow:矩阵分区块行数
  • col:矩阵列数
  • blockCol:矩阵分块块列数
  • matrixName:矩阵名字
  • formatClassName:矩阵存储格式
  • options:其他矩阵参数
  • partMetas:矩阵分区索引

MatrixPartitionMeta

用途:分区元数据具体包含字段

  • startRow:分区起始行行号
  • endRow:分区结束行行号
  • startCol:分区起始列列号
  • endCol:分区结束列列号
  • nnz:分区非零元素个数(暂时没用)
  • fileName:分区数据所在文件名
  • offset:分区数据在文件中的位置
  • length:分区数据长度(字节数)
  • saveRowNum:分区中保存的行数
  • saveColNum:分区中保存的列数(只在列主序格式中有用)
  • saveColElemNum:每一列保存的元素个数(只在列主序格式中有用)
  • rowMetas:分区行索引

RowPartitionMeta

用途:分区的某一行分片对应的元数据具体包含字段

  • rowId:行号
  • offset:行数据在文件中的位置
  • elementNum:该行包含的元素个数
  • saveType:该行保存的文件格式

数据文件格式

Angel2.0采用了用户自定义的模型格式。即可以根据实际需求定制模型输出格式。一般情况下,使用Angel的默认模型输出格式即可。由于Angel默认的输出格式比较简单,大部分并不需要依赖元数据文件就可以直接解析。

默认格式说明

Angel提供了8中默认的模型输出格式:ValueBinaryRowFormatColIdValueBinaryRowFormatRowIdColIdValueBinaryRowFormatValueTextRowFormatColIdValueTextRowFormatRowIdColIdValueTextRowFormatBinaryColumnFormat和TextColumnFormat。 下面分别介绍这8种格式。

ValueBinaryRowFormat

  • 说明:二进制格式,只包含模型的值。这种格式只适合单行稠密的模型,由于数据文件中没有列号(特征索引),所以需要从模型元数据中获取索引范围。
  • 格式:|value|value|…|

ColIdValueBinaryRowFormat

  • 说明:二进制格式,包含特征索引和对应的值。这种格式适合单行模型,例如LR等。
  • 格式:|index|value|index|value|…|

RowIdColIdValueBinaryRowFormat

  • 说明:二进制格式,包含模型的行号,特征索引和对应的值。这种格式可以表示多行模型。
  • 格式:|rowid|index|value|rowid|index|value|…|

ValueTextRowFormat

  • 说明:文本格式,只包含模型的值,每个值是一个单独的行。与ValueBinaryRowFormat类似这种格式只适合单行稠密的模型,由于数据文件中没有列号(特征索引),所以需要充模型元数据中获取索引范围。
  • 格式:valuevaluevalue

ColIdValueTextRowFormat

  • 说明:文本格式,包含特征索引和对应的值,每一行是一个特征id和值的对,特征id和值之间的分隔符默认是逗号。这种格式适合单行模型,例如LR等。
  • 格式:index,valueindex,valueindex,value

RowIdColIdValueTextRowFormat

  • 说明:文本格式,包含行号,特征索引和对应的值,每一行是一个行号,特征id和值的对。行号,特征id和值之间的分隔符默认是逗号。这种格式可以表示多行模型。
  • 格式:rowid,index,valuerowid,index,valuerowid,index,value

BinaryColumnFormat

  • 说明:二进制格式,这种格式是以列主序来输出一个矩阵,目前只用于Embedding相关的输出(例如DNN,FM等算法中的Embedding层)。模型格式为
  • 格式:|index|row1 value|row2 value|…|index|row1 value|row2 value|…|

TextColumnFormat

  • 说明:文本格式,这种格式是以列主序来输出一个矩阵,目前只用于Embedding相关的输出(例如DNN,FM等算法中的Embedding层),每一个行是一个列。分隔符默认是逗号。
  • 格式:index,row1 value,row2 value,…index,row1 value,row2 value,…index,row1 value,row2 value,…

具体算法输出格式

Angel的算法目前基本都是基于新的计算图框架来实现的,计算图中的每一层都可以单独设置模型格式。在默认的情况下,SimpleInputLayer使用的是ColIdValueTextRowFormat,Embedding层使用的是TextColumnFormat,FCLayer使用的是RowIdColIdValueTextRowFormat。

  • LR,线性回归,SVM:默认的模型保存格式为ColIdValueTextRowFormat。
  • GBDT:RowIdColIdValueTextRowFormat
  • FM:线性部分使用的是ColIdValueTextRowFormat,Embedding层使用的是TextColumnFormat
  • DeepFM, DNN,Wide And Deep,PNN,NFM等:线性部分使用的是ColIdValueTextRowFormat,Embedding层使用的是TextColumnFormat,全连接部分使用的是RowIdColIdValueTextRowFormat

当然,如果你不想使用默认格式,可以通过参数配置模型输出格式:

  • ml.simpleinputlayer.matrix.output.format:SimpleInputLayer使用的输出格式
  • ml.embedding.matrix.output.format:Embedding使用的输出格式
  • ml.fclayer.matrix.output.format:FCLayer使用的输出格式

更进一步,如果Angel提供8种格式无法满足你的要求,你也可以扩展RowFormat类或者ColumnFormat类来自定义需要的格式。具体实现方式很简单,你可以参考目前已有的8种类型。实现完成后,编译打包并通过Angel提供的参数加入Angel的依赖路径,同时通过上面提到的四个参数进行配置来使用自定义的输出格式。