def deploy(self, mdl_serve_class, mdl_serve, mdl_file_list=['model.dat'], reqs_file='requirements.txt'): my_file_list = [] my_file_list.extend(mdl_file_list) my_file_list.append(reqs_file) my_output_map = { key: value for (key, value) in self.MY_DEPLOYMENT_FILE_DICT.items() } #Add vessel ML core files to deployment image (MY_DEPLOYMENT_FILE_DICT dictionary has source and desired dest paths) self.preprocessor = FunctionPreProcessor(function_obj=mdl_serve, output_map=my_output_map, input_files=my_file_list) self.builder = ClusterBuilder( registry=self.DOCKER_REGISTRY, base_image=self.BASE_IMAGE, preprocessor=self.preprocessor, pod_spec_mutators=[ fairing.cloud.gcp.add_gcp_credentials_if_exists ], context_source=gcs_context.GCSContextSource()) self.builder.build() self.pod_spec = self.builder.generate_pod_spec() # TODO: Add support for deploying into custom user-provided namespaces (use namespace param of Serving class) self.infer_deployer = Serving(serving_class=mdl_serve_class) self.endpoint = self.infer_deployer.deploy(self.pod_spec) return self.endpoint
def get_builder( self, preprocessor, base_image, registry, needs_deps_installation=True, # pylint:disable=arguments-differ pod_spec_mutators=None): pod_spec_mutators = pod_spec_mutators or [] pod_spec_mutators.append(gcp.add_gcp_credentials_if_exists) pod_spec_mutators.append(docker.add_docker_credentials_if_exists) # TODO (karthikv2k): Add cloud build as the deafult # once https://github.com/kubeflow/fairing/issues/145 is fixed if not needs_deps_installation: return AppendBuilder(preprocessor=preprocessor, base_image=base_image, registry=registry) elif fairing.utils.is_running_in_k8s(): return ClusterBuilder( preprocessor=preprocessor, base_image=base_image, registry=registry, pod_spec_mutators=pod_spec_mutators, context_source=gcs_context.GCSContextSource( namespace=fairing.utils.get_default_target_namespace())) elif ml_tasks_utils.is_docker_daemon_exists(): return DockerBuilder(preprocessor=preprocessor, base_image=base_image, registry=registry) else: # TODO (karthikv2k): Add more info on how to reolve this issue raise RuntimeError( "Not able to guess the right builder for this job!")
def __init__(self, registry=None, context_source=gcs_context.GCSContextSource(), preprocessor=None, base_image=constants.DEFAULT_BASE_IMAGE, dockerfile_path=None): super().__init__( registry=registry, preprocessor=preprocessor, base_image=base_image, ) self.manager = KubeManager() self.context_source = context_source
def train_v1(self, mdl_trainer, train_data_file_list=['data/train.csv'], reqs_file='requirements.txt'): #TODO: optimize if sequence doesn't matter #logging.info("Creating docker context: %s", output_file) my_file_list = [] my_file_list.append(mdl_trainer) my_file_list.extend(train_data_file_list) my_file_list.append(reqs_file) my_output_map = { key: value for (key, value) in self.MY_DEPLOYMENT_FILE_DICT.items() } #for f in train_data_file_list: #fname = f.split("/")[-1] #my_output_map[os.path.normpath(f)] = "/app/data/{0}".format(fname) self.preprocessor = BasePreProcessor(input_files=my_file_list, output_map=my_output_map) self.builder = ClusterBuilder( registry=self.DOCKER_REGISTRY, base_image=self.BASE_IMAGE, preprocessor=self.preprocessor, pod_spec_mutators=[ fairing.cloud.gcp.add_gcp_credentials_if_exists ], context_source=gcs_context.GCSContextSource()) self.builder.build() self.pod_spec = self.builder.generate_pod_spec() self.train_deployer = TfJob(pod_spec_mutators=[ fairing.cloud.gcp.add_gcp_credentials_if_exists ], worker_count=1, chief_count=0) j_name = self.train_deployer.deploy(self.pod_spec) return (self.train_deployer.job_id, j_name)
def run_submission_with_function_preprocessor(capsys, deployer="job", builder="append", namespace="default", cleanup=False): py_version = ".".join([str(x) for x in sys.version_info[0:3]]) base_image = 'registry.hub.docker.com/library/python:{}'.format(py_version) if builder == 'cluster': fairing.config.set_builder( builder, base_image=base_image, registry=DOCKER_REGISTRY, pod_spec_mutators=[fairing.cloud.gcp.add_gcp_credentials], context_source=gcs_context.GCSContextSource(namespace=namespace), namespace=namespace) else: fairing.config.set_builder(builder, base_image=base_image, registry=DOCKER_REGISTRY) expected_result = str(uuid.uuid4()) fairing.config.set_deployer(deployer, namespace=namespace, cleanup=cleanup, labels={'pytest-id': expected_result}) remote_train = fairing.config.fn(lambda: train_fn(expected_result)) remote_train() captured = capsys.readouterr() assert expected_result in captured.out if deployer == "tfjob": if cleanup: assert expected_result not in str( get_tfjobs_with_labels('pytest-id=' + expected_result)) else: assert expected_result in str( get_tfjobs_with_labels('pytest-id=' + expected_result))
def __init__(self, registry=None, image_name=constants.DEFAULT_IMAGE_NAME, context_source=None, preprocessor=None, push=True, base_image=constants.DEFAULT_BASE_IMAGE, pod_spec_mutators=None, namespace="kubeflow", dockerfile_path=None): super().__init__( registry=registry, image_name=image_name, push=push, preprocessor=preprocessor, base_image=base_image, ) self.manager = KubeManager() if context_source is None: context_source = gcs_context.GCSContextSource(namespace=namespace) self.context_source = context_source self.pod_spec_mutators = pod_spec_mutators or [] self.namespace = namespace
def train(self, mdl_trainer, train_data_file_list=['train.csv'], reqs_file='requirements.txt'): my_file_list = [] my_file_list.append(reqs_file) my_output_map = { key: value for (key, value) in self.MY_DEPLOYMENT_FILE_DICT.items() } for f in train_data_file_list: fname = f.split("/")[-1] my_output_map[os.path.normpath(f)] = "/app/data/{0}".format(fname) self.preprocessor = FunctionPreProcessor(function_obj=mdl_trainer, output_map=my_output_map, input_files=my_file_list) self.builder = ClusterBuilder( registry=self.DOCKER_REGISTRY, base_image=self.BASE_IMAGE, preprocessor=self.preprocessor, pod_spec_mutators=[ fairing.cloud.gcp.add_gcp_credentials_if_exists ], context_source=gcs_context.GCSContextSource()) self.builder.build() self.pod_spec = self.builder.generate_pod_spec() self.train_deployer = TfJob(pod_spec_mutators=[ fairing.cloud.gcp.add_gcp_credentials_if_exists ], worker_count=1, chief_count=0) j_name = self.train_deployer.deploy(self.pod_spec) return (self.train_deployer.job_id, j_name)
def __init__(self, namespace=None, build_context_source=None): super(GKEBackend, self).__init__(namespace, build_context_source) self._build_context_source = gcs_context.GCSContextSource( namespace=self._namespace)
def __init__(self, namespace=None, build_context_source=None): build_context_source = build_context_source or gcs_context.GCSContextSource( namespace=namespace) super(GKEBackend, self).__init__(namespace, build_context_source)