Angel的模型是以矩阵为单位来保存的,每一个矩阵在模型保存路径下对应一个以矩阵名命名的文件夹,里面包含矩阵的元数据文件和数据文件。一个矩阵只有一个元数据文件,但是一般有多个数据文件,因为Angel的大部分算法模型都是从PS导出的。
元数据采用JSON格式保存。矩阵元数据主要由矩阵特征,分区索引和行相关索引组成:分别由MatrixFilesMeta,MatrixPartitionMeta和RowPartitionMeta类来描述。
用途:矩阵相关信息 具体包含字段:
- matrixId:矩阵ID
- rowType:矩阵类型,可参看RowType类
- row:矩阵行数
- blockRow:矩阵分区块行数
- col:矩阵列数
- blockCol:矩阵分块块列数
- matrixName:矩阵名字
- formatClassName:矩阵存储格式
- options:其他矩阵参数
- partMetas:矩阵分区索引
用途:分区元数据 具体包含字段:
- startRow:分区起始行行号
- endRow:分区结束行行号
- startCol:分区起始列列号
- endCol:分区结束列列号
- nnz:分区非零元素个数(暂时没用)
- fileName:分区数据所在文件名
- offset:分区数据在文件中的位置
- length:分区数据长度(字节数)
- saveRowNum:分区中保存的行数
- saveColNum:分区中保存的列数(只在列主序格式中有用)
- saveColElemNum:每一列保存的元素个数(只在列主序格式中有用)
- rowMetas:分区行索引
用途:分区的某一行分片对应的元数据 具体包含字段:
- rowId:行号
- offset:行数据在文件中的位置
- elementNum:该行保存的文件格式
Angel2.0采用了用户自定义的模型格式。即可以根据实际需求定制模型输出格式。一般情况下,使用Angel的默认模型输出格式即可。由于Angel默认的输出格式比较简单,大部分并不需要依赖元数据文件就可以直接解析。
Angel提供了8中默认的模型输出格式: ValueBinaryRowFormat,ColIdValueBinaryRowFormat,RowIdColIdValueBinaryRowFormat,ValueTextRowFormat,ColIdValueTextRowFormat,RowIdColIdValueTextRowFormat,BinaryColumnFormat和TextColumnFormat。 下面分别介绍这8种格式。
- 说明:二进制格式,只包含模型的值。这种格式只适合单行稠密的模型,由于数据文件中没有列号(特征索引),所以需要从模型元数据中获取索引范围。
- 格式:|value|value|...|
- 说明:二进制格式,包含特征索引和对应的值。这种格式适合单行模型,例如LR等。
- 格式:|index|value|index|value|...|
- 说明:二进制格式,包含模型的行号,特征索引和对应的值。这种格式可以表示多行模型。
- 格式:|rowid|index|value|rowid|index|value|...|
- 说明:文本格式,只包含模型的值,每个值是一个单独的行。与ValueBinaryRowFormat类似这种格式只适合单行稠密的模型,由于数据文件中没有列号(特征索引),所以需要充模型元数据中获取索引范围。
- 格式: value value value
- 说明:文本格式,包含特征索引和对应的值,每一行是一个特征id和值的对,特征id和值之间的分隔符默认是逗号。这种格式适合单行模型,例如LR等。
- 格式: index,value index,value index,value
- 说明:文本格式,包含行号,特征索引和对应的值,每一行是一个行号,特征id和值的对。行号,特征id和值之间的分隔符默认是逗号。这种格式可以表示多行模型。
- 格式: rowid,index,value rowid,index,value rowid,index,value
- 说明:二进制格式,这种格式是以列主序来输出一个矩阵,目前只用于Embedding相关的输出(例如DNN,FM等算法中的Embedding层)。模型格式为
- 格式:|index|row1 value|row2 value|...|index|row1 value|row2 value|...|
- 说明:文本格式,这种格式是以列主序来输出一个矩阵,目前只用于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使用的是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的依赖路径,同时通过上面提到的四个参数进行配置来使用自定义的输出格式。