clankerDiffusion-base / push_hf.py
coderofpears's picture
Upload folder using huggingface_hub
9d7b292 verified
Raw
History Blame Contribute Delete
3.4 kB
"""
clankerDiffusion — push artifacts to HuggingFace (via huggingface_hub).
python push_hf.py --what all # code + tokenizer + rag corpus + train.bin
python push_hf.py --what code # .py sources + tokenizer + rag corpus
python push_hf.py --what data # train.bin + tokenizer + rag corpus
python push_hf.py --what ckpt # latest checkpoints
Repos (under your HF user):
coderofpears/clankerDiffusion-base code + tokenizer + rag corpus
coderofpears/clankerDiffusion-data train.bin (packed training corpus)
coderofpears/clankerDiffusion-checkpoints model checkpoints (.pt)
"""
import os
import argparse
import tempfile
import shutil
import fnmatch
HERE = os.path.dirname(os.path.abspath(__file__))
DATADIR = os.path.join(HERE, "data")
CKPTDIR = os.path.join(HERE, "checkpoints")
CODE_REPO = "coderofpears/clankerDiffusion-base"
DATA_REPO = "coderofpears/clankerDiffusion-data"
CKPT_REPO = "coderofpears/clankerDiffusion-checkpoints"
PY_SOURCES = ["model.py", "tokenizer.py", "prep.py", "train.py", "infer.py",
"tools.py", "agent.py", "rag.py", "build_rag.py", "rag_finetune.py",
"colab_train.py", "modal_train.py", "push_hf.py", "upload_artifacts.py"]
def _token():
# prefer explicit env, else read from .env
tok = os.environ.get("HF_TOKEN")
if tok:
return tok
for p in (os.path.join(HERE, ".env"), os.path.join(os.path.expanduser("~"), ".env")):
if os.path.exists(p):
for line in open(p, encoding="utf-8"):
line = line.strip()
if line.startswith("HF_TOKEN"):
return line.split("=", 1)[1].strip().strip('"').strip("'")
raise SystemExit("HF_TOKEN not found in env or .env")
def _upload(repo, local, patterns):
from huggingface_hub import HfApi
api = HfApi(token=_token())
try:
api.create_repo(repo_id=repo, repo_type="model", exist_ok=True)
except Exception as e:
print(f"[hf] create_repo note: {e}")
stage = tempfile.mkdtemp()
try:
for root, _, files in os.walk(local):
for f in files:
rel = os.path.relpath(os.path.join(root, f), local)
if any(fnmatch.fnmatch(rel, p) or fnmatch.fnmatch(f, p) for p in patterns):
dst = os.path.join(stage, rel)
os.makedirs(os.path.dirname(dst), exist_ok=True)
shutil.copy(os.path.join(root, f), dst)
if not os.listdir(stage):
print(f"[hf] nothing matched for {repo}")
return
api.upload_folder(folder_path=stage, repo_id=repo, repo_type="model")
print(f"[hf] -> {repo}")
finally:
shutil.rmtree(stage, ignore_errors=True)
def push_code():
_upload(CODE_REPO, HERE, PY_SOURCES + ["data/tokenizer.json", "data/rag_corpus.txt", "README.md"])
def push_data():
_upload(DATA_REPO, DATADIR, ["train.bin", "tokenizer.json", "rag_corpus.txt"])
def push_ckpt():
_upload(CKPT_REPO, CKPTDIR, ["*.pt"])
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--what", default="all", choices=["all", "code", "data", "ckpt"])
a = ap.parse_args()
if a.what in ("all", "code"):
push_code()
if a.what in ("all", "data"):
push_data()
if a.what in ("all", "ckpt"):
push_ckpt()
if __name__ == "__main__":
main()