From 89665dfbdbc8a55accc04e9a1f9e1e8c630d811f Mon Sep 17 00:00:00 2001 From: "OKH@nd" Date: Fri, 8 Nov 2024 09:29:14 +0800 Subject: [PATCH 01/26] add inference mlx run local model in single node --- exo/inference/mlx/sharded_inference_engine.py | 11 ++++-- exo/inference/tokenizers.py | 5 +++ exo/main.py | 35 +++++++++++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/exo/inference/mlx/sharded_inference_engine.py b/exo/inference/mlx/sharded_inference_engine.py index 943b58610..46a2652d2 100644 --- a/exo/inference/mlx/sharded_inference_engine.py +++ b/exo/inference/mlx/sharded_inference_engine.py @@ -9,7 +9,9 @@ import asyncio from concurrent.futures import ThreadPoolExecutor from functools import partial - +# OKHand.zy add library +import os +from pathlib import Path class MLXDynamicShardInferenceEngine(InferenceEngine): def __init__(self, shard_downloader: ShardDownloader): @@ -40,8 +42,11 @@ async def infer_tensor(self, request_id: str, shard: Shard, input_data: np.ndarr async def ensure_shard(self, shard: Shard): if self.shard == shard: return - - model_path = await self.shard_downloader.ensure_shard(shard) + + if os.path.isdir(shard.model_id): # if local model + model_path = Path(shard.model_id) + else: + model_path = await self.shard_downloader.ensure_shard(shard) if self.shard != shard: loop = asyncio.get_running_loop() diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index 0b8ffa7e6..929134a68 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -22,7 +22,12 @@ def decode(self, tokens): async def resolve_tokenizer(model_id: str): if model_id == "dummy": return DummyTokenizer() + local_path = await get_local_snapshot_dir(model_id) + if not local_path: # local model path + local_path = model_id.rstrip('/') + model_id = 'local/'+str(local_path.split('/')[-1]) + if DEBUG >= 2: print(f"Checking if local path exists to load tokenizer from local {local_path=}") try: if local_path and await aios.path.exists(local_path): diff --git a/exo/main.py b/exo/main.py index a51c38b98..487a952fb 100644 --- a/exo/main.py +++ b/exo/main.py @@ -25,6 +25,9 @@ from exo.orchestration.node import Node from exo.models import model_base_shards from exo.viz.topology_viz import TopologyViz +# OKHand.zy add library +import os +import json # parse args parser = argparse.ArgumentParser(description="Initialize GRPC Discovery") @@ -133,14 +136,18 @@ def preemptively_start_download(request_id: str, opaque_status: str): status = json.loads(opaque_status) if status.get("type") == "node_status" and status.get("status") == "start_process_prompt": current_shard = node.get_current_shard(Shard.from_dict(status.get("shard"))) - if DEBUG >= 2: print(f"Preemptively starting download for {current_shard}") - asyncio.create_task(shard_downloader.ensure_shard(current_shard)) + if os.path.isdir(current_shard.model_id): + # TODO: open ftp to share download model + pass + else: + if DEBUG >= 2: print(f"Preemptively starting download for {current_shard}") + asyncio.create_task(shard_downloader.ensure_shard(current_shard)) + except Exception as e: if DEBUG >= 2: print(f"Failed to preemptively start download: {e}") traceback.print_exc() - node.on_opaque_status.register("start_download").on_next(preemptively_start_download) if args.prometheus_client_port: @@ -175,11 +182,27 @@ async def shutdown(signal, loop): async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name: str, prompt: str): - shard = model_base_shards.get(model_name, {}).get(inference_engine.__class__.__name__) - if not shard: + if model_base_shards.get(model_name) : + shard = model_base_shards.get(model_name, {}).get(inference_engine.__class__.__name__) + if not shard: + print(f"Error: Unsupported model '{model_name}' for inference engine {inference_engine.__class__.__name__}") + return + tokenizer = await resolve_tokenizer(shard.model_id) + elif os.path.isdir(model_name): + # local model + # local model shard + model_path = model_name.rstrip('/') + model_name = model_path.split('/')[-1] + if os.path.isfile(model_path+'/config.json'): + with open(model_path+'/config.json', 'r') as file: + config = json.load(file) + config_n_layers = config['num_hidden_layers'] + shard = Shard(model_id=model_path, start_layer=0, end_layer=0, n_layers=config_n_layers) + tokenizer = await resolve_tokenizer(model_path) + else: print(f"Error: Unsupported model '{model_name}' for inference engine {inference_engine.__class__.__name__}") return - tokenizer = await resolve_tokenizer(shard.model_id) + request_id = str(uuid.uuid4()) callback_id = f"cli-wait-response-{request_id}" callback = node.on_token.register(callback_id) From 0b87eb9fbce386c1107280338484b07886760e06 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Fri, 15 Nov 2024 10:41:30 +0800 Subject: [PATCH 02/26] filter merge erro --- exo/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exo/main.py b/exo/main.py index 4b1787224..1eea7284c 100644 --- a/exo/main.py +++ b/exo/main.py @@ -23,7 +23,7 @@ from exo.inference.dummy_inference_engine import DummyInferenceEngine from exo.inference.tokenizers import resolve_tokenizer from exo.orchestration.node import Node -from exo.models import build_base_shard, get_repo +from exo.models import model_cards, build_base_shard, get_repo from exo.viz.topology_viz import TopologyViz # OKHand.zy add library import os @@ -182,7 +182,7 @@ async def shutdown(signal, loop): async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name: str, prompt: str): - if model_base_shards.get(model_name) : + if model_cards.get(model_name): inference_class = inference_engine.__class__.__name__ shard = build_base_shard(model_name, inference_class) if not shard: From e2f072301b13ab48a0defdfa53ecd39ade5fcb99 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Fri, 15 Nov 2024 16:42:42 +0800 Subject: [PATCH 03/26] filter f1eec9f model change --- exo/api/chatgpt_api.py | 19 ++++++++++++++++++- exo/inference/tokenizers.py | 2 +- exo/main.py | 18 +++++++++++++----- exo/models.py | 10 ++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/exo/api/chatgpt_api.py b/exo/api/chatgpt_api.py index 26951d73f..275581493 100644 --- a/exo/api/chatgpt_api.py +++ b/exo/api/chatgpt_api.py @@ -224,7 +224,24 @@ async def handle_model_support(self, request): }) async def handle_get_models(self, request): - return web.json_response([{"id": model_name, "object": "model", "owned_by": "exo", "ready": True} for model_name, _ in model_cards.items()]) + models_list = [] + for model_name, _ in model_cards.items(): + if "Local" in model_name: + model_data = { + "id": model_name, + "object": "model", + "owned_by": "Local", + "ready": True + } + else: + model_data = { + "id": model_name, + "object": "model", + "owned_by": "exo", + "ready": True + } + models_list.append(model_data) + return web.json_response(models_list) async def handle_post_chat_token_encode(self, request): data = await request.json() diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index 929134a68..0587194b8 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -26,7 +26,7 @@ async def resolve_tokenizer(model_id: str): local_path = await get_local_snapshot_dir(model_id) if not local_path: # local model path local_path = model_id.rstrip('/') - model_id = 'local/'+str(local_path.split('/')[-1]) + model_id = 'Local/'+str(local_path.split('/')[-1]) if DEBUG >= 2: print(f"Checking if local path exists to load tokenizer from local {local_path=}") try: diff --git a/exo/main.py b/exo/main.py index 1eea7284c..dc1aa7427 100644 --- a/exo/main.py +++ b/exo/main.py @@ -23,7 +23,7 @@ from exo.inference.dummy_inference_engine import DummyInferenceEngine from exo.inference.tokenizers import resolve_tokenizer from exo.orchestration.node import Node -from exo.models import model_cards, build_base_shard, get_repo +from exo.models import model_cards, build_local_model_card, build_base_shard, get_repo from exo.viz.topology_viz import TopologyViz # OKHand.zy add library import os @@ -62,16 +62,18 @@ system_info = get_system_info() print(f"Detected system: {system_info}") -shard_downloader: ShardDownloader = HFShardDownloader(quick_check=args.download_quick_check, - max_parallel_downloads=args.max_parallel_downloads) if args.inference_engine != "dummy" else NoopShardDownloader() inference_engine_name = args.inference_engine or ("mlx" if system_info == "Apple Silicon Mac" else "tinygrad") print(f"Inference engine name after selection: {inference_engine_name}") +# default use HF Downloader Model +shard_downloader: ShardDownloader = HFShardDownloader(quick_check=args.download_quick_check, + max_parallel_downloads=args.max_parallel_downloads) if args.inference_engine != "dummy" else NoopShardDownloader() + inference_engine = get_inference_engine(inference_engine_name, shard_downloader) print(f"Using inference engine: {inference_engine.__class__.__name__} with shard downloader: {shard_downloader.__class__.__name__}") if args.node_port is None: - args.node_port = find_available_port(args.node_host) + args.node_port = find_available_port(args.node_host) # 0.0.0.0:49152 ~ 65535 if DEBUG >= 1: print(f"Using available port: {args.node_port}") args.node_id = args.node_id or get_or_create_node_id() @@ -85,6 +87,7 @@ for chatgpt_api_endpoint in chatgpt_api_endpoints: print(f" - {terminal_link(chatgpt_api_endpoint)}") +# Default use udp discovery if args.discovery_module == "udp": discovery = UDPDiscovery( args.node_id, @@ -107,6 +110,7 @@ if not args.discovery_config_path: raise ValueError(f"--discovery-config-path is required when using manual discovery. Please provide a path to a config json file.") discovery = ManualDiscovery(args.discovery_config_path, args.node_id, create_peer_handle=lambda peer_id, address, device_capabilities: GRPCPeerHandle(peer_id, address, device_capabilities)) + topology_viz = TopologyViz(chatgpt_api_endpoints=chatgpt_api_endpoints, web_chat_urls=web_chat_urls) if not args.disable_tui else None node = StandardNode( args.node_id, @@ -186,7 +190,7 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam inference_class = inference_engine.__class__.__name__ shard = build_base_shard(model_name, inference_class) if not shard: - print(f"Error: Unsupported model '{model_name}' for inference engine {inference_engine.__class__.__name__}") + print(f"Error: exo Unsupported model '{model_name}' for inference engine {inference_engine.__class__.__name__}") return tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) elif os.path.isdir(model_name): @@ -197,8 +201,12 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam with open(model_path+'/config.json', 'r') as file: config = json.load(file) config_n_layers = config['num_hidden_layers'] + build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, config_n_layers) shard = Shard(model_id=model_path, start_layer=0, end_layer=0, n_layers=config_n_layers) tokenizer = await resolve_tokenizer(model_path) + else: + print(f"Error: Not Find Local model '{model_name}' for inference engine {inference_engine.__class__.__name__}") + return else: print(f"Error: Unsupported model '{model_name}' for inference engine {inference_engine.__class__.__name__}") return diff --git a/exo/models.py b/exo/models.py index 0561220ff..29522622f 100644 --- a/exo/models.py +++ b/exo/models.py @@ -125,3 +125,13 @@ def build_base_shard(model_id: str, inference_engine_classname: str) -> Optional return None return Shard(model_id, 0, 0, n_layers) +def build_local_model_card(model_name: str, model_path: str, inference_engine: str, config_n_layers: int): + short_model_name = f"Local/{model_name}" + pretty_model_name = f"{model_name} (Local)".replace('-', ' ') + model_cards[short_model_name] = { + "layers": config_n_layers, + "repo": { + inference_engine: model_path + }, + } + pretty_name[short_model_name]=pretty_model_name From 2a2e3b29e6f742d52ae96bf76b7b9ceffe684cc5 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Mon, 18 Nov 2024 14:12:39 +0800 Subject: [PATCH 04/26] futuer:(i-e:mlx)suppoert local model and HF model terminal complet --- exo/inference/tokenizers.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index 0587194b8..ef75f7cbe 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -7,6 +7,8 @@ from exo.download.hf.hf_helpers import get_local_snapshot_dir from exo.helpers import DEBUG +# OKHand.ziyu add library +import os class DummyTokenizer: def __init__(self): @@ -23,10 +25,11 @@ async def resolve_tokenizer(model_id: str): if model_id == "dummy": return DummyTokenizer() - local_path = await get_local_snapshot_dir(model_id) - if not local_path: # local model path + if os.path.isdir(model_id): # local model local_path = model_id.rstrip('/') model_id = 'Local/'+str(local_path.split('/')[-1]) + else: + local_path = await get_local_snapshot_dir(model_id) if DEBUG >= 2: print(f"Checking if local path exists to load tokenizer from local {local_path=}") try: From d8bbb2b640ca172149ffa93e38ad7325fb27aac1 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Tue, 19 Nov 2024 15:05:42 +0800 Subject: [PATCH 05/26] futur:support cli and chatapi local model complet --- README.md | 43 +++++++++++++ exo/api/chatgpt_api.py | 12 +++- exo/inference/mlx/sharded_inference_engine.py | 7 ++- exo/main.py | 60 ++++++++++++++++++- 4 files changed, 115 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 392ef2973..009d79b38 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,12 @@ Forget expensive NVIDIA GPUs, unify your existing devices into one powerful GPU:

Update: exo is hiring. See here for more details.

+OKHand.zy fork add new feature: +- support CLI and ChatAPI use local model (only support mlx inference engine) +- add new args "--add-local-model" +- add init exo folder and model config file in /.cache/exo + + ## Get Involved exo is **experimental** software. Expect bugs early on. Create issues so they can be fixed. The [exo labs](https://x.com/exolabs) team will strive to resolve issues quickly. @@ -208,12 +214,49 @@ With a custom prompt: exo run llama-3.2-3b --prompt "What is the meaning of exo?" ``` +### Example Usage on a single device with Local Model +- Step1. Download the model from huggingface +- Step2. + ```shell + exo --add-local-model + ``` +- Step3. + ```shell + exo --inference-engine mlx --run-model + or + exo --inference-engine mlx --run-model + ``` + +### Example Usage on Multiple Devices with Local Model +#### Both devices are on MacOS: +- Step1. Download the model from huggingface and put it in the exo folder(/.cache/exo) +- Step2. + ```shell + exo --add-local-model + ``` +#### Choose one device to run the following command: +```shell +curl http://localhost:8000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "Local/", + "messages": [{"role": "user", "content": "What is the meaning of exo?"}], + "temperature": 0.7 + }' +``` + ### Model Storage Models by default are stored in `~/.cache/huggingface/hub`. You can set a different model storage location by setting the `HF_HOME` env var. +### Local Model Storage + +Please stored models in `~/.cache/exo`. + +You can set a different model storage location by setting the `HOME` env var + ## Debugging Enable debug logs with the DEBUG environment variable (0-9). diff --git a/exo/api/chatgpt_api.py b/exo/api/chatgpt_api.py index 275581493..d321dfff5 100644 --- a/exo/api/chatgpt_api.py +++ b/exo/api/chatgpt_api.py @@ -247,7 +247,11 @@ async def handle_post_chat_token_encode(self, request): data = await request.json() shard = build_base_shard(self.default_model, self.inference_engine_classname) messages = [parse_message(msg) for msg in data.get("messages", [])] - tokenizer = await resolve_tokenizer(get_repo(shard.model_id, self.inference_engine_classname)) + if "Local" in shard.model_id: + model_path = model_cards.get(shard.model_id, {}).get("repo", {}).get(self.inference_engine_classname,{}) + tokenizer = await resolve_tokenizer(model_path) + else: + tokenizer = await resolve_tokenizer(get_repo(shard.model_id, self.inference_engine_classname)) return web.json_response({"length": len(build_prompt(tokenizer, messages)[0])}) async def handle_get_download_progress(self, request): @@ -277,7 +281,11 @@ async def handle_post_chat_completions(self, request): status=400, ) - tokenizer = await resolve_tokenizer(get_repo(shard.model_id, self.inference_engine_classname)) + if "Local" in shard.model_id: + model_path = model_cards.get(shard.model_id, {}).get("repo", {}).get(self.inference_engine_classname,{}) + tokenizer = await resolve_tokenizer(model_path) + else: + tokenizer = await resolve_tokenizer(get_repo(shard.model_id, self.inference_engine_classname)) if DEBUG >= 4: print(f"Resolved tokenizer: {tokenizer}") prompt = build_prompt(tokenizer, chat_request.messages) diff --git a/exo/inference/mlx/sharded_inference_engine.py b/exo/inference/mlx/sharded_inference_engine.py index aff8a071c..8f8b709cf 100644 --- a/exo/inference/mlx/sharded_inference_engine.py +++ b/exo/inference/mlx/sharded_inference_engine.py @@ -13,6 +13,7 @@ # OKHand.zy add library import os from pathlib import Path +from exo.models import get_repo def sample_logits( logits: mx.array, @@ -66,8 +67,10 @@ async def ensure_shard(self, shard: Shard): if self.shard == shard: return - if os.path.isdir(shard.model_id): # if local model - model_path = Path(shard.model_id) + if os.path.isdir(shard.model_id): # cli mode + model_path = Path(shard.model_id) + elif "Local" in shard.model_id: # api mode + model_path = Path(get_repo(shard.model_id, self.__class__.__name__)) else: model_path = await self.shard_downloader.ensure_shard(shard, self.__class__.__name__) diff --git a/exo/main.py b/exo/main.py index dc1aa7427..0bc3709e0 100644 --- a/exo/main.py +++ b/exo/main.py @@ -27,7 +27,9 @@ from exo.viz.topology_viz import TopologyViz # OKHand.zy add library import os +import sys import json +from pathlib import Path # parse args parser = argparse.ArgumentParser(description="Initialize GRPC Discovery") @@ -54,11 +56,60 @@ parser.add_argument("--prompt", type=str, help="Prompt for the model when using --run-model", default="Who are you?") parser.add_argument("--tailscale-api-key", type=str, default=None, help="Tailscale API key") parser.add_argument("--tailnet-name", type=str, default=None, help="Tailnet name") +parser.add_argument("--add-local-model", type=str, nargs=2, metavar=('Model_name', 'Inference_engine'), help="Add local model: MODEL_NAME is the name of model, ENGINE_NAME is mlx/tinygrad/dummy") args = parser.parse_args() print(f"Selected inference engine: {args.inference_engine}") print_yellow_exo() +# init folder for Local Model +exo_path = os.environ.get("Home", Path.home()/".cache"/"exo") +os.makedirs(exo_path, exist_ok=True) +print(f"Init exo folder: {exo_path}") +local_model_config = Path(f'{exo_path}/model_config.txt') +local_model_config.parent.mkdir(parents=True, exist_ok=True) +with local_model_config.open('a') as file: + file.close() +print(f"Init local model config: {exo_path}") + +# import Local Model +if args.add_local_model: + model_name = args.add_local_model[0] + inference_engine = args.add_local_model[1].lower() + if inference_engine == "mlx" or inference_engine == "mlxdynamicshardinferenceengine": + inference_engine_name = "MLXDynamicShardInferenceEngine" + elif inference_engine == "tinygrad" or inference_engine == "tinygradshardinferenceengine": + inference_engine_name = "TinyGradShardInferenceEngine" + elif inference_engine == "dummy" or inference_engine == "dummyinferenceengine": + inference_engine_name = "DummyInferenceEngine" + else: + sys.exit(f"Invalid inference engine: {inference_engine}") + + with open(str(exo_path)+f'/{model_name}/config.json', 'r') as file: + config = json.load(file) + config_n_layers = config['num_hidden_layers'] + new_model = f"{model_name}:{config_n_layers}:{inference_engine_name}:{str(exo_path)}/{model_name}\n" + + with local_model_config.open('r') as file: + existing_content = file.read() + file.close() + if new_model in existing_content: + sys.exit(f"Model already: {model_name} with inference engine: {inference_engine_name}") + else: + with local_model_config.open('a') as file: + file.write(new_model) + file.close() + sys.exit(f"Add local model: {model_name} with inference engine: {inference_engine_name}") + +# Build Local Model Card +with local_model_config.open('r') as file: + all_model = file.read() + model_config_list = all_model.split('\n')[:-1] +for model_config in model_config_list: + model_name, config_n_layers, inference_engine, model_path = model_config.split(':') + build_local_model_card(model_name, model_path, inference_engine, int(config_n_layers)) +print(f"Init local model card complete") + system_info = get_system_info() print(f"Detected system: {system_info}") @@ -140,8 +191,10 @@ def preemptively_start_download(request_id: str, opaque_status: str): status = json.loads(opaque_status) if status.get("type") == "node_status" and status.get("status") == "start_process_prompt": current_shard = node.get_current_shard(Shard.from_dict(status.get("shard"))) - if os.path.isdir(current_shard.model_id): + + if "Local" in current_shard.model_id: # TODO: open ftp to share download model + print("Local model detected, skip download") pass else: if DEBUG >= 2: print(f"Preemptively starting download for {current_shard}") @@ -195,8 +248,9 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) elif os.path.isdir(model_name): # local model and shard - model_path = model_name.rstrip('/') - model_name = model_path.split('/')[-1] + model_name = model_name.rstrip('/').split('/')[-1] + model_path = str(os.environ.get("Home", Path.home()/exo_path/model_name)) + if os.path.isfile(model_path+'/config.json'): with open(model_path+'/config.json', 'r') as file: config = json.load(file) From 9ab3513096f229694fc9bf9e8956b46806a3eaef Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Wed, 20 Nov 2024 09:14:30 +0800 Subject: [PATCH 06/26] filter run_model_cli --- exo/main.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/exo/main.py b/exo/main.py index 0bc3709e0..c8a12ca7e 100644 --- a/exo/main.py +++ b/exo/main.py @@ -238,21 +238,22 @@ async def shutdown(signal, loop): loop.stop() -async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name: str, prompt: str): - if model_cards.get(model_name): +async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name_or_path: str, prompt: str): + if model_cards.get(model_name_or_path): inference_class = inference_engine.__class__.__name__ - shard = build_base_shard(model_name, inference_class) + shard = build_base_shard(model_name_or_path, inference_class) if not shard: - print(f"Error: exo Unsupported model '{model_name}' for inference engine {inference_engine.__class__.__name__}") + print(f"Error: exo Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") return tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) - elif os.path.isdir(model_name): + elif os.path.isdir(model_name_or_path): # local model and shard - model_name = model_name.rstrip('/').split('/')[-1] - model_path = str(os.environ.get("Home", Path.home()/exo_path/model_name)) + model_path = model_name_or_path.rstrip('/') + model_config_path = Path(model_path)/'config.json' + model_name = str(model_path.split('/')[-1]) - if os.path.isfile(model_path+'/config.json'): - with open(model_path+'/config.json', 'r') as file: + if os.path.isfile(model_config_path): + with open(model_config_path, 'r') as file: config = json.load(file) config_n_layers = config['num_hidden_layers'] build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, config_n_layers) @@ -300,11 +301,11 @@ def handle_exit(): await node.start(wait_for_peers=args.wait_for_peers) if args.command == "run" or args.run_model: - model_name = args.model_name or args.run_model - if not model_name: + model_name_or_path = args.model_name or args.run_model + if not model_name_or_path: print("Error: Model name is required when using 'run' command or --run-model") return - await run_model_cli(node, inference_engine, model_name, args.prompt) + await run_model_cli(node, inference_engine, model_name_or_path, args.prompt) else: asyncio.create_task(api.run(port=args.chatgpt_api_port)) # Start the API server as a non-blocking task await asyncio.Event().wait() From a9c345a8420d177baa44c3a6ea8b2e852a97bb39 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Wed, 20 Nov 2024 10:20:04 +0800 Subject: [PATCH 07/26] add init_exo_function (helpers.py) --- exo/helpers.py | 10 ++++++++++ exo/main.py | 17 ++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/exo/helpers.py b/exo/helpers.py index b657b2775..9a49ccad5 100644 --- a/exo/helpers.py +++ b/exo/helpers.py @@ -86,6 +86,16 @@ def terminal_link(uri, label=None): return escape_mask.format(parameters, uri, label) +def init_exo_env(): + exo_path = os.environ.get("Home", Path.home()/".cache"/"exo") + os.makedirs(exo_path, exist_ok=True) + print(f"Init exo folder: {exo_path}") + local_model_config = Path(f'{exo_path}/model_config.txt') + local_model_config.parent.mkdir(parents=True, exist_ok=True) + with local_model_config.open('a') as file: + file.close() + print(f"Init local model config: {exo_path}") + return exo_path, local_model_config T = TypeVar("T") K = TypeVar("K") diff --git a/exo/main.py b/exo/main.py index c8a12ca7e..4777f5570 100644 --- a/exo/main.py +++ b/exo/main.py @@ -17,7 +17,7 @@ from exo.api import ChatGPTAPI from exo.download.shard_download import ShardDownloader, RepoProgressEvent, NoopShardDownloader from exo.download.hf.hf_shard_download import HFShardDownloader -from exo.helpers import print_yellow_exo, find_available_port, DEBUG, get_system_info, get_or_create_node_id, get_all_ip_addresses, terminal_link +from exo.helpers import print_yellow_exo, init_exo_env, find_available_port, DEBUG, get_system_info, get_or_create_node_id, get_all_ip_addresses, terminal_link from exo.inference.shard import Shard from exo.inference.inference_engine import get_inference_engine, InferenceEngine from exo.inference.dummy_inference_engine import DummyInferenceEngine @@ -63,14 +63,7 @@ print_yellow_exo() # init folder for Local Model -exo_path = os.environ.get("Home", Path.home()/".cache"/"exo") -os.makedirs(exo_path, exist_ok=True) -print(f"Init exo folder: {exo_path}") -local_model_config = Path(f'{exo_path}/model_config.txt') -local_model_config.parent.mkdir(parents=True, exist_ok=True) -with local_model_config.open('a') as file: - file.close() -print(f"Init local model config: {exo_path}") +exo_path, local_model_config = init_exo_env() # import Local Model if args.add_local_model: @@ -85,9 +78,11 @@ else: sys.exit(f"Invalid inference engine: {inference_engine}") - with open(str(exo_path)+f'/{model_name}/config.json', 'r') as file: + config_file_path = Path(exo_path/model_name/'config.json') + with open(config_file_path, 'r') as file: config = json.load(file) config_n_layers = config['num_hidden_layers'] + new_model = f"{model_name}:{config_n_layers}:{inference_engine_name}:{str(exo_path)}/{model_name}\n" with local_model_config.open('r') as file: @@ -124,7 +119,7 @@ print(f"Using inference engine: {inference_engine.__class__.__name__} with shard downloader: {shard_downloader.__class__.__name__}") if args.node_port is None: - args.node_port = find_available_port(args.node_host) # 0.0.0.0:49152 ~ 65535 + args.node_port = find_available_port(args.node_host) if DEBUG >= 1: print(f"Using available port: {args.node_port}") args.node_id = args.node_id or get_or_create_node_id() From cdba915697606ba0ed4dbe3485310a05ba9d4d56 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Wed, 20 Nov 2024 10:57:40 +0800 Subject: [PATCH 08/26] filter read me --- README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index b550c5e50..bfe8af220 100644 --- a/README.md +++ b/README.md @@ -28,12 +28,6 @@ Forget expensive NVIDIA GPUs, unify your existing devices into one powerful GPU:

Update: exo is hiring. See here for more details.

-OKHand.zy fork add new feature: -- support CLI and ChatAPI use local model (only support mlx inference engine) -- add new args "--add-local-model" -- add init exo folder and model config file in /.cache/exo - - ## Get Involved exo is **experimental** software. Expect bugs early on. Create issues so they can be fixed. The [exo labs](https://x.com/exolabs) team will strive to resolve issues quickly. @@ -236,7 +230,7 @@ exo run llama-3.2-3b --prompt "What is the meaning of exo?" ``` #### Choose one device to run the following command: ```shell -curl http://localhost:8000/v1/chat/completions \ +curl http://localhost:52415/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Local/", From 0b06fe16dc3cdd63718bd487abba746a07650d58 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Wed, 20 Nov 2024 11:38:39 +0800 Subject: [PATCH 09/26] filter cli local model error --- exo/inference/mlx/sharded_inference_engine.py | 2 +- exo/inference/tokenizers.py | 4 ++-- exo/main.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exo/inference/mlx/sharded_inference_engine.py b/exo/inference/mlx/sharded_inference_engine.py index 8f8b709cf..c0c054757 100644 --- a/exo/inference/mlx/sharded_inference_engine.py +++ b/exo/inference/mlx/sharded_inference_engine.py @@ -66,7 +66,7 @@ async def infer_tensor(self, request_id: str, shard: Shard, input_data: np.ndarr async def ensure_shard(self, shard: Shard): if self.shard == shard: return - + if os.path.isdir(shard.model_id): # cli mode model_path = Path(shard.model_id) elif "Local" in shard.model_id: # api mode diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index ef75f7cbe..182f8c4ee 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -24,9 +24,9 @@ def decode(self, tokens): async def resolve_tokenizer(model_id: str): if model_id == "dummy": return DummyTokenizer() - + if os.path.isdir(model_id): # local model - local_path = model_id.rstrip('/') + local_path = str(model_id).rstrip('/') model_id = 'Local/'+str(local_path.split('/')[-1]) else: local_path = await get_local_snapshot_dir(model_id) diff --git a/exo/main.py b/exo/main.py index 07dba2c17..02983b38a 100644 --- a/exo/main.py +++ b/exo/main.py @@ -189,7 +189,7 @@ def preemptively_start_download(request_id: str, opaque_status: str): if status.get("type") == "node_status" and status.get("status") == "start_process_prompt": current_shard = node.get_current_shard(Shard.from_dict(status.get("shard"))) - if "Local" in current_shard.model_id: + if "Local" in current_shard.model_id or os.path.isdir(current_shard.model_id): # TODO: open ftp to share download model print("Local model detected, skip download") pass From 438eae4b4f6f11081cfec69f128ad8e3eaac6758 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Wed, 20 Nov 2024 14:04:59 +0800 Subject: [PATCH 10/26] filter some mark --- exo/inference/mlx/sharded_inference_engine.py | 5 ++--- exo/inference/tokenizers.py | 3 +-- exo/main.py | 7 ------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/exo/inference/mlx/sharded_inference_engine.py b/exo/inference/mlx/sharded_inference_engine.py index c0c054757..1d6e4a6b7 100644 --- a/exo/inference/mlx/sharded_inference_engine.py +++ b/exo/inference/mlx/sharded_inference_engine.py @@ -1,6 +1,8 @@ +import os import numpy as np import mlx.core as mx import mlx.nn as nn +from pathlib import Path from ..inference_engine import InferenceEngine from .stateful_model import StatefulModel from .sharded_utils import load_shard, get_image_from_str @@ -10,9 +12,6 @@ import asyncio from concurrent.futures import ThreadPoolExecutor from functools import partial -# OKHand.zy add library -import os -from pathlib import Path from exo.models import get_repo def sample_logits( diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index 182f8c4ee..ec8d7972e 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -1,3 +1,4 @@ +import os import traceback from aiofiles import os as aios from os import PathLike @@ -7,8 +8,6 @@ from exo.download.hf.hf_helpers import get_local_snapshot_dir from exo.helpers import DEBUG -# OKHand.ziyu add library -import os class DummyTokenizer: def __init__(self): diff --git a/exo/main.py b/exo/main.py index 02983b38a..8dd51e73d 100644 --- a/exo/main.py +++ b/exo/main.py @@ -64,10 +64,8 @@ print_yellow_exo() -# init folder for Local Model exo_path, local_model_config = init_exo_env() -# import Local Model if args.add_local_model: model_name = args.add_local_model[0] inference_engine = args.add_local_model[1].lower() @@ -98,7 +96,6 @@ file.close() sys.exit(f"Add local model: {model_name} with inference engine: {inference_engine_name}") -# Build Local Model Card with local_model_config.open('r') as file: all_model = file.read() model_config_list = all_model.split('\n')[:-1] @@ -113,7 +110,6 @@ inference_engine_name = args.inference_engine or ("mlx" if system_info == "Apple Silicon Mac" else "tinygrad") print(f"Inference engine name after selection: {inference_engine_name}") -# default use HF Downloader Model shard_downloader: ShardDownloader = HFShardDownloader(quick_check=args.download_quick_check, max_parallel_downloads=args.max_parallel_downloads) if args.inference_engine != "dummy" else NoopShardDownloader() @@ -135,7 +131,6 @@ for chatgpt_api_endpoint in chatgpt_api_endpoints: print(f" - {terminal_link(chatgpt_api_endpoint)}") -# Default use udp discovery if args.discovery_module == "udp": discovery = UDPDiscovery( args.node_id, @@ -190,7 +185,6 @@ def preemptively_start_download(request_id: str, opaque_status: str): current_shard = node.get_current_shard(Shard.from_dict(status.get("shard"))) if "Local" in current_shard.model_id or os.path.isdir(current_shard.model_id): - # TODO: open ftp to share download model print("Local model detected, skip download") pass else: @@ -230,7 +224,6 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam return tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) elif os.path.isdir(model_name_or_path): - # local model and shard model_path = model_name_or_path.rstrip('/') model_config_path = Path(model_path)/'config.json' model_name = str(model_path.split('/')[-1]) From 535cb44a876bd106bc4b8d98a4d873fec5b4f0c5 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Fri, 22 Nov 2024 10:10:17 +0800 Subject: [PATCH 11/26] filter name miss --- exo/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exo/main.py b/exo/main.py index 8dd51e73d..b6cf770c9 100644 --- a/exo/main.py +++ b/exo/main.py @@ -239,7 +239,7 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam print(f"Error: Not Find Local model '{model_name}' for inference engine {inference_engine.__class__.__name__}") return else: - print(f"Error: Unsupported model '{model_name}' for inference engine {inference_engine.__class__.__name__}") + print(f"Error: Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") return request_id = str(uuid.uuid4()) From 1e5429d5db1db39158d1aa4e47dab9da75b03177 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Thu, 28 Nov 2024 11:12:50 +0800 Subject: [PATCH 12/26] remove:add lcoal model arg --- exo/helpers.py | 11 +++-------- exo/main.py | 52 ++++++++++++-------------------------------------- exo/models.py | 2 +- 3 files changed, 16 insertions(+), 49 deletions(-) diff --git a/exo/helpers.py b/exo/helpers.py index 7ab74ad41..7db180250 100644 --- a/exo/helpers.py +++ b/exo/helpers.py @@ -88,15 +88,10 @@ def terminal_link(uri, label=None): return escape_mask.format(parameters, uri, label) def init_exo_env(): - exo_path = os.environ.get("Home", Path.home()/".cache"/"exo") + exo_path = Path(Path.home()/".cache"/"exo") os.makedirs(exo_path, exist_ok=True) - print(f"Init exo folder: {exo_path}") - local_model_config = Path(f'{exo_path}/model_config.txt') - local_model_config.parent.mkdir(parents=True, exist_ok=True) - with local_model_config.open('a') as file: - file.close() - print(f"Init local model config: {exo_path}") - return exo_path, local_model_config + if DEBUG >= 1: print(f"Init exo folder: {exo_path}") + return exo_path T = TypeVar("T") K = TypeVar("K") diff --git a/exo/main.py b/exo/main.py index b6cf770c9..29b163b41 100644 --- a/exo/main.py +++ b/exo/main.py @@ -58,51 +58,12 @@ parser.add_argument("--prompt", type=str, help="Prompt for the model when using --run-model", default="Who are you?") parser.add_argument("--tailscale-api-key", type=str, default=None, help="Tailscale API key") parser.add_argument("--tailnet-name", type=str, default=None, help="Tailnet name") -parser.add_argument("--add-local-model", type=str, nargs=2, metavar=('Model_name', 'Inference_engine'), help="Add local model: MODEL_NAME is the name of model, ENGINE_NAME is mlx/tinygrad/dummy") args = parser.parse_args() print(f"Selected inference engine: {args.inference_engine}") print_yellow_exo() -exo_path, local_model_config = init_exo_env() - -if args.add_local_model: - model_name = args.add_local_model[0] - inference_engine = args.add_local_model[1].lower() - if inference_engine == "mlx" or inference_engine == "mlxdynamicshardinferenceengine": - inference_engine_name = "MLXDynamicShardInferenceEngine" - elif inference_engine == "tinygrad" or inference_engine == "tinygradshardinferenceengine": - inference_engine_name = "TinyGradShardInferenceEngine" - elif inference_engine == "dummy" or inference_engine == "dummyinferenceengine": - inference_engine_name = "DummyInferenceEngine" - else: - sys.exit(f"Invalid inference engine: {inference_engine}") - - config_file_path = Path(exo_path/model_name/'config.json') - with open(config_file_path, 'r') as file: - config = json.load(file) - config_n_layers = config['num_hidden_layers'] - - new_model = f"{model_name}:{config_n_layers}:{inference_engine_name}:{str(exo_path)}/{model_name}\n" - - with local_model_config.open('r') as file: - existing_content = file.read() - file.close() - if new_model in existing_content: - sys.exit(f"Model already: {model_name} with inference engine: {inference_engine_name}") - else: - with local_model_config.open('a') as file: - file.write(new_model) - file.close() - sys.exit(f"Add local model: {model_name} with inference engine: {inference_engine_name}") - -with local_model_config.open('r') as file: - all_model = file.read() - model_config_list = all_model.split('\n')[:-1] -for model_config in model_config_list: - model_name, config_n_layers, inference_engine, model_path = model_config.split(':') - build_local_model_card(model_name, model_path, inference_engine, int(config_n_layers)) -print(f"Init local model card complete") +exo_path = init_exo_env() system_info = get_system_info() print(f"Detected system: {system_info}") @@ -116,6 +77,17 @@ inference_engine = get_inference_engine(inference_engine_name, shard_downloader) print(f"Using inference engine: {inference_engine.__class__.__name__} with shard downloader: {shard_downloader.__class__.__name__}") +for folder_path in Path(exo_path).iterdir(): + if folder_path.is_dir(): + model_path = folder_path + model_name = folder_path.name + config_file_path = Path(folder_path/'config.json') + with open(config_file_path, 'r') as file: + config = json.load(file) + config_n_layers = config['num_hidden_layers'] + build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, int(config_n_layers)) +print(f"Init local model card complete") + if args.node_port is None: args.node_port = find_available_port(args.node_host) if DEBUG >= 1: print(f"Using available port: {args.node_port}") diff --git a/exo/models.py b/exo/models.py index f9b2d2569..565bcdc1c 100644 --- a/exo/models.py +++ b/exo/models.py @@ -125,7 +125,7 @@ def build_base_shard(model_id: str, inference_engine_classname: str) -> Optional return None return Shard(model_id, 0, 0, n_layers) -def build_local_model_card(model_name: str, model_path: str, inference_engine: str, config_n_layers: int): +def build_local_model_card(model_name: str, model_path: str, inference_engine: str, config_n_layers: int) -> None: short_model_name = f"Local/{model_name}" pretty_model_name = f"{model_name} (Local)".replace('-', ' ') model_cards[short_model_name] = { From 880682a71e5b4860dfcad03e98c86b041ea45f5e Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Fri, 6 Dec 2024 11:40:11 +0800 Subject: [PATCH 13/26] filter: other dir no config error --- exo/main.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/exo/main.py b/exo/main.py index 29b163b41..48bc40a06 100644 --- a/exo/main.py +++ b/exo/main.py @@ -82,10 +82,11 @@ model_path = folder_path model_name = folder_path.name config_file_path = Path(folder_path/'config.json') - with open(config_file_path, 'r') as file: - config = json.load(file) - config_n_layers = config['num_hidden_layers'] - build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, int(config_n_layers)) + if config_file_path.is_file(): + with open(config_file_path, 'r') as file: + config = json.load(file) + config_n_layers = config['num_hidden_layers'] + build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, int(config_n_layers)) print(f"Init local model card complete") if args.node_port is None: From c4e18aea6574fce7630228a6a26da187aafc8753 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Fri, 6 Dec 2024 14:59:35 +0800 Subject: [PATCH 14/26] merge: new image --- .gitattributes | 2 + docs/exo-logo-transparent-black-text.png | Bin 1296 -> 129 bytes docs/exo-logo-transparent.png | Bin 1296 -> 129 bytes docs/exo-rounded.png | Bin 28651 -> 130 bytes docs/exo-screenshot.png | Bin 479724 -> 131 bytes docs/ring-topology.png | Bin 55857 -> 130 bytes exo/apputil/__init__.py | 1 + exo/apputil/anim.py | 161 +++ exo/apputil/baseimages/image1.png | 3 + exo/apputil/baseimages/image2.png | 3 + exo/apputil/baseimages/image3.png | 3 + exo/apputil/baseimages/image4.png | 3 + extra/dashboard/dashboard.py | 1147 +++++++++++++++++++++ extra/dashboard/requirements.txt | 5 + extra/dashboard/sounds/gta5_wasted.mp3 | 3 + extra/dashboard/sounds/pokemon_evolve.mp3 | 3 + extra/line_counter.py | 210 ++++ extra/pipsize.py | 113 ++ 18 files changed, 1657 insertions(+) create mode 100644 .gitattributes create mode 100644 exo/apputil/__init__.py create mode 100644 exo/apputil/anim.py create mode 100644 exo/apputil/baseimages/image1.png create mode 100644 exo/apputil/baseimages/image2.png create mode 100644 exo/apputil/baseimages/image3.png create mode 100644 exo/apputil/baseimages/image4.png create mode 100644 extra/dashboard/dashboard.py create mode 100644 extra/dashboard/requirements.txt create mode 100644 extra/dashboard/sounds/gta5_wasted.mp3 create mode 100644 extra/dashboard/sounds/pokemon_evolve.mp3 create mode 100644 extra/line_counter.py create mode 100644 extra/pipsize.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..ab26661da --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.mp3 filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text diff --git a/docs/exo-logo-transparent-black-text.png b/docs/exo-logo-transparent-black-text.png index 1dfe106a6bdefc2beb8480037845dc7682ee7057..50ec690ed40d5ef358150d6fb26756825e4cae15 100644 GIT binary patch literal 129 zcmWN?K@!3s3;@78uiyg~LLowbLm&}mR65f3;OliSd+}%X@z(7)_PH7J=*R6TbNSy+ zTFQ8txpOfWsL`vQExUjl6ckH{gi)jbWbcZ&AXNRDQHXO&5ffKWIXVvFqpi`w%8Bk4 MLCyYU4KAVj0qJ@t%>V!Z literal 1296 zcmeAS@N?(olHy`uVBq!ia0y~yV9WrrKX5PuNvTS{S|G((9OUlAc=M!AJ&?m$;1OBO zz`!jG!i)^F=12eq>jHd2T!Hief~IZFZ-CZol?3?(GejJlCALAQC9m+m%wx+{eG|`q zx-9(cOkzk0ejhE&XXd&k>f#8Jc{kZXxr3|Mx#WmfpkfBj9-O`=ZI2tE!)!Yh5MdY>^(m(|G$sW^>hA#zlHbLo~)=n`Az;|#pConw(p*0erk=}pDFq! z(`V~f^Sa;LEB46d@Be5jbN`=cet-1;Ni_>EIDO}w>zlE#)o%KQn=N8dFN%@5zxF%7 zpK@HfdH1p2AB@#c-##q)@vixi#U8c2)kYN+Kh{irSy*`IXGkCW^(Fmmr?;PepYp!; z&xW&~DxR;fdA~3A!@kxF+aEpm^*i+ORhq@V-)b`N!(s*3%eFqA`{P^HR|}c=Tdpr0 zot6vl@_+HGHP)%0ZLN42r>)eMxErcpGA>jlPQS3&@ip-h1t(j-^Bw+ZvM(o|X|Mf` z`Tu0@b{-mF~oSi%Fdg;*x`ro2U4(|Ekuah(JLT9V4kk!Twu1@M=+dN(zIV8q8 zH{yoULSgP`m6D{y?iN3siWX(F+UoZ2zjpfb&9XlScI*v5`tjw1_eJ67Pko;B`-S@Z zQ;&}q{rON?So3X{%=_uj&;EG6!RUwVjrz!W<>Iwmte+2R9A^7}xM;1tMCybKpF!ao z35;M{`-Q(-=Bbv<$077S%P~6D$(fT^)nv+rfFZ>A&+y(@hW}1&sx7G0@^tlcS?83{ F1OUvz0Hpu` diff --git a/docs/exo-logo-transparent.png b/docs/exo-logo-transparent.png index c5e5d041303caab8589de4d194c26e7935027f2b..5cf5ea69faf8e9963727c6978c6f8d1bb5f62d11 100644 GIT binary patch literal 129 zcmWN?%MrpL5CG6SRnUL|Hn2dtSw1VwsAL3luzG!$ch&do<0ac#=RB0U_jP;l-2S&u z+VXg+dDg5hBStTBHUfu7_Ea+=1&?H+E9^D$4q(_MF4ji~!B*53GNj!(4am{vM4G+x MSj6n#Dh)&wKgHB13jhEB literal 1296 zcmeAS@N?(olHy`uVBq!ia0y~yV9WrrKX5PuNvTS{S|G((9OUlAc=M!AJ&?m$;1OBO zz`!jG!i)^F=12eq>jHd2T!Hle`(SjB;r|^l14shdaKR@G|L-#VzYP`yGJsML63Dm? z=0X(TfQbWTufoJ3ih&|P(|~L^dH`kLIeqIp&;?p0L4Lsu5yxhUZP01SEBr6>*m70h z#Iv6+3qO1LhIjAJSyO#SIIbAq=)Y`-u{r;Ty^HjE=Ave z-^B}Jg`~VPG!`ywX&W+(O&2Dwnt$R+xkcP>;r+EID{4=ElYdz8IDL=pyJwl7S|j&o zihjxT+4|MI?)UbJJ+k@xKbp$i|0kN?AN_w)&B6;#-#O>{W-M&An||SDi&)f)Vr1^G z{m$>F9G7n1eXREfWA)Rw4@-W$Ykp+0M{RGlQANd%HB(;}7T)<8(#L*%Nk7}^?WfkCJx<-)uCU;Ju~b?RqZD_+KFE43x=hU%A$3ss5JFD!O^O}s?G$=2_Dhd-L^%ZX>& zYrkXuKbd-6ey?4Jf7}e`*|kpf!r@o{N_mB<3Z3H37GCClEo8NKgB}Ttg4fkH{k#7w z$=Lr5m^b~;&o7TZ>E|wI=Z?ExdUS#Qx9F0Cdw%%qVMcJ&jy8ZjFo&J2Y?9YK6d&7@@eEHygQTX{&pC|o( zq5l5VRMyf>ENzf+rP3oJGmJYD@< J);T3K0RU~eO~wEK diff --git a/docs/exo-rounded.png b/docs/exo-rounded.png index f64b45ae1e02be7fac8901a5f4faa8516c48b8d6..a12c5650a545293f3c45345a3a4e30ae6465c0ac 100644 GIT binary patch literal 130 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 KKQ5C;1pFUW<`dHZ diff --git a/docs/exo-screenshot.png b/docs/exo-screenshot.png index 27585a7f72d2d3227abc0591eb6c7b0403b93372..19963ad2ebfad88f4a514728d6d48b56e6f40298 100644 GIT binary patch literal 131 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%0Db8_f9OUexaEyO0L}K4x^$QO|VU zV`M9Ng=^@IDdbPlt-XKAKH;R2*P+gBK2{i!i~tJllOBkx@VI`L)A1<1&exwkHfxH{ zJ0Mx#)qN{#Eg&Vx-hmm8PUtMm(y`uStw3+u!_m;eR-e)XzxwDLG_=HNCbbC{X^!-q z_E{M)SH4u)xlm7G14WID@5fa}Dj6BU%M6bC#DR2HhZpoJ3*@Ze8ZeTNkS||hXb4?Q z-M+}_exdR;K0|34%IMUp!QxJsak|`N09|7^S#OE2Is_BhM?bfyw@+GClr@YkIxLzN zr#brI9_9<=-?dRa(tfwSaQ=y-vaybhx)Kz7t2{$f&{e#CSn& zH636S((KZ}$QYR??yXd+A;{~&5QOJ}9?C_d6l_;l;gW0F??gocjPunyys5EjN+X_b zKf=(nO-dc$g;#*qwir*GaG@NvuOhN-V6mLTPz)6ci7Z(|zh^AY8lxDYc>qn#-`on+t2NaRy>_uSEg1prkHNXAh>kwm8Vi}ry{^2x=+-tnJZb)BqW8QPx z&~tOKa}a@}&tR=<$k>L$1_6K*lTQIBX%qm2;0VClGbMa-1mT@L^w%<^m_#sVLpMX* zAgHSB<*4*Z%|dEk53Hu{rvL(A(2?=LBNPR~3nFw5RJ_6nKZf}{A}y6+&@z?7yJd_tnw@|9Es@+MDl92�>$2qU!4XX>*4GZ78y_ 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 z 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¬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ɫ`<4cZ*hZ?~w< zzu_?jlUKVW+}EAm1y#gothIS64y$9m=kb?YiHyK{~v0do|`|+4hSsi53 z4KpnWyX%XUrM>bB1>TXm%G@HsR@tIakK@QO!g+aTp}_8UY`lfU;~s_J$>5&<0B{&6 zJY=AwV6QG(^XQoK&sYWSY9p=KkPQ`YVqkqe;^#X-f#lh8kB=+rQ$-TRUaFRzn1KUU zqm$$5Gd0-3DZSi$^~;Wgw;}FNl%5UOgmEDNbXru*gNvA$I9?J+0{wDdT28xqOqefx-6z^O)khC>g_Dg>sjyj+qR`h$kCys{zpzg zGV)O+q~?Y7@qFs<>j%A?k7A&SH=EtY`)Yc3b-0M!jQw|~O4pr`n@N8{tXw34w?JB+{bZlft)ZdV% z4a?$Mqm)s`f#q7pf!AKvLc*jA*P}mgL(p>7$ z1o2RE+X;US71ImE1BW)yp+MN;ZV8==nHx;t%dflMes0z0gVDqhZ)njs3H z59I0&!yw^R#+}Ljjm=^TdsviAEYD2@AD+EjgWqShEnf;e=kWA;RdhqFrhNfk?3*Dd z4iPUh^i7fXhB5sqc%qO6LOKYl!4%u&z3*{Z+`8*eS%qLu7Ahov#y@$0Jp=4y;msU=|9unF zzroqT4?lXd-I)T3={58$Xzbvujp_SwLi1KAwQ#RluMa%U`yhK!f*w|P=${i)7>!X{ z&Wpb`E{ugyI1?Z?%GsEzt8Q^ca{<>>iJL``R3UW#c@CDWW#ae%rBkGx?2e@E)su7C ze+fpi*j|8`+Hk%OV2H+QViez3;ic(3eqC(HtdRz2BptqvPjdH23yoJxkN6U**jB}5 zMrB4bkrdPbu>K4O)J4{s)$3?5j}&QAflyOX4>#cA61G1K>H#9d@Bw_WxO{_OAa910 zS#*jLcS>zZBt?#6|3rde7tD zq{)Htw91OnoMizdm(^x5$5yb-6SRE0Dh`P;w;lI)t4G+5R3$+=V zBO&d*ZrS-o`F%a)m6xi?$F#5P|Faq#ovVB*rPG=#Qy?fVD>K||cUY}A2m�wcCkp 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 KV zkoxS0>8r{^*bRLp)a<+9eHv+>+&buF){Z`XTa#bt=}=15y9=lZ0Yd|4)4Cw%7wi{L zj?2QpE#`C;gLGXBU?(g|a{|TFrjOcjwu?pDG*(|Tr)l5LX)#l4d^A6f(1p$BFym_% z^lB*HjlG}xpjX>xrk;a`Qhp`v99Fjc*EZ6!5bStB$>W7*Vq)U%5sEF?@gJA)R|C4G zu)iDJ-wnuoVF)~Upvj!1!?1SoT`?WSUfNqEn!o2lc`9mlf{l(dmOzonlt9D>ylnv@ zv*g=p>u}7MmhUT;aMwUTTGFhU>5d$F`@y_PGkK#J@eGOt`rY4M_@s%5_Exer$6t+p zZBFU5DWJX`xOBx8k$RO&`UX_+He>7ZXRRJD>m+AL@-6MJpw=HuzWjf%FqA@&S`1xS z#HEFuU2*s&Z#|Xk%KtFD1tk`HUhq?i(MoTRY=;F9WN)NltRTgEfyExxtB-gNB_`P`OaY3a5#Ppx#*(!k3_OfTnw$MN$Y z&4c}4XT9_v3H4W^#0wL0UVtv(O$eYwlIP(5%vW&{@LT4v#r=p+%sCsS@`hR@q^9ld} diff --git a/docs/ring-topology.png b/docs/ring-topology.png index b503db05315f270be207412cf0967234e7e1ca1d..6c7d8fd937ad39fe33c872340016b68adf333973 100644 GIT binary patch literal 130 zcmWN?%MrpL5CG6SRnUOpvn-Hw0}BWwm_;aLyUpYdcW_ETy_A6+C_Xmuy3J8+YwJZyWBArV&OA3O3lt_1XNl3@i4Ju1_Nr!X@NJ~q1BOTA> z^Nrv4^*nz+`+CjZyK`se+&OdR#Cy($zEP5S_LTf73JS_IxU8fq3d*Bipmbt90cx5J z8)8sUutm%zB;LR!B*1SRY)#Cqj8RZzLlZR6HQ)9TXKJg`R->S*ire~!#G|N+n|(cJ zcu9+iCl}%O<)aJQ7?n)5_QnIP1u;6qnO18c;yhT@zWLmB8fW#>PkRR0;qLDV-1vcKZsc;3b_e%IX8 z_y|wSb3!Ti@9^FI`|(SEL249PXs7v&pdL$SFiP7iw~ugP6iG5$7`HxiM>(n@CN|!( z6i52kHX@Gn+_vjgo{ABx5ba0cSB~|u*eGf&5}7J(1E0uWdgBR%T!`bN6k>-oJ2*0) z&?IYUw!djyeV3`u1cn{s+b#+`5Oif_^!1GyNOIHJA$pCqh?w+ zCU`Pfl71~uy^F!R1b9Mb`mt%eT>4h>xd=kx5ZqPM?k7yg0X4^U#}`XFw?pM%LRhbCupoz8Fmvdgq{v4+_D^P!J4rfzIPHEpjTA=hVKfxJTF4WE+(^Vn<+Qs5NvA5 z?A4e;)S9^qPQQ`4!1a}IeV5oL7;F(t9n2cm;`M`Tnv=YoF+5K`kSygAo7jsEgOn0~ z*ynl2$d3_Bl<8}!qYDp0dS6@cjP+vur7y~#X+btNyHx>_IqWtcjk;TkR>yY=7u#=8 z|LD*uzhru2SGOzvNf}eUZp_J#mhJI7JK?Cd$8IPze{lW9Kp~IeA0QFJgr$y{$xluE z-M^5=`>%a?_8WyK!1@EpZ!DZo9(K>uL8fg|c4Ru}u1ninsH~ziZs@{v7~AFv?K#?srv z=?elcv=*$g4(+3&3yCJ&d+9Iur${d2;83;~Q_%)BMNZAcRxLFkO6 z{I^$g;qXr8W$a~wW$BNvk3bax7sbEqQXGl>m2nFr4j01!uh|{ch&h`dL{6`Tzl#KQbSFzP*rVEU8|5# z9ZP*c4YyEFbx%DzUn{?2qRygfqJM&X!lv+V(bz;!zD)i`A*;$_iH}~hb^y}g>r&Z| zDa|hxiYxKmhA?T~oT@FsE3Ye;D|3$|29+_@xa^c1t-^YZD%~n&d5Hn|D?Q89clDF( zB}&!`v*Kyl8QIMW*PqUw?J3h?OP5PyNHbHba4z?UoWtmxy_`TWdRPr?%2{}e!|B$! z%2{J`a%W+xrsJ{DFIbSWRL7ZZ)^;@^umbDU+dHCzowhEW42=lylh+; zTzC}4ynM#LEc2~54U>)QW)ABNqVeZ@2V~8vXY!{v`6a@Cd|YLlWPeZQ-F?+9)~&iy z(!JN6rO2$ftPrMPp}3!>s+f|ym0P5!t#JJ_;%EC$lT`JzdG@?y&Oy$>snjfPUt0t7 zm=6`dzAb#4Rqcs2)H2hub{`HiS+nNuDjeNT!?|k+UR|j{mXsyx%=btlisu6dm}
pO0$!OF#add$Ld8ifI4uN= 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∋-7^__ke0T|l{TDwU&sWZ$ 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 NJYD@<);T3K0RWbz)Di#y diff --git a/exo/apputil/__init__.py b/exo/apputil/__init__.py new file mode 100644 index 000000000..b6ac6e259 --- /dev/null +++ b/exo/apputil/__init__.py @@ -0,0 +1 @@ +from exo.apputil.anim import create_animation_mp4 \ No newline at end of file diff --git a/exo/apputil/anim.py b/exo/apputil/anim.py new file mode 100644 index 000000000..654ca4703 --- /dev/null +++ b/exo/apputil/anim.py @@ -0,0 +1,161 @@ +from PIL import Image, ImageDraw, ImageFont, ImageFilter +import os +import numpy as np +import cv2 + +def draw_rounded_rectangle(draw, coords, radius, fill): + left, top, right, bottom = coords + diameter = radius * 2 + draw.rectangle([left + radius, top, right - radius, bottom], fill=fill) + draw.rectangle([left, top + radius, right, bottom - radius], fill=fill) + draw.pieslice([left, top, left + diameter, top + diameter], 180, 270, fill=fill) + draw.pieslice([right - diameter, top, right, top + diameter], 270, 360, fill=fill) + draw.pieslice([left, bottom - diameter, left + diameter, bottom], 90, 180, fill=fill) + draw.pieslice([right - diameter, bottom - diameter, right, bottom], 0, 90, fill=fill) + +def draw_centered_text_rounded(draw, text, font, rect_coords, radius=10, text_color="yellow", bg_color=(43,33,44)): + bbox = font.getbbox(text) + text_width = bbox[2] - bbox[0] + text_height = bbox[3] - bbox[1] + rect_left, rect_top, rect_right, rect_bottom = rect_coords + rect_width = rect_right - rect_left + rect_height = rect_bottom - rect_top + text_x = rect_left + (rect_width - text_width) // 2 + text_y = rect_top + (rect_height - text_height) // 2 + draw_rounded_rectangle(draw, rect_coords, radius, bg_color) + draw.text((text_x, text_y), text, fill=text_color, font=font) + +def draw_left_aligned_text_rounded(draw, text, font, rect_coords, padding_left=20, radius=10, text_color="yellow", bg_color=(43,33,44)): + bbox = font.getbbox(text) + text_height = bbox[3] - bbox[1] + rect_left, rect_top, rect_right, rect_bottom = rect_coords + rect_height = rect_bottom - rect_top + text_y = rect_top + (rect_height - text_height) // 2 + text_x = rect_left + padding_left + draw_rounded_rectangle(draw, rect_coords, radius, bg_color) + draw.text((text_x, text_y), text, fill=text_color, font=font) + +def draw_right_text_dynamic_width_rounded(draw, text, font, base_coords, padding=20, radius=10, text_color="yellow", bg_color=(43,33,44)): + bbox = font.getbbox(text) + text_width = bbox[2] - bbox[0] + text_height = bbox[3] - bbox[1] + _, rect_top, rect_right, rect_bottom = base_coords + rect_height = rect_bottom - rect_top + new_rect_left = rect_right - (text_width + (padding * 2)) + text_y = rect_top + (rect_height - text_height) // 2 + text_x = new_rect_left + padding + draw_rounded_rectangle(draw, (new_rect_left, rect_top, rect_right, rect_bottom), radius, bg_color) + draw.text((text_x, text_y), text, fill=text_color, font=font) + return new_rect_left + +def draw_progress_bar(draw, progress, coords, color="yellow", bg_color=(70, 70, 70)): + left, top, right, bottom = coords + total_width = right - left + draw.rectangle(coords, fill=bg_color) + progress_width = int(total_width * progress) + if progress_width > 0: + draw.rectangle((left, top, left + progress_width, bottom), fill=color) + +def crop_image(image, top_crop=70): + width, height = image.size + return image.crop((0, top_crop, width, height)) + +def create_animation_mp4( + replacement_image_path, + output_path, + device_name, + prompt_text, + fps=30, + target_size=(512, 512), + target_position=(139, 755), + progress_coords=(139, 1285, 655, 1295), + device_coords=(1240, 370, 1640, 416), + prompt_coords=(332, 1702, 2662, 1745) +): + frames = [] + try: + font = ImageFont.truetype("/System/Library/Fonts/SFNSMono.ttf", 20) + promptfont = ImageFont.truetype("/System/Library/Fonts/SFNSMono.ttf", 24) + except: + font = ImageFont.load_default() + promptfont = ImageFont.load_default() + + # Process first frame + base_img = Image.open(os.path.join(os.path.dirname(__file__), "baseimages", "image1.png")) + draw = ImageDraw.Draw(base_img) + draw_centered_text_rounded(draw, device_name, font, device_coords) + frames.extend([crop_image(base_img)] * 30) # 1 second at 30fps + + # Process second frame with typing animation + base_img2 = Image.open(os.path.join(os.path.dirname(__file__), "baseimages", "image2.png")) + for i in range(len(prompt_text) + 1): + current_frame = base_img2.copy() + draw = ImageDraw.Draw(current_frame) + draw_centered_text_rounded(draw, device_name, font, device_coords) + if i > 0: # Only draw if we have at least one character + draw_left_aligned_text_rounded(draw, prompt_text[:i], promptfont, prompt_coords) + frames.extend([crop_image(current_frame)] * 2) # 2 frames per character for smooth typing + + # Hold the complete prompt for a moment + frames.extend([frames[-1]] * 30) # Hold for 1 second + + # Create blur sequence + replacement_img = Image.open(replacement_image_path) + base_img = Image.open(os.path.join(os.path.dirname(__file__), "baseimages", "image3.png")) + blur_steps = [int(80 * (1 - i/8)) for i in range(9)] + + for i, blur_amount in enumerate(blur_steps): + new_frame = base_img.copy() + draw = ImageDraw.Draw(new_frame) + + replacement_copy = replacement_img.copy() + replacement_copy.thumbnail(target_size, Image.Resampling.LANCZOS) + if blur_amount > 0: + replacement_copy = replacement_copy.filter(ImageFilter.GaussianBlur(radius=blur_amount)) + + mask = replacement_copy.split()[-1] if replacement_copy.mode in ('RGBA', 'LA') else None + new_frame.paste(replacement_copy, target_position, mask) + + draw_progress_bar(draw, (i + 1) / 9, progress_coords) + draw_centered_text_rounded(draw, device_name, font, device_coords) + draw_right_text_dynamic_width_rounded(draw, prompt_text, promptfont, (None, 590, 2850, 685), padding=30) + + frames.extend([crop_image(new_frame)] * 15) # 0.5 seconds at 30fps + + # Create and add final frame (image4) + final_base = Image.open(os.path.join(os.path.dirname(__file__), "baseimages", "image4.png")) + draw = ImageDraw.Draw(final_base) + + draw_centered_text_rounded(draw, device_name, font, device_coords) + draw_right_text_dynamic_width_rounded(draw, prompt_text, promptfont, (None, 590, 2850, 685), padding=30) + + replacement_copy = replacement_img.copy() + replacement_copy.thumbnail(target_size, Image.Resampling.LANCZOS) + mask = replacement_copy.split()[-1] if replacement_copy.mode in ('RGBA', 'LA') else None + final_base.paste(replacement_copy, target_position, mask) + + frames.extend([crop_image(final_base)] * 30) # 1 second at 30fps + + # Convert frames to video using H.264 codec + if frames: + first_frame = np.array(frames[0]) + height, width = first_frame.shape[:2] + fourcc = cv2.VideoWriter_fourcc(*'avc1') + out = cv2.VideoWriter( + output_path, + fourcc, + fps, + (width, height), + isColor=True + ) + + if not out.isOpened(): + print("Error: VideoWriter failed to open") + return + + for frame in frames: + frame_array = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR) + out.write(frame_array) + + out.release() + print(f"Video saved successfully to {output_path}") \ No newline at end of file diff --git a/exo/apputil/baseimages/image1.png b/exo/apputil/baseimages/image1.png new file mode 100644 index 000000000..b8375e7eb --- /dev/null +++ b/exo/apputil/baseimages/image1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:361fdadd67c277d45cd18b0bfc8c5ceea5fd89f2d65aef157fd915ce9cbb8599 +size 814460 diff --git a/exo/apputil/baseimages/image2.png b/exo/apputil/baseimages/image2.png new file mode 100644 index 000000000..b2d4f31c9 --- /dev/null +++ b/exo/apputil/baseimages/image2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0e3891bc6b4f4dfa7444af53fcaa4b3ba06b0549546202be3243f08a0e6bd7e +size 814235 diff --git a/exo/apputil/baseimages/image3.png b/exo/apputil/baseimages/image3.png new file mode 100644 index 000000000..9ee38a572 --- /dev/null +++ b/exo/apputil/baseimages/image3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2dc5b3378aef397d60fd1252da8a1c578ad97e202a859590ffa416b49551d19 +size 146633 diff --git a/exo/apputil/baseimages/image4.png b/exo/apputil/baseimages/image4.png new file mode 100644 index 000000000..e0959d7b0 --- /dev/null +++ b/exo/apputil/baseimages/image4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbc6883e2a3c5233ec7b844c98646922bdc4f5e42e1f424857eaff56f785dbcd +size 668550 diff --git a/extra/dashboard/dashboard.py b/extra/dashboard/dashboard.py new file mode 100644 index 000000000..0ef6d3edd --- /dev/null +++ b/extra/dashboard/dashboard.py @@ -0,0 +1,1147 @@ +import os +import json +import logging +import asyncio +import aiohttp +import pandas as pd +import plotly.express as px +from typing import List, Dict, Optional +from pathlib import Path +from plotly.subplots import make_subplots +import plotly.graph_objects as go +import time +import pygame.mixer +from datetime import datetime + +class AsyncCircleCIClient: + def __init__(self, token: str, project_slug: str): + self.token = token + self.project_slug = project_slug + self.base_url = "https://circleci.com/api/v2" + self.headers = { + "Circle-Token": token, + "Accept": "application/json" + } + self.logger = logging.getLogger("CircleCI") + + async def get_json(self, session: aiohttp.ClientSession, url: str, params: Dict = None) -> Dict: + async with session.get(url, params=params) as response: + response.raise_for_status() + return await response.json() + + async def get_recent_pipelines( + self, + session: aiohttp.ClientSession, + org_slug: str = None, + page_token: str = None, + limit: int = None, + branch: str = None + ): + """ + Get recent pipelines for a project with pagination support + """ + params = { + "branch": branch, + "page-token": page_token + } + + # Remove None values + params = {k: v for k, v in params.items() if v is not None} + + url = f"{self.base_url}/project/{self.project_slug}/pipeline" + data = await self.get_json(session, url, params) + pipelines = data["items"] + + next_page_token = data.get("next_page_token") + + # If we have a limit, check if we need more pages + if limit and len(pipelines) >= limit: + return pipelines + + # If there are more pages and we haven't hit the limit, recursively get them + if next_page_token: + next_pipelines = await self.get_recent_pipelines( + session, + org_slug, + page_token=next_page_token, + limit=limit - len(pipelines) if limit else None, # Adjust limit for next page + branch=branch + ) + pipelines.extend(next_pipelines) + + return pipelines + + async def get_workflow_jobs(self, session: aiohttp.ClientSession, pipeline_id: str) -> List[Dict]: + self.logger.debug(f"Fetching workflows for pipeline {pipeline_id}") + url = f"{self.base_url}/pipeline/{pipeline_id}/workflow" + workflows_data = await self.get_json(session, url) + workflows = workflows_data["items"] + + # Fetch all jobs for all workflows in parallel + jobs_tasks = [] + for workflow in workflows: + url = f"{self.base_url}/workflow/{workflow['id']}/job" + jobs_tasks.append(self.get_json(session, url)) + + jobs_responses = await asyncio.gather(*jobs_tasks, return_exceptions=True) + + all_jobs = [] + for jobs_data in jobs_responses: + if isinstance(jobs_data, Exception): + continue + all_jobs.extend(jobs_data["items"]) + + return all_jobs + + async def get_artifacts(self, session: aiohttp.ClientSession, job_number: str) -> List[Dict]: + url = f"{self.base_url}/project/{self.project_slug}/{job_number}/artifacts" + data = await self.get_json(session, url) + return data["items"] + +class PackageSizeTracker: + def __init__(self, token: str, project_slug: str, debug: bool = False): + self.setup_logging(debug) + self.client = AsyncCircleCIClient(token, project_slug) + self.logger = logging.getLogger("PackageSizeTracker") + self.last_data_hash = None + self.debug = debug + + # Initialize pygame mixer + pygame.mixer.init() + + # Sound file paths - can use MP3 files with pygame + sounds_dir = Path(__file__).parent / "sounds" + self.sounds = { + 'lines_up': sounds_dir / "gta5_wasted.mp3", + 'lines_down': sounds_dir / "pokemon_evolve.mp3", + 'tokens_up': sounds_dir / "pokemon_evolve.mp3", + 'tokens_down': sounds_dir / "gta5_wasted.mp3", + 'size_up': sounds_dir / "gta5_wasted.mp3", + 'size_down': sounds_dir / "pokemon_evolve.mp3" + } + + def test_sound_effects(self): + """Test all sound effects with a small delay between each""" + self.logger.info("Testing sound effects...") + for sound_key in self.sounds: + self.logger.info(f"Playing {sound_key}") + self._play_sound(sound_key) + time.sleep(1) # Wait 1 second between sounds + + def setup_logging(self, debug: bool): + level = logging.DEBUG if debug else logging.INFO + logging.basicConfig( + level=level, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%H:%M:%S' + ) + + def extract_commit_info(self, pipeline: Dict) -> Optional[Dict]: + try: + # Extract from github_app first (preferred) + if 'trigger_parameters' in pipeline and 'github_app' in pipeline['trigger_parameters']: + github_app = pipeline['trigger_parameters']['github_app'] + return { + 'commit_hash': github_app.get('checkout_sha'), + 'web_url': f"{github_app.get('repo_url')}/commit/{github_app.get('checkout_sha')}", + 'branch': github_app.get('branch', 'unknown'), + 'author': { + 'name': github_app.get('commit_author_name'), + 'email': github_app.get('commit_author_email'), + 'username': github_app.get('user_username') + }, + 'message': github_app.get('commit_message') + } + + # Fallback to git parameters + if 'trigger_parameters' in pipeline and 'git' in pipeline['trigger_parameters']: + git = pipeline['trigger_parameters']['git'] + return { + 'commit_hash': git.get('checkout_sha'), + 'web_url': f"{git.get('repo_url')}/commit/{git.get('checkout_sha')}", + 'branch': git.get('branch', 'unknown'), + 'author': { + 'name': git.get('commit_author_name'), + 'email': git.get('commit_author_email'), + 'username': git.get('author_login') + }, + 'message': git.get('commit_message') + } + + self.logger.warning(f"Could not find commit info in pipeline {pipeline['id']}") + return None + + except Exception as e: + self.logger.error(f"Error extracting commit info: {str(e)}") + return None + + async def process_pipeline(self, session: aiohttp.ClientSession, pipeline: Dict) -> Optional[Dict]: + try: + commit_info = self.extract_commit_info(pipeline) + if not commit_info: + return None + + data_point = { + "commit_hash": commit_info['commit_hash'], + "commit_url": commit_info['web_url'], + "timestamp": pipeline.get("created_at", pipeline.get("updated_at")), + "pipeline_status": pipeline.get("state", "unknown"), + "branch": commit_info['branch'], + "author": commit_info['author'], + "commit_message": commit_info['message'] + } + + jobs = await self.client.get_workflow_jobs(session, pipeline["id"]) + + # Get package size data + size_job = next( + (j for j in jobs if j["name"] == "measure_pip_sizes" and j["status"] == "success"), + None + ) + + # Get line count data + linecount_job = next( + (j for j in jobs if j["name"] == "check_line_count" and j["status"] == "success"), + None + ) + + # Get benchmark data from runner job + benchmark_job = next( + (j for j in jobs if j["name"] == "runner" and j["status"] == "success"), + None + ) + + # Return None if no relevant jobs found + if not size_job and not linecount_job and not benchmark_job: + self.logger.debug(f"No relevant jobs found for pipeline {pipeline['id']}") + return None + + # Process benchmark data if available + if benchmark_job: + benchmark_artifacts = await self.client.get_artifacts(session, benchmark_job["job_number"]) + benchmark_report = next( + (a for a in benchmark_artifacts if a["path"].endswith("benchmark.json")), + None + ) + if benchmark_report: + benchmark_data = await self.client.get_json(session, benchmark_report["url"]) + data_point.update({ + "tokens_per_second": benchmark_data["tokens_per_second"], + "time_to_first_token": benchmark_data.get("time_to_first_token", 0) + }) + self.logger.info( + f"Processed benchmark data for pipeline {pipeline['id']}: " + f"commit {commit_info['commit_hash'][:7]}, " + f"tokens/s {benchmark_data['tokens_per_second']:.2f}" + ) + + # Process size data if available + if size_job: + size_artifacts = await self.client.get_artifacts(session, size_job["job_number"]) + size_report = next( + (a for a in size_artifacts if a["path"].endswith("pip-sizes.json")), + None + ) + if size_report: + size_data = await self.client.get_json(session, size_report["url"]) + data_point.update({ + "total_size_mb": size_data["total_size_mb"], + "packages": size_data["packages"] + }) + self.logger.info( + f"Processed size data for pipeline {pipeline['id']}: " + f"commit {commit_info['commit_hash'][:7]}, " + f"size {size_data['total_size_mb']:.2f}MB" + ) + + # Process linecount data if available + if linecount_job: + linecount_artifacts = await self.client.get_artifacts(session, linecount_job["job_number"]) + linecount_report = next( + (a for a in linecount_artifacts if a["path"].endswith("line-count-snapshot.json")), + None + ) + if linecount_report: + linecount_data = await self.client.get_json(session, linecount_report["url"]) + data_point.update({ + "total_lines": linecount_data["total_lines"], + "total_files": linecount_data["total_files"], + "files": linecount_data["files"] + }) + self.logger.info( + f"Processed line count data for pipeline {pipeline['id']}: " + f"commit {commit_info['commit_hash'][:7]}, " + f"lines {linecount_data['total_lines']:,}" + ) + + return data_point + + except Exception as e: + self.logger.error(f"Error processing pipeline {pipeline['id']}: {str(e)}") + return None + + async def process_pipeline_batch( + self, + session: aiohttp.ClientSession, + pipelines: List[Dict], + batch_size: int = 5 + ) -> List[Dict]: + """ + Process a batch of pipelines with rate limiting. + + Args: + session: aiohttp client session + pipelines: List of pipelines to process + batch_size: Number of pipelines to process in parallel + + Returns: + List of processed pipeline data points + """ + data_points = [] + + for i in range(0, len(pipelines), batch_size): + batch = pipelines[i:i + batch_size] + + # Process batch in parallel + tasks = [self.process_pipeline(session, pipeline) for pipeline in batch] + batch_results = await asyncio.gather(*tasks) + + # Filter out None results + batch_data = [r for r in batch_results if r is not None] + data_points.extend(batch_data) + + # Add delay between batches if there are more to process + if i + batch_size < len(pipelines): + await asyncio.sleep(1) # 1 second delay between batches + + return data_points + + async def collect_data(self) -> List[Dict]: + self.logger.info("Starting data collection...") + async with aiohttp.ClientSession(headers=self.client.headers) as session: + # Get pipelines from main branch + main_pipelines = await self.client.get_recent_pipelines( + session, + org_slug=self.client.project_slug, + limit=20, + branch="main" + ) + + # Add delay between branch requests + await asyncio.sleep(2) + + # Get pipelines from circleci branch + circleci_pipelines = await self.client.get_recent_pipelines( + session, + org_slug=self.client.project_slug, + limit=20, + branch="circleci" + ) + + # Combine pipelines and sort by created_at date + pipelines = main_pipelines + circleci_pipelines + pipelines.sort( + key=lambda x: datetime.fromisoformat( + x.get("created_at", x.get("updated_at")).replace('Z', '+00:00') + ), + reverse=True # Most recent first + ) + + self.logger.info(f"Found {len(pipelines)} recent pipelines") + + # Process pipelines in batches + data_points = await self.process_pipeline_batch(session, pipelines) + + # Sort by timestamp + data_points.sort( + key=lambda x: datetime.fromisoformat( + x.get("timestamp").replace('Z', '+00:00') + ), + reverse=True # Most recent first + ) + + return data_points + + def generate_report(self, data: List[Dict], output_dir: str = "reports") -> Optional[str]: + self.logger.info("Generating report...") + if not data: + self.logger.error("No data to generate report from!") + return None + + # Get latest pipeline status based on errors + latest_main_pipeline = next((d for d in data if d.get('branch') == 'main'), None) + latest_pipeline_status = 'success' if latest_main_pipeline and not latest_main_pipeline.get('errors') else 'failure' + + # Log the pipeline status + if latest_main_pipeline: + self.logger.info( + f"Latest main branch pipeline status: {latest_pipeline_status} " + f"(commit: {latest_main_pipeline['commit_hash'][:7]})" + ) + else: + self.logger.warning("No pipeline data found for main branch") + + # Convert output_dir to Path object + output_dir = Path(output_dir) + + # Create output directory if it doesn't exist + output_dir.mkdir(parents=True, exist_ok=True) + + # Create separate dataframes for each metric + df_size = pd.DataFrame([d for d in data if 'total_size_mb' in d]) + df_lines = pd.DataFrame([d for d in data if 'total_lines' in d]) + df_benchmark = pd.DataFrame([d for d in data if 'tokens_per_second' in d]) + + # Create a single figure with subplots + fig = make_subplots( + rows=3, cols=2, + subplot_titles=('', 'Package Size', '', 'Line Count', '', 'Tokens per Second'), + vertical_spacing=0.2, + column_widths=[0.2, 0.8], + specs=[[{"type": "indicator"}, {"type": "scatter"}], + [None, {"type": "scatter"}], + [None, {"type": "scatter"}]] + ) + + # Add package size trace if we have data + if not df_size.empty: + df_size['timestamp'] = pd.to_datetime(df_size['timestamp']) + df_size = df_size.sort_values('timestamp') + + fig.add_trace( + go.Scatter( + x=df_size['timestamp'], + y=df_size['total_size_mb'], + mode='lines+markers', + name='Package Size', + customdata=df_size[['commit_hash', 'commit_url']].values, + hovertemplate="
".join([ + "Size: %{y:.2f}MB", + "Date: %{x}", + "Commit: %{customdata[0]}", + "" + ]) + ), + row=1, col=2 + ) + fig.update_yaxes(title_text="Size (MB)", row=1, col=2) + + # Add line count trace if we have data + if not df_lines.empty: + df_lines['timestamp'] = pd.to_datetime(df_lines['timestamp']) + df_lines = df_lines.sort_values('timestamp') + + fig.add_trace( + go.Scatter( + x=df_lines['timestamp'], + y=df_lines['total_lines'], + mode='lines+markers', + name='Line Count', + customdata=df_lines[['commit_hash', 'commit_url']].values, + hovertemplate="
".join([ + "Lines: %{y:,.0f}", + "Date: %{x}", + "Commit: %{customdata[0]}", + "" + ]) + ), + row=2, col=2 + ) + fig.update_yaxes(title_text="Total Lines", row=2, col=2) + + # Add tokens per second trace if we have data + if not df_benchmark.empty: + df_benchmark['timestamp'] = pd.to_datetime(df_benchmark['timestamp']) + df_benchmark = df_benchmark.sort_values('timestamp') + + fig.add_trace( + go.Scatter( + x=df_benchmark['timestamp'], + y=df_benchmark['tokens_per_second'], + mode='lines+markers', + name='Tokens/Second', + customdata=df_benchmark[['commit_hash', 'commit_url']].values, + hovertemplate="
".join([ + "Tokens/s: %{y:.2f}", + "Date: %{x}", + "Commit: %{customdata[0]}", + "" + ]) + ), + row=3, col=2 + ) + fig.update_yaxes(title_text="Tokens per Second", row=3, col=2) + + # Update layout + fig.update_layout( + height=800, + showlegend=False, + title_text="Package Metrics Dashboard", + title_x=0.5, + plot_bgcolor='white', + paper_bgcolor='white', + font=dict(size=12), + hovermode='x unified' + ) + + # Update the dashboard HTML with date range picker + dashboard_html = f""" + + + Package Metrics Dashboard + + + + +

+ +
+ + + + + + +
+
+ +
+
+
Pipeline Status
+
+
+ {'✓ Pipeline Passing' if latest_pipeline_status == 'success' else '✗ Pipeline Failing'} +
+
+
+
+
Package Size
+
+
+
+
Line Count
+
+
+
+
+
+
Tokens per Second
+
+
+
+
+ + + + + + + + + """ + + # Write the dashboard + dashboard_path = output_dir / "dashboard.html" + with open(dashboard_path, "w") as f: + f.write(dashboard_html) + + # Generate summary with available metrics + latest_data = {} + + if not df_size.empty: + latest = df_size.iloc[-1] + previous = df_size.iloc[-2] if len(df_size) > 1 else latest + size_change = float(latest['total_size_mb'] - previous['total_size_mb']) + latest_data.update({ + 'timestamp': latest['timestamp'].isoformat(), + 'commit_hash': latest['commit_hash'], + 'commit_url': latest['commit_url'], + 'total_size_mb': float(latest['total_size_mb']), + 'size_change_mb': size_change, + 'packages': latest.get('packages', []) + }) + + if not df_lines.empty: + latest = df_lines.iloc[-1] + previous = df_lines.iloc[-2] if len(df_lines) > 1 else latest + linecount_change = int(latest['total_lines'] - previous['total_lines']) + if not latest_data: # Only add timestamp and commit info if not already added + latest_data.update({ + 'timestamp': latest['timestamp'].isoformat(), + 'commit_hash': latest['commit_hash'], + 'commit_url': latest['commit_url'], + }) + latest_data.update({ + 'total_lines': int(latest['total_lines']), + 'linecount_change': linecount_change + }) + + if not df_benchmark.empty: + latest = df_benchmark.iloc[-1] + previous = df_benchmark.iloc[-2] if len(df_benchmark) > 1 else latest + tokens_change = float(latest['tokens_per_second'] - previous['tokens_per_second']) + if not latest_data: # Only add timestamp and commit info if not already added + latest_data.update({ + 'timestamp': latest['timestamp'].isoformat(), + 'commit_hash': latest['commit_hash'], + 'commit_url': latest['commit_url'], + }) + latest_data.update({ + 'tokens_per_second': float(latest['tokens_per_second']), + 'tokens_change': tokens_change + }) + + if latest_data: + with open(output_dir / 'latest_data.json', 'w') as f: + json.dump(latest_data, f, indent=2) + + self._print_summary(latest_data) + self.logger.info(f"Report generated in {output_dir}") + return str(output_dir) + + return None + + def _print_summary(self, latest_data: Dict): + print("\n=== Package Size Summary ===") + print(f"Timestamp: {latest_data['timestamp']}") + print(f"Commit: {latest_data['commit_hash'][:7]}") + + if 'total_size_mb' in latest_data: + print(f"Total Size: {latest_data['total_size_mb']:.2f}MB") + change = latest_data['size_change_mb'] + change_symbol = "↓" if change <= 0 else "↑" + print(f"Change: {change_symbol} {abs(change):.2f}MB") + + if latest_data.get('packages'): + print("\nTop 5 Largest Packages:") + sorted_packages = sorted(latest_data['packages'], key=lambda x: x['size_mb'], reverse=True) + for pkg in sorted_packages[:5]: + print(f"- {pkg['name']}: {pkg['size_mb']:.2f}MB") + + if 'total_lines' in latest_data: + print("\nLine Count Stats:") + print(f"Total Lines: {latest_data['total_lines']:,}") + change = latest_data['linecount_change'] + change_symbol = "↓" if change <= 0 else "↑" + print(f"Change: {change_symbol} {abs(change):,}") + + if 'tokens_per_second' in latest_data: + print("\nBenchmark Stats:") + print(f"Tokens per Second: {latest_data['tokens_per_second']:.2f}") + if 'time_to_first_token' in latest_data: + print(f"Time to First Token: {latest_data['time_to_first_token']:.3f}s") + + print("\n") + + def _calculate_data_hash(self, data: List[Dict]) -> str: + """Calculate a hash of the data to detect changes""" + return hash(str(sorted([ + (d.get('commit_hash'), d.get('timestamp')) + for d in data + ]))) + + def _play_sound(self, sound_key: str): + """Play a specific notification sound using pygame""" + try: + sound_path = self.sounds.get(sound_key) + if sound_path and sound_path.exists(): + sound = pygame.mixer.Sound(str(sound_path)) + sound.play() + # Wait for the sound to finish playing + pygame.time.wait(int(sound.get_length() * 1000)) + else: + self.logger.warning(f"Sound file not found: {sound_key} at {sound_path}") + except Exception as e: + self.logger.error(f"Failed to play sound {sound_key}: {e}") + + def _check_metrics_changes(self, current_data: List[Dict], previous_data: List[Dict]): + # Sort data by timestamp in descending order (most recent first) + def sort_by_timestamp(data): + return sorted( + data, + key=lambda x: x.get('timestamp', ''), + reverse=True # Most recent first + ) + + current_data = sort_by_timestamp(current_data) + previous_data = sort_by_timestamp(previous_data) + + # Helper to find latest entry with a specific metric + def find_latest_with_metric(data: List[Dict], metric: str) -> Optional[Dict]: + return next((d for d in data if metric in d), None) + + # Check line count changes + current_lines = find_latest_with_metric(current_data, 'total_lines') + previous_lines = find_latest_with_metric(previous_data, 'total_lines') + + if current_lines and previous_lines: + diff = current_lines['total_lines'] - previous_lines['total_lines'] + self.logger.debug(f"Lines of code diff: {diff}") + if diff > 0: + self.logger.info(f"Lines of code increased by {diff:,}") + self._play_sound('lines_up') + elif diff < 0: + self.logger.info(f"Lines of code decreased by {abs(diff):,}") + self._play_sound('lines_down') + else: + self.logger.debug("No lines of code data found") + + # Check tokens per second changes + current_tokens = find_latest_with_metric(current_data, 'tokens_per_second') + previous_tokens = find_latest_with_metric(previous_data, 'tokens_per_second') + + if current_tokens and previous_tokens: + diff = current_tokens['tokens_per_second'] - previous_tokens['tokens_per_second'] + self.logger.debug(f"Tokens per second diff: {diff}") + if diff > 0: + self.logger.info(f"Tokens per second increased by {diff:.2f}") + self._play_sound('tokens_up') + elif diff < 0: + self.logger.info(f"Tokens per second decreased by {abs(diff):.2f}") + self._play_sound('tokens_down') + else: + self.logger.debug("No tokens per second data found") + + # Check package size changes + current_size = find_latest_with_metric(current_data, 'total_size_mb') + previous_size = find_latest_with_metric(previous_data, 'total_size_mb') + + if current_size and previous_size: + diff = current_size['total_size_mb'] - previous_size['total_size_mb'] + self.logger.debug(f"Package size diff: {diff:.2f}MB") + if diff > 0: + self.logger.info(f"Package size increased by {diff:.2f}MB") + self._play_sound('size_up') + elif diff < 0: + self.logger.info(f"Package size decreased by {abs(diff):.2f}MB") + self._play_sound('size_down') + else: + self.logger.debug("No package size data found") + + async def run_dashboard(self, update_interval: int = 10): + """Run the dashboard with periodic updates""" + try: + update_interval = float(update_interval) + self.logger.debug(f"Update interval type: {type(update_interval)}, value: {update_interval}") + except ValueError as e: + self.logger.error(f"Failed to convert update_interval to float: {update_interval}") + raise + + self.logger.info(f"Starting real-time dashboard with {update_interval}s updates") + previous_data = None + + while True: + try: + start_time = time.time() + + # Collect new data + current_data = await self.collect_data() + if not current_data: + self.logger.warning("No data collected") + await asyncio.sleep(update_interval) + continue + + # Generate report + report_path = self.generate_report(current_data) + if report_path: + self.logger.info( + f"Dashboard updated at {datetime.now().strftime('%H:%M:%S')}" + ) + + print("Curr:", len(current_data)) + print("Prev:", len(previous_data) if previous_data else "None") + if previous_data: + # Check for metric changes and play appropriate sounds + self.logger.debug(f"Checking metrics changes between {len(current_data)} current and {len(previous_data)} previous data points") + self._check_metrics_changes(current_data, previous_data) + + # Update previous data + previous_data = current_data.copy() # Make a copy to prevent reference issues + + # Calculate sleep time + elapsed = float(time.time() - start_time) + sleep_time = max(0.0, update_interval - elapsed) + await asyncio.sleep(sleep_time) + + except Exception as e: + self.logger.error(f"Error in dashboard update loop: {e}", exc_info=True) + if self.debug: + raise + await asyncio.sleep(update_interval) + +async def main(): + token = os.getenv("CIRCLECI_TOKEN") + project_slug = os.getenv("CIRCLECI_PROJECT_SLUG") + debug = os.getenv("DEBUG", "").lower() in ("true", "1", "yes") + + try: + # Get update interval from environment or use default + update_interval = float(os.getenv("UPDATE_INTERVAL", "10")) + print(f"Update interval type: {type(update_interval)}, value: {update_interval}") # Debug print + except ValueError as e: + print(f"Error converting UPDATE_INTERVAL to float: {os.getenv('UPDATE_INTERVAL')}") + update_interval = 10.0 + + if not token or not project_slug: + print("Error: Please set CIRCLECI_TOKEN and CIRCLECI_PROJECT_SLUG environment variables") + return + + tracker = PackageSizeTracker(token, project_slug, debug) + + try: + await tracker.run_dashboard(update_interval) + except KeyboardInterrupt: + print("\nDashboard stopped by user") + except Exception as e: + logging.error(f"Error: {str(e)}", exc_info=True) + if debug: + raise + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/extra/dashboard/requirements.txt b/extra/dashboard/requirements.txt new file mode 100644 index 000000000..7b978bc0e --- /dev/null +++ b/extra/dashboard/requirements.txt @@ -0,0 +1,5 @@ +plotly +pandas +requests +aiohttp +pygame \ No newline at end of file diff --git a/extra/dashboard/sounds/gta5_wasted.mp3 b/extra/dashboard/sounds/gta5_wasted.mp3 new file mode 100644 index 000000000..2723ff8a4 --- /dev/null +++ b/extra/dashboard/sounds/gta5_wasted.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb3fb66dd02827fbff86ef1ce3bc6438371c823aed7d4c3803ed522f008e4947 +size 206399 diff --git a/extra/dashboard/sounds/pokemon_evolve.mp3 b/extra/dashboard/sounds/pokemon_evolve.mp3 new file mode 100644 index 000000000..35b014323 --- /dev/null +++ b/extra/dashboard/sounds/pokemon_evolve.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d99cc9bdab4a4639d50f439b424547000e7c79f195b5b121734ad4ead435911c +size 633345 diff --git a/extra/line_counter.py b/extra/line_counter.py new file mode 100644 index 000000000..e5bf04289 --- /dev/null +++ b/extra/line_counter.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python3 +import os +import sys +import json +import token +import tokenize +from datetime import datetime, timezone + +TOKEN_WHITELIST = [token.OP, token.NAME, token.NUMBER, token.STRING] + +def is_docstring(t): + return t.type == token.STRING and t.string.startswith('"""') and t.line.strip().startswith('"""') + +def gen_stats(base_path="."): + table = [] + exo_path = os.path.join(base_path, "exo") + if not os.path.exists(exo_path): + print(f"Warning: {exo_path} directory not found") + return table + + for path, _, files in os.walk(exo_path): + for name in files: + if not name.endswith(".py"): + continue + + filepath = os.path.join(path, name) + relfilepath = os.path.relpath(filepath, base_path).replace('\\', '/') + + try: + with tokenize.open(filepath) as file_: + tokens = [t for t in tokenize.generate_tokens(file_.readline) + if t.type in TOKEN_WHITELIST and not is_docstring(t)] + token_count = len(tokens) + line_count = len(set([x for t in tokens + for x in range(t.start[0], t.end[0]+1)])) + if line_count > 0: + table.append([relfilepath, line_count, token_count/line_count]) + except Exception as e: + print(f"Error processing {filepath}: {e}") + continue + + return table + +def gen_diff(table_old, table_new): + table = [] + files_new = set([x[0] for x in table_new]) + files_old = set([x[0] for x in table_old]) + + added = files_new - files_old + deleted = files_old - files_new + unchanged = files_new & files_old + + for file in added: + file_stat = [stats for stats in table_new if file in stats][0] + table.append([file_stat[0], file_stat[1], file_stat[1], file_stat[2], file_stat[2]]) + + for file in deleted: + file_stat = [stats for stats in table_old if file in stats][0] + table.append([file_stat[0], 0, -file_stat[1], 0, -file_stat[2]]) + + for file in unchanged: + file_stat_old = [stats for stats in table_old if file in stats][0] + file_stat_new = [stats for stats in table_new if file in stats][0] + if file_stat_new[1] != file_stat_old[1] or file_stat_new[2] != file_stat_old[2]: + table.append([ + file_stat_new[0], + file_stat_new[1], + file_stat_new[1] - file_stat_old[1], + file_stat_new[2], + file_stat_new[2] - file_stat_old[2] + ]) + + return table + +def create_json_report(table, is_diff=False): + timestamp = datetime.now(timezone.utc).isoformat() + commit_sha = os.environ.get('CIRCLE_SHA1', 'unknown') + branch = os.environ.get('CIRCLE_BRANCH', 'unknown') + pr_number = os.environ.get('CIRCLE_PR_NUMBER', '') + + if is_diff: + files = [{ + 'name': row[0], + 'current_lines': row[1], + 'line_diff': row[2], + 'current_tokens_per_line': row[3], + 'tokens_per_line_diff': row[4] + } for row in table] + + report = { + 'type': 'diff', + 'timestamp': timestamp, + 'commit_sha': commit_sha, + 'branch': branch, + 'pr_number': pr_number, + 'files': files, + 'total_line_changes': sum(row[2] for row in table), + 'total_files_changed': len(files) + } + else: + files = [{ + 'name': row[0], + 'lines': row[1], + 'tokens_per_line': row[2] + } for row in table] + + report = { + 'type': 'snapshot', + 'timestamp': timestamp, + 'commit_sha': commit_sha, + 'branch': branch, + 'files': files, + 'total_lines': sum(row[1] for row in table), + 'total_files': len(files) + } + + return report + +def display_diff(diff): + return "+" + str(diff) if diff > 0 else str(diff) + +def format_table(rows, headers, floatfmt): + if not rows: + return "" + + # Add headers as first row + all_rows = [headers] + rows + + # Calculate column widths + col_widths = [] + for col in range(len(headers)): + col_width = max(len(str(row[col])) for row in all_rows) + col_widths.append(col_width) + + # Format rows + output = [] + for row_idx, row in enumerate(all_rows): + formatted_cols = [] + for col_idx, (value, width) in enumerate(zip(row, col_widths)): + if isinstance(value, float): + # Handle float formatting based on floatfmt + fmt = floatfmt[col_idx] + if fmt.startswith('+'): + value = f"{value:+.1f}" + else: + value = f"{value:.1f}" + elif isinstance(value, int) and col_idx > 0: # Skip filename column + # Handle integer formatting based on floatfmt + fmt = floatfmt[col_idx] + if fmt.startswith('+'): + value = f"{value:+d}" + else: + value = f"{value:d}" + formatted_cols.append(str(value).ljust(width)) + output.append(" ".join(formatted_cols)) + + # Add separator line after headers + if row_idx == 0: + separator = [] + for width in col_widths: + separator.append("-" * width) + output.append(" ".join(separator)) + + return "\n".join(output) + +if __name__ == "__main__": + if len(sys.argv) == 3: + # Comparing two directories + headers = ["File", "Lines", "Diff", "Tokens/Line", "Diff"] + table = gen_diff(gen_stats(sys.argv[1]), gen_stats(sys.argv[2])) + + if table: + # Print table output + print("### Code Changes in 'exo' Directory") + print("```") + print(format_table( + sorted(table, key=lambda x: abs(x[2]) if len(x) > 2 else 0, reverse=True), + headers, + (".1f", "d", "+d", ".1f", "+.1f") + )) + total_changes = sum(row[2] for row in table) + print(f"\nTotal line changes: {display_diff(total_changes)}") + print("```") + + # Generate JSON report + report = create_json_report(table, is_diff=True) + with open('line-count-diff.json', 'w') as f: + json.dump(report, f, indent=2) + else: + # Single directory analysis + headers = ["File", "Lines", "Tokens/Line"] + table = gen_stats(sys.argv[1] if len(sys.argv) > 1 else ".") + + if table: + # Print table output + print("### Code Statistics for 'exo' Directory") + print("```") + print(format_table( + sorted(table, key=lambda x: x[1], reverse=True), + headers, + (".1f", "d", ".1f") + )) + total_lines = sum(row[1] for row in table) + print(f"\nTotal lines: {total_lines}") + print("```") + + # Generate JSON report + report = create_json_report(table, is_diff=False) + with open('line-count-snapshot.json', 'w') as f: + json.dump(report, f, indent=2) diff --git a/extra/pipsize.py b/extra/pipsize.py new file mode 100644 index 000000000..406d177cc --- /dev/null +++ b/extra/pipsize.py @@ -0,0 +1,113 @@ +import os +import importlib.metadata +import importlib.util +import json +import sys + + +def calc_container(path): + """Calculate total size of a directory or file.""" + if os.path.isfile(path): + try: + return os.path.getsize(path) + except (OSError, FileNotFoundError): + return 0 + + total_size = 0 + for dirpath, dirnames, filenames in os.walk(path): + for f in filenames: + fp = os.path.join(dirpath, f) + try: + total_size += os.path.getsize(fp) + except (OSError, FileNotFoundError): + continue + return total_size + + +def get_package_location(package_name): + """Get the actual location of a package's files.""" + try: + spec = importlib.util.find_spec(package_name) + if spec is None: + return None + + if spec.submodule_search_locations: + # Return the first location for namespace packages + return spec.submodule_search_locations[0] + elif spec.origin: + # For single-file modules, return the file path itself + return spec.origin + except ImportError: + return None + + +def get_package_sizes(min_size_mb=0.1): + """Get sizes of installed packages above minimum size threshold.""" + package_sizes = [] + + # Get all installed distributions + for dist in importlib.metadata.distributions(): + try: + package_name = dist.metadata["Name"] + location = get_package_location(package_name.replace("-", "_")) + + if location and os.path.exists(location): + size = calc_container(location) + size_mb = size / (1024 * 1024) + + if size_mb > min_size_mb: + package_sizes.append((package_name, size)) + except Exception as e: + print( + f"Error processing {dist.metadata.get('Name', 'Unknown package')}: {e}" + ) + + return package_sizes + + +def main(): + # Get and sort package sizes + package_sizes = get_package_sizes() + package_sizes.sort(key=lambda x: x[1], reverse=True) + + # Convert sizes to MB and prepare data + table_data = [(name, size/(1024*1024)) for name, size in package_sizes] + total_size = sum(size for _, size in package_sizes)/(1024*1024) + + # Check if --json flag is present + if "--json" in sys.argv: + try: + output_file = sys.argv[sys.argv.index("--json") + 1] + json_data = { + "packages": [{ + "name": name, + "size_mb": round(size, 2) + } for name, size in table_data], + "total_size_mb": round(total_size, 2) + } + + with open(output_file, 'w') as f: + json.dump(json_data, f, indent=2) + print(f"JSON data written to {output_file}") + return + except IndexError: + print("Error: Please provide a filename after --json") + sys.exit(1) + except Exception as e: + print(f"Error writing JSON file: {e}") + sys.exit(1) + + # Original table output code + max_name_width = max(len(name) for name, _ in table_data) + max_name_width = max(max_name_width, len("Package")) + + print(f"\n{'Package':<{max_name_width}} | Size (MB)") + print("-" * max_name_width + "-+-" + "-" * 10) + + for name, size in table_data: + print(f"{name:<{max_name_width}} | {size:>8.2f}") + + print(f"\nTotal size: {total_size:.2f} MB\n") + +if __name__ == "__main__": + main() \ No newline at end of file From cb270ed0e6272b1630a97945c7d9c7aad774ff23 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Thu, 12 Dec 2024 11:52:27 +0800 Subject: [PATCH 15/26] filter: chat-api modelpool for Local model --- exo/api/chatgpt_api.py | 21 ++++++++++++------- exo/inference/mlx/sharded_inference_engine.py | 4 ++-- exo/main.py | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/exo/api/chatgpt_api.py b/exo/api/chatgpt_api.py index 8f07c594e..b05a78788 100644 --- a/exo/api/chatgpt_api.py +++ b/exo/api/chatgpt_api.py @@ -241,14 +241,19 @@ async def handle_model_support(self, request): if self.inference_engine_classname in model_info.get("repo", {}): shard = build_base_shard(model_name, self.inference_engine_classname) if shard: - downloader = HFShardDownloader(quick_check=True) - downloader.current_shard = shard - downloader.current_repo_id = get_repo(shard.model_id, self.inference_engine_classname) - status = await downloader.get_shard_download_status() - - download_percentage = status.get("overall") if status else None - total_size = status.get("total_size") if status else None - total_downloaded = status.get("total_downloaded") if status else False + if 'Local/' in model_name: + download_percentage = 100.0 + total_size = "Unknown" + total_downloaded = "Unknown" + else: + downloader = HFShardDownloader(quick_check=True) + downloader.current_shard = shard + downloader.current_repo_id = get_repo(shard.model_id, self.inference_engine_classname) + status = await downloader.get_shard_download_status() + + download_percentage = status.get("overall") if status else None + total_size = status.get("total_size") if status else None + total_downloaded = status.get("total_downloaded") if status else False model_data = { model_name: { diff --git a/exo/inference/mlx/sharded_inference_engine.py b/exo/inference/mlx/sharded_inference_engine.py index 8a4bb6328..e81023a8e 100644 --- a/exo/inference/mlx/sharded_inference_engine.py +++ b/exo/inference/mlx/sharded_inference_engine.py @@ -140,9 +140,9 @@ async def ensure_shard(self, shard: Shard): if self.shard == shard: return - if os.path.isdir(shard.model_id): # cli mode + if os.path.isdir(shard.model_id): # path mode model_path = Path(shard.model_id) - elif "Local" in shard.model_id: # api mode + elif "Local" in shard.model_id: # Local card mode model_path = Path(get_repo(shard.model_id, self.__class__.__name__)) else: model_path = await self.shard_downloader.ensure_shard(shard, self.__class__.__name__) diff --git a/exo/main.py b/exo/main.py index 3113b0ec2..30fb1d32f 100644 --- a/exo/main.py +++ b/exo/main.py @@ -100,7 +100,7 @@ config = json.load(file) config_n_layers = config['num_hidden_layers'] build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, int(config_n_layers)) -print(f"Init local model card complete") +print(f"Add Local Model Complete!!") if args.node_port is None: args.node_port = find_available_port(args.node_host) From 316e58b0b6d1f86f2052097bb6cdcca5a9888110 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Thu, 12 Dec 2024 16:14:20 +0800 Subject: [PATCH 16/26] add: Local Model Api --- exo/localmodel/http_helpers.py | 42 +++++++++ exo/localmodel/http_server.py | 166 +++++++++++++++++++++++++++++++++ exo/main.py | 29 +++++- exo/viz/topology_viz.py | 5 +- 4 files changed, 236 insertions(+), 6 deletions(-) create mode 100644 exo/localmodel/http_helpers.py create mode 100644 exo/localmodel/http_server.py diff --git a/exo/localmodel/http_helpers.py b/exo/localmodel/http_helpers.py new file mode 100644 index 000000000..19ed00a84 --- /dev/null +++ b/exo/localmodel/http_helpers.py @@ -0,0 +1,42 @@ +from aiohttp import web +import aiohttp_cors +import os +import json +from pathlib import Path +from datetime import datetime +from typing import Dict +from exo import DEBUG + +async def download_model(model_name, target_dir): + url = f"http://localhost:52525/models/{model_name}/download" + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + current_file = None + current_writer = None + + async for line in response.content: + try: + # Try parsing as metadata + metadata = json.loads(line) + if current_writer: + await current_writer.close() + + # Setup new file + filepath = os.path.join(target_dir, metadata['filename']) + os.makedirs(os.path.dirname(filepath), exist_ok=True) + current_file = open(filepath, 'wb') + current_writer = current_file + continue + except json.JSONDecodeError: + pass + + # Check for EOF marker + if line.strip() == b'EOF': + if current_writer: + await current_writer.close() + current_writer = None + continue + + # Write chunk to current file + if current_writer: + current_writer.write(line) \ No newline at end of file diff --git a/exo/localmodel/http_server.py b/exo/localmodel/http_server.py new file mode 100644 index 000000000..55bf434ab --- /dev/null +++ b/exo/localmodel/http_server.py @@ -0,0 +1,166 @@ +from aiohttp import web +import aiohttp_cors +import os +import json +from pathlib import Path +from datetime import datetime +from typing import Dict +from exo import DEBUG + +class LocalModelAPI: + def __init__(self): + self.app = web.Application() + self.cache_dir = os.path.expanduser('~/.cache/exo') + Path(self.cache_dir).mkdir(parents=True, exist_ok=True) + + # Setup CORS + cors = aiohttp_cors.setup(self.app) + cors_options = aiohttp_cors.ResourceOptions( + allow_credentials=True, + expose_headers="*", + allow_headers="*", + allow_methods="*" + ) + + # Add routes with CORS + routes = [ + ('GET', '/files/{filename}', self.handle_download_file), + ('GET', '/files', self.handle_list_files), + ('GET', '/models', self.handle_list_models), + ('GET', '/models/{foldername}/files', self.handle_list_model_files), + ('GET', '/models/{model_name}/download', self.handle_model_download) + ] + + for method, path, handler in routes: + cors.add(self.app.router.add_route(method, path, handler), {"*": cors_options}) + + # Add middleware + self.app.middlewares.append(self.log_request) + + async def log_request(self, app, handler): + async def middleware(request): + if DEBUG >= 2: + print(f"Received request: {request.method} {request.path}") + return await handler(request) + return middleware + + async def handle_download_file(self, request): + filename = request.match_info['filename'] + file_path = os.path.join(self.cache_dir, filename) + + if not os.path.exists(file_path): + return web.json_response({"error": "File not found"}, status=404) + + return web.FileResponse(file_path) + + async def handle_list_files(self, request): + files = [] + for entry in os.scandir(self.cache_dir): + if entry.is_file() and not entry.name.startswith('.'): + stat = entry.stat() + files.append({ + 'name': entry.name, + 'size': stat.st_size, + 'modified': datetime.fromtimestamp(stat.st_mtime).isoformat() + }) + return web.json_response({'files': files}) + + async def handle_model_download(self, request): + model_name = request.match_info['model_name'] + chunk_size = 32768 # 32KB chunks for better performance + model_path = os.path.join(self.cache_dir, model_name) + + if not os.path.exists(model_path): + return web.json_response({"error": "Model not found"}, status=404) + + if not os.path.isdir(model_path): + return web.json_response({"error": "Not a valid model directory"}, status=400) + + # Setup streaming response + response = web.StreamResponse( + status=200, + reason='OK', + headers={ + 'Content-Type': 'application/octet-stream' + } + ) + await response.prepare(request) + + # Walk through directory and stream files + for root, _, files in os.walk(model_path): + for filename in files: + if filename.startswith('.'): + continue + + file_path = os.path.join(root, filename) + rel_path = os.path.relpath(file_path, model_path) + + if DEBUG >= 2: + print(f"Streaming file: {rel_path}") + + # Send file metadata + metadata = { + 'filename': rel_path, + 'size': os.path.getsize(file_path) + } + await response.write(json.dumps(metadata).encode() + b'\n') + + # Stream file content in chunks + with open(file_path, 'rb') as f: + while True: + chunk = f.read(chunk_size) + if not chunk: + break + await response.write(chunk) + + # Send end of file marker + await response.write(b'EOF\n') + + await response.write_eof() + return response + + async def handle_list_models(self, request): + folders = [] + for entry in os.scandir(self.cache_dir): + if entry.is_dir() and not entry.name.startswith('.'): + folder_size = sum( + f.stat().st_size for f in Path(entry.path).rglob('*') if f.is_file() + ) + folders.append({ + 'name': entry.name, + 'size': folder_size, + 'modified': datetime.fromtimestamp(entry.stat().st_mtime).isoformat() + }) + return web.json_response({'models': folders}) + + async def handle_list_model_files(self, request): + foldername = request.match_info['foldername'] + folder_path = os.path.join(self.cache_dir, foldername) + + if not os.path.exists(folder_path): + return web.json_response({"error": "Folder not found"}, status=404) + + if not os.path.isdir(folder_path): + return web.json_response({"error": "Not a valid folder"}, status=400) + + files = [] + for root, dirs, filenames in os.walk(folder_path): + dirs[:] = [d for d in dirs if not d.startswith('.')] + for filename in filenames: + if filename.startswith('.'): + continue + file_path = os.path.join(root, filename) + rel_path = os.path.relpath(file_path, folder_path) + files.append({ + 'name': rel_path, + 'size': os.path.getsize(file_path), + 'modified': datetime.fromtimestamp(os.path.getmtime(file_path)).isoformat() + }) + + return web.json_response({'files': files}) + + async def run(self, host: str = "0.0.0.0", port: int = 52525): + runner = web.AppRunner(self.app) + await runner.setup() + site = web.TCPSite(runner, host, port) + await site.start() diff --git a/exo/main.py b/exo/main.py index 30fb1d32f..99a6fc07a 100644 --- a/exo/main.py +++ b/exo/main.py @@ -36,6 +36,8 @@ from exo.viz.topology_viz import TopologyViz from exo.download.hf.hf_helpers import has_hf_home_read_access, has_hf_home_write_access, get_hf_home, move_models_to_hf +from exo.localmodel.http_server import LocalModelAPI + # parse args parser = argparse.ArgumentParser(description="Initialize GRPC Discovery") parser.add_argument("command", nargs="?", choices=["run", "eval", "train"], help="Command to run") @@ -71,6 +73,7 @@ parser.add_argument("--tailscale-api-key", type=str, default=None, help="Tailscale API key") parser.add_argument("--tailnet-name", type=str, default=None, help="Tailnet name") parser.add_argument("--node-id-filter", type=str, default=None, help="Comma separated list of allowed node IDs (only for UDP and Tailscale discovery)") +parser.add_argument("--local-model-api-port", type=int, default=52525, help="Local Model API port") args = parser.parse_args() print(f"Selected inference engine: {args.inference_engine}") @@ -107,16 +110,30 @@ if DEBUG >= 1: print(f"Using available port: {args.node_port}") args.node_id = args.node_id or get_or_create_node_id() -chatgpt_api_endpoints = [f"http://{ip}:{args.chatgpt_api_port}/v1/chat/completions" for ip, _ in get_all_ip_addresses_and_interfaces()] -web_chat_urls = [f"http://{ip}:{args.chatgpt_api_port}" for ip, _ in get_all_ip_addresses_and_interfaces()] + + +if args.node_host == "0.0.0.0": + chatgpt_api_endpoints = [f"http://{ip}:{args.chatgpt_api_port}/v1/chat/completions" for ip, _ in get_all_ip_addresses_and_interfaces()] + local_model_api_endpoints = [f"http://{ip}:{args.local_model_api_port}" for ip, _ in get_all_ip_addresses_and_interfaces()] + web_chat_urls = [f"http://{ip}:{args.chatgpt_api_port}" for ip, _ in get_all_ip_addresses_and_interfaces()] +else: + chatgpt_api_endpoints = [f"http://{args.node_host}:{args.chatgpt_api_port}/v1/chat/completions"] + local_model_api_endpoints = [f"http://{args.node_host}:{args.local_model_api_port}"] + web_chat_urls = [f"http://{args.node_host}:{args.chatgpt_api_port}"] + if DEBUG >= 0: print("Chat interface started:") for web_chat_url in web_chat_urls: print(f" - {terminal_link(web_chat_url)}") + print("ChatGPT API endpoint served at:") for chatgpt_api_endpoint in chatgpt_api_endpoints: print(f" - {terminal_link(chatgpt_api_endpoint)}") + print("Local Model API endpoint served at:") + for local_model_api_endpoint in local_model_api_endpoints: + print(f" - {terminal_link(local_model_api_endpoint)}") + # Convert node-id-filter to list if provided allowed_node_ids = args.node_id_filter.split(',') if args.node_id_filter else None @@ -144,7 +161,7 @@ if not args.discovery_config_path: raise ValueError(f"--discovery-config-path is required when using manual discovery. Please provide a path to a config json file.") discovery = ManualDiscovery(args.discovery_config_path, args.node_id, create_peer_handle=lambda peer_id, address, description, device_capabilities: GRPCPeerHandle(peer_id, address, description, device_capabilities)) -topology_viz = TopologyViz(chatgpt_api_endpoints=chatgpt_api_endpoints, web_chat_urls=web_chat_urls) if not args.disable_tui else None +topology_viz = TopologyViz(chatgpt_api_endpoints=chatgpt_api_endpoints, web_chat_urls=web_chat_urls, local_model_api_endpoints=local_model_api_endpoints) if not args.disable_tui else None node = Node( args.node_id, None, @@ -158,13 +175,14 @@ ) server = GRPCServer(node, args.node_host, args.node_port) node.server = server -api = ChatGPTAPI( +chatgpt_api = ChatGPTAPI( node, inference_engine.__class__.__name__, response_timeout=args.chatgpt_api_response_timeout, on_chat_completion_request=lambda req_id, __, prompt: topology_viz.update_prompt(req_id, prompt) if topology_viz else None, default_model=args.default_model ) +local_model_api = LocalModelAPI() node.on_token.register("update_topology_viz").on_next( lambda req_id, tokens, __: topology_viz.update_prompt_output(req_id, inference_engine.tokenizer.decode(tokens)) if topology_viz and hasattr(inference_engine, "tokenizer") else None ) @@ -372,7 +390,8 @@ def handle_exit(): await train_model_cli(node, inference_engine, model_name, dataloader, args.batch_size, args.iters, save_interval=args.save_every, checkpoint_dir=args.save_checkpoint_dir) else: - asyncio.create_task(api.run(port=args.chatgpt_api_port)) # Start the API server as a non-blocking task + asyncio.create_task(chatgpt_api.run(host=args.node_host, port=args.chatgpt_api_port)) # Start the API server as a non-blocking task + asyncio.create_task(local_model_api.run(host=args.node_host, port=args.local_model_api_port)) # Start the local model server as a non-blocking task await asyncio.Event().wait() if args.wait_for_peers > 0: diff --git a/exo/viz/topology_viz.py b/exo/viz/topology_viz.py index 1519612fd..bd59a1cd9 100644 --- a/exo/viz/topology_viz.py +++ b/exo/viz/topology_viz.py @@ -18,8 +18,9 @@ class TopologyViz: - def __init__(self, chatgpt_api_endpoints: List[str] = [], web_chat_urls: List[str] = []): + def __init__(self, chatgpt_api_endpoints: List[str] = [], web_chat_urls: List[str] = [], local_model_api_endpoints: List[str] = []): self.chatgpt_api_endpoints = chatgpt_api_endpoints + self.local_model_api_endpoints = local_model_api_endpoints self.web_chat_urls = web_chat_urls self.topology = Topology() self.partitions: List[Partition] = [] @@ -149,6 +150,8 @@ def _generate_main_layout(self) -> str: info_lines = [] if len(self.web_chat_urls) > 0: info_lines.append(f"Web Chat URL (tinychat): {' '.join(self.web_chat_urls[:1])}") + if len(self.local_model_api_endpoints) > 0: + info_lines.append(f"Local Model API endpoint: {' '.join(self.local_model_api_endpoints[:1])}") if len(self.chatgpt_api_endpoints) > 0: info_lines.append(f"ChatGPT API endpoint: {' '.join(self.chatgpt_api_endpoints[:1])}") From 961c0dc5a5fe09ba81c9620bb59cb666205b4a37 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Thu, 12 Dec 2024 17:41:27 +0800 Subject: [PATCH 17/26] filter: file&code to other palce --- exo/download/hf/hf_shard_download.py | 8 +- exo/helpers.py | 7 - exo/localmodel/{ => http}/http_helpers.py | 0 exo/localmodel/{ => http}/http_server.py | 0 exo/localmodel/lh_helpers.py | 447 ++++++++++++++++++++++ exo/main.py | 25 +- 6 files changed, 473 insertions(+), 14 deletions(-) rename exo/localmodel/{ => http}/http_helpers.py (100%) rename exo/localmodel/{ => http}/http_server.py (100%) create mode 100644 exo/localmodel/lh_helpers.py diff --git a/exo/download/hf/hf_shard_download.py b/exo/download/hf/hf_shard_download.py index 7428909f5..438590f8f 100644 --- a/exo/download/hf/hf_shard_download.py +++ b/exo/download/hf/hf_shard_download.py @@ -16,6 +16,7 @@ import aiohttp from aiofiles import os as aios +from exo.localmodel.lh_helpers import get_exo_home class HFShardDownloader(ShardDownloader): def __init__(self, quick_check: bool = False, max_parallel_downloads: int = 4): @@ -36,7 +37,12 @@ async def ensure_shard(self, shard: Shard, inference_engine_name: str) -> Path: return self.completed_downloads[shard] if self.quick_check: repo_root = get_repo_root(repo_name) - snapshots_dir = repo_root/"snapshots" + if 'Local' in shard.model_id: + model_name = shard.model_id.split('/')[1] + snapshots_dir = Path(get_exo_home()/model_name) + else: + snapshots_dir = repo_root/"snapshots" + if snapshots_dir.exists(): visible_dirs = [d for d in snapshots_dir.iterdir() if not d.name.startswith('.')] if visible_dirs: diff --git a/exo/helpers.py b/exo/helpers.py index 24d4bf9af..5552524e8 100644 --- a/exo/helpers.py +++ b/exo/helpers.py @@ -93,16 +93,9 @@ def terminal_link(uri, label=None): return escape_mask.format(parameters, uri, label) -def init_exo_env(): - exo_path = Path(Path.home()/".cache"/"exo") - os.makedirs(exo_path, exist_ok=True) - if DEBUG >= 1: print(f"Init exo folder: {exo_path}") - return exo_path - T = TypeVar("T") K = TypeVar("K") - class AsyncCallback(Generic[T]): def __init__(self) -> None: self.condition: asyncio.Condition = asyncio.Condition() diff --git a/exo/localmodel/http_helpers.py b/exo/localmodel/http/http_helpers.py similarity index 100% rename from exo/localmodel/http_helpers.py rename to exo/localmodel/http/http_helpers.py diff --git a/exo/localmodel/http_server.py b/exo/localmodel/http/http_server.py similarity index 100% rename from exo/localmodel/http_server.py rename to exo/localmodel/http/http_server.py diff --git a/exo/localmodel/lh_helpers.py b/exo/localmodel/lh_helpers.py new file mode 100644 index 000000000..103efc210 --- /dev/null +++ b/exo/localmodel/lh_helpers.py @@ -0,0 +1,447 @@ +import aiofiles.os as aios +from typing import Union +import asyncio +import aiohttp +import json +import os +import sys +import shutil +from urllib.parse import urljoin +from typing import Callable, Optional, Coroutine, Any, Dict, List, Union, Literal +from datetime import datetime, timedelta +from fnmatch import fnmatch +from pathlib import Path +from typing import Generator, Iterable, TypeVar, TypedDict +from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type +from exo.helpers import DEBUG, is_frozen +from exo.download.download_progress import RepoProgressEvent, RepoFileProgressEvent, RepoProgressCallback, RepoFileProgressCallback +from exo.inference.shard import Shard +import aiofiles +from aiofiles import os as aios + +T = TypeVar("T") +# Ori: get_local_snapshot_dir +async def get_local_model_dir(repo_id: str, revision: str = "main") -> Optional[Path]: + refs_dir = get_repo_root(repo_id)/"refs" + refs_file = refs_dir/revision + if await aios.path.exists(refs_file): + async with aiofiles.open(refs_file, 'r') as f: + commit_hash = (await f.read()).strip() + snapshot_dir = get_repo_root(repo_id)/"snapshots"/commit_hash + return snapshot_dir + return None + + +def filter_repo_objects( + items: Iterable[T], + *, + allow_patterns: Optional[Union[List[str], str]] = None, + ignore_patterns: Optional[Union[List[str], str]] = None, + key: Optional[Callable[[T], str]] = None, +) -> Generator[T, None, None]: + if isinstance(allow_patterns, str): + allow_patterns = [allow_patterns] + if isinstance(ignore_patterns, str): + ignore_patterns = [ignore_patterns] + if allow_patterns is not None: + allow_patterns = [_add_wildcard_to_directories(p) for p in allow_patterns] + if ignore_patterns is not None: + ignore_patterns = [_add_wildcard_to_directories(p) for p in ignore_patterns] + + if key is None: + + def _identity(item: T) -> str: + if isinstance(item, str): + return item + if isinstance(item, Path): + return str(item) + raise ValueError(f"Please provide `key` argument in `filter_repo_objects`: `{item}` is not a string.") + + key = _identity + + for item in items: + path = key(item) + if allow_patterns is not None and not any(fnmatch(path, r) for r in allow_patterns): + continue + if ignore_patterns is not None and any(fnmatch(path, r) for r in ignore_patterns): + continue + yield item + + +def _add_wildcard_to_directories(pattern: str) -> str: + if pattern[-1] == "/": + return pattern + "*" + return pattern + + +def get_hf_endpoint() -> str: + #need http ip address + return os.environ.get('HF_ENDPOINT', "http://huggingface.co") + + +def get_exo_home() -> Path: # Ori: get_hf_home + """Get the exo home directory.""" + exo_path = Path(Path.home()/".cache"/"exo") + os.makedirs(exo_path, exist_ok=True) + if DEBUG >= 1: print(f"Init exo folder: {exo_path}") + return exo_path + + +async def get_lh_token(): # Ori: get_hf_token + """get Localhost user's token. + + if await aios.path.exists(token_path): + async with aiofiles.open(token_path, 'r') as f: + return (await f.read()).strip() + """ + return None + +async def get_auth_headers(): + """Get/Custom authentication headers if a token is available.""" + token = await get_hf_token() + if token: + # custom auth header + return {"Authorization": f"Bearer {token}"} + return {} + + +def get_repo_root(model_id: str) -> Path: + """Get the model directory for a given model ID.""" + sanitized_model_id = str(model_id).split("/")[-1] + return get_exo_home()/f"{sanitized_repo_id}" + +async def move_models_to_exo(seed_dir: Union[str, Path]): # Ori: move_models_to_hf + """Move model in resources folder of app to .cache/exo/""" + source_dir = Path(seed_dir) + dest_dir = get_exo_home() + async for path in source_dir.iterdir(): + print("Start Move") + if path.is_dir(): + dest_path = dest_dir / path.name + if dest_path.exists(): + if DEBUG>=1: print(f"skipping moving {dest_path}. File already exists") + else: + await aios.rename(str(path), str(dest_path)) + + print("Done Move") + +async def fetch_file_list(session, repo_id, revision, path=""): + api_url = f"{get_hf_endpoint()}/api/models/{repo_id}/tree/{revision}" + url = f"{api_url}/{path}" if path else api_url + + headers = await get_auth_headers() + async with session.get(url, headers=headers) as response: + if response.status == 200: + data = await response.json() + files = [] + for item in data: + if item["type"] == "file": + files.append({"path": item["path"], "size": item["size"]}) + elif item["type"] == "directory": + subfiles = await fetch_file_list(session, repo_id, revision, item["path"]) + files.extend(subfiles) + return files + else: + raise Exception(f"Failed to fetch file list: {response.status}") + + +@retry( + stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=4, max=60), retry=retry_if_exception_type((aiohttp.ClientError, asyncio.TimeoutError, aiohttp.ClientResponseError)), reraise=True +) +async def download_file( + session: aiohttp.ClientSession, repo_id: str, revision: str, file_path: str, save_directory: str, progress_callback: Optional[RepoFileProgressCallback] = None, use_range_request: bool = True +): + base_url = f"{get_hf_endpoint()}/{repo_id}/resolve/{revision}/" + url = urljoin(base_url, file_path) + local_path = os.path.join(save_directory, file_path) + + await aios.makedirs(os.path.dirname(local_path), exist_ok=True) + + # Check if file already exists and get its size + local_file_size = await aios.path.getsize(local_path) if await aios.path.exists(local_path) else 0 + + headers = await get_auth_headers() + if use_range_request: + headers["Range"] = f"bytes={local_file_size}-" + + async with session.get(url, headers=headers) as response: + total_size = int(response.headers.get('Content-Length', 0)) + downloaded_size = local_file_size + downloaded_this_session = 0 + mode = 'ab' if use_range_request else 'wb' + if downloaded_size == total_size: + if DEBUG >= 2: print(f"File already downloaded: {file_path}") + if progress_callback: + await progress_callback(RepoFileProgressEvent(repo_id, revision, file_path, downloaded_size, downloaded_this_session, total_size, 0, timedelta(0), "complete")) + return + + if response.status == 200: + # File doesn't support range requests or we're not using them, start from beginning + mode = 'wb' + downloaded_size = 0 + elif response.status == 206: + # Partial content, resume download + content_range = response.headers.get('Content-Range', '') + try: + total_size = int(content_range.split('/')[-1]) + except ValueError: + if DEBUG >= 1: print(f"Failed to parse Content-Range header: {content_range}. Starting download from scratch...") + return await download_file(session, repo_id, revision, file_path, save_directory, progress_callback, use_range_request=False) + elif response.status == 416: + # Range not satisfiable, get the actual file size + content_range = response.headers.get('Content-Range', '') + try: + total_size = int(content_range.split('/')[-1]) + if downloaded_size == total_size: + if DEBUG >= 2: print(f"File fully downloaded on first pass: {file_path}") + if progress_callback: + await progress_callback(RepoFileProgressEvent(repo_id, revision, file_path, downloaded_size, downloaded_this_session, total_size, 0, timedelta(0), "complete")) + return + except ValueError: + if DEBUG >= 1: print(f"Failed to parse Content-Range header: {content_range}. Starting download from scratch...") + return await download_file(session, repo_id, revision, file_path, save_directory, progress_callback, use_range_request=False) + else: + raise aiohttp.ClientResponseError(response.request_info, response.history, status=response.status, message=f"Failed to download {file_path}: {response.status}") + + if downloaded_size == total_size: + print(f"File already downloaded: {file_path}") + if progress_callback: + await progress_callback(RepoFileProgressEvent(repo_id, revision, file_path, downloaded_size, downloaded_this_session, total_size, 0, timedelta(0), "complete")) + return + + DOWNLOAD_CHUNK_SIZE = 32768 + start_time = datetime.now() + async with aiofiles.open(local_path, mode) as f: + async for chunk in response.content.iter_chunked(DOWNLOAD_CHUNK_SIZE): + await f.write(chunk) + downloaded_size += len(chunk) + downloaded_this_session += len(chunk) + if progress_callback and total_size: + elapsed_time = (datetime.now() - start_time).total_seconds() + speed = int(downloaded_this_session/elapsed_time) if elapsed_time > 0 else 0 + remaining_size = total_size - downloaded_size + eta = timedelta(seconds=remaining_size/speed) if speed > 0 else timedelta(0) + status = "in_progress" if downloaded_size < total_size else "complete" + if DEBUG >= 8: print(f"HF repo file download progress: {file_path=} {elapsed_time=} {speed=} Downloaded={downloaded_size}/{total_size} {remaining_size=} {eta=} {status=}") + await progress_callback(RepoFileProgressEvent(repo_id, revision, file_path, downloaded_size, downloaded_this_session, total_size, speed, eta, status)) + if DEBUG >= 2: print(f"Downloaded: {file_path}") + + +async def resolve_revision_to_commit_hash(repo_id: str, revision: str) -> str: + repo_root = get_repo_root(repo_id) + refs_dir = repo_root/"refs" + refs_file = refs_dir/revision + + # Check if we have a cached commit hash + if await aios.path.exists(refs_file): + async with aiofiles.open(refs_file, 'r') as f: + commit_hash = (await f.read()).strip() + if DEBUG >= 2: print(f"Commit hash is already cached at {refs_file}: {commit_hash}") + return commit_hash + + # Fetch the commit hash for the given revision + async with aiohttp.ClientSession() as session: + api_url = f"{get_hf_endpoint()}/api/models/{repo_id}/revision/{revision}" + headers = await get_auth_headers() + async with session.get(api_url, headers=headers) as response: + if response.status != 200: + raise Exception(f"Failed to fetch revision info from {api_url}: {response.status}") + revision_info = await response.json() + commit_hash = revision_info['sha'] + + # Cache the commit hash + await aios.makedirs(refs_dir, exist_ok=True) + async with aiofiles.open(refs_file, 'w') as f: + await f.write(commit_hash) + + return commit_hash + + +async def download_repo_files( + repo_id: str, + revision: str = "main", + progress_callback: Optional[RepoProgressCallback] = None, + allow_patterns: Optional[Union[List[str], str]] = None, + ignore_patterns: Optional[Union[List[str], str]] = None, + max_parallel_downloads: int = 4 +) -> Path: + repo_root = get_repo_root(repo_id) + snapshots_dir = repo_root/"snapshots" + cachedreqs_dir = repo_root/"cachedreqs" + + # Ensure directories exist + await aios.makedirs(snapshots_dir, exist_ok=True) + await aios.makedirs(cachedreqs_dir, exist_ok=True) + + # Resolve revision to commit hash + commit_hash = await resolve_revision_to_commit_hash(repo_id, revision) + + # Set up the snapshot directory + snapshot_dir = snapshots_dir/commit_hash + await aios.makedirs(snapshot_dir, exist_ok=True) + + # Set up the cached file list directory + cached_file_list_dir = cachedreqs_dir/commit_hash + await aios.makedirs(cached_file_list_dir, exist_ok=True) + cached_file_list_path = cached_file_list_dir/"fetch_file_list.json" + + async with aiohttp.ClientSession() as session: + # Check if we have a cached file list + if await aios.path.exists(cached_file_list_path): + async with aiofiles.open(cached_file_list_path, 'r') as f: + file_list = json.loads(await f.read()) + if DEBUG >= 2: print(f"Using cached file list from {cached_file_list_path}") + else: + file_list = await fetch_file_list(session, repo_id, revision) + # Cache the file list + async with aiofiles.open(cached_file_list_path, 'w') as f: + await f.write(json.dumps(file_list)) + if DEBUG >= 2: print(f"Cached file list at {cached_file_list_path}") + + filtered_file_list = list(filter_repo_objects(file_list, allow_patterns=allow_patterns, ignore_patterns=ignore_patterns, key=lambda x: x["path"])) + total_files = len(filtered_file_list) + total_bytes = sum(file["size"] for file in filtered_file_list) + file_progress: Dict[str, RepoFileProgressEvent] = { + file["path"]: RepoFileProgressEvent(repo_id, revision, file["path"], 0, 0, file["size"], 0, timedelta(0), "not_started") + for file in filtered_file_list + } + start_time = datetime.now() + + async def download_with_progress(file_info, progress_state): + local_path = snapshot_dir/file_info["path"] + if await aios.path.exists(local_path) and (await aios.stat(local_path)).st_size == file_info["size"]: + if DEBUG >= 2: print(f"File already fully downloaded: {file_info['path']}") + progress_state['completed_files'] += 1 + progress_state['downloaded_bytes'] += file_info["size"] + file_progress[file_info["path"]] = RepoFileProgressEvent(repo_id, revision, file_info["path"], file_info["size"], 0, file_info["size"], 0, timedelta(0), "complete") + if progress_callback: + elapsed_time = (datetime.now() - start_time).total_seconds() + overall_speed = int(progress_state['downloaded_bytes_this_session']/elapsed_time) if elapsed_time > 0 else 0 + remaining_bytes = total_bytes - progress_state['downloaded_bytes'] + overall_eta = timedelta(seconds=remaining_bytes/overall_speed) if overall_speed > 0 else timedelta(seconds=0) + status = "in_progress" if progress_state['completed_files'] < total_files else "complete" + await progress_callback( + RepoProgressEvent( + repo_id, revision, progress_state['completed_files'], total_files, progress_state['downloaded_bytes'], progress_state['downloaded_bytes_this_session'], total_bytes, overall_speed, + overall_eta, file_progress, status + ) + ) + return + + async def file_progress_callback(event: RepoFileProgressEvent): + progress_state['downloaded_bytes'] += event.downloaded - file_progress[event.file_path].downloaded + progress_state['downloaded_bytes_this_session'] += event.downloaded_this_session - file_progress[event.file_path].downloaded_this_session + file_progress[event.file_path] = event + if progress_callback: + elapsed_time = (datetime.now() - start_time).total_seconds() + overall_speed = int(progress_state['downloaded_bytes_this_session']/elapsed_time) if elapsed_time > 0 else 0 + remaining_bytes = total_bytes - progress_state['downloaded_bytes'] + overall_eta = timedelta(seconds=remaining_bytes/overall_speed) if overall_speed > 0 else timedelta(seconds=0) + status = "in_progress" if progress_state['downloaded_bytes'] < total_bytes else "complete" + await progress_callback( + RepoProgressEvent( + repo_id, revision, progress_state['completed_files'], total_files, progress_state['downloaded_bytes'], progress_state['downloaded_bytes_this_session'], total_bytes, overall_speed, + overall_eta, file_progress, status + ) + ) + + await download_file(session, repo_id, revision, file_info["path"], snapshot_dir, file_progress_callback) + progress_state['completed_files'] += 1 + file_progress[ + file_info["path"] + ] = RepoFileProgressEvent(repo_id, revision, file_info["path"], file_info["size"], file_progress[file_info["path"]].downloaded_this_session, file_info["size"], 0, timedelta(0), "complete") + if progress_callback: + elapsed_time = (datetime.now() - start_time).total_seconds() + overall_speed = int(progress_state['downloaded_bytes_this_session']/elapsed_time) if elapsed_time > 0 else 0 + remaining_bytes = total_bytes - progress_state['downloaded_bytes'] + overall_eta = timedelta(seconds=remaining_bytes/overall_speed) if overall_speed > 0 else timedelta(seconds=0) + status = "in_progress" if progress_state['completed_files'] < total_files else "complete" + await progress_callback( + RepoProgressEvent( + repo_id, revision, progress_state['completed_files'], total_files, progress_state['downloaded_bytes'], progress_state['downloaded_bytes_this_session'], total_bytes, overall_speed, + overall_eta, file_progress, status + ) + ) + + progress_state = {'completed_files': 0, 'downloaded_bytes': 0, 'downloaded_bytes_this_session': 0} + + semaphore = asyncio.Semaphore(max_parallel_downloads) + + async def download_with_semaphore(file_info): + async with semaphore: + await download_with_progress(file_info, progress_state) + + tasks = [asyncio.create_task(download_with_semaphore(file_info)) for file_info in filtered_file_list] + await asyncio.gather(*tasks) + + return snapshot_dir + + +async def get_weight_map(repo_id: str, revision: str = "main") -> Optional[Dict[str, str]]: + """ + Retrieve the weight map from the model.safetensors.index.json file. + + Args: + repo_id (str): The Hugging Face repository ID. + revision (str): The revision of the repository to use. + + Returns: + Optional[Dict[str, str]]: The weight map if it exists, otherwise None. + """ + + # Download the index file + await download_repo_files(repo_id=repo_id, revision=revision, allow_patterns="model.safetensors.index.json") + + # Check if the file exists + repo_root = get_repo_root(repo_id) + commit_hash = await resolve_revision_to_commit_hash(repo_id, revision) + snapshot_dir = repo_root/"snapshots"/commit_hash + index_file = next((f for f in await aios.listdir(snapshot_dir) if f.endswith("model.safetensors.index.json")), None) + + if index_file: + index_file_path = snapshot_dir/index_file + if await aios.path.exists(index_file_path): + async with aiofiles.open(index_file_path, 'r') as f: + index_data = json.loads(await f.read()) + return index_data.get("weight_map") + + return None + + +def extract_layer_num(tensor_name: str) -> Optional[int]: + # This is a simple example and might need to be adjusted based on the actual naming convention + parts = tensor_name.split('.') + for part in parts: + if part.isdigit(): + return int(part) + return None + + +def get_allow_patterns(weight_map: Dict[str, str], shard: Shard) -> List[str]: + default_patterns = set(["*.json", "*.py", "tokenizer.model", "*.tiktoken", "*.txt"]) + shard_specific_patterns = set() + if weight_map: + for tensor_name, filename in weight_map.items(): + layer_num = extract_layer_num(tensor_name) + if layer_num is not None and shard.start_layer <= layer_num <= shard.end_layer: + shard_specific_patterns.add(filename) + sorted_file_names = sorted(weight_map.values()) + if shard.is_first_layer(): + shard_specific_patterns.add(sorted_file_names[0]) + elif shard.is_last_layer(): + shard_specific_patterns.add(sorted_file_names[-1]) + else: + shard_specific_patterns = set(["*.safetensors"]) + if DEBUG >= 2: print(f"get_allow_patterns {weight_map=} {shard=} {shard_specific_patterns=}") + return list(default_patterns | shard_specific_patterns) + +async def has_exo_home_read_access() -> bool: # Ori: has_hf_home_read_access + lh_home = get_exo_home() + try: return await aios.access(lh_home, os.R_OK) + except OSError: return False + +async def has_exo_home_write_access() -> bool: # Ori: has_hf_home_write_access + lh_home = get_exo_home() + try: return await aios.access(lh_home, os.W_OK) + except OSError: return False + diff --git a/exo/main.py b/exo/main.py index 99a6fc07a..fc0ac3d0c 100644 --- a/exo/main.py +++ b/exo/main.py @@ -28,7 +28,7 @@ from exo.api import ChatGPTAPI from exo.download.shard_download import ShardDownloader, RepoProgressEvent, NoopShardDownloader from exo.download.hf.hf_shard_download import HFShardDownloader -from exo.helpers import print_yellow_exo, init_exo_env, find_available_port, DEBUG, get_system_info, get_or_create_node_id, get_all_ip_addresses_and_interfaces, terminal_link, shutdown +from exo.helpers import print_yellow_exo, find_available_port, DEBUG, get_system_info, get_or_create_node_id, get_all_ip_addresses_and_interfaces, terminal_link, shutdown from exo.inference.shard import Shard from exo.inference.inference_engine import get_inference_engine, InferenceEngine from exo.inference.tokenizers import resolve_tokenizer @@ -36,7 +36,8 @@ from exo.viz.topology_viz import TopologyViz from exo.download.hf.hf_helpers import has_hf_home_read_access, has_hf_home_write_access, get_hf_home, move_models_to_hf -from exo.localmodel.http_server import LocalModelAPI +from exo.localmodel.http.http_server import LocalModelAPI +from exo.localmodel.lh_helpers import has_exo_home_read_access, has_exo_home_write_access, get_exo_home # parse args parser = argparse.ArgumentParser(description="Initialize GRPC Discovery") @@ -79,8 +80,6 @@ print_yellow_exo() -exo_path = init_exo_env() - system_info = get_system_info() print(f"Detected system: {system_info}") @@ -93,9 +92,10 @@ inference_engine = get_inference_engine(inference_engine_name, shard_downloader) print(f"Using inference engine: {inference_engine.__class__.__name__} with shard downloader: {shard_downloader.__class__.__name__}") -for folder_path in Path(exo_path).iterdir(): +exo_home = get_exo_home() +for folder_path in Path(exo_home).iterdir(): if folder_path.is_dir(): - model_path = folder_path + model_path = f"http://{args.node_host}:{args.local_model_api_port}/models/{folder_path.name}" model_name = folder_path.name config_file_path = Path(folder_path/'config.json') if config_file_path.is_file(): @@ -195,6 +195,8 @@ def preemptively_start_download(request_id: str, opaque_status: str): if "Local" in current_shard.model_id or os.path.isdir(current_shard.model_id): print("Local model detected, skip download") + # borcast download model + #asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) pass else: if DEBUG >= 2: print(f"Preemptively starting download for {current_shard}") @@ -343,6 +345,17 @@ async def main(): {"❌ No read access" if not has_read else ""} {"❌ No write access" if not has_write else ""} """) + # Check exo directory permissions + exo_home, has_read, has_write = get_exo_home(), await has_exo_home_read_access(), await has_exo_home_write_access() + if DEBUG >= 1: print(f"Model storage directory: {exo_home}") + print(f"{has_read=}, {has_write=}") + if not has_read or not has_write: + print(f""" + WARNING: Limited permissions for model storage directory: {exo_home}. + This may prevent model downloads from working correctly. + {"❌ No read access" if not has_read else ""} + {"❌ No write access" if not has_write else ""} + """) if not args.models_seed_dir is None: try: From 85d41f0b564b62c940fa09d18aca3eedb119b265 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Mon, 16 Dec 2024 10:53:46 +0800 Subject: [PATCH 18/26] future: enhance lh_helpers but download_file function not complete --- exo/download/hf/hf_shard_download.py | 30 ++-- exo/inference/mlx/sharded_inference_engine.py | 4 +- exo/inference/tokenizers.py | 5 + exo/localmodel/http/http_server.py | 49 ++++--- exo/localmodel/lh_helpers.py | 137 +++++++----------- exo/main.py | 12 +- exo/models.py | 9 +- 7 files changed, 127 insertions(+), 119 deletions(-) diff --git a/exo/download/hf/hf_shard_download.py b/exo/download/hf/hf_shard_download.py index 438590f8f..4553fa200 100644 --- a/exo/download/hf/hf_shard_download.py +++ b/exo/download/hf/hf_shard_download.py @@ -16,7 +16,9 @@ import aiohttp from aiofiles import os as aios -from exo.localmodel.lh_helpers import get_exo_home +from exo.localmodel.lh_helpers import ( + get_exo_home, get_lh_weight_map, fetch_lh_file_list, download_model_dir +) class HFShardDownloader(ShardDownloader): def __init__(self, quick_check: bool = False, max_parallel_downloads: int = 4): @@ -40,7 +42,7 @@ async def ensure_shard(self, shard: Shard, inference_engine_name: str) -> Path: if 'Local' in shard.model_id: model_name = shard.model_id.split('/')[1] snapshots_dir = Path(get_exo_home()/model_name) - else: + else: # HF model snapshots_dir = repo_root/"snapshots" if snapshots_dir.exists(): @@ -86,11 +88,16 @@ async def ensure_shard(self, shard: Shard, inference_engine_name: str) -> Path: async def _download_shard(self, shard: Shard, repo_name: str) -> Path: async def wrapped_progress_callback(event: RepoProgressEvent): self._on_progress.trigger_all(shard, event) - - weight_map = await get_weight_map(repo_name) - allow_patterns = get_allow_patterns(weight_map, shard) - - return await download_repo_files(repo_name, progress_callback=wrapped_progress_callback, allow_patterns=allow_patterns, max_parallel_downloads=self.max_parallel_downloads) + + if 'Local' in repo_name: + weight_map = await get_lh_weight_map(repo_name) + allow_patterns = get_allow_patterns(weight_map, shard) + return await download_model_dir(repo_name, progress_callback=wrapped_progress_callback, allow_patterns=allow_patterns, max_parallel_downloads=self.max_parallel_downloads) + else: # HF + weight_map = await get_weight_map(repo_name) + allow_patterns = get_allow_patterns(weight_map, shard) + return await download_repo_files(repo_name, progress_callback=wrapped_progress_callback, allow_patterns=allow_patterns, max_parallel_downloads=self.max_parallel_downloads) + @property def on_progress(self) -> AsyncCallbackSystem[str, Tuple[Shard, RepoProgressEvent]]: @@ -125,8 +132,13 @@ async def get_shard_download_status(self) -> Optional[Dict[str, Union[float, int total_bytes = 0 downloaded_bytes = 0 - async with aiohttp.ClientSession() as session: - file_list = await fetch_file_list(session, self.current_repo_id, self.revision) + conn = aiohttp.TCPConnector(limit=100) + async with aiohttp.ClientSession(connector=conn) as session: + if self.current_repo_id.startswith("Local"): + file_list = await fetch_lh_file_list(session, self.current_repo_id) + else: + file_list = await fetch_file_list(session, self.current_repo_id, self.revision) + relevant_files = list( filter_repo_objects( file_list, allow_patterns=patterns, key=lambda x: x["path"])) diff --git a/exo/inference/mlx/sharded_inference_engine.py b/exo/inference/mlx/sharded_inference_engine.py index e81023a8e..1637d64f6 100644 --- a/exo/inference/mlx/sharded_inference_engine.py +++ b/exo/inference/mlx/sharded_inference_engine.py @@ -143,10 +143,10 @@ async def ensure_shard(self, shard: Shard): if os.path.isdir(shard.model_id): # path mode model_path = Path(shard.model_id) elif "Local" in shard.model_id: # Local card mode - model_path = Path(get_repo(shard.model_id, self.__class__.__name__)) + model_path = await self.shard_downloader.ensure_shard(shard, self.__class__.__name__) else: model_path = await self.shard_downloader.ensure_shard(shard, self.__class__.__name__) - + if self.shard != shard: def load_shard_wrapper(): diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index 7b3a94bf4..a8cd6212f 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -9,6 +9,8 @@ from exo.download.hf.hf_helpers import get_local_snapshot_dir from exo.helpers import DEBUG +from exo.localmodel.lh_helpers import get_local_model_dir + class DummyTokenizer: def __init__(self): @@ -30,8 +32,11 @@ async def resolve_tokenizer(model_id: str): return DummyTokenizer() if os.path.isdir(model_id): # local model + # model_path = model_id ex: ~/.cach/exo/llama-3.3-70b local_path = str(model_id).rstrip('/') model_id = 'Local/'+str(local_path.split('/')[-1]) + elif "Local" in model_id: + local_path = await get_local_model_dir(model_id) else: local_path = await get_local_snapshot_dir(model_id) diff --git a/exo/localmodel/http/http_server.py b/exo/localmodel/http/http_server.py index 55bf434ab..eeb58f894 100644 --- a/exo/localmodel/http/http_server.py +++ b/exo/localmodel/http/http_server.py @@ -12,7 +12,7 @@ def __init__(self): self.app = web.Application() self.cache_dir = os.path.expanduser('~/.cache/exo') Path(self.cache_dir).mkdir(parents=True, exist_ok=True) - + # Setup CORS cors = aiohttp_cors.setup(self.app) cors_options = aiohttp_cors.ResourceOptions( @@ -24,10 +24,11 @@ def __init__(self): # Add routes with CORS routes = [ + ('GET', '/health', self.health_check), ('GET', '/files/{filename}', self.handle_download_file), ('GET', '/files', self.handle_list_files), ('GET', '/models', self.handle_list_models), - ('GET', '/models/{foldername}/files', self.handle_list_model_files), + ('GET', '/models/{foldername:.*}/list', self.handle_list_model_items), ('GET', '/models/{model_name}/download', self.handle_model_download) ] @@ -133,9 +134,10 @@ async def handle_list_models(self, request): }) return web.json_response({'models': folders}) - async def handle_list_model_files(self, request): - foldername = request.match_info['foldername'] - folder_path = os.path.join(self.cache_dir, foldername) + async def handle_list_model_items(self, request): + # Get the full path including potential subfolders from URL + path_parts = request.match_info['foldername'].split('/') + folder_path = os.path.join(self.cache_dir, *path_parts) if not os.path.exists(folder_path): return web.json_response({"error": "Folder not found"}, status=404) @@ -143,21 +145,32 @@ async def handle_list_model_files(self, request): if not os.path.isdir(folder_path): return web.json_response({"error": "Not a valid folder"}, status=400) - files = [] - for root, dirs, filenames in os.walk(folder_path): - dirs[:] = [d for d in dirs if not d.startswith('.')] - for filename in filenames: - if filename.startswith('.'): - continue - file_path = os.path.join(root, filename) - rel_path = os.path.relpath(file_path, folder_path) - files.append({ - 'name': rel_path, - 'size': os.path.getsize(file_path), - 'modified': datetime.fromtimestamp(os.path.getmtime(file_path)).isoformat() + items = [] + # List only immediate contents of current directory + for entry in os.scandir(folder_path): + if entry.name.startswith('.'): + continue + + if entry.is_dir(): + items.append({ + 'type': 'directory', + 'name': entry.name, + 'modified': datetime.fromtimestamp(entry.stat().st_mtime).isoformat() + }) + else: + items.append({ + 'type': 'file', + 'name': entry.name, + 'size': entry.stat().st_size, + 'modified': datetime.fromtimestamp(entry.stat().st_mtime).isoformat() }) - return web.json_response({'files': files}) + return web.json_response({'items': items}) + + + async def health_check(self, request): + """健康检查端点""" + return web.Response(text='OK', status=200) async def run(self, host: str = "0.0.0.0", port: int = 52525): runner = web.AppRunner(self.app) diff --git a/exo/localmodel/lh_helpers.py b/exo/localmodel/lh_helpers.py index 103efc210..c85621235 100644 --- a/exo/localmodel/lh_helpers.py +++ b/exo/localmodel/lh_helpers.py @@ -19,16 +19,15 @@ import aiofiles from aiofiles import os as aios +import exo.main as exo +# remove function : resolve_revision_to_commit_hash + T = TypeVar("T") # Ori: get_local_snapshot_dir -async def get_local_model_dir(repo_id: str, revision: str = "main") -> Optional[Path]: - refs_dir = get_repo_root(repo_id)/"refs" - refs_file = refs_dir/revision - if await aios.path.exists(refs_file): - async with aiofiles.open(refs_file, 'r') as f: - commit_hash = (await f.read()).strip() - snapshot_dir = get_repo_root(repo_id)/"snapshots"/commit_hash - return snapshot_dir +async def get_local_model_dir(repo_id: str) -> Optional[Path]: + refs_dir = get_repo_root(repo_id) + if os.path.exists(refs_dir): + return refs_dir return None @@ -73,10 +72,10 @@ def _add_wildcard_to_directories(pattern: str) -> str: return pattern + "*" return pattern - -def get_hf_endpoint() -> str: - #need http ip address - return os.environ.get('HF_ENDPOINT', "http://huggingface.co") +# Ori: get_hf_endpoint +def get_lh_endpoint() -> str: + # http://:52525 + return exo.local_model_api_endpoints[0] def get_exo_home() -> Path: # Ori: get_hf_home @@ -98,7 +97,7 @@ async def get_lh_token(): # Ori: get_hf_token async def get_auth_headers(): """Get/Custom authentication headers if a token is available.""" - token = await get_hf_token() + token = await get_lh_token() if token: # custom auth header return {"Authorization": f"Bearer {token}"} @@ -107,8 +106,8 @@ async def get_auth_headers(): def get_repo_root(model_id: str) -> Path: """Get the model directory for a given model ID.""" - sanitized_model_id = str(model_id).split("/")[-1] - return get_exo_home()/f"{sanitized_repo_id}" + sanitized_model_name = str(model_id).split("/")[-1] + return get_exo_home()/f"{sanitized_model_name}" async def move_models_to_exo(seed_dir: Union[str, Path]): # Ori: move_models_to_hf """Move model in resources folder of app to .cache/exo/""" @@ -125,26 +124,35 @@ async def move_models_to_exo(seed_dir: Union[str, Path]): # Ori: move_models_to_ print("Done Move") -async def fetch_file_list(session, repo_id, revision, path=""): - api_url = f"{get_hf_endpoint()}/api/models/{repo_id}/tree/{revision}" - url = f"{api_url}/{path}" if path else api_url - +# Ori: fetch_file_list +@retry( + stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=4, max=60) +) +async def fetch_lh_file_list(session, repo_id, path=""): + model_name = repo_id.split("/")[-1] + if path : + url = f"{get_lh_endpoint()}/models/{model_name}/{path}/list" + else: + url = f"{get_lh_endpoint()}/models/{model_name}/list" + headers = await get_auth_headers() - async with session.get(url, headers=headers) as response: + + async with session.get(url, headers=headers, timeout=10) as response: if response.status == 200: data = await response.json() + model_datas = data['items'] files = [] - for item in data: + for item in model_datas: if item["type"] == "file": - files.append({"path": item["path"], "size": item["size"]}) + files.append({"path": item["name"], "size": item.get("size", "Unknow")}) elif item["type"] == "directory": - subfiles = await fetch_file_list(session, repo_id, revision, item["path"]) + subfolders_path = f'{path}/{item["name"]}' + subfiles = await fetch_lh_file_list(session, repo_id, subfolders_path) files.extend(subfiles) return files else: raise Exception(f"Failed to fetch file list: {response.status}") - - + @retry( stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=4, max=60), retry=retry_if_exception_type((aiohttp.ClientError, asyncio.TimeoutError, aiohttp.ClientResponseError)), reraise=True ) @@ -226,62 +234,24 @@ async def download_file( await progress_callback(RepoFileProgressEvent(repo_id, revision, file_path, downloaded_size, downloaded_this_session, total_size, speed, eta, status)) if DEBUG >= 2: print(f"Downloaded: {file_path}") - -async def resolve_revision_to_commit_hash(repo_id: str, revision: str) -> str: - repo_root = get_repo_root(repo_id) - refs_dir = repo_root/"refs" - refs_file = refs_dir/revision - - # Check if we have a cached commit hash - if await aios.path.exists(refs_file): - async with aiofiles.open(refs_file, 'r') as f: - commit_hash = (await f.read()).strip() - if DEBUG >= 2: print(f"Commit hash is already cached at {refs_file}: {commit_hash}") - return commit_hash - - # Fetch the commit hash for the given revision - async with aiohttp.ClientSession() as session: - api_url = f"{get_hf_endpoint()}/api/models/{repo_id}/revision/{revision}" - headers = await get_auth_headers() - async with session.get(api_url, headers=headers) as response: - if response.status != 200: - raise Exception(f"Failed to fetch revision info from {api_url}: {response.status}") - revision_info = await response.json() - commit_hash = revision_info['sha'] - - # Cache the commit hash - await aios.makedirs(refs_dir, exist_ok=True) - async with aiofiles.open(refs_file, 'w') as f: - await f.write(commit_hash) - - return commit_hash - - -async def download_repo_files( +# Ori: download_repo_files +async def download_model_dir( repo_id: str, - revision: str = "main", + revision: str = "Local", progress_callback: Optional[RepoProgressCallback] = None, allow_patterns: Optional[Union[List[str], str]] = None, ignore_patterns: Optional[Union[List[str], str]] = None, max_parallel_downloads: int = 4 ) -> Path: repo_root = get_repo_root(repo_id) - snapshots_dir = repo_root/"snapshots" cachedreqs_dir = repo_root/"cachedreqs" # Ensure directories exist - await aios.makedirs(snapshots_dir, exist_ok=True) + await aios.makedirs(repo_root, exist_ok=True) await aios.makedirs(cachedreqs_dir, exist_ok=True) - # Resolve revision to commit hash - commit_hash = await resolve_revision_to_commit_hash(repo_id, revision) - - # Set up the snapshot directory - snapshot_dir = snapshots_dir/commit_hash - await aios.makedirs(snapshot_dir, exist_ok=True) - # Set up the cached file list directory - cached_file_list_dir = cachedreqs_dir/commit_hash + cached_file_list_dir = cachedreqs_dir await aios.makedirs(cached_file_list_dir, exist_ok=True) cached_file_list_path = cached_file_list_dir/"fetch_file_list.json" @@ -292,23 +262,24 @@ async def download_repo_files( file_list = json.loads(await f.read()) if DEBUG >= 2: print(f"Using cached file list from {cached_file_list_path}") else: - file_list = await fetch_file_list(session, repo_id, revision) + file_list = await fetch_lh_file_list(session, repo_id) # Cache the file list async with aiofiles.open(cached_file_list_path, 'w') as f: await f.write(json.dumps(file_list)) if DEBUG >= 2: print(f"Cached file list at {cached_file_list_path}") - - filtered_file_list = list(filter_repo_objects(file_list, allow_patterns=allow_patterns, ignore_patterns=ignore_patterns, key=lambda x: x["path"])) - total_files = len(filtered_file_list) - total_bytes = sum(file["size"] for file in filtered_file_list) + + #filtered_file_list = list(filter_repo_objects(file_list, allow_patterns=allow_patterns, ignore_patterns=ignore_patterns, key=lambda x: x["path"])) + + total_files = len(file_list) + total_bytes = sum(file["size"] for file in file_list) file_progress: Dict[str, RepoFileProgressEvent] = { file["path"]: RepoFileProgressEvent(repo_id, revision, file["path"], 0, 0, file["size"], 0, timedelta(0), "not_started") - for file in filtered_file_list + for file in file_list } start_time = datetime.now() async def download_with_progress(file_info, progress_state): - local_path = snapshot_dir/file_info["path"] + local_path = repo_root/file_info["path"] if await aios.path.exists(local_path) and (await aios.stat(local_path)).st_size == file_info["size"]: if DEBUG >= 2: print(f"File already fully downloaded: {file_info['path']}") progress_state['completed_files'] += 1 @@ -371,13 +342,13 @@ async def download_with_semaphore(file_info): async with semaphore: await download_with_progress(file_info, progress_state) - tasks = [asyncio.create_task(download_with_semaphore(file_info)) for file_info in filtered_file_list] + tasks = [asyncio.create_task(download_with_semaphore(file_info)) for file_info in file_list] await asyncio.gather(*tasks) - return snapshot_dir - + return repo_root -async def get_weight_map(repo_id: str, revision: str = "main") -> Optional[Dict[str, str]]: +# Ori: get_weight_map +async def get_lh_weight_map(repo_id: str) -> Optional[Dict[str, str]]: """ Retrieve the weight map from the model.safetensors.index.json file. @@ -390,16 +361,14 @@ async def get_weight_map(repo_id: str, revision: str = "main") -> Optional[Dict[ """ # Download the index file - await download_repo_files(repo_id=repo_id, revision=revision, allow_patterns="model.safetensors.index.json") + await download_model_dir(repo_id=repo_id, allow_patterns="model.safetensors.index.json") # Check if the file exists repo_root = get_repo_root(repo_id) - commit_hash = await resolve_revision_to_commit_hash(repo_id, revision) - snapshot_dir = repo_root/"snapshots"/commit_hash - index_file = next((f for f in await aios.listdir(snapshot_dir) if f.endswith("model.safetensors.index.json")), None) + index_file = next((f for f in await aios.listdir(repo_root) if f.endswith("model.safetensors.index.json")), None) if index_file: - index_file_path = snapshot_dir/index_file + index_file_path = repo_root/index_file if await aios.path.exists(index_file_path): async with aiofiles.open(index_file_path, 'r') as f: index_data = json.loads(await f.read()) diff --git a/exo/main.py b/exo/main.py index fc0ac3d0c..1181036cc 100644 --- a/exo/main.py +++ b/exo/main.py @@ -95,14 +95,13 @@ exo_home = get_exo_home() for folder_path in Path(exo_home).iterdir(): if folder_path.is_dir(): - model_path = f"http://{args.node_host}:{args.local_model_api_port}/models/{folder_path.name}" model_name = folder_path.name config_file_path = Path(folder_path/'config.json') if config_file_path.is_file(): with open(config_file_path, 'r') as file: config = json.load(file) config_n_layers = config['num_hidden_layers'] - build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, int(config_n_layers)) + build_local_model_card(model_name, None, inference_engine.__class__.__name__, int(config_n_layers)) print(f"Add Local Model Complete!!") if args.node_port is None: @@ -193,8 +192,11 @@ def preemptively_start_download(request_id: str, opaque_status: str): if status.get("type") == "node_status" and status.get("status") == "start_process_prompt": current_shard = node.get_current_shard(Shard.from_dict(status.get("shard"))) - if "Local" in current_shard.model_id or os.path.isdir(current_shard.model_id): + if os.path.isdir(current_shard.model_id): print("Local model detected, skip download") + pass + elif "Local" in current_shard.model_id: + print("Local model detected, http download to other node") # borcast download model #asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) pass @@ -229,15 +231,17 @@ def throttled_broadcast(shard: Shard, event: RepoProgressEvent): async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name_or_path: str, prompt: str): if model_cards.get(model_name_or_path): inference_class = inference_engine.__class__.__name__ + print(f'model_card = {get_repo(model_name_or_path, inference_class)}') shard = build_base_shard(model_name_or_path, inference_class) if not shard: print(f"Error: exo Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") return + print(f'model_id = {get_repo(shard.model_id, inference_class)}') tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) elif os.path.isdir(model_name_or_path): model_path = model_name_or_path.rstrip('/') - model_config_path = Path(model_path)/'config.json' model_name = str(model_path.split('/')[-1]) + model_config_path = Path(model_path)/'config.json' if os.path.isfile(model_config_path): with open(model_config_path, 'r') as file: diff --git a/exo/models.py b/exo/models.py index 156d88163..27eea31b2 100644 --- a/exo/models.py +++ b/exo/models.py @@ -133,13 +133,18 @@ def build_base_shard(model_id: str, inference_engine_classname: str) -> Optional return None return Shard(model_id, 0, 0, n_layers) -def build_local_model_card(model_name: str, model_path: str, inference_engine: str, config_n_layers: int) -> None: +def build_local_model_card(model_name: str, model_path: str|None, inference_engine: str, config_n_layers: int) -> None: short_model_name = f"Local/{model_name}" pretty_model_name = f"{model_name} (Local)".replace('-', ' ') + if model_path is None: + model_repo = short_model_name + else: + model_repo = model_path + model_cards[short_model_name] = { "layers": config_n_layers, "repo": { - inference_engine: model_path + inference_engine: model_repo }, } pretty_name[short_model_name]=pretty_model_name From aca7eba395da488ad7c8b44a65c4bb4fbfc2332e Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Tue, 17 Dec 2024 09:53:37 +0800 Subject: [PATCH 19/26] filter: add args setting sotre model ip and port --- exo/localmodel/http/http_server.py | 16 +++++++++++++++- exo/localmodel/lh_helpers.py | 5 +++-- exo/main.py | 16 +++++++++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/exo/localmodel/http/http_server.py b/exo/localmodel/http/http_server.py index eeb58f894..3b78b523a 100644 --- a/exo/localmodel/http/http_server.py +++ b/exo/localmodel/http/http_server.py @@ -29,7 +29,8 @@ def __init__(self): ('GET', '/files', self.handle_list_files), ('GET', '/models', self.handle_list_models), ('GET', '/models/{foldername:.*}/list', self.handle_list_model_items), - ('GET', '/models/{model_name}/download', self.handle_model_download) + ('GET', '/models/{model_name}/download', self.handle_model_download), + ('GET', '/models/{model_name}/download/{filename:.*}', self.model_file_download) ] for method, path, handler in routes: @@ -166,7 +167,20 @@ async def handle_list_model_items(self, request): }) return web.json_response({'items': items}) + + async def model_file_download(self, request): + model_name = request.match_info['model_name'] + filename = request.match_info['filename'] + + full_path = os.path.join(self.cache_dir, model_name, filename) # Corrected to use 'filename' + + if not os.path.exists(full_path): + return web.json_response({"error": "File not found"}, status=404) + + if not os.path.isfile(full_path): + return web.json_response({"error": "Not a valid file"}, status=400) + return web.FileResponse(full_path) async def health_check(self, request): """健康检查端点""" diff --git a/exo/localmodel/lh_helpers.py b/exo/localmodel/lh_helpers.py index c85621235..79c0f4753 100644 --- a/exo/localmodel/lh_helpers.py +++ b/exo/localmodel/lh_helpers.py @@ -159,7 +159,8 @@ async def fetch_lh_file_list(session, repo_id, path=""): async def download_file( session: aiohttp.ClientSession, repo_id: str, revision: str, file_path: str, save_directory: str, progress_callback: Optional[RepoFileProgressCallback] = None, use_range_request: bool = True ): - base_url = f"{get_hf_endpoint()}/{repo_id}/resolve/{revision}/" + #base_url = f"{get_hf_endpoint()}/{repo_id}/resolve/{revision}/" + base_url = f'{get_lh_endpoint()}/models/{repo_id}/download/' url = urljoin(base_url, file_path) local_path = os.path.join(save_directory, file_path) @@ -316,7 +317,7 @@ async def file_progress_callback(event: RepoFileProgressEvent): ) ) - await download_file(session, repo_id, revision, file_info["path"], snapshot_dir, file_progress_callback) + await download_file(session, repo_id, revision, file_info["path"], repo_root, file_progress_callback) progress_state['completed_files'] += 1 file_progress[ file_info["path"] diff --git a/exo/main.py b/exo/main.py index 1181036cc..eabf9dbd2 100644 --- a/exo/main.py +++ b/exo/main.py @@ -74,7 +74,8 @@ parser.add_argument("--tailscale-api-key", type=str, default=None, help="Tailscale API key") parser.add_argument("--tailnet-name", type=str, default=None, help="Tailnet name") parser.add_argument("--node-id-filter", type=str, default=None, help="Comma separated list of allowed node IDs (only for UDP and Tailscale discovery)") -parser.add_argument("--local-model-api-port", type=int, default=52525, help="Local Model API port") +parser.add_argument("--stored-model-ip", type=str, default="0.0.0.0", help="Stored Local Model IP") +parser.add_argument("--stored-model-port", type=int, default=52525, help="Local Model API port") args = parser.parse_args() print(f"Selected inference engine: {args.inference_engine}") @@ -92,6 +93,7 @@ inference_engine = get_inference_engine(inference_engine_name, shard_downloader) print(f"Using inference engine: {inference_engine.__class__.__name__} with shard downloader: {shard_downloader.__class__.__name__}") +print(f"Add Local Model To Model Card:") exo_home = get_exo_home() for folder_path in Path(exo_home).iterdir(): if folder_path.is_dir(): @@ -102,7 +104,7 @@ config = json.load(file) config_n_layers = config['num_hidden_layers'] build_local_model_card(model_name, None, inference_engine.__class__.__name__, int(config_n_layers)) -print(f"Add Local Model Complete!!") + print(f"- Local/{model_name}") if args.node_port is None: args.node_port = find_available_port(args.node_host) @@ -113,13 +115,16 @@ if args.node_host == "0.0.0.0": chatgpt_api_endpoints = [f"http://{ip}:{args.chatgpt_api_port}/v1/chat/completions" for ip, _ in get_all_ip_addresses_and_interfaces()] - local_model_api_endpoints = [f"http://{ip}:{args.local_model_api_port}" for ip, _ in get_all_ip_addresses_and_interfaces()] web_chat_urls = [f"http://{ip}:{args.chatgpt_api_port}" for ip, _ in get_all_ip_addresses_and_interfaces()] else: chatgpt_api_endpoints = [f"http://{args.node_host}:{args.chatgpt_api_port}/v1/chat/completions"] - local_model_api_endpoints = [f"http://{args.node_host}:{args.local_model_api_port}"] web_chat_urls = [f"http://{args.node_host}:{args.chatgpt_api_port}"] +if args.stored_model_ip == "0.0.0.0": + local_model_api_endpoints = [f"http://{ip}:{args.stored_model_port}" for ip, _ in get_all_ip_addresses_and_interfaces()] +else: + local_model_api_endpoints = [f"http://{args.stored_model_ip}:{args.stored_model_port}"] + if DEBUG >= 0: print("Chat interface started:") for web_chat_url in web_chat_urls: @@ -408,7 +413,8 @@ def handle_exit(): else: asyncio.create_task(chatgpt_api.run(host=args.node_host, port=args.chatgpt_api_port)) # Start the API server as a non-blocking task - asyncio.create_task(local_model_api.run(host=args.node_host, port=args.local_model_api_port)) # Start the local model server as a non-blocking task + if any(ip == args.stored_model_ip for ip, _ in get_all_ip_addresses_and_interfaces()): + asyncio.create_task(local_model_api.run(host=args.stored_model_ip, port=args.stored_model_port)) # Start the local model server as a non-blocking task await asyncio.Event().wait() if args.wait_for_peers > 0: From ef60ff3c1c716d866606dc22fb87e7817bac0b51 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Wed, 18 Dec 2024 16:49:08 +0800 Subject: [PATCH 20/26] future:add other node update local model to model_crads --- exo/download/hf/hf_shard_download.py | 5 +-- exo/helpers.py | 35 +++++++++++++++++ exo/inference/tokenizers.py | 5 +-- exo/localmodel/http/http_server.py | 57 +--------------------------- exo/main.py | 30 ++++++++++----- 5 files changed, 60 insertions(+), 72 deletions(-) diff --git a/exo/download/hf/hf_shard_download.py b/exo/download/hf/hf_shard_download.py index 4553fa200..919fe481e 100644 --- a/exo/download/hf/hf_shard_download.py +++ b/exo/download/hf/hf_shard_download.py @@ -132,9 +132,8 @@ async def get_shard_download_status(self) -> Optional[Dict[str, Union[float, int total_bytes = 0 downloaded_bytes = 0 - conn = aiohttp.TCPConnector(limit=100) - async with aiohttp.ClientSession(connector=conn) as session: - if self.current_repo_id.startswith("Local"): + async with aiohttp.ClientSession() as session: + if self.current_repo_id.startswith("Local"): # 看要不要換 check_agent file_list = await fetch_lh_file_list(session, self.current_repo_id) else: file_list = await fetch_file_list(session, self.current_repo_id, self.revision) diff --git a/exo/helpers.py b/exo/helpers.py index 5552524e8..4498299eb 100644 --- a/exo/helpers.py +++ b/exo/helpers.py @@ -14,6 +14,8 @@ import json from concurrent.futures import ThreadPoolExecutor +import aiohttp + DEBUG = int(os.getenv("DEBUG", default="0")) DEBUG_DISCOVERY = int(os.getenv("DEBUG_DISCOVERY", default="0")) VERSION = "0.0.1" @@ -308,6 +310,39 @@ async def get_interface_priority_and_type(ifname: str) -> Tuple[int, str]: # Other physical interfaces return (2, "Other") +async def get_stored_models(stored_ip: str, stored_port: int): + url = f"http://{stored_ip}:{stored_port}/models" + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.json() + else: + return [] + except Exception as e: + print(f"Error getting models from store: {e}") + return [] + +async def get_stored_model_config(stored_ip: str, stored_port: int, model_name: str): + url = f"http://{stored_ip}:{stored_port}/models/{model_name}/download/config.json" + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + if response.status == 200: + return await response.json() + else: + return None + except Exception as e: + print(f"Error getting models from store: {e}") + return None + +def check_agent(store_ip: str) -> str: + for ip, _ in get_all_ip_addresses_and_interfaces(): + if (store_ip == ip) or (store_ip == "0.0.0.0"): + return "master" + else: + return "client" + async def shutdown(signal, loop, server): """Gracefully shutdown the server and close the asyncio loop.""" print(f"Received exit signal {signal.name}...") diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index a8cd6212f..823dbdc2d 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -31,15 +31,14 @@ async def resolve_tokenizer(model_id: str): if model_id == "dummy": return DummyTokenizer() - if os.path.isdir(model_id): # local model - # model_path = model_id ex: ~/.cach/exo/llama-3.3-70b + if os.path.isdir(model_id): # local path model local_path = str(model_id).rstrip('/') model_id = 'Local/'+str(local_path.split('/')[-1]) elif "Local" in model_id: local_path = await get_local_model_dir(model_id) else: local_path = await get_local_snapshot_dir(model_id) - + print(f'local_path = {local_path}') if DEBUG >= 2: print(f"Checking if local path exists to load tokenizer from local {local_path=}") try: if local_path and await aios.path.exists(local_path): diff --git a/exo/localmodel/http/http_server.py b/exo/localmodel/http/http_server.py index 3b78b523a..5b263e2b0 100644 --- a/exo/localmodel/http/http_server.py +++ b/exo/localmodel/http/http_server.py @@ -27,9 +27,8 @@ def __init__(self): ('GET', '/health', self.health_check), ('GET', '/files/{filename}', self.handle_download_file), ('GET', '/files', self.handle_list_files), - ('GET', '/models', self.handle_list_models), + ('GET', '/models', self.handle_list_models), # models list ('GET', '/models/{foldername:.*}/list', self.handle_list_model_items), - ('GET', '/models/{model_name}/download', self.handle_model_download), ('GET', '/models/{model_name}/download/{filename:.*}', self.model_file_download) ] @@ -67,60 +66,6 @@ async def handle_list_files(self, request): }) return web.json_response({'files': files}) - async def handle_model_download(self, request): - model_name = request.match_info['model_name'] - chunk_size = 32768 # 32KB chunks for better performance - model_path = os.path.join(self.cache_dir, model_name) - - if not os.path.exists(model_path): - return web.json_response({"error": "Model not found"}, status=404) - - if not os.path.isdir(model_path): - return web.json_response({"error": "Not a valid model directory"}, status=400) - - # Setup streaming response - response = web.StreamResponse( - status=200, - reason='OK', - headers={ - 'Content-Type': 'application/octet-stream' - } - ) - await response.prepare(request) - - # Walk through directory and stream files - for root, _, files in os.walk(model_path): - for filename in files: - if filename.startswith('.'): - continue - - file_path = os.path.join(root, filename) - rel_path = os.path.relpath(file_path, model_path) - - if DEBUG >= 2: - print(f"Streaming file: {rel_path}") - - # Send file metadata - metadata = { - 'filename': rel_path, - 'size': os.path.getsize(file_path) - } - await response.write(json.dumps(metadata).encode() + b'\n') - - # Stream file content in chunks - with open(file_path, 'rb') as f: - while True: - chunk = f.read(chunk_size) - if not chunk: - break - await response.write(chunk) - - # Send end of file marker - await response.write(b'EOF\n') - - await response.write_eof() - return response - async def handle_list_models(self, request): folders = [] for entry in os.scandir(self.cache_dir): diff --git a/exo/main.py b/exo/main.py index eabf9dbd2..7e102c0ee 100644 --- a/exo/main.py +++ b/exo/main.py @@ -38,6 +38,7 @@ from exo.localmodel.http.http_server import LocalModelAPI from exo.localmodel.lh_helpers import has_exo_home_read_access, has_exo_home_write_access, get_exo_home +from exo.helpers import check_agent, get_stored_models, get_stored_model_config # parse args parser = argparse.ArgumentParser(description="Initialize GRPC Discovery") @@ -93,6 +94,7 @@ inference_engine = get_inference_engine(inference_engine_name, shard_downloader) print(f"Using inference engine: {inference_engine.__class__.__name__} with shard downloader: {shard_downloader.__class__.__name__}") +# (Host) Local Model Card print(f"Add Local Model To Model Card:") exo_home = get_exo_home() for folder_path in Path(exo_home).iterdir(): @@ -196,15 +198,13 @@ def preemptively_start_download(request_id: str, opaque_status: str): status = json.loads(opaque_status) if status.get("type") == "node_status" and status.get("status") == "start_process_prompt": current_shard = node.get_current_shard(Shard.from_dict(status.get("shard"))) - if os.path.isdir(current_shard.model_id): print("Local model detected, skip download") pass elif "Local" in current_shard.model_id: print("Local model detected, http download to other node") # borcast download model - #asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) - pass + asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) else: if DEBUG >= 2: print(f"Preemptively starting download for {current_shard}") asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) @@ -234,14 +234,12 @@ def throttled_broadcast(shard: Shard, event: RepoProgressEvent): shard_downloader.on_progress.register("broadcast").on_next(throttled_broadcast) async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name_or_path: str, prompt: str): + inference_class = inference_engine.__class__.__name__ if model_cards.get(model_name_or_path): - inference_class = inference_engine.__class__.__name__ - print(f'model_card = {get_repo(model_name_or_path, inference_class)}') shard = build_base_shard(model_name_or_path, inference_class) if not shard: print(f"Error: exo Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") return - print(f'model_id = {get_repo(shard.model_id, inference_class)}') tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) elif os.path.isdir(model_name_or_path): model_path = model_name_or_path.rstrip('/') @@ -252,16 +250,19 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam with open(model_config_path, 'r') as file: config = json.load(file) config_n_layers = config['num_hidden_layers'] - build_local_model_card(model_name, model_path, inference_engine.__class__.__name__, config_n_layers) + build_local_model_card(model_name, model_path, inference_class, config_n_layers) shard = Shard(model_id=model_path, start_layer=0, end_layer=0, n_layers=config_n_layers) tokenizer = await resolve_tokenizer(model_path) else: - print(f"Error: Not Find Local model '{model_name}' for inference engine {inference_engine.__class__.__name__}") + print(f"Error: Not Find Local model '{model_name}' for inference engine {inference_class}") return else: print(f"Error: Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") return + print(f'model_card = {get_repo(model_name_or_path, inference_class)}') + print(f'model_id = {get_repo(shard.model_id, inference_class)}') + request_id = str(uuid.uuid4()) callback_id = f"cli-wait-response-{request_id}" callback = node.on_token.register(callback_id) @@ -388,6 +389,17 @@ def handle_exit(): for s in [signal.SIGINT, signal.SIGTERM]: loop.add_signal_handler(s, handle_exit) + if check_agent(args.stored_model_ip) == "master": # Local model server + asyncio.create_task(local_model_api.run(host=args.stored_model_ip, port=args.stored_model_port)) + elif check_agent(args.stored_model_ip) == "client": # get local models from master + stored_models_data = await get_stored_models(args.stored_model_ip, args.stored_model_port) + for model in stored_models_data.get("models"): + model_name = model.get('name') + model_config_data = await get_stored_model_config(args.stored_model_ip, args.stored_model_port, model_name) + if model_config_data is not None: + model_layer = model_config_data.get('num_hidden_layers') + build_local_model_card(model_name, None, inference_engine.__class__.__name__, int(model_layer)) + await node.start(wait_for_peers=args.wait_for_peers) if args.command == "run" or args.run_model: @@ -413,8 +425,6 @@ def handle_exit(): else: asyncio.create_task(chatgpt_api.run(host=args.node_host, port=args.chatgpt_api_port)) # Start the API server as a non-blocking task - if any(ip == args.stored_model_ip for ip, _ in get_all_ip_addresses_and_interfaces()): - asyncio.create_task(local_model_api.run(host=args.stored_model_ip, port=args.stored_model_port)) # Start the local model server as a non-blocking task await asyncio.Event().wait() if args.wait_for_peers > 0: From 22b4484c1993753c1511043e78f85d5f76a08229 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Thu, 19 Dec 2024 15:49:52 +0800 Subject: [PATCH 21/26] filter: _resolve_tokenizer find error --- exo/main.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/exo/main.py b/exo/main.py index 30fb1d32f..7b4bb229f 100644 --- a/exo/main.py +++ b/exo/main.py @@ -207,18 +207,18 @@ def throttled_broadcast(shard: Shard, event: RepoProgressEvent): shard_downloader.on_progress.register("broadcast").on_next(throttled_broadcast) async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name_or_path: str, prompt: str): - if model_cards.get(model_name_or_path): - inference_class = inference_engine.__class__.__name__ - shard = build_base_shard(model_name_or_path, inference_class) - if not shard: - print(f"Error: exo Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") - return - tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) - elif os.path.isdir(model_name_or_path): - model_path = model_name_or_path.rstrip('/') - model_config_path = Path(model_path)/'config.json' - model_name = str(model_path.split('/')[-1]) + + if os.path.isdir(model_name_or_path) or model_name_or_path.startswith("Local/"): + if os.path.isdir(model_name_or_path): + model_path = model_name_or_path.rstrip('/') + model_name = str(model_path.split('/')[-1]) + else: + model_name = model_name_or_path.split("/")[-1] + exo_path = Path(Path.home()/".cache"/"exo") + model_path = f'{exo_path}/{model_name}' + model_config_path = Path(model_path)/'config.json' + print(model_config_path) if os.path.isfile(model_config_path): with open(model_config_path, 'r') as file: config = json.load(file) @@ -229,6 +229,15 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam else: print(f"Error: Not Find Local model '{model_name}' for inference engine {inference_engine.__class__.__name__}") return + + elif model_cards.get(model_name_or_path): + inference_class = inference_engine.__class__.__name__ + shard = build_base_shard(model_name_or_path, inference_class) + if not shard: + print(f"Error: exo Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") + return + tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) + else: print(f"Error: Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") return From 8c3a600abbabb8e263e507b8650086cbcbebaebc Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Thu, 19 Dec 2024 16:59:14 +0800 Subject: [PATCH 22/26] future: local mode auto download prototype --- exo/helpers.py | 2 +- exo/localmodel/lh_helpers.py | 5 +++- exo/main.py | 47 +++++++++++++++++++++--------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/exo/helpers.py b/exo/helpers.py index 4498299eb..3d7225e70 100644 --- a/exo/helpers.py +++ b/exo/helpers.py @@ -339,7 +339,7 @@ async def get_stored_model_config(stored_ip: str, stored_port: int, model_name: def check_agent(store_ip: str) -> str: for ip, _ in get_all_ip_addresses_and_interfaces(): if (store_ip == ip) or (store_ip == "0.0.0.0"): - return "master" + return "stored" else: return "client" diff --git a/exo/localmodel/lh_helpers.py b/exo/localmodel/lh_helpers.py index 79c0f4753..db969d7a9 100644 --- a/exo/localmodel/lh_helpers.py +++ b/exo/localmodel/lh_helpers.py @@ -160,6 +160,7 @@ async def download_file( session: aiohttp.ClientSession, repo_id: str, revision: str, file_path: str, save_directory: str, progress_callback: Optional[RepoFileProgressCallback] = None, use_range_request: bool = True ): #base_url = f"{get_hf_endpoint()}/{repo_id}/resolve/{revision}/" + repo_id = repo_id.split("/")[-1] base_url = f'{get_lh_endpoint()}/models/{repo_id}/download/' url = urljoin(base_url, file_path) local_path = os.path.join(save_directory, file_path) @@ -245,7 +246,7 @@ async def download_model_dir( max_parallel_downloads: int = 4 ) -> Path: repo_root = get_repo_root(repo_id) - cachedreqs_dir = repo_root/"cachedreqs" + cachedreqs_dir = get_exo_home()/"cachedreqs"/repo_root # Ensure directories exist await aios.makedirs(repo_root, exist_ok=True) @@ -415,3 +416,5 @@ async def has_exo_home_write_access() -> bool: # Ori: has_hf_home_write_access try: return await aios.access(lh_home, os.W_OK) except OSError: return False +async def downlaod_tokenizer_config(repo_id: str): + await download_model_dir(repo_id=repo_id, allow_patterns="tokenizer_config.json") diff --git a/exo/main.py b/exo/main.py index 7e102c0ee..d47def994 100644 --- a/exo/main.py +++ b/exo/main.py @@ -37,7 +37,7 @@ from exo.download.hf.hf_helpers import has_hf_home_read_access, has_hf_home_write_access, get_hf_home, move_models_to_hf from exo.localmodel.http.http_server import LocalModelAPI -from exo.localmodel.lh_helpers import has_exo_home_read_access, has_exo_home_write_access, get_exo_home +from exo.localmodel.lh_helpers import has_exo_home_read_access, has_exo_home_write_access, get_exo_home, downlaod_tokenizer_config from exo.helpers import check_agent, get_stored_models, get_stored_model_config # parse args @@ -85,6 +85,9 @@ system_info = get_system_info() print(f"Detected system: {system_info}") +node_agent = check_agent(args.stored_model_ip) +print(f"Node Agent: {node_agent}") + inference_engine_name = args.inference_engine or ("mlx" if system_info == "Apple Silicon Mac" else "tinygrad") print(f"Inference engine name after selection: {inference_engine_name}") @@ -199,12 +202,13 @@ def preemptively_start_download(request_id: str, opaque_status: str): if status.get("type") == "node_status" and status.get("status") == "start_process_prompt": current_shard = node.get_current_shard(Shard.from_dict(status.get("shard"))) if os.path.isdir(current_shard.model_id): - print("Local model detected, skip download") + if DEBUG >= 2: print("Local model detected, skip download") pass elif "Local" in current_shard.model_id: - print("Local model detected, http download to other node") + if DEBUG >= 2: print("Local model detected, http download to other node") # borcast download model - asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) + if node_agent == "client": + asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) else: if DEBUG >= 2: print(f"Preemptively starting download for {current_shard}") asyncio.create_task(shard_downloader.ensure_shard(current_shard, inference_engine.__class__.__name__)) @@ -230,7 +234,6 @@ def throttled_broadcast(shard: Shard, event: RepoProgressEvent): last_broadcast_time = current_time asyncio.create_task(node.broadcast_opaque_status("", json.dumps({"type": "download_progress", "node_id": node.id, "progress": event.to_dict()}))) - shard_downloader.on_progress.register("broadcast").on_next(throttled_broadcast) async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_name_or_path: str, prompt: str): @@ -240,6 +243,8 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam if not shard: print(f"Error: exo Unsupported model '{model_name_or_path}' for inference engine {inference_engine.__class__.__name__}") return + if "Local" in model_name_or_path: + await downlaod_tokenizer_config(model_name_or_path) tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) elif os.path.isdir(model_name_or_path): model_path = model_name_or_path.rstrip('/') @@ -252,7 +257,7 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam config_n_layers = config['num_hidden_layers'] build_local_model_card(model_name, model_path, inference_class, config_n_layers) shard = Shard(model_id=model_path, start_layer=0, end_layer=0, n_layers=config_n_layers) - tokenizer = await resolve_tokenizer(model_path) + tokenizer = await resolve_tokenizer(model_path) # transformer tokenizer else: print(f"Error: Not Find Local model '{model_name}' for inference engine {inference_class}") return @@ -269,21 +274,22 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam if topology_viz: topology_viz.update_prompt(request_id, prompt) prompt = tokenizer.apply_chat_template([{"role": "user", "content": prompt}], tokenize=False, add_generation_prompt=True) - + try: print(f"Processing prompt: {prompt}") - await node.process_prompt(shard, prompt, request_id=request_id) - + await node.process_prompt(shard, prompt, request_id=request_id) # download model entry + _, tokens, _ = await callback.wait(lambda _request_id, tokens, is_finished: _request_id == request_id and is_finished, timeout=300) print("\nGenerated response:") print(tokenizer.decode(tokens)) + except Exception as e: print(f"Error processing prompt: {str(e)}") traceback.print_exc() finally: node.on_token.deregister(callback_id) - + def clean_path(path): """Clean and resolve path""" if path.startswith("Optional("): @@ -346,7 +352,7 @@ async def main(): # Check HuggingFace directory permissions hf_home, has_read, has_write = get_hf_home(), await has_hf_home_read_access(), await has_hf_home_write_access() - if DEBUG >= 1: print(f"Model storage directory: {hf_home}") + if DEBUG >= 1: print(f"HF Model storage directory: {hf_home}") print(f"{has_read=}, {has_write=}") if not has_read or not has_write: print(f""" @@ -357,7 +363,7 @@ async def main(): """) # Check exo directory permissions exo_home, has_read, has_write = get_exo_home(), await has_exo_home_read_access(), await has_exo_home_write_access() - if DEBUG >= 1: print(f"Model storage directory: {exo_home}") + if DEBUG >= 1: print(f"Local Model storage directory: {exo_home}") print(f"{has_read=}, {has_write=}") if not has_read or not has_write: print(f""" @@ -389,16 +395,17 @@ def handle_exit(): for s in [signal.SIGINT, signal.SIGTERM]: loop.add_signal_handler(s, handle_exit) - if check_agent(args.stored_model_ip) == "master": # Local model server + if node_agent == "stored": # Local model server asyncio.create_task(local_model_api.run(host=args.stored_model_ip, port=args.stored_model_port)) - elif check_agent(args.stored_model_ip) == "client": # get local models from master + elif node_agent == "client": # get local models from master stored_models_data = await get_stored_models(args.stored_model_ip, args.stored_model_port) - for model in stored_models_data.get("models"): - model_name = model.get('name') - model_config_data = await get_stored_model_config(args.stored_model_ip, args.stored_model_port, model_name) - if model_config_data is not None: - model_layer = model_config_data.get('num_hidden_layers') - build_local_model_card(model_name, None, inference_engine.__class__.__name__, int(model_layer)) + if stored_models_data != []: + for model in stored_models_data.get("models"): + model_name = model.get('name') + model_config_data = await get_stored_model_config(args.stored_model_ip, args.stored_model_port, model_name) + if model_config_data is not None: + model_layer = model_config_data.get('num_hidden_layers') + build_local_model_card(model_name, None, inference_engine.__class__.__name__, int(model_layer)) await node.start(wait_for_peers=args.wait_for_peers) From f0e18773eab9b4309a201e857444d311ba641f2a Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Fri, 20 Dec 2024 14:16:33 +0800 Subject: [PATCH 23/26] =?UTF-8?q?filter=EF=BC=9Adownload=20file=20path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exo/inference/tokenizers.py | 1 - exo/localmodel/lh_helpers.py | 13 +++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index 823dbdc2d..381627e80 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -38,7 +38,6 @@ async def resolve_tokenizer(model_id: str): local_path = await get_local_model_dir(model_id) else: local_path = await get_local_snapshot_dir(model_id) - print(f'local_path = {local_path}') if DEBUG >= 2: print(f"Checking if local path exists to load tokenizer from local {local_path=}") try: if local_path and await aios.path.exists(local_path): diff --git a/exo/localmodel/lh_helpers.py b/exo/localmodel/lh_helpers.py index db969d7a9..c5da1fe82 100644 --- a/exo/localmodel/lh_helpers.py +++ b/exo/localmodel/lh_helpers.py @@ -159,7 +159,6 @@ async def fetch_lh_file_list(session, repo_id, path=""): async def download_file( session: aiohttp.ClientSession, repo_id: str, revision: str, file_path: str, save_directory: str, progress_callback: Optional[RepoFileProgressCallback] = None, use_range_request: bool = True ): - #base_url = f"{get_hf_endpoint()}/{repo_id}/resolve/{revision}/" repo_id = repo_id.split("/")[-1] base_url = f'{get_lh_endpoint()}/models/{repo_id}/download/' url = urljoin(base_url, file_path) @@ -246,17 +245,11 @@ async def download_model_dir( max_parallel_downloads: int = 4 ) -> Path: repo_root = get_repo_root(repo_id) - cachedreqs_dir = get_exo_home()/"cachedreqs"/repo_root - - # Ensure directories exist + cachedreqs_model_dir = Path(get_exo_home()) / "cachedreqs" / repo_root await aios.makedirs(repo_root, exist_ok=True) - await aios.makedirs(cachedreqs_dir, exist_ok=True) - - # Set up the cached file list directory - cached_file_list_dir = cachedreqs_dir - await aios.makedirs(cached_file_list_dir, exist_ok=True) - cached_file_list_path = cached_file_list_dir/"fetch_file_list.json" + await aios.makedirs(cachedreqs_model_dir, exist_ok=True) + cached_file_list_path = cachedreqs_model_dir / "fetch_file_list.json" async with aiohttp.ClientSession() as session: # Check if we have a cached file list if await aios.path.exists(cached_file_list_path): From 5eef335ef8d9c53795f4d8b63ab8dd5cc78797d1 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Fri, 20 Dec 2024 14:44:34 +0800 Subject: [PATCH 24/26] filter: stored_model dir path and http class name --- exo/download/hf/hf_shard_download.py | 2 +- .../storedhost}/http/http_helpers.py | 0 exo/{localmodel => download/storedhost}/http/http_server.py | 2 +- .../lh_helpers.py => download/storedhost/sh_helpers.py} | 0 exo/inference/tokenizers.py | 2 +- exo/main.py | 6 +++--- 6 files changed, 6 insertions(+), 6 deletions(-) rename exo/{localmodel => download/storedhost}/http/http_helpers.py (100%) rename exo/{localmodel => download/storedhost}/http/http_server.py (99%) rename exo/{localmodel/lh_helpers.py => download/storedhost/sh_helpers.py} (100%) diff --git a/exo/download/hf/hf_shard_download.py b/exo/download/hf/hf_shard_download.py index 919fe481e..64e682534 100644 --- a/exo/download/hf/hf_shard_download.py +++ b/exo/download/hf/hf_shard_download.py @@ -16,7 +16,7 @@ import aiohttp from aiofiles import os as aios -from exo.localmodel.lh_helpers import ( +from exo.download.storedhost.sh_helpers import ( get_exo_home, get_lh_weight_map, fetch_lh_file_list, download_model_dir ) diff --git a/exo/localmodel/http/http_helpers.py b/exo/download/storedhost/http/http_helpers.py similarity index 100% rename from exo/localmodel/http/http_helpers.py rename to exo/download/storedhost/http/http_helpers.py diff --git a/exo/localmodel/http/http_server.py b/exo/download/storedhost/http/http_server.py similarity index 99% rename from exo/localmodel/http/http_server.py rename to exo/download/storedhost/http/http_server.py index 5b263e2b0..29eca8f15 100644 --- a/exo/localmodel/http/http_server.py +++ b/exo/download/storedhost/http/http_server.py @@ -7,7 +7,7 @@ from typing import Dict from exo import DEBUG -class LocalModelAPI: +class StoredModelAPI: def __init__(self): self.app = web.Application() self.cache_dir = os.path.expanduser('~/.cache/exo') diff --git a/exo/localmodel/lh_helpers.py b/exo/download/storedhost/sh_helpers.py similarity index 100% rename from exo/localmodel/lh_helpers.py rename to exo/download/storedhost/sh_helpers.py diff --git a/exo/inference/tokenizers.py b/exo/inference/tokenizers.py index 381627e80..600c9f6a3 100644 --- a/exo/inference/tokenizers.py +++ b/exo/inference/tokenizers.py @@ -9,7 +9,7 @@ from exo.download.hf.hf_helpers import get_local_snapshot_dir from exo.helpers import DEBUG -from exo.localmodel.lh_helpers import get_local_model_dir +from exo.download.storedhost.sh_helpers import get_local_model_dir class DummyTokenizer: diff --git a/exo/main.py b/exo/main.py index d47def994..559c0c805 100644 --- a/exo/main.py +++ b/exo/main.py @@ -36,8 +36,8 @@ from exo.viz.topology_viz import TopologyViz from exo.download.hf.hf_helpers import has_hf_home_read_access, has_hf_home_write_access, get_hf_home, move_models_to_hf -from exo.localmodel.http.http_server import LocalModelAPI -from exo.localmodel.lh_helpers import has_exo_home_read_access, has_exo_home_write_access, get_exo_home, downlaod_tokenizer_config +from exo.download.storedhost.http.http_server import StoredModelAPI +from exo.download.storedhost.sh_helpers import has_exo_home_read_access, has_exo_home_write_access, get_exo_home, downlaod_tokenizer_config from exo.helpers import check_agent, get_stored_models, get_stored_model_config # parse args @@ -191,7 +191,7 @@ on_chat_completion_request=lambda req_id, __, prompt: topology_viz.update_prompt(req_id, prompt) if topology_viz else None, default_model=args.default_model ) -local_model_api = LocalModelAPI() +local_model_api = StoredModelAPI() node.on_token.register("update_topology_viz").on_next( lambda req_id, tokens, __: topology_viz.update_prompt_output(req_id, inference_engine.tokenizer.decode(tokens)) if topology_viz and hasattr(inference_engine, "tokenizer") else None ) From c557fe89402addfd8e7243df1015d710bf3740f7 Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Tue, 24 Dec 2024 09:49:43 +0800 Subject: [PATCH 25/26] feat:chatAPI can run Local model on multi node --- exo/api/chatgpt_api.py | 87 ++++++--- exo/download/storedhost/http/http_server.py | 52 ++++- exo/download/storedhost/sh_helpers.py | 52 +++++ exo/download/storedhost/sh_shard_download.py | 188 +++++++++++++++++++ exo/main.py | 3 +- 5 files changed, 352 insertions(+), 30 deletions(-) create mode 100644 exo/download/storedhost/sh_shard_download.py diff --git a/exo/api/chatgpt_api.py b/exo/api/chatgpt_api.py index b05a78788..36403b791 100644 --- a/exo/api/chatgpt_api.py +++ b/exo/api/chatgpt_api.py @@ -22,6 +22,9 @@ from exo.download.hf.hf_helpers import get_hf_home, get_repo_root from exo.apputil import create_animation_mp4 +from exo.download.storedhost.sh_shard_download import SHShardDownloader +from exo.download.storedhost.sh_helpers import get_repo_root, downlaod_tokenizer_config + class Message: def __init__(self, role: str, content: Union[str, List[Dict[str, Union[str, Dict[str, str]]]]]): self.role = role @@ -242,18 +245,19 @@ async def handle_model_support(self, request): shard = build_base_shard(model_name, self.inference_engine_classname) if shard: if 'Local/' in model_name: - download_percentage = 100.0 - total_size = "Unknown" - total_downloaded = "Unknown" + downloader = SHShardDownloader(quick_check=True) + downloader.current_shard = shard + downloader.current_repo_id = get_repo(shard.model_id, self.inference_engine_classname) + status = await downloader.get_shard_download_status() else: downloader = HFShardDownloader(quick_check=True) downloader.current_shard = shard downloader.current_repo_id = get_repo(shard.model_id, self.inference_engine_classname) status = await downloader.get_shard_download_status() - download_percentage = status.get("overall") if status else None - total_size = status.get("total_size") if status else None - total_downloaded = status.get("total_downloaded") if status else False + download_percentage = status.get("overall") if status else None + total_size = status.get("total_size") if status else None + total_downloaded = status.get("total_downloaded") if status else False model_data = { model_name: { @@ -341,6 +345,7 @@ async def handle_post_chat_completions(self, request): if not chat_request.model or chat_request.model not in model_cards: if DEBUG >= 1: print(f"Invalid model: {chat_request.model}. Supported: {list(model_cards.keys())}. Defaulting to {self.default_model}") chat_request.model = self.default_model + shard = build_base_shard(chat_request.model, self.inference_engine_classname) if not shard: supported_models = [model for model, info in model_cards.items() if self.inference_engine_classname in info.get("repo", {})] @@ -349,10 +354,12 @@ async def handle_post_chat_completions(self, request): status=400, ) - if "Local" in shard.model_id: + if os.path.isfile(chat_request.model): model_path = model_cards.get(shard.model_id, {}).get("repo", {}).get(self.inference_engine_classname,{}) tokenizer = await resolve_tokenizer(model_path) else: + if shard.model_id.startswith("Local"): + await downlaod_tokenizer_config(shard.model_id) tokenizer = await resolve_tokenizer(get_repo(shard.model_id, self.inference_engine_classname)) if DEBUG >= 4: print(f"Resolved tokenizer: {tokenizer}") @@ -485,30 +492,54 @@ async def handle_delete_model(self, request): repo_id = get_repo(shard.model_id, self.inference_engine_classname) if DEBUG >= 2: print(f"Repo ID for model: {repo_id}") + + if repo_id.startswith("local"): + lm_dir = get_repo_root(repo_id) + print(lm_dir) + if DEBUG >= 2: print(f"Looking for model files in: {lm_dir}") + + if os.path.exists(lm_dir): + if DEBUG >= 2: print(f"Found model files at {lm_dir}, deleting...") + try: + shutil.rmtree(lm_dir) + return web.json_response({ + "status": "success", + "message": f"Model {model_name} deleted successfully", + "path": str(lm_dir) + }) + except Exception as e: + return web.json_response({ + "detail": f"Failed to delete model files: {str(e)}" + }, status=500) + else: + return web.json_response({ + "detail": f"Model files not found at {lm_dir}" + }, status=404) + + else: + # Get the HF cache directory using the helper function + hf_home = get_hf_home() + cache_dir = get_repo_root(repo_id) - # Get the HF cache directory using the helper function - hf_home = get_hf_home() - cache_dir = get_repo_root(repo_id) - - if DEBUG >= 2: print(f"Looking for model files in: {cache_dir}") + if DEBUG >= 2: print(f"Looking for model files in: {cache_dir}") - if os.path.exists(cache_dir): - if DEBUG >= 2: print(f"Found model files at {cache_dir}, deleting...") - try: - shutil.rmtree(cache_dir) - return web.json_response({ - "status": "success", - "message": f"Model {model_name} deleted successfully", - "path": str(cache_dir) - }) - except Exception as e: + if os.path.exists(cache_dir): + if DEBUG >= 2: print(f"Found model files at {cache_dir}, deleting...") + try: + shutil.rmtree(cache_dir) + return web.json_response({ + "status": "success", + "message": f"Model {model_name} deleted successfully", + "path": str(cache_dir) + }) + except Exception as e: + return web.json_response({ + "detail": f"Failed to delete model files: {str(e)}" + }, status=500) + else: return web.json_response({ - "detail": f"Failed to delete model files: {str(e)}" - }, status=500) - else: - return web.json_response({ - "detail": f"Model files not found at {cache_dir}" - }, status=404) + "detail": f"Model files not found at {cache_dir}" + }, status=404) except Exception as e: print(f"Error in handle_delete_model: {str(e)}") diff --git a/exo/download/storedhost/http/http_server.py b/exo/download/storedhost/http/http_server.py index 29eca8f15..05c5835b6 100644 --- a/exo/download/storedhost/http/http_server.py +++ b/exo/download/storedhost/http/http_server.py @@ -29,7 +29,8 @@ def __init__(self): ('GET', '/files', self.handle_list_files), ('GET', '/models', self.handle_list_models), # models list ('GET', '/models/{foldername:.*}/list', self.handle_list_model_items), - ('GET', '/models/{model_name}/download/{filename:.*}', self.model_file_download) + ('GET', '/models/{model_name}/download/{filename:.*}', self.model_file_download), + ('HEAD', '/models/{model_name}/info/{filename:.*}', self.model_file_info), ] for method, path, handler in routes: @@ -127,6 +128,55 @@ async def model_file_download(self, request): return web.FileResponse(full_path) + async def model_file_info(self, request): + try: + model_name = request.match_info['model_name'] + filename = request.match_info['filename'] + full_path = os.path.join(self.cache_dir, model_name, filename) + + if not os.path.exists(full_path): + return web.json_response({ + "error": "File not found", + "path": full_path, + "model": model_name, + "filename": filename + }, status=404) + + if not os.path.isfile(full_path): + return web.json_response({ + "error": "Not a valid file", + "path": full_path, + "type": "directory" if os.path.isdir(full_path) else "unknown" + }, status=400) + + stat = os.stat(full_path) + file_info = { + 'name': filename, + 'model': model_name, + 'path': full_path, + 'size': stat.st_size, + 'content_length': stat.st_size, + 'modified': datetime.fromtimestamp(stat.st_mtime).isoformat(), + 'created': datetime.fromtimestamp(stat.st_ctime).isoformat(), + 'permissions': oct(stat.st_mode)[-3:], + 'is_file': True, + 'mime_type': self._get_mime_type(full_path), + 'status': 'available' + } + + return web.json_response(file_info) + + except Exception as e: + return web.json_response({ + "error": str(e), + "status": "error" + }, status=500) + + def _get_mime_type(self, file_path): + import mimetypes + mime_type, _ = mimetypes.guess_type(file_path) + return mime_type or 'application/octet-stream' + async def health_check(self, request): """健康检查端点""" return web.Response(text='OK', status=200) diff --git a/exo/download/storedhost/sh_helpers.py b/exo/download/storedhost/sh_helpers.py index c5da1fe82..4e465a6d7 100644 --- a/exo/download/storedhost/sh_helpers.py +++ b/exo/download/storedhost/sh_helpers.py @@ -399,6 +399,58 @@ def get_allow_patterns(weight_map: Dict[str, str], shard: Shard) -> List[str]: if DEBUG >= 2: print(f"get_allow_patterns {weight_map=} {shard=} {shard_specific_patterns=}") return list(default_patterns | shard_specific_patterns) +async def get_sh_model_file_download_percentage( # Ori: get_file_download_percentage + session: aiohttp.ClientSession, + repo_id: str, + file_path: str, + snapshot_dir: Path, +) -> float: + """ + Calculate the download percentage for a file by comparing local and remote sizes. + """ + try: + local_path = snapshot_dir / file_path + if not await aios.path.exists(local_path): + return 0 + + # Get local file size first + local_size = await aios.path.getsize(local_path) + if local_size == 0: + return 0 + + # Check remote size + # Change to SH endpoint get file size + model_name = repo_id.split("/")[-1] + base_url = f"{get_lh_endpoint()}/models/{model_name}/info/" + url = urljoin(base_url, file_path) + headers = await get_auth_headers() + + # Use HEAD request with redirect following for all files + async with session.head(url, headers=headers, allow_redirects=True) as response: + if response.status != 200: + if DEBUG >= 2: + print(f"Failed to get remote file info for {file_path}: {response.status}") + return 0 + + remote_size = int(response.headers.get('Content-Length', 0)) + print(f'file_path: {file_path} remote_size: {remote_size} local_size: {local_size}') + if remote_size == 0: + if DEBUG >= 2: + print(f"Remote size is 0 for {file_path}") + return 0 + + # Only return 100% if sizes match exactly + if local_size == remote_size: + return 100.0 + + # Calculate percentage based on sizes + return (local_size / remote_size) * 100 if remote_size > 0 else 0 + + except Exception as e: + if DEBUG >= 2: + print(f"Error checking file download status for {file_path}: {e}") + return 0 + async def has_exo_home_read_access() -> bool: # Ori: has_hf_home_read_access lh_home = get_exo_home() try: return await aios.access(lh_home, os.R_OK) diff --git a/exo/download/storedhost/sh_shard_download.py b/exo/download/storedhost/sh_shard_download.py new file mode 100644 index 000000000..fbe1710eb --- /dev/null +++ b/exo/download/storedhost/sh_shard_download.py @@ -0,0 +1,188 @@ +import asyncio +import traceback +from pathlib import Path +from typing import Dict, List, Tuple, Optional, Union +from exo.inference.shard import Shard +from exo.download.shard_download import ShardDownloader +from exo.download.download_progress import RepoProgressEvent +from exo.download.hf.hf_helpers import ( + download_repo_files, RepoProgressEvent, get_weight_map, + get_allow_patterns, get_repo_root, fetch_file_list, + get_local_snapshot_dir, get_file_download_percentage, + filter_repo_objects +) +from exo.helpers import AsyncCallbackSystem, DEBUG +from exo.models import model_cards, get_repo +import aiohttp +from aiofiles import os as aios + +from exo.download.storedhost.sh_helpers import ( + get_exo_home, get_lh_weight_map, fetch_lh_file_list, download_model_dir +) +from exo.download.storedhost.sh_helpers import ( + download_model_dir, RepoProgressEvent, get_lh_weight_map, + get_allow_patterns, get_repo_root, fetch_lh_file_list, + get_local_model_dir, get_sh_model_file_download_percentage +) + +class SHShardDownloader(ShardDownloader): + def __init__(self, quick_check: bool = False, max_parallel_downloads: int = 4): + self.quick_check = quick_check + self.max_parallel_downloads = max_parallel_downloads + self.active_downloads: Dict[Shard, asyncio.Task] = {} + self.completed_downloads: Dict[Shard, Path] = {} + self._on_progress = AsyncCallbackSystem[str, Tuple[Shard, RepoProgressEvent]]() + self.current_shard: Optional[Shard] = None + self.current_repo_id: Optional[str] = None + self.revision: str = "main" + + async def ensure_shard(self, shard: Shard, inference_engine_name: str) -> Path: + self.current_shard = shard + self.current_repo_id = get_repo(shard.model_id, inference_engine_name) + repo_name = get_repo(shard.model_id, inference_engine_name) + if shard in self.completed_downloads: + return self.completed_downloads[shard] + if self.quick_check: + repo_root = get_repo_root(repo_name) + if 'Local' in shard.model_id: + model_name = shard.model_id.split('/')[1] + snapshots_dir = Path(get_exo_home()/model_name) + else: # HF model + snapshots_dir = repo_root/"snapshots" + + if snapshots_dir.exists(): + visible_dirs = [d for d in snapshots_dir.iterdir() if not d.name.startswith('.')] + if visible_dirs: + most_recent_dir = max(visible_dirs, key=lambda x: x.stat().st_mtime) + return most_recent_dir + + # If a download on this shard is already in progress, keep that one + for active_shard in self.active_downloads: + if active_shard == shard: + if DEBUG >= 2: print(f"Download already in progress for {shard}. Keeping that one.") + return await self.active_downloads[shard] + + # Cancel any downloads for this model_id on a different shard + existing_active_shards = [active_shard for active_shard in self.active_downloads.keys() if active_shard.model_id == shard.model_id] + for active_shard in existing_active_shards: + if DEBUG >= 2: print(f"Cancelling download for {active_shard} (replacing with {shard})") + task = self.active_downloads[active_shard] + task.cancel() + try: + await task + except asyncio.CancelledError: + pass # This is expected when cancelling a task + except Exception as e: + if DEBUG >= 2: print(f"Error in cancelling download {active_shard}: {e}") + traceback.print_exc() + self.active_downloads = {active_shard: task for active_shard, task in self.active_downloads.items() if active_shard.model_id != shard.model_id} + + # Start new download + download_task = asyncio.create_task(self._download_shard(shard, repo_name)) + self.active_downloads[shard] = download_task + try: + path = await download_task + self.completed_downloads[shard] = path + return path + finally: + # Ensure the task is removed even if an exception occurs + print(f"Removing download task for {shard}: {shard in self.active_downloads}") + if shard in self.active_downloads: + self.active_downloads.pop(shard) + + async def _download_shard(self, shard: Shard, repo_name: str) -> Path: + async def wrapped_progress_callback(event: RepoProgressEvent): + self._on_progress.trigger_all(shard, event) + + if 'Local' in repo_name: + weight_map = await get_lh_weight_map(repo_name) + allow_patterns = get_allow_patterns(weight_map, shard) + return await download_model_dir(repo_name, progress_callback=wrapped_progress_callback, allow_patterns=allow_patterns, max_parallel_downloads=self.max_parallel_downloads) + else: # HF + weight_map = await get_weight_map(repo_name) + allow_patterns = get_allow_patterns(weight_map, shard) + return await download_repo_files(repo_name, progress_callback=wrapped_progress_callback, allow_patterns=allow_patterns, max_parallel_downloads=self.max_parallel_downloads) + + + @property + def on_progress(self) -> AsyncCallbackSystem[str, Tuple[Shard, RepoProgressEvent]]: + return self._on_progress + + async def get_shard_download_status(self) -> Optional[Dict[str, Union[float, int]]]: + if not self.current_shard or not self.current_repo_id: + if DEBUG >= 2: + print(f"No current shard or repo_id set: {self.current_shard=} {self.current_repo_id=}") + return None + + try: + # If no snapshot directory exists, return None - no need to check remote files + snapshot_dir = await get_local_model_dir(self.current_repo_id) + if not snapshot_dir: + if DEBUG >= 2: + print(f"No snapshot directory found for {self.current_repo_id}") + return None + + # Get the weight map to know what files we need + weight_map = await get_lh_weight_map(self.current_repo_id) + if not weight_map: + if DEBUG >= 2: + print(f"No weight map found for {self.current_repo_id}") + return None + + # Get all files needed for this shard + patterns = get_allow_patterns(weight_map, self.current_shard) + + # Check download status for all relevant files + status = {} + total_bytes = 0 + downloaded_bytes = 0 + + async with aiohttp.ClientSession() as session: + if self.current_repo_id.startswith("Local"): # 看要不要換 check_agent + file_list = await fetch_lh_file_list(session, self.current_repo_id) + else: + file_list = await fetch_file_list(session, self.current_repo_id, self.revision) + + relevant_files = list( + filter_repo_objects( + file_list, allow_patterns=patterns, key=lambda x: x["path"])) + + for file in relevant_files: + file_size = file["size"] + total_bytes += file_size + + percentage = await get_sh_model_file_download_percentage( + session, + self.current_repo_id, + file["path"], + snapshot_dir, + ) + status[file["path"]] = percentage + downloaded_bytes += (file_size * (percentage / 100)) + + # Add overall progress weighted by file size + if total_bytes > 0: + status["overall"] = (downloaded_bytes / total_bytes) * 100 + else: + status["overall"] = 0 + + # Add total size in bytes + status["total_size"] = total_bytes + if status["overall"] != 100: + status["total_downloaded"] = downloaded_bytes + + + if DEBUG >= 2: + print(f"Download calculation for {self.current_repo_id}:") + print(f"Total bytes: {total_bytes}") + print(f"Downloaded bytes: {downloaded_bytes}") + for file in relevant_files: + print(f"File {file['path']}: size={file['size']}, percentage={status[file['path']]}") + + return status + + except Exception as e: + if DEBUG >= 2: + print(f"Error getting shard download status: {e}") + traceback.print_exc() + return None diff --git a/exo/main.py b/exo/main.py index 559c0c805..7f9a1e229 100644 --- a/exo/main.py +++ b/exo/main.py @@ -246,7 +246,8 @@ async def run_model_cli(node: Node, inference_engine: InferenceEngine, model_nam if "Local" in model_name_or_path: await downlaod_tokenizer_config(model_name_or_path) tokenizer = await resolve_tokenizer(get_repo(shard.model_id, inference_class)) - elif os.path.isdir(model_name_or_path): + elif os.path.isdir(os.path.expanduser(model_name_or_path)): + model_name_or_path = os.path.expanduser(model_name_or_path) model_path = model_name_or_path.rstrip('/') model_name = str(model_path.split('/')[-1]) model_config_path = Path(model_path)/'config.json' From 322b36cb72e3487c2e90a705cde8000f8b75efce Mon Sep 17 00:00:00 2001 From: "OKHand.ziyu" Date: Tue, 24 Dec 2024 11:03:13 +0800 Subject: [PATCH 26/26] docs: Update the README.md to add instructions for using local models and automatic download steps. --- README.md | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 4871775fd..5eec24982 100644 --- a/README.md +++ b/README.md @@ -210,35 +210,50 @@ exo run llama-3.2-3b --prompt "What is the meaning of exo?" ### Example Usage on a single device with Local Model - Step1. Download the model from huggingface -- Step2. - ```shell - exo --add-local-model - ``` +- Step2. Put it in the exo folder(~/.cache/exo) - Step3. ```shell - exo --inference-engine mlx --run-model + exo --inference-engine mlx --run-model <~/.cache/exo/'model_name'> or - exo --inference-engine mlx --run-model + exo --inference-engine mlx --run-model ``` ### Example Usage on Multiple Devices with Local Model -#### Both devices are on MacOS: -- Step1. Download the model from huggingface and put it in the exo folder(/.cache/exo) +#### Manual Put Local Model: +- Step1. Download the Hugging Face model and place it in the exo folder (~/.cache/exo) of each node. - Step2. ```shell - exo --add-local-model + # Every node runs the following command + exo --inference-engine mlx ``` -#### Choose one device to run the following command: -```shell -curl http://localhost:52415/v1/chat/completions \ +- Step3. + ```shell + curl http://localhost:52415/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Local/", "messages": [{"role": "user", "content": "What is the meaning of exo?"}], "temperature": 0.7 }' -``` + ``` +#### Auto Download Local Model: +- Step1. Download the Hugging Face model and place it in the exo folder (~/.cache/exo) of one node. +- Step2. + ```shell + # Every node runs the following command + exo --stored-model-ip --inference-engine mlx + ``` +- Step3. + ```shell + curl http://localhost:52415/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "Local/", + "messages": [{"role": "user", "content": "What is the meaning of exo?"}], + "temperature": 0.7 + }' + ``` ### Model Storage Models by default are stored in `~/.cache/huggingface/hub`.