LUNA-Training / upload_lora_to_hf.py
ASTERIZER's picture
Upload upload_lora_to_hf.py with huggingface_hub
5848283 verified
import argparse
import os
from pathlib import Path
from huggingface_hub import HfApi
def parse_args():
parser = argparse.ArgumentParser(description="Upload a LoRA adapter folder to a Hugging Face model repo")
parser.add_argument("--repo-id", default="ASTERIZER/LUNA-100M")
parser.add_argument("--folder", default="Base/out/sft/rag_mcp_lora")
parser.add_argument("--path-in-repo", default="rag_mcp_lora")
parser.add_argument("--private", action="store_true")
return parser.parse_args()
def main():
args = parse_args()
token = os.environ.get("HF_TOKEN")
if not token:
raise RuntimeError("HF_TOKEN is required in the environment to upload the LoRA adapter")
folder = Path(args.folder)
if not folder.exists():
raise FileNotFoundError(f"LoRA output folder not found: {folder}")
if not folder.is_dir():
raise NotADirectoryError(f"Expected a folder, got: {folder}")
candidate_files = [
folder / "adapter_model.pt",
folder / "adapter_bundle.pt",
folder / "final" / "adapter_model.pt",
folder / "final" / "adapter_bundle.pt",
]
existing = [path for path in candidate_files if path.exists()]
missing = [str(path) for path in candidate_files if not path.exists()]
if not existing:
raise FileNotFoundError(f"Missing expected adapter files: {', '.join(missing)}")
api = HfApi(token=token)
api.create_repo(
repo_id=args.repo_id,
repo_type="model",
private=args.private,
exist_ok=True,
)
api.upload_folder(
repo_id=args.repo_id,
repo_type="model",
folder_path=str(folder),
path_in_repo=args.path_in_repo,
)
print(
"uploaded_lora "
f"repo_id={args.repo_id} "
f"folder={folder} "
f"path_in_repo={args.path_in_repo} "
f"url=https://huggingface.co/{args.repo_id}/tree/main/{args.path_in_repo}"
)
if __name__ == "__main__":
main()