diff --git a/export-ollama-model.py b/export-ollama-model.py new file mode 100644 index 0000000..f1c03dd --- /dev/null +++ b/export-ollama-model.py @@ -0,0 +1,52 @@ +# https://mitjamartini.com/posts/export-models-from-ollama/#now-where-is-the-script +import os +import json +import zipfile +import argparse +from pathlib import Path + +def get_model_manifest_path(registry, repository, model_name, model_tag): + return Path(f".ollama/models/manifests/{registry}/{repository}/{model_name}/{model_tag}") + +def get_blob_file_path(digest): + return Path(f".ollama/models/blobs/sha256-{digest.split(':')[1]}") + +def read_manifest(ollamamodels, manifest_path): + with open(Path.joinpath(ollamamodels, manifest_path), 'r') as file: + return json.load(file) + +def create_zip(ollamamodels, registry, repository, model_name, model_tag, output_zip): + manifest_path = get_model_manifest_path(registry, repository, model_name, model_tag) + manifest = read_manifest(ollamamodels, manifest_path) + + with zipfile.ZipFile(output_zip, 'w') as zipf: + # Add manifest file + zipf.write(Path.joinpath(ollamamodels, manifest_path), arcname=manifest_path.relative_to('.')) + + # Add blobs + for layer in manifest['layers']: + blob_path = get_blob_file_path(layer['digest']) + zipf.write(Path.joinpath(ollamamodels, blob_path), arcname=blob_path.relative_to('.')) + + # Add config blob + config_blob_path = get_blob_file_path(manifest['config']['digest']) + zipf.write(Path.joinpath(ollamamodels, config_blob_path), arcname=config_blob_path.relative_to('.')) + + print(f"Model '{repository}{model_name}:{model_tag}' exported successfully to '{output_zip}'") + print(f"You can import it to another Ollama instance with 'tar -xf __export.zip'") + +def main(): + homedir = Path.home() + parser = argparse.ArgumentParser(description='Export Ollama model to a zip file.') + parser.add_argument('model_name', type=str, help='Name of the model (e.g., gemma)') + parser.add_argument('model_tag', type=str, help='Tag of the model (e.g., 2b)') + parser.add_argument('--ollamamodels', type=str, default=homedir, help='The folder for OLLAMA_MODELS (default: homedir)') + parser.add_argument('--registry', type=str, default="registry.ollama.ai", help="The Ollama model registry.") + parser.add_argument('--repository', type=str, default="library", help="name of the repository, (eg. jina)") + parser.add_argument('--output', type=str, default='model_export.zip', help='Output zip file name') + args = parser.parse_args() + + create_zip(args.ollamamodels, args.registry, args.repository, args.model_name, args.model_tag, args.output) + +if __name__ == "__main__": + main()