You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@submarine.apache.org by pi...@apache.org on 2022/01/16 07:45:13 UTC

[submarine] branch master updated: SUBMARINE-1173. Transfer description.json to config.pbtxt via protobuf API

This is an automated email from the ASF dual-hosted git repository.

pingsutw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/submarine.git


The following commit(s) were added to refs/heads/master by this push:
     new 6f24e75  SUBMARINE-1173. Transfer description.json to config.pbtxt via protobuf API
6f24e75 is described below

commit 6f24e75a307afbf3662efab2318cd13c3c90cca3
Author: KUAN-HSUN-LI <b0...@ntu.edu.tw>
AuthorDate: Thu Jan 13 17:44:55 2022 +0800

    SUBMARINE-1173. Transfer description.json to config.pbtxt via protobuf API
    
    ### What is this PR for?
    Serving a Pytorch model requires the `config,pbtxt` file which is generated by the protobuf. (reference: https://github.com/triton-inference-server/server/blob/main/docs/model_configuration.md)
    Copy the model_config.proto to submarine and generate the API. With this API, we can transfer our description file into its format.
    
    ### What type of PR is it?
    [Feature]
    
    ### Todos
    
    ### What is the Jira issue?
    https://issues.apache.org/jira/browse/SUBMARINE-1173
    
    ### How should this be tested?
    The test will be covered by the e2e test which will be provided in another PR.
    
    ### Screenshots (if appropriate)
    https://user-images.githubusercontent.com/38066413/148966412-0afcef60-94c0-40e4-8dd5-9ff81c82dfc0.mp4
    
    ### Questions:
    * Do the license files need updating? No
    * Are there breaking changes for older versions? No
    * Does this need new documentation? No
    
    Author: KUAN-HSUN-LI <b0...@ntu.edu.tw>
    
    Signed-off-by: Kevin <pi...@apache.org>
    
    Closes #864 from KUAN-HSUN-LI/SUBMARINE-1173 and squashes the following commits:
    
    c8880772 [KUAN-HSUN-LI] fix security issue
    b6c4c2ec [KUAN-HSUN-LI] fix security issue
    ebbc7447 [KUAN-HSUN-LI] SUBMARINE-1173. Transfer description.json to config.pbtxt
    fd7d9a5d [KUAN-HSUN-LI] SUBMARINE-1173. Generate triton model config API and setup protobuf
---
 dev-support/proto/README.md                        |    26 +
 dev-support/proto/gen-proto.sh                     |    38 +
 dev-support/proto/license-header.txt               |    18 +
 pom.xml                                            |     3 +
 submarine-dist/src/assembly/distribution.xml       |     1 -
 submarine-server/server-api/pom.xml                |     6 +
 .../server/api/proto/TritonModelConfig.java        | 64677 +++++++++++++++++++
 .../submarine/server/api/proto/model_config.proto  |  1959 +
 submarine-server/server-core/pom.xml               |    10 +-
 .../submarine/server/model/ModelManager.java       |    53 +-
 .../org/apache/submarine/server/s3/Client.java     |    19 +-
 11 files changed, 66791 insertions(+), 19 deletions(-)

diff --git a/dev-support/proto/README.md b/dev-support/proto/README.md
new file mode 100644
index 0000000..99834cd
--- /dev/null
+++ b/dev-support/proto/README.md
@@ -0,0 +1,26 @@
+<!---
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License. See accompanying LICENSE file.
+-->
+
+### installation
+```
+export PROTOC_VERSION=3.14.0
+wget https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip
+unzip protoc-${PROTOC_VERSION}-linux-x86_64.zip -d $HOME/.local
+export PATH="$PATH:$HOME/.local/bin"
+```
+
+### generate the protobuf API
+```
+./dev-support/proto/gen-proto.sh
+```
diff --git a/dev-support/proto/gen-proto.sh b/dev-support/proto/gen-proto.sh
new file mode 100755
index 0000000..54a054c
--- /dev/null
+++ b/dev-support/proto/gen-proto.sh
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -euxo pipefail
+
+FWDIR="$(cd "$(dirname "$0")"; pwd)"
+cd "$FWDIR"
+
+BASE_FOLDER=../../submarine-server/server-api/src/main/java
+PACKAGE_PATH=org/apache/submarine/server/api/proto
+
+# Please also match the setting in the proto files.
+PROTO_DIR_NAME="proto"
+protoc --java_out=${BASE_FOLDER} --proto_path=${BASE_FOLDER} ${BASE_FOLDER}/${PACKAGE_PATH}/model_config.proto
+
+echo "Insert apache license at the top of file ..."
+for filename in $(find ${BASE_FOLDER}/${PACKAGE_PATH}/*.java -type f); do
+  
+  echo "$filename"
+  cat license-header.txt "$filename" > "${filename}_tmp"
+  rm "$filename"
+  mv "${filename}_tmp" "${filename}"
+done
+
+set +euxo pipefail
\ No newline at end of file
diff --git a/dev-support/proto/license-header.txt b/dev-support/proto/license-header.txt
new file mode 100644
index 0000000..042f3ce
--- /dev/null
+++ b/dev-support/proto/license-header.txt
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
diff --git a/pom.xml b/pom.xml
index e71a798..ffd3e47 100644
--- a/pom.xml
+++ b/pom.xml
@@ -132,6 +132,7 @@
     <zeppelin.version>0.9.0-preview1</zeppelin.version>
     <jgit.version>5.13.0.202109080827-r</jgit.version>
     <atomix.version>3.1.5</atomix.version>
+    <json.version>20211205</json.version>
     <!--  Submarine on Kubernetes  -->
     <k8s.client-java.version>11.0.1</k8s.client-java.version>
     <jersey.test-framework>2.27</jersey.test-framework>
@@ -143,6 +144,8 @@
     <commons-compress.version>1.4.1</commons-compress.version>
     <guice-servlet.version>3.0</guice-servlet.version>
     <guice.version>3.0</guice.version>
+    <!--  server API  -->
+    <protobuf-java.version>3.14.0</protobuf-java.version>
   </properties>
 
   <modules>
diff --git a/submarine-dist/src/assembly/distribution.xml b/submarine-dist/src/assembly/distribution.xml
index a2b64af..9a983f7 100644
--- a/submarine-dist/src/assembly/distribution.xml
+++ b/submarine-dist/src/assembly/distribution.xml
@@ -159,7 +159,6 @@
         <exclude>submarine-commons-cluster-${project.version}.jar</exclude>
         <exclude>submarine-commons-metastore-${project.version}.jar</exclude>
         <exclude>grpc-*.jar</exclude>
-        <exclude>protobuf-java*.jar</exclude>
         <!-- mysql-connector-java uses the GPL license. So we need exclude mysql-connector-java jar -->
         <exclude>mysql-connector-java-*.jar</exclude>
         <!-- atomix & netty-4.1.27.Final already shade in submarine-commons-cluster-${project.version}-shade.jar -->
diff --git a/submarine-server/server-api/pom.xml b/submarine-server/server-api/pom.xml
index e6e2a6a..2ab3511 100644
--- a/submarine-server/server-api/pom.xml
+++ b/submarine-server/server-api/pom.xml
@@ -36,6 +36,11 @@
       <groupId>org.apache.submarine</groupId>
       <artifactId>submarine-commons-utils</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.google.protobuf</groupId>
+      <artifactId>protobuf-java</artifactId>
+      <version>${protobuf-java.version}</version>
+    </dependency>
   </dependencies>
 
   <build>
@@ -44,6 +49,7 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-checkstyle-plugin</artifactId>
         <configuration>
+          <excludes>**/proto/**</excludes>
           <skip>false</skip>
         </configuration>
       </plugin>
diff --git a/submarine-server/server-api/src/main/java/org/apache/submarine/server/api/proto/TritonModelConfig.java b/submarine-server/server-api/src/main/java/org/apache/submarine/server/api/proto/TritonModelConfig.java
new file mode 100644
index 0000000..94272ef
--- /dev/null
+++ b/submarine-server/server-api/src/main/java/org/apache/submarine/server/api/proto/TritonModelConfig.java
@@ -0,0 +1,64677 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: org/apache/submarine/server/api/proto/model_config.proto
+
+package org.apache.submarine.server.api.proto;
+
+public final class TritonModelConfig {
+  private TritonModelConfig() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  /**
+   * <pre>
+   *&#64;&#64;
+   *&#64;&#64;.. cpp:enum:: DataType
+   *&#64;&#64;
+   *&#64;&#64;   Data types supported for input and output tensors.
+   *&#64;&#64;
+   * </pre>
+   *
+   * Protobuf enum {@code inference.DataType}
+   */
+  public enum DataType
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INVALID = 0
+     * </pre>
+     *
+     * <code>TYPE_INVALID = 0;</code>
+     */
+    TYPE_INVALID(0),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::BOOL = 1
+     * </pre>
+     *
+     * <code>TYPE_BOOL = 1;</code>
+     */
+    TYPE_BOOL(1),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT8 = 2
+     * </pre>
+     *
+     * <code>TYPE_UINT8 = 2;</code>
+     */
+    TYPE_UINT8(2),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT16 = 3
+     * </pre>
+     *
+     * <code>TYPE_UINT16 = 3;</code>
+     */
+    TYPE_UINT16(3),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT32 = 4
+     * </pre>
+     *
+     * <code>TYPE_UINT32 = 4;</code>
+     */
+    TYPE_UINT32(4),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT64 = 5
+     * </pre>
+     *
+     * <code>TYPE_UINT64 = 5;</code>
+     */
+    TYPE_UINT64(5),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT8 = 6
+     * </pre>
+     *
+     * <code>TYPE_INT8 = 6;</code>
+     */
+    TYPE_INT8(6),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT16 = 7
+     * </pre>
+     *
+     * <code>TYPE_INT16 = 7;</code>
+     */
+    TYPE_INT16(7),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT32 = 8
+     * </pre>
+     *
+     * <code>TYPE_INT32 = 8;</code>
+     */
+    TYPE_INT32(8),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT64 = 9
+     * </pre>
+     *
+     * <code>TYPE_INT64 = 9;</code>
+     */
+    TYPE_INT64(9),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::FP16 = 10
+     * </pre>
+     *
+     * <code>TYPE_FP16 = 10;</code>
+     */
+    TYPE_FP16(10),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::FP32 = 11
+     * </pre>
+     *
+     * <code>TYPE_FP32 = 11;</code>
+     */
+    TYPE_FP32(11),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::FP64 = 12
+     * </pre>
+     *
+     * <code>TYPE_FP64 = 12;</code>
+     */
+    TYPE_FP64(12),
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::STRING = 13
+     * </pre>
+     *
+     * <code>TYPE_STRING = 13;</code>
+     */
+    TYPE_STRING(13),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INVALID = 0
+     * </pre>
+     *
+     * <code>TYPE_INVALID = 0;</code>
+     */
+    public static final int TYPE_INVALID_VALUE = 0;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::BOOL = 1
+     * </pre>
+     *
+     * <code>TYPE_BOOL = 1;</code>
+     */
+    public static final int TYPE_BOOL_VALUE = 1;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT8 = 2
+     * </pre>
+     *
+     * <code>TYPE_UINT8 = 2;</code>
+     */
+    public static final int TYPE_UINT8_VALUE = 2;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT16 = 3
+     * </pre>
+     *
+     * <code>TYPE_UINT16 = 3;</code>
+     */
+    public static final int TYPE_UINT16_VALUE = 3;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT32 = 4
+     * </pre>
+     *
+     * <code>TYPE_UINT32 = 4;</code>
+     */
+    public static final int TYPE_UINT32_VALUE = 4;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::UINT64 = 5
+     * </pre>
+     *
+     * <code>TYPE_UINT64 = 5;</code>
+     */
+    public static final int TYPE_UINT64_VALUE = 5;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT8 = 6
+     * </pre>
+     *
+     * <code>TYPE_INT8 = 6;</code>
+     */
+    public static final int TYPE_INT8_VALUE = 6;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT16 = 7
+     * </pre>
+     *
+     * <code>TYPE_INT16 = 7;</code>
+     */
+    public static final int TYPE_INT16_VALUE = 7;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT32 = 8
+     * </pre>
+     *
+     * <code>TYPE_INT32 = 8;</code>
+     */
+    public static final int TYPE_INT32_VALUE = 8;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::INT64 = 9
+     * </pre>
+     *
+     * <code>TYPE_INT64 = 9;</code>
+     */
+    public static final int TYPE_INT64_VALUE = 9;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::FP16 = 10
+     * </pre>
+     *
+     * <code>TYPE_FP16 = 10;</code>
+     */
+    public static final int TYPE_FP16_VALUE = 10;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::FP32 = 11
+     * </pre>
+     *
+     * <code>TYPE_FP32 = 11;</code>
+     */
+    public static final int TYPE_FP32_VALUE = 11;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::FP64 = 12
+     * </pre>
+     *
+     * <code>TYPE_FP64 = 12;</code>
+     */
+    public static final int TYPE_FP64_VALUE = 12;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:enumerator:: DataType::STRING = 13
+     * </pre>
+     *
+     * <code>TYPE_STRING = 13;</code>
+     */
+    public static final int TYPE_STRING_VALUE = 13;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static DataType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static DataType forNumber(int value) {
+      switch (value) {
+        case 0: return TYPE_INVALID;
+        case 1: return TYPE_BOOL;
+        case 2: return TYPE_UINT8;
+        case 3: return TYPE_UINT16;
+        case 4: return TYPE_UINT32;
+        case 5: return TYPE_UINT64;
+        case 6: return TYPE_INT8;
+        case 7: return TYPE_INT16;
+        case 8: return TYPE_INT32;
+        case 9: return TYPE_INT64;
+        case 10: return TYPE_FP16;
+        case 11: return TYPE_FP32;
+        case 12: return TYPE_FP64;
+        case 13: return TYPE_STRING;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<DataType>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        DataType> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<DataType>() {
+            public DataType findValueByNumber(int number) {
+              return DataType.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.getDescriptor().getEnumTypes().get(0);
+    }
+
+    private static final DataType[] VALUES = values();
+
+    public static DataType valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private DataType(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:inference.DataType)
+  }
+
+  public interface ModelRateLimiterOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:inference.ModelRateLimiter)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource> 
+        getResourcesList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource getResources(int index);
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    int getResourcesCount();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    java.util.List<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder> 
+        getResourcesOrBuilderList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder getResourcesOrBuilder(
+        int index);
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: uint32 priority
+     *&#64;&#64;
+     *&#64;&#64;     The optional weighting value to be used for prioritizing across
+     *&#64;&#64;     instances. An instance with priority 2 will be given 1/2 the
+     *&#64;&#64;     number of scheduling chances as an instance_group with priority
+     *&#64;&#64;     1. The default priority is 1. The priority of value 0 will be
+     *&#64;&#64;     treated as priority 1.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>uint32 priority = 2;</code>
+     * @return The priority.
+     */
+    int getPriority();
+  }
+  /**
+   * <pre>
+   *&#64;&#64;
+   *&#64;&#64;  .. cpp:var:: message ModelRateLimiter
+   *&#64;&#64;
+   *&#64;&#64;     The specifications required by the rate limiter to properly
+   *&#64;&#64;     schedule the inference requests across the different models
+   *&#64;&#64;     and their instances.
+   *&#64;&#64;
+   * </pre>
+   *
+   * Protobuf type {@code inference.ModelRateLimiter}
+   */
+  public static final class ModelRateLimiter extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:inference.ModelRateLimiter)
+      ModelRateLimiterOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ModelRateLimiter.newBuilder() to construct.
+    private ModelRateLimiter(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ModelRateLimiter() {
+      resources_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ModelRateLimiter();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ModelRateLimiter(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                resources_ = new java.util.ArrayList<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              resources_.add(
+                  input.readMessage(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.parser(), extensionRegistry));
+              break;
+            }
+            case 16: {
+
+              priority_ = input.readUInt32();
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          resources_ = java.util.Collections.unmodifiableList(resources_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder.class);
+    }
+
+    public interface ResourceOrBuilder extends
+        // @@protoc_insertion_point(interface_extends:inference.ModelRateLimiter.Resource)
+        com.google.protobuf.MessageOrBuilder {
+
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name associated with the resource.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The name.
+       */
+      java.lang.String getName();
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name associated with the resource.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The bytes for name.
+       */
+      com.google.protobuf.ByteString
+          getNameBytes();
+
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool global
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the resource is global. If true then the resource
+       *&#64;&#64;     is assumed to be shared among the devices otherwise specified
+       *&#64;&#64;     count of the resource is assumed for each device associated
+       *&#64;&#64;     with the instance.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool global = 2;</code>
+       * @return The global.
+       */
+      boolean getGlobal();
+
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: uint32 count
+       *&#64;&#64;
+       *&#64;&#64;     The number of resources required for the execution of the model
+       *&#64;&#64;     instance.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>uint32 count = 3;</code>
+       * @return The count.
+       */
+      int getCount();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: message Resource
+     *&#64;&#64;
+     *&#64;&#64;     The resource property.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf type {@code inference.ModelRateLimiter.Resource}
+     */
+    public static final class Resource extends
+        com.google.protobuf.GeneratedMessageV3 implements
+        // @@protoc_insertion_point(message_implements:inference.ModelRateLimiter.Resource)
+        ResourceOrBuilder {
+    private static final long serialVersionUID = 0L;
+      // Use Resource.newBuilder() to construct.
+      private Resource(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+        super(builder);
+      }
+      private Resource() {
+        name_ = "";
+      }
+
+      @java.lang.Override
+      @SuppressWarnings({"unused"})
+      protected java.lang.Object newInstance(
+          UnusedPrivateParameter unused) {
+        return new Resource();
+      }
+
+      @java.lang.Override
+      public final com.google.protobuf.UnknownFieldSet
+      getUnknownFields() {
+        return this.unknownFields;
+      }
+      private Resource(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        this();
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder();
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                java.lang.String s = input.readStringRequireUtf8();
+
+                name_ = s;
+                break;
+              }
+              case 16: {
+
+                global_ = input.readBool();
+                break;
+              }
+              case 24: {
+
+                count_ = input.readUInt32();
+                break;
+              }
+              default: {
+                if (!parseUnknownField(
+                    input, unknownFields, extensionRegistry, tag)) {
+                  done = true;
+                }
+                break;
+              }
+            }
+          }
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(this);
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(
+              e).setUnfinishedMessage(this);
+        } finally {
+          this.unknownFields = unknownFields.build();
+          makeExtensionsImmutable();
+        }
+      }
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_Resource_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_Resource_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder.class);
+      }
+
+      public static final int NAME_FIELD_NUMBER = 1;
+      private volatile java.lang.Object name_;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name associated with the resource.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The name.
+       */
+      @java.lang.Override
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof java.lang.String) {
+          return (java.lang.String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name associated with the resource.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The bytes for name.
+       */
+      @java.lang.Override
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof java.lang.String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+
+      public static final int GLOBAL_FIELD_NUMBER = 2;
+      private boolean global_;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool global
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the resource is global. If true then the resource
+       *&#64;&#64;     is assumed to be shared among the devices otherwise specified
+       *&#64;&#64;     count of the resource is assumed for each device associated
+       *&#64;&#64;     with the instance.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool global = 2;</code>
+       * @return The global.
+       */
+      @java.lang.Override
+      public boolean getGlobal() {
+        return global_;
+      }
+
+      public static final int COUNT_FIELD_NUMBER = 3;
+      private int count_;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: uint32 count
+       *&#64;&#64;
+       *&#64;&#64;     The number of resources required for the execution of the model
+       *&#64;&#64;     instance.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>uint32 count = 3;</code>
+       * @return The count.
+       */
+      @java.lang.Override
+      public int getCount() {
+        return count_;
+      }
+
+      private byte memoizedIsInitialized = -1;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized == 1) return true;
+        if (isInitialized == 0) return false;
+
+        memoizedIsInitialized = 1;
+        return true;
+      }
+
+      @java.lang.Override
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        if (!getNameBytes().isEmpty()) {
+          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+        }
+        if (global_ != false) {
+          output.writeBool(2, global_);
+        }
+        if (count_ != 0) {
+          output.writeUInt32(3, count_);
+        }
+        unknownFields.writeTo(output);
+      }
+
+      @java.lang.Override
+      public int getSerializedSize() {
+        int size = memoizedSize;
+        if (size != -1) return size;
+
+        size = 0;
+        if (!getNameBytes().isEmpty()) {
+          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+        }
+        if (global_ != false) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBoolSize(2, global_);
+        }
+        if (count_ != 0) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeUInt32Size(3, count_);
+        }
+        size += unknownFields.getSerializedSize();
+        memoizedSize = size;
+        return size;
+      }
+
+      @java.lang.Override
+      public boolean equals(final java.lang.Object obj) {
+        if (obj == this) {
+         return true;
+        }
+        if (!(obj instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource)) {
+          return super.equals(obj);
+        }
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource other = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource) obj;
+
+        if (!getName()
+            .equals(other.getName())) return false;
+        if (getGlobal()
+            != other.getGlobal()) return false;
+        if (getCount()
+            != other.getCount()) return false;
+        if (!unknownFields.equals(other.unknownFields)) return false;
+        return true;
+      }
+
+      @java.lang.Override
+      public int hashCode() {
+        if (memoizedHashCode != 0) {
+          return memoizedHashCode;
+        }
+        int hash = 41;
+        hash = (19 * hash) + getDescriptor().hashCode();
+        hash = (37 * hash) + NAME_FIELD_NUMBER;
+        hash = (53 * hash) + getName().hashCode();
+        hash = (37 * hash) + GLOBAL_FIELD_NUMBER;
+        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+            getGlobal());
+        hash = (37 * hash) + COUNT_FIELD_NUMBER;
+        hash = (53 * hash) + getCount();
+        hash = (29 * hash) + unknownFields.hashCode();
+        memoizedHashCode = hash;
+        return hash;
+      }
+
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          java.nio.ByteBuffer data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          java.nio.ByteBuffer data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+
+      @java.lang.Override
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder() {
+        return DEFAULT_INSTANCE.toBuilder();
+      }
+      public static Builder newBuilder(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource prototype) {
+        return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+      }
+      @java.lang.Override
+      public Builder toBuilder() {
+        return this == DEFAULT_INSTANCE
+            ? new Builder() : new Builder().mergeFrom(this);
+      }
+
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: message Resource
+       *&#64;&#64;
+       *&#64;&#64;     The resource property.
+       *&#64;&#64;
+       * </pre>
+       *
+       * Protobuf type {@code inference.ModelRateLimiter.Resource}
+       */
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+          // @@protoc_insertion_point(builder_implements:inference.ModelRateLimiter.Resource)
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_Resource_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_Resource_fieldAccessorTable
+              .ensureFieldAccessorsInitialized(
+                  org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder.class);
+        }
+
+        // Construct using org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+
+        private Builder(
+            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessageV3
+                  .alwaysUseFieldBuilders) {
+          }
+        }
+        @java.lang.Override
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+
+          global_ = false;
+
+          count_ = 0;
+
+          return this;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_Resource_descriptor;
+        }
+
+        @java.lang.Override
+        public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource getDefaultInstanceForType() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.getDefaultInstance();
+        }
+
+        @java.lang.Override
+        public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource build() {
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+
+        @java.lang.Override
+        public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource buildPartial() {
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource result = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource(this);
+          result.name_ = name_;
+          result.global_ = global_;
+          result.count_ = count_;
+          onBuilt();
+          return result;
+        }
+
+        @java.lang.Override
+        public Builder clone() {
+          return super.clone();
+        }
+        @java.lang.Override
+        public Builder setField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            java.lang.Object value) {
+          return super.setField(field, value);
+        }
+        @java.lang.Override
+        public Builder clearField(
+            com.google.protobuf.Descriptors.FieldDescriptor field) {
+          return super.clearField(field);
+        }
+        @java.lang.Override
+        public Builder clearOneof(
+            com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+          return super.clearOneof(oneof);
+        }
+        @java.lang.Override
+        public Builder setRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            int index, java.lang.Object value) {
+          return super.setRepeatedField(field, index, value);
+        }
+        @java.lang.Override
+        public Builder addRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            java.lang.Object value) {
+          return super.addRepeatedField(field, value);
+        }
+        @java.lang.Override
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource) {
+            return mergeFrom((org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+
+        public Builder mergeFrom(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource other) {
+          if (other == org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.getDefaultInstance()) return this;
+          if (!other.getName().isEmpty()) {
+            name_ = other.name_;
+            onChanged();
+          }
+          if (other.getGlobal() != false) {
+            setGlobal(other.getGlobal());
+          }
+          if (other.getCount() != 0) {
+            setCount(other.getCount());
+          }
+          this.mergeUnknownFields(other.unknownFields);
+          onChanged();
+          return this;
+        }
+
+        @java.lang.Override
+        public final boolean isInitialized() {
+          return true;
+        }
+
+        @java.lang.Override
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource parsedMessage = null;
+          try {
+            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            parsedMessage = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource) e.getUnfinishedMessage();
+            throw e.unwrapIOException();
+          } finally {
+            if (parsedMessage != null) {
+              mergeFrom(parsedMessage);
+            }
+          }
+          return this;
+        }
+
+        private java.lang.Object name_ = "";
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: string name
+         *&#64;&#64;
+         *&#64;&#64;     The name associated with the resource.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>string name = 1;</code>
+         * @return The name.
+         */
+        public java.lang.String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof java.lang.String)) {
+            com.google.protobuf.ByteString bs =
+                (com.google.protobuf.ByteString) ref;
+            java.lang.String s = bs.toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (java.lang.String) ref;
+          }
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: string name
+         *&#64;&#64;
+         *&#64;&#64;     The name associated with the resource.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>string name = 1;</code>
+         * @return The bytes for name.
+         */
+        public com.google.protobuf.ByteString
+            getNameBytes() {
+          java.lang.Object ref = name_;
+          if (ref instanceof String) {
+            com.google.protobuf.ByteString b = 
+                com.google.protobuf.ByteString.copyFromUtf8(
+                    (java.lang.String) ref);
+            name_ = b;
+            return b;
+          } else {
+            return (com.google.protobuf.ByteString) ref;
+          }
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: string name
+         *&#64;&#64;
+         *&#64;&#64;     The name associated with the resource.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>string name = 1;</code>
+         * @param value The name to set.
+         * @return This builder for chaining.
+         */
+        public Builder setName(
+            java.lang.String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: string name
+         *&#64;&#64;
+         *&#64;&#64;     The name associated with the resource.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>string name = 1;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearName() {
+          
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: string name
+         *&#64;&#64;
+         *&#64;&#64;     The name associated with the resource.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>string name = 1;</code>
+         * @param value The bytes for name to set.
+         * @return This builder for chaining.
+         */
+        public Builder setNameBytes(
+            com.google.protobuf.ByteString value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+          
+          name_ = value;
+          onChanged();
+          return this;
+        }
+
+        private boolean global_ ;
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: bool global
+         *&#64;&#64;
+         *&#64;&#64;     Whether or not the resource is global. If true then the resource
+         *&#64;&#64;     is assumed to be shared among the devices otherwise specified
+         *&#64;&#64;     count of the resource is assumed for each device associated
+         *&#64;&#64;     with the instance.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>bool global = 2;</code>
+         * @return The global.
+         */
+        @java.lang.Override
+        public boolean getGlobal() {
+          return global_;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: bool global
+         *&#64;&#64;
+         *&#64;&#64;     Whether or not the resource is global. If true then the resource
+         *&#64;&#64;     is assumed to be shared among the devices otherwise specified
+         *&#64;&#64;     count of the resource is assumed for each device associated
+         *&#64;&#64;     with the instance.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>bool global = 2;</code>
+         * @param value The global to set.
+         * @return This builder for chaining.
+         */
+        public Builder setGlobal(boolean value) {
+          
+          global_ = value;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: bool global
+         *&#64;&#64;
+         *&#64;&#64;     Whether or not the resource is global. If true then the resource
+         *&#64;&#64;     is assumed to be shared among the devices otherwise specified
+         *&#64;&#64;     count of the resource is assumed for each device associated
+         *&#64;&#64;     with the instance.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>bool global = 2;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearGlobal() {
+          
+          global_ = false;
+          onChanged();
+          return this;
+        }
+
+        private int count_ ;
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: uint32 count
+         *&#64;&#64;
+         *&#64;&#64;     The number of resources required for the execution of the model
+         *&#64;&#64;     instance.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>uint32 count = 3;</code>
+         * @return The count.
+         */
+        @java.lang.Override
+        public int getCount() {
+          return count_;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: uint32 count
+         *&#64;&#64;
+         *&#64;&#64;     The number of resources required for the execution of the model
+         *&#64;&#64;     instance.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>uint32 count = 3;</code>
+         * @param value The count to set.
+         * @return This builder for chaining.
+         */
+        public Builder setCount(int value) {
+          
+          count_ = value;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: uint32 count
+         *&#64;&#64;
+         *&#64;&#64;     The number of resources required for the execution of the model
+         *&#64;&#64;     instance.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>uint32 count = 3;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearCount() {
+          
+          count_ = 0;
+          onChanged();
+          return this;
+        }
+        @java.lang.Override
+        public final Builder setUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.setUnknownFields(unknownFields);
+        }
+
+        @java.lang.Override
+        public final Builder mergeUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.mergeUnknownFields(unknownFields);
+        }
+
+
+        // @@protoc_insertion_point(builder_scope:inference.ModelRateLimiter.Resource)
+      }
+
+      // @@protoc_insertion_point(class_scope:inference.ModelRateLimiter.Resource)
+      private static final org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource DEFAULT_INSTANCE;
+      static {
+        DEFAULT_INSTANCE = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource();
+      }
+
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource getDefaultInstance() {
+        return DEFAULT_INSTANCE;
+      }
+
+      private static final com.google.protobuf.Parser<Resource>
+          PARSER = new com.google.protobuf.AbstractParser<Resource>() {
+        @java.lang.Override
+        public Resource parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return new Resource(input, extensionRegistry);
+        }
+      };
+
+      public static com.google.protobuf.Parser<Resource> parser() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Parser<Resource> getParserForType() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource getDefaultInstanceForType() {
+        return DEFAULT_INSTANCE;
+      }
+
+    }
+
+    public static final int RESOURCES_FIELD_NUMBER = 1;
+    private java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource> resources_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource> getResourcesList() {
+      return resources_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder> 
+        getResourcesOrBuilderList() {
+      return resources_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    @java.lang.Override
+    public int getResourcesCount() {
+      return resources_.size();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource getResources(int index) {
+      return resources_.get(index);
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The resources required to execute the request on a model instance.
+     *&#64;&#64;     Resources are just names with a corresponding count. The execution
+     *&#64;&#64;     of the instance will be blocked until the specificied resources are
+     *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder getResourcesOrBuilder(
+        int index) {
+      return resources_.get(index);
+    }
+
+    public static final int PRIORITY_FIELD_NUMBER = 2;
+    private int priority_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: uint32 priority
+     *&#64;&#64;
+     *&#64;&#64;     The optional weighting value to be used for prioritizing across
+     *&#64;&#64;     instances. An instance with priority 2 will be given 1/2 the
+     *&#64;&#64;     number of scheduling chances as an instance_group with priority
+     *&#64;&#64;     1. The default priority is 1. The priority of value 0 will be
+     *&#64;&#64;     treated as priority 1.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>uint32 priority = 2;</code>
+     * @return The priority.
+     */
+    @java.lang.Override
+    public int getPriority() {
+      return priority_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < resources_.size(); i++) {
+        output.writeMessage(1, resources_.get(i));
+      }
+      if (priority_ != 0) {
+        output.writeUInt32(2, priority_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < resources_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, resources_.get(i));
+      }
+      if (priority_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(2, priority_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter)) {
+        return super.equals(obj);
+      }
+      org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter other = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter) obj;
+
+      if (!getResourcesList()
+          .equals(other.getResourcesList())) return false;
+      if (getPriority()
+          != other.getPriority()) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getResourcesCount() > 0) {
+        hash = (37 * hash) + RESOURCES_FIELD_NUMBER;
+        hash = (53 * hash) + getResourcesList().hashCode();
+      }
+      hash = (37 * hash) + PRIORITY_FIELD_NUMBER;
+      hash = (53 * hash) + getPriority();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;
+     *&#64;&#64;  .. cpp:var:: message ModelRateLimiter
+     *&#64;&#64;
+     *&#64;&#64;     The specifications required by the rate limiter to properly
+     *&#64;&#64;     schedule the inference requests across the different models
+     *&#64;&#64;     and their instances.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf type {@code inference.ModelRateLimiter}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:inference.ModelRateLimiter)
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiterOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder.class);
+      }
+
+      // Construct using org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getResourcesFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (resourcesBuilder_ == null) {
+          resources_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          resourcesBuilder_.clear();
+        }
+        priority_ = 0;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelRateLimiter_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter getDefaultInstanceForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter build() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter buildPartial() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter result = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter(this);
+        int from_bitField0_ = bitField0_;
+        if (resourcesBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            resources_ = java.util.Collections.unmodifiableList(resources_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.resources_ = resources_;
+        } else {
+          result.resources_ = resourcesBuilder_.build();
+        }
+        result.priority_ = priority_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter) {
+          return mergeFrom((org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter other) {
+        if (other == org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.getDefaultInstance()) return this;
+        if (resourcesBuilder_ == null) {
+          if (!other.resources_.isEmpty()) {
+            if (resources_.isEmpty()) {
+              resources_ = other.resources_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureResourcesIsMutable();
+              resources_.addAll(other.resources_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.resources_.isEmpty()) {
+            if (resourcesBuilder_.isEmpty()) {
+              resourcesBuilder_.dispose();
+              resourcesBuilder_ = null;
+              resources_ = other.resources_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              resourcesBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getResourcesFieldBuilder() : null;
+            } else {
+              resourcesBuilder_.addAllMessages(other.resources_);
+            }
+          }
+        }
+        if (other.getPriority() != 0) {
+          setPriority(other.getPriority());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource> resources_ =
+        java.util.Collections.emptyList();
+      private void ensureResourcesIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          resources_ = new java.util.ArrayList<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource>(resources_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder> resourcesBuilder_;
+
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource> getResourcesList() {
+        if (resourcesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(resources_);
+        } else {
+          return resourcesBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public int getResourcesCount() {
+        if (resourcesBuilder_ == null) {
+          return resources_.size();
+        } else {
+          return resourcesBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource getResources(int index) {
+        if (resourcesBuilder_ == null) {
+          return resources_.get(index);
+        } else {
+          return resourcesBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder setResources(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource value) {
+        if (resourcesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureResourcesIsMutable();
+          resources_.set(index, value);
+          onChanged();
+        } else {
+          resourcesBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder setResources(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder builderForValue) {
+        if (resourcesBuilder_ == null) {
+          ensureResourcesIsMutable();
+          resources_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          resourcesBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder addResources(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource value) {
+        if (resourcesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureResourcesIsMutable();
+          resources_.add(value);
+          onChanged();
+        } else {
+          resourcesBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder addResources(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource value) {
+        if (resourcesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureResourcesIsMutable();
+          resources_.add(index, value);
+          onChanged();
+        } else {
+          resourcesBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder addResources(
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder builderForValue) {
+        if (resourcesBuilder_ == null) {
+          ensureResourcesIsMutable();
+          resources_.add(builderForValue.build());
+          onChanged();
+        } else {
+          resourcesBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder addResources(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder builderForValue) {
+        if (resourcesBuilder_ == null) {
+          ensureResourcesIsMutable();
+          resources_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          resourcesBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder addAllResources(
+          java.lang.Iterable<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource> values) {
+        if (resourcesBuilder_ == null) {
+          ensureResourcesIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, resources_);
+          onChanged();
+        } else {
+          resourcesBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder clearResources() {
+        if (resourcesBuilder_ == null) {
+          resources_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          resourcesBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public Builder removeResources(int index) {
+        if (resourcesBuilder_ == null) {
+          ensureResourcesIsMutable();
+          resources_.remove(index);
+          onChanged();
+        } else {
+          resourcesBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder getResourcesBuilder(
+          int index) {
+        return getResourcesFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder getResourcesOrBuilder(
+          int index) {
+        if (resourcesBuilder_ == null) {
+          return resources_.get(index);  } else {
+          return resourcesBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public java.util.List<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder> 
+           getResourcesOrBuilderList() {
+        if (resourcesBuilder_ != null) {
+          return resourcesBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(resources_);
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder addResourcesBuilder() {
+        return getResourcesFieldBuilder().addBuilder(
+            org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder addResourcesBuilder(
+          int index) {
+        return getResourcesFieldBuilder().addBuilder(
+            index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Resource resources (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The resources required to execute the request on a model instance.
+       *&#64;&#64;     Resources are just names with a corresponding count. The execution
+       *&#64;&#64;     of the instance will be blocked until the specificied resources are
+       *&#64;&#64;     available. By default an instance uses no rate-limiter resources.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelRateLimiter.Resource resources = 1;</code>
+       */
+      public java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder> 
+           getResourcesBuilderList() {
+        return getResourcesFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder> 
+          getResourcesFieldBuilder() {
+        if (resourcesBuilder_ == null) {
+          resourcesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Resource.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.ResourceOrBuilder>(
+                  resources_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          resources_ = null;
+        }
+        return resourcesBuilder_;
+      }
+
+      private int priority_ ;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: uint32 priority
+       *&#64;&#64;
+       *&#64;&#64;     The optional weighting value to be used for prioritizing across
+       *&#64;&#64;     instances. An instance with priority 2 will be given 1/2 the
+       *&#64;&#64;     number of scheduling chances as an instance_group with priority
+       *&#64;&#64;     1. The default priority is 1. The priority of value 0 will be
+       *&#64;&#64;     treated as priority 1.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>uint32 priority = 2;</code>
+       * @return The priority.
+       */
+      @java.lang.Override
+      public int getPriority() {
+        return priority_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: uint32 priority
+       *&#64;&#64;
+       *&#64;&#64;     The optional weighting value to be used for prioritizing across
+       *&#64;&#64;     instances. An instance with priority 2 will be given 1/2 the
+       *&#64;&#64;     number of scheduling chances as an instance_group with priority
+       *&#64;&#64;     1. The default priority is 1. The priority of value 0 will be
+       *&#64;&#64;     treated as priority 1.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>uint32 priority = 2;</code>
+       * @param value The priority to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPriority(int value) {
+        
+        priority_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: uint32 priority
+       *&#64;&#64;
+       *&#64;&#64;     The optional weighting value to be used for prioritizing across
+       *&#64;&#64;     instances. An instance with priority 2 will be given 1/2 the
+       *&#64;&#64;     number of scheduling chances as an instance_group with priority
+       *&#64;&#64;     1. The default priority is 1. The priority of value 0 will be
+       *&#64;&#64;     treated as priority 1.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>uint32 priority = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearPriority() {
+        
+        priority_ = 0;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:inference.ModelRateLimiter)
+    }
+
+    // @@protoc_insertion_point(class_scope:inference.ModelRateLimiter)
+    private static final org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter();
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ModelRateLimiter>
+        PARSER = new com.google.protobuf.AbstractParser<ModelRateLimiter>() {
+      @java.lang.Override
+      public ModelRateLimiter parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ModelRateLimiter(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<ModelRateLimiter> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ModelRateLimiter> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ModelInstanceGroupOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:inference.ModelInstanceGroup)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     Optional name of this group of instances. If not specified the
+     *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+     *&#64;&#64;     individual instances will be further formed by a unique instance
+     *&#64;&#64;     number and GPU index:
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     Optional name of this group of instances. If not specified the
+     *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+     *&#64;&#64;     individual instances will be further formed by a unique instance
+     *&#64;&#64;     number and GPU index:
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Kind kind
+     *&#64;&#64;
+     *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+     *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+     *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+     *&#64;&#64;     and 'gpu' cannot be specified.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+     * @return The enum numeric value on the wire for kind.
+     */
+    int getKindValue();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Kind kind
+     *&#64;&#64;
+     *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+     *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+     *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+     *&#64;&#64;     and 'gpu' cannot be specified.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+     * @return The kind.
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind getKind();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 count
+     *&#64;&#64;
+     *&#64;&#64;     For a group assigned to GPU, the number of instances created for
+     *&#64;&#64;     each GPU listed in 'gpus'. For a group assigned to CPU the number
+     *&#64;&#64;     of instances created. Default is 1.
+     * </pre>
+     *
+     * <code>int32 count = 2;</code>
+     * @return The count.
+     */
+    int getCount();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+     *&#64;&#64;
+     *&#64;&#64;     The rate limiter specific settings to be associated with this
+     *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+     *&#64;&#64;     will be applied to this instance group.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+     * @return Whether the rateLimiter field is set.
+     */
+    boolean hasRateLimiter();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+     *&#64;&#64;
+     *&#64;&#64;     The rate limiter specific settings to be associated with this
+     *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+     *&#64;&#64;     will be applied to this instance group.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+     * @return The rateLimiter.
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter getRateLimiter();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+     *&#64;&#64;
+     *&#64;&#64;     The rate limiter specific settings to be associated with this
+     *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+     *&#64;&#64;     will be applied to this instance group.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiterOrBuilder getRateLimiterOrBuilder();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+     *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+     *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+     *&#64;&#64;     available GPUs.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int32 gpus = 3;</code>
+     * @return A list containing the gpus.
+     */
+    java.util.List<java.lang.Integer> getGpusList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+     *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+     *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+     *&#64;&#64;     available GPUs.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int32 gpus = 3;</code>
+     * @return The count of gpus.
+     */
+    int getGpusCount();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+     *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+     *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+     *&#64;&#64;     available GPUs.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int32 gpus = 3;</code>
+     * @param index The index of the element to return.
+     * @return The gpus at the given index.
+     */
+    int getGpus(int index);
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice> 
+        getSecondaryDevicesList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice getSecondaryDevices(int index);
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    int getSecondaryDevicesCount();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    java.util.List<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder> 
+        getSecondaryDevicesOrBuilderList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder getSecondaryDevicesOrBuilder(
+        int index);
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @return A list containing the profile.
+     */
+    java.util.List<java.lang.String>
+        getProfileList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @return The count of profile.
+     */
+    int getProfileCount();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @param index The index of the element to return.
+     * @return The profile at the given index.
+     */
+    java.lang.String getProfile(int index);
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the profile at the given index.
+     */
+    com.google.protobuf.ByteString
+        getProfileBytes(int index);
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool passive
+     *&#64;&#64;
+     *&#64;&#64;     Whether the instances within this instance group will be accepting
+     *&#64;&#64;     inference requests from the scheduler. If true, the instances will
+     *&#64;&#64;     not be added to the scheduler. Default value is false.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool passive = 7;</code>
+     * @return The passive.
+     */
+    boolean getPassive();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string host_policy
+     *&#64;&#64;
+     *&#64;&#64;     The host policy name that the instance to be associated with.
+     *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+     *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+     *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string host_policy = 9;</code>
+     * @return The hostPolicy.
+     */
+    java.lang.String getHostPolicy();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string host_policy
+     *&#64;&#64;
+     *&#64;&#64;     The host policy name that the instance to be associated with.
+     *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+     *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+     *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string host_policy = 9;</code>
+     * @return The bytes for hostPolicy.
+     */
+    com.google.protobuf.ByteString
+        getHostPolicyBytes();
+  }
+  /**
+   * <pre>
+   *&#64;&#64;
+   *&#64;&#64;.. cpp:var:: message ModelInstanceGroup
+   *&#64;&#64;
+   *&#64;&#64;   A group of one or more instances of a model and resources made
+   *&#64;&#64;   available for those instances.
+   *&#64;&#64;
+   * </pre>
+   *
+   * Protobuf type {@code inference.ModelInstanceGroup}
+   */
+  public static final class ModelInstanceGroup extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:inference.ModelInstanceGroup)
+      ModelInstanceGroupOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ModelInstanceGroup.newBuilder() to construct.
+    private ModelInstanceGroup(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ModelInstanceGroup() {
+      name_ = "";
+      kind_ = 0;
+      gpus_ = emptyIntList();
+      secondaryDevices_ = java.util.Collections.emptyList();
+      profile_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      hostPolicy_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ModelInstanceGroup();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ModelInstanceGroup(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              name_ = s;
+              break;
+            }
+            case 16: {
+
+              count_ = input.readInt32();
+              break;
+            }
+            case 24: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                gpus_ = newIntList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              gpus_.addInt(input.readInt32());
+              break;
+            }
+            case 26: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+                gpus_ = newIntList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              while (input.getBytesUntilLimit() > 0) {
+                gpus_.addInt(input.readInt32());
+              }
+              input.popLimit(limit);
+              break;
+            }
+            case 32: {
+              int rawValue = input.readEnum();
+
+              kind_ = rawValue;
+              break;
+            }
+            case 42: {
+              java.lang.String s = input.readStringRequireUtf8();
+              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                profile_ = new com.google.protobuf.LazyStringArrayList();
+                mutable_bitField0_ |= 0x00000004;
+              }
+              profile_.add(s);
+              break;
+            }
+            case 50: {
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder subBuilder = null;
+              if (rateLimiter_ != null) {
+                subBuilder = rateLimiter_.toBuilder();
+              }
+              rateLimiter_ = input.readMessage(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(rateLimiter_);
+                rateLimiter_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 56: {
+
+              passive_ = input.readBool();
+              break;
+            }
+            case 66: {
+              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                secondaryDevices_ = new java.util.ArrayList<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice>();
+                mutable_bitField0_ |= 0x00000002;
+              }
+              secondaryDevices_.add(
+                  input.readMessage(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.parser(), extensionRegistry));
+              break;
+            }
+            case 74: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              hostPolicy_ = s;
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          gpus_.makeImmutable(); // C
+        }
+        if (((mutable_bitField0_ & 0x00000004) != 0)) {
+          profile_ = profile_.getUnmodifiableView();
+        }
+        if (((mutable_bitField0_ & 0x00000002) != 0)) {
+          secondaryDevices_ = java.util.Collections.unmodifiableList(secondaryDevices_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Builder.class);
+    }
+
+    /**
+     * <pre>
+     *&#64;&#64;
+     *&#64;&#64;  .. cpp:enum:: Kind
+     *&#64;&#64;
+     *&#64;&#64;     Kind of this instance group.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf enum {@code inference.ModelInstanceGroup.Kind}
+     */
+    public enum Kind
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_AUTO = 0
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that can run on either
+       *&#64;&#64;       CPU or GPU. If all GPUs listed in 'gpus' are available then
+       *&#64;&#64;       instances will be created on GPU(s), otherwise instances will
+       *&#64;&#64;       be created on CPU.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_AUTO = 0;</code>
+       */
+      KIND_AUTO(0),
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_GPU = 1
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that must run on the
+       *&#64;&#64;       GPU.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_GPU = 1;</code>
+       */
+      KIND_GPU(1),
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_CPU = 2
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that must run on the
+       *&#64;&#64;       CPU.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_CPU = 2;</code>
+       */
+      KIND_CPU(2),
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_MODEL = 3
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that should run on the
+       *&#64;&#64;       CPU and/or GPU(s) as specified by the model or backend itself.
+       *&#64;&#64;       The inference server will not override the model/backend
+       *&#64;&#64;       settings.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_MODEL = 3;</code>
+       */
+      KIND_MODEL(3),
+      UNRECOGNIZED(-1),
+      ;
+
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_AUTO = 0
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that can run on either
+       *&#64;&#64;       CPU or GPU. If all GPUs listed in 'gpus' are available then
+       *&#64;&#64;       instances will be created on GPU(s), otherwise instances will
+       *&#64;&#64;       be created on CPU.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_AUTO = 0;</code>
+       */
+      public static final int KIND_AUTO_VALUE = 0;
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_GPU = 1
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that must run on the
+       *&#64;&#64;       GPU.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_GPU = 1;</code>
+       */
+      public static final int KIND_GPU_VALUE = 1;
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_CPU = 2
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that must run on the
+       *&#64;&#64;       CPU.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_CPU = 2;</code>
+       */
+      public static final int KIND_CPU_VALUE = 2;
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Kind::KIND_MODEL = 3
+       *&#64;&#64;
+       *&#64;&#64;       This instance group represents instances that should run on the
+       *&#64;&#64;       CPU and/or GPU(s) as specified by the model or backend itself.
+       *&#64;&#64;       The inference server will not override the model/backend
+       *&#64;&#64;       settings.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>KIND_MODEL = 3;</code>
+       */
+      public static final int KIND_MODEL_VALUE = 3;
+
+
+      public final int getNumber() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalArgumentException(
+              "Can't get the number of an unknown enum value.");
+        }
+        return value;
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static Kind valueOf(int value) {
+        return forNumber(value);
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       */
+      public static Kind forNumber(int value) {
+        switch (value) {
+          case 0: return KIND_AUTO;
+          case 1: return KIND_GPU;
+          case 2: return KIND_CPU;
+          case 3: return KIND_MODEL;
+          default: return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap<Kind>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static final com.google.protobuf.Internal.EnumLiteMap<
+          Kind> internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<Kind>() {
+              public Kind findValueByNumber(int number) {
+                return Kind.forNumber(number);
+              }
+            };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalStateException(
+              "Can't get the descriptor of an unrecognized enum value.");
+        }
+        return getDescriptor().getValues().get(ordinal());
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final Kind[] VALUES = values();
+
+      public static Kind valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        if (desc.getIndex() == -1) {
+          return UNRECOGNIZED;
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int value;
+
+      private Kind(int value) {
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:inference.ModelInstanceGroup.Kind)
+    }
+
+    public interface SecondaryDeviceOrBuilder extends
+        // @@protoc_insertion_point(interface_extends:inference.ModelInstanceGroup.SecondaryDevice)
+        com.google.protobuf.MessageOrBuilder {
+
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+       *&#64;&#64;
+       *&#64;&#64;     The secondary device kind.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+       * @return The enum numeric value on the wire for kind.
+       */
+      int getKindValue();
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+       *&#64;&#64;
+       *&#64;&#64;     The secondary device kind.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+       * @return The kind.
+       */
+      org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind getKind();
+
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 device_id
+       *&#64;&#64;
+       *&#64;&#64;     Identifier for the secondary device.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>int64 device_id = 2;</code>
+       * @return The deviceId.
+       */
+      long getDeviceId();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;
+     *&#64;&#64;  .. cpp:var:: message SecondaryDevice
+     *&#64;&#64;
+     *&#64;&#64;     A secondary device required for a model instance.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf type {@code inference.ModelInstanceGroup.SecondaryDevice}
+     */
+    public static final class SecondaryDevice extends
+        com.google.protobuf.GeneratedMessageV3 implements
+        // @@protoc_insertion_point(message_implements:inference.ModelInstanceGroup.SecondaryDevice)
+        SecondaryDeviceOrBuilder {
+    private static final long serialVersionUID = 0L;
+      // Use SecondaryDevice.newBuilder() to construct.
+      private SecondaryDevice(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+        super(builder);
+      }
+      private SecondaryDevice() {
+        kind_ = 0;
+      }
+
+      @java.lang.Override
+      @SuppressWarnings({"unused"})
+      protected java.lang.Object newInstance(
+          UnusedPrivateParameter unused) {
+        return new SecondaryDevice();
+      }
+
+      @java.lang.Override
+      public final com.google.protobuf.UnknownFieldSet
+      getUnknownFields() {
+        return this.unknownFields;
+      }
+      private SecondaryDevice(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        this();
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder();
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                int rawValue = input.readEnum();
+
+                kind_ = rawValue;
+                break;
+              }
+              case 16: {
+
+                deviceId_ = input.readInt64();
+                break;
+              }
+              default: {
+                if (!parseUnknownField(
+                    input, unknownFields, extensionRegistry, tag)) {
+                  done = true;
+                }
+                break;
+              }
+            }
+          }
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(this);
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(
+              e).setUnfinishedMessage(this);
+        } finally {
+          this.unknownFields = unknownFields.build();
+          makeExtensionsImmutable();
+        }
+      }
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_SecondaryDevice_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_SecondaryDevice_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder.class);
+      }
+
+      /**
+       * <pre>
+       *&#64;&#64;
+       *&#64;&#64;  .. cpp:enum:: SecondaryDeviceKind
+       *&#64;&#64;
+       *&#64;&#64;     The kind of the secondary device.
+       *&#64;&#64;
+       * </pre>
+       *
+       * Protobuf enum {@code inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind}
+       */
+      public enum SecondaryDeviceKind
+          implements com.google.protobuf.ProtocolMessageEnum {
+        /**
+         * <pre>
+         *&#64;&#64;    .. cpp:enumerator:: SecondaryDeviceKind::KIND_NVDLA = 0
+         *&#64;&#64;
+         *&#64;&#64;       An NVDLA core. http://nvdla.org
+         *&#64;&#64;       Currently KIND_NVDLA is only supported by the TensorRT backend.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>KIND_NVDLA = 0;</code>
+         */
+        KIND_NVDLA(0),
+        UNRECOGNIZED(-1),
+        ;
+
+        /**
+         * <pre>
+         *&#64;&#64;    .. cpp:enumerator:: SecondaryDeviceKind::KIND_NVDLA = 0
+         *&#64;&#64;
+         *&#64;&#64;       An NVDLA core. http://nvdla.org
+         *&#64;&#64;       Currently KIND_NVDLA is only supported by the TensorRT backend.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>KIND_NVDLA = 0;</code>
+         */
+        public static final int KIND_NVDLA_VALUE = 0;
+
+
+        public final int getNumber() {
+          if (this == UNRECOGNIZED) {
+            throw new java.lang.IllegalArgumentException(
+                "Can't get the number of an unknown enum value.");
+          }
+          return value;
+        }
+
+        /**
+         * @param value The numeric wire value of the corresponding enum entry.
+         * @return The enum associated with the given numeric wire value.
+         * @deprecated Use {@link #forNumber(int)} instead.
+         */
+        @java.lang.Deprecated
+        public static SecondaryDeviceKind valueOf(int value) {
+          return forNumber(value);
+        }
+
+        /**
+         * @param value The numeric wire value of the corresponding enum entry.
+         * @return The enum associated with the given numeric wire value.
+         */
+        public static SecondaryDeviceKind forNumber(int value) {
+          switch (value) {
+            case 0: return KIND_NVDLA;
+            default: return null;
+          }
+        }
+
+        public static com.google.protobuf.Internal.EnumLiteMap<SecondaryDeviceKind>
+            internalGetValueMap() {
+          return internalValueMap;
+        }
+        private static final com.google.protobuf.Internal.EnumLiteMap<
+            SecondaryDeviceKind> internalValueMap =
+              new com.google.protobuf.Internal.EnumLiteMap<SecondaryDeviceKind>() {
+                public SecondaryDeviceKind findValueByNumber(int number) {
+                  return SecondaryDeviceKind.forNumber(number);
+                }
+              };
+
+        public final com.google.protobuf.Descriptors.EnumValueDescriptor
+            getValueDescriptor() {
+          if (this == UNRECOGNIZED) {
+            throw new java.lang.IllegalStateException(
+                "Can't get the descriptor of an unrecognized enum value.");
+          }
+          return getDescriptor().getValues().get(ordinal());
+        }
+        public final com.google.protobuf.Descriptors.EnumDescriptor
+            getDescriptorForType() {
+          return getDescriptor();
+        }
+        public static final com.google.protobuf.Descriptors.EnumDescriptor
+            getDescriptor() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.getDescriptor().getEnumTypes().get(0);
+        }
+
+        private static final SecondaryDeviceKind[] VALUES = values();
+
+        public static SecondaryDeviceKind valueOf(
+            com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+          if (desc.getType() != getDescriptor()) {
+            throw new java.lang.IllegalArgumentException(
+              "EnumValueDescriptor is not for this type.");
+          }
+          if (desc.getIndex() == -1) {
+            return UNRECOGNIZED;
+          }
+          return VALUES[desc.getIndex()];
+        }
+
+        private final int value;
+
+        private SecondaryDeviceKind(int value) {
+          this.value = value;
+        }
+
+        // @@protoc_insertion_point(enum_scope:inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind)
+      }
+
+      public static final int KIND_FIELD_NUMBER = 1;
+      private int kind_;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+       *&#64;&#64;
+       *&#64;&#64;     The secondary device kind.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+       * @return The enum numeric value on the wire for kind.
+       */
+      @java.lang.Override public int getKindValue() {
+        return kind_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+       *&#64;&#64;
+       *&#64;&#64;     The secondary device kind.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+       * @return The kind.
+       */
+      @java.lang.Override public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind getKind() {
+        @SuppressWarnings("deprecation")
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind result = org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind.valueOf(kind_);
+        return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind.UNRECOGNIZED : result;
+      }
+
+      public static final int DEVICE_ID_FIELD_NUMBER = 2;
+      private long deviceId_;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 device_id
+       *&#64;&#64;
+       *&#64;&#64;     Identifier for the secondary device.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>int64 device_id = 2;</code>
+       * @return The deviceId.
+       */
+      @java.lang.Override
+      public long getDeviceId() {
+        return deviceId_;
+      }
+
+      private byte memoizedIsInitialized = -1;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized == 1) return true;
+        if (isInitialized == 0) return false;
+
+        memoizedIsInitialized = 1;
+        return true;
+      }
+
+      @java.lang.Override
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        if (kind_ != org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind.KIND_NVDLA.getNumber()) {
+          output.writeEnum(1, kind_);
+        }
+        if (deviceId_ != 0L) {
+          output.writeInt64(2, deviceId_);
+        }
+        unknownFields.writeTo(output);
+      }
+
+      @java.lang.Override
+      public int getSerializedSize() {
+        int size = memoizedSize;
+        if (size != -1) return size;
+
+        size = 0;
+        if (kind_ != org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind.KIND_NVDLA.getNumber()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeEnumSize(1, kind_);
+        }
+        if (deviceId_ != 0L) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt64Size(2, deviceId_);
+        }
+        size += unknownFields.getSerializedSize();
+        memoizedSize = size;
+        return size;
+      }
+
+      @java.lang.Override
+      public boolean equals(final java.lang.Object obj) {
+        if (obj == this) {
+         return true;
+        }
+        if (!(obj instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice)) {
+          return super.equals(obj);
+        }
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice other = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice) obj;
+
+        if (kind_ != other.kind_) return false;
+        if (getDeviceId()
+            != other.getDeviceId()) return false;
+        if (!unknownFields.equals(other.unknownFields)) return false;
+        return true;
+      }
+
+      @java.lang.Override
+      public int hashCode() {
+        if (memoizedHashCode != 0) {
+          return memoizedHashCode;
+        }
+        int hash = 41;
+        hash = (19 * hash) + getDescriptor().hashCode();
+        hash = (37 * hash) + KIND_FIELD_NUMBER;
+        hash = (53 * hash) + kind_;
+        hash = (37 * hash) + DEVICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+            getDeviceId());
+        hash = (29 * hash) + unknownFields.hashCode();
+        memoizedHashCode = hash;
+        return hash;
+      }
+
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          java.nio.ByteBuffer data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          java.nio.ByteBuffer data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+
+      @java.lang.Override
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder() {
+        return DEFAULT_INSTANCE.toBuilder();
+      }
+      public static Builder newBuilder(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice prototype) {
+        return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+      }
+      @java.lang.Override
+      public Builder toBuilder() {
+        return this == DEFAULT_INSTANCE
+            ? new Builder() : new Builder().mergeFrom(this);
+      }
+
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;
+       *&#64;&#64;  .. cpp:var:: message SecondaryDevice
+       *&#64;&#64;
+       *&#64;&#64;     A secondary device required for a model instance.
+       *&#64;&#64;
+       * </pre>
+       *
+       * Protobuf type {@code inference.ModelInstanceGroup.SecondaryDevice}
+       */
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+          // @@protoc_insertion_point(builder_implements:inference.ModelInstanceGroup.SecondaryDevice)
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_SecondaryDevice_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_SecondaryDevice_fieldAccessorTable
+              .ensureFieldAccessorsInitialized(
+                  org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder.class);
+        }
+
+        // Construct using org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+
+        private Builder(
+            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessageV3
+                  .alwaysUseFieldBuilders) {
+          }
+        }
+        @java.lang.Override
+        public Builder clear() {
+          super.clear();
+          kind_ = 0;
+
+          deviceId_ = 0L;
+
+          return this;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_SecondaryDevice_descriptor;
+        }
+
+        @java.lang.Override
+        public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice getDefaultInstanceForType() {
+          return org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.getDefaultInstance();
+        }
+
+        @java.lang.Override
+        public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice build() {
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+
+        @java.lang.Override
+        public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice buildPartial() {
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice result = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice(this);
+          result.kind_ = kind_;
+          result.deviceId_ = deviceId_;
+          onBuilt();
+          return result;
+        }
+
+        @java.lang.Override
+        public Builder clone() {
+          return super.clone();
+        }
+        @java.lang.Override
+        public Builder setField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            java.lang.Object value) {
+          return super.setField(field, value);
+        }
+        @java.lang.Override
+        public Builder clearField(
+            com.google.protobuf.Descriptors.FieldDescriptor field) {
+          return super.clearField(field);
+        }
+        @java.lang.Override
+        public Builder clearOneof(
+            com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+          return super.clearOneof(oneof);
+        }
+        @java.lang.Override
+        public Builder setRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            int index, java.lang.Object value) {
+          return super.setRepeatedField(field, index, value);
+        }
+        @java.lang.Override
+        public Builder addRepeatedField(
+            com.google.protobuf.Descriptors.FieldDescriptor field,
+            java.lang.Object value) {
+          return super.addRepeatedField(field, value);
+        }
+        @java.lang.Override
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice) {
+            return mergeFrom((org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+
+        public Builder mergeFrom(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice other) {
+          if (other == org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.getDefaultInstance()) return this;
+          if (other.kind_ != 0) {
+            setKindValue(other.getKindValue());
+          }
+          if (other.getDeviceId() != 0L) {
+            setDeviceId(other.getDeviceId());
+          }
+          this.mergeUnknownFields(other.unknownFields);
+          onChanged();
+          return this;
+        }
+
+        @java.lang.Override
+        public final boolean isInitialized() {
+          return true;
+        }
+
+        @java.lang.Override
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice parsedMessage = null;
+          try {
+            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            parsedMessage = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice) e.getUnfinishedMessage();
+            throw e.unwrapIOException();
+          } finally {
+            if (parsedMessage != null) {
+              mergeFrom(parsedMessage);
+            }
+          }
+          return this;
+        }
+
+        private int kind_ = 0;
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+         *&#64;&#64;
+         *&#64;&#64;     The secondary device kind.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+         * @return The enum numeric value on the wire for kind.
+         */
+        @java.lang.Override public int getKindValue() {
+          return kind_;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+         *&#64;&#64;
+         *&#64;&#64;     The secondary device kind.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+         * @param value The enum numeric value on the wire for kind to set.
+         * @return This builder for chaining.
+         */
+        public Builder setKindValue(int value) {
+          
+          kind_ = value;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+         *&#64;&#64;
+         *&#64;&#64;     The secondary device kind.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+         * @return The kind.
+         */
+        @java.lang.Override
+        public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind getKind() {
+          @SuppressWarnings("deprecation")
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind result = org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind.valueOf(kind_);
+          return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind.UNRECOGNIZED : result;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+         *&#64;&#64;
+         *&#64;&#64;     The secondary device kind.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+         * @param value The kind to set.
+         * @return This builder for chaining.
+         */
+        public Builder setKind(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          
+          kind_ = value.getNumber();
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: SecondaryDeviceKind kind
+         *&#64;&#64;
+         *&#64;&#64;     The secondary device kind.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>.inference.ModelInstanceGroup.SecondaryDevice.SecondaryDeviceKind kind = 1;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearKind() {
+          
+          kind_ = 0;
+          onChanged();
+          return this;
+        }
+
+        private long deviceId_ ;
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: int64 device_id
+         *&#64;&#64;
+         *&#64;&#64;     Identifier for the secondary device.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>int64 device_id = 2;</code>
+         * @return The deviceId.
+         */
+        @java.lang.Override
+        public long getDeviceId() {
+          return deviceId_;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: int64 device_id
+         *&#64;&#64;
+         *&#64;&#64;     Identifier for the secondary device.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>int64 device_id = 2;</code>
+         * @param value The deviceId to set.
+         * @return This builder for chaining.
+         */
+        public Builder setDeviceId(long value) {
+          
+          deviceId_ = value;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         *&#64;&#64;  .. cpp:var:: int64 device_id
+         *&#64;&#64;
+         *&#64;&#64;     Identifier for the secondary device.
+         *&#64;&#64;
+         * </pre>
+         *
+         * <code>int64 device_id = 2;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearDeviceId() {
+          
+          deviceId_ = 0L;
+          onChanged();
+          return this;
+        }
+        @java.lang.Override
+        public final Builder setUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.setUnknownFields(unknownFields);
+        }
+
+        @java.lang.Override
+        public final Builder mergeUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.mergeUnknownFields(unknownFields);
+        }
+
+
+        // @@protoc_insertion_point(builder_scope:inference.ModelInstanceGroup.SecondaryDevice)
+      }
+
+      // @@protoc_insertion_point(class_scope:inference.ModelInstanceGroup.SecondaryDevice)
+      private static final org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice DEFAULT_INSTANCE;
+      static {
+        DEFAULT_INSTANCE = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice();
+      }
+
+      public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice getDefaultInstance() {
+        return DEFAULT_INSTANCE;
+      }
+
+      private static final com.google.protobuf.Parser<SecondaryDevice>
+          PARSER = new com.google.protobuf.AbstractParser<SecondaryDevice>() {
+        @java.lang.Override
+        public SecondaryDevice parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return new SecondaryDevice(input, extensionRegistry);
+        }
+      };
+
+      public static com.google.protobuf.Parser<SecondaryDevice> parser() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Parser<SecondaryDevice> getParserForType() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice getDefaultInstanceForType() {
+        return DEFAULT_INSTANCE;
+      }
+
+    }
+
+    public static final int NAME_FIELD_NUMBER = 1;
+    private volatile java.lang.Object name_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     Optional name of this group of instances. If not specified the
+     *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+     *&#64;&#64;     individual instances will be further formed by a unique instance
+     *&#64;&#64;     number and GPU index:
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The name.
+     */
+    @java.lang.Override
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     Optional name of this group of instances. If not specified the
+     *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+     *&#64;&#64;     individual instances will be further formed by a unique instance
+     *&#64;&#64;     number and GPU index:
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The bytes for name.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int KIND_FIELD_NUMBER = 4;
+    private int kind_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Kind kind
+     *&#64;&#64;
+     *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+     *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+     *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+     *&#64;&#64;     and 'gpu' cannot be specified.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+     * @return The enum numeric value on the wire for kind.
+     */
+    @java.lang.Override public int getKindValue() {
+      return kind_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Kind kind
+     *&#64;&#64;
+     *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+     *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+     *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+     *&#64;&#64;     and 'gpu' cannot be specified.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+     * @return The kind.
+     */
+    @java.lang.Override public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind getKind() {
+      @SuppressWarnings("deprecation")
+      org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind result = org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind.valueOf(kind_);
+      return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind.UNRECOGNIZED : result;
+    }
+
+    public static final int COUNT_FIELD_NUMBER = 2;
+    private int count_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 count
+     *&#64;&#64;
+     *&#64;&#64;     For a group assigned to GPU, the number of instances created for
+     *&#64;&#64;     each GPU listed in 'gpus'. For a group assigned to CPU the number
+     *&#64;&#64;     of instances created. Default is 1.
+     * </pre>
+     *
+     * <code>int32 count = 2;</code>
+     * @return The count.
+     */
+    @java.lang.Override
+    public int getCount() {
+      return count_;
+    }
+
+    public static final int RATE_LIMITER_FIELD_NUMBER = 6;
+    private org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter rateLimiter_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+     *&#64;&#64;
+     *&#64;&#64;     The rate limiter specific settings to be associated with this
+     *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+     *&#64;&#64;     will be applied to this instance group.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+     * @return Whether the rateLimiter field is set.
+     */
+    @java.lang.Override
+    public boolean hasRateLimiter() {
+      return rateLimiter_ != null;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+     *&#64;&#64;
+     *&#64;&#64;     The rate limiter specific settings to be associated with this
+     *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+     *&#64;&#64;     will be applied to this instance group.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+     * @return The rateLimiter.
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter getRateLimiter() {
+      return rateLimiter_ == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.getDefaultInstance() : rateLimiter_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+     *&#64;&#64;
+     *&#64;&#64;     The rate limiter specific settings to be associated with this
+     *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+     *&#64;&#64;     will be applied to this instance group.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiterOrBuilder getRateLimiterOrBuilder() {
+      return getRateLimiter();
+    }
+
+    public static final int GPUS_FIELD_NUMBER = 3;
+    private com.google.protobuf.Internal.IntList gpus_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+     *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+     *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+     *&#64;&#64;     available GPUs.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int32 gpus = 3;</code>
+     * @return A list containing the gpus.
+     */
+    @java.lang.Override
+    public java.util.List<java.lang.Integer>
+        getGpusList() {
+      return gpus_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+     *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+     *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+     *&#64;&#64;     available GPUs.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int32 gpus = 3;</code>
+     * @return The count of gpus.
+     */
+    public int getGpusCount() {
+      return gpus_.size();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+     *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+     *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+     *&#64;&#64;     available GPUs.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int32 gpus = 3;</code>
+     * @param index The index of the element to return.
+     * @return The gpus at the given index.
+     */
+    public int getGpus(int index) {
+      return gpus_.getInt(index);
+    }
+    private int gpusMemoizedSerializedSize = -1;
+
+    public static final int SECONDARY_DEVICES_FIELD_NUMBER = 8;
+    private java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice> secondaryDevices_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    @java.lang.Override
+    public java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice> getSecondaryDevicesList() {
+      return secondaryDevices_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder> 
+        getSecondaryDevicesOrBuilderList() {
+      return secondaryDevices_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    @java.lang.Override
+    public int getSecondaryDevicesCount() {
+      return secondaryDevices_.size();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice getSecondaryDevices(int index) {
+      return secondaryDevices_.get(index);
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     Secondary devices that are required by instances specified by this
+     *&#64;&#64;     instance group. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder getSecondaryDevicesOrBuilder(
+        int index) {
+      return secondaryDevices_.get(index);
+    }
+
+    public static final int PROFILE_FIELD_NUMBER = 5;
+    private com.google.protobuf.LazyStringList profile_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @return A list containing the profile.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getProfileList() {
+      return profile_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @return The count of profile.
+     */
+    public int getProfileCount() {
+      return profile_.size();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @param index The index of the element to return.
+     * @return The profile at the given index.
+     */
+    public java.lang.String getProfile(int index) {
+      return profile_.get(index);
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string profile (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+     *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+     *&#64;&#64;     instance group. The inference server will choose the optimal profile
+     *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+     *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+     *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+     *&#64;&#64;     be generated. If not specified, the server will select the first
+     *&#64;&#64;     optimization profile by default.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated string profile = 5;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the profile at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getProfileBytes(int index) {
+      return profile_.getByteString(index);
+    }
+
+    public static final int PASSIVE_FIELD_NUMBER = 7;
+    private boolean passive_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool passive
+     *&#64;&#64;
+     *&#64;&#64;     Whether the instances within this instance group will be accepting
+     *&#64;&#64;     inference requests from the scheduler. If true, the instances will
+     *&#64;&#64;     not be added to the scheduler. Default value is false.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool passive = 7;</code>
+     * @return The passive.
+     */
+    @java.lang.Override
+    public boolean getPassive() {
+      return passive_;
+    }
+
+    public static final int HOST_POLICY_FIELD_NUMBER = 9;
+    private volatile java.lang.Object hostPolicy_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string host_policy
+     *&#64;&#64;
+     *&#64;&#64;     The host policy name that the instance to be associated with.
+     *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+     *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+     *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string host_policy = 9;</code>
+     * @return The hostPolicy.
+     */
+    @java.lang.Override
+    public java.lang.String getHostPolicy() {
+      java.lang.Object ref = hostPolicy_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        hostPolicy_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string host_policy
+     *&#64;&#64;
+     *&#64;&#64;     The host policy name that the instance to be associated with.
+     *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+     *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+     *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string host_policy = 9;</code>
+     * @return The bytes for hostPolicy.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getHostPolicyBytes() {
+      java.lang.Object ref = hostPolicy_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        hostPolicy_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+      }
+      if (count_ != 0) {
+        output.writeInt32(2, count_);
+      }
+      if (getGpusList().size() > 0) {
+        output.writeUInt32NoTag(26);
+        output.writeUInt32NoTag(gpusMemoizedSerializedSize);
+      }
+      for (int i = 0; i < gpus_.size(); i++) {
+        output.writeInt32NoTag(gpus_.getInt(i));
+      }
+      if (kind_ != org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind.KIND_AUTO.getNumber()) {
+        output.writeEnum(4, kind_);
+      }
+      for (int i = 0; i < profile_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 5, profile_.getRaw(i));
+      }
+      if (rateLimiter_ != null) {
+        output.writeMessage(6, getRateLimiter());
+      }
+      if (passive_ != false) {
+        output.writeBool(7, passive_);
+      }
+      for (int i = 0; i < secondaryDevices_.size(); i++) {
+        output.writeMessage(8, secondaryDevices_.get(i));
+      }
+      if (!getHostPolicyBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 9, hostPolicy_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+      }
+      if (count_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(2, count_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < gpus_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeInt32SizeNoTag(gpus_.getInt(i));
+        }
+        size += dataSize;
+        if (!getGpusList().isEmpty()) {
+          size += 1;
+          size += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(dataSize);
+        }
+        gpusMemoizedSerializedSize = dataSize;
+      }
+      if (kind_ != org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind.KIND_AUTO.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(4, kind_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < profile_.size(); i++) {
+          dataSize += computeStringSizeNoTag(profile_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getProfileList().size();
+      }
+      if (rateLimiter_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, getRateLimiter());
+      }
+      if (passive_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(7, passive_);
+      }
+      for (int i = 0; i < secondaryDevices_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, secondaryDevices_.get(i));
+      }
+      if (!getHostPolicyBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, hostPolicy_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup)) {
+        return super.equals(obj);
+      }
+      org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup other = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup) obj;
+
+      if (!getName()
+          .equals(other.getName())) return false;
+      if (kind_ != other.kind_) return false;
+      if (getCount()
+          != other.getCount()) return false;
+      if (hasRateLimiter() != other.hasRateLimiter()) return false;
+      if (hasRateLimiter()) {
+        if (!getRateLimiter()
+            .equals(other.getRateLimiter())) return false;
+      }
+      if (!getGpusList()
+          .equals(other.getGpusList())) return false;
+      if (!getSecondaryDevicesList()
+          .equals(other.getSecondaryDevicesList())) return false;
+      if (!getProfileList()
+          .equals(other.getProfileList())) return false;
+      if (getPassive()
+          != other.getPassive()) return false;
+      if (!getHostPolicy()
+          .equals(other.getHostPolicy())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      hash = (37 * hash) + KIND_FIELD_NUMBER;
+      hash = (53 * hash) + kind_;
+      hash = (37 * hash) + COUNT_FIELD_NUMBER;
+      hash = (53 * hash) + getCount();
+      if (hasRateLimiter()) {
+        hash = (37 * hash) + RATE_LIMITER_FIELD_NUMBER;
+        hash = (53 * hash) + getRateLimiter().hashCode();
+      }
+      if (getGpusCount() > 0) {
+        hash = (37 * hash) + GPUS_FIELD_NUMBER;
+        hash = (53 * hash) + getGpusList().hashCode();
+      }
+      if (getSecondaryDevicesCount() > 0) {
+        hash = (37 * hash) + SECONDARY_DEVICES_FIELD_NUMBER;
+        hash = (53 * hash) + getSecondaryDevicesList().hashCode();
+      }
+      if (getProfileCount() > 0) {
+        hash = (37 * hash) + PROFILE_FIELD_NUMBER;
+        hash = (53 * hash) + getProfileList().hashCode();
+      }
+      hash = (37 * hash) + PASSIVE_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getPassive());
+      hash = (37 * hash) + HOST_POLICY_FIELD_NUMBER;
+      hash = (53 * hash) + getHostPolicy().hashCode();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;
+     *&#64;&#64;.. cpp:var:: message ModelInstanceGroup
+     *&#64;&#64;
+     *&#64;&#64;   A group of one or more instances of a model and resources made
+     *&#64;&#64;   available for those instances.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf type {@code inference.ModelInstanceGroup}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:inference.ModelInstanceGroup)
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroupOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Builder.class);
+      }
+
+      // Construct using org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getSecondaryDevicesFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+
+        kind_ = 0;
+
+        count_ = 0;
+
+        if (rateLimiterBuilder_ == null) {
+          rateLimiter_ = null;
+        } else {
+          rateLimiter_ = null;
+          rateLimiterBuilder_ = null;
+        }
+        gpus_ = emptyIntList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (secondaryDevicesBuilder_ == null) {
+          secondaryDevices_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          secondaryDevicesBuilder_.clear();
+        }
+        profile_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        passive_ = false;
+
+        hostPolicy_ = "";
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInstanceGroup_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup getDefaultInstanceForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup build() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup buildPartial() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup result = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup(this);
+        int from_bitField0_ = bitField0_;
+        result.name_ = name_;
+        result.kind_ = kind_;
+        result.count_ = count_;
+        if (rateLimiterBuilder_ == null) {
+          result.rateLimiter_ = rateLimiter_;
+        } else {
+          result.rateLimiter_ = rateLimiterBuilder_.build();
+        }
+        if (((bitField0_ & 0x00000001) != 0)) {
+          gpus_.makeImmutable();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.gpus_ = gpus_;
+        if (secondaryDevicesBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0)) {
+            secondaryDevices_ = java.util.Collections.unmodifiableList(secondaryDevices_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.secondaryDevices_ = secondaryDevices_;
+        } else {
+          result.secondaryDevices_ = secondaryDevicesBuilder_.build();
+        }
+        if (((bitField0_ & 0x00000004) != 0)) {
+          profile_ = profile_.getUnmodifiableView();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        }
+        result.profile_ = profile_;
+        result.passive_ = passive_;
+        result.hostPolicy_ = hostPolicy_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup) {
+          return mergeFrom((org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup other) {
+        if (other == org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.getDefaultInstance()) return this;
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.kind_ != 0) {
+          setKindValue(other.getKindValue());
+        }
+        if (other.getCount() != 0) {
+          setCount(other.getCount());
+        }
+        if (other.hasRateLimiter()) {
+          mergeRateLimiter(other.getRateLimiter());
+        }
+        if (!other.gpus_.isEmpty()) {
+          if (gpus_.isEmpty()) {
+            gpus_ = other.gpus_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureGpusIsMutable();
+            gpus_.addAll(other.gpus_);
+          }
+          onChanged();
+        }
+        if (secondaryDevicesBuilder_ == null) {
+          if (!other.secondaryDevices_.isEmpty()) {
+            if (secondaryDevices_.isEmpty()) {
+              secondaryDevices_ = other.secondaryDevices_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureSecondaryDevicesIsMutable();
+              secondaryDevices_.addAll(other.secondaryDevices_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.secondaryDevices_.isEmpty()) {
+            if (secondaryDevicesBuilder_.isEmpty()) {
+              secondaryDevicesBuilder_.dispose();
+              secondaryDevicesBuilder_ = null;
+              secondaryDevices_ = other.secondaryDevices_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              secondaryDevicesBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSecondaryDevicesFieldBuilder() : null;
+            } else {
+              secondaryDevicesBuilder_.addAllMessages(other.secondaryDevices_);
+            }
+          }
+        }
+        if (!other.profile_.isEmpty()) {
+          if (profile_.isEmpty()) {
+            profile_ = other.profile_;
+            bitField0_ = (bitField0_ & ~0x00000004);
+          } else {
+            ensureProfileIsMutable();
+            profile_.addAll(other.profile_);
+          }
+          onChanged();
+        }
+        if (other.getPassive() != false) {
+          setPassive(other.getPassive());
+        }
+        if (!other.getHostPolicy().isEmpty()) {
+          hostPolicy_ = other.hostPolicy_;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.lang.Object name_ = "";
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     Optional name of this group of instances. If not specified the
+       *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+       *&#64;&#64;     individual instances will be further formed by a unique instance
+       *&#64;&#64;     number and GPU index:
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     Optional name of this group of instances. If not specified the
+       *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+       *&#64;&#64;     individual instances will be further formed by a unique instance
+       *&#64;&#64;     number and GPU index:
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     Optional name of this group of instances. If not specified the
+       *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+       *&#64;&#64;     individual instances will be further formed by a unique instance
+       *&#64;&#64;     number and GPU index:
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     Optional name of this group of instances. If not specified the
+       *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+       *&#64;&#64;     individual instances will be further formed by a unique instance
+       *&#64;&#64;     number and GPU index:
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     Optional name of this group of instances. If not specified the
+       *&#64;&#64;     name will be formed as &lt;model name&gt;_&lt;group number&gt;. The name of
+       *&#64;&#64;     individual instances will be further formed by a unique instance
+       *&#64;&#64;     number and GPU index:
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      private int kind_ = 0;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Kind kind
+       *&#64;&#64;
+       *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+       *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+       *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+       *&#64;&#64;     and 'gpu' cannot be specified.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+       * @return The enum numeric value on the wire for kind.
+       */
+      @java.lang.Override public int getKindValue() {
+        return kind_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Kind kind
+       *&#64;&#64;
+       *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+       *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+       *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+       *&#64;&#64;     and 'gpu' cannot be specified.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+       * @param value The enum numeric value on the wire for kind to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKindValue(int value) {
+        
+        kind_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Kind kind
+       *&#64;&#64;
+       *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+       *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+       *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+       *&#64;&#64;     and 'gpu' cannot be specified.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+       * @return The kind.
+       */
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind getKind() {
+        @SuppressWarnings("deprecation")
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind result = org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind.valueOf(kind_);
+        return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Kind kind
+       *&#64;&#64;
+       *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+       *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+       *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+       *&#64;&#64;     and 'gpu' cannot be specified.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+       * @param value The kind to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKind(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.Kind value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        kind_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Kind kind
+       *&#64;&#64;
+       *&#64;&#64;     The kind of this instance group. Default is KIND_AUTO. If
+       *&#64;&#64;     KIND_AUTO or KIND_GPU then both 'count' and 'gpu' are valid and
+       *&#64;&#64;     may be specified. If KIND_CPU or KIND_MODEL only 'count' is valid
+       *&#64;&#64;     and 'gpu' cannot be specified.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInstanceGroup.Kind kind = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearKind() {
+        
+        kind_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int count_ ;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 count
+       *&#64;&#64;
+       *&#64;&#64;     For a group assigned to GPU, the number of instances created for
+       *&#64;&#64;     each GPU listed in 'gpus'. For a group assigned to CPU the number
+       *&#64;&#64;     of instances created. Default is 1.
+       * </pre>
+       *
+       * <code>int32 count = 2;</code>
+       * @return The count.
+       */
+      @java.lang.Override
+      public int getCount() {
+        return count_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 count
+       *&#64;&#64;
+       *&#64;&#64;     For a group assigned to GPU, the number of instances created for
+       *&#64;&#64;     each GPU listed in 'gpus'. For a group assigned to CPU the number
+       *&#64;&#64;     of instances created. Default is 1.
+       * </pre>
+       *
+       * <code>int32 count = 2;</code>
+       * @param value The count to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCount(int value) {
+        
+        count_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 count
+       *&#64;&#64;
+       *&#64;&#64;     For a group assigned to GPU, the number of instances created for
+       *&#64;&#64;     each GPU listed in 'gpus'. For a group assigned to CPU the number
+       *&#64;&#64;     of instances created. Default is 1.
+       * </pre>
+       *
+       * <code>int32 count = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearCount() {
+        
+        count_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter rateLimiter_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiterOrBuilder> rateLimiterBuilder_;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       * @return Whether the rateLimiter field is set.
+       */
+      public boolean hasRateLimiter() {
+        return rateLimiterBuilder_ != null || rateLimiter_ != null;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       * @return The rateLimiter.
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter getRateLimiter() {
+        if (rateLimiterBuilder_ == null) {
+          return rateLimiter_ == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.getDefaultInstance() : rateLimiter_;
+        } else {
+          return rateLimiterBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       */
+      public Builder setRateLimiter(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter value) {
+        if (rateLimiterBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          rateLimiter_ = value;
+          onChanged();
+        } else {
+          rateLimiterBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       */
+      public Builder setRateLimiter(
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder builderForValue) {
+        if (rateLimiterBuilder_ == null) {
+          rateLimiter_ = builderForValue.build();
+          onChanged();
+        } else {
+          rateLimiterBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       */
+      public Builder mergeRateLimiter(org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter value) {
+        if (rateLimiterBuilder_ == null) {
+          if (rateLimiter_ != null) {
+            rateLimiter_ =
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.newBuilder(rateLimiter_).mergeFrom(value).buildPartial();
+          } else {
+            rateLimiter_ = value;
+          }
+          onChanged();
+        } else {
+          rateLimiterBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       */
+      public Builder clearRateLimiter() {
+        if (rateLimiterBuilder_ == null) {
+          rateLimiter_ = null;
+          onChanged();
+        } else {
+          rateLimiter_ = null;
+          rateLimiterBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder getRateLimiterBuilder() {
+        
+        onChanged();
+        return getRateLimiterFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiterOrBuilder getRateLimiterOrBuilder() {
+        if (rateLimiterBuilder_ != null) {
+          return rateLimiterBuilder_.getMessageOrBuilder();
+        } else {
+          return rateLimiter_ == null ?
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.getDefaultInstance() : rateLimiter_;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelRateLimiter rate_limiter
+       *&#64;&#64;
+       *&#64;&#64;     The rate limiter specific settings to be associated with this
+       *&#64;&#64;     instance group. Optional, if not specified no rate limiting
+       *&#64;&#64;     will be applied to this instance group.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelRateLimiter rate_limiter = 6;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiterOrBuilder> 
+          getRateLimiterFieldBuilder() {
+        if (rateLimiterBuilder_ == null) {
+          rateLimiterBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiter.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelRateLimiterOrBuilder>(
+                  getRateLimiter(),
+                  getParentForChildren(),
+                  isClean());
+          rateLimiter_ = null;
+        }
+        return rateLimiterBuilder_;
+      }
+
+      private com.google.protobuf.Internal.IntList gpus_ = emptyIntList();
+      private void ensureGpusIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          gpus_ = mutableCopy(gpus_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+       *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+       *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+       *&#64;&#64;     available GPUs.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int32 gpus = 3;</code>
+       * @return A list containing the gpus.
+       */
+      public java.util.List<java.lang.Integer>
+          getGpusList() {
+        return ((bitField0_ & 0x00000001) != 0) ?
+                 java.util.Collections.unmodifiableList(gpus_) : gpus_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+       *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+       *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+       *&#64;&#64;     available GPUs.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int32 gpus = 3;</code>
+       * @return The count of gpus.
+       */
+      public int getGpusCount() {
+        return gpus_.size();
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+       *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+       *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+       *&#64;&#64;     available GPUs.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int32 gpus = 3;</code>
+       * @param index The index of the element to return.
+       * @return The gpus at the given index.
+       */
+      public int getGpus(int index) {
+        return gpus_.getInt(index);
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+       *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+       *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+       *&#64;&#64;     available GPUs.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int32 gpus = 3;</code>
+       * @param index The index to set the value at.
+       * @param value The gpus to set.
+       * @return This builder for chaining.
+       */
+      public Builder setGpus(
+          int index, int value) {
+        ensureGpusIsMutable();
+        gpus_.setInt(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+       *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+       *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+       *&#64;&#64;     available GPUs.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int32 gpus = 3;</code>
+       * @param value The gpus to add.
+       * @return This builder for chaining.
+       */
+      public Builder addGpus(int value) {
+        ensureGpusIsMutable();
+        gpus_.addInt(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+       *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+       *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+       *&#64;&#64;     available GPUs.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int32 gpus = 3;</code>
+       * @param values The gpus to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllGpus(
+          java.lang.Iterable<? extends java.lang.Integer> values) {
+        ensureGpusIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, gpus_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int32 gpus (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     GPU(s) where instances should be available. For each GPU listed,
+       *&#64;&#64;     'count' instances of the model will be available. Setting 'gpus'
+       *&#64;&#64;     to empty (or not specifying at all) is eqivalent to listing all
+       *&#64;&#64;     available GPUs.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int32 gpus = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearGpus() {
+        gpus_ = emptyIntList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+
+      private java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice> secondaryDevices_ =
+        java.util.Collections.emptyList();
+      private void ensureSecondaryDevicesIsMutable() {
+        if (!((bitField0_ & 0x00000002) != 0)) {
+          secondaryDevices_ = new java.util.ArrayList<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice>(secondaryDevices_);
+          bitField0_ |= 0x00000002;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder> secondaryDevicesBuilder_;
+
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice> getSecondaryDevicesList() {
+        if (secondaryDevicesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(secondaryDevices_);
+        } else {
+          return secondaryDevicesBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public int getSecondaryDevicesCount() {
+        if (secondaryDevicesBuilder_ == null) {
+          return secondaryDevices_.size();
+        } else {
+          return secondaryDevicesBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice getSecondaryDevices(int index) {
+        if (secondaryDevicesBuilder_ == null) {
+          return secondaryDevices_.get(index);
+        } else {
+          return secondaryDevicesBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder setSecondaryDevices(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice value) {
+        if (secondaryDevicesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSecondaryDevicesIsMutable();
+          secondaryDevices_.set(index, value);
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder setSecondaryDevices(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder builderForValue) {
+        if (secondaryDevicesBuilder_ == null) {
+          ensureSecondaryDevicesIsMutable();
+          secondaryDevices_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder addSecondaryDevices(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice value) {
+        if (secondaryDevicesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSecondaryDevicesIsMutable();
+          secondaryDevices_.add(value);
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder addSecondaryDevices(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice value) {
+        if (secondaryDevicesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSecondaryDevicesIsMutable();
+          secondaryDevices_.add(index, value);
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder addSecondaryDevices(
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder builderForValue) {
+        if (secondaryDevicesBuilder_ == null) {
+          ensureSecondaryDevicesIsMutable();
+          secondaryDevices_.add(builderForValue.build());
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder addSecondaryDevices(
+          int index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder builderForValue) {
+        if (secondaryDevicesBuilder_ == null) {
+          ensureSecondaryDevicesIsMutable();
+          secondaryDevices_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder addAllSecondaryDevices(
+          java.lang.Iterable<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice> values) {
+        if (secondaryDevicesBuilder_ == null) {
+          ensureSecondaryDevicesIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, secondaryDevices_);
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder clearSecondaryDevices() {
+        if (secondaryDevicesBuilder_ == null) {
+          secondaryDevices_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public Builder removeSecondaryDevices(int index) {
+        if (secondaryDevicesBuilder_ == null) {
+          ensureSecondaryDevicesIsMutable();
+          secondaryDevices_.remove(index);
+          onChanged();
+        } else {
+          secondaryDevicesBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder getSecondaryDevicesBuilder(
+          int index) {
+        return getSecondaryDevicesFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder getSecondaryDevicesOrBuilder(
+          int index) {
+        if (secondaryDevicesBuilder_ == null) {
+          return secondaryDevices_.get(index);  } else {
+          return secondaryDevicesBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public java.util.List<? extends org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder> 
+           getSecondaryDevicesOrBuilderList() {
+        if (secondaryDevicesBuilder_ != null) {
+          return secondaryDevicesBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(secondaryDevices_);
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder addSecondaryDevicesBuilder() {
+        return getSecondaryDevicesFieldBuilder().addBuilder(
+            org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder addSecondaryDevicesBuilder(
+          int index) {
+        return getSecondaryDevicesFieldBuilder().addBuilder(
+            index, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: SecondaryDevice secondary_devices (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     Secondary devices that are required by instances specified by this
+       *&#64;&#64;     instance group. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated .inference.ModelInstanceGroup.SecondaryDevice secondary_devices = 8;</code>
+       */
+      public java.util.List<org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder> 
+           getSecondaryDevicesBuilderList() {
+        return getSecondaryDevicesFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder> 
+          getSecondaryDevicesFieldBuilder() {
+        if (secondaryDevicesBuilder_ == null) {
+          secondaryDevicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDevice.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup.SecondaryDeviceOrBuilder>(
+                  secondaryDevices_,
+                  ((bitField0_ & 0x00000002) != 0),
+                  getParentForChildren(),
+                  isClean());
+          secondaryDevices_ = null;
+        }
+        return secondaryDevicesBuilder_;
+      }
+
+      private com.google.protobuf.LazyStringList profile_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      private void ensureProfileIsMutable() {
+        if (!((bitField0_ & 0x00000004) != 0)) {
+          profile_ = new com.google.protobuf.LazyStringArrayList(profile_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @return A list containing the profile.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getProfileList() {
+        return profile_.getUnmodifiableView();
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @return The count of profile.
+       */
+      public int getProfileCount() {
+        return profile_.size();
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @param index The index of the element to return.
+       * @return The profile at the given index.
+       */
+      public java.lang.String getProfile(int index) {
+        return profile_.get(index);
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the profile at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getProfileBytes(int index) {
+        return profile_.getByteString(index);
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @param index The index to set the value at.
+       * @param value The profile to set.
+       * @return This builder for chaining.
+       */
+      public Builder setProfile(
+          int index, java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureProfileIsMutable();
+        profile_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @param value The profile to add.
+       * @return This builder for chaining.
+       */
+      public Builder addProfile(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureProfileIsMutable();
+        profile_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @param values The profile to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllProfile(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureProfileIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, profile_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearProfile() {
+        profile_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string profile (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     For TensorRT models containing multiple optimization profile, this
+       *&#64;&#64;     parameter specifies a set of optimization profiles available to this
+       *&#64;&#64;     instance group. The inference server will choose the optimal profile
+       *&#64;&#64;     based on the shapes of the input tensors. This field should lie
+       *&#64;&#64;     between 0 and &lt;TotalNumberOfOptimizationProfilesInPlanModel&gt; - 1
+       *&#64;&#64;     and be specified only for TensorRT backend, otherwise an error will
+       *&#64;&#64;     be generated. If not specified, the server will select the first
+       *&#64;&#64;     optimization profile by default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated string profile = 5;</code>
+       * @param value The bytes of the profile to add.
+       * @return This builder for chaining.
+       */
+      public Builder addProfileBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        ensureProfileIsMutable();
+        profile_.add(value);
+        onChanged();
+        return this;
+      }
+
+      private boolean passive_ ;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool passive
+       *&#64;&#64;
+       *&#64;&#64;     Whether the instances within this instance group will be accepting
+       *&#64;&#64;     inference requests from the scheduler. If true, the instances will
+       *&#64;&#64;     not be added to the scheduler. Default value is false.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool passive = 7;</code>
+       * @return The passive.
+       */
+      @java.lang.Override
+      public boolean getPassive() {
+        return passive_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool passive
+       *&#64;&#64;
+       *&#64;&#64;     Whether the instances within this instance group will be accepting
+       *&#64;&#64;     inference requests from the scheduler. If true, the instances will
+       *&#64;&#64;     not be added to the scheduler. Default value is false.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool passive = 7;</code>
+       * @param value The passive to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPassive(boolean value) {
+        
+        passive_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool passive
+       *&#64;&#64;
+       *&#64;&#64;     Whether the instances within this instance group will be accepting
+       *&#64;&#64;     inference requests from the scheduler. If true, the instances will
+       *&#64;&#64;     not be added to the scheduler. Default value is false.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool passive = 7;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearPassive() {
+        
+        passive_ = false;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object hostPolicy_ = "";
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string host_policy
+       *&#64;&#64;
+       *&#64;&#64;     The host policy name that the instance to be associated with.
+       *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+       *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+       *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string host_policy = 9;</code>
+       * @return The hostPolicy.
+       */
+      public java.lang.String getHostPolicy() {
+        java.lang.Object ref = hostPolicy_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          hostPolicy_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string host_policy
+       *&#64;&#64;
+       *&#64;&#64;     The host policy name that the instance to be associated with.
+       *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+       *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+       *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string host_policy = 9;</code>
+       * @return The bytes for hostPolicy.
+       */
+      public com.google.protobuf.ByteString
+          getHostPolicyBytes() {
+        java.lang.Object ref = hostPolicy_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          hostPolicy_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string host_policy
+       *&#64;&#64;
+       *&#64;&#64;     The host policy name that the instance to be associated with.
+       *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+       *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+       *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string host_policy = 9;</code>
+       * @param value The hostPolicy to set.
+       * @return This builder for chaining.
+       */
+      public Builder setHostPolicy(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        hostPolicy_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string host_policy
+       *&#64;&#64;
+       *&#64;&#64;     The host policy name that the instance to be associated with.
+       *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+       *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+       *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string host_policy = 9;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearHostPolicy() {
+        
+        hostPolicy_ = getDefaultInstance().getHostPolicy();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string host_policy
+       *&#64;&#64;
+       *&#64;&#64;     The host policy name that the instance to be associated with.
+       *&#64;&#64;     The default value is set to reflect the device kind of the instance,
+       *&#64;&#64;     for instance, KIND_CPU is "cpu", KIND_MODEL is "model" and
+       *&#64;&#64;     KIND_GPU is "gpu_&lt;gpu_id&gt;".
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string host_policy = 9;</code>
+       * @param value The bytes for hostPolicy to set.
+       * @return This builder for chaining.
+       */
+      public Builder setHostPolicyBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        hostPolicy_ = value;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:inference.ModelInstanceGroup)
+    }
+
+    // @@protoc_insertion_point(class_scope:inference.ModelInstanceGroup)
+    private static final org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup();
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ModelInstanceGroup>
+        PARSER = new com.google.protobuf.AbstractParser<ModelInstanceGroup>() {
+      @java.lang.Override
+      public ModelInstanceGroup parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ModelInstanceGroup(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<ModelInstanceGroup> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ModelInstanceGroup> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInstanceGroup getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ModelTensorReshapeOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:inference.ModelTensorReshape)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The shape to use for reshaping.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 shape = 1;</code>
+     * @return A list containing the shape.
+     */
+    java.util.List<java.lang.Long> getShapeList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The shape to use for reshaping.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 shape = 1;</code>
+     * @return The count of shape.
+     */
+    int getShapeCount();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The shape to use for reshaping.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 shape = 1;</code>
+     * @param index The index of the element to return.
+     * @return The shape at the given index.
+     */
+    long getShape(int index);
+  }
+  /**
+   * <pre>
+   *&#64;&#64;
+   *&#64;&#64;.. cpp:var:: message ModelTensorReshape
+   *&#64;&#64;
+   *&#64;&#64;   Reshape specification for input and output tensors.
+   *&#64;&#64;
+   * </pre>
+   *
+   * Protobuf type {@code inference.ModelTensorReshape}
+   */
+  public static final class ModelTensorReshape extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:inference.ModelTensorReshape)
+      ModelTensorReshapeOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ModelTensorReshape.newBuilder() to construct.
+    private ModelTensorReshape(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ModelTensorReshape() {
+      shape_ = emptyLongList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ModelTensorReshape();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ModelTensorReshape(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                shape_ = newLongList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              shape_.addLong(input.readInt64());
+              break;
+            }
+            case 10: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+                shape_ = newLongList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              while (input.getBytesUntilLimit() > 0) {
+                shape_.addLong(input.readInt64());
+              }
+              input.popLimit(limit);
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          shape_.makeImmutable(); // C
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelTensorReshape_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelTensorReshape_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder.class);
+    }
+
+    public static final int SHAPE_FIELD_NUMBER = 1;
+    private com.google.protobuf.Internal.LongList shape_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The shape to use for reshaping.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 shape = 1;</code>
+     * @return A list containing the shape.
+     */
+    @java.lang.Override
+    public java.util.List<java.lang.Long>
+        getShapeList() {
+      return shape_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The shape to use for reshaping.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 shape = 1;</code>
+     * @return The count of shape.
+     */
+    public int getShapeCount() {
+      return shape_.size();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The shape to use for reshaping.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 shape = 1;</code>
+     * @param index The index of the element to return.
+     * @return The shape at the given index.
+     */
+    public long getShape(int index) {
+      return shape_.getLong(index);
+    }
+    private int shapeMemoizedSerializedSize = -1;
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (getShapeList().size() > 0) {
+        output.writeUInt32NoTag(10);
+        output.writeUInt32NoTag(shapeMemoizedSerializedSize);
+      }
+      for (int i = 0; i < shape_.size(); i++) {
+        output.writeInt64NoTag(shape_.getLong(i));
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      {
+        int dataSize = 0;
+        for (int i = 0; i < shape_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeInt64SizeNoTag(shape_.getLong(i));
+        }
+        size += dataSize;
+        if (!getShapeList().isEmpty()) {
+          size += 1;
+          size += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(dataSize);
+        }
+        shapeMemoizedSerializedSize = dataSize;
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape)) {
+        return super.equals(obj);
+      }
+      org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape other = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape) obj;
+
+      if (!getShapeList()
+          .equals(other.getShapeList())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getShapeCount() > 0) {
+        hash = (37 * hash) + SHAPE_FIELD_NUMBER;
+        hash = (53 * hash) + getShapeList().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;
+     *&#64;&#64;.. cpp:var:: message ModelTensorReshape
+     *&#64;&#64;
+     *&#64;&#64;   Reshape specification for input and output tensors.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf type {@code inference.ModelTensorReshape}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:inference.ModelTensorReshape)
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelTensorReshape_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelTensorReshape_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder.class);
+      }
+
+      // Construct using org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        shape_ = emptyLongList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelTensorReshape_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape getDefaultInstanceForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape build() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape buildPartial() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape result = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape(this);
+        int from_bitField0_ = bitField0_;
+        if (((bitField0_ & 0x00000001) != 0)) {
+          shape_.makeImmutable();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.shape_ = shape_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape) {
+          return mergeFrom((org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape other) {
+        if (other == org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.getDefaultInstance()) return this;
+        if (!other.shape_.isEmpty()) {
+          if (shape_.isEmpty()) {
+            shape_ = other.shape_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureShapeIsMutable();
+            shape_.addAll(other.shape_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private com.google.protobuf.Internal.LongList shape_ = emptyLongList();
+      private void ensureShapeIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          shape_ = mutableCopy(shape_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The shape to use for reshaping.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 shape = 1;</code>
+       * @return A list containing the shape.
+       */
+      public java.util.List<java.lang.Long>
+          getShapeList() {
+        return ((bitField0_ & 0x00000001) != 0) ?
+                 java.util.Collections.unmodifiableList(shape_) : shape_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The shape to use for reshaping.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 shape = 1;</code>
+       * @return The count of shape.
+       */
+      public int getShapeCount() {
+        return shape_.size();
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The shape to use for reshaping.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 shape = 1;</code>
+       * @param index The index of the element to return.
+       * @return The shape at the given index.
+       */
+      public long getShape(int index) {
+        return shape_.getLong(index);
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The shape to use for reshaping.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 shape = 1;</code>
+       * @param index The index to set the value at.
+       * @param value The shape to set.
+       * @return This builder for chaining.
+       */
+      public Builder setShape(
+          int index, long value) {
+        ensureShapeIsMutable();
+        shape_.setLong(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The shape to use for reshaping.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 shape = 1;</code>
+       * @param value The shape to add.
+       * @return This builder for chaining.
+       */
+      public Builder addShape(long value) {
+        ensureShapeIsMutable();
+        shape_.addLong(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The shape to use for reshaping.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 shape = 1;</code>
+       * @param values The shape to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllShape(
+          java.lang.Iterable<? extends java.lang.Long> values) {
+        ensureShapeIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, shape_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 shape (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The shape to use for reshaping.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 shape = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearShape() {
+        shape_ = emptyLongList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:inference.ModelTensorReshape)
+    }
+
+    // @@protoc_insertion_point(class_scope:inference.ModelTensorReshape)
+    private static final org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape();
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ModelTensorReshape>
+        PARSER = new com.google.protobuf.AbstractParser<ModelTensorReshape>() {
+      @java.lang.Override
+      public ModelTensorReshape parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ModelTensorReshape(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<ModelTensorReshape> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ModelTensorReshape> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ModelInputOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:inference.ModelInput)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     The name of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     The name of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: DataType data_type
+     *&#64;&#64;
+     *&#64;&#64;     The data-type of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.DataType data_type = 2;</code>
+     * @return The enum numeric value on the wire for dataType.
+     */
+    int getDataTypeValue();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: DataType data_type
+     *&#64;&#64;
+     *&#64;&#64;     The data-type of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.DataType data_type = 2;</code>
+     * @return The dataType.
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.DataType getDataType();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Format format
+     *&#64;&#64;
+     *&#64;&#64;     The format of the input. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInput.Format format = 3;</code>
+     * @return The enum numeric value on the wire for format.
+     */
+    int getFormatValue();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Format format
+     *&#64;&#64;
+     *&#64;&#64;     The format of the input. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInput.Format format = 3;</code>
+     * @return The format.
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format getFormat();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+     *&#64;&#64;     when invoking the inference API for this model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 4;</code>
+     * @return A list containing the dims.
+     */
+    java.util.List<java.lang.Long> getDimsList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+     *&#64;&#64;     when invoking the inference API for this model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 4;</code>
+     * @return The count of dims.
+     */
+    int getDimsCount();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+     *&#64;&#64;     when invoking the inference API for this model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 4;</code>
+     * @param index The index of the element to return.
+     * @return The dims at the given index.
+     */
+    long getDims(int index);
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape expected for this input by the backend. The input will
+     *&#64;&#64;     be reshaped to this before being presented to the backend. The
+     *&#64;&#64;     reshape must have the same number of elements as the input shape
+     *&#64;&#64;     specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     * @return Whether the reshape field is set.
+     */
+    boolean hasReshape();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape expected for this input by the backend. The input will
+     *&#64;&#64;     be reshaped to this before being presented to the backend. The
+     *&#64;&#64;     reshape must have the same number of elements as the input shape
+     *&#64;&#64;     specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     * @return The reshape.
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape getReshape();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape expected for this input by the backend. The input will
+     *&#64;&#64;     be reshaped to this before being presented to the backend. The
+     *&#64;&#64;     reshape must have the same number of elements as the input shape
+     *&#64;&#64;     specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder getReshapeOrBuilder();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool is_shape_tensor
+     *&#64;&#64;
+     *&#64;&#64;     Whether or not the input is a shape tensor to the model. This field
+     *&#64;&#64;     is currently supported only for the TensorRT model. An error will be
+     *&#64;&#64;     generated if this specification does not comply with underlying
+     *&#64;&#64;     model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool is_shape_tensor = 6;</code>
+     * @return The isShapeTensor.
+     */
+    boolean getIsShapeTensor();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool allow_ragged_batch
+     *&#64;&#64;
+     *&#64;&#64;     Whether or not the input is allowed to be "ragged" in a dynamically
+     *&#64;&#64;     created batch. Default is false indicating that two requests will
+     *&#64;&#64;     only be batched if this tensor has the same shape in both requests.
+     *&#64;&#64;     True indicates that two requests can be batched even if this tensor
+     *&#64;&#64;     has a different shape in each request.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool allow_ragged_batch = 7;</code>
+     * @return The allowRaggedBatch.
+     */
+    boolean getAllowRaggedBatch();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool optional
+     *&#64;&#64;
+     *&#64;&#64;     Whether or not the input is optional for the model execution.
+     *&#64;&#64;     If true, the input is not required in the inference request.
+     *&#64;&#64;     Default value is false.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool optional = 8;</code>
+     * @return The optional.
+     */
+    boolean getOptional();
+  }
+  /**
+   * <pre>
+   *&#64;&#64;
+   *&#64;&#64;.. cpp:var:: message ModelInput
+   *&#64;&#64;
+   *&#64;&#64;   An input required by the model.
+   *&#64;&#64;
+   * </pre>
+   *
+   * Protobuf type {@code inference.ModelInput}
+   */
+  public static final class ModelInput extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:inference.ModelInput)
+      ModelInputOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ModelInput.newBuilder() to construct.
+    private ModelInput(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ModelInput() {
+      name_ = "";
+      dataType_ = 0;
+      format_ = 0;
+      dims_ = emptyLongList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ModelInput();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ModelInput(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              name_ = s;
+              break;
+            }
+            case 16: {
+              int rawValue = input.readEnum();
+
+              dataType_ = rawValue;
+              break;
+            }
+            case 24: {
+              int rawValue = input.readEnum();
+
+              format_ = rawValue;
+              break;
+            }
+            case 32: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                dims_ = newLongList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              dims_.addLong(input.readInt64());
+              break;
+            }
+            case 34: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+                dims_ = newLongList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              while (input.getBytesUntilLimit() > 0) {
+                dims_.addLong(input.readInt64());
+              }
+              input.popLimit(limit);
+              break;
+            }
+            case 42: {
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder subBuilder = null;
+              if (reshape_ != null) {
+                subBuilder = reshape_.toBuilder();
+              }
+              reshape_ = input.readMessage(org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(reshape_);
+                reshape_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 48: {
+
+              isShapeTensor_ = input.readBool();
+              break;
+            }
+            case 56: {
+
+              allowRaggedBatch_ = input.readBool();
+              break;
+            }
+            case 64: {
+
+              optional_ = input.readBool();
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          dims_.makeImmutable(); // C
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInput_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInput_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Builder.class);
+    }
+
+    /**
+     * <pre>
+     *&#64;&#64;
+     *&#64;&#64;  .. cpp:enum:: Format
+     *&#64;&#64;
+     *&#64;&#64;     The format for the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf enum {@code inference.ModelInput.Format}
+     */
+    public enum Format
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Format::FORMAT_NONE = 0
+       *&#64;&#64;
+       *&#64;&#64;       The input has no specific format. This is the default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>FORMAT_NONE = 0;</code>
+       */
+      FORMAT_NONE(0),
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Format::FORMAT_NHWC = 1
+       *&#64;&#64;
+       *&#64;&#64;       HWC image format. Tensors with this format require 3 dimensions
+       *&#64;&#64;       if the model does not support batching (max_batch_size = 0) or 4
+       *&#64;&#64;       dimensions if the model does support batching (max_batch_size
+       *&#64;&#64;       &gt;= 1). In either case the 'dims' below should only specify the
+       *&#64;&#64;       3 non-batch dimensions (i.e. HWC or CHW).
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>FORMAT_NHWC = 1;</code>
+       */
+      FORMAT_NHWC(1),
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Format::FORMAT_NCHW = 2
+       *&#64;&#64;
+       *&#64;&#64;       CHW image format. Tensors with this format require 3 dimensions
+       *&#64;&#64;       if the model does not support batching (max_batch_size = 0) or 4
+       *&#64;&#64;       dimensions if the model does support batching (max_batch_size
+       *&#64;&#64;       &gt;= 1). In either case the 'dims' below should only specify the
+       *&#64;&#64;       3 non-batch dimensions (i.e. HWC or CHW).
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>FORMAT_NCHW = 2;</code>
+       */
+      FORMAT_NCHW(2),
+      UNRECOGNIZED(-1),
+      ;
+
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Format::FORMAT_NONE = 0
+       *&#64;&#64;
+       *&#64;&#64;       The input has no specific format. This is the default.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>FORMAT_NONE = 0;</code>
+       */
+      public static final int FORMAT_NONE_VALUE = 0;
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Format::FORMAT_NHWC = 1
+       *&#64;&#64;
+       *&#64;&#64;       HWC image format. Tensors with this format require 3 dimensions
+       *&#64;&#64;       if the model does not support batching (max_batch_size = 0) or 4
+       *&#64;&#64;       dimensions if the model does support batching (max_batch_size
+       *&#64;&#64;       &gt;= 1). In either case the 'dims' below should only specify the
+       *&#64;&#64;       3 non-batch dimensions (i.e. HWC or CHW).
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>FORMAT_NHWC = 1;</code>
+       */
+      public static final int FORMAT_NHWC_VALUE = 1;
+      /**
+       * <pre>
+       *&#64;&#64;    .. cpp:enumerator:: Format::FORMAT_NCHW = 2
+       *&#64;&#64;
+       *&#64;&#64;       CHW image format. Tensors with this format require 3 dimensions
+       *&#64;&#64;       if the model does not support batching (max_batch_size = 0) or 4
+       *&#64;&#64;       dimensions if the model does support batching (max_batch_size
+       *&#64;&#64;       &gt;= 1). In either case the 'dims' below should only specify the
+       *&#64;&#64;       3 non-batch dimensions (i.e. HWC or CHW).
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>FORMAT_NCHW = 2;</code>
+       */
+      public static final int FORMAT_NCHW_VALUE = 2;
+
+
+      public final int getNumber() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalArgumentException(
+              "Can't get the number of an unknown enum value.");
+        }
+        return value;
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static Format valueOf(int value) {
+        return forNumber(value);
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       */
+      public static Format forNumber(int value) {
+        switch (value) {
+          case 0: return FORMAT_NONE;
+          case 1: return FORMAT_NHWC;
+          case 2: return FORMAT_NCHW;
+          default: return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap<Format>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static final com.google.protobuf.Internal.EnumLiteMap<
+          Format> internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<Format>() {
+              public Format findValueByNumber(int number) {
+                return Format.forNumber(number);
+              }
+            };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalStateException(
+              "Can't get the descriptor of an unrecognized enum value.");
+        }
+        return getDescriptor().getValues().get(ordinal());
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final Format[] VALUES = values();
+
+      public static Format valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        if (desc.getIndex() == -1) {
+          return UNRECOGNIZED;
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int value;
+
+      private Format(int value) {
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:inference.ModelInput.Format)
+    }
+
+    public static final int NAME_FIELD_NUMBER = 1;
+    private volatile java.lang.Object name_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     The name of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The name.
+     */
+    @java.lang.Override
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     The name of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The bytes for name.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int DATA_TYPE_FIELD_NUMBER = 2;
+    private int dataType_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: DataType data_type
+     *&#64;&#64;
+     *&#64;&#64;     The data-type of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.DataType data_type = 2;</code>
+     * @return The enum numeric value on the wire for dataType.
+     */
+    @java.lang.Override public int getDataTypeValue() {
+      return dataType_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: DataType data_type
+     *&#64;&#64;
+     *&#64;&#64;     The data-type of the input.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.DataType data_type = 2;</code>
+     * @return The dataType.
+     */
+    @java.lang.Override public org.apache.submarine.server.api.proto.TritonModelConfig.DataType getDataType() {
+      @SuppressWarnings("deprecation")
+      org.apache.submarine.server.api.proto.TritonModelConfig.DataType result = org.apache.submarine.server.api.proto.TritonModelConfig.DataType.valueOf(dataType_);
+      return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.DataType.UNRECOGNIZED : result;
+    }
+
+    public static final int FORMAT_FIELD_NUMBER = 3;
+    private int format_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Format format
+     *&#64;&#64;
+     *&#64;&#64;     The format of the input. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInput.Format format = 3;</code>
+     * @return The enum numeric value on the wire for format.
+     */
+    @java.lang.Override public int getFormatValue() {
+      return format_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: Format format
+     *&#64;&#64;
+     *&#64;&#64;     The format of the input. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelInput.Format format = 3;</code>
+     * @return The format.
+     */
+    @java.lang.Override public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format getFormat() {
+      @SuppressWarnings("deprecation")
+      org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format result = org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format.valueOf(format_);
+      return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format.UNRECOGNIZED : result;
+    }
+
+    public static final int DIMS_FIELD_NUMBER = 4;
+    private com.google.protobuf.Internal.LongList dims_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+     *&#64;&#64;     when invoking the inference API for this model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 4;</code>
+     * @return A list containing the dims.
+     */
+    @java.lang.Override
+    public java.util.List<java.lang.Long>
+        getDimsList() {
+      return dims_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+     *&#64;&#64;     when invoking the inference API for this model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 4;</code>
+     * @return The count of dims.
+     */
+    public int getDimsCount() {
+      return dims_.size();
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+     *&#64;&#64;     when invoking the inference API for this model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 4;</code>
+     * @param index The index of the element to return.
+     * @return The dims at the given index.
+     */
+    public long getDims(int index) {
+      return dims_.getLong(index);
+    }
+    private int dimsMemoizedSerializedSize = -1;
+
+    public static final int RESHAPE_FIELD_NUMBER = 5;
+    private org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape reshape_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape expected for this input by the backend. The input will
+     *&#64;&#64;     be reshaped to this before being presented to the backend. The
+     *&#64;&#64;     reshape must have the same number of elements as the input shape
+     *&#64;&#64;     specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     * @return Whether the reshape field is set.
+     */
+    @java.lang.Override
+    public boolean hasReshape() {
+      return reshape_ != null;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape expected for this input by the backend. The input will
+     *&#64;&#64;     be reshaped to this before being presented to the backend. The
+     *&#64;&#64;     reshape must have the same number of elements as the input shape
+     *&#64;&#64;     specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     * @return The reshape.
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape getReshape() {
+      return reshape_ == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.getDefaultInstance() : reshape_;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape expected for this input by the backend. The input will
+     *&#64;&#64;     be reshaped to this before being presented to the backend. The
+     *&#64;&#64;     reshape must have the same number of elements as the input shape
+     *&#64;&#64;     specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     */
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder getReshapeOrBuilder() {
+      return getReshape();
+    }
+
+    public static final int IS_SHAPE_TENSOR_FIELD_NUMBER = 6;
+    private boolean isShapeTensor_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool is_shape_tensor
+     *&#64;&#64;
+     *&#64;&#64;     Whether or not the input is a shape tensor to the model. This field
+     *&#64;&#64;     is currently supported only for the TensorRT model. An error will be
+     *&#64;&#64;     generated if this specification does not comply with underlying
+     *&#64;&#64;     model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool is_shape_tensor = 6;</code>
+     * @return The isShapeTensor.
+     */
+    @java.lang.Override
+    public boolean getIsShapeTensor() {
+      return isShapeTensor_;
+    }
+
+    public static final int ALLOW_RAGGED_BATCH_FIELD_NUMBER = 7;
+    private boolean allowRaggedBatch_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool allow_ragged_batch
+     *&#64;&#64;
+     *&#64;&#64;     Whether or not the input is allowed to be "ragged" in a dynamically
+     *&#64;&#64;     created batch. Default is false indicating that two requests will
+     *&#64;&#64;     only be batched if this tensor has the same shape in both requests.
+     *&#64;&#64;     True indicates that two requests can be batched even if this tensor
+     *&#64;&#64;     has a different shape in each request.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool allow_ragged_batch = 7;</code>
+     * @return The allowRaggedBatch.
+     */
+    @java.lang.Override
+    public boolean getAllowRaggedBatch() {
+      return allowRaggedBatch_;
+    }
+
+    public static final int OPTIONAL_FIELD_NUMBER = 8;
+    private boolean optional_;
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool optional
+     *&#64;&#64;
+     *&#64;&#64;     Whether or not the input is optional for the model execution.
+     *&#64;&#64;     If true, the input is not required in the inference request.
+     *&#64;&#64;     Default value is false.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool optional = 8;</code>
+     * @return The optional.
+     */
+    @java.lang.Override
+    public boolean getOptional() {
+      return optional_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+      }
+      if (dataType_ != org.apache.submarine.server.api.proto.TritonModelConfig.DataType.TYPE_INVALID.getNumber()) {
+        output.writeEnum(2, dataType_);
+      }
+      if (format_ != org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format.FORMAT_NONE.getNumber()) {
+        output.writeEnum(3, format_);
+      }
+      if (getDimsList().size() > 0) {
+        output.writeUInt32NoTag(34);
+        output.writeUInt32NoTag(dimsMemoizedSerializedSize);
+      }
+      for (int i = 0; i < dims_.size(); i++) {
+        output.writeInt64NoTag(dims_.getLong(i));
+      }
+      if (reshape_ != null) {
+        output.writeMessage(5, getReshape());
+      }
+      if (isShapeTensor_ != false) {
+        output.writeBool(6, isShapeTensor_);
+      }
+      if (allowRaggedBatch_ != false) {
+        output.writeBool(7, allowRaggedBatch_);
+      }
+      if (optional_ != false) {
+        output.writeBool(8, optional_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+      }
+      if (dataType_ != org.apache.submarine.server.api.proto.TritonModelConfig.DataType.TYPE_INVALID.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, dataType_);
+      }
+      if (format_ != org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format.FORMAT_NONE.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(3, format_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < dims_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeInt64SizeNoTag(dims_.getLong(i));
+        }
+        size += dataSize;
+        if (!getDimsList().isEmpty()) {
+          size += 1;
+          size += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(dataSize);
+        }
+        dimsMemoizedSerializedSize = dataSize;
+      }
+      if (reshape_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, getReshape());
+      }
+      if (isShapeTensor_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(6, isShapeTensor_);
+      }
+      if (allowRaggedBatch_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(7, allowRaggedBatch_);
+      }
+      if (optional_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(8, optional_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput)) {
+        return super.equals(obj);
+      }
+      org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput other = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput) obj;
+
+      if (!getName()
+          .equals(other.getName())) return false;
+      if (dataType_ != other.dataType_) return false;
+      if (format_ != other.format_) return false;
+      if (!getDimsList()
+          .equals(other.getDimsList())) return false;
+      if (hasReshape() != other.hasReshape()) return false;
+      if (hasReshape()) {
+        if (!getReshape()
+            .equals(other.getReshape())) return false;
+      }
+      if (getIsShapeTensor()
+          != other.getIsShapeTensor()) return false;
+      if (getAllowRaggedBatch()
+          != other.getAllowRaggedBatch()) return false;
+      if (getOptional()
+          != other.getOptional()) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      hash = (37 * hash) + DATA_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + dataType_;
+      hash = (37 * hash) + FORMAT_FIELD_NUMBER;
+      hash = (53 * hash) + format_;
+      if (getDimsCount() > 0) {
+        hash = (37 * hash) + DIMS_FIELD_NUMBER;
+        hash = (53 * hash) + getDimsList().hashCode();
+      }
+      if (hasReshape()) {
+        hash = (37 * hash) + RESHAPE_FIELD_NUMBER;
+        hash = (53 * hash) + getReshape().hashCode();
+      }
+      hash = (37 * hash) + IS_SHAPE_TENSOR_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIsShapeTensor());
+      hash = (37 * hash) + ALLOW_RAGGED_BATCH_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getAllowRaggedBatch());
+      hash = (37 * hash) + OPTIONAL_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getOptional());
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     *&#64;&#64;
+     *&#64;&#64;.. cpp:var:: message ModelInput
+     *&#64;&#64;
+     *&#64;&#64;   An input required by the model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * Protobuf type {@code inference.ModelInput}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:inference.ModelInput)
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInputOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInput_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInput_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.class, org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Builder.class);
+      }
+
+      // Construct using org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+
+        dataType_ = 0;
+
+        format_ = 0;
+
+        dims_ = emptyLongList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (reshapeBuilder_ == null) {
+          reshape_ = null;
+        } else {
+          reshape_ = null;
+          reshapeBuilder_ = null;
+        }
+        isShapeTensor_ = false;
+
+        allowRaggedBatch_ = false;
+
+        optional_ = false;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.internal_static_inference_ModelInput_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput getDefaultInstanceForType() {
+        return org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput build() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput buildPartial() {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput result = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput(this);
+        int from_bitField0_ = bitField0_;
+        result.name_ = name_;
+        result.dataType_ = dataType_;
+        result.format_ = format_;
+        if (((bitField0_ & 0x00000001) != 0)) {
+          dims_.makeImmutable();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.dims_ = dims_;
+        if (reshapeBuilder_ == null) {
+          result.reshape_ = reshape_;
+        } else {
+          result.reshape_ = reshapeBuilder_.build();
+        }
+        result.isShapeTensor_ = isShapeTensor_;
+        result.allowRaggedBatch_ = allowRaggedBatch_;
+        result.optional_ = optional_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput) {
+          return mergeFrom((org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput other) {
+        if (other == org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.getDefaultInstance()) return this;
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.dataType_ != 0) {
+          setDataTypeValue(other.getDataTypeValue());
+        }
+        if (other.format_ != 0) {
+          setFormatValue(other.getFormatValue());
+        }
+        if (!other.dims_.isEmpty()) {
+          if (dims_.isEmpty()) {
+            dims_ = other.dims_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureDimsIsMutable();
+            dims_.addAll(other.dims_);
+          }
+          onChanged();
+        }
+        if (other.hasReshape()) {
+          mergeReshape(other.getReshape());
+        }
+        if (other.getIsShapeTensor() != false) {
+          setIsShapeTensor(other.getIsShapeTensor());
+        }
+        if (other.getAllowRaggedBatch() != false) {
+          setAllowRaggedBatch(other.getAllowRaggedBatch());
+        }
+        if (other.getOptional() != false) {
+          setOptional(other.getOptional());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.lang.Object name_ = "";
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: string name
+       *&#64;&#64;
+       *&#64;&#64;     The name of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      private int dataType_ = 0;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: DataType data_type
+       *&#64;&#64;
+       *&#64;&#64;     The data-type of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.DataType data_type = 2;</code>
+       * @return The enum numeric value on the wire for dataType.
+       */
+      @java.lang.Override public int getDataTypeValue() {
+        return dataType_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: DataType data_type
+       *&#64;&#64;
+       *&#64;&#64;     The data-type of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.DataType data_type = 2;</code>
+       * @param value The enum numeric value on the wire for dataType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDataTypeValue(int value) {
+        
+        dataType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: DataType data_type
+       *&#64;&#64;
+       *&#64;&#64;     The data-type of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.DataType data_type = 2;</code>
+       * @return The dataType.
+       */
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.DataType getDataType() {
+        @SuppressWarnings("deprecation")
+        org.apache.submarine.server.api.proto.TritonModelConfig.DataType result = org.apache.submarine.server.api.proto.TritonModelConfig.DataType.valueOf(dataType_);
+        return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.DataType.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: DataType data_type
+       *&#64;&#64;
+       *&#64;&#64;     The data-type of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.DataType data_type = 2;</code>
+       * @param value The dataType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDataType(org.apache.submarine.server.api.proto.TritonModelConfig.DataType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        dataType_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: DataType data_type
+       *&#64;&#64;
+       *&#64;&#64;     The data-type of the input.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.DataType data_type = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearDataType() {
+        
+        dataType_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int format_ = 0;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Format format
+       *&#64;&#64;
+       *&#64;&#64;     The format of the input. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInput.Format format = 3;</code>
+       * @return The enum numeric value on the wire for format.
+       */
+      @java.lang.Override public int getFormatValue() {
+        return format_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Format format
+       *&#64;&#64;
+       *&#64;&#64;     The format of the input. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInput.Format format = 3;</code>
+       * @param value The enum numeric value on the wire for format to set.
+       * @return This builder for chaining.
+       */
+      public Builder setFormatValue(int value) {
+        
+        format_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Format format
+       *&#64;&#64;
+       *&#64;&#64;     The format of the input. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInput.Format format = 3;</code>
+       * @return The format.
+       */
+      @java.lang.Override
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format getFormat() {
+        @SuppressWarnings("deprecation")
+        org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format result = org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format.valueOf(format_);
+        return result == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Format format
+       *&#64;&#64;
+       *&#64;&#64;     The format of the input. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInput.Format format = 3;</code>
+       * @param value The format to set.
+       * @return This builder for chaining.
+       */
+      public Builder setFormat(org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput.Format value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        format_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: Format format
+       *&#64;&#64;
+       *&#64;&#64;     The format of the input. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelInput.Format format = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearFormat() {
+        
+        format_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.Internal.LongList dims_ = emptyLongList();
+      private void ensureDimsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          dims_ = mutableCopy(dims_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+       *&#64;&#64;     when invoking the inference API for this model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 dims = 4;</code>
+       * @return A list containing the dims.
+       */
+      public java.util.List<java.lang.Long>
+          getDimsList() {
+        return ((bitField0_ & 0x00000001) != 0) ?
+                 java.util.Collections.unmodifiableList(dims_) : dims_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+       *&#64;&#64;     when invoking the inference API for this model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 dims = 4;</code>
+       * @return The count of dims.
+       */
+      public int getDimsCount() {
+        return dims_.size();
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+       *&#64;&#64;     when invoking the inference API for this model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 dims = 4;</code>
+       * @param index The index of the element to return.
+       * @return The dims at the given index.
+       */
+      public long getDims(int index) {
+        return dims_.getLong(index);
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+       *&#64;&#64;     when invoking the inference API for this model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 dims = 4;</code>
+       * @param index The index to set the value at.
+       * @param value The dims to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDims(
+          int index, long value) {
+        ensureDimsIsMutable();
+        dims_.setLong(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+       *&#64;&#64;     when invoking the inference API for this model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 dims = 4;</code>
+       * @param value The dims to add.
+       * @return This builder for chaining.
+       */
+      public Builder addDims(long value) {
+        ensureDimsIsMutable();
+        dims_.addLong(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+       *&#64;&#64;     when invoking the inference API for this model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 dims = 4;</code>
+       * @param values The dims to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllDims(
+          java.lang.Iterable<? extends java.lang.Long> values) {
+        ensureDimsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, dims_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+       *&#64;&#64;
+       *&#64;&#64;     The dimensions/shape of the input tensor that must be provided
+       *&#64;&#64;     when invoking the inference API for this model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>repeated int64 dims = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearDims() {
+        dims_ = emptyLongList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+
+      private org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape reshape_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder> reshapeBuilder_;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       * @return Whether the reshape field is set.
+       */
+      public boolean hasReshape() {
+        return reshapeBuilder_ != null || reshape_ != null;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       * @return The reshape.
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape getReshape() {
+        if (reshapeBuilder_ == null) {
+          return reshape_ == null ? org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.getDefaultInstance() : reshape_;
+        } else {
+          return reshapeBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       */
+      public Builder setReshape(org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape value) {
+        if (reshapeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          reshape_ = value;
+          onChanged();
+        } else {
+          reshapeBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       */
+      public Builder setReshape(
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder builderForValue) {
+        if (reshapeBuilder_ == null) {
+          reshape_ = builderForValue.build();
+          onChanged();
+        } else {
+          reshapeBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       */
+      public Builder mergeReshape(org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape value) {
+        if (reshapeBuilder_ == null) {
+          if (reshape_ != null) {
+            reshape_ =
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.newBuilder(reshape_).mergeFrom(value).buildPartial();
+          } else {
+            reshape_ = value;
+          }
+          onChanged();
+        } else {
+          reshapeBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       */
+      public Builder clearReshape() {
+        if (reshapeBuilder_ == null) {
+          reshape_ = null;
+          onChanged();
+        } else {
+          reshape_ = null;
+          reshapeBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder getReshapeBuilder() {
+        
+        onChanged();
+        return getReshapeFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       */
+      public org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder getReshapeOrBuilder() {
+        if (reshapeBuilder_ != null) {
+          return reshapeBuilder_.getMessageOrBuilder();
+        } else {
+          return reshape_ == null ?
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.getDefaultInstance() : reshape_;
+        }
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+       *&#64;&#64;
+       *&#64;&#64;     The shape expected for this input by the backend. The input will
+       *&#64;&#64;     be reshaped to this before being presented to the backend. The
+       *&#64;&#64;     reshape must have the same number of elements as the input shape
+       *&#64;&#64;     specified by 'dims'. Optional.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>.inference.ModelTensorReshape reshape = 5;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder> 
+          getReshapeFieldBuilder() {
+        if (reshapeBuilder_ == null) {
+          reshapeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder, org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder>(
+                  getReshape(),
+                  getParentForChildren(),
+                  isClean());
+          reshape_ = null;
+        }
+        return reshapeBuilder_;
+      }
+
+      private boolean isShapeTensor_ ;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool is_shape_tensor
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is a shape tensor to the model. This field
+       *&#64;&#64;     is currently supported only for the TensorRT model. An error will be
+       *&#64;&#64;     generated if this specification does not comply with underlying
+       *&#64;&#64;     model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool is_shape_tensor = 6;</code>
+       * @return The isShapeTensor.
+       */
+      @java.lang.Override
+      public boolean getIsShapeTensor() {
+        return isShapeTensor_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool is_shape_tensor
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is a shape tensor to the model. This field
+       *&#64;&#64;     is currently supported only for the TensorRT model. An error will be
+       *&#64;&#64;     generated if this specification does not comply with underlying
+       *&#64;&#64;     model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool is_shape_tensor = 6;</code>
+       * @param value The isShapeTensor to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIsShapeTensor(boolean value) {
+        
+        isShapeTensor_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool is_shape_tensor
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is a shape tensor to the model. This field
+       *&#64;&#64;     is currently supported only for the TensorRT model. An error will be
+       *&#64;&#64;     generated if this specification does not comply with underlying
+       *&#64;&#64;     model.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool is_shape_tensor = 6;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearIsShapeTensor() {
+        
+        isShapeTensor_ = false;
+        onChanged();
+        return this;
+      }
+
+      private boolean allowRaggedBatch_ ;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool allow_ragged_batch
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is allowed to be "ragged" in a dynamically
+       *&#64;&#64;     created batch. Default is false indicating that two requests will
+       *&#64;&#64;     only be batched if this tensor has the same shape in both requests.
+       *&#64;&#64;     True indicates that two requests can be batched even if this tensor
+       *&#64;&#64;     has a different shape in each request.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool allow_ragged_batch = 7;</code>
+       * @return The allowRaggedBatch.
+       */
+      @java.lang.Override
+      public boolean getAllowRaggedBatch() {
+        return allowRaggedBatch_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool allow_ragged_batch
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is allowed to be "ragged" in a dynamically
+       *&#64;&#64;     created batch. Default is false indicating that two requests will
+       *&#64;&#64;     only be batched if this tensor has the same shape in both requests.
+       *&#64;&#64;     True indicates that two requests can be batched even if this tensor
+       *&#64;&#64;     has a different shape in each request.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool allow_ragged_batch = 7;</code>
+       * @param value The allowRaggedBatch to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAllowRaggedBatch(boolean value) {
+        
+        allowRaggedBatch_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool allow_ragged_batch
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is allowed to be "ragged" in a dynamically
+       *&#64;&#64;     created batch. Default is false indicating that two requests will
+       *&#64;&#64;     only be batched if this tensor has the same shape in both requests.
+       *&#64;&#64;     True indicates that two requests can be batched even if this tensor
+       *&#64;&#64;     has a different shape in each request.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool allow_ragged_batch = 7;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearAllowRaggedBatch() {
+        
+        allowRaggedBatch_ = false;
+        onChanged();
+        return this;
+      }
+
+      private boolean optional_ ;
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool optional
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is optional for the model execution.
+       *&#64;&#64;     If true, the input is not required in the inference request.
+       *&#64;&#64;     Default value is false.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool optional = 8;</code>
+       * @return The optional.
+       */
+      @java.lang.Override
+      public boolean getOptional() {
+        return optional_;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool optional
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is optional for the model execution.
+       *&#64;&#64;     If true, the input is not required in the inference request.
+       *&#64;&#64;     Default value is false.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool optional = 8;</code>
+       * @param value The optional to set.
+       * @return This builder for chaining.
+       */
+      public Builder setOptional(boolean value) {
+        
+        optional_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       *&#64;&#64;  .. cpp:var:: bool optional
+       *&#64;&#64;
+       *&#64;&#64;     Whether or not the input is optional for the model execution.
+       *&#64;&#64;     If true, the input is not required in the inference request.
+       *&#64;&#64;     Default value is false.
+       *&#64;&#64;
+       * </pre>
+       *
+       * <code>bool optional = 8;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearOptional() {
+        
+        optional_ = false;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:inference.ModelInput)
+    }
+
+    // @@protoc_insertion_point(class_scope:inference.ModelInput)
+    private static final org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput();
+    }
+
+    public static org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ModelInput>
+        PARSER = new com.google.protobuf.AbstractParser<ModelInput>() {
+      @java.lang.Override
+      public ModelInput parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ModelInput(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<ModelInput> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ModelInput> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.submarine.server.api.proto.TritonModelConfig.ModelInput getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ModelOutputOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:inference.ModelOutput)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     The name of the output.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string name
+     *&#64;&#64;
+     *&#64;&#64;     The name of the output.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: DataType data_type
+     *&#64;&#64;
+     *&#64;&#64;     The data-type of the output.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.DataType data_type = 2;</code>
+     * @return The enum numeric value on the wire for dataType.
+     */
+    int getDataTypeValue();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: DataType data_type
+     *&#64;&#64;
+     *&#64;&#64;     The data-type of the output.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.DataType data_type = 2;</code>
+     * @return The dataType.
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.DataType getDataType();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the output tensor.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 3;</code>
+     * @return A list containing the dims.
+     */
+    java.util.List<java.lang.Long> getDimsList();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the output tensor.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 3;</code>
+     * @return The count of dims.
+     */
+    int getDimsCount();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: int64 dims (repeated)
+     *&#64;&#64;
+     *&#64;&#64;     The dimensions/shape of the output tensor.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>repeated int64 dims = 3;</code>
+     * @param index The index of the element to return.
+     * @return The dims at the given index.
+     */
+    long getDims(int index);
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape produced for this output by the backend. The output will
+     *&#64;&#64;     be reshaped from this to the shape specifed in 'dims' before being
+     *&#64;&#64;     returned in the inference response. The reshape must have the same
+     *&#64;&#64;     number of elements as the output shape specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     * @return Whether the reshape field is set.
+     */
+    boolean hasReshape();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape produced for this output by the backend. The output will
+     *&#64;&#64;     be reshaped from this to the shape specifed in 'dims' before being
+     *&#64;&#64;     returned in the inference response. The reshape must have the same
+     *&#64;&#64;     number of elements as the output shape specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     * @return The reshape.
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape getReshape();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: ModelTensorReshape reshape
+     *&#64;&#64;
+     *&#64;&#64;     The shape produced for this output by the backend. The output will
+     *&#64;&#64;     be reshaped from this to the shape specifed in 'dims' before being
+     *&#64;&#64;     returned in the inference response. The reshape must have the same
+     *&#64;&#64;     number of elements as the output shape specified by 'dims'. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>.inference.ModelTensorReshape reshape = 5;</code>
+     */
+    org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshapeOrBuilder getReshapeOrBuilder();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string label_filename
+     *&#64;&#64;
+     *&#64;&#64;     The label file associated with this output. Should be specified only
+     *&#64;&#64;     for outputs that represent classifications. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string label_filename = 4;</code>
+     * @return The labelFilename.
+     */
+    java.lang.String getLabelFilename();
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: string label_filename
+     *&#64;&#64;
+     *&#64;&#64;     The label file associated with this output. Should be specified only
+     *&#64;&#64;     for outputs that represent classifications. Optional.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>string label_filename = 4;</code>
+     * @return The bytes for labelFilename.
+     */
+    com.google.protobuf.ByteString
+        getLabelFilenameBytes();
+
+    /**
+     * <pre>
+     *&#64;&#64;  .. cpp:var:: bool is_shape_tensor
+     *&#64;&#64;
+     *&#64;&#64;     Whether or not the output is a shape tensor to the model. This field
+     *&#64;&#64;     is currently supported only for the TensorRT model. An error will be
+     *&#64;&#64;     generated if this specification does not comply with underlying
+     *&#64;&#64;     model.
+     *&#64;&#64;
+     * </pre>
+     *
+     * <code>bool is_shape_tensor = 6;</code>
+     * @return The isShapeTensor.
+     */
+    boolean getIsShapeTensor();
+  }
+  /**
+   * <pre>
+   *&#64;&#64;
+   *&#64;&#64;.. cpp:var:: message ModelOutput
+   *&#64;&#64;
+   *&#64;&#64;   An output produced by the model.
+   *&#64;&#64;
+   * </pre>
+   *
+   * Protobuf type {@code inference.ModelOutput}
+   */
+  public static final class ModelOutput extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:inference.ModelOutput)
+      ModelOutputOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ModelOutput.newBuilder() to construct.
+    private ModelOutput(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ModelOutput() {
+      name_ = "";
+      dataType_ = 0;
+      dims_ = emptyLongList();
+      labelFilename_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ModelOutput();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ModelOutput(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              name_ = s;
+              break;
+            }
+            case 16: {
+              int rawValue = input.readEnum();
+
+              dataType_ = rawValue;
+              break;
+            }
+            case 24: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                dims_ = newLongList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              dims_.addLong(input.readInt64());
+              break;
+            }
+            case 26: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+                dims_ = newLongList();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              while (input.getBytesUntilLimit() > 0) {
+                dims_.addLong(input.readInt64());
+              }
+              input.popLimit(limit);
+              break;
+            }
+            case 34: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              labelFilename_ = s;
+              break;
+            }
+            case 42: {
+              org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.Builder subBuilder = null;
+              if (reshape_ != null) {
+                subBuilder = reshape_.toBuilder();
+              }
+              reshape_ = input.readMessage(org.apache.submarine.server.api.proto.TritonModelConfig.ModelTensorReshape.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(reshape_);
+                reshape_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 48: {
+
+              isShapeTensor_ = input.readBool();
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
... 57061 lines suppressed ...

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@submarine.apache.org
For additional commands, e-mail: dev-help@submarine.apache.org