diffusion_baseline / adapters /sample_di4c.py
jyliuAI's picture
Add files using upload-large-folder tool
6b56858 verified
Raw History Blame Contribute Delete
6.44 kB
#!/usr/bin/env python3
"""Sample a pinned Di4C language student from local server assets only."""
from __future__ import annotations
import argparse
from pathlib import Path
from _distilled_runtime import (
benchmark_model,
checkpoint_state,
configure_for_sampling,
install_upstream,
load_config,
load_tokenizer,
load_tokenizer_binding,
materialize_model,
offline_huggingface,
parse_bool,
require_directory,
require_file,
seed_everything,
validate_embedded_config,
validate_sampling_config,
write_capture_atomic,
)
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--upstream-root", type=Path, required=True)
parser.add_argument("--checkpoint", type=Path, required=True)
parser.add_argument("--config", type=Path, required=True)
parser.add_argument("--checkpoint-sha256", required=True)
parser.add_argument("--config-sha256", required=True)
parser.add_argument("--data-config", type=Path, required=True)
parser.add_argument("--downloads-manifest", type=Path, required=True)
parser.add_argument("--tokenizer-snapshot", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument("--sample-count", type=int, required=True)
parser.add_argument("--batch-size", type=int, required=True)
parser.add_argument("--num-steps", type=int, required=True)
parser.add_argument("--seq-len", type=int, required=True)
parser.add_argument("--seed", type=int, required=True)
parser.add_argument("--sampler", choices=("ancestral",), required=True)
parser.add_argument(
"--teacher-family", choices=("masked_mdlm", "uniform_duo"), required=True
)
parser.add_argument("--dataset", choices=("lm1b", "owt"), required=True)
parser.add_argument("--generation-mode", choices=("unconditional", "conditional_prefix"), default="unconditional")
parser.add_argument("--conditioning-manifest", type=Path)
parser.add_argument("--conditioning-manifest-sha256")
parser.add_argument("--conditioning-config-sha256")
parser.add_argument("--prefix-length", type=int)
parser.add_argument("--evaluation-continuation-length", type=int)
parser.add_argument("--prompt-count", type=int)
parser.add_argument("--diversity-prompt-count", type=int)
parser.add_argument("--completions-per-diversity-prompt", type=int)
parser.add_argument("--completion-schedule")
parser.add_argument("--offline", type=parse_bool, required=True)
parser.add_argument(
"--allow-missing-embedded-config", type=parse_bool, default=False
)
parser.add_argument("--benchmark-output", type=Path)
parser.add_argument("--benchmark-metadata", type=Path)
parser.add_argument("--benchmark-precision", choices=("author",))
args = parser.parse_args(argv)
benchmark_values = (args.benchmark_output, args.benchmark_metadata, args.benchmark_precision)
if any(value is not None for value in benchmark_values) and not all(
value is not None for value in benchmark_values
):
parser.error("benchmark arguments must be provided together")
upstream = require_directory(args.upstream_root, "pinned Di4C language source")
require_file(upstream / "src/sdtt/main.py", "pinned Di4C entrypoint")
install_upstream(upstream)
checkpoint = require_file(args.checkpoint, "Di4C student checkpoint")
config_path = require_file(args.config, "Di4C sampling config")
binding = load_tokenizer_binding(
args.data_config,
args.downloads_manifest,
args.dataset,
args.tokenizer_snapshot,
)
with offline_huggingface(args.offline):
from sdtt.core.distill.multi_round_sdtt import MultiRoundSDTT
config = load_config(config_path, args.config_sha256)
state, embedded_config = checkpoint_state(
checkpoint, args.checkpoint_sha256
)
validate_sampling_config(
config,
binding=binding,
sequence_length=args.seq_len,
require_di4c=True,
)
validate_embedded_config(
config,
embedded_config,
allow_missing_embedded_config=args.allow_missing_embedded_config,
)
configure_for_sampling(
config, tokenizer_snapshot=binding.snapshot, seq_len=args.seq_len
)
config.parameterization.checkpoint_path = str(checkpoint)
tokenizer = load_tokenizer(binding.snapshot)
seed_everything(args.seed)
model = materialize_model(
model_type=MultiRoundSDTT,
config=config,
tokenizer=tokenizer,
state=state,
strict=False,
)
if args.benchmark_output is not None:
benchmark_model(
model=model,
output=args.benchmark_output,
metadata_path=args.benchmark_metadata,
precision=args.benchmark_precision,
num_steps=args.num_steps,
seq_len=args.seq_len,
sampler=args.sampler,
generation_mode=args.generation_mode,
conditioning_manifest=args.conditioning_manifest,
conditioning_manifest_sha256=args.conditioning_manifest_sha256,
prompt_count=args.prompt_count,
diversity_prompt_count=args.diversity_prompt_count,
completions_per_diversity_prompt=args.completions_per_diversity_prompt,
)
else:
write_capture_atomic(
args.output,
model=model,
tokenizer=tokenizer,
sample_count=args.sample_count,
batch_size=args.batch_size,
num_steps=args.num_steps,
seq_len=args.seq_len,
sampler=args.sampler,
generation_mode=args.generation_mode,
conditioning_manifest=args.conditioning_manifest,
conditioning_manifest_sha256=args.conditioning_manifest_sha256,
prompt_count=args.prompt_count,
diversity_prompt_count=args.diversity_prompt_count,
completions_per_diversity_prompt=args.completions_per_diversity_prompt,
)
return 0
if __name__ == "__main__":
raise SystemExit(main())