convert-to-gguf / hfconv.py
mrfakename's picture
update
129f554
# THIS SOFTWARE IS NOT OPEN SOURCED!!! REDISTRIBUTION PROHIBITED! SEE LICENSE FOR DETAILS.
from constants import *
from llama_cpp import llama_cpp
types = {
'F32': 0,
'F16': 1,
'Q4_0': 2,
'Q4_1': 3,
'Q8_0': 7,
'Q5_0': 8,
'Q5_1': 9,
'Q2_K': 10,
'Q3_K_S': 11,
'Q3_K_M': 12,
'Q3_K_L': 13,
'Q4_K_S': 14,
'Q4_K_M': 15,
'Q5_K_S': 16,
'Q5_K_M': 17,
'Q6_K': 18,
}
def calcftype(type):
return types[type.upper()]
import shutil
import tempfile
import os
from slugify import slugify
from huggingface_hub import CommitInfo, CommitOperationAdd, Discussion, HfApi, hf_hub_download, repo_exists
from huggingface_hub.file_download import repo_folder_name
from typing import Dict, List, Optional, Set, Tuple
from huggingface_hub import snapshot_download
from cscript import main
def convert_it(
model_id, token, folder
):
with open("README_TEMPLATE.md", 'r') as f:
README = f.read().replace('<<MODEL_ID>>', model_id)
path = snapshot_download(
repo_id=model_id, token=token, cache_dir=folder
)
sf_name = "model-f16.gguf"
main(path, os.path.join(folder, "model-f16.gguf"))
operation = [
CommitOperationAdd(path_in_repo=sf_name, path_or_fileobj=os.path.join(folder, "model-f16.gguf")),
CommitOperationAdd(path_in_repo="README.md", path_or_fileobj=README.encode()),
]
print("Quantization Time!")
for type in types_to_quantize:
print(f"Quantizing {type}!")
llama_cpp.llama_model_quantize(os.path.join(folder, "model-f16.gguf").encode(), os.path.join(folder, f"model-{type.lower()}.gguf").encode(), llama_cpp.llama_model_quantize_params(0, calcftype(type), True))
print(f"Done Quantizing {type}!")
operation.append(CommitOperationAdd(path_in_repo=f"model-{type.lower()}.gguf", path_or_fileobj=os.path.join(folder, f"model-{type.lower()}.gguf")))
return operation
def convert(
api: "HfApi", model_id: str, revision: Optional[str] = None, force: bool = False
) -> Tuple["CommitInfo", List[Tuple[str, "Exception"]]]:
repo_id = username + "/" + slugify(model_id.strip()) + "-GGUF"
with tempfile.TemporaryDirectory() as d:
# d = "~/test"
folder = os.path.join(d, repo_folder_name(repo_id=model_id, repo_type="models"))
os.makedirs(folder)
if repo_exists(repo_id, token=api.token):
raise ValueError("Already exists")
try:
ops = convert_it(model_id, api.token, d)
api.create_repo(repo_id)
api.create_commit(
repo_id=repo_id,
revision=revision,
operations=ops,
commit_message="Add GGUF version",
commit_description="Automated commit"
)
finally:
shutil.rmtree(folder)
return repo_id