Необходимо ли сделать систему обслуживания tenorflow пакетом lib jar? - PullRequest
0 голосов
/ 04 декабря 2018

Во-первых, я должен подтвердить, что структура порции очень хорошая.Но в некотором сценарии, например, «обнаружение объекта изображения», когда изображение приходит, многие модели должны обрабатывать изображение, если мы зациклим отправку изображения на удаленный сервер и дождемся возврата, это приведет к большой задержкеи передача изображений очень ресурсоемкая。 Поскольку наша компания использует java для предоставления внешних служб RPC, поэтому

  • Я упаковал тензорный поток, обслуживающий библиотеку '.so',
  • , а затемЯ предоставляю java api, Java вызывает собственный метод пакета c lib

, чтобы пользователи могли звонить на локальную службу, как если бы они звонили на удаленную службу.и в то же время, сохранение времени удаленной передачи。 ниже моя структура Java:

Java

и код в Java очень прост:

public class TensorflowServerPredictorImpl {

static {
    try {
        NativeLibLoader.initLoad();
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

private final long handle;//server c impl handle
public native long init(byte[] options);
private native byte[]  predict(long handle,byte[] request);



public TensorflowServerPredictorImpl(ServerOptions.ServerConfig config){
    handle = init(config.toByteArray());
}



public Predict.PredictResponse Predict(Predict.PredictRequest request)throws Exception{

    byte[] requestByteArray = request.toByteArray();
    byte[] responseByteArray = predict(this.handle,requestByteArray);
    Predict.PredictResponse response = Predict.PredictResponse.parseFrom(responseByteArray);
    return response;
}

}

и использование lib выглядит так:

public class Test{
public static void main(String[] args)throws Exception{

    URL url = Test.class.getResource("/");
    String path = url.getPath()+"model_config_file.cfg";
    ServerOptions.ServerConfig.Builder builder = ServerOptions.ServerConfig.newBuilder();
    builder.setModelConfigFile(path);
    ServerOptions.ServerConfig config = builder.build();
    TensorflowServerPredictorImpl predictor = new TensorflowServerPredictorImpl(config);
    Predict.PredictRequest request =buildRequest(1);
    Predict.PredictResponse response = predictor.Predict(request);

}

Предиктор Поддержка многопоточности。

Как другие люди решают такие проблемы?Имеет ли для меня смысл сделать это?

1 Ответ

0 голосов
/ 04 декабря 2018

У меня была похожая проблема, и я установил приложение, обслуживающее тензор, в докер контейнер .Запросы на классификацию (в моем случае временных рядов) отправляются на обслуживание через grpc (protobuf), который является двоичным форматом.До сих пор это работало хорошо.Хотя работа с интерфейсом protobuf в java была довольно крутой фазой обучения фазы.

Но теперь я должен также обслуживать несколько моделей в различных технологиях (tenenslow, python sklearn, ...) инекоторые модели не могут обслуживаться с помощью тензорного потока.Поэтому мне нужно настроить брокерское приложение на python, которое получает запросы от java-приложения и отправляет их во многие модели.Новая приятная особенность брокера заключается в том, что теперь он может проводить голосование по результатам различных моделей и отправлять обратно только результаты голосования в java.

...