hud-python 0.4.43__tar.gz → 0.4.44__tar.gz
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.
Potentially problematic release.
This version of hud-python might be problematic. Click here for more details.
- {hud_python-0.4.43 → hud_python-0.4.44}/PKG-INFO +1 -1
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/distributed.py +34 -1
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/learner.py +28 -5
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/train.py +64 -44
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tests/test_version.py +1 -1
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/version.py +1 -1
- {hud_python-0.4.43 → hud_python-0.4.44}/pyproject.toml +1 -1
- {hud_python-0.4.43 → hud_python-0.4.44}/.gitignore +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/LICENSE +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/blank/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/blank/controller/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/blank/environment/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/blank/pyproject.toml +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/environment/2048/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/environment/2048/backend/pyproject.toml +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/environment/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/environment/todo/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/environment/todo/backend/pyproject.toml +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/pyproject.toml +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/deepresearch/pyproject.toml +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/remote_browser/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/remote_browser/pyproject.toml +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/remote_browser/src/hud_controller/providers/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/text_2048/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/environments/text_2048/pyproject.toml +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/examples/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/__main__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/base.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/claude.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/grounded_openai.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/langchain.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/lite_llm.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/misc/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/misc/response_agent.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/openai.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/openai_chat_generic.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/tests/test_base.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/tests/test_claude.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/tests/test_client.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/tests/test_grounded_openai_agent.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/agents/tests/test_openai.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/__main__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/analyze.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/build.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/clone.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/debug.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/dev.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/eval.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/flows/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/flows/tasks.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/get.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/init.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/list_func.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/pull.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/push.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/remove.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/celebrate.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/config.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/display.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/gpu.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/gpu_utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/local_runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/presets.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/remote_runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/rl_api.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/viewer.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/vllm.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/rl/wait_utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_analyze.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_analyze_metadata.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_build.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_cli_init.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_cli_main.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_clone.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_cursor.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_debug.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_list_func.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_main_module.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_mcp_server.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_pull.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_push.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_registry.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/tests/test_utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/config.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/cursor.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/docker.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/env_check.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/environment.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/interactive.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/local_runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/logging.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/metadata.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/package_runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/registry.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/remote_runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/server.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/source_hash.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/cli/utils/tasks.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/base.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/fastmcp.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/mcp_use.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/tests/test_client_integration.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/tests/test_fastmcp.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/tests/test_mcp_use_retry.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/tests/test_protocol.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/utils/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/utils/mcp_use_retry.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/utils/retry.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/clients/utils/retry_transport.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/datasets/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/datasets/parallel.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/datasets/runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/datasets/utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/misc/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/misc/claude_plays_pokemon.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/native/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/native/comparator.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/native/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/native/tests/test_comparator.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/native/tests/test_native_init.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/collector.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/config.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/context.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/exporters.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/instrumentation.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/processors.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/otel/tests/test_processors.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/py.typed +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/README.md +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/actor.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/buffer.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/chat_template.jinja +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/config.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/tests/test_learner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/types.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/utils/start_vllm_server.sh +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/rl/vllm_adapter.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/samples/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/samples/browser.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/context.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/helper/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/low_level.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/server.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_add_tool.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_context.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_mcp_server_handlers.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_mcp_server_integration.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_mcp_server_more.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_run_wrapper.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_server_extra.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/server/tests/test_sigterm_runner.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/settings.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/shared/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/shared/exceptions.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/shared/hints.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/shared/requests.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/shared/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/shared/tests/test_exceptions.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/shared/tests/test_requests.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/instrument.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/job.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/replay.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/tests/test_replay.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/tests/test_trace.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/telemetry/trace.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/base.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/bash.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/computer/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/computer/anthropic.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/computer/hud.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/computer/openai.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/computer/settings.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/edit.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/executors/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/executors/base.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/executors/pyautogui.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/executors/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/executors/tests/test_base_executor.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/executors/tests/test_pyautogui_executor.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/executors/xdo.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/grounding/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/grounding/config.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/grounding/grounded_tool.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/grounding/grounder.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/grounding/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/grounding/tests/test_grounded_tool.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/playwright.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/response.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/submit.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_base.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_bash.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_bash_extended.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_computer.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_computer_actions.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_edit.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_init.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_playwright_tool.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_response.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_tools.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_tools_init.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/tests/test_utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/types.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/tools/utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/types.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/agent_factories.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/async_utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/group_eval.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/hud_console.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/mcp.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/pretty_errors.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/progress.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tasks.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/telemetry.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tests/__init__.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tests/test_async_utils.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tests/test_init.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tests/test_mcp.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tests/test_progress.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tests/test_telemetry.py +0 -0
- {hud_python-0.4.43 → hud_python-0.4.44}/hud/utils/tool_shorthand.py +0 -0
|
@@ -66,7 +66,13 @@ def all_reduce_mean(tensor: torch.Tensor) -> torch.Tensor:
|
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
def broadcast_object(obj: Any, src: int = 0) -> Any:
|
|
69
|
-
"""Broadcast a Python object from src rank to all ranks.
|
|
69
|
+
"""Broadcast a Python object from src rank to all ranks.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
obj: Object to broadcast (used on src rank)
|
|
73
|
+
src: Source rank
|
|
74
|
+
device: Device for temporary tensor buffer during pickling transfer
|
|
75
|
+
"""
|
|
70
76
|
if not dist.is_initialized():
|
|
71
77
|
return obj
|
|
72
78
|
|
|
@@ -75,6 +81,33 @@ def broadcast_object(obj: Any, src: int = 0) -> Any:
|
|
|
75
81
|
return obj_list[0]
|
|
76
82
|
|
|
77
83
|
|
|
84
|
+
def scatter_object(
|
|
85
|
+
obj_list: list[Any] | None,
|
|
86
|
+
src: int = 0,
|
|
87
|
+
) -> Any:
|
|
88
|
+
"""Scatter a list of Python objects from src so each rank receives one object.
|
|
89
|
+
|
|
90
|
+
Usage:
|
|
91
|
+
- On src rank: pass the full list (length == world_size)
|
|
92
|
+
- On non-src ranks: pass None
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
The object intended for this rank.
|
|
96
|
+
"""
|
|
97
|
+
if not dist.is_initialized():
|
|
98
|
+
# Single-process: return first element if provided, else None
|
|
99
|
+
if obj_list is None or len(obj_list) == 0:
|
|
100
|
+
return None
|
|
101
|
+
return obj_list[0]
|
|
102
|
+
|
|
103
|
+
out: list[Any] = [None]
|
|
104
|
+
if dist.get_rank() == src:
|
|
105
|
+
dist.scatter_object_list(out, obj_list, src=src)
|
|
106
|
+
else:
|
|
107
|
+
dist.scatter_object_list(out, None, src=src)
|
|
108
|
+
return out[0]
|
|
109
|
+
|
|
110
|
+
|
|
78
111
|
def gather_tensors(tensor: torch.Tensor) -> list[torch.Tensor] | None:
|
|
79
112
|
"""Gather tensors from all ranks to rank 0.
|
|
80
113
|
|
|
@@ -240,6 +240,8 @@ class GRPOLearner:
|
|
|
240
240
|
if sample.inputs:
|
|
241
241
|
sample = sample.to_device(self.device)
|
|
242
242
|
sample.old_logprobs, _ = self.compute_logprobs(self.policy, sample.inputs)
|
|
243
|
+
# Free GPU memory for this sample immediately
|
|
244
|
+
sample.to_device(torch.device("cpu"))
|
|
243
245
|
|
|
244
246
|
policy_module = self.policy.module if hasattr(self.policy, "module") else self.policy
|
|
245
247
|
with policy_module.disable_adapter():
|
|
@@ -247,7 +249,10 @@ class GRPOLearner:
|
|
|
247
249
|
if is_main_process():
|
|
248
250
|
progress.update(f"Processing batch of traces... {i}/{len(batch)}")
|
|
249
251
|
if sample.inputs:
|
|
252
|
+
# Move back to GPU for reference computation, then free
|
|
253
|
+
sample = sample.to_device(self.device)
|
|
250
254
|
sample.ref_logprobs, _ = self.compute_logprobs(self.policy, sample.inputs)
|
|
255
|
+
sample.to_device(torch.device("cpu"))
|
|
251
256
|
|
|
252
257
|
hud_console.info_log("Creating mini-batches...")
|
|
253
258
|
group_size = self.config.training.group_size
|
|
@@ -488,15 +493,21 @@ class GRPOLearner:
|
|
|
488
493
|
out = model(**model_inputs)
|
|
489
494
|
|
|
490
495
|
logits = out.logits / self.config.actor.temperature
|
|
491
|
-
log_probs = F.log_softmax(logits, dim=-1)
|
|
492
496
|
|
|
497
|
+
# Compute token log-probs via negative cross-entropy to avoid materializing full log_probs
|
|
493
498
|
targets = inputs["input_ids"][:, 1:]
|
|
494
|
-
|
|
499
|
+
logits_slice = logits[:, :-1, :]
|
|
500
|
+
loss_flat = F.cross_entropy(
|
|
501
|
+
logits_slice.reshape(-1, logits_slice.size(-1)),
|
|
502
|
+
targets.reshape(-1),
|
|
503
|
+
reduction="none",
|
|
504
|
+
)
|
|
505
|
+
token_log_probs = (-loss_flat).reshape_as(targets)
|
|
495
506
|
|
|
496
507
|
# Compute entropy only for assistant tokens to save memory
|
|
497
508
|
assistant_mask = inputs["assistant_mask"]
|
|
498
509
|
entropy = torch.zeros_like(token_log_probs)
|
|
499
|
-
if assistant_mask.any():
|
|
510
|
+
if assistant_mask.any() and getattr(self.config.training, "entropy_beta", 0.0) != 0.0:
|
|
500
511
|
entropy[assistant_mask] = entropy_from_logits(logits[:, :-1][assistant_mask])
|
|
501
512
|
|
|
502
513
|
return token_log_probs, entropy
|
|
@@ -506,8 +517,20 @@ class GRPOLearner:
|
|
|
506
517
|
# Return dummy values that match expected shapes
|
|
507
518
|
seq_len = inputs["input_ids"].shape[1] - 1 if "input_ids" in inputs else 0
|
|
508
519
|
batch_size = inputs["input_ids"].shape[0] if "input_ids" in inputs else 1
|
|
509
|
-
|
|
510
|
-
|
|
520
|
+
# Create dummy tensors that still participate in autograd so backward doesn't fail
|
|
521
|
+
try:
|
|
522
|
+
param_sum = torch.sum(
|
|
523
|
+
next(self.policy.parameters())
|
|
524
|
+
) # touch params to build a graph
|
|
525
|
+
base = param_sum * 0.0
|
|
526
|
+
except StopIteration:
|
|
527
|
+
base = torch.tensor(0.0, device=self.device)
|
|
528
|
+
dummy_logprobs = (
|
|
529
|
+
base + torch.zeros(batch_size, seq_len, device=self.device)
|
|
530
|
+
).requires_grad_(True)
|
|
531
|
+
dummy_entropy = (
|
|
532
|
+
base + torch.zeros(batch_size, seq_len, device=self.device)
|
|
533
|
+
).requires_grad_(True)
|
|
511
534
|
return dummy_logprobs, dummy_entropy
|
|
512
535
|
|
|
513
536
|
def save(self, path: str) -> None:
|
|
@@ -13,7 +13,7 @@ import json
|
|
|
13
13
|
import logging
|
|
14
14
|
from datetime import datetime
|
|
15
15
|
from pathlib import Path
|
|
16
|
-
from typing import TYPE_CHECKING
|
|
16
|
+
from typing import TYPE_CHECKING, cast
|
|
17
17
|
|
|
18
18
|
import hud
|
|
19
19
|
from hud.rl.actor import Actor
|
|
@@ -25,6 +25,7 @@ from hud.rl.distributed import (
|
|
|
25
25
|
get_global_rank,
|
|
26
26
|
get_world_size,
|
|
27
27
|
is_main_process,
|
|
28
|
+
scatter_object,
|
|
28
29
|
setup_distributed,
|
|
29
30
|
synchronize,
|
|
30
31
|
)
|
|
@@ -133,53 +134,71 @@ async def train(config: Config, tasks: list[Task]) -> None:
|
|
|
133
134
|
global_reward_stats = None
|
|
134
135
|
global_advantage_stats = None
|
|
135
136
|
|
|
136
|
-
#
|
|
137
|
+
# Step-state gate: ensure all ranks branch coherently
|
|
138
|
+
state = {"ok": False, "err": None, "num_samples": 0}
|
|
139
|
+
rank_samples = None
|
|
140
|
+
episode_time_value = None
|
|
141
|
+
|
|
142
|
+
# Only rank 0 runs tasks and prepares distribution
|
|
137
143
|
if is_main_process() and actor is not None:
|
|
138
144
|
import time
|
|
139
145
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
146
|
+
try:
|
|
147
|
+
episode_start_time = time.time()
|
|
148
|
+
traces = await actor.run_tasks(tasks, job_id=job_id)
|
|
149
|
+
episode_time = time.time() - episode_start_time
|
|
150
|
+
hud_console.info(f"Sampled {len(traces)} traces in {episode_time:.1f}s")
|
|
151
|
+
trace_buffer.add(traces)
|
|
152
|
+
global_reward_stats = [trace.reward for trace in traces]
|
|
153
|
+
|
|
154
|
+
# Get all traces from buffer for distribution
|
|
155
|
+
all_traces = trace_buffer.sample_traces()
|
|
156
|
+
|
|
157
|
+
# Preprocess traces to training samples
|
|
158
|
+
preprocessed_traces = preprocess_advantages(all_traces, config)
|
|
159
|
+
|
|
160
|
+
# Store these for later use in metrics
|
|
161
|
+
global_advantage_stats = [sample.advantage for sample in preprocessed_traces]
|
|
162
|
+
|
|
163
|
+
# Distribute preprocessed samples in groups across ranks via scatter
|
|
164
|
+
# Ensure list length is a multiple of num_gpus by allowing empty per-rank slices
|
|
165
|
+
gpu_batch_size = max(1, (len(preprocessed_traces) + num_gpus - 1) // num_gpus)
|
|
166
|
+
rank_samples = [
|
|
167
|
+
preprocessed_traces[i : i + gpu_batch_size]
|
|
168
|
+
for i in range(0, len(preprocessed_traces), gpu_batch_size)
|
|
169
|
+
]
|
|
170
|
+
# Pad rank_samples to exactly num_gpus entries
|
|
171
|
+
if len(rank_samples) < num_gpus:
|
|
172
|
+
rank_samples.extend([[] for _ in range(num_gpus - len(rank_samples))])
|
|
173
|
+
|
|
174
|
+
# Log distribution info
|
|
175
|
+
dist_msg = (
|
|
176
|
+
f"Distributing {len(preprocessed_traces)} samples as {gpu_batch_size} "
|
|
177
|
+
f"sized batches across {num_gpus} GPUs"
|
|
178
|
+
)
|
|
179
|
+
hud_console.info(dist_msg)
|
|
180
|
+
for rank in range(num_gpus):
|
|
181
|
+
n_samples = len(rank_samples[rank]) if rank < len(rank_samples) else 0
|
|
182
|
+
hud_console.info(f" Rank {rank}: {n_samples} samples")
|
|
183
|
+
|
|
184
|
+
hud_console.section_title(f"Training on {len(all_traces)} traces")
|
|
185
|
+
episode_time_value = episode_time
|
|
186
|
+
|
|
187
|
+
state.update({"ok": True, "num_samples": len(preprocessed_traces)})
|
|
188
|
+
except Exception as e:
|
|
189
|
+
state.update({"ok": False, "err": str(e)})
|
|
190
|
+
|
|
191
|
+
# Broadcast step-state to keep ranks in lockstep
|
|
192
|
+
state = broadcast_object(state, src=0)
|
|
193
|
+
if not state.get("ok", False):
|
|
194
|
+
hud_console.warning("Step failed on rank 0; skipping this step coherently")
|
|
195
|
+
synchronize()
|
|
196
|
+
continue
|
|
164
197
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
)
|
|
169
|
-
for rank in range(num_gpus):
|
|
170
|
-
n_samples = len(rank_samples[rank])
|
|
171
|
-
hud_console.info(f" Rank {rank}: {n_samples} samples")
|
|
172
|
-
|
|
173
|
-
hud_console.section_title(f"Training on {len(all_traces)} traces")
|
|
174
|
-
episode_time_value = episode_time
|
|
175
|
-
else:
|
|
176
|
-
rank_samples = None
|
|
177
|
-
episode_time_value = None
|
|
178
|
-
|
|
179
|
-
# Broadcast each rank's samples and episode time
|
|
180
|
-
rank_samples = broadcast_object(rank_samples, src=0)
|
|
198
|
+
# Scatter per-rank samples; each rank receives only its slice
|
|
199
|
+
my_samples = scatter_object(rank_samples if is_main_process() else None, src=0)
|
|
200
|
+
# Broadcast the episode time (small object)
|
|
181
201
|
episode_time_value = broadcast_object(episode_time_value, src=0)
|
|
182
|
-
my_samples = rank_samples[get_global_rank()] if rank_samples else []
|
|
183
202
|
|
|
184
203
|
# Process only assigned samples
|
|
185
204
|
last_metrics = learner.update(my_samples)
|
|
@@ -356,7 +375,8 @@ async def main() -> None:
|
|
|
356
375
|
)
|
|
357
376
|
|
|
358
377
|
# Run training
|
|
359
|
-
|
|
378
|
+
tasks_typed = cast("list[Task]", tasks)
|
|
379
|
+
await train(config, tasks_typed)
|
|
360
380
|
|
|
361
381
|
|
|
362
382
|
if __name__ == "__main__":
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/environment/2048/backend/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hud_python-0.4.43 → hud_python-0.4.44}/environments/browser/environment/todo/backend/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|