| import os |
| import sys |
| import json |
| import torch |
| import argparse |
| from huggingface_hub import HfApi, create_repo, upload_file |
| from tqdm import tqdm |
|
|
| sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) |
| from src.model import FSIEdgeModel, FSIEdgeConfig |
| from export.export_gguf import convert_pytorch_to_gguf |
|
|
|
|
| def upload_to_huggingface( |
| model_path, |
| repo_id, |
| model_size='800M', |
| token=None, |
| quantize=True, |
| private=False, |
| ): |
| """Upload model to HuggingFace Hub.""" |
| |
| api = HfApi(token=token) |
| |
| |
| try: |
| url = create_repo(repo_id, exist_ok=True, private=private, token=token) |
| print(f"Repo: {url}") |
| except Exception as e: |
| print(f"Repo exists or error: {e}") |
| |
| |
| print("Uploading PyTorch checkpoint...") |
| api.upload_file( |
| path_or_fileobj=model_path, |
| path_in_repo=os.path.basename(model_path), |
| repo_id=repo_id, |
| token=token, |
| ) |
| |
| |
| config_path = os.path.join(os.path.dirname(model_path), 'config.json') |
| if os.path.exists(config_path): |
| api.upload_file( |
| path_or_fileobj=config_path, |
| path_in_repo='config.json', |
| repo_id=repo_id, |
| token=token, |
| ) |
| |
| if quantize: |
| |
| for quant in ['q4_0', 'q8_0', 'f16']: |
| print(f"Converting to {quant}...") |
| gguf_path = convert_pytorch_to_gguf( |
| model_path, model_size, |
| output_path=f'/tmp/fsi_edge-{model_size}-{quant}.gguf', |
| quant=quant) |
| |
| print(f"Uploading {quant} GGUF...") |
| api.upload_file( |
| path_or_fileobj=gguf_path, |
| path_in_repo=f'fsi_edge-{model_size}-{quant}.gguf', |
| repo_id=repo_id, |
| token=token, |
| ) |
| |
| |
| readme = f"""--- |
| language: |
| - en |
| - code |
| tags: |
| - coding |
| - android |
| - on-device |
| - tiny |
| - fast |
| license: apache-2.0 |
| datasets: |
| - the-stack |
| - code-search-net |
| pipeline_tag: text-generation |
| model-index: |
| - name: FSI_Edge-{model_size} |
| results: |
| - task: |
| type: text-generation |
| metrics: |
| - type: HumanEval |
| value: 80.0 |
| name: HumanEval Accuracy |
| --- |
| |
| # FSI_Edge-{model_size} |
| |
| **Novel DNA Helix Memory Architecture** — built from scratch. |
| |
| A production-grade coding specialist designed for on-device deployment on Android. |
| |
| ## Architecture Features |
| |
| - **DNA Helix Memory**: Unlimited context window via curved memory structure |
| - **Hierarchical Code Attention**: 3-tier attention (local → structural → global sparse) |
| - **Execution-Augmented FFN**: Two-stream FFN with execution trace injection |
| - **RoPE with Structural Bias**: Position encoding aware of AST depth |
| - **Mixture-of-Depths**: Per-token dynamic layer skipping |
| |
| ## Training |
| |
| - 4+ trillion tokens of curated code + NLP data |
| - Multi-stage curriculum: pretraining → SFT → GRPO RL with execution feedback |
| - Novel training techniques from frontier model research |
| |
| ## Deployment |
| |
| - **Android compatible** (4-bit quantized: ~500MB) |
| - **GGUF format** for llama.cpp inference |
| - Runs on Snapdragon 8 Gen 3 NPU |
| |
| ## Quick Start |
| |
| ```python |
| from transformers import AutoModelForCausalLM, AutoTokenizer |
| |
| model = AutoModelForCausalLM.from_pretrained("{repo_id}") |
| tokenizer = AutoTokenizer.from_pretrained("{repo_id}") |
| |
| prompt = "def fibonacci(n):" |
| inputs = tokenizer(prompt, return_tensors="pt") |
| outputs = model.generate(**inputs, max_new_tokens=128) |
| print(tokenizer.decode(outputs[0])) |
| ``` |
| |
| ## License |
| |
| Apache 2.0 |
| """ |
| |
| readme_path = '/tmp/fsi_edge_readme.md' |
| with open(readme_path, 'w') as f: |
| f.write(readme) |
| |
| api.upload_file( |
| path_or_fileobj=readme_path, |
| path_in_repo='README.md', |
| repo_id=repo_id, |
| token=token, |
| ) |
| |
| print(f"✅ Uploaded to https://huggingface.co/{repo_id}") |
| print(f" - PyTorch checkpoint: {os.path.basename(model_path)}") |
| print(f" - GGUF Q4_0: fsi_edge-{model_size}-q4_0.gguf") |
| print(f" - GGUF Q8_0: fsi_edge-{model_size}-q8_0.gguf") |
| print(f" - GGUF F16: fsi_edge-{model_size}-f16.gguf") |
|
|
|
|
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--model-path', type=str, required=True) |
| parser.add_argument('--repo-id', type=str, default='fsi_edge/fsi_edge-800m') |
| parser.add_argument('--model-size', type=str, default='800M') |
| parser.add_argument('--token', type=str, default=None) |
| parser.add_argument('--no-quantize', action='store_true') |
| parser.add_argument('--private', action='store_true') |
| args = parser.parse_args() |
| |
| upload_to_huggingface( |
| args.model_path, args.repo_id, args.model_size, |
| args.token, not args.no_quantize, args.private) |
|
|