agentinputlab 0.1.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentinputlab/__init__.py +28 -0
- agentinputlab/algorithms/__init__.py +6 -0
- agentinputlab/algorithms/acquire/__init__.py +145 -0
- agentinputlab/algorithms/acquire/adaptive_rag/__init__.py +43 -0
- agentinputlab/algorithms/acquire/adaptive_rag/replay.py +367 -0
- agentinputlab/algorithms/acquire/adaptive_rag/runtime.py +1202 -0
- agentinputlab/algorithms/acquire/adaptive_rag_common_support.py +542 -0
- agentinputlab/algorithms/acquire/hyde.py +296 -0
- agentinputlab/algorithms/acquire/hyde_controlled.py +200 -0
- agentinputlab/algorithms/acquire/hyde_external.py +148 -0
- agentinputlab/algorithms/acquire/ircot.py +28 -0
- agentinputlab/algorithms/acquire/ircot_common_support.py +478 -0
- agentinputlab/algorithms/acquire/ircot_native.py +355 -0
- agentinputlab/algorithms/acquire/ircot_replay.py +327 -0
- agentinputlab/algorithms/acquire/qrag/__init__.py +79 -0
- agentinputlab/algorithms/acquire/qrag/bridge.py +828 -0
- agentinputlab/algorithms/acquire/qrag/common_support.py +891 -0
- agentinputlab/algorithms/acquire/qrag/native_axis.py +71 -0
- agentinputlab/algorithms/acquire/qrag/reader_adapter.py +139 -0
- agentinputlab/algorithms/acquire/r2ag/__init__.py +57 -0
- agentinputlab/algorithms/acquire/r2ag/bridge.py +1312 -0
- agentinputlab/algorithms/acquire/r2ag/common_support.py +1029 -0
- agentinputlab/algorithms/acquire/r2ag/socket_runtime.py +255 -0
- agentinputlab/algorithms/clarify/__init__.py +61 -0
- agentinputlab/algorithms/clarify/_structured.py +64 -0
- agentinputlab/algorithms/clarify/active_task_disambiguation.py +371 -0
- agentinputlab/algorithms/clarify/ask_or_assume/__init__.py +17 -0
- agentinputlab/algorithms/clarify/ask_or_assume/monitor.py +410 -0
- agentinputlab/algorithms/clarify/future_turns.py +379 -0
- agentinputlab/algorithms/clarify/udcs.py +255 -0
- agentinputlab/algorithms/clarify/udcs_deterministic.py +196 -0
- agentinputlab/algorithms/curate/__init__.py +65 -0
- agentinputlab/algorithms/curate/acon/__init__.py +27 -0
- agentinputlab/algorithms/curate/acon/common.py +284 -0
- agentinputlab/algorithms/curate/acon/common_support.py +136 -0
- agentinputlab/algorithms/curate/acon/history_bridge.py +309 -0
- agentinputlab/algorithms/curate/acon/observation_bridge.py +290 -0
- agentinputlab/algorithms/curate/llmlingua/__init__.py +30 -0
- agentinputlab/algorithms/curate/llmlingua/adapters.py +537 -0
- agentinputlab/algorithms/curate/llmlingua/budget.py +48 -0
- agentinputlab/algorithms/curate/llmlingua/controlled.py +175 -0
- agentinputlab/algorithms/curate/llmlingua/multilingual.py +105 -0
- agentinputlab/algorithms/curate/llmlingua/span_map.py +167 -0
- agentinputlab/algorithms/curate/recomp/__init__.py +47 -0
- agentinputlab/algorithms/curate/recomp/external.py +1129 -0
- agentinputlab/algorithms/curate/recomp/selective.py +304 -0
- agentinputlab/algorithms/decompose/__init__.py +107 -0
- agentinputlab/algorithms/decompose/decomp/__init__.py +53 -0
- agentinputlab/algorithms/decompose/decomp/common_support.py +478 -0
- agentinputlab/algorithms/decompose/decomp/planner_component.py +199 -0
- agentinputlab/algorithms/decompose/decomp/worker_bridge.py +416 -0
- agentinputlab/algorithms/decompose/llm_compiler/__init__.py +35 -0
- agentinputlab/algorithms/decompose/llm_compiler/bridge.py +520 -0
- agentinputlab/algorithms/decompose/llm_compiler/common_support.py +504 -0
- agentinputlab/algorithms/decompose/plan_and_budget/__init__.py +43 -0
- agentinputlab/algorithms/decompose/plan_and_budget/cached_soft_budget.py +362 -0
- agentinputlab/algorithms/decompose/plan_and_budget/decomposer_component.py +107 -0
- agentinputlab/algorithms/decompose/plan_and_budget/full.py +205 -0
- agentinputlab/algorithms/decompose/plan_and_budget/hard_cap.py +246 -0
- agentinputlab/algorithms/decompose/plan_and_budget/regenerated_soft_budget.py +448 -0
- agentinputlab/algorithms/decompose/plan_and_solve/__init__.py +33 -0
- agentinputlab/algorithms/decompose/plan_and_solve/plan_component.py +192 -0
- agentinputlab/algorithms/decompose/plan_and_solve/ps_prompt.py +127 -0
- agentinputlab/algorithms/decompose/self_ask/__init__.py +27 -0
- agentinputlab/algorithms/decompose/self_ask/loop.py +362 -0
- agentinputlab/algorithms/decompose/self_ask/planner_component.py +117 -0
- agentinputlab/algorithms/reformulate/__init__.py +85 -0
- agentinputlab/algorithms/reformulate/infocqr/__init__.py +40 -0
- agentinputlab/algorithms/reformulate/infocqr/cache_replay.py +362 -0
- agentinputlab/algorithms/reformulate/infocqr/external.py +675 -0
- agentinputlab/algorithms/reformulate/infocqr/student.py +189 -0
- agentinputlab/algorithms/reformulate/query2doc/__init__.py +42 -0
- agentinputlab/algorithms/reformulate/query2doc/controlled_live.py +190 -0
- agentinputlab/algorithms/reformulate/query2doc/models.py +95 -0
- agentinputlab/algorithms/reformulate/query2doc/official_cached.py +335 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_bridge.py +223 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_runtime.py +326 -0
- agentinputlab/algorithms/reformulate/reformer/__init__.py +23 -0
- agentinputlab/algorithms/reformulate/reformer/external.py +417 -0
- agentinputlab/algorithms/reformulate/rrr.py +696 -0
- agentinputlab/annotation/__init__.py +5 -0
- agentinputlab/annotation/independent.py +428 -0
- agentinputlab/annotation/server.py +233 -0
- agentinputlab/annotation/static/app.js +121 -0
- agentinputlab/annotation/static/index.html +60 -0
- agentinputlab/annotation/static/review.css +2 -0
- agentinputlab/annotation/static/review.html +10 -0
- agentinputlab/annotation/static/review.js +11 -0
- agentinputlab/annotation/static/styles.css +55 -0
- agentinputlab/annotation/store.py +444 -0
- agentinputlab/api.py +368 -0
- agentinputlab/artifacts/__init__.py +15 -0
- agentinputlab/artifacts/json_file.py +104 -0
- agentinputlab/artifacts/manifest.py +98 -0
- agentinputlab/artifacts/store.py +157 -0
- agentinputlab/backends/__init__.py +98 -0
- agentinputlab/backends/embedding/__init__.py +25 -0
- agentinputlab/backends/embedding/base.py +145 -0
- agentinputlab/backends/embedding/callable.py +75 -0
- agentinputlab/backends/embedding/replay.py +129 -0
- agentinputlab/backends/llm/__init__.py +31 -0
- agentinputlab/backends/llm/base.py +149 -0
- agentinputlab/backends/llm/callable.py +108 -0
- agentinputlab/backends/llm/decomp_completion.py +88 -0
- agentinputlab/backends/llm/final_content_stop.py +72 -0
- agentinputlab/backends/llm/gpt_oss_final_channel.py +84 -0
- agentinputlab/backends/llm/openai_compatible.py +332 -0
- agentinputlab/backends/llm/transformers.py +171 -0
- agentinputlab/backends/retrieval/__init__.py +35 -0
- agentinputlab/backends/retrieval/base.py +50 -0
- agentinputlab/backends/retrieval/dense.py +777 -0
- agentinputlab/backends/retrieval/memory.py +119 -0
- agentinputlab/backends/retrieval/sqlite_fts.py +155 -0
- agentinputlab/backends/user/__init__.py +15 -0
- agentinputlab/backends/user/base.py +66 -0
- agentinputlab/backends/user/callable.py +54 -0
- agentinputlab/backends/user/replay.py +89 -0
- agentinputlab/backends/vector.py +38 -0
- agentinputlab/benchmarks/__init__.py +246 -0
- agentinputlab/benchmarks/acquisition.py +106 -0
- agentinputlab/benchmarks/ale.py +540 -0
- agentinputlab/benchmarks/appworld_ul.py +669 -0
- agentinputlab/benchmarks/assets.py +226 -0
- agentinputlab/benchmarks/base.py +68 -0
- agentinputlab/benchmarks/beir_archive.py +235 -0
- agentinputlab/benchmarks/beir_sample.py +269 -0
- agentinputlab/benchmarks/bfcl_native.py +245 -0
- agentinputlab/benchmarks/bfcl_v3.py +607 -0
- agentinputlab/benchmarks/cache.py +218 -0
- agentinputlab/benchmarks/clariq.py +203 -0
- agentinputlab/benchmarks/data/registry.json +321 -0
- agentinputlab/benchmarks/data/smoke_assets.json +511 -0
- agentinputlab/benchmarks/data/statebench_v0_8_1_task_ids.json +475 -0
- agentinputlab/benchmarks/data/toolsandbox_165848b_scenario_names.json +1 -0
- agentinputlab/benchmarks/execution.py +1111 -0
- agentinputlab/benchmarks/interactive.py +257 -0
- agentinputlab/benchmarks/ir_query.py +204 -0
- agentinputlab/benchmarks/longbench.py +203 -0
- agentinputlab/benchmarks/paired_replay.py +479 -0
- agentinputlab/benchmarks/preprocess.py +2313 -0
- agentinputlab/benchmarks/production.py +236 -0
- agentinputlab/benchmarks/qa.py +963 -0
- agentinputlab/benchmarks/registry.py +110 -0
- agentinputlab/benchmarks/retrieval.py +459 -0
- agentinputlab/benchmarks/runtime.py +509 -0
- agentinputlab/benchmarks/statebench.py +938 -0
- agentinputlab/benchmarks/tau3.py +725 -0
- agentinputlab/benchmarks/toolsandbox.py +626 -0
- agentinputlab/benchmarks/trec_dl_sample.py +263 -0
- agentinputlab/campaign.py +654 -0
- agentinputlab/campaign_runner.py +953 -0
- agentinputlab/cli/__init__.py +6 -0
- agentinputlab/cli/main.py +933 -0
- agentinputlab/connectors/__init__.py +46 -0
- agentinputlab/connectors/knowledge/__init__.py +4 -0
- agentinputlab/connectors/tools/__init__.py +30 -0
- agentinputlab/connectors/tools/base.py +57 -0
- agentinputlab/connectors/tools/mcp.py +222 -0
- agentinputlab/connectors/tools/memory.py +41 -0
- agentinputlab/connectors/tools/openapi.py +695 -0
- agentinputlab/connectors/tools/schema.py +102 -0
- agentinputlab/contracts/__init__.py +91 -0
- agentinputlab/contracts/availability.py +24 -0
- agentinputlab/contracts/dependency.py +58 -0
- agentinputlab/contracts/enums.py +82 -0
- agentinputlab/contracts/errors.py +63 -0
- agentinputlab/contracts/evidence.py +43 -0
- agentinputlab/contracts/intent.py +110 -0
- agentinputlab/contracts/lifecycle.py +164 -0
- agentinputlab/contracts/patch.py +167 -0
- agentinputlab/contracts/serialization.py +93 -0
- agentinputlab/contracts/state.py +127 -0
- agentinputlab/contracts/trace.py +59 -0
- agentinputlab/contracts/worker.py +42 -0
- agentinputlab/core/__init__.py +7 -0
- agentinputlab/data/__init__.py +32 -0
- agentinputlab/data/checksums.py +9 -0
- agentinputlab/data/downloader.py +235 -0
- agentinputlab/data/http.py +171 -0
- agentinputlab/data/index.py +21 -0
- agentinputlab/data/overlap.py +28 -0
- agentinputlab/data/preprocess.py +32 -0
- agentinputlab/data/storage.py +57 -0
- agentinputlab/data/trec_sample.py +427 -0
- agentinputlab/evaluation/__init__.py +5 -0
- agentinputlab/evaluation/outcomes.py +32 -0
- agentinputlab/experiments/__init__.py +278 -0
- agentinputlab/experiments/analysis.py +981 -0
- agentinputlab/experiments/artifacts.py +687 -0
- agentinputlab/experiments/automatic_measurement.py +678 -0
- agentinputlab/experiments/auxiliary_matrix.py +203 -0
- agentinputlab/experiments/bindings.py +430 -0
- agentinputlab/experiments/blueprints.py +147 -0
- agentinputlab/experiments/builders/__init__.py +45 -0
- agentinputlab/experiments/builders/executable_external_payload.py +423 -0
- agentinputlab/experiments/builders/external_process_arena.py +1018 -0
- agentinputlab/experiments/builders/registry_intervention.py +463 -0
- agentinputlab/experiments/cli.py +158 -0
- agentinputlab/experiments/controls.py +340 -0
- agentinputlab/experiments/driver_guard.py +205 -0
- agentinputlab/experiments/drivers/__init__.py +89 -0
- agentinputlab/experiments/drivers/external_arena.py +2908 -0
- agentinputlab/experiments/drivers/method_process.py +662 -0
- agentinputlab/experiments/drivers/parity_process.py +1484 -0
- agentinputlab/experiments/drivers/static_production.py +1574 -0
- agentinputlab/experiments/executor.py +448 -0
- agentinputlab/experiments/loader.py +605 -0
- agentinputlab/experiments/measurement.py +675 -0
- agentinputlab/experiments/paper_analysis.py +1818 -0
- agentinputlab/experiments/parity_identity.py +605 -0
- agentinputlab/experiments/plan.py +277 -0
- agentinputlab/experiments/production_builders.py +3739 -0
- agentinputlab/experiments/readiness.py +432 -0
- agentinputlab/experiments/schema.py +514 -0
- agentinputlab/experiments/secrets.py +177 -0
- agentinputlab/experiments/stateful_analysis.py +1738 -0
- agentinputlab/experiments/transfer_analysis.py +1316 -0
- agentinputlab/experiments/unseen_analysis.py +1025 -0
- agentinputlab/integrations/__init__.py +1 -0
- agentinputlab/integrations/action_space/__init__.py +1 -0
- agentinputlab/integrations/external_workers/__init__.py +76 -0
- agentinputlab/integrations/external_workers/ace.py +431 -0
- agentinputlab/integrations/external_workers/base.py +181 -0
- agentinputlab/integrations/external_workers/decomp_live.py +249 -0
- agentinputlab/integrations/external_workers/decomp_planner.py +30 -0
- agentinputlab/integrations/external_workers/infocqr_student.py +280 -0
- agentinputlab/integrations/external_workers/ircot.py +576 -0
- agentinputlab/integrations/external_workers/llmcompiler_live.py +360 -0
- agentinputlab/integrations/external_workers/longllmlingua.py +162 -0
- agentinputlab/integrations/external_workers/method.py +314 -0
- agentinputlab/integrations/external_workers/process.py +678 -0
- agentinputlab/integrations/external_workers/supervisor.py +1071 -0
- agentinputlab/integrations/full_architecture/__init__.py +1 -0
- agentinputlab/integrations/full_architecture/hyde.py +212 -0
- agentinputlab/integrations/full_architecture/plan_and_budget.py +188 -0
- agentinputlab/integrations/live_history.py +222 -0
- agentinputlab/integrations/prompt_optimization/__init__.py +1 -0
- agentinputlab/integrations/training/__init__.py +1 -0
- agentinputlab/metrics/__init__.py +50 -0
- agentinputlab/metrics/catalog.py +313 -0
- agentinputlab/metrics/harm.py +95 -0
- agentinputlab/metrics/paired.py +40 -0
- agentinputlab/metrics/qa.py +76 -0
- agentinputlab/metrics/text.py +33 -0
- agentinputlab/metrics/third_party.py +161 -0
- agentinputlab/models/__init__.py +4 -0
- agentinputlab/observability/__init__.py +56 -0
- agentinputlab/observability/budget.py +316 -0
- agentinputlab/observability/instrumentation.py +754 -0
- agentinputlab/observability/models.py +403 -0
- agentinputlab/observability/monitor.py +380 -0
- agentinputlab/optimizers/__init__.py +1 -0
- agentinputlab/optimizers/clarify/__init__.py +12 -0
- agentinputlab/optimizers/context/__init__.py +22 -0
- agentinputlab/optimizers/decompose/__init__.py +64 -0
- agentinputlab/optimizers/evidence/__init__.py +22 -0
- agentinputlab/optimizers/rewrite/__init__.py +30 -0
- agentinputlab/parity/__init__.py +5 -0
- agentinputlab/parity/base.py +206 -0
- agentinputlab/production_campaign.py +763 -0
- agentinputlab/py.typed +1 -0
- agentinputlab/recipes/__init__.py +333 -0
- agentinputlab/recipes/ace.py +418 -0
- agentinputlab/recipes/ace_bfcl.py +273 -0
- agentinputlab/recipes/ace_common_support.py +169 -0
- agentinputlab/recipes/ace_native_plan.py +322 -0
- agentinputlab/recipes/ace_online.py +711 -0
- agentinputlab/recipes/ace_retrieval.py +330 -0
- agentinputlab/recipes/ace_statebench.py +382 -0
- agentinputlab/recipes/ace_tau.py +463 -0
- agentinputlab/recipes/ace_toolsandbox.py +432 -0
- agentinputlab/recipes/acon_guideline.py +22 -0
- agentinputlab/recipes/adaptive_rag.py +822 -0
- agentinputlab/recipes/llmlingua2_inference.py +146 -0
- agentinputlab/recipes/llmlingua2_training.py +796 -0
- agentinputlab/recipes/mce.py +1486 -0
- agentinputlab/recipes/mce_final.py +335 -0
- agentinputlab/recipes/mce_text_fit.py +499 -0
- agentinputlab/recipes/mce_text_only.py +298 -0
- agentinputlab/recipes/qrag.py +729 -0
- agentinputlab/recipes/qrag_inference.py +364 -0
- agentinputlab/recipes/r2ag_features.py +236 -0
- agentinputlab/recipes/r2ag_inference.py +503 -0
- agentinputlab/recipes/r2ag_training.py +948 -0
- agentinputlab/recipes/recomp_abstractive.py +592 -0
- agentinputlab/recipes/recomp_extractive.py +525 -0
- agentinputlab/recipes/reformer.py +17 -0
- agentinputlab/recipes/rqrag.py +1516 -0
- agentinputlab/recipes/rqrag_common_support.py +193 -0
- agentinputlab/recipes/rqrag_completion.py +147 -0
- agentinputlab/recipes/skillopt.py +462 -0
- agentinputlab/recipes/skillopt_common_support.py +154 -0
- agentinputlab/recipes/skillopt_environment.py +165 -0
- agentinputlab/recipes/skillopt_environment_cli.py +5 -0
- agentinputlab/recipes/skillopt_retrieval.py +188 -0
- agentinputlab/recipes/smartsearch.py +897 -0
- agentinputlab/recipes/smartsearch_curriculum.py +283 -0
- agentinputlab/recipes/smartsearch_grpo_contracts.py +58 -0
- agentinputlab/recipes/smartsearch_grpo_data.py +314 -0
- agentinputlab/recipes/smartsearch_grpo_meter.py +324 -0
- agentinputlab/recipes/smartsearch_grpo_prefix.py +144 -0
- agentinputlab/recipes/smartsearch_grpo_rollout.py +119 -0
- agentinputlab/recipes/smartsearch_grpo_tools.py +364 -0
- agentinputlab/recipes/smartsearch_grpo_training.py +305 -0
- agentinputlab/recipes/smartsearch_grpo_transport.py +248 -0
- agentinputlab/recipes/smartsearch_grpo_worker.py +364 -0
- agentinputlab/recipes/smartsearch_inference.py +524 -0
- agentinputlab/recipes/smartsearch_native_data.py +172 -0
- agentinputlab/recipes/smartsearch_policy.py +616 -0
- agentinputlab/recipes/smartsearch_policy_worker.py +9 -0
- agentinputlab/recipes/smartsearch_sampling.py +232 -0
- agentinputlab/recipes/smartsearch_teacher.py +203 -0
- agentinputlab/recipes/smartsearch_training.py +265 -0
- agentinputlab/registry/__init__.py +46 -0
- agentinputlab/registry/beta.py +727 -0
- agentinputlab/registry/data/algorithms.json +1959 -0
- agentinputlab/registry/data/auxiliary_method_profiles.json +34 -0
- agentinputlab/registry/loader.py +100 -0
- agentinputlab/registry/result_manifest.py +184 -0
- agentinputlab/registry/runtime.py +195 -0
- agentinputlab/registry/schema.py +449 -0
- agentinputlab/runner/__init__.py +30 -0
- agentinputlab/runner/balance.py +248 -0
- agentinputlab/runner/cache.py +135 -0
- agentinputlab/runner/composite.py +130 -0
- agentinputlab/runner/engine.py +285 -0
- agentinputlab/runner/runtime_guard.py +268 -0
- agentinputlab/runner/worker.py +80 -0
- agentinputlab/runtime_bootstrap.py +288 -0
- agentinputlab/selectors/__init__.py +196 -0
- agentinputlab/selectors/advanced.py +1514 -0
- agentinputlab/selectors/artifacts.py +1087 -0
- agentinputlab/selectors/base.py +112 -0
- agentinputlab/selectors/campaigns.py +1893 -0
- agentinputlab/selectors/catalog.py +86 -0
- agentinputlab/selectors/discovery.py +1860 -0
- agentinputlab/selectors/evaluation.py +1348 -0
- agentinputlab/selectors/features.py +383 -0
- agentinputlab/selectors/learned.py +502 -0
- agentinputlab/selectors/no_op.py +28 -0
- agentinputlab/selectors/outcome_table.py +475 -0
- agentinputlab/selectors/producer.py +853 -0
- agentinputlab/selectors/rules.py +109 -0
- agentinputlab/selectors/runtime.py +420 -0
- agentinputlab/studies/__init__.py +16 -0
- agentinputlab/studies/design.py +165 -0
- agentinputlab/studies/paired.py +322 -0
- agentinputlab/studio/__init__.py +6 -0
- agentinputlab/studio/campaigns.py +819 -0
- agentinputlab/studio/engine.py +1408 -0
- agentinputlab/studio/model_backends.py +425 -0
- agentinputlab/studio/prepared.py +410 -0
- agentinputlab/studio/server.py +613 -0
- agentinputlab/studio/static/app.js +397 -0
- agentinputlab/studio/static/campaigns.html +175 -0
- agentinputlab/studio/static/campaigns.js +426 -0
- agentinputlab/studio/static/index.html +192 -0
- agentinputlab/studio/static/result.html +103 -0
- agentinputlab/studio/static/result.js +273 -0
- agentinputlab/studio/static/styles.css +467 -0
- agentinputlab-0.1.0a1.data/data/share/agentinputlab/CITATION.cff +22 -0
- agentinputlab-0.1.0a1.dist-info/METADATA +392 -0
- agentinputlab-0.1.0a1.dist-info/RECORD +469 -0
- agentinputlab-0.1.0a1.dist-info/WHEEL +5 -0
- agentinputlab-0.1.0a1.dist-info/entry_points.txt +6 -0
- agentinputlab-0.1.0a1.dist-info/licenses/LICENSE +21 -0
- agentinputlab-0.1.0a1.dist-info/licenses/NOTICE +31 -0
- agentinputlab-0.1.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +94 -0
- agentinputlab-0.1.0a1.dist-info/top_level.txt +2 -0
- workers/README.md +94 -0
- workers/ace/README.md +261 -0
- workers/ace/__init__.py +1 -0
- workers/ace/compatibility_manifest.json +39 -0
- workers/ace/driver.py +1682 -0
- workers/acon/README.md +215 -0
- workers/acon/__init__.py +5 -0
- workers/acon/compatibility_manifest.json +93 -0
- workers/acon/driver.py +1859 -0
- workers/acon/fitted.py +395 -0
- workers/acon/guideline.py +470 -0
- workers/acon/guideline_source_manifest.json +20 -0
- workers/adaptive_rag/README.md +96 -0
- workers/adaptive_rag/__init__.py +15 -0
- workers/adaptive_rag/compatibility_manifest.json +61 -0
- workers/adaptive_rag/driver.py +1470 -0
- workers/adaptive_rag/fixture_runtime.py +163 -0
- workers/adaptive_rag/runtime.py +252 -0
- workers/ask_or_assume/README.md +124 -0
- workers/ask_or_assume/__init__.py +1 -0
- workers/ask_or_assume/compatibility_manifest.json +36 -0
- workers/ask_or_assume/driver.py +1227 -0
- workers/decomp/README.md +133 -0
- workers/decomp/UPSTREAM_LICENSE.Apache-2.0.txt +201 -0
- workers/decomp/__init__.py +5 -0
- workers/decomp/compatibility_manifest.json +205 -0
- workers/decomp/driver.py +1015 -0
- workers/decomp/live.py +137 -0
- workers/decomp/runtime.py +231 -0
- workers/infocqr/README.md +106 -0
- workers/infocqr/__init__.py +1 -0
- workers/infocqr/compatibility_manifest.json +84 -0
- workers/infocqr/driver.py +1766 -0
- workers/ircot/README.md +167 -0
- workers/ircot/__init__.py +7 -0
- workers/ircot/compatibility_manifest.json +121 -0
- workers/ircot/controlled.py +457 -0
- workers/ircot/driver.py +1373 -0
- workers/ircot/fixture_bindings.json +39 -0
- workers/ircot/fixture_config.json +48 -0
- workers/ircot/fixture_prompt.txt +2 -0
- workers/ircot/native_qa.py +398 -0
- workers/ircot/qa_compatibility_manifest.json +57 -0
- workers/ircot/runtime.py +97 -0
- workers/llmcompiler/README.md +160 -0
- workers/llmcompiler/__init__.py +1 -0
- workers/llmcompiler/compatibility_manifest.json +45 -0
- workers/llmcompiler/driver.py +1514 -0
- workers/llmcompiler/export_prompts.py +74 -0
- workers/llmcompiler/live.py +174 -0
- workers/llmcompiler/patch_manifest.json +147 -0
- workers/mce/README.md +198 -0
- workers/mce/__init__.py +29 -0
- workers/mce/compatibility_manifest.json +115 -0
- workers/mce/driver.py +2585 -0
- workers/mce/final_eval.py +173 -0
- workers/official_arenas/README.md +25 -0
- workers/official_arenas/__init__.py +1 -0
- workers/official_arenas/capture_records.py +110 -0
- workers/official_arenas/driver.py +619 -0
- workers/official_arenas/protocol.py +334 -0
- workers/official_arenas/providers/__init__.py +1 -0
- workers/official_arenas/providers/_live_history.py +228 -0
- workers/official_arenas/providers/_message_compat.py +77 -0
- workers/official_arenas/providers/appworld_ul.py +196 -0
- workers/official_arenas/providers/fixture.py +112 -0
- workers/official_arenas/providers/statebench.py +960 -0
- workers/official_arenas/providers/tau3.py +1672 -0
- workers/official_arenas/providers/tau_retail.py +586 -0
- workers/official_arenas/providers/toolsandbox.py +1321 -0
- workers/official_arenas/providers/tooltalk.py +699 -0
- workers/official_arenas/retail_capture.py +188 -0
- workers/official_arenas/retail_driver.py +275 -0
- workers/qrag/README.md +172 -0
- workers/qrag/__init__.py +1 -0
- workers/qrag/compatibility_manifest.json +64 -0
- workers/qrag/driver.py +673 -0
- workers/r2ag/README.md +154 -0
- workers/r2ag/__init__.py +5 -0
- workers/r2ag/compatibility_manifest.json +55 -0
- workers/r2ag/driver.py +1287 -0
- workers/r2ag/feature_schema.json +8 -0
- workers/r2ag/runtime.py +589 -0
- workers/recomp/README.md +120 -0
- workers/recomp/__init__.py +1 -0
- workers/recomp/compatibility_manifest.json +43 -0
- workers/recomp/driver.py +1653 -0
- workers/reformer/README.md +125 -0
- workers/reformer/__init__.py +1 -0
- workers/reformer/compatibility_manifest.json +68 -0
- workers/reformer/driver.py +1459 -0
- workers/reformer/induction.py +457 -0
- workers/rrr/README.md +126 -0
- workers/rrr/__init__.py +1 -0
- workers/rrr/compatibility_manifest.json +57 -0
- workers/rrr/driver.py +1133 -0
- workers/smartsearch/README.md +331 -0
- workers/smartsearch/__init__.py +1 -0
- workers/smartsearch/compatibility_manifest.json +41 -0
- workers/smartsearch/driver.py +1643 -0
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
"""Pinned native RECOMP seq2seq training and a closed, safe candidate artifact.
|
|
2
|
+
|
|
3
|
+
The upstream Trainer owns tokenization, loss, optimizer and training/evaluation.
|
|
4
|
+
Observers only record events. Run each fit in a dedicated process.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import importlib.metadata
|
|
10
|
+
import json
|
|
11
|
+
import math
|
|
12
|
+
import os
|
|
13
|
+
import runpy
|
|
14
|
+
import sys
|
|
15
|
+
import time
|
|
16
|
+
from collections.abc import Mapping
|
|
17
|
+
from contextlib import contextmanager, redirect_stderr, redirect_stdout
|
|
18
|
+
from dataclasses import asdict, dataclass
|
|
19
|
+
from pathlib import Path, PurePosixPath
|
|
20
|
+
|
|
21
|
+
from agentinputlab.artifacts import load_pinned_json_mapping
|
|
22
|
+
from agentinputlab.contracts import ExternalDependencyError, ValidationError
|
|
23
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
24
|
+
|
|
25
|
+
from .recomp_extractive import _LOCK, _regular, _save, _scope, _sha
|
|
26
|
+
|
|
27
|
+
RELEASE = "training.recomp.abstractive"
|
|
28
|
+
PROTOCOL = "agentinputlab.recomp.pinned_seq2seq_fit.v1"
|
|
29
|
+
SCRIPT = "train_hf_summarization_model.py"
|
|
30
|
+
SCRIPT_SHA256 = "0d89514a5f73f06f0f420b4274960871d8ae403877fe1e2865b7a3cb73e91c5d"
|
|
31
|
+
_NLTK_REQUIRED = frozenset(
|
|
32
|
+
{
|
|
33
|
+
"tokenizers/punkt/english.pickle",
|
|
34
|
+
"tokenizers/punkt/PY3/english.pickle",
|
|
35
|
+
"tokenizers/punkt_tab/english/abbrev_types.txt",
|
|
36
|
+
"tokenizers/punkt_tab/english/collocations.tab",
|
|
37
|
+
"tokenizers/punkt_tab/english/ortho_context.tab",
|
|
38
|
+
"tokenizers/punkt_tab/english/sent_starters.txt",
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
_DEPENDENCIES = {
|
|
42
|
+
"transformers": "4.24.0",
|
|
43
|
+
"tokenizers": "0.13.2",
|
|
44
|
+
"numpy": "1.26.4",
|
|
45
|
+
"datasets": "2.14.7",
|
|
46
|
+
"pyarrow": "14.0.2",
|
|
47
|
+
"fsspec": "2023.10.0",
|
|
48
|
+
"huggingface-hub": "0.19.4",
|
|
49
|
+
"nltk": "3.9.2",
|
|
50
|
+
"rouge": "1.0.1",
|
|
51
|
+
"safetensors": "0.5.3",
|
|
52
|
+
"sentencepiece": "0.2.1",
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass(frozen=True, slots=True)
|
|
57
|
+
class RECOMPAbstractiveFitControls:
|
|
58
|
+
epochs: float = 3.0
|
|
59
|
+
batch_size: int = 2
|
|
60
|
+
eval_batch_size: int = 2
|
|
61
|
+
gradient_accumulation_steps: int = 1
|
|
62
|
+
learning_rate: float = 5e-5
|
|
63
|
+
max_source_length: int = 1024
|
|
64
|
+
max_target_length: int = 512
|
|
65
|
+
max_steps: int | None = None
|
|
66
|
+
max_optimizer_steps: int = 10000
|
|
67
|
+
max_data_bytes: int = 64 * 1024 * 1024
|
|
68
|
+
seed: int = 17
|
|
69
|
+
device: str = "cpu"
|
|
70
|
+
|
|
71
|
+
def __post_init__(self):
|
|
72
|
+
for name in (
|
|
73
|
+
"batch_size",
|
|
74
|
+
"eval_batch_size",
|
|
75
|
+
"gradient_accumulation_steps",
|
|
76
|
+
"max_source_length",
|
|
77
|
+
"max_target_length",
|
|
78
|
+
"max_optimizer_steps",
|
|
79
|
+
"max_data_bytes",
|
|
80
|
+
"seed",
|
|
81
|
+
):
|
|
82
|
+
value = getattr(self, name)
|
|
83
|
+
if type(value) is not int or value < (0 if name == "seed" else 1):
|
|
84
|
+
raise ValidationError(f"RECOMP seq2seq {name} must be an integer in range")
|
|
85
|
+
for name in ("epochs", "learning_rate"):
|
|
86
|
+
value = getattr(self, name)
|
|
87
|
+
if type(value) not in (int, float) or not math.isfinite(value) or value <= 0:
|
|
88
|
+
raise ValidationError(f"RECOMP seq2seq {name} must be finite and positive")
|
|
89
|
+
if self.max_steps is not None and (type(self.max_steps) is not int or self.max_steps < 1):
|
|
90
|
+
raise ValidationError("RECOMP max_steps must be a positive explicit bound")
|
|
91
|
+
if self.max_target_length > 512 or self.device not in {"cpu", "cuda"}:
|
|
92
|
+
raise ValidationError("RECOMP target cap must be <=512 and device cpu or cuda")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _records(path):
|
|
96
|
+
text = path.read_text(encoding="utf-8")
|
|
97
|
+
try:
|
|
98
|
+
rows = (
|
|
99
|
+
json.loads(text)
|
|
100
|
+
if text.lstrip().startswith("[")
|
|
101
|
+
else [json.loads(line) for line in text.splitlines() if line.strip()]
|
|
102
|
+
)
|
|
103
|
+
except (ValueError, UnicodeError) as exc:
|
|
104
|
+
raise ValidationError("RECOMP seq2seq data requires native JSON/JSONLines records") from exc
|
|
105
|
+
if not isinstance(rows, list) or not rows:
|
|
106
|
+
raise ValidationError("RECOMP seq2seq data requires non-empty records")
|
|
107
|
+
return rows
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def audit_recomp_seq2seq_data(train_file, dev_file, controls):
|
|
111
|
+
"""Keep original summaries (including blanks); never infer labels from tests."""
|
|
112
|
+
evidence, queries = {}, {}
|
|
113
|
+
paths = {
|
|
114
|
+
name: _regular(path, name) for name, path in (("train", train_file), ("dev", dev_file))
|
|
115
|
+
}
|
|
116
|
+
if paths["train"] == paths["dev"]:
|
|
117
|
+
raise ValidationError("RECOMP train and dev files must differ")
|
|
118
|
+
for split, path in paths.items():
|
|
119
|
+
if path.suffix != ".json" or path.stat().st_size > controls.max_data_bytes:
|
|
120
|
+
raise ValidationError(
|
|
121
|
+
"RECOMP native .json data exceeds its declared byte cap or suffix"
|
|
122
|
+
)
|
|
123
|
+
rows = _records(path)
|
|
124
|
+
unique = set()
|
|
125
|
+
for row in rows:
|
|
126
|
+
if (
|
|
127
|
+
not isinstance(row, dict)
|
|
128
|
+
or any(
|
|
129
|
+
not isinstance(row.get(key), str) or "\x00" in row[key]
|
|
130
|
+
for key in ("question", "passages", "summary")
|
|
131
|
+
)
|
|
132
|
+
or not row["question"].strip()
|
|
133
|
+
):
|
|
134
|
+
raise ValidationError(
|
|
135
|
+
"RECOMP native records require question/passages/summary text"
|
|
136
|
+
)
|
|
137
|
+
unique.add(" ".join(row["question"].casefold().split()))
|
|
138
|
+
queries[split] = unique
|
|
139
|
+
evidence[split] = dict(
|
|
140
|
+
path=str(path),
|
|
141
|
+
sha256=_sha(path),
|
|
142
|
+
rows=len(rows),
|
|
143
|
+
blank_summary_rows=sum(not row["summary"].strip() for row in rows),
|
|
144
|
+
query_set_sha256=content_hash(sorted(unique)),
|
|
145
|
+
)
|
|
146
|
+
if queries["train"] & queries["dev"]:
|
|
147
|
+
raise ValidationError("RECOMP train/dev query overlap is not permitted")
|
|
148
|
+
batches = math.ceil(evidence["train"]["rows"] / controls.batch_size)
|
|
149
|
+
# Exact HF 4.24 single-process Trainer scheduling rule, not data truncation.
|
|
150
|
+
updates = max(batches // controls.gradient_accumulation_steps, 1)
|
|
151
|
+
steps = controls.max_steps or math.ceil(controls.epochs * updates)
|
|
152
|
+
if steps > controls.max_optimizer_steps:
|
|
153
|
+
raise ValidationError("RECOMP native optimizer plan exceeds its explicit step cap")
|
|
154
|
+
return dict(
|
|
155
|
+
files=evidence,
|
|
156
|
+
planned_optimizer_steps=steps,
|
|
157
|
+
query_overlap=False,
|
|
158
|
+
native_blank_summaries_preserved=True,
|
|
159
|
+
source_rows_not_rewritten=True,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def validate_recomp_nltk_assets(root, manifest, expected_sha256):
|
|
164
|
+
supplied = Path(root).expanduser()
|
|
165
|
+
if supplied.is_symlink() or not supplied.is_dir():
|
|
166
|
+
raise ValidationError("RECOMP NLTK root requires real user-mounted resources")
|
|
167
|
+
folder = supplied.resolve()
|
|
168
|
+
metadata = load_pinned_json_mapping(manifest, expected_sha256=expected_sha256)
|
|
169
|
+
files = metadata.get("files")
|
|
170
|
+
if (
|
|
171
|
+
metadata.get("schema") != "agentinputlab.recomp.seq2seq.nltk.v1"
|
|
172
|
+
or not isinstance(files, dict)
|
|
173
|
+
or not set(files) >= _NLTK_REQUIRED
|
|
174
|
+
):
|
|
175
|
+
raise ValidationError("RECOMP NLTK manifest omits genuine English resources")
|
|
176
|
+
for relative, digest in files.items():
|
|
177
|
+
path = PurePosixPath(relative)
|
|
178
|
+
if path.is_absolute() or str(path) != relative or ".." in path.parts or not path.parts:
|
|
179
|
+
raise ValidationError("RECOMP NLTK resource paths must be canonical and relative")
|
|
180
|
+
target = _regular(folder / relative, "NLTK resource")
|
|
181
|
+
if not target.is_relative_to(folder) or _sha(target) != digest:
|
|
182
|
+
raise ValidationError("RECOMP NLTK resource hash or containment differs")
|
|
183
|
+
return folder
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@contextmanager
|
|
187
|
+
def _native_observers(observed):
|
|
188
|
+
import torch
|
|
189
|
+
import transformers
|
|
190
|
+
from transformers import Seq2SeqTrainer
|
|
191
|
+
|
|
192
|
+
originals = {kind: kind.step for kind in {torch.optim.AdamW, transformers.AdamW}}
|
|
193
|
+
original_init, original_loss = Seq2SeqTrainer.__init__, Seq2SeqTrainer.compute_loss
|
|
194
|
+
owned_loss = "compute_loss" in Seq2SeqTrainer.__dict__
|
|
195
|
+
original_generate = transformers.PreTrainedModel.generate
|
|
196
|
+
|
|
197
|
+
def init(trainer, *args, **kwargs):
|
|
198
|
+
original_init(trainer, *args, **kwargs)
|
|
199
|
+
observed["trainer"] = trainer
|
|
200
|
+
|
|
201
|
+
def loss(trainer, model, inputs, *args, **kwargs):
|
|
202
|
+
labels = inputs.get("labels")
|
|
203
|
+
label_tokens = int((labels != -100).sum().item()) if labels is not None else 0
|
|
204
|
+
value = original_loss(trainer, model, inputs, *args, **kwargs)
|
|
205
|
+
tensor = value[0] if isinstance(value, tuple) else value
|
|
206
|
+
observed["loss_events"].append(
|
|
207
|
+
dict(
|
|
208
|
+
loss=float(tensor.detach().cpu()),
|
|
209
|
+
gradient_enabled=torch.is_grad_enabled(),
|
|
210
|
+
label_tokens=label_tokens,
|
|
211
|
+
padded_input_tokens=int(inputs["input_ids"].numel()),
|
|
212
|
+
)
|
|
213
|
+
)
|
|
214
|
+
return value
|
|
215
|
+
|
|
216
|
+
def generate(model, *args, **kwargs):
|
|
217
|
+
observed["model_generate_calls"] += 1
|
|
218
|
+
return original_generate(model, *args, **kwargs)
|
|
219
|
+
|
|
220
|
+
def step(original):
|
|
221
|
+
def wrapped(optimizer, *args, **kwargs):
|
|
222
|
+
result = original(optimizer, *args, **kwargs)
|
|
223
|
+
observed["optimizer_steps"] += 1
|
|
224
|
+
return result
|
|
225
|
+
|
|
226
|
+
return wrapped
|
|
227
|
+
|
|
228
|
+
Seq2SeqTrainer.__init__, Seq2SeqTrainer.compute_loss = init, loss
|
|
229
|
+
transformers.PreTrainedModel.generate = generate
|
|
230
|
+
for kind, original in originals.items():
|
|
231
|
+
kind.step = step(original)
|
|
232
|
+
try:
|
|
233
|
+
yield
|
|
234
|
+
finally:
|
|
235
|
+
Seq2SeqTrainer.__init__ = original_init
|
|
236
|
+
if owned_loss:
|
|
237
|
+
Seq2SeqTrainer.compute_loss = original_loss
|
|
238
|
+
else:
|
|
239
|
+
del Seq2SeqTrainer.compute_loss
|
|
240
|
+
transformers.PreTrainedModel.generate = original_generate
|
|
241
|
+
for kind, original in originals.items():
|
|
242
|
+
kind.step = original
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
@dataclass(frozen=True, slots=True)
|
|
246
|
+
class RECOMPTrainedSeq2SeqArtifact:
|
|
247
|
+
root: Path
|
|
248
|
+
artifact_id: str
|
|
249
|
+
checkpoint_revision: str
|
|
250
|
+
tokenizer_revision: str
|
|
251
|
+
manifest_sha256: str
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
def checkpoint(self):
|
|
255
|
+
return self.root / "checkpoint"
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def checkpoint_manifest(self):
|
|
259
|
+
return self.root / "checkpoint-manifest.json"
|
|
260
|
+
|
|
261
|
+
@classmethod
|
|
262
|
+
def load(cls, root):
|
|
263
|
+
from workers.recomp.driver import verify_checkpoint
|
|
264
|
+
|
|
265
|
+
supplied = Path(root).expanduser()
|
|
266
|
+
if supplied.is_symlink() or not supplied.is_dir():
|
|
267
|
+
raise ValidationError("RECOMP trained seq2seq artifact root is invalid")
|
|
268
|
+
folder = supplied.resolve()
|
|
269
|
+
metadata_path = _regular(folder / "artifact.json", "artifact")
|
|
270
|
+
terminal_path = _regular(folder / "fit-terminal.json", "fit terminal")
|
|
271
|
+
plan_path = _regular(folder / "fit-plan.json", "fit plan")
|
|
272
|
+
metadata, terminal = (
|
|
273
|
+
json.loads(metadata_path.read_text()),
|
|
274
|
+
json.loads(terminal_path.read_text()),
|
|
275
|
+
)
|
|
276
|
+
if not isinstance(metadata, dict) or not isinstance(terminal, dict):
|
|
277
|
+
raise ValidationError("RECOMP seq2seq artifact metadata is malformed")
|
|
278
|
+
identity = metadata.pop("artifact_id", None)
|
|
279
|
+
if (
|
|
280
|
+
identity != content_hash(metadata)
|
|
281
|
+
or metadata.get("release_id") != RELEASE
|
|
282
|
+
or metadata.get("protocol") != PROTOCOL
|
|
283
|
+
or metadata.get("fit_terminal_sha256") != _sha(terminal_path)
|
|
284
|
+
or metadata.get("fit_plan_sha256") != _sha(plan_path)
|
|
285
|
+
or terminal.get("status") != "trained_candidate"
|
|
286
|
+
or terminal.get("optimizer_steps", 0) < 1
|
|
287
|
+
or terminal.get("changed_parameter_tensors", 0) < 1
|
|
288
|
+
):
|
|
289
|
+
raise ValidationError("RECOMP seq2seq artifact identity or terminal is invalid")
|
|
290
|
+
checkpoint = verify_checkpoint(folder / "checkpoint", folder / "checkpoint-manifest.json")
|
|
291
|
+
if checkpoint.mode != "abstractive" or checkpoint.manifest_sha256 != metadata.get(
|
|
292
|
+
"checkpoint_manifest_sha256"
|
|
293
|
+
):
|
|
294
|
+
raise ValidationError("RECOMP trained seq2seq checkpoint closure differs")
|
|
295
|
+
return cls(
|
|
296
|
+
folder,
|
|
297
|
+
identity,
|
|
298
|
+
checkpoint.checkpoint_revision,
|
|
299
|
+
checkpoint.tokenizer_revision,
|
|
300
|
+
checkpoint.manifest_sha256,
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
def inference_parameters(self):
|
|
304
|
+
from workers.recomp.driver import ABSTRACTIVE_INPUT_TEMPLATE_SHA256
|
|
305
|
+
|
|
306
|
+
current = self.load(self.root)
|
|
307
|
+
return dict(
|
|
308
|
+
checkpoint_revision=current.checkpoint_revision,
|
|
309
|
+
tokenizer_revision=current.tokenizer_revision,
|
|
310
|
+
asset_manifest_hash=current.manifest_sha256,
|
|
311
|
+
input_template_hash=ABSTRACTIVE_INPUT_TEMPLATE_SHA256,
|
|
312
|
+
asset_license_acknowledged=True,
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
class RECOMPAbstractiveTraining:
|
|
317
|
+
release_id = RELEASE
|
|
318
|
+
|
|
319
|
+
def __init__(self, controls=None):
|
|
320
|
+
self.controls = (
|
|
321
|
+
RECOMPAbstractiveFitControls(**controls)
|
|
322
|
+
if isinstance(controls, Mapping)
|
|
323
|
+
else controls or RECOMPAbstractiveFitControls()
|
|
324
|
+
)
|
|
325
|
+
if not isinstance(self.controls, RECOMPAbstractiveFitControls):
|
|
326
|
+
raise ValidationError("RECOMP seq2seq fit requires typed controls")
|
|
327
|
+
|
|
328
|
+
def fit(
|
|
329
|
+
self,
|
|
330
|
+
*,
|
|
331
|
+
checkout,
|
|
332
|
+
initial_checkpoint,
|
|
333
|
+
initial_checkpoint_manifest,
|
|
334
|
+
train_file,
|
|
335
|
+
dev_file,
|
|
336
|
+
nltk_root,
|
|
337
|
+
nltk_manifest,
|
|
338
|
+
nltk_manifest_sha256,
|
|
339
|
+
output_root,
|
|
340
|
+
source_and_asset_acknowledged=False,
|
|
341
|
+
):
|
|
342
|
+
from workers.recomp.driver import verify_checkout, verify_checkpoint
|
|
343
|
+
|
|
344
|
+
if source_and_asset_acknowledged is not True:
|
|
345
|
+
raise ValidationError(
|
|
346
|
+
"RECOMP fit needs explicit acknowledgement of local source/model/data assets"
|
|
347
|
+
)
|
|
348
|
+
source = Path(checkout).expanduser()
|
|
349
|
+
if source.is_symlink():
|
|
350
|
+
raise ValidationError("RECOMP training checkout must not be a symlink")
|
|
351
|
+
checked = verify_checkout(source)
|
|
352
|
+
script = _regular(checked.root / SCRIPT, "seq2seq training script")
|
|
353
|
+
if _sha(script) != SCRIPT_SHA256:
|
|
354
|
+
raise ExternalDependencyError("RECOMP pinned seq2seq source differs")
|
|
355
|
+
initial = verify_checkpoint(Path(initial_checkpoint), Path(initial_checkpoint_manifest))
|
|
356
|
+
if initial.mode != "abstractive":
|
|
357
|
+
raise ValidationError("RECOMP seq2seq training requires an abstractive initialization")
|
|
358
|
+
c = self.controls
|
|
359
|
+
audit = audit_recomp_seq2seq_data(train_file, dev_file, c)
|
|
360
|
+
resources = validate_recomp_nltk_assets(nltk_root, nltk_manifest, nltk_manifest_sha256)
|
|
361
|
+
versions = {name: importlib.metadata.version(name) for name in ("torch", *_DEPENDENCIES)}
|
|
362
|
+
if versions["torch"] not in {"1.13.0", "1.13.0+cpu", "1.13.0+cu117"} or any(
|
|
363
|
+
versions[n] != v for n, v in _DEPENDENCIES.items()
|
|
364
|
+
):
|
|
365
|
+
raise ExternalDependencyError(
|
|
366
|
+
"RECOMP seq2seq fit requires documented isolated dependency versions"
|
|
367
|
+
)
|
|
368
|
+
if os.environ.get("WORLD_SIZE", "1") != "1":
|
|
369
|
+
raise ValidationError("RECOMP bounded recipe requires a single-process fit")
|
|
370
|
+
import torch
|
|
371
|
+
|
|
372
|
+
if c.device == "cuda" and (not torch.cuda.is_available() or torch.cuda.device_count() != 1):
|
|
373
|
+
raise ExternalDependencyError(
|
|
374
|
+
"RECOMP CUDA fit requires one operator-selected visible device"
|
|
375
|
+
)
|
|
376
|
+
root = Path(output_root).expanduser()
|
|
377
|
+
if root.exists() or root.is_symlink():
|
|
378
|
+
raise ValidationError(
|
|
379
|
+
"RECOMP fit output must be create-only; do not repeat consumed attempts"
|
|
380
|
+
)
|
|
381
|
+
root = root.absolute()
|
|
382
|
+
root.mkdir(parents=True)
|
|
383
|
+
command = [
|
|
384
|
+
str(script),
|
|
385
|
+
"--model_name_or_path",
|
|
386
|
+
str(initial.root),
|
|
387
|
+
"--train_file",
|
|
388
|
+
audit["files"]["train"]["path"],
|
|
389
|
+
"--validation_file",
|
|
390
|
+
audit["files"]["dev"]["path"],
|
|
391
|
+
"--text_column",
|
|
392
|
+
"passages",
|
|
393
|
+
"--summary_column",
|
|
394
|
+
"summary",
|
|
395
|
+
"--output_dir",
|
|
396
|
+
str(root / "native"),
|
|
397
|
+
"--cache_dir",
|
|
398
|
+
str(root / "dataset-cache"),
|
|
399
|
+
"--do_train",
|
|
400
|
+
"--do_eval",
|
|
401
|
+
"--predict_with_generate",
|
|
402
|
+
"False",
|
|
403
|
+
"--num_train_epochs",
|
|
404
|
+
str(c.epochs),
|
|
405
|
+
"--per_device_train_batch_size",
|
|
406
|
+
str(c.batch_size),
|
|
407
|
+
"--per_device_eval_batch_size",
|
|
408
|
+
str(c.eval_batch_size),
|
|
409
|
+
"--gradient_accumulation_steps",
|
|
410
|
+
str(c.gradient_accumulation_steps),
|
|
411
|
+
"--learning_rate",
|
|
412
|
+
str(c.learning_rate),
|
|
413
|
+
"--max_source_length",
|
|
414
|
+
str(c.max_source_length),
|
|
415
|
+
"--max_target_length",
|
|
416
|
+
str(c.max_target_length),
|
|
417
|
+
"--seed",
|
|
418
|
+
str(c.seed),
|
|
419
|
+
"--report_to",
|
|
420
|
+
"none",
|
|
421
|
+
"--save_strategy",
|
|
422
|
+
"no",
|
|
423
|
+
"--evaluation_strategy",
|
|
424
|
+
"no",
|
|
425
|
+
"--logging_steps",
|
|
426
|
+
"1",
|
|
427
|
+
"--dataloader_num_workers",
|
|
428
|
+
"0",
|
|
429
|
+
"--no_cuda",
|
|
430
|
+
str(c.device == "cpu"),
|
|
431
|
+
]
|
|
432
|
+
if c.max_steps is not None:
|
|
433
|
+
command.extend(("--max_steps", str(c.max_steps)))
|
|
434
|
+
plan = dict(
|
|
435
|
+
protocol=PROTOCOL,
|
|
436
|
+
release_id=RELEASE,
|
|
437
|
+
controls=asdict(c),
|
|
438
|
+
split_audit=audit,
|
|
439
|
+
source_commit=checked.manifest["upstream"]["commit"],
|
|
440
|
+
source_script_sha256=_sha(script),
|
|
441
|
+
compatibility_manifest_sha256=checked.manifest_sha256,
|
|
442
|
+
initial_manifest_sha256=initial.manifest_sha256,
|
|
443
|
+
initial_tree_sha256=initial.tree_sha256,
|
|
444
|
+
nltk_manifest_sha256=nltk_manifest_sha256,
|
|
445
|
+
dependency_versions=versions,
|
|
446
|
+
native_argv=command,
|
|
447
|
+
initialization_is_user_selected_not_claimed_original_paper_base=True,
|
|
448
|
+
automatic_retry=False,
|
|
449
|
+
)
|
|
450
|
+
_save(root / "fit-plan.json", plan)
|
|
451
|
+
observed = dict(optimizer_steps=0, loss_events=[], model_generate_calls=0)
|
|
452
|
+
started, cpu = time.monotonic(), time.process_time()
|
|
453
|
+
try:
|
|
454
|
+
with _LOCK, _scope(root, c.seed):
|
|
455
|
+
import nltk
|
|
456
|
+
from safetensors.torch import load_file, save_file
|
|
457
|
+
|
|
458
|
+
previous_paths = nltk.data.path[:]
|
|
459
|
+
overrides = dict(
|
|
460
|
+
NLTK_DATA=str(resources),
|
|
461
|
+
HF_DATASETS_OFFLINE="1",
|
|
462
|
+
HF_HUB_DISABLE_TELEMETRY="1",
|
|
463
|
+
WANDB_DISABLED="true",
|
|
464
|
+
)
|
|
465
|
+
previous_env = {name: os.environ.get(name) for name in overrides}
|
|
466
|
+
nltk.data.path.insert(0, str(resources))
|
|
467
|
+
os.environ.update(overrides)
|
|
468
|
+
try:
|
|
469
|
+
sys.argv[:] = command
|
|
470
|
+
with (
|
|
471
|
+
_native_observers(observed),
|
|
472
|
+
(root / "native-training.log").open("x") as log,
|
|
473
|
+
redirect_stdout(log),
|
|
474
|
+
redirect_stderr(log),
|
|
475
|
+
):
|
|
476
|
+
runpy.run_path(str(script), run_name="__main__")
|
|
477
|
+
finally:
|
|
478
|
+
nltk.data.path[:] = previous_paths
|
|
479
|
+
for name, value in previous_env.items():
|
|
480
|
+
if value is None:
|
|
481
|
+
os.environ.pop(name, None)
|
|
482
|
+
else:
|
|
483
|
+
os.environ[name] = value
|
|
484
|
+
trainer = observed.pop("trainer")
|
|
485
|
+
if (
|
|
486
|
+
observed["optimizer_steps"] != audit["planned_optimizer_steps"]
|
|
487
|
+
or trainer.state.global_step != observed["optimizer_steps"]
|
|
488
|
+
):
|
|
489
|
+
raise ValidationError(
|
|
490
|
+
"RECOMP actual native optimizer steps differ from its bounded plan"
|
|
491
|
+
)
|
|
492
|
+
if not observed["loss_events"] or not all(
|
|
493
|
+
math.isfinite(event["loss"]) for event in observed["loss_events"]
|
|
494
|
+
):
|
|
495
|
+
raise ValidationError("RECOMP native loss is absent or non-finite")
|
|
496
|
+
if observed["model_generate_calls"]:
|
|
497
|
+
raise ValidationError(
|
|
498
|
+
"RECOMP teacher-forced fit unexpectedly generated answers"
|
|
499
|
+
)
|
|
500
|
+
history = trainer.state.log_history
|
|
501
|
+
initial_tensors = load_file(str(initial.root / "model.safetensors"), device="cpu")
|
|
502
|
+
trained = {
|
|
503
|
+
name: value.detach().cpu().contiguous().clone()
|
|
504
|
+
for name, value in trainer.model.state_dict().items()
|
|
505
|
+
}
|
|
506
|
+
if set(trained) != set(initial_tensors):
|
|
507
|
+
raise ValidationError("RECOMP trained model changed its parameter namespace")
|
|
508
|
+
changed = sum(
|
|
509
|
+
not torch.equal(value, initial_tensors[name]) for name, value in trained.items()
|
|
510
|
+
)
|
|
511
|
+
if not changed:
|
|
512
|
+
raise ValidationError("RECOMP native fit produced no changed model tensor")
|
|
513
|
+
destination = root / "checkpoint"
|
|
514
|
+
destination.mkdir()
|
|
515
|
+
trainer.model.config.save_pretrained(destination)
|
|
516
|
+
trainer.tokenizer.save_pretrained(destination)
|
|
517
|
+
save_file(
|
|
518
|
+
trained, str(destination / "model.safetensors"), metadata={"format": "pt"}
|
|
519
|
+
)
|
|
520
|
+
files = {p.name: _sha(p) for p in destination.iterdir() if p.is_file()}
|
|
521
|
+
_save(
|
|
522
|
+
root / "checkpoint-manifest.json",
|
|
523
|
+
dict(
|
|
524
|
+
schema_version="agentinputlab.recomp.checkpoint.v1",
|
|
525
|
+
mode="abstractive",
|
|
526
|
+
checkpoint_revision="native-fit-" + content_hash(plan),
|
|
527
|
+
tokenizer_revision=initial.tokenizer_revision,
|
|
528
|
+
license="NOASSERTION",
|
|
529
|
+
files=files,
|
|
530
|
+
),
|
|
531
|
+
)
|
|
532
|
+
exported = verify_checkpoint(destination, root / "checkpoint-manifest.json")
|
|
533
|
+
reloaded = load_file(str(destination / "model.safetensors"), device="cpu")
|
|
534
|
+
if not all(torch.equal(reloaded[name], value) for name, value in trained.items()):
|
|
535
|
+
raise ValidationError(
|
|
536
|
+
"RECOMP safe export differs from live trained seq2seq model"
|
|
537
|
+
)
|
|
538
|
+
_save(
|
|
539
|
+
root / "fit-terminal.json",
|
|
540
|
+
dict(
|
|
541
|
+
status="trained_candidate",
|
|
542
|
+
**observed,
|
|
543
|
+
trainer_log_history=history,
|
|
544
|
+
changed_parameter_tensors=changed,
|
|
545
|
+
all_exported_tensor_values_equal_live_trained_model=True,
|
|
546
|
+
native_teacher_forced_pre_and_post_eval=True,
|
|
547
|
+
generated_quality_metrics=False,
|
|
548
|
+
wall_seconds=time.monotonic() - started,
|
|
549
|
+
cpu_seconds=time.process_time() - cpu,
|
|
550
|
+
training_compute_is_separate_not_free=True,
|
|
551
|
+
gpu_compute_not_fully_metered=True,
|
|
552
|
+
full_published_score_parity=False,
|
|
553
|
+
automatic_retry=False,
|
|
554
|
+
),
|
|
555
|
+
)
|
|
556
|
+
metadata = dict(
|
|
557
|
+
protocol=PROTOCOL,
|
|
558
|
+
release_id=RELEASE,
|
|
559
|
+
checkpoint_manifest_sha256=exported.manifest_sha256,
|
|
560
|
+
fit_terminal_sha256=_sha(root / "fit-terminal.json"),
|
|
561
|
+
fit_plan_sha256=_sha(root / "fit-plan.json"),
|
|
562
|
+
source_revision=plan["source_commit"],
|
|
563
|
+
heldout_quality_acceptance=False,
|
|
564
|
+
paper_results_changed=False,
|
|
565
|
+
)
|
|
566
|
+
_save(root / "artifact.json", {**metadata, "artifact_id": content_hash(metadata)})
|
|
567
|
+
return RECOMPTrainedSeq2SeqArtifact.load(root)
|
|
568
|
+
except Exception as exc:
|
|
569
|
+
observed.pop("trainer", None)
|
|
570
|
+
if not (root / "fit-terminal.json").exists():
|
|
571
|
+
_save(
|
|
572
|
+
root / "fit-terminal.json",
|
|
573
|
+
dict(
|
|
574
|
+
status="failed_terminal",
|
|
575
|
+
**observed,
|
|
576
|
+
error_type=type(exc).__name__,
|
|
577
|
+
error=str(exc),
|
|
578
|
+
wall_seconds=time.monotonic() - started,
|
|
579
|
+
cpu_seconds=time.process_time() - cpu,
|
|
580
|
+
automatic_retry=False,
|
|
581
|
+
),
|
|
582
|
+
)
|
|
583
|
+
raise
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
__all__ = [
|
|
587
|
+
"RECOMPAbstractiveFitControls",
|
|
588
|
+
"RECOMPAbstractiveTraining",
|
|
589
|
+
"RECOMPTrainedSeq2SeqArtifact",
|
|
590
|
+
"audit_recomp_seq2seq_data",
|
|
591
|
+
"validate_recomp_nltk_assets",
|
|
592
|
+
]
|