""" Diagnose: check model files in Modal Volume. Run: modal run modal_deploy.diagnose_volume """ import os import sys MODEL_DIR = "/models" MODEL_SUBDIR = f"{MODEL_DIR}/MiniCPM-o-4_5-gguf" MAIN_GGUF = "MiniCPM-o-4_5-Q4_K_M.gguf" def main(): print(f"{'='*60}") print(f"MODEL_DIR: {MODEL_DIR}") print(f"MODEL_SUBDIR: {MODEL_SUBDIR}") print(f"{'='*60}") # List all files print(f"\nšŸ“‚ Contents of {MODEL_SUBDIR}:") for root, dirs, files in os.walk(MODEL_SUBDIR): level = root.replace(MODEL_SUBDIR, '').count(os.sep) indent = ' ' * 2 * level print(f"{indent}{os.path.basename(root)}/") subindent = ' ' * 2 * (level + 1) for file in files: fpath = os.path.join(root, file) size = os.path.getsize(fpath) print(f"{subindent}{file} ({size:,} bytes = {size/1024**3:.2f} GB)") # Check main model main_path = os.path.join(MODEL_SUBDIR, MAIN_GGUF) if os.path.isfile(main_path): size = os.path.getsize(main_path) mb = size / (1024 * 1024) print(f"\nāœ… {MAIN_GGUF}: {size:,} bytes ({mb:.0f} MB)") if mb < 100: print(f"āš ļø WARNING: File seems too small for a GGUF model!") else: print(f"\nāŒ {MAIN_GGUF} NOT FOUND at {main_path}") # Check vision mmproj vision_path = os.path.join(MODEL_SUBDIR, "vision", "MiniCPM-o-4_5-vision-F16.gguf") if os.path.isfile(vision_path): size = os.path.getsize(vision_path) mb = size / (1024 * 1024) print(f"\nāœ… Vision mmproj: {size:,} bytes ({mb:.0f} MB)") else: print(f"\nāŒ Vision mmproj NOT FOUND at {vision_path}") # Check first 8 bytes of main model (GGUF magic) if os.path.isfile(main_path): with open(main_path, "rb") as f: magic = f.read(8) print(f"\nšŸ” First 8 bytes (magic): {magic.hex()}") if magic[:4] == b"GGUF": print(f"āœ… Valid GGUF header detected") else: print(f"āŒ Not a valid GGUF file!") if __name__ == "__main__": main()