Skip to content
This repository was archived by the owner on Feb 20, 2024. It is now read-only.

Commit 2db47fb

Browse files
committed
Dynamically find a free port for inference jobs
1 parent 51e228e commit 2db47fb

File tree

3 files changed

+9
-16
lines changed

3 files changed

+9
-16
lines changed

rafiki/admin/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from rafiki.db import Database
99
from rafiki.constants import ServiceStatus, UserType, ServiceType, InferenceJobStatus, \
1010
TrainJobStatus, ModelAccessRight, BudgetType
11-
from rafiki.config import MIN_SERVICE_PORT, MAX_SERVICE_PORT, SUPERADMIN_EMAIL, SUPERADMIN_PASSWORD
11+
from rafiki.config import SUPERADMIN_EMAIL, SUPERADMIN_PASSWORD
1212
from rafiki.model import ModelLogger
1313
from rafiki.container import DockerSwarmContainerManager
1414

rafiki/admin/services_manager.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
import logging
33
import traceback
44
import time
5+
import socket
6+
from contextlib import closing
57

68
from rafiki.db import Database
79
from rafiki.constants import ServiceStatus, UserType, ServiceType, BudgetType
8-
from rafiki.config import MIN_SERVICE_PORT, MAX_SERVICE_PORT, \
9-
TRAIN_WORKER_REPLICAS_PER_SUB_TRAIN_JOB, INFERENCE_WORKER_REPLICAS_PER_TRIAL, \
10+
from rafiki.config import TRAIN_WORKER_REPLICAS_PER_SUB_TRAIN_JOB, INFERENCE_WORKER_REPLICAS_PER_TRIAL, \
1011
INFERENCE_MAX_BEST_TRIALS, SERVICE_STATUS_WAIT
1112
from rafiki.container import DockerSwarmContainerManager, ServiceRequirement, InvalidServiceRequest
1213
from rafiki.model import parse_model_install_command
@@ -347,18 +348,12 @@ def _create_service(self, service_type, docker_image,
347348

348349
return service
349350

350-
# Compute next available external port
351351
def _get_available_ext_port(self):
352-
services = self._db.get_services(status=ServiceStatus.RUNNING)
353-
used_ports = [int(x.ext_port) for x in services if x.ext_port is not None]
354-
port = MIN_SERVICE_PORT
355-
while port <= MAX_SERVICE_PORT:
356-
if port not in used_ports:
357-
return port
358-
359-
port += 1
360-
361-
return port
352+
# Credits to https://stackoverflow.com/questions/1365265/on-localhost-how-do-i-pick-a-free-port-number
353+
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
354+
s.bind(('', 0))
355+
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
356+
return s.getsockname()[1]
362357

363358
def _get_best_trials_for_inference(self, inference_job):
364359
best_trials = self._db.get_best_trials_of_train_job(inference_job.train_job_id)

rafiki/config.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
SUPERADMIN_PASSWORD = 'rafiki'
77

88
# Admin
9-
MIN_SERVICE_PORT = 30000
10-
MAX_SERVICE_PORT = 32767
119
SERVICE_STATUS_WAIT = 1
1210
TRAIN_WORKER_REPLICAS_PER_SUB_TRAIN_JOB = 2
1311
INFERENCE_WORKER_REPLICAS_PER_TRIAL = 2

0 commit comments

Comments
 (0)