Mantik API endpoint for retrieving model artifacts
Summary
As a Mantik user, I want to be able downloading my models so I can use them locally for inference or serve them to clients.
Acceptance Criteria
Background:
Given I have a Mantik account
And I have the reporter+ role in the project
-
Mantik API allows for downloading model artifacts with role
When I want to download model artifacts from Mantik artifacts store
Then I can find a Mantik API endpoint that returns an URL
And I can download the model artifacts from there.
-
Mantik API allows for downloading zipped model artifacts.
When I want to download a zip file consiting of model artifacts from Mantik artifacts store
Then I can find a Mantik API endpoint that returns an URL
And I can download the zip file from there.
Testing
-
Get request returns the path of the downloaded directory if directory exists
Given I specify a legit path when downloading
When I download a the model artifacts folder from the artifacts store
Then I get a path of where the artifacts directory has been downloaded on my local system that is the same as the path I specified
-
Get request returns error if the download path specified doesn't exist
Given I have specified a path that doesn't exist on my local system when downloading
When I download a the model artifacts folder from the artifacts store
Then I get an error stating the download path doesn't exist
^ we're implementing an api endpoint here, and calling it to download things. We can't tell the endpoint where we want to store the result locally
Additional Notes / Information
- After a successful run on Mantik, a user can click on the link in the run and would be directed to the run artifacts, where they can be seen.
- A link to mlflow documentation for downloading artifacts can be seen here
Technical Information
- It's not possible to return the download directly as a streaming response, meaning it has to be stored locally as a file, so we have to save it in a temp directory return and return it as a streaming response. That way it would get deleted right after its contents are returned.
Suggested Implementation
We want the pre-signed url.
-
Implement a new mantik endpoint -
in the endpoint, download the artifact folder into a temporary directory -
zip the contents -
upload it to S3 to the same bucket -
generate a pre-signed url -
return that url -
grant access to the relevant S3 bucket to mantik api
Outdated:
Inspired by the implementation of GET /projects/{projectId}/runs/{runId}/download
in the mantik api.
-
Implement GET /projects/{projectId}/model/{modelId}/download
-
Find the path to the model artifacts from the modelId -
Implement a method to iteratively go through each file from the artifacts and iteratively downloads the files in the model class, similar to job.download
in the mantik api-
You can leverage 'DownloadResponse.get_content' method already defined in the api
-
-
Create a function similar to recursively_download_directory_into_zip
but without the need to use unicore, which returns a DownLoadResponse object. -
Leverage the fastapi.response.StreamingResponse
to stream the temporarily saved file to the local machine
-
Edited by Jakub Jagielski