tensorflow serving api

背景介紹

 tensorflow serving 在客戶端和服務端之間的通信採用的是RPC/REST協議。在TFS提供的REST協議接口存在一定的侷限性,REST和RPC對比如下:

  • 1、REST在實際應用中不能支持運行過程動態模型發佈。
  • 2、REST預測過程中組裝報文格式複雜。
  • 3、RPC接口提供TFS的所有核心能力。

 基於以上原因且考慮我們主要使用java進行編程,因此我們必須具備能夠編譯TFS JAVA API的能力,這篇文章主要目的就是提供編譯TFS JAVA API的方法。


編譯方法

step_1 安裝protoc

 protoc 3 已經有編譯好的版本, 直接從protoc官網 下載編譯好的安裝包 protoc-3.6.1-osx-x86_64.zip, 然後將命令複製到 /usr/local/bin 即可。

cd /tmp
mv protoc-3.5.1-osx-x86_64.zip .
unzip protoc-3.5.1-osx-x86_64.zip
cd bin
cp protoc /usr/local/bin/

lebron374$ protoc --version
libprotoc 3.6.1


step_2 maven構建工程

參考TFS API編譯文章,核心操作的主要步驟都在文章裏面寫的明白。核心步驟主要是:


核心過程註解

拷貝proto文件

#!/bin/sh
SUBMODULE_PATH_TENSOR_FLOW="src/external/tensorflow"
SUBMODULE_PATH_TENSOR_SERV="src/external/tensorflow-serving"
DEST_SRC_PATH="src/main/proto"

function copy_proto_files()
{
  dest_path=$1
  src_path=$2
  cd ${src_path}
  proto_files=`find . | grep  '\.proto$' | grep -v 'host'`
  cd -
  for file in ${proto_files}
  do
    echo ${file}
    sub_file_path=`echo ${file} | awk 'BEGIN{FS=OFS="/";}{seg=$2; for(i=3; i<NF; ++i){seg=seg"/"$i;}}END{print seg;}'`
    sub_file_name=`echo ${file} | awk 'BEGIN{FS=OFS="/";}{print $NF;}'`
    src_file_name=${src_path}/${sub_file_path}/${sub_file_name}
    dest_file_path=${dest_path}/${sub_file_path}
    if [ ! -f ${dest_file_path} ]
    then
      mkdir -p ${dest_file_path}
    fi
    cp ${src_file_name} ${dest_file_path}
  done
}

copy_proto_files ${DEST_SRC_PATH} ${SUBMODULE_PATH_TENSOR_FLOW}
copy_proto_files ${DEST_SRC_PATH} ${SUBMODULE_PATH_TENSOR_SERV}

說明:

  • proto_files=find . | grep '\.proto$' | grep -v 'host'負責拷貝proto文件,實際過程中因爲編譯衝突動態排除幾個衝突的proto文件。


pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <tensor.jar.version>1.8.0-SNAPSHOT</tensor.jar.version>
    <tensor.version>1.8.0</tensor.version>
    <grpc.version>1.12.0</grpc.version>
    <protobuf.version>3.5.1</protobuf.version>
    <protobuf.plugin.version>0.5.1</protobuf.plugin.version>
  </properties>
  <groupId>tensorflow.serving</groupId>
  <artifactId>tensorflow-serving-api</artifactId>
  <version>${tensor.jar.version}</version>
  <packaging>jar</packaging>
    <distributionManagement>
        <repository>
            <id>nexus</id>
            <name>xxx nexus</name>
            <url>http://maven.repos.xxx.com/nexus/content/repositories/snapshots/</url>
        </repository>
    </distributionManagement>
  <dependencies>
    <dependency>
      <groupId>org.tensorflow</groupId>
      <artifactId>proto</artifactId>
      <version>${tensor.version}</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-netty</artifactId>
      <version>${grpc.version}</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-protobuf</artifactId>
      <version>${grpc.version}</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-stub</artifactId>
      <version>${grpc.version}</version>
    </dependency>
    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>${protobuf.version}</version>
    </dependency>
  </dependencies>
  <build>
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.6.0</version>
      </extension>
    </extensions>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.xolstice.maven.plugins</groupId>
        <artifactId>protobuf-maven-plugin</artifactId>
        <version>${protobuf.plugin.version}</version>
        <configuration>
          <protocArtifact>
            com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
          </protocArtifact>
          <pluginId>grpc-java</pluginId>
          <pluginArtifact>
            io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
          </pluginArtifact>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>compile-custom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>


參考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章