|
10 | 10 | from pathlib import Path
|
11 | 11 | from typing import get_args
|
12 | 12 |
|
13 |
| -from ramalama.config import COLOR_OPTIONS, SUPPORTED_RUNTIMES |
| 13 | +from ramalama.config import COLOR_OPTIONS, SUPPORTED_ENGINES, SUPPORTED_RUNTIMES |
14 | 14 |
|
15 | 15 | # if autocomplete doesn't exist, just do nothing, don't break
|
16 | 16 | try:
|
@@ -205,6 +205,7 @@ def configure_arguments(parser):
|
205 | 205 | "--engine",
|
206 | 206 | dest="engine",
|
207 | 207 | default=CONFIG.engine,
|
| 208 | + choices=get_args(SUPPORTED_ENGINES), |
208 | 209 | help="""run RamaLama using the specified container engine.
|
209 | 210 | The RAMALAMA_CONTAINER_ENGINE environment variable modifies default behaviour.""",
|
210 | 211 | )
|
@@ -1089,49 +1090,104 @@ def stop_container(args):
|
1089 | 1090 |
|
1090 | 1091 |
|
1091 | 1092 | def daemon_parser(subparsers):
|
1092 |
| - parser = subparsers.add_parser("daemon", help="daemon operations") |
1093 |
| - parser.set_defaults(func=daemon_setup_cli) |
| 1093 | + parser: ArgumentParserWithDefaults = subparsers.add_parser("daemon", help="daemon operations") |
| 1094 | + parser.set_defaults(func=lambda _: parser.print_help()) |
1094 | 1095 |
|
1095 | 1096 | daemon_parsers = parser.add_subparsers(dest="daemon_command")
|
1096 | 1097 |
|
1097 |
| - run_parser = daemon_parsers.add_parser("setup") |
1098 |
| - run_parser.set_defaults(func=daemon_setup_cli) |
| 1098 | + start_parser = daemon_parsers.add_parser("start") |
| 1099 | + start_parser.add_argument( |
| 1100 | + "--image", |
| 1101 | + default=accel_image(CONFIG), |
| 1102 | + help="OCI container image to run with the specified AI model", |
| 1103 | + action=OverrideDefaultAction, |
| 1104 | + completer=local_images, |
| 1105 | + ) |
| 1106 | + start_parser.add_argument( |
| 1107 | + "--pull", |
| 1108 | + dest="pull", |
| 1109 | + type=str, |
| 1110 | + default=CONFIG.pull, |
| 1111 | + choices=["always", "missing", "never", "newer"], |
| 1112 | + help='pull image policy', |
| 1113 | + ) |
| 1114 | + start_parser.add_argument( |
| 1115 | + "--host", |
| 1116 | + default=CONFIG.host, |
| 1117 | + help="IP address to listen", |
| 1118 | + completer=suppressCompleter, |
| 1119 | + ) |
| 1120 | + start_parser.add_argument( |
| 1121 | + "-p", |
| 1122 | + "--port", |
| 1123 | + type=parse_port_option, |
| 1124 | + default=CONFIG.port, |
| 1125 | + help="port for AI Model server to listen on", |
| 1126 | + completer=suppressCompleter, |
| 1127 | + ) |
| 1128 | + start_parser.set_defaults(func=daemon_start_cli) |
1099 | 1129 |
|
1100 |
| - cli_parser = daemon_parsers.add_parser("run") |
1101 |
| - cli_parser.set_defaults(func=daemon_run_cli) |
1102 |
| - cli_parser.add_argument("--store", default=CONFIG.store, type=abspath, help="path to store models") |
| 1130 | + run_parser = daemon_parsers.add_parser("run") |
| 1131 | + run_parser.add_argument( |
| 1132 | + "--host", |
| 1133 | + default=CONFIG.host, |
| 1134 | + help="IP address to listen", |
| 1135 | + completer=suppressCompleter, |
| 1136 | + ) |
| 1137 | + run_parser.add_argument( |
| 1138 | + "-p", |
| 1139 | + "--port", |
| 1140 | + type=parse_port_option, |
| 1141 | + default=CONFIG.port, |
| 1142 | + help="port for AI Model server to listen on", |
| 1143 | + completer=suppressCompleter, |
| 1144 | + ) |
| 1145 | + run_parser.set_defaults(func=daemon_run_cli) |
1103 | 1146 |
|
1104 | 1147 |
|
1105 |
| -def daemon_setup_cli(args): |
| 1148 | +def daemon_start_cli(args): |
1106 | 1149 | from ramalama.common import exec_cmd
|
1107 | 1150 |
|
1108 |
| - exec_cmd( |
1109 |
| - [ |
| 1151 | + daemon_cmd = [] |
| 1152 | + daemon_model_store_dir = args.store |
| 1153 | + is_daemon_in_container = args.container and args.engine in get_args(SUPPORTED_ENGINES) |
| 1154 | + |
| 1155 | + if is_daemon_in_container: |
| 1156 | + # If run inside a container, map the model store to the container internal directory |
| 1157 | + daemon_model_store_dir = "/ramalama/models" |
| 1158 | + |
| 1159 | + daemon_cmd += [ |
1110 | 1160 | "podman",
|
1111 | 1161 | "run",
|
1112 | 1162 | "--pull",
|
1113 |
| - "never", |
1114 |
| - "-i", |
1115 |
| - "-t", |
| 1163 | + args.pull, |
1116 | 1164 | "-d",
|
1117 | 1165 | "-p",
|
1118 |
| - "8080:8080", |
| 1166 | + f"{args.port}:8080", |
1119 | 1167 | "-v",
|
1120 |
| - f"{CONFIG.store}:/ramalama/models", |
1121 |
| - "quay.io/ramalama/rocm:latest", |
1122 |
| - "ramalama", |
1123 |
| - "daemon", |
1124 |
| - "run", |
1125 |
| - "--store", |
1126 |
| - "/ramalama/models", |
1127 |
| - ], |
1128 |
| - ) |
| 1168 | + f"{args.store}:{daemon_model_store_dir}", |
| 1169 | + args.image, |
| 1170 | + ] |
| 1171 | + |
| 1172 | + daemon_cmd += [ |
| 1173 | + "ramalama", |
| 1174 | + "--store", |
| 1175 | + daemon_model_store_dir, |
| 1176 | + "daemon", |
| 1177 | + "run", |
| 1178 | + "--port", |
| 1179 | + "8080" if is_daemon_in_container else args.port, |
| 1180 | + "--host", |
| 1181 | + CONFIG.host if is_daemon_in_container else args.host, |
| 1182 | + ] |
| 1183 | + |
| 1184 | + exec_cmd(daemon_cmd) |
1129 | 1185 |
|
1130 | 1186 |
|
1131 | 1187 | def daemon_run_cli(args):
|
1132 | 1188 | from ramalama.daemon.daemon import run
|
1133 | 1189 |
|
1134 |
| - run(model_store_path=args.store) |
| 1190 | + run(host=args.host, port=args.port, model_store_path=args.store) |
1135 | 1191 |
|
1136 | 1192 |
|
1137 | 1193 | def version_parser(subparsers):
|
|
0 commit comments