Python API¶
openternary.api を使うと、CLIと同じ機能を、子プロセスなしでPythonのコードから使えます。安定したバージョン1のインターフェースです。importしてもPyTorchは読み込まず、重い依存はそれを必要とする関数の中でだけ読み込みます。
例¶
はじめての実行の小さなモデルで動きます:
from pathlib import Path
from openternary.api import (
build_plan,
convert_artifact,
doctor,
export_artifact,
load_config,
validate_artifact,
)
config = load_config(cli_overrides={
"model.id": "tiny-llama",
"quantization.scale_granularity": "per_group",
"quantization.group_size": 64,
"device": "cpu",
})
plan = build_plan(config)
print("targets:", sum(t["quantizable"] for t in plan["targets"]))
report = convert_artifact(Path("tiny-llama"), Path("api-out/ternary"), config)
print("content fingerprint:", report.content_fingerprint)
export_artifact(Path("api-out/ternary"), Path("api-out/packed"), "ternary-packed")
print("validation:", validate_artifact(Path("api-out/packed"))["artifact_validation"])
print("torch:", doctor()["dependencies"].get("torch"))
targets: 14
content fingerprint: sha256:2a25a7bffeeb0d0103ab21c3d42336bd72df75359e6bccd564c33fb16475f54f
validation: file_integrity
torch: 2.15.0
このfingerprintは、同じモデルと設定でCLIが表示したものと同じです。CLIと違い、これらの関数は実行フォルダを作りません。結果をどこに置くかは呼び出す側が決めます。
関数¶
設定と計画¶
load_config(config_path=None, cli_overrides=None) -> AppConfig- YAMLのファイル(または既定値)を読み、ドット区切りのキーで指定した上書きを適用します。例:
{"model.id": "./m", "quantization.group_size": 64}。検証はコマンドラインと同じく厳格です。 AppConfig- 設定全体のPydanticのモデルです(設定を参照)。
config.model_dump()でふつうのdictになります。 build_plan(config, *, operation="quantize") -> dictplanが表示する内容: 解決した設定、アダプタ、backend、quantizable付きのテンソルの一覧targets。ヘッダだけを読みます。plan(config_path=None, overrides=None) -> dictload_configのあとにbuild_planを呼ぶ近道です。doctor() -> dictopenternary doctor --jsonのresultと同じ内容: Python、プラットフォーム、依存、backend。
変換と成果物¶
convert_artifact(source, destination, config) -> ConvertReportsourceのsnapshotを量子化し、destinationにmanifest付きの新しい成果物を作ります。結果にはcontent_fingerprint・file_hashes・shard_count・tensor_payload_bytes・shard_file_bytes・snapshot_total_bytes・quantization_jsonがあります。export_artifact(source, destination, format="safetensors") -> dictsafetensors・ternary-packed・torchao・pluginの形式で書き出します。GGUFはconverterが必要なので、専用の関数openternary.export.gguf.export_ggufを使います。validate_artifact(root) -> dict- 成果物のmanifestとファイルのハッシュを確認します。テンソル単位の確認には
openternary.services.tensor_validation.validate_tensorsを使います。
評価¶
benchmark(config, snapshot_path, suite) -> dict- snapshotでsmokeベンチマーク(
suite="smoke")を実行し、benchmark.jsonの内容を返します。 quality(config, dataset_path, *, snapshot_path=None, model=None, processor=None, split, max_length, stride) -> dict- 品質を評価し、
quality.jsonの内容を返します。snapshot_pathを渡すか、読み込み済みのmodelとprocessorを一緒に渡します。 compare_many(baseline, candidates) -> dict- 1つの基準の実行フォルダと、候補の実行フォルダのリストを比べます。
diffusionの評価は openternary.services.diffusion.evaluate_diffusion にあります。
探索¶
run_search(config, profile, candidates, output, budget, *, target_vram, objective="speed", resume=False, executor=None) -> dictoptimizeの中身です。profileはQualityProfile、candidatesは量子化の設定のリスト、budgetはSearchBudget、target_vramはバイト数です。QualityProfile(dataset, baseline, name="balanced-llm-v1", split="validation", max_length=512, stride=256)- 検証のprofile。
splitはvalidationだけです。 SearchBudget(max_candidates=4, wall_seconds=3600, gpu_seconds=3600, artifact_bytes=20 GiB)- 探索の上限。
安定性¶
openternary.api から公開している名前は、バージョン1の約束に従い、既存の動作を互換性のない形で変えません。それ以外(openternary.services・openternary.quant など)は内部のもので、リリースの間で変わることがあります。エラーは例外として送出され、CLIはそれを終了コードに対応付けます。