diff --git a/docs/source/references/llama_cli_reference/index.md b/docs/source/references/llama_cli_reference/index.md index 76abce544..a43666963 100644 --- a/docs/source/references/llama_cli_reference/index.md +++ b/docs/source/references/llama_cli_reference/index.md @@ -171,7 +171,7 @@ The `llama model` command helps you explore the model’s interface. llama model --help ``` ``` -usage: llama model [-h] {download,list,prompt-format,describe} ... +usage: llama model [-h] {download,list,prompt-format,describe,verify-download,remove} ... Work with llama models @@ -179,15 +179,15 @@ options: -h, --help show this help message and exit model_subcommands: - {download,list,prompt-format,describe} + {download,list,prompt-format,describe,verify-download,remove} ``` +### Describe + You can use the describe command to know more about a model: ``` llama model describe -m Llama3.2-3B-Instruct ``` -### Describe - ``` +-----------------------------+----------------------------------+ | Model | Llama3.2-3B-Instruct | @@ -234,3 +234,10 @@ llama model prompt-format -m Llama3.2-3B-Instruct You will be shown a Markdown formatted description of the model interface and how prompts / messages are formatted for various scenarios. **NOTE**: Outputs in terminal are color printed to show special tokens. + +### Remove model +You can run `llama model remove` to remove unecessary model: + +``` +llama model remove -m Llama-Guard-3-8B-int8 +``` diff --git a/llama_stack/cli/model/model.py b/llama_stack/cli/model/model.py index 3f8f55773..2f4065b83 100644 --- a/llama_stack/cli/model/model.py +++ b/llama_stack/cli/model/model.py @@ -10,6 +10,7 @@ from llama_stack.cli.model.describe import ModelDescribe from llama_stack.cli.model.download import ModelDownload from llama_stack.cli.model.list import ModelList from llama_stack.cli.model.prompt_format import ModelPromptFormat +from llama_stack.cli.model.remove import ModelRemove from llama_stack.cli.model.verify_download import ModelVerifyDownload from llama_stack.cli.subcommand import Subcommand @@ -35,3 +36,4 @@ class ModelParser(Subcommand): ModelPromptFormat.create(subparsers) ModelDescribe.create(subparsers) ModelVerifyDownload.create(subparsers) + ModelRemove.create(subparsers) diff --git a/llama_stack/cli/model/remove.py b/llama_stack/cli/model/remove.py new file mode 100644 index 000000000..ee8d6299d --- /dev/null +++ b/llama_stack/cli/model/remove.py @@ -0,0 +1,67 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the terms described in the LICENSE file in +# the root directory of this source tree. + +import argparse +import os +import shutil + +from llama_stack.cli.subcommand import Subcommand +from llama_stack.distribution.utils.config_dirs import DEFAULT_CHECKPOINT_DIR +from llama_stack.models.llama.sku_list import resolve_model + + +class ModelRemove(Subcommand): + """Remove the downloaded llama model""" + + def __init__(self, subparsers: argparse._SubParsersAction): + super().__init__() + self.parser = subparsers.add_parser( + "remove", + prog="llama model remove", + description="Remove the downloaded llama model", + formatter_class=argparse.RawTextHelpFormatter, + ) + self._add_arguments() + self.parser.set_defaults(func=self._run_model_remove_cmd) + + def _add_arguments(self): + self.parser.add_argument( + "-m", + "--model", + required=True, + help="Specify the llama downloaded model name, see `llama model list --downloaded`", + ) + self.parser.add_argument( + "-f", + "--force", + action="store_true", + help="Used to forcefully remove the llama model from the storage without further confirmation", + ) + + def _run_model_remove_cmd(self, args: argparse.Namespace) -> None: + from .safety_models import prompt_guard_model_sku + + prompt_guard = prompt_guard_model_sku() + if args.model == prompt_guard.model_id: + model = prompt_guard + else: + model = resolve_model(args.model) + + model_path = os.path.join(DEFAULT_CHECKPOINT_DIR, args.model.replace(":", "-")) + + if model is None or not os.path.isdir(model_path): + print(f"'{args.model}' is not a valid llama model or does not exist.") + return + + if args.force: + shutil.rmtree(model_path) + print(f"{args.model} removed.") + else: + if input(f"Are you sure you want to remove {args.model}? (y/n): ").strip().lower() == "y": + shutil.rmtree(model_path) + print(f"{args.model} removed.") + else: + print("Removal aborted.")