1import re
2
3from omegaml.backends.basedata import BaseDataBackend
4from omegaml.backends.mlflow.localprojects import MLFlowProject
5from omegaml.backends.package.packager import RunnablePackageMixin
6
7
[docs]
8class MLFlowGitProjectBackend(RunnablePackageMixin, BaseDataBackend):
9 """
10 Backend to support git-sourced MLFlow projects
11
12 This supports any git remote source that MLFlow supports
13
14 Usage::
15
16 om.scripts.put('mlflow+ssh://git@github.com/<user>/<repo>.git', '<pkgname>')
17 om.scripts.put('mlflow+https://git@github.com/<user>/<repo>.git', '<pkgname>')
18 om.scripts.put('https://github.com/<user>/<repo>', '<pkgname>', kind='mlflow.project')
19
20 See Also:
21 * https://packaging.python.org/tutorials/packaging-projects/
22 * https://docs.github.com/en/get-started/getting-started-with-git/managing-remote-repositories#changing-a-remote-repositorys-url
23 """
24 KIND = 'mlflow.gitproject'
25 MLFLOW_GIT_PREFIX = re.compile(r'^mlflow\+(git|ssh|https).*')
26 GIT_PREFIX = 'https'
27
[docs]
28 @classmethod
29 def supports(self, obj, name, **kwargs):
30 is_mlflow_git = isinstance(obj, str) and self.MLFLOW_GIT_PREFIX.match(obj)
31 is_git = isinstance(obj, str) and obj.startswith(self.GIT_PREFIX) and kwargs.get('kind') == self.KIND
32 return is_mlflow_git or is_git
33
[docs]
34 def put(self, obj, name, attributes=None, **kwargs):
35 """
36 save a MLFlow git-sourceable project
37 """
38 git_uri = obj.replace('mlflow+', '')
39 return self.data_store._make_metadata(
40 name=name,
41 prefix=self.data_store.prefix,
42 bucket=self.data_store.bucket,
43 kind=MLFlowGitProjectBackend.KIND,
44 uri=git_uri,
45 attributes=attributes).save()
46
[docs]
47 def get(self, name, **kwargs):
48 """
49 Load MLFlow project from git uri
50
51 :return: the loaded module
52 """
53 meta = self.data_store.metadata(name)
54 mod = MLFlowProject(meta.uri)
55 return mod