Skip to content

Commit

Permalink
GSK-2896 Automatically generate a Kernel based on dependencies (#1829)
Browse files Browse the repository at this point in the history
* GSK-2896 Auto mode for kernel is a need

* GSK-2896 Auto mode for kernel is a need

* GSK-2875 Make kernel name related to project

* GSK-2896 Extracted `create_kernel` method

---------

Co-authored-by: Hartorn <bazire@giskard.ai>
  • Loading branch information
kevinmessiaen and Hartorn committed Mar 7, 2024
1 parent 551de09 commit 71e5369
Showing 1 changed file with 47 additions and 2 deletions.
49 changes: 47 additions & 2 deletions giskard/client/giskard_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
import logging
import os
import posixpath
import sys
import uuid
from pathlib import Path
from urllib.parse import urljoin
from uuid import UUID

import importlib_metadata
from requests import Response
from requests.adapters import HTTPAdapter
from requests.auth import AuthBase
Expand Down Expand Up @@ -187,7 +190,46 @@ def get_project(self, project_key: str) -> Project:
response = self._session.get("project", params={"key": project_key}).json()
return Project(self._session, response["key"], response["id"])

def create_project(self, project_key: str, name: str, kernel_name: str, description: str = None) -> Project:
def initialize_kernel(self, project_key: str):
python_version = f"{sys.version_info[0]}.{sys.version_info[1]}"
kernel_name = f"{project_key}_kernel"

kernels = self._session.get("kernels").json()
frozen_dependencies = [f"{dist.name}=={dist.version}" for dist in importlib_metadata.distributions()]

existing_kernel = next((kernel for kernel in kernels if kernel["name"] == kernel_name), None)

if (
existing_kernel
and existing_kernel["pythonVersion"] == python_version
and set(frozen_dependencies).issubset(set(existing_kernel["frozenDependencies"].split("\n")))
):
# A similar kernel already exists
return existing_kernel["name"]
elif existing_kernel:
# A different kernel exists that uses the same name
kernel_name = f"{kernel_name}_{uuid.uuid4()}"

self.create_kernel(kernel_name, python_version, frozen_dependencies="\n".join(frozen_dependencies))

return kernel_name

def create_kernel(
self, kernel_name: str, python_version: str, requestedDependencies: str = "", frozen_dependencies: str = ""
):
self._session.post(
"kernels",
json={
"name": kernel_name,
"pythonVersion": python_version,
"requestedDependencies": requestedDependencies,
"frozenDependencies": frozen_dependencies,
"type": "PROCESS",
"version": 0,
},
)

def create_project(self, project_key: str, name: str, kernel_name: str = None, description: str = None) -> Project:
"""Function to create a project in Giskard
Parameters
Expand All @@ -207,7 +249,6 @@ def create_project(self, project_key: str, name: str, kernel_name: str, descript
The project created in giskard
"""
# TODO(Bazire): handle properly the "auto" detection/creation of kernel
analytics.track(
"Create Project",
{
Expand All @@ -216,6 +257,10 @@ def create_project(self, project_key: str, name: str, kernel_name: str, descript
"name": anonymize(name),
},
)

if kernel_name is None:
kernel_name = self.initialize_kernel(project_key)

try:
# TODO(Bazire) : use typed object for validation here
response = self._session.post(
Expand Down

0 comments on commit 71e5369

Please sign in to comment.