机器学习 | TensorFlow模型如何与线上工程交互

策略与工程共生关系

问题背景:当数据科学从业者在线下通过TensorFlow/Keras将神经网络模型训练出来之后,因为线上使用Java进行工程实现而与模型无法良好对接,导致形成了工程和策略之间的gap。
本文主要探讨尝试了几种可能的解决方案以及相对应的结果和优缺点。


结论优先

  • Java分布式方案:笔者尝试的方式中,暂时没有能有效对接TensorFlow/Keras模型和线上分布式Java Based Spark(下文中均用JBS替代)的交互模式。(如有可行方式,欢迎在留言中探讨)
  • Python/Java分布式方案:JBS处理的中间数据通过HDFS和Pyspark/Java对接处理,通过TensorflowOnSpark/Java Tensorflow将Tensorflow模型分布式部署到集群节点中进行工程化预测。
  • Java单节点方案:JBS处理的中间数据通过在单节点GPU上,通过Java Based Tensorflow对数据进行处理之后返回JBS分布式处理。
  • Java分布式(手动)方案:将Java Based Tensorflow手动部署到集群节点,JBS通过调用集群节点程序方式通过模型预测实现分布式。


Java分布式方案尝试经验


1. 采用PMML文件对接策略模型和线上工程:
  • Keras

    • 方式:通过keras2pmml项目对keras模型转换到pmml文件格式,然后跟java对接。
    • 问题:该项目已经很久没人维护升级,版本停留在0.1.主要能支持一些DNN结构模型,对RNN和CNN等更复杂的结构模型无法进行正确转换,需要修改大量源代码。
    • 改进方案:部分activation类型改进方案-如何把神经网络keras模型转PMML文件?
    • 结论:对复杂神经网络模型不可行。

  • Tensorflow

    • 方式:采用jpmml-tensorflow项目,将keras模型转换为tensorflow的savemodel类文件之后,通过github项目代码进行转换为pmml文件。
      • 如何将keras模型转换为savemodel类:

         model = keras.models.load_model("model.h5")
         sess = keras.backend.get_session()
         builder = tf.saved_model.builder.SavedModelBuilder(saved_model_dir)
         builder.add_meta_graph_and_variables(sess, ['serve'])
         builder.save()
        
    • 问题:该项目支持的模型种类也只有DNN,并不支持CNN或者RNN等更复杂的模型。所以中间会报模型种类无法找到illegal的error。
    • 结论:对复杂神经网络模型也不可行。

  • 结论

    • PMML工程方案对于复杂神经网络的支持性不完善,但对于简单的神经网络以及其他传统机器学习模型来说,PMML方式因为其通用性,是良好的算法和工程衔接的桥梁。

2. Deeplearning4J方式转换模型应用:
  • Keras
    • 方式:采用deeplearning4j的方式,将模型文件通过deeplearning4j方式导入java,再通过JBS进行预测处理。
    • 问题
      1. 项目对Keras 2.0的支持处于beta版本,会对一些神经网络层出现bug,比如像ELU层会报错。所以使用的时候,或者去除ELU等有问题神经网络层,或者采用Keras 1.0进行构建网络。
      2. 在进行JBS分布式预测的时候,出现了一些网络结构无法解析的错误,猜测可能是因为在spark集群的序列化和反序列化过程中出现了问题。但deeplearning4j官网架构图显示其对于Spark的支持,所以不确定是否是使用方式问题导致了分布式出现模型结构解析问题。
    • 结论:在分布式(可能是序列化过程中)结构中,deeplearning4j项目还存在一些问题,无法与JBS正常兼容。

3. Java Based Tensorflow方式应用模型:
  • Keras/Tensorflow:
    • 步骤一:将keras模型先转换为tensorflow静态图模型文件,.pb格式或者ckpt格式。(ckpt与pb的异同:Tensorflow学习笔记-模型保存与加载

      • 如何将keras模型转换为ckpt文件类型:

        model = keras.models.load_model("model.h5")
        sess = keras.backend.get_session()
        saver = tf.train.Saver()
        save_path = saver.save(sess, "/tmp/model.ckpt")
        
      • 如何将keras模型转换为pb文件类型:
        keras模型保存为tensorflow的二进制模型

    • 步骤二: 然后通过Java Based Tensorflow读取pb文件,对数据进行预测。(关于java如何调用tensorflow模型例子:TensorFlow-Java-Examples

    • 问题

      • 单机的情况下,可以采用java来调用tensorflow。
      • 分布式的情况下,由于tensorflow底层是cpp,所以在序列化打包和反序列的时候会出现问题,导致分布式节点机器无法正常调用。
      • 所以只有在单机情况下才能跟java兼容。或者分布式采用pyspark中的tensorflowonspark包或者通过预先在分布式集群节点中部署本地tensorflow服务,然后java远程调用tensorflow服务来实现手动分布式

各方案优缺点:


  • Pyspark/Java分布式
    • 优点:通过TensorflowOnSpark/Java Tensorflow可以实现Tensorflow在分布式集群上的工程化部署。
    • 缺点:与线上JBS交互需要通过HDFS做中间层,文件IO的效率会影响线上工程服务的速率。
  • Java单机
    • 优点:跟线上Java工程兼容,无需HDFS的IO。
    • 缺点:需要使用GPU机器提升单机预测效率,没有利用分布式集群,性价比相对较低。
  • Java手动分布式
    • 优点:利用分布式集群资源,且跟线上工程Java兼容。
    • 缺点:手动部署集群效率太低。

参考文献:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容