ModelMergeAndConverter(模型合并转换器)


ModelMergeAndConverter与ModelConverter均可以将二进制的模型格式文件转换成文本格式,不同的是ModelConverter转换后的模型文件仍然是多个的,而ModelMergeAndConverter则会先将模型分区合并,然后输出到一个文件中。由于ModelMergeAndConverter需要在内存中将模型合并成一个整体,而且由于要输出到同一个文件中而无法并发写,所以它需要耗费更多的时间,转换的时间也更长。因此推荐在模型不是太大的时候使用ModelMergeAndConverter。

转换前模型文件格式

Angel的模型文件,默认设计如下:

  • 每个模型拥有一个源文件”meta”,保存了这个模型的参数和分区(partition)信息,以及每个分区数据的索引信息
  • 多个模型文件,每个模型文件保存了一个或者多个模型分区的数据

转换命令

目前Angel 支持两种转换工具启动模式:客户端模式Angel任务模式
客户端模式就是直接在运行脚本的机器上(一般是用来提交任务的客户端机器)执行转换任务; Angel任务模式是指启动一个Angel Yarn Job,以Angel的Worker为容器来执行转换程序。一般情况下, 推荐使用客户端模式,使用简单,但是由于模型转换过程中需要消耗CPU和网络IO资源(尤其是模型非常大的情况下),因此如果客户端资源比较少,可以使用Angel任务模式。

提交Angel的ModelConverter任务的命令如下:

客户端模式

  1. ./bin/angel-model-mergeconvert \
  2. --angel.load.model.path ${anywhere} \
  3. --angel.save.model.path ${anywhere} \
  4. --angel.modelconverts.model.names ${models} \
  5. --angel.modelconverts.serde.class ${SerdeClass}

Angel任务模式

  1. ./bin/angel-submit \
  2. --angel.app.submit.class com.tencent.angel.ml.toolkits.modelconverter.ModelMergeAndConverterRunner \
  3. --angel.load.model.path ${anywhere} \
  4. --angel.save.model.path ${anywhere} \
  5. --angel.modelconverts.model.names ${models} \
  6. --angel.modelconverts.serde.class ${SerdeClass}
  • 参数说明:
    • angel.load.model.path
      模型输入路径,即原始的二进制格式的模型保存路径。注意,这个路径不用带矩阵名
    • angel.save.model.path
      转换后文本格式的模型存储路径
    • angel.modelconverts.model.names
      需要转换的模型名称列表,可以指定多个模型名,用“,”分隔。这个参数不是必须的,当不指定这个参数时,会转换指定输入路径下所有的模型
    • angel.modelconverts.serde.class
      模型输出行序列化格式。这个参数不是必须的,当不指定这个参数时,使用默认的行格式,即“index:value”形式
    • angel.app.submit.class Angel任务启动入口,配置为com.tencent.angel.ml.toolkits.modelconverter.ModelMergeAndConverterRunner

转换后文件格式说明

  • 模型按行依次存储

  • 格式如下,在文件最开始存储有模型基本信息(模型名称,维度等)。在每一行的起始处行号标识“rowIndex=xxx”,随后为一系列的key:value,key和value分别表示该行下的列索引和对应的值。

    1. ```
    2. rowIndex=0
    3. 0:-0.004235138405748639
    4. 1:-0.003367253227582031
    5. 3:-0.003988846053264014
    6. 6:0.001803243020660425
    7. 8:1.9413353447408782E-4
    8. ```