Как запустить Tensorflow быстрее - PullRequest
0 голосов
/ 04 марта 2020

Я разработал скрипт машинного обучения python (назовем его classify_obj, написанный с python 3.6), который импортирует TensorFlow. Первоначально он был разработан для массового анализа, но теперь я нахожу необходимость многократно запускать этот сценарий для небольших наборов данных, чтобы обеспечить большее использование в реальном времени. Я делаю это на Linux RH7.

Поток процесса:

  1. Главный инструмент (записан в Java) вызывает classify_obj с вводом объекта для категоризации.

  2. classify_obj генерирует результат классификации в виде csv (занимает около 7-10 секунд)

  3. Мастер-инструмент читает результат из # 2

  4. Мастер-инструмент переходит к другим логам c

  5. Повторите # 1 при следующем вводе объекта

Для разбивки я выключил основной лог c и просто импортировал модули, не выполняя никаких других действий. Я обнаружил, что импорт занимает около 4-5 с из 7-10 с времени выполнения для небольшого набора данных. Классификация занимает около 2 с. Я также ищу другие способы сокращения времени выполнения для других областей, но объем, по-видимому, зависит от импорта.

Время импорта: 4-6 с

Время классификации: 1 с

Чтение, запись и другие логи c время: 0,2 с

Я думаю, какие есть варианты, чтобы сократить время импорта?

Одна из моих идей заключалась в изменении classify_obj в процессе "остаться в живых". Главный инструмент после завершения всей своей деятельности остановит этот процесс / службу. Намерение (не уверенное, если это так) состоит в том, что все необходимые библиотеки уже загружены во время запуска процесса, и когда главный инструмент вызывает этот процесс / службу, ему потребуется только время классификации вместо необходимости импортировать библиотеки повторил.

Что вы думаете об этом? Также, как я могу установить это на Linux RHEL 7.4? Некоторые ссылки ссылки будут с благодарностью.

Другие предложения будут с благодарностью.

Спасибо и хорошего дня!

1 Ответ

0 голосов
/ 24 марта 2020

Это решение, которое я разработал для достижения вышеуказанного.

Справка: https://realpython.com/python-sockets/

Мне нужно создать 2 сценария. 1. скрипт клиента python: используется для передачи необработанных данных, которые должны быть классифицированы, на скрипт сервера python с использованием программирования сокетов.

Скрипт server python: Загружает lib и модель keras (tenorflow) при запуске. Продолжает оставаться в живых до тех пор, пока клиент не запросит «стоп» (для выхода пока l oop). Когда клиентский сценарий отправляет данные серверному сценарию, серверный сценарий обрабатывает входящие данные и возвращает выходные данные ok / not ok обратно клиентскому сценарию.

В конце время классификации равно уменьшено до 0,1 - 0,3 с.

Клиентский скрипт

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()
...