Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix GRPC address assignment to localhost by default #3083

Merged
merged 4 commits into from
Apr 11, 2024

Conversation

namannandan
Copy link
Collaborator

Description

In the current implementation, the configured GRPC port is by default associated with the wildcard address

NettyServerBuilder.forPort(configManager.getGRPCPort(connectorType))

$ torchserve --ncs --start --model-store ./model-store

$ netstat -an | grep 7070
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp46      0      0  *.7070                 *.*                    LISTEN

$ netstat -an | grep 7071
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp46      0      0  *.7071                 *.*                    LISTEN

Note that the grpc ports 7070 and 7071 are associated with the wildcard address *.

With the fix in this PR, the grpc ports are associated with localhost(127.0.0.1) by default.

$ torchserve --ncs --start --model-store ./model-store

$ netstat -an | grep 7070
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp46      0      0  127.0.0.1.7070                 *.*                    LISTEN

$ netstat -an | grep 7071
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp46      0      0  127.0.0.1.7071                 *.*                    LISTEN

In case of docker, the grpc address will need to be configured to 0.0.0.0 similar to the http management and inference addresses because otherwise, the grpc endpoint will not be accessible from outside the container:

inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081

Documentation already includes best practice to bind localhost ports to the ports exposed by docker to ensure access only to the host on which the container is running.
https://github.com/pytorch/serve/tree/master/docker#security-guideline

Type of change

Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)

Feature/Issue validation/testing

  • CI

  • Manual Test

$ torchserve --ncs --start --model-store ./model-store

$ python ts_scripts/torchserve_grpc_client.py register densenet161
## Check densenet161.mar in mar_set : set()
## Register marfile: https://torchserve.s3.amazonaws.com/mar_files/densenet161.mar

Model densenet161 registered successfully

$ python ts_scripts/torchserve_grpc_client.py infer densenet161 examples/image_classifier/kitten.jpg
{
  "tabby": 0.46661901473999023,
  "tiger_cat": 0.46449053287506104,
  "Egyptian_cat": 0.06614045053720474,
  "lynx": 0.0012924427865073085,
  "plastic_bag": 0.00022909742256160825
}

$ python ts_scripts/torchserve_grpc_client.py unregister densenet161
Model densenet161 unregistered successfully

public InetAddress getGRPCAddress(ConnectorType connectorType) throws UnknownHostException {
if (connectorType == ConnectorType.MANAGEMENT_CONNECTOR) {
return InetAddress.getByName(prop.getProperty(TS_GRPC_MANAGEMENT_ADDRESS, "127.0.0.1"));
} else {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we be more explicit in the if else that the second clause is only for inference?

@@ -1,6 +1,8 @@
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081
metrics_address=http://0.0.0.0:8082
grpc_inference_address=0.0.0.0
Copy link
Member

@msaroufim msaroufim Apr 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how is the port set now?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It uses the default values from here:

public int getGRPCPort(ConnectorType connectorType) {
String port;
if (connectorType == ConnectorType.MANAGEMENT_CONNECTOR) {
port = prop.getProperty(TS_GRPC_MANAGEMENT_PORT, "7071");
} else {
port = prop.getProperty(TS_GRPC_INFERENCE_PORT, "7070");
}
return Integer.parseInt(port);
}

And is called here: https://github.com/pytorch/serve/pull/3083/files#diff-45f9e03a9d3046ef0e2c18e18b0bb9c1889f9e3ff9918568870539cc926e3895R454

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added configuration option to set grpc address separately from port to maintain backwards compatibility to retain the grpc port configuration:

private static final String TS_GRPC_INFERENCE_PORT = "grpc_inference_port";
private static final String TS_GRPC_MANAGEMENT_PORT = "grpc_management_port";

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we keep this consistent?
grpc_inference_address=http://0.0.0.0:7070
grpc_management_address=http://0.0.0.0:7071

Copy link
Collaborator Author

@namannandan namannandan Apr 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is possible to support configuration format as grpc_inference_address=http://0.0.0.0:7070 but we've had support to configure the GRPC ports alone since v0.3.0:

private static final String TS_GRPC_INFERENCE_PORT = "grpc_inference_port";
private static final String TS_GRPC_MANAGEMENT_PORT = "grpc_management_port";

To maintain backwards compatibility, I believe we'll need to retain the grpc port configuration.

If we were to allow specifying the port along with the address as grpc_inference_address=http://0.0.0.0:7070, I believe we'll have two options:

  1. Ignore the grpc port configuration ex grpc_inference_port if grpc_inference_address includes the port already.
  2. Override the port specified in grpc_inference_address with the port specified in grpc_inference_port.

Another option is to potentially rename grpc_inference_address to grpc_inference_ip_address to the make the configuration name more explicit to convey what the value is intended to be.

Let me know your thoughts or suggestions on better ways to handle it.

@namannandan namannandan added this pull request to the merge queue Apr 11, 2024
Merged via the queue into master with commit aab9950 Apr 11, 2024
12 of 13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants