0

我开发了一个导入 TensorFlow 的机器学习 python 脚本(我们称它为用 python 3.6 编写的分类_obj)。它最初是为批量分析而开发的,但现在我发现需要在较小的数据集上重复运行此脚本以适应更实时的使用。我在 Linux RH7 上执行此操作。

工艺流程:

  1. 主工具(用 Java 编写)使用对象输入调用分类对象进行分类。

  2. classify_obj 将分类结果生成为 csv(大约需要 7-10s)

  3. 主工具从 #2 读取结果

  4. 主工具继续执行其他逻辑

  5. 对下一个对象输入重复 #1

为了分解所花费的时间,我关闭了主逻辑,只导入模块而不执行任何其他操作。我发现导入在小型数据集上的 7-10 秒运行时间中大约需要 4-5 秒。分类大约需要2s。我也在寻找其他方法来减少其他领域的运行时间,但大部分似乎来自进口。

导入时间:4-6s

分类时间:1s

读、写等逻辑时间:0.2s

我在想有什么选择可以减少导入时间?

我的一个想法是将classify_obj修改为“保持活力”过程。主工具在完成​​其所有活动后将停止此进程/服务。意图(不确定是否会是这种情况)是在进程启动期间已经加载了所有必需的库,并且当主工具调用该进程/服务时,它只会产生分类时间而不需要导入库重复。

你怎么看待这件事?另外,如何在 Linux RHEL 7.4 上进行设置?一些参考链接将不胜感激。

其他建议将不胜感激。

谢谢,祝你有美好的一天!

4

1 回答 1

0

这是我为实现上述目的而设计的解决方案。

参考:https ://realpython.com/python-sockets/

我必须创建 2 个脚本。1.客户端python脚本:用于通过socket编程将待分类的原始数据传递给服务端python脚本。

  1. 服务器 python 脚本:在启动时加载 keras (tensorflow) 库和模型。继续保持活动状态,直到来自客户端的“停止”请求(退出 while 循环)。当客户端脚本将数据发送到服务器脚本时,服务器脚本将处理传入的数据并将 ok/not ok 输出返回给客户端脚本。

最终,分类时间减少到 0.1 - 0.3s。

客户端脚本

import socket
import argparse
from argparse import ArgumentParser

def main():
    parser = ArgumentParser(description='XXXXX')
    parser.add_argument('-i','--input', default='NA',  help='Input txt file path')
    parser.add_argument('-o','--output', default='NA',  help='Output csv path with class')
    parser.add_argument('-stop','--stop', default='no',  help='Stop the server script')
    args = parser.parse_args()

    str = args.input + ',' + args.output + ',' + args.stop

    HOST = '127.0.0.1'  # The server's hostname or IP address
    PORT = 65432        # The port used by the server

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect((HOST, PORT))
    bytedata = str.encode()
    sock.send(bytedata)
    data = sock.recv(1024)

    print('Received', data)

if __name__== "__main__":
    main()

服务器脚本

def main():

    HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
    PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

    sock =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((HOST,PORT))
    sock.listen(5)

    stop_process = 'no'
    while (stop_process == 'no'):
        # print('Waiting for connection')
        conn, addr = sock.accept()
        data = ''
        try:
            # print('Connected by', addr)
            while True:
               data = conn.recv(1024)
               if data:
                   stop_process = process_input(data)     # process_input function processes incoming data. If client sends 'yes' for the stop argument, the stop_process variable will be set to 'yes' by the function.
                   byte_reply = stop_process.encode()
                   conn.sendall(byte_reply)               # send reply back to client
               else:
                   break
            conn.close()
            # print('Closing connection',addr)
        finally:
            conn.close()

if __name__== "__main__":
    main()
于 2020-03-24T08:18:42.527 回答